summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2016-09-30 16:57:23 +0200
committerLars-Dominik Braun <lars@6xq.net>2016-09-30 16:59:06 +0200
commit724cc003460ec67eda269911da85c9f9e40aa6cf (patch)
tree14e27b45e04279516e4be546b15dcf6fafe17268 /doc
downloadeumel-src-724cc003460ec67eda269911da85c9f9e40aa6cf.tar.gz
eumel-src-724cc003460ec67eda269911da85c9f9e40aa6cf.tar.bz2
eumel-src-724cc003460ec67eda269911da85c9f9e40aa6cf.zip
Add extracted sources from floppy disk images
Some files have no textual representation (yet) and were added as raw dataspaces.
Diffstat (limited to 'doc')
-rw-r--r--doc/basic/basic handbuch.11075
-rw-r--r--doc/basic/basic handbuch.22441
-rw-r--r--doc/basic/basic handbuch.3698
-rw-r--r--doc/basic/basic handbuch.index232
-rw-r--r--doc/dialog/gs-dialog handbuch.impressum89
-rw-r--r--doc/dialog/gs-dialog-1107
-rw-r--r--doc/dialog/gs-dialog-2215
-rw-r--r--doc/dialog/gs-dialog-3683
-rw-r--r--doc/dialog/gs-dialog-4672
-rw-r--r--doc/dialog/gs-dialog-5176
-rw-r--r--doc/dialog/gs-dialog-Inhaltsverzeichnis45
-rw-r--r--doc/dynamo/dynamo handbuch1826
-rw-r--r--doc/dynamo/dynamo handbuch.index69
-rw-r--r--doc/dynamo/dynamo handbuch.inhalt131
-rw-r--r--doc/eudas/abb.1-194
-rw-r--r--doc/eudas/abb.4-143
-rw-r--r--doc/eudas/abb.4-246
-rw-r--r--doc/eudas/abb.6-175
-rw-r--r--doc/eudas/abb.6-277
-rw-r--r--doc/eudas/abb.7-146
-rw-r--r--doc/eudas/abb.9-141
-rw-r--r--doc/eudas/abb.9-296
-rw-r--r--doc/eudas/abb.9-3113
-rw-r--r--doc/eudas/abb.9-498
-rw-r--r--doc/eudas/abb.9-551
-rw-r--r--doc/eudas/bildergenerator25
-rw-r--r--doc/eudas/eudas.hdb.1267
-rw-r--r--doc/eudas/eudas.hdb.10510
-rw-r--r--doc/eudas/eudas.hdb.11674
-rw-r--r--doc/eudas/eudas.hdb.12446
-rw-r--r--doc/eudas/eudas.hdb.13757
-rw-r--r--doc/eudas/eudas.hdb.14724
-rw-r--r--doc/eudas/eudas.hdb.15286
-rw-r--r--doc/eudas/eudas.hdb.16350
-rw-r--r--doc/eudas/eudas.hdb.2178
-rw-r--r--doc/eudas/eudas.hdb.3515
-rw-r--r--doc/eudas/eudas.hdb.5386
-rw-r--r--doc/eudas/eudas.hdb.6394
-rw-r--r--doc/eudas/eudas.hdb.7687
-rw-r--r--doc/eudas/eudas.hdb.8211
-rw-r--r--doc/eudas/eudas.hdb.9556
-rw-r--r--doc/eudas/eudas.hdb.inhalt133
-rw-r--r--doc/eudas/eudas.hdb.macros80
-rw-r--r--doc/eudas/eudas.hdb.titel99
-rw-r--r--doc/eudas/eudas.hdb.vorwort89
-rw-r--r--doc/eudas/eudas.ref.1326
-rw-r--r--doc/eudas/eudas.ref.10406
-rw-r--r--doc/eudas/eudas.ref.11347
-rw-r--r--doc/eudas/eudas.ref.2830
-rw-r--r--doc/eudas/eudas.ref.3270
-rw-r--r--doc/eudas/eudas.ref.4441
-rw-r--r--doc/eudas/eudas.ref.5432
-rw-r--r--doc/eudas/eudas.ref.6399
-rw-r--r--doc/eudas/eudas.ref.7447
-rw-r--r--doc/eudas/eudas.ref.8454
-rw-r--r--doc/eudas/eudas.ref.9194
-rw-r--r--doc/eudas/eudas.ref.fehler139
-rw-r--r--doc/eudas/eudas.ref.inhalt120
-rw-r--r--doc/eudas/eudas.ref.macros73
-rw-r--r--doc/eudas/eudas.ref.proz205
-rw-r--r--doc/eudas/eudas.ref.reg436
-rw-r--r--doc/eudas/eudas.ref.titel91
-rw-r--r--doc/eudas/eudas.ref.vorwort81
-rw-r--r--doc/eudas/ref.abb.1-142
-rw-r--r--doc/eudas/register490
-rw-r--r--doc/eudas/uedas.hdb.4686
-rw-r--r--doc/graphic/Altes Handbuch - Teil 10 - Graphik831
-rw-r--r--doc/graphic/GRAPHIK.book897
-rw-r--r--doc/graphic/graphik beschreibung661
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis45
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 193
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2389
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3199
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 41312
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5167
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 673
-rw-r--r--doc/hamster/gs-Herbert und Robbi handbuch.impressum87
-rw-r--r--doc/lisp/lisp handbuch2260
-rw-r--r--doc/menugenerator/menu-generator handbuch.1100
-rw-r--r--doc/menugenerator/menu-generator handbuch.287
-rw-r--r--doc/menugenerator/menu-generator handbuch.3155
-rw-r--r--doc/menugenerator/menu-generator handbuch.4424
-rw-r--r--doc/menugenerator/menu-generator handbuch.5975
-rw-r--r--doc/menugenerator/menu-generator handbuch.6235
-rw-r--r--doc/menugenerator/menu-generator handbuch.7367
-rw-r--r--doc/menugenerator/menu-generator handbuch.81676
-rw-r--r--doc/menugenerator/menu-generator handbuch.impressum88
-rw-r--r--doc/menugenerator/menu-generator handbuch.index258
-rw-r--r--doc/menugenerator/menu-generator handbuch.inhalt72
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis50
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1119
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2302
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3237
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4638
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5699
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 653
-rw-r--r--doc/mp-bap/gs-MP BAP handbuch.impressum104
-rw-r--r--doc/programming/programmierhandbuch.1650
-rw-r--r--doc/programming/programmierhandbuch.2a1845
-rw-r--r--doc/programming/programmierhandbuch.2b1395
-rw-r--r--doc/programming/programmierhandbuch.3728
-rw-r--r--doc/programming/programmierhandbuch.41692
-rw-r--r--doc/programming/programmierhandbuch.51329
-rw-r--r--doc/programming/programmierhandbuch.5b1481
-rw-r--r--doc/programming/programmierhandbuch.61441
-rw-r--r--doc/programming/programmierhandbuch.index449
-rw-r--r--doc/programming/programmierhandbuch.inhalt249
-rw-r--r--doc/programming/programmierhandbuch.titel52
-rw-r--r--doc/prolog/prolog handbuch581
-rw-r--r--doc/prozess/Anhang Prozess92
-rw-r--r--doc/prozess/Inhalt Prozess84
-rw-r--r--doc/prozess/gs-Prozess handbuch.impressum104
-rw-r--r--doc/prozess/gs-Prozess-2255
-rw-r--r--doc/prozess/gs-Prozess-3346
-rw-r--r--doc/prozess/gs-Prozess-4173
-rw-r--r--doc/prozess/gs-prozess-199
-rw-r--r--doc/prozess/gs-prozess-5819
-rw-r--r--doc/prozess/gs-prozess-6641
-rw-r--r--doc/prozess/gs-prozess-71121
-rw-r--r--doc/prozess/gs-prozess-8377
-rw-r--r--doc/prozess/gs-prozess-9477
-rw-r--r--doc/system/systemhandbuch.11685
-rw-r--r--doc/system/systemhandbuch.21351
-rw-r--r--doc/system/systemhandbuch.31366
-rw-r--r--doc/system/systemhandbuch.41185
-rw-r--r--doc/user/benutzerhandbuch.1580
-rw-r--r--doc/user/benutzerhandbuch.2443
-rw-r--r--doc/user/benutzerhandbuch.32019
-rw-r--r--doc/user/benutzerhandbuch.42242
-rw-r--r--doc/user/benutzerhandbuch.5a1446
-rw-r--r--doc/user/benutzerhandbuch.5b1632
-rw-r--r--doc/user/benutzerhandbuch.5c711
-rw-r--r--doc/user/benutzerhandbuch.5d211
-rw-r--r--doc/user/benutzerhandbuch.5e223
-rw-r--r--doc/user/benutzerhandbuch.6474
-rw-r--r--doc/user/benutzerhandbuch.anhang484
-rw-r--r--doc/warenhaus/Anhang Warenhaus65
-rw-r--r--doc/warenhaus/Inhalt Warenhaus50
-rw-r--r--doc/warenhaus/gs-Warenhaus handbuch.impressum89
-rw-r--r--doc/warenhaus/gs-Warenhaus-1124
-rw-r--r--doc/warenhaus/gs-Warenhaus-272
-rw-r--r--doc/warenhaus/gs-Warenhaus-3309
-rw-r--r--doc/warenhaus/gs-Warenhaus-4378
-rw-r--r--doc/warenhaus/gs-Warenhaus-51468
-rw-r--r--doc/warenhaus/gs-Warenhaus-6589
-rw-r--r--doc/warenhaus/gs-Warenhaus-7235
146 files changed, 73079 insertions, 0 deletions
diff --git a/doc/basic/basic handbuch.1 b/doc/basic/basic handbuch.1
new file mode 100644
index 0000000..2e604cb
--- /dev/null
+++ b/doc/basic/basic handbuch.1
@@ -0,0 +1,1075 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#Basic
+
+
+
+
+#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#
+#page nr ("%", 1)#
+#head#
+EUMEL-BASIC-Compiler Inhalt %
+#end#
+
+Inhalt
+
+1 Einleitung 3
+
+2 Installation des BASIC-Compilers 4
+
+3 Aufruf und Steuerung des BASIC-Compilers 5
+
+4 Umgang mit dem BASIC-Compiler 7
+4.1 Erläuterungen zur Syntax 7
+4.2 Datentypen und Konstanten 10
+4.3 Variablen und Felder 12
+4.4 Operatoren 14
+4.5 Funktionen 19
+4.6 Typanpassung 22
+4.7 Aufruf von EUMEL-Prozeduren in BASIC-Programmen 23
+
+5 Steuerung der Bildschirmausgaben 25
+
+6 Grenzen des Compilers 26
+
+7 Fehlerbehandlung 28
+7.1 Fehler zur Übersetzungszeit 28
+7.2 Fehler zur Laufzeit 30
+
+8 Übersicht über die Anweisungen und Funktionen 31
+
+9 Anpassung von Programmen an den EUMEL-BASIC-Compiler 96
+9.1 Unterschiede zwischen BASIC-Interpretern
+ und dem EUMEL-BASIC-Compiler 96
+9.2 Abweichungen von ISO 6373-1984 (Minimal-BASIC) 97
+9.3 Anpassung von Microsoft-BASIC Programmen
+ an den EUMEL-BASIC-Compiler 98
+
+Anhang A: Reservierte Wörter 100
+Anhang B: Vom Scanner erkannte Symboltypen 103
+Anhang C: Übersicht über die Fehlermeldungen 106
+Anhang D: ELAN-Prozeduren des Compilers 113
+#page#
+
+
+#page nr ("%", 3)#
+#head#
+EUMEL-BASIC-Compiler 1. Einleitung %
+
+#end#
+
+1. Einleitung
+
+
+BASIC entspricht heute nicht mehr den Vorstellungen von einer modernen Program­
+miersprache. Dennoch wurde für das EUMEL-Betriebssystem ein Compiler für BASIC
+entwickelt. Er soll vor allem dazu dienen, schon bestehende BASIC-Programme -
+gegebenenfalls nach entsprechender Anpassung - auch unter EUMEL verfügbar zu
+machen.
+Der Compiler ist weitgehend an die ISO-Norm 6373 für Minimal-BASIC angelehnt.
+Die Syntax und Bedeutung der Anweisungen orientiert sich in den meisten Fällen an
+Microsoft-BASIC. Anweichungen treten insbesondere an den Stellen auf, an denen
+Prinzipien des Betriebssystems EUMEL verletzt würden.
+Verglichen mit dem ELAN-Compiler des EUMEL-Systems ist der BASIC-Compiler
+beim Übersetzen recht langsam. Auch aus diesem Grund scheint es nicht sinnvoll,
+den BASIC-Compiler zur Neuentwicklung größerer Programme einzusetzen.
+
+Sinn dieses Handbuchs ist es vor allem, Kenntnisse über den Umgang mit dem
+EUMEL-BASIC-Compiler zu vermitteln. Das Handbuch ist auf keinen Fall als Ein­
+führung in die Programmiersprache BASIC gedacht, sondern es soll dem Benutzer mit
+BASIC-Erfahrung die Arbeit mit dem EUMEL-BASIC-Compiler ermöglichen und
+erleichtern. Neben Erfahrung in BASIC setzt dieses Buch an einigen Stellen auch
+Grundkenntnisse über das EUMEL-System voraus.
+
+
+
+Zur #ib(4)#Notation#ie(4)# in dieser Beschreibung
+
+Bei der Beschreibung der Anweisungen und Funktionen und auch an anderen Stellen
+werden in dieser Beschreibung Syntaxregeln für BASIC-Programme oder Teile davon
+angegeben. Dabei werden folgende Zeichen mit besonderer Bedeutung verwendet:
+
+[ ] optionale Angabe
+[...] beliebig häufige Wiederholung der letzten optionalen Angabe
+| alternative Angabe, d.h. entweder die letzte links stehende Angabe oder
+ die nächste rechts stehende Angabe, aber nicht beide
+< > in spitzen Klammern stehende Begriffe sind entweder definiert (z.B. <Va­
+ riable>) oder werden hinter der Syntaxregel erläutert
+
+Die Notation der exportierten ELAN-Prozeduren des Compilers (besonders in An­
+hangD) entspricht der in den EUMEL-Handbüchern üblichen Prozedurkopf-
+Schreibweise.
+#page#
+#head#
+EUMEL-BASIC-Compiler 2. Installation des BASIC-Compilers %
+
+#end#
+
+2. #ib(3)#Installation des BASIC-Compilers#ie(3)#
+
+
+Der EUMEL-BASIC-Compiler wird auf zwei Disketten mit jeweils 360 KByte
+Speicherkapazität ausgeliefert.
+Auf der Diskette "BASIC.1" befindet sich das #ib(3)#Generatorprogramm#ie(3)#("gen.BASIC") zur
+Installation des EUMEL-BASIC-Systems.
+Legen Sie diese Diskette in das Laufwerk ihres Rechners ein und geben Sie in der
+Task, in der das BASIC-System installiert werden soll, folgende Zeile nach 'gib
+kommando :' (oder 'maintenance :') ein:
+
+archive ("BASIC.1"); fetch ("gen.BASIC", archive); run
+
+Lassen Sie die Diskette 'BASIC.1' im Laufwerk und antworten Sie auf die Frage
+"Archiv "BASIC.1" eingelegt(j/n)?" mit "j". Das Generatorprogramm holt nun einige
+Dateien von der Diskette. Nach Zugriff auf das Archiv erscheint die Meldung "Archiv
+abgemeldet!" und die Frage "Archiv 'BASIC.2' eingelegt(j/n)?". Legen Sie nun statt
+des Archivs 'BASIC.1' das Archiv 'BASIC.2' in das Laufwerk ein und drücken Sie bitte
+wiederum "j". Nach weiteren Archivoperationen erscheint dann wieder die Meldung
+"Archiv abgemeldet". Sie können nun die Diskette "BASIC.2" aus dem Laufwerk
+entnehmen.
+Das Generatorprogramm insertiert nun alle Programme des BASIC-Systems in der
+Task. Dieser Vorgang nimmt einige Zeit in Anspruch. Zum Abschluß erscheint die
+Meldung "BASIC-System installiert".
+Der EUMEL-BASIC-Compiler steht Ihnen nun in der Task (und in nachfolgend
+eingerichteten Söhnen) zur Verfügung.
+#page#
+#head#
+EUMEL-BASIC-Compiler 3. Aufruf und Steuerung des BASIC-Compilers %
+
+#end#
+
+3. #ib(4)#Aufruf und #ib(3)#Steuerung des BASIC-Compilers#ie(3)##ie(4)#
+
+
+
+
+Übersetzen von BASIC-Programmen
+
+Ein BASIC-Programm, das vom Compiler übersetzt werden soll, muß sich dazu in
+einer EUMEL-Textdatei befinden (Syntax vgl. Kap. 4.). Steht das BASIC-Programm
+zum Beispiel in der Datei "Programm.17+4", so wird der Compiler mit
+
+ #ib(3)#basic#ie(3)# ("Programm.17+4")
+
+zum Übersetzen dieses Programms aufgerufen.
+In einem Vordurchlauf werden die Zeilennummern des Programms auf Richtigkeit
+überprüft. Beim eigentlichen Compilerdurchlauf wird das BASIC-Programm dann mit
+Hilfe des EUMEL-Coders in einen von der EUMEL-0-Maschine ausführbaren Code
+übersetzt.
+
+Das Programm wird mit 'check on' (Zeilennummergenerierung) übersetzt.
+Ein 'runagain' wie bei ELAN-Programmen ist bei BASIC-Programmen zur Zeit
+leider nicht möglich.
+
+
+
+Insertieren von BASIC-Programmen
+
+Der BASIC-Compiler kann BASIC-Programme auch insertieren. Das ganze Pro­
+gramm bildet dabei eine Prozedur, die nach dem Insertieren wie eine 'normale'
+ELAN-Prozedur aufgerufen werden kann.
+Zum Insertieren wird der Compiler mit einem zusätzlichen Text-Parameter aufge­
+rufen:
+
+ #ib(3)#basic#ie(3)# ("Programm.17+4", "blackjack")
+
+Das Programm wird übersetzt und, falls keine Fehler gefunden wurden, fest einge­
+tragen ('insertiert'). Gestartet wird das Programm aber nicht.
+"blackjack" ist nun der Prozedurname, unter dem das BASIC-Programm nach erfolg­
+reichem Insertieren aufgerufen werden kann.
+Bei 'packets' erscheint jetzt der Eintrag 'BASIC.blackjack' in der Liste der insertierten
+Pakete, und ein 'help ("blackjack")' zeigt, daß eine Prozedur 'blackjack' nun tatsäch­
+lich in der Task bekannt ist. Die Prozedur 'bulletin' funktioniert für insertierte
+BASIC-Programme nicht. Sie ist aber auch nicht nötig, da das 'Paket' mit dem
+BASIC-Programm ohnehin nur eine Prozedur enthält und ihr Name ja schon aus
+dem Namen des Paketes hervorgeht.
+
+#on ("b")#
+Beachten Sie:
+ - Der Prozedurname muß der Syntax für ELAN-Prozedurnamen entsprechen, darf
+ aber #on ("b")#keine Leerzeichen enthalten.
+ - Die BASIC-Programme können über den Prozedurnamen nur aufgerufen wer­
+ den; die Übergabe von Parametern ist ebenso wie Wertlieferung nicht möglich.
+ - Jedes Insertieren belegt Speicherplatz im Codebereich der Task. Weil der Coder
+ und der Compiler ebenfalls recht viel Code belegen, kann es (vor allem, wenn
+ die BASIC-Programme lang sind) schnell zu einem Code-Überlauf kommen
+ (Compiler Error 305). Es sollten daher nur die Programme insertiert werden, für
+ die dies wirklich nötig ist.
+ - Achten Sie bei der Wahl des Namens für die gelieferte Prozedur darauf, daß sie
+ nicht ungewollt Prozeduren des Betriebssystems überdecken. (Der Aufruf 'ba­
+ sic("tadellos","help")' wäre z.B. gar nicht tadellos, denn 'help' wäre nach dem
+ Insertieren überdeckt).
+ - Auch beim Insertieren werden die BASIC-Programme mit 'check on' übersetzt.
+#off ("b")#
+
+
+Ausgabe der übersetzten Zeilen während des
+Compilierens
+Mit '#ib(3)#basic list#ie(3)# (TRUE)' wird der Compiler so eingestellt, daß beim Übersetzen die
+aktuelle Programmzeile ausgegeben wird. Diese Ausgabe kann auch mit '#ib(3)#sysout#ie(3)#'
+umgeleitet werden. Zum Beispiel:
+
+ sysout ("Fehlerprotokoll"); basic ("Programm.17+4")
+
+Dies kann beim #ib(3)#Debugging#ie(3)# von BASIC-Programmen eine wertvolle Hilfe sein, da in
+der Ausgabedatei die Fehler sofort hinter der betreffenden Programmzeile vermerkt
+werden. Das 'sysout' muß in Monitortasks ('gib kommando:') direkt vor dem Aufruf
+des Compilers gegeben werden, weil der Monitor 'sysout' sonst wieder zurücksetzt.
+
+Mit 'basic list (FALSE)' kann die Ausgabe der Programmzeilen beim Übersetzen
+wieder ausgeschaltet werden.
+
+#page#
+#head#
+EUMEL-BASIC-Compiler 4. Umgang mit dem BASIC-Compiler %
+
+#end#
+
+4. Umgang mit dem BASIC-Compiler
+
+
+
+4.1. Erläuterungen zur #ib(3)#Syntax#ie(3)#
+
+
+Ein zu übersetzendes Programm muß dem BASIC-Compiler in Form einer
+#ib(3)#EUMEL-Textdatei#ie(3)# übergeben werden. (Es gelten somit auch die für EUMEL-Text­
+dateien üblichen Begrenzungen, z.B. höchstens 32000 Zeichen pro Zeile und höch­
+stens 4075 Dateizeilen pro Datei.)
+BASIC-Programme setzen sich aus Programmzeilen zusammen; jede Dateizeile der
+#ib(3)#Programmdatei#ie(3)# bildet eine BASIC-Programmzeile. Die Syntax für ein Programm sieht
+damit so aus:
+
+
+<Programmzeile>[<Programmzeile>][...]EOF
+
+Dabei bedeutet #ib(3)#EOF (end of file)#ie(3)# das Ende der Programmdatei.
+
+Eine #ib(3)#Programmzeile#ie(3)# hat folgende Syntax:
+
+
+[<Zeilennummer>][<Anweisung>][:<Anweisung>][...][:]EOL
+
+Die #ib(3)#Zeilennummer#ie(3)# dient unter anderem als Sprungadresse an den Anfang der Pro­
+grammzeile während der Laufzeit des Programms (vgl. 'GOTO' und 'GOSUB'). Sie ist
+fakultativ (d.h. sie muß nicht geschrieben werden). Durch sparsame Verwendung von
+Zeilennummern (nämlich nur da, wo sie benötigt werden) kann eine gewisse Steige­
+rung der #ib(3)#Übersichtlichkeit von BASIC-Programmen#ie(3)# erreicht werden. Hat eine Pro­
+grammzeile keine Zeilennummer, so wird bei Fehlermeldungen (sowohl während der
+Übersetzung als auch zur Laufzeit des Programms) die letzte Zeilennummer mit
+angegeben, die davor auftrat.
+Zeilennummern dürfen im Bereich von 1 bis 32767 liegen und müssen unbedingt in
+aufsteigender Reihenfolge vergeben werden. Zeilennummern dürfen keine Leerzeichen
+enthalten und müssen mit einem Leerzeichen abgeschlossen werden. Um spätere
+Ergänzungen zu ermöglichen, ist eine Numerierung im Abstand zehn empfehlenswert.
+
+Hier ein Beispiel, wie ein BASIC-Programm in einer EUMEL-Datei aussehen
+könnte:
+
+
+...........................Einmaleins............................
+10 CLS: PRINT "Kleines Einmaleins"
+ FOR zahl% = 1 TO 10
+ PRINT
+ 'Erzeugung einer Zeile
+ FOR faktor% = 1 TO 10
+ PRINT TAB (faktor% * 5);
+ PRINT USING "\#\#\#"; faktor% * zahl%;
+ NEXT faktor%
+ NEXT zahl%
+
+
+
+
+Die Syntax der Anweisungen, die vom EUMEL-BASIC-Compiler übersetzt werden
+können, ist ausführlich im Kapitel 8 beschrieben.
+
+Der #ib(3)#Doppelpunkt#ie(3)# dient als Trennzeichen zwischen Anweisungen. Ihm muß nicht
+unbedingt eine Anweisung folgen. Er kann somit als explizites "Ende der
+Anweisung"-Symbol aufgefaßt werden (#ib(3)#EOS, "end of statement"#ie(3)#).
+
+#ib(3)#EOL (end of line)#ie(3)# ist das Ende einer Dateizeile. (Dieses "Zeichen" ist ebenso wie
+EOF beim Editieren der Datei nicht sichtbar.)
+Das #ib(3)#Hochkomma#ie(3)# ("'", Code 39) wird vom Compiler ebenfalls als EOL interpretiert.
+Alle dem Hochkomma in der Dateizeile folgenden Zeichen werden überlesen. Dies
+ermöglicht das Schreiben von Kommentaren ohne Verwendung der
+'REM'-Anweisung.
+
+Es sei hier bereits bemerkt, daß sich durch die Realisierung des Übersetzers als
+#on ("b")#Compiler gewisse Unterschiede gegenüber Interpretern #off ("b")#ergeben (siehe hierzu Kap. 9).
+Der wesentliche Unterschied ist, daß der Interpreter dem Programmtext analog zum
+Programmablauf folgt, der Compiler das Programm aber von vorne bis hinten Zeile für
+Zeile übersetzt. Dies hat zur Folge, daß z.B. die Dimensionierungen von Feldvariablen
+#on ("b")#textuell vor der Verwendung der Variablen stattfinden müssen#off ("b")# und nicht, wie bei
+Interpretern, nur im Ablauf des Programms vorher ausgeführt werden müssen.
+
+
+
+Weitere Schreibregeln
+
+#on ("b")#
+1. #ib(3)#Groß-/Kleinschreibung#ie(3)##off ("b")#
+Für den BASIC-Compiler bestehen zwischen kleinen und großen Buchstaben keiner­
+lei Unterschiede, es sei denn es handelt sich um Textdenoter (Textkonstanten).
+Daher können alle #ib(3)#Schlüsselwörter#ie(3)# und #ib(3)#Variablennamen#ie(3)# mit kleinen oder großen
+Buchstaben geschrieben werden. Aus der Tatsache, daß zwischen großen und kleinen
+Buchstaben nicht unterschieden wird, folgt aber bespielsweise auch, daß die Variab­
+lennamen (vgl. 4.3.) 'hallo' und 'HALLO' ein und dieselbe Variable bezeichnen.
+
+#on ("b")#
+2. #ib(3)#Reservierte Wörter#ie(3)##off ("b")#
+Der BASIC-Compiler erkennt eine ganze Reihe #on("i")#reservierter Wörter#off("i")#. Es handelt sich
+hierbei im wesentlichen um die Namen der Anweisungen und Funktionen. Sie sollten
+im eigenen Interesse darauf achten, daß sich sowohl vor als auch hinter reservier­
+ten Wörtern stets mindestens ein #on ("b")##ib(3)#Leerzeichen#ie(3)##off ("b")# (Blank) befindet. Der #ib(3)#Scanner#ie(3)# (ver­
+gleiche AnhangB) erkennt zwar manchmal die reservierten Wörter auch ohne Leer­
+zeichen, aber unter bestimmten Umständen kann es auch zu erkannten oder - noch
+schlimmer - vom Compiler unerkannten Fehlern kommen.
+Hierzu zwei Beispiele:
+Die Anweisung 'IF a > b THENPRINT "größer"' führt beim Compilieren zur Fehler­
+meldung "Syntaxfehler: THEN oder GOTO erwartet".
+Wesentlich gefährlicher ist da schon die Programmzeile
+ "LEThallo = 3 : PRINT hallo",
+denn die unerwartete Wirkung ist die Ausgabe von "0" auf dem Bildschirm. Der Wert
+"3" wurde nämlich nicht der Variablen mit dem Namen "hallo" zugewiesen, sondern
+einer Variablen namens "LEThallo".
+
+#on ("b")#
+3. Bedeutung der #ib(3)#Leerstelle#ie(3)# ("Blank") für den Compiler#off("b")#
+Wie schon aus dem vorhergehenden Punkt ersichtlich kann das Fehlen von trennen­
+den Leerstellen unschöne Effekte haben, denn der #ib(3)#Scanner#ie(3)# (vgl. AnhangB) des
+BASIC-Compilers erkennt anhand der Leerstelle (Code 32) beim Durchlauf durch das
+Programm, daß ein #ib(3)#Symbol#ie(3)# zu Ende ist.
+Es kommt somit immer dann zu Fehlern, wenn zwei Symbole (z.B. reservierte Wörter,
+Konstanten, Variablen etc.) nicht durch Leerzeichen getrennt sind, und der Scanner
+sie als ein Symbol "versteht".
+Beispiel:
+ "a = 3 : b = 4 : PRINT a b" erzeugt die Ausgabe "34".
+ "a = 3 : b = 4 : PRINT ab" erzeugt hingegen die Ausgabe "0", denn der
+Compiler sieht "ab" als #on ("b")#einen Variablennamen an. #off ("b")#
+
+
+
+4.2. #ib(3)#Datentypen#ie(3)# und #ib(3)#Konstanten#ie(3)#
+
+
+Der EUMEL-BASIC-Compiler unterscheidet grundsätzlich zwischen zwei Daten­
+typen, nämlich zwischen #ib(3)#Texte#ie(3)#n und #ib(3)#Zahlen#ie(3)#.
+
+#on ("b")#
+#ib(3)#Datentyp TEXT#ie(3)# #off ("b")#
+Texte dürfen alle Zeichen enthalten (Codes 0 bis 255) und bis zu 32000 Zeichen lang
+sein.
+Die zugehörigen Konstanten werden von #ib(3)#Anführungszeichen#ie(3)# begrenzt, z.B.:
+ "Anzahl Einträge: "
+ "2.32 DM"
+ "General-Musik-Direktor"
+Anführungszeichen (Code 34) dürfen #on("i")#innerhalb#off("i")# von Text-Konstanten nicht vor­
+kommen.
+
+Bei Zahlen unterscheidet der Compiler noch zwischen #ib(3)#INTs#ie(3)# (#ib(3)#Ganzzahlen#ie(3)#) und REALs
+(#ib(3)#Gleitkommazahlen#ie(3)#). Diese entsprechen im Hinblick auf den Wertebereich genau den
+in ELAN bekannten INTs und REALs.
+
+#on ("b")#
+#ib(3)#Datentyp INT#ie(3)# #off ("b")#
+INT-Werte dürfen zwischen -32768 und 32767 liegen. INT-Konstanten dürfen aber
+#on("i")#nur#off("i")# aus Ziffern und einem optionalen '%'-Zeichen am Ende bestehen. Das bedeutet,
+daß die INT-Konstanten im Bereich von 0 bis 32767 liegen können.
+Ein nachgestelltes '%'-Zeichen kennzeichnet eine Konstante nochmals explizit als
+INT. (Diese Option wurde aus Kompatibilitätsgründen implementiert.)
+
+#on ("b")#
+#ib(3)#Datentyp REAL#ie(3)# #off ("b")#
+REALs können Werte zwischen -9.999999999999*10#u#126#e# und
+9.999999999999*10#u#126#e# annehmen.
+Die kleinste positive von Null verschiedene Zahl ist 9.999999999999*10#u#-126#e#.
+Der kleinste REAL-Wert mit x + 1.0 > 1.0 ist gleich 10#u#-12#e#.
+REAL-Konstanten werden gebildet aus Vorkommastellen, Dezimalpunkt, Nachkom­
+mastellen, Zeichen "E" oder "D" (jeweils auch klein) für den #ib(3)#Exponent#ie(3)#en gefolgt vom
+Vorzeichen und den Ziffern des Exponenten.
+Dabei müssen nicht für jede REAL-Konstante alle diese Elemente benutzt werden.
+Unverzichtbar sind #on("i")#entweder#off("i")# der Dezimalpunkt #on("i")#oder#off("i")# der Exponent. Ebenso müssen
+zumindest entweder Vor- oder Nachkommastellen vorhanden sein.
+
+Beispiele für gültige REAL-Konstanten sind:
+ 0.
+ .01
+ 1E-17
+ 2.9979D8
+ .3e-102
+ 100.e+7
+
+Nicht erlaubt sind dagegen folgende Schreibweisen für REAL-Konstanten:
+ e12 (#ib(3)#Mantisse#ie(3)# fehlt)
+ 100 (ist INT-Konstante)
+ . (weder Vor- noch Nachkommastellen)
+ .E-12 (dito)
+ 1exp-3 ('exp' nicht erlaubt)
+ -1.99e30 (Mantisse hat Vorzeichen)
+
+Das letzte Beispiel zeigt, daß auch vor REAL-Konstanten keine #ib(3)#Vorzeichen#ie(3)# erlaubt
+sind. Da normalerweise keine REAL-Konstanten, sondern vielmehr numerische
+Ausdrücke verlangt werden, können durch Voranstellen des Operators '-' (vgl. 4.4.)
+auch #ib(3)#negative Zahlenwerte#ie(3)# leicht erzeugt werden.
+
+An REAL-Konstanten darf eines der Zeichen "!" und "\#" angehängt werden. Diese
+Option wurde aus Kompatibilitätsgründen eingebaut. Wird ein "!" oder "\#" an eine
+INT-Konstante angehängt, so verwandelt es diese in eine REAL-Konstante.
+Beispiel: 10000! oder 10000\# entspricht 10000. oder 1E4
+
+
+#page#
+
+4.3. Variablen und Felder
+
+
+Variablen
+
+Der BASIC-Compiler stellt für die in 4.2. vorgestellten Datentypen TEXT, INT und
+REAL auch Variablen zur Verfügung.
+Die #ib(3)#Variablennamen#ie(3)# müssen folgenden Bedingungen genügen:
+- Ein Variablenname muß mit einem Buchstaben beginnen.
+- Variablennamen dürfen ab der zweiten Stelle außer Buchstaben auch Ziffern, Dezi­
+ malpunkte sowie die Zeichen "!", "\#", "$" und "%" enthalten. Leerzeichen dürfen
+ in Variablennamen dagegen nicht vorkommen.
+- Variablennamen dürfen nicht mit FN beginnen (vgl. 4.5. benutzer-definierte Funk­
+ tionen).
+- #ib(3)#Reservierte Wörter#ie(3)# (siehe Anhang A) dürfen kein Variablenname sein. Als Teiltexte
+ dürfen reservierte Wörter aber in Variablennamen enthalten sein (auch am Anfang).
+
+Variablennamen dürfen beliebig lang sein, und alle Zeichen eines Variablennamens
+sind signifikant.
+
+Welchen Typ eine Variable hat, entscheidet der Compiler nach folgenden #ib(3)#Kriterien#ie(3, " für den Typ einer Variablen")# (in
+der Reihenfolge ihrer Beachtung):
+- Ist das letzte Zeichen des Namens ein "!" oder "\#", so bezeichnet er eine
+ REAL-Variable.
+- Ist das letzte Zeichen ein "%", so handelt es sich um eine INT-Variable.
+- Ist das letzte Zeichen des Namens ein "$", so ist die Variable vom Typ TEXT.
+- Liegt das erste Zeichen des Namens im Bereich der mit einer #ib(3)#DEFINT#ie(3)#-Anweisung
+ (vgl. Kap. 8) festgelegten Buchstaben, so ist die Variable eine INT-Variable.
+- Liegt das erste Zeichen im Bereich der mit einer #ib(3)#DEFSTR#ie(3)#-Anweisung (vgl. Kap. 8)
+ festgelegten Buchstaben, so handelt es sich um eine TEXT-Variable.
+- Wenn keine der obigen Bedingungen erfüllt ist, dann bezeichnet der Name eine
+ Variable des Datentyps REAL.
+
+Variablen, denen noch kein Wert zugewiesen wurde, haben den Inhalt null (bei INT
+und REAL) beziehungsweise Leertext (bei TEXT).
+
+
+
+Felder (#ib(4)#Arrays#ie(4)#)
+
+Ein Feld (Array) ist eine Ansammlung von mehreren Variablen gleichen Typs. Jedes
+Feld hat einen Namen. Für die #ib(3)#Feldnamen#ie(3)# gelten die gleichen Regeln wie für die
+Namen von normalen Variablen. Auch die Datentypen werden nach den gleichen
+Kriterien bestimmt wie bei einfachen Variablen.
+In einem Feld können die Elemente in bis zu 100 #ib(3)#Dimensionen#ie(3)# abgelegt werden. Auf
+ein Element eines Feldes wird über den Feldnamen und den Index / die #ib(3)#Indizes#ie(3)# des
+Elements zugegriffen. Beim Zugriff auf das Element müssen so viele Indizes ange­
+geben werden, wie das Feld Dimensionen hat.
+Beispiel:
+Das Feld 'tabelle' habe zwei Dimensionen. Mit 'tabelle (3, 5)' wird auf das Element
+mit dem Index 3 in der ersten Dimension und dem Index 5 in der zweiten Dimension
+zugegriffen.
+
+Beim ersten Zugriff auf ein Element eines Feldes wird anhand der Zahl der Indizes
+die Anzahl der Dimensionen festgestellt und das Feld so eingerichtet, daß in jeder
+Dimension der größte Index zehn ist.
+Soll ein Feld mit anderen größten Indizes eingerichtet werden, so muß hierzu die
+#ib(3)#DIM#ie(3)#-Anweisung verwendet werden (siehe Kapitel 8).
+
+Der kleinste Index ist voreingestellt auf null, kann aber mit der #ib(3)#OPTION BASE#ie(3)#-
+Anweisung (vgl. Kap. 8) auch auf eins eingestellt werden.
+
+Die Elemente eines Feldes sind, wie auch die einfachen Variablen, mit den Werten
+null (INT und REAL) beziehungsweise Leertext (TEXT) vorbesetzt, sofern ihnen noch
+nichts zugewiesen wurde.
+
+#page#
+
+4.4. Operatoren
+
+Nachfolgend sind alle Operatoren aufgelistet, die vom EUMEL-BASIC-Compiler
+übersetzt werden.
+
+
+Arithmetische #ib(4)#Operatoren#ie(4, ", arithmetische")#
+
+#ib(3)##ie(3, "+")##ib(3)##ie(3, "-")##ib(3)##ie(3, "*")##ib(3)##ie(3, "/")#
+#ib(3)##ie(3, "\")##ib(3)##ie(3, "MOD")##ib(3)##ie(3, "^")#
+
+ Operand(en) Zweck Ergebnistyp
+
+ + INT positives Vorzeichen INT
+ REAL positives Vorzeichen REAL
+
+ INT, INT INT-Addition INT
+ REAL, REAL REAL-Addition REAL
+
+ - INT negatives Vorzeichen INT
+ REAL negatives Vorzeichen REAL
+
+ INT, INT INT-Subtraktion INT
+ REAL, REAL REAL-Subtraktion REAL
+
+ * INT, INT INT-Multiplikation INT
+ REAL, REAL REAL-Multiplikation REAL
+
+ / (INT, INT) #linefeed (0.5)#
+ REAL-Division REAL
+ REAL, REAL #linefeed (1.0)#
+
+ \ INT, INT #linefeed (0.5)#
+ INT-Division INT
+ (REAL, REAL) #linefeed (1.0)#
+
+MOD INT, INT INT-Divisionsrest INT
+ REAL, REAL Divisionsrest nach REAL
+ Runden auf Ganzzahl (nicht INT)
+
+ ^ (INT, INT) #linefeed (0.5)#
+ Potenzierung REAL
+ REAL, REAL #linefeed (1.0)#
+
+
+#on ("b")#
+Hinweis: #off ("b")#
+Wird ein Operator mit numerischen Operanden unterschiedlichen Typs (also INT und
+REAL) aufgerufen, so wird der INT-Operand nach REAL konvertiert und der Operator
+mit den beiden REAL-Operanden aufgerufen.
+Sind die Operandtypen in Klammern angegeben, so werden vor Ausführung der Ope­
+ration die Operanden zu den nicht eingeklammerten Typen konvertiert.
+Da jede #ib(3)#Konvertierung#ie(3)# Zeit benötigt, sollte der Benutzer darauf achten, daß möglichst
+wenig konvertiert werden muß.
+Hierzu ein (etwas extremes, aber nicht seltenes) Beispiel:
+Der Aufruf a%\b bewirkt zunächst eine Konvertierung von a% nach REAL:
+CDBL(a%)\b. Intern wird die Berechnung dann aber wieder mit INTs ausgeführt:
+CINT(CDBL(a%))\CINT(b). Das Ergebnis wird also erst nach drei Konvertierungen
+geliefert. Schreibt man dagegen sofort a%\CINT(b), dann reicht eine Konvertierung
+aus.
+
+Es muß außerdem bei den Operatoren +, - und * für INTs darauf geachtet werden,
+daß das Ergebnis innerhalb des INT-Wertebereichs liegen muß, da es sonst zu
+einem #ib(3)#INT-Überlauf#ie(3)# kommt.
+
+
+
+Text-Operator #ib(4)#+#ie(4)#
+
+#ib(3)##ie(3, "Operatoren, Text-")#
+Für Text-Manipulationen wird der Operator '+' mit zwei TEXT-Operanden zur
+Verfügung gestellt. Mit '+' werden zwei Texte aneinandergehängt (konkateniert).
+
+
+
+Vergleichsoperatoren#ib(4)##ie(4, "Operatoren, Vergleichs-")#
+
+Im EUMEL-BASIC gibt es folgende Vergleichsoperatoren:
+
+#ib(3)#=#ie(3)# gleich
+#ib(3)#<>#ie(3)# ungleich
+#ib(3)#<#ie(3)# kleiner
+#ib(3)#>#ie(3)# größer
+#ib(3)#<=#ie(3)# kleiner oder gleich
+#ib(3)#>=#ie(3)# größer oder gleich
+
+Bei den numerischen Datentypen werden mit den Vergleichsoperatoren die Zahlen­
+werte verglichen.
+Sollen ein INT und ein REAL verglichen werden, dann wird der INT vorher nach
+REAL konvertiert und ein REAL-Vergleich vorgenommen.
+
+Bei Texten dienen die Vergleichsoperatoren zum Vergleich der Zeichencodes. Dies
+ermöglicht zum Beispiel ein alphabetisches Sortieren von Wörtern, mit der Einschrän­
+kung, daß Groß- und Kleinbuchstaben unterschiedliche Zeichencodes haben (ver­
+gleiche EUMEL-Zeichensatz-Tabelle im Benutzerhandbuch) und somit verschieden
+eingeordnet werden.
+Es gilt a$ < b$, wenn die Zeichenkette in a$ codemäßig vor der Zeichenkette in b$
+ steht: "a" < "b" (TRUE) "aa"< "a" (FALSE)
+
+
+Die Vergleichsoperatoren liefern, je nachdem ob die Aussage wahr oder falsch ist, die
+INT-Werte 0 (falsch) oder -1 (wahr).
+Anhand des Ergebnisses einer Vergleichsoperation kann zum Beispiel der Programm­
+ablauf gesteuert werden (siehe Kapitel 8, IF-Anweisung).
+
+
+
+Logische Operatoren
+
+#ib(3)##ie(3, "Operatoren, logische")#
+Die logischen Operatoren haben zwei Aufgaben:
+1. logische (Boolsche) Verknüpfung von #ib(3)#Wahrheitswerte#ie(3)#n, die zum Beispiel von
+ Vergleichsoperationen geliefert werden und
+2. bitweise Ausführung von logischen Verknüpfungen auf den internen (Zweierkom­
+ plement-) Darstellungen von INT-Werten.
+
+Da für beide Aufgaben die gleichen Operatoren benutzt werden, wurden für die Wahr­
+heitswerte die INT-Werte 0 für falsch (Bitmuster: 0000000000000000) und -1 für
+wahr (Bitmuster: 1111111111111111) gewählt.
+
+ Operand(en) Zweck insbesondere gilt
+
+#ib(3)#NOT#ie(3)# INT #linefeed (0.5)# NOT0->-1
+ #ib(3)#Negation#ie(3)#
+ (REAL) #linefeed (1.0)# NOT-1->0
+
+#ib(3)#AND#ie(3)# INT, INT #ib(3)#UND-Verknüpfung#ie(3)# 0AND0->0
+ 0AND-1->0
+ -1AND0->0
+ -1AND-1->-1
+
+ #ib(3)#OR#ie(3)# INT, INT #ib(3)#ODER-Verknüpfung#ie(3)# 0OR0->0
+ 0OR-1->-1
+ -1OR0->-1
+ -1OR-1->-1
+
+#ib(3)#XOR#ie(3)# INT, INT #ib(3)#Exklusiv-ODER-Verknüpfung#ie(3)# 0XOR0->0
+ 0XOR-1->-1
+ -1XOR0->-1
+ -1XOR-1->0
+
+#ib(3)#EQV#ie(3)# INT, INT #ib(3)#Äquivalenz-Verknüpfung#ie(3)# 0EQV0->-1
+ 0EQV-1->0
+ -1EQV0->0
+ -1EQV-1->-1
+
+#ib(3)#IMP#ie(3)# INT, INT #ib(3)#Implikations-Verknüpfung#ie(3)# 0IMP0->-1
+ 0IMP-1->-1
+ -1IMP0->0
+ -1IMP-1->-1
+
+
+
+Prioritäten der Operanden
+
+
+Hier die Übersicht über alle Operatoren in der Reihenfolge ihrer Ausführung
+
+
+ Operator Priorität
+
+ ^ Potenzierung 13
+ +, - positives/negatives Vorzeichen 12
+ *, / Multiplikation, REAL-Division 11
+ \ INT-Division 10
+ MOD Divisionsrest- (MOD-) Operation 9
+ +, - Addition, Subtraktion 8
+ =, <>, <, >, <=, >= Vergleichsoperatoren 7
+ NOT Negation 6
+ AND UND-Verknüpfung 5
+ OR ODER-Verknüpfung 4
+ XOR Exklusiv-ODER-Verknüpfung 3
+ EQV Äquivalenz-Verknüpfung 2
+ IMP Implikations-Verknüpfung 1
+
+
+Die Reihenfolge der Auswertung von Ausdrücken kann durch Klammern geändert
+werden.
+
+Beachten Sie, daß der Operator '=' in BASIC die Funktion eines Vergleichsoperators
+und des #ib(3)#Zuweisungsoperators#ie(3)##ib(3)##ie(3, "Operator, Zuweisungs-")# (siehe Kapitel 8, LET-Anweisung) hat.
+
+#page#
+
+4.5. #ib(3)#Funktionen#ie(3)#
+
+
+
+Standard-Funktionen
+
+Der EUMEL-BASIC-Compiler unterstützt eine ganze Reihe von Funktionen. Diese
+Funktionen liefern Werte und können in Ausdrücken zusammen mit Konstanten,
+Variablen und Operatoren verwendet werden.
+Viele der eingebauten Funktionen arbeiten mit Argumenten, das heißt es werden den
+Funktionen Werte übergeben.
+In Kapitel 8 dieses Handbuches sind alle Funktionen ausführlich beschrieben.
+Beispiele für #ib(3)#Funktionsaufrufe#ie(3)#:
+ SQR (17) Dieser Ausdruck liefert die Wurzel von 17 als REAL.
+ RIGHT$ (text$, 5) Dieser Ausdruck liefert die letzten fünf Textzeichen
+#right#aus 'text$' als TEXT.
+
+
+
+Benutzer-definierte Funktionen
+
+Neben der Verwendung der standardmäßig verfügbaren Funktionen besteht für den
+Benutzer die Möglichkeit, selbst Funktionen innerhalb eines Programms zu definieren.
+
+#on ("b")#
+#ib(3)#Definition benutzer-definierter Funktionen#ie(3)# #off ("b")#
+Hierzu dient die #ib(3)#DEF FN#ie(3)#-Anweisung (vergleiche Kapitel 8).
+Die Syntax der DEF FN-Anweisung lautet:
+
+DEFFN<Name>[(<Parameter>[,<Parameter>][...])]=
+#right#<Funktionsdefinition>
+
+<Name>: Zeichenfolge, die der Syntax für Variablennamen ent­
+ sprechen muß.
+ FN<Name> bilden zusammen den Namen der neuen
+ Funktion.
+<#ib(3)#Parameter#ie(3)#>: Zeichenfolge, die der Syntax für Variablennamen ent­
+ sprechen muß.
+<Funktionsdefinition>: Ausdruck, der Konstanten, Variablen, die Parameter der
+ Funktion und Aufrufe anderer Funktionen enthalten
+ darf.
+
+- Die benutzer-definierten Funktionen ("user functions") liefern, genau wie die
+ Standard-Funktionen, Werte.
+- Das letzte Zeichen des Funktionsnamens gibt den Typ des Wertes an, den die
+ Funktion liefert. Soll die Funktion einen TEXT liefern, so muß der Name mit "$"
+ enden. Soll ein INT geliefert werden, muß der Name mit "%" enden. Für alle
+ anderen Endungen wird eine REAL-liefernde Funktion eingetragen.
+- Die Syntax der Parameternamen entspricht der Syntax für die Namen von einfachen
+ Variablen.
+- Die Parameter haben nur bei der Definition Gültigkeit. Hierbei 'überdecken' sie (für
+ diese Zeile) eventuell im BASIC-Programm vorhandene gleichnamige Variablen.
+- Jeder Parameter darf in der Parameterliste nur einmal vorkommen.
+- Bezeichnet der Funktionsname eine TEXT-liefernde Funktion, so muß auch die
+ Funktionsdefinition ein Ergebnis vom Typ TEXT liefern. Zwischen INTs und REALs
+ findet eine Typanpassung statt.
+- Eine Funktion darf nicht in ihrer eigenen Definition erscheinen.
+- Eine Funktion ist allein durch ihren Namen gekennzeichnet. Generische Funktionen
+ (gleicher Name, aber unterschiedliche Parameter) können somit nicht definiert wer­
+ den.
+
+Beispiele für gültige Funktionsdefinitionen:
+ DEF FNPI = 3.1415927
+ DEF FNumfang (radius) = 2.0 * FNPI * radius (Enthält Aufruf von FNPI)
+ DEF FNhallo$ (dummy$) = "Hallo " + name$ (name$ kommt im
+ #right#BASIC-Programm vor)
+ DEF FNheavyside% (x) = ABS (SGN (x) = 1)
+
+Beispiele für ungültige Funktionsdefinitionen:
+ DEF FNfunct (a, b, a) = a ^ 2 + b (a kommt zweimal als Parameter vor)
+ DEF FNfr (x) = x * FNfr (x - 1) (rekursive Definition)
+
+
+#on ("b")#
+#ib(3)#Aufruf benutzer-definierter Funktionen#ie(3)# #off ("b")#
+
+FN<Name> [ ( <Argument> [, <Argument>] [...] ) ]
+
+<#ib(3)#Argument#ie(3)#> : Ausdruck, der für den entsprechenden Parameter bei der Evaluation
+ (Auswertung) der Funktion eingesetzt werden soll
+
+- Beim Funktionsaufruf werden die Argumente in der Reihenfolge ihres Auftretens für
+ die Parameter eingesetzt. Für TEXT-Parameter müssen die Argumente ebenfalls
+ TEXTe liefern. Zwischen INTs und REALs findet eine Typanpassung statt.
+- Die Anzahl der Argumente muß genau mit der Anzahl der Parameter übereinstim­
+ men.
+- Für in der Funktionsdefinition vorkommende Variablen wird der zum Zeitpunkt des
+ Funktionsaufruf gültige Wert eingesetzt.
+- Die Definition der Funktion muß dem ersten Aufruf der Funktion textuell voraus­
+ gehen.
+- Eine Definition gilt für alle textuell folgenden Aufrufe, bis die Funktion wieder neu
+ definiert wird.
+
+Beispiele für korrekte Funktionsaufrufe (bezogen auf obige Beispiel-Definitionen):
+ PRINT FNPI / 2.0 (Ausgabe: 1.570796)
+ PRINT FNumfang (20) (Ausgabe: 125.6637)
+ LET name$ = "Purzelbär":PRINT FNhallo$ ("") (Ausgabe: Hallo Purzelbär)
+ PRINT heavyside% (-17.3) (Ausgabe: 0)
+
+Beispiele für falsche Funktionsaufrufe (bezogen auf obige Beispiel-Definitionen):
+ PRINT FNPI (10) (kein Argument erwartet)
+ PRINT FNumfang (Argument erwartet)
+ PRINT FNhallo$ (zahl%) (Falscher Typ des Arguments)
+ PRINT FNheavyside (17.4, -12.3) (Zu viele Argumente)
+
+
+#page#
+
+4.6. #ib(3)#Typanpassung#ie(3)#
+
+
+In BASIC wird, im Gegensatz zu ELAN, nicht sehr streng zwischen den numerischen
+Datentypen unterschieden, sondern es finden häufig automatische Typanpassungen
+statt. Zu solchen Typanpassungen kommt es vor allem bei der Zuweisung, bei Opera­
+toren und bei Funktionen, aber auch bei einigen Anweisungen.
+Die automatische Typanpassung hat zwei Nachteile:
+1. Die Typkonvertierung von INT nach REAL und umgekehrt kostet Zeit während der
+ Programmausführung.
+2. Es kann zu sehr unangenehmen Laufzeitfehlern kommen, wenn eine REAL-
+ INT-#ib(3)#Konvertierung#ie(3)# mit Fehler abbricht, weil der REAL-Wert außerhalb des
+ INT-Wertebereichs liegt.
+
+Allgemein gilt also, daß sich der Programmierer auch in BASIC über die Typen der
+verwendeten Objekte im klaren sein sollte. Außerdem ist zu beachten, daß bei Konver­
+tierungen von REAL nach INT immer gerundet wird.
+
+Genaueres zur Typanpassung bei der Zuweisung finden Sie in Kapitel 8 bei der
+LET-Anweisung.
+Über Typkonvertierung bei Operatoren informiert Kapitel 4.4.
+Informationen über die Funktionen betreffenden Typkonvertierungen befinden sich am
+Anfang von Kapitel 8 und direkt bei der Beschreibung der jeweiligen Funktionen
+(ebenfalls in Kapitel 8).
+
+#page#
+
+4.7. Aufruf von EUMEL-Prozeduren in
+ BASIC-Programmen
+
+
+
+Der EUMEL-BASIC-Compiler bietet die Möglichkeit, insertierte ELAN-Prozeduren
+(und auch insertierte BASIC-Programme) in BASIC-Programmen aufzurufen. Hierzu
+werden die beiden Anweisungen #ib(3)#CALL#ie(3)# und #ib(3)#CHAIN#ie(3)# (identisch) sowie die Funktion
+#ib(3)#USR#ie(3)# zur Verfügung gestellt.
+Mit der CALL-Anweisung (siehe auch Kapitel 8) können Prozeduren aufgerufen
+werden, die keinen Wert liefern und nur die BASIC-Datentypen INT, REAL und/oder
+TEXT als Parameter benötigen.
+Beispiele:
+ CALL list
+ CALL taskstatus ("PUBLIC")
+ CALL cursor (10, 21)
+ CALL getcursor (x%, y%)
+
+Das letzte Beispiel zeigt, daß auch #ib(3)#VAR-Parameter#ie(3)# im ELAN-Sinne übergeben
+werden können.
+
+Die Funktion USR dient im Gegensatz zu CALL zum Aufruf von #ib(3)#wertliefernden Pro­
+zeduren#ie(3)#. Die Prozeduren dürfen allerdings nur einen der BASIC-Datentypen INT,
+REAL oder TEXT liefern. Es gilt auch bei USR, wie bei CALL, daß die aufgerufenen
+Prozeduren nur Parameter der Typen INT, REAL oder TEXT haben dürfen.
+Beispiele:
+ PRINT USR e (Ausgabe: 2.718282)
+ PRINT USR compress (" EUMEL ") (Ausgabe: EUMEL)
+
+#on ("b")#
+Wichtige Hinweise zu CALL, CHAIN und USR: #off ("b")#
+1. Bei den Parametern finden keinerlei Typkonvertierungen statt (ELAN-
+ Prozeduren werden ja gerade anhand der Typen ihrer Parameter eindeutig identifi­
+ ziert).
+2. Die Prozedurnamen nach CALL, CHAIN und USR dürfen keine Leerzeichen ent­
+ halten, weil die Prozedur sonst nicht identifiziert werden kann.
+ Beispiel: CALLlernsequenzauftastelegen(...) statt
+ CALLlernsequenzauftastelegen(...)
+3. Die Prozedurnamen können (nach BASIC-Konvention) auch Großbuchstaben
+ enthalten.
+ Beispiel: CALLcursor(17,4) ist äquivalent zu
+ CALLCURSOR(17,4)
+
+
+Wie in Kapitel 3 erläutert kann ein BASIC-Programm auch insertiert werden. Somit
+können mit der CALL-Anweisung auch andere (vorher insertierte) BASIC-
+Programme aufgerufen werden.
+Beispiel:
+CALL blackjack ('blackjack' sei der Prozedurname, unter dem ein BASIC-
+ Programm zuvor insertiert wurde.)
+
+Die sonst in einigen BASIC-Dialekten vorhandene Möglichkeit, Programme oder
+#ib(3)#Programmsegmente#ie(3)# nachzuladen, kann so durch Aufrufe von insertierten Programmen
+nachgebildet werden.
+#page#
+#head#
+EUMEL-BASIC-Compiler 5. Steuerung der Bildschirmausgaben %
+
+#end#
+
+5. #ib(4)#Steuerung der #ib(3)#Bildschirmausgaben#ie(3)##ie(4)#
+
+
+
+Die Ausgaben von BASIC-Programmen ('PRINT' und 'WRITE') werden im Paket
+'basic output' behandelt. Dieses Paket ermöglicht unter anderem, daß die Ausgabe
+auf das Terminal mit der Prozedur
+
+ PROC #ib(3)#basic page#ie(3)# (BOOL CONST status)
+
+gesteuert werden können. Wird dabei 'TRUE' eingestellt, so wartet die Ausgabe bei
+Erreichen der letzten Terminalzeile auf die Eingabe eines Zeichens, bevor sie fortfährt.
+Das Eingabezeichen wird nach Ausgabe von ">>" in der rechten unteren Ecke des
+Bildschirms erwartet und wie folgt interpretiert:
+
+#linefeed (1.5)#
+ Löschen des Bildschirms und Ausgabe der nächsten Bildschirmseite
+ Ausgabe der nächsten Zeile
+ Abbruch des Programms mit der Fehlermeldung "'halt' vom Terminal"
+ 'basic page' wird auf 'FALSE' gesetzt #linefeed (1.0)#und mit der normalen Ausgabe
+ weitergemacht
+
+Alle anderen Tasten bewirken eine Ausgabe der nächste Bildschirmseite (#ib(3)#Scrolling#ie(3)#).
+
+Ist 'basic page' auf 'FALSE' gesetzt, so kann durch Eingabe von vor einem Zei­
+lenwechsel 'basic page' auf 'TRUE' gesetzt werden.
+#page#
+#head#
+EUMEL-BASIC-Compiler 6. Grenzen des Compilers %
+
+#end#
+
+6. #ib(3)#Grenzen des Compilers#ie(3)#
+
+
+Es gibt verschiedene Grenzen, die bei der Benutzung des BASIC-Compilers erreicht
+werden können.
+
+#on ("b")#
+Grenzen des #ib(3)#EUMEL-Coder#ie(3)#s #off ("b")#
+Da ein BASIC-Programm vom Compiler als eine Prozedur im Coder eingetragen
+wird, darf der Code für ein BASIC-Programm die #ib(3)#Modulgrenze#ie(3)# von 7500 Byte Code
+nicht überschreiten.
+Sollte dies doch einmal der Fall sein (#ib(3)#Compiler Error 308#ie(3)#), so gibt es folgende
+Abhilfe-Möglichkeiten:
+- Zerlegen des BASIC-Programms in mehrere BASIC-Programme, wobei ein
+ Programm das andere während der Ausführung aufrufen kann (vgl.4.7.).
+ Bei dieser Methode können die Teilprogramme aber nicht mit gemeinsamen Variab­
+ len arbeiten.
+- Auslagerung von Programmteilen (z.B. Unterprogrammen) in ELAN-Prozeduren,
+ die insertiert und vom BASIC-Programm aufgerufen werden können (vgl.4.7.).
+ Dieses Verfahren bietet die Möglichkeit, Variablen zwischen BASIC-Programm und
+ ELAN-Prozedur über die Prozedurschnittstelle auszutauschen.
+
+Neben der Begrenzung des Codes ist auch die Größe des Datenspeicherbereichs pro
+BASIC-Programm begrenzt. Insgesamt dürfen die Datenobjekte eines BASIC-
+Programms nicht mehr als 32 KByte Speicherplatz belegen. Andernfalls kommt es
+zum #ib(3)#Compiler Error 307#ie(3)#.
+
+Eine weitere Grenze des EUMEL-Coders stellt die maximal zulässige Anzahl der
+#ib(3)#Labels#ie(3)# (interne Sprungadressen) dar. Es können nur höchstens 2000 Labels vom
+Coder verwaltet werden. Der BASIC-Compiler vergibt für jede gefundene Zeile mit
+Zeilennummer ein Label und benötigt auch bei Schleifen (FOR-NEXT, WHILE-
+WEND), Fallunterscheidungen (IF-Anweisung), Unterprogramm-Aufrufen (GOSUB)
+und bei der Definition von benutzer-definierten Funktionen (DEF) Labels.
+Beim Auftreten des #ib(3)#Compiler Errors 304#ie(3)# (zu viele Label) ist Abhilfe relativ leicht
+dadurch möglich, daß Zeilennummern nur den Zeilen vergeben werden, die tatsächlich
+angesprungen werden (d.h. zu denen es GOTOs oder GOSUBs gibt).
+
+#on ("b")#
+Grenzen des BASIC-Compilers #off ("b")#
+Die interne #ib(3)#Namenstabelle#ie(3)# des BASIC-Compilers kann etwa 4240 Einträge aufneh­
+men. Ein Eintrag in dieser Tabelle wird für jede Variable, für jedes Feld, für jede
+benutzer-definierte Funktion und für jeden Parameter einer benutzer-definierten
+Funktion sowie für jede Konstante erzeugt. Numerische Konstanten erhalten, sofern
+sie konvertiert werden müssen, sogar zwei Einträge in der Namenstabelle.
+Bei Auftreten des seltenen Fehlers "volle Namenstabelle" kann durch eine Aufteilung
+des BASIC-Programms in Teilprogramme oder eine Auslagerung von Unterprogram­
+men in ELAN-Prozeduren Abhilfe geschaffen werden.
+
+#on ("b")#
+Sonstige EUMEL-Grenzen #off ("b")#
+Außer den bisher genannten Begrenzungen sei nochmals auf die Begrenzung des
+#ib(3)#Codebereichs pro Task#ie(3)# hingewiesen (maximal 256 KByte Code).
+Da der EUMEL-Coder und der BASIC-Compiler recht viel Code belegen, sollte
+"vorsichtig" insertiert werden, also nur das, was wirklich benötigt wird.
+Auch die übrigen Grenzen des EUMEL-Systems sind zu beachten (vergleiche hierzu
+die Aufstellung der möglichen Compiler Errors im EUMEL-Benutzerhandbuch)!
+
+#page#
+#head#
+EUMEL-BASIC-Compiler 7. Fehlerbehandlung %
+
+#end#
+
+7. #ib(3)#Fehlerbehandlung#ie(3)#
+
+
+7.1. #ib(3)#Fehler zur Übersetzungszeit#ie(3)#
+
+Endeckt der BASIC-Compiler bei der Übersetzung eines BASIC-Programms Fehler,
+so werden diese auf dem Bildschirm angezeigt und ins #ib(3)#Notebook#ie(3)# eingetragen.
+Nur (syntaktisch) fehlerfreie Programme werden zur Ausführung gebracht beziehungs­
+weise insertiert.
+Im #ib(3)#Vordurchlauf#ie(3)# werden die Zeilennummern auf Richtigkeit überprüft. Falls bereits
+hiebei Fehler festgestellt werden, bricht der Compiler die Übersetzung nach dem
+Vordurchlauf ab.
+Im #ib(3)#Hauptdurchlauf#ie(3)# wird das Programm Zeile für Zeile auf syntaktische Richtigkeit
+überprüft und gleichzeitig übersetzt. Wird dabei in einer Programmzeile ein Fehler
+entdeckt, so wird er angezeigt und die Übersetzung des Programms #on("i")#in der nächsten
+Programmzeile#off("i")# fortgesetzt. Eine Ausnahme von dieser Regel bildet nur die #ib(3)#DEF FN#ie(3)#-
+Anweisung, bei der bei gewissen Fehlern die Übersetzung fortgesetzt wird. (Der
+Grund hierfür liegt darin, daß die Folgefehlerzahl besonders bei der DEF FN-
+Anweisung sehr groß wäre, wenn beim Auftreten eines Fehlers die Übersetzung der
+Zeile sofort abgebrochen würde. Die Parameter würden dann nämlich nicht oder
+falsch abgelegt, und bei jedem Aufruf der Funktion würde ein Fehler gemeldet.)
+
+Eine Übersicht über alle verwendeten Fehlermeldungen zur Übersetzungszeit befindet
+sich im AnhangC.
+
+
+
+Interne Compilerfehler
+
+Neben den "normalen" Fehlern (siehe oben) kann es in seltenen Fällen möglicher­
+weise auch zu internen Fehlern kommen.
+Es gibt zwei verschiedene Sorten von internen Fehlern:
+1. interne Fehler, die das Compilerprogramm selbst feststellt.
+ Solche Fehler bewirken die Meldung "Interner Fehler !" (meist mit näherer Erläu­
+ terung) und die Fortsetzung der Übersetzung in der nächsten Programmzeile.
+2. Fehler, die in anderen Paketen des BASIC-Systems oder des EUMELs (z.B. im
+ EUMEL-Coder) während der Übersetzungszeit ausgelöst werden (siehe auch
+ Kapitel 6: "Grenzen des Compilers").
+ Solche Fehler werden mit "#ib(3)#BASIC-Compiler ERROR#ie(3)#" und eventuell näheren
+ Angaben gemeldet. Beim Auftreten eines solchen Fehlers wird die Übersetzung
+ des gesamten Programms abgebrochen.
+
+Sollten bei Ihrer Arbeit mit dem EUMEL-BASIC-Compiler interne Fehler auftreten,
+die nicht auf das Überschreiten von Compilergrenzen zurückzuführen sind, dann
+wären wir Ihnen für eine Meldung der Fehler dankbar. Bitte senden Sie eine Fehler­
+beschreibung an:
+
+ Gesellschaft für Mathematik und Datenverarbeitung
+ Schloß Birlinghoven
+ Postfach 1240
+ 5205 Sankt Augustin 1
+
+Die Fehlerbeschreibung sollte nach Möglichkeit folgende Informationen enthalten:
+- verwendete Hardware
+- Urlader-Version
+- EUMEL-Version
+- Programmtext des Programms, das den Fehler auftreten ließ
+- genaue Angabe der ausgegebenen Fehlermeldung
+
+
+#page#
+
+7.2. #ib(3)#Fehler zur Laufzeit#ie(3)#
+
+Treten während der Laufzeit eines BASIC-Programms Fehler auf, so wird die Ausfüh­
+rung des Programms mit einer entsprechenden Fehlermeldung abgebrochen.
+Da die meisten Laufzeit-Fehlermeldungen durch Prozeduren des EUMEL-Systems
+(und nicht des BASIC-Systems) erzeugt werden, entsprechen sie oft nicht der
+BASIC-Terminologie. (Beispielsweise führt ein zu großer Feldindex zu der Fehlermel­
+dung "Ueberlauf bei Subskription".)
+
+Die bei Laufzeitfehlern gemeldete #ib(3)#Fehlerzeile#ie(3)# bezieht sich nicht (wie bei ELAN-Pro­
+grammen) auf die Nummer der Dateizeile, sondern auf die letzte der Programmzeile
+vorangegangene BASIC-Zeilennummer.
+
+Fast alle ausgelösten Laufzeitfehler erzeugen auch #ib(3)#Fehlercodes#ie(3)#. Dabei liefern Fehler
+aus EUMEL-Betriebssystem-Prozeduren die EUMEL-Standard-Fehlercodes (vgl.
+Systemhandbuch), zum Beispiel wird beim Fehler "INT-Ueberlauf" der Fehlercode 4
+geliefert.
+Laufzeitfehler, die in Prozeduren des BASIC-Systems ausgelöst werden, liefern dage­
+gen den in Microsoft-BASIC üblichen Fehlercode plus 1000. So liefert die Meldung
+"Keine Daten mehr für READ" den Fehlercode 1004 (MS-BASIC: "Out of data",
+Fehlercode 4).
+Es läßt sich so anhand des gelieferten Fehlercodes ermitteln, ob der Fehler im
+BASIC-System oder an einer anderen Stelle des EUMEL-Systems ausgelöst wurde.
+
+Eine Übersicht über die innerhalb des BASIC-Systems erzeugten Fehlermeldungen
+enthält Anhang C.
+
diff --git a/doc/basic/basic handbuch.2 b/doc/basic/basic handbuch.2
new file mode 100644
index 0000000..1379e9e
--- /dev/null
+++ b/doc/basic/basic handbuch.2
@@ -0,0 +1,2441 @@
+#page nr ("%", 31)#
+#head#
+EUMEL-BASIC-Compiler 8. Übersicht über die Befehle und Funktionen %
+
+#end#
+
+8. Übersicht über die Anweisungen und Funktionen
+
+
+
+In diesem Kapitel sind alle Anweisungen und Funktionen des vom Compiler übersetz­
+baren BASIC-Sprachumfangs in alphabetischer Reihenfolge aufgeführt.
+Auch die Anweisungsbestandteile (z.B. ELSE und TO) sind mit einem Hinweis auf die
+zugehörige Anweisung eingeordnet.
+Sind bei Funktionen INT- oder REAL-Ausdrücke als Argumente angegeben, so ist
+dies als Hinweis auf den Sinn der Funktion zu verstehen. Es können auch Ausdrücke
+des jeweils anderen Datentyps eingesetzt werden. Wird statt eines INT-Ausdrucks
+ein REAL-Ausdruck angegeben, so darf dessen Wert aber nur innerhalb des
+Wertebereichs für INTs liegen, da der REAL-Wert bei der Ausführung der Funktion
+in einen INT-Wert konvertiert wird.
+
+
+
+Funktion : ABS
+
+Zweck : Berechnung des Betrages (Absolutwertes) einer Zahl
+
+Syntax : ABS (<num. Ausdruck>)
+
+Erklärung : Liefert den Betrag des numerischen Ausdrucks.
+ Das Ergebnis ist vom gleichen Typ wie das Argument.
+
+
+Beispiel : 10 a = -12.74
+ 20 PRINT ABS (a)
+ Ausgabe: 12.74
+
+Vergleiche : SGN-Funktion
+
+
+
+Operator : AND
+
+Siehe Kapitel 4.4. (Operatoren)
+
+
+
+Anweisungsbestandteil : AS
+
+Siehe NAME-Anweisung
+
+
+
+Funktion : ASC
+
+Zweck : Ermittlung des ASCII-Codes eines Textzeichens
+
+Syntax : ASC (<TEXT-Ausdruck>)
+
+Erklärung : Die Funktion liefert den ASCII-Code des ersten Zeichens des
+ TEXT-Ausdrucks.
+ Der Code wird als INT geliefert.
+
+
+Beispiel : 10 a$ = "Guten Tag !"
+ 20 PRINT ASC (a$)
+ Ausgabe: 71
+
+Vergleiche : CHR$-Funktion (Komplementärfunktion)
+
+
+
+Funktion : ATN
+
+Zweck : Berechnung des Arcustangens
+
+Syntax : ATN (<num. Ausdruck>)
+
+Erklärung : Die Funktion liefert den Arcustangens des
+ numerischen Ausdrucks in Radiant.
+
+
+Beispiel : 10 LET x = 4
+ 20 PRINT ATN (x)
+ Ausgabe: 1.325818
+
+Vergleiche : TAN-Funktion (Komplementärfunktion), SIN, COS
+
+
+
+Anweisungsbestandteil : BASE
+
+Siehe OPTION BASE-Anweisung
+
+
+
+Anweisung : CALL
+
+Zweck : Aufruf einer insertierten Prozedur
+
+Syntax : CALL <Prozedurname> #right#[ (<Parameter> [, <Parameter>] [...] ) ]
+
+Erklärung : <Prozedurname>: Folge aus Zeichen, die für Prozeduren im
+ EUMEL-System zugelassen sind (also Buchstaben und - ab der
+ zweiten Stelle - Zahlen), aber keine Leerzeichen.
+
+ <Parameter>: <CONST-Parameter> | <VAR-Parameter>
+
+ <CONST-Parameter>: Ausdruck (genau des von der Prozedur
+ benötigten Typs)
+ <VAR-Parameter>: Variable (genau des von der Prozedur benö­
+ tigten Typs)
+
+ Die Prozedur mit dem angegebenen <Prozedurnamen> wird mit den
+ angegebenen Parametern aufgerufen.
+ Die aufgerufene Prozedur darf keinen Wert liefern (vgl. USR-Funk­
+ tion).
+
+ Mögliche Fehlerfälle:
+ - Eine Prozedur mit dem Namen <Prozedurnamen> und den an­
+ gegebenen Parametern gibt es nicht.
+ - Die Prozedur liefert einen Wert.
+ - Die Prozedur benötigt Parametertypen, die in BASIC nicht bekannt
+ sind (z.B. BOOL, FILE, TASK, QUIET).
+ - Ein Parameter ist CONST, es wird aber ein VAR-Parameter ver­
+ langt.
+
+ Weitere Informationen finden Sie in Kapitel 4.7.
+
+Hinweis : 1. Bei den Parametern wird keine Typkonvertierung vorgenommen.
+ 2. Der Prozedurname muß (entgegen der ELAN-Gewohnheit) ohne
+ Leerzeichen angegeben werden.
+ 3. Statt des Anweisungswortes CALL kann auch CHAIN geschrieben
+ werden. CALL und CHAIN werden im EUMEL-BASIC nicht wie
+ in Microsoft-BASIC benutzt.
+
+
+Beispiel : 10 CALL sysout ("Meine Datei")
+ 20 PRINT "Dieser Text geht nun in die Datei"
+ 30 CALL sysout ("")
+ 40 PRINT "Wieder auf den Bildschirm"
+
+
+Vergleiche : USR-Funktion
+
+
+
+Funktion : CDBL
+
+Zweck : Konvertierung in den Datentyp REAL
+
+Syntax : CDBL (<num. Ausdruck>)
+
+Erklärung : Das Ergebnis des numerischen Ausdrucks wird als REAL geliefert.
+
+
+Beispiel : 10 LET a! = 17
+ 20 PRINT USR max (CDBL (a!), 152.3)
+ 30 REM max benötigt zwei REALs als Parameter
+
+
+Vergleiche : CINT-Funktion
+
+
+
+Anweisung : CHAIN
+
+Vollkommen identisch mit der CALL-Anweisung (Erklärung siehe dort !)
+
+
+
+Funktion : CHR$
+
+Zweck : Erzeugung eines Textzeichens mit einem bestimmten ASCII-Code
+
+Syntax : CHR$ (<INT-Ausdruck>)
+
+Erklärung : Die Funktion liefert das Zeichen mit dem ASCII-Code, den der
+ INT-Ausdruck angibt.
+ Das Zeichen wird als TEXT geliefert.
+ Die Leistung der Funktion ist nur für Werte im Bereich 0 bis 255
+ definiert.
+
+
+Beispiel : 10 PRINT CHR$ (61)
+ Ausgabe: =
+
+Vergleiche : ASC-Funktion (Komplementärfunktion)
+
+
+
+Funktion : CINT
+
+Zweck : Konvertierung in den Datentyp INT
+
+Syntax : CINT (<num. Ausdruck>)
+
+Erklärung : Das Ergebnis des numerischen Ausdrucks wird als INT geliefert.
+ REALs werden gerundet. Werte außerhalb des INT-Bereichs führen
+ zu einem INT-Überlauf.
+
+
+Beispiel : 10 LET a = 17.625
+ 20 PRINT CINT (a); CINT (-a)
+ Ausgabe: 18 -18
+
+Vergleiche : CDBL-, FIX-, INT-Funktionen
+
+
+
+Anweisung : CLS
+
+Zweck : Löschen des Bildschirms
+
+Syntax : CLS
+
+Erklärung : Löscht den Bildschirm und positioniert den Cursor in die linke obere
+ Bildschirmecke (Position 1, 1).
+
+
+Beispiel : 10 CLS
+ 20 PRINT "PROGRAMMBEGINN"
+
+
+
+
+Funktion : COS
+
+Zweck : Berechnung des Cosinus eines Radiantwertes
+
+Syntax : COS (<Winkel>)
+
+Erklärung : <Winkel>: REAL-Ausdruck, der den Winkel in Radiant angibt.
+ Die Funktion liefert den Cosinus des Winkels als REAL.
+
+
+Beispiel : 10 PI = 3.141593
+ 20 PRINT COS (PI/4)
+ Ausgabe: .7071067
+
+Vergleiche : SIN-, TAN-Funktionen
+
+
+
+Funktion : CSRLIN
+
+Zweck : Ermittlung der aktuellen Cursorzeile
+
+Syntax : CSRLIN
+
+Erklärung : Geliefert wird die Nummer der Zeile (als INT), in der sich der Cursor
+ auf dem Bildschirm befindet. Die oberste Zeile hat die Nummer 1.
+
+
+Beispiel : 10 CLS
+ 20 PRINT
+ 30 PRINT CSRLIN
+ Ausgabe: 2
+
+Vergleiche : POS-Funktion
+
+
+
+Funktion : CVD, CVI
+
+Zweck : Decodierung von in Texten verschlüsselten Zahlenwerten
+
+Syntax : CVD (<TEXT-Ausdruck>)
+ CVI (<TEXT-Ausdruck>)
+
+Erklärung : INTs und REALs können (mit MKI$ und MKD$) zu Texten codiert
+ werden.
+ CVD decodiert einen in 8 TEXT-Zeichen codierten REAL-Wert.
+ CVI decodiert einen in 2 TEXT-Zeichen codierten INT-Wert.
+ Es wird beim ersten Zeichen des TEXT-Ausdrucks mit der Dekodie­
+ rung begonnen.
+ Ist der TEXT zu kurz, so wird mit der Meldung "Ueberlauf bei Subs­
+ kription" abgebrochen.
+
+
+Beispiel : 10 zahl$ = MKD$ (3.1415)
+ 20 PRINT CVD (zahl$)
+ Ausgabe: 3.1415
+
+Vergleiche : MKD$-, MKI$- Funktionen (Komplementärfunktionen)
+
+
+
+Anweisung : DATA
+
+Zweck : Ablegen von Konstanten
+
+Syntax : DATA [<string>] [, [<string>]] [...]
+
+Erklärung : <string> : <quoted string> | <unquoted string>
+ <quoted string> : von Anführungszeichen umschlossene Zeichen­
+ folge, die alle Zeichen außer Anführungs­
+ zeichen enthalten darf
+ <unquoted string>: Zeichenfolge, die alle Zeichen außer Komma
+ und Doppelpunkt enthalten darf
+
+ Eine DATA-Anweisung stellt einen Datenspeicher dar, der mit READ
+ (s.d.) ausgelesen werden kann.
+ In der DATA-Anweisung können "quoted strings" oder "unquo­
+ ted strings" angegeben werden. "quoted strings" können später nur
+ noch als Texte ausgelesen werden.
+ Bei "unquoted strings" wird der Datentyp in der DATA-Anweisung
+ dagegen nicht festgelegt. Sie können also als INTs, REALs oder
+ TEXTe ausgelesen werden. Sollen "unquoted strings" Zahlenwerte
+ darstellen, so müssen sie den in BASIC üblichen Schreibregeln für
+ die numerischen Konstanten des jeweiligen Typs genügen. Es sind
+ allerdings zusätzlich noch Vorzeichen erlaubt.
+ Wenn die <strings> nicht angegeben sind, so wird ein "nil-Datum"
+ abgelegt. Dieses bewirkt bei einem READ mit numerischer Variable
+ die Lieferung des Wertes null und bei einem READ mit TEXT-Vari­
+ able die Lieferung eines Leertextes.
+
+ Die DATA-Anweisungen können an beliebiger Stelle im Programm
+ (vor oder hinter den zugehörigen READ-Anweisungen) stehen.
+
+ Alle DATA-Anweisungen eines Programms bilden zusammen einen
+ großen sequentiellen Speicher, auf den mit READ der Reihe nach
+ zugegriffen wird. Intern wird ein sogenannter READ-DATA-Zeiger
+ geführt, der immer auf das nächste auszulesende Element zeigt.
+ Die RESTORE-Anweisung (s.d.) ermöglicht es, den READ-
+ DATA-Zeiger auf das erste Element einer bestimmten DATA-Zeile
+ zu setzen.
+
+
+Beispiel : 2020 PRINT "Stadt", "Land", "Fluß"
+ 2030 READ stadt$, land$, fluß$
+ 2040 PRINT stadt$, land$, fluß$
+ .
+ 5000 DATA Paris, Frankreich, Seine
+
+
+Vergleiche : READ-, RESTORE-Anweisungen
+
+
+
+Funktion : DATE$
+
+Zweck : Abrufen des aktuellen Tagesdatums
+
+Syntax : DATE$
+
+Erklärung : Das Tagesdatum wird als Text in der Form TT.MM.JJ geliefert.
+
+
+Beispiel : 10 PRINT "Heute ist der " + DATE$
+ Ausgabe (z.B.): Heute ist der 28.08.87
+
+Vergleiche : TIME$-Funktion
+
+
+
+Anweisung : DEFDBL, DEFINT, DEFSNG, DEFSTR
+
+Zweck : Definition von Anfangsbuchstaben zur Kennzeichnung bestimmter
+ Variablentypen
+
+Syntax : DEFDBL <Buchstabe1> [ - <Buchstabe2>]
+ #right#[, <Buchstabe3> [ - <Buchstabe4>] ] [...]
+ DEFINT <Buchstabe1> [ - <Buchstabe2>]
+ #right#[, <Buchstabe3> [ - <Buchstabe4>] ] [...]
+ DEFSNG <Buchstabe1> [ - <Buchstabe2>]
+ #right#[, <Buchstabe3> [ - <Buchstabe4>] ] [...]
+ DEFSTR <Buchstabe1> [ - <Buchstabe2>]
+ #right#[, <Buchstabe3> [ - <Buchstabe4>] ] [...]
+
+
+Erklärung : Mit den aufgeführten Anweisungen ist es möglich, bestimmte Buch­
+ staben festzulegen, die, wenn sie als Anfangsbuchstaben eines
+ Variablennamens verwendet werden, der Variablen einen bestimmten
+ Typ zuordnen.
+
+ Die Typfestlegung durch Kennzeichnung mit den Zeichen '!', '\#', '%'
+ oder '$' hat jedoch Vorrang vor den festgelegten Anfangsbuchstaben.
+ Eine genaue Erläuterung, nach welchen Kriterien der BASIC-Compi­
+ ler den Typ einer Variablen feststellt, befindet sich in Kapitel 4.3.
+
+ Die DEFINT-Anweisung legt Anfangsbuchstaben für INT-Variablen
+ fest.
+ Mit der DEFSTR-Anweisung werden Anfangsbuchstaben von
+ TEXT-Variablen festgelegt.
+ Die Anweisungen DEFDBL- und DEFSNG- wurden nur aus Kom­
+ patibilitätsgründen implementiert. Sie werden zwar auf syntaktische
+ Richtigkeit überprüft, aber ansonsten vom Compiler nicht beachtet.
+
+ Werden bei den Anweisungen ganze Buchstabenbereiche angegeben,
+ so muß der Buchstabe vor dem Bindestrich auch im Alphabet vor
+ dem Buchstaben hinter dem Bindestrich stehen.
+
+Hinweis : 1. Die oben beschriebenen Anweisungen gelten stets erst für die im
+ weiteren Text neu benutzten (also neu eingerichteten) Variablen.
+ 2. Die beschriebenen Anweisungen dürfen auch mehr als einmal in
+ einem Programm vorkommen. Die Buchstaben, die in der zweiten
+ und in den folgenden Anweisungen festgelegt werden, werden
+ #on("izusätzlich#off("i zu den in der ersten Anweisung festgelegten Buchsta­
+ ben als Kennzeichen für den betreffenden Datentyp vom Compiler
+ vermerkt.
+ 3. Der Compiler überprüft nicht, ob gleiche Buchstaben als Kennzei­
+ chen für mehr als einen Variablentyp angegeben werden (siehe
+ Kapitel 4.3.). Der Benutzer ist also selbst dafür verantwortlich, daß
+ solche Überschneidungen nicht vorkommen.
+
+
+Beispiel : 10 DEFSTR s - z
+ 20 DEFINT a - h, n
+ 30 DIM tabelle (17) 'TEXT-Feld
+ 40 LET c = 4 'INT-Variable
+ 50 LET nummer = 17 'INT-Variable
+ 60 LET ueberschrift = "Willkommen" 'TEXT-Variable
+ 70 LET reellezahl = 19.563 'REAL-Variable
+ 80 LET aha\# = -1.36E17 'REAL-Variable
+
+
+
+
+Anweisung : DEF FN
+
+Zweck : Definition einer benutzer-definierten Funktion
+
+Syntax : DEF FN<Name> [ ( <Parameter> [, <Parameter>] #right# [...] ) ] = <Funktionsdefinition>
+
+Erklärung : <Name> : Zeichenfolge, die der Syntax für Variablennamen
+ entsprechen muß
+ FN<Name> bilden zusammen den Namen der
+ neuen Funktion
+ <Parameter>: Zeichenfolge, die der Syntax für Variablennamen
+ entsprechen muß
+ <Funktionsdefinition>: Ausdruck, der Konstanten, Variablen, die
+ Parameter der Funktion und Aufrufe
+ anderer Funktionen enthalten darf
+
+ Mit der DEF FN-Anweisung wird eine benutzer-definierte Funktion
+ ("user function") mit dem Funktionsnamen FN<Name> definiert
+ (vergleiche hierzu auch Kapitel 4.5.).
+ Die benutzer-definierte Funktion liefert, genau wie die standard­
+ mäßig eingebauten Funktionen, einen Wert, der sich aus der Auswer­
+ tung des unter <Funktionsdefinition> angegebenen Ausdrucks
+ ergibt.
+ Das letzte Zeichen des Funktionsnamens gibt den Typ des Wertes
+ an, den die Funktion liefert. Soll die Funktion einen TEXT liefern, so
+ muß der Name mit "$" enden. Soll ein INT geliefert werden, muß der
+ Name mit "%" enden. Für alle anderen Endungen wird eine REAL-
+ liefernde Funktion eingetragen.
+ Bezeichnet der Funktionsname eine TEXT-liefernde Funktion, so
+ muß auch die Funktionsdefinition ein Ergebnis vom Typ TEXT liefern.
+ Zwischen INTs und REALs findet eine Typanpassung statt.
+
+ Die Parameter stehen für die beim Aufruf der Funktion übergebenen
+ Argumente.
+ Sie haben nur bei der Definition Gültigkeit. Hierbei 'überdecken' sie
+ (für diese Zeile) eventuell im BASIC-Programm vorhandene gleich­
+ namige Variablen.
+ Die Syntax der Parameternamen entspricht der Syntax der Namen
+ von einfachen Variablen.
+ Jeder Parameter darf in der Parameterliste nur einmal vorkommen.
+
+ In der Definition dürfen auch Aufrufe von zuvor definierten anderen
+ "user functions" erscheinen, nicht aber die zu definierende Funktion
+ selbst (rekursive Definition).
+
+ Die Funktionen sind allein durch ihre Namen gekennzeichnet. Gene­
+ rische Funktionen (gleicher Name, aber unterschiedliche Parameter)
+ können somit nicht definiert werden.
+
+Hinweis : 1. Die Definition einer "user function" muß ihrem ersten Aufruf
+ immer textuell vorausgehen.
+ 2. "user functions" können auch mehrfach definiert werden. Der
+ Compiler gibt in einem solchen Fall aber eine Warnung aus, da
+ die neue Definition nur für die textuell folgenden Aufrufe gültig ist.
+
+
+Beispiel : 10 LET pi = 3.1415927
+ 20 DEF FNkreisflaeche (radius)
+ #right#= 4.0 * pi * radius * radius
+ 1010 PRINT FNkreisflaeche (1.75)
+ Ausgabe: 38.48451
+
+
+
+Anweisung : DIM
+
+Zweck : Dimensionierung eines Feldes
+
+Syntax : DIM <Felddeklaration> [, <Felddeklaration>] [...]
+
+Erklärung : <Felddeklaration>: <Feldvariable> (<INT-Konstante>
+ #right#[, <INT-Konstante>] [...] )
+ <Feldvariable>: Name des Feldes (Syntax wie Name von einfachen
+ Variablen, vgl. 4.3.)
+
+ Mit der DIM-Anweisung wird ein Feld dimensioniert, das heißt die
+ Anzahl seiner Dimensionen sowie der kleinste und größte Index in
+ jeder Dimension werden festgelegt und der Speicherplatz für seine
+ Elemente (siehe 4.3.) wird reserviert.
+
+ Der kleinste Index in allen Dimensionen richtet sich nach der letzten
+ vorausgegangenen OPTION BASE-Anweisung.
+ Geht der Dimensionierung die Anweisung OPTION BASE 0 textuell
+ voraus oder ist keine OPTION BASE-Anweisung vor der Dimensio­
+ nierung vorhanden, so ist der kleinste Index in allen Dimensionen
+ null.
+ Wenn der Dimensionierung aber eine OPTION BASE 1-Anweisung
+ vorausgeht, dann ist der kleinste Index in allen Dimensionen eins.
+
+ Der größte Feldindex wird für jede Dimension durch die in Klammern
+ stehenden INT-Konstanten angegeben. Die Anzahl dieser INT-Kon­
+ stanten bestimmt auch, wie viele Dimensionen das dimensionierte
+ Feld hat.
+
+ Wird auf ein Element einer Feldvariablen zugegriffen, ohne daß die
+ Feldvariable vorher dimensioniert wurde, dann wird das Feld automa­
+ tisch dimensioniert, wobei die Anzahl der Dimensionen anhand der
+ Anzahl der Indizes beim Aufruf ermittelt wird. Der größte Feldindex
+ wird bei dieser automatischen Dimensionierung in jeder Dimension
+ auf zehn gesetzt. Der kleinste Index richtet sich nach den vorausge­
+ gangenen OPTION BASE-Anweisungen (siehe oben).
+
+ Fehlerfälle bei der Dimensionierung:
+ - "Das Feld ist bereits dimensioniert":
+ Das Feld wurde bereits explizit, oder automatisch durch den Zugriff
+ auf ein Feldelement dimensioniert .
+ - "Die Obergrenze muß >= 1 sein":
+ Es wurde versucht, 0 als größten Index in einer Dimension festzu­
+ legen, obwohl mit OPTION BASE der kleinste Index auf eins fest­
+ gelegt wurde.
+
+ Fehlerfälle beim Zugriff auf ein Feldelement:
+ - "Dimensioniert in ... Dimensionen, gefundene Anzahl Indizes ...":
+ Beim Zugriff wurde eine Anzahl von Indizes gefunden, die nicht mit
+ der Anzahl der Dimensionen übereinstimmt (Fehler zur Über­
+ setzungszeit).
+ - "Ueberlauf bei Subskription" oder "Unterlauf bei Subskription":
+ Der Index ist zu groß beziehungsweise zu klein (Fehler zur Lauf­
+ zeit).
+
+
+Beispiel : 10 DIM a% (20, 10), text$ (30, 40)
+ 20 DIM tabelle (5, 7, 25)
+ 30 LET element = matrix (1, 7)
+
+ Zeile 30 führt eine automatische Dimensionierung durch, die einem
+ DIM matrix (10, 10) entspricht.
+
+
+
+Anweisungsbestandteil : ELSE
+
+Siehe IF-Anweisung
+
+
+
+Anweisung : END
+
+Zweck : Beenden der Programmausführung eines BASIC-Programms
+
+Syntax : END
+
+Erklärung : END beendet die Programmausführung des BASIC-Programms ohne
+ eine Meldung (im Gegensatz zu STOP, s.d.).
+ END-Anweisungen dürfen im Programm an beliebiger Stelle stehen,
+ und es darf auch mehr als eine END-Anweisung in einem
+ Programm vorkommen.
+ Der Compiler übersetzt ein Programm auch nach Erreichen einer
+ END-Anweisung weiter.
+ Nach der letzten Anweisung eines Programms muß kein END stehen.
+
+
+Beispiel : 2020 PRINT "Das war's !"
+ 2030 REM Hiernach hört's auf
+ 2040 END
+
+
+Vergleiche : STOP-Anweisung
+
+
+
+Anweisungsbestandteil : EOF
+
+Siehe INPUT-Anweisung
+
+
+
+
+Operator : EQV
+
+Siehe Kapitel 4.4. (Operatoren)
+
+
+
+Funktion : ERL
+
+Zweck : Ermittlung der letzten Fehlerzeile
+
+Syntax : ERL
+
+Erklärung : Die Nummer der Zeile, in der der letzte Fehler auftrat, wird als INT
+ geliefert.
+
+Hinweis : ERL ist realisiert durch Aufruf der Prozedur 'errorline' des Betriebs­
+ systems.
+ Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­
+ gung steht, ist diese Funktion nicht im üblichen BASIC-Sinne
+ brauchbar.
+
+Vergleiche : ERM$, ERR-Funktionen, ERROR-Anweisung
+
+
+
+Funktion : ERM$
+
+Zweck : Ermittlung der letzten Fehlermeldung
+
+Syntax : ERM$
+
+Erklärung : Die letzte Fehlermeldung wird als TEXT geliefert.
+
+Hinweis : ERM$ ist realisiert durch Aufruf der Prozedur 'errormessage' des
+ Betriebssystems.
+ Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­
+ gung steht, ist diese Funktion nicht im üblichen BASIC-Sinne
+ brauchbar.
+
+Vergleiche : ERL-, ERR-Funktionen, ERROR-Anweisung
+
+
+
+Funktion : ERR
+
+Zweck : Ermittlung des letzten Fehlercodes
+
+Syntax : ERR
+
+Erklärung : Der Code des letzten aufgetretenen Fehlers wird als INT geliefert.
+
+Hinweis : ERR ist realisiert durch Aufruf der Prozedur 'errorcode' des Betriebs­
+ systems.
+ Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­
+ gung steht, ist diese Funktion nicht im üblichen BASIC-Sinne
+ brauchbar.
+
+Vergleiche : ERL-, ERM$-Funktionen, ERROR-Anweisung
+
+
+
+Anweisung : ERROR
+
+Zweck : Auslösen eines Fehlers mit bestimmtem Fehlercode
+
+Syntax : ERROR <INT-Ausdruck>
+
+Erklärung : Es wird ein Fehler mit dem durch den INT-Ausdruck bestimmten
+ Fehlercode ausgelöst.
+
+Hinweis : ERROR ist realisiert durch Aufruf der Prozedur 'errorstop' des Be­
+ triebssystems.
+ Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­
+ gung steht, ist diese Anweisung nicht im üblichen BASIC-Sinne
+ brauchbar.
+
+Vergleiche : ERL-, ERM$-, ERR-Funktionen
+
+
+
+Funktion : EXP
+
+Zweck : Berechnung einer Potenz der Eulerschen Zahl
+
+Syntax : EXP (<REAL-Ausdruck>)
+
+Erklärung : Die Funktion liefert e (die Basis des natürlichen Logarithmus) poten­
+ ziert mit dem Wert des REAL-Ausdrucks.
+ Bei zu großen Werten kommt es zum Fehler 'REAL-Ueberlauf'.
+ Das Ergebnis der Funktion wird als REAL geliefert.
+
+
+Beispiel : 10 PRINT EXP (10.0)
+ Ausgabe: 22026.47
+
+Vergleiche : LOG-Funktion (Komplementärfunktion)
+
+
+
+Funktion : FIX
+
+Zweck : Ermittlung der Vorkommastellen einer REAL-Zahl
+
+Syntax : FIX (<REAL-Ausdruck>)
+
+Erklärung : Die Funktion schneidet die Nachkommastellen ab und liefert nur die
+ Vorkommastellen des REAL-Ausdrucks.
+ Die Vorkommastellen werden ebenfalls als REALs geliefert.
+
+
+Beispiel : 10 zahl = 1.2345E2
+ 20 PRINT FIX (zahl)
+ Ausgabe: 123
+
+Vergleiche : CINT-, INT-Funktionen
+
+
+
+Anweisung : FOR
+
+Zweck : Beginn einer Zählschleife
+
+Syntax : FOR <num. Variable> = <Anfangswert> #ib(3)#TO#ie(3)# <Endwert>
+ #right#[ #ib(3)#STEP#ie(3)# <Schrittweite> ]
+ <Schleifenrumpf>
+
+
+Erklärung : <num. Variable> : INT- oder REAL-Variable
+ <Anfangswert> : numerischer Ausdruck
+ <Endwert> : numerischer Ausdruck
+ <Schrittweite> : numerischer Ausdruck
+ <Schleifenrumpf>: Folge von Programmzeilen
+
+ Die FOR-Anweisung erlaubt die komfortable Programmierung von
+ automatischen Zählschleifen (sogenannten FOR-NEXT-Schleifen).
+ Gelangt das Programm während der Ausführung an eine FOR-An­
+ weisung, so werden zunächst die Ausdrücke <Anfangswert>,
+ <Endwert> sowie gegebenenfalls <Schrittweite> ausgewertet. Der
+ Anfangswert wird dann der Variablen zugewiesen.
+ Wenn der Wert der Variablen größer ist als der Endwert (bzw. kleiner
+ als der Endwert bei negativer Schrittweite), dann wird das Programm
+ mit der nach dem korrespondierenden NEXT (s.d.) folgenden
+ Anweisung fortgesetzt.
+ Ist dies jedoch nicht der Fall, werden die Anweisungen des <Schlei­
+ fenrumpfs> ausgeführt. Erreicht das Programm nun die zum FOR
+ gehörige NEXT-Anweisung (gleiche Variable), so wird der Wert der
+ Variablen um die Schrittweite erhöht beziehungsweise erniedrigt (je
+ nach Vorzeichen), und wieder an den Anfang der Schleife verzweigt.
+ Hier findet dann wieder der Vergleich des Variableninhalts mit dem
+ Endwert statt (siehe oben).
+
+ Die Laufvariable darf innerhalb der Schleife in Ausdrücken vorkom­
+ men. Sie darf sogar verändert werden (, was aber zu unübersichtli­
+ chen Effekten führen kann). Auch eine Schachtelung mehrerer
+ Schleifen mit der gleichen Laufvariable ist syntaktisch möglich, sollte
+ aber #on("iunter allen Umständen#off("i vermieden werden.
+
+ FOR-NEXT-Schleifen dürfen (auch mit WHILE-WEND-Schleifen,
+ s.d.) geschachtelt werden. Überschneidungen von FOR-NEXT-
+ Schleifen und WHILE-WEND-Schleifen sind aber nicht zulässig.
+
+
+Beispiel : 10 DIM name$ (5)
+ 20 FOR i = 1 TO 5
+ 30 PRINT "Bitte geben Sie den " + STR$ (i)
+ #right#+ ". Namen ein:";
+ 40 INPUT name$ (i)
+ 50 NEXT i
+
+
+ Es werden die fünf Elemente des Feldes 'name$' eingelesen.
+
+Vergleiche : NEXT-, WHILE-, IF-Anweisungen
+
+
+
+Funktion : FRE
+
+Zweck : Ermittlung des verfügbaren Speicherplatzes
+
+Syntax : FRE (<num. Ausdruck>)
+ FRE (<TEXT-Ausdruck>)
+
+Erklärung : Die Funktion liefert die Anzahl der freien Bytes.
+ FRE veranlaßt außerdem ein 'collect heap garbage' (EUMEL-
+ Systemprozedur).
+
+ Das Ergebnis der Funktion wird als REAL geliefert.
+ Der Argument-Ausdruck ist ein Dummy-Argument (hat keinen
+ Einfluß auf den gelieferten Wert).
+
+Hinweis : Bei der EUMEL M+ Version wird ein korrektes Ergebnis geliefert
+ (vgl.'storage info').
+
+
+Beispiel : 10 PRINT FRE (0)
+ Ausgabe (z.B.): 5324800
+
+
+
+Anweisungsbestandteil : GO
+
+Siehe GOSUB und GOTO
+
+
+
+Anweisung : GOSUB
+
+Zweck : Unterprogramm-Aufruf
+
+Syntax : GOSUB <Zeilennummer>
+
+Erklärung : <Zeilennummer>: INT-Konstante
+ Statt GOSUB darf auch GO #ib(3)#SUB#ie(3)# geschrieben werden.
+
+ Die Programmausführung wird in der Zeile mit der angegebenen
+ Zeilennummer fortgesetzt. Die Zeile mit der Zeilennummer muß im
+ Programm existieren.
+ Wird im weiteren Programmablauf die Anweisung RETURN gefunden,
+ so wird hinter dem letzten abgearbeiteten GOSUB die Programm­
+ ausführung fortgesetzt.
+ GOSUB dient zum Aufruf von #on("iUnterprogrammen#off("i, die von mehr als
+ einer Stelle im Programm (und auch in anderen Unterprogrammen)
+ aufgerufen werden können.
+
+Hinweis : Es wird empfohlen, Unterprogramme im Programm deutlich als solche
+ zu kennzeichnen und (durch END, STOP oder GOTO) sicherzustel­
+ len, daß nur mit GOSUB zu ihnen verzweigt wird, da es sonst leicht
+ zu der (Laufzeit-) Fehlermeldung "RETURN ohne GOSUB" kommen
+ kann.
+
+
+Beispiel : 140 GOSUB 10000 'Zeige Uhrzeit
+ .
+ .
+ 370 GOSUB 10000 'Zeige Uhrzeit
+ 9990 END
+ 10000 REM Unterprogramm Zeige Uhrzeit
+ 10010 PRINT "Es ist " + TIME$ + " Uhr"
+ 10020 RETURN
+
+
+Vergleiche : RETURN-, ON-, GOTO- Anweisungen
+
+
+
+Anweisung : GOTO
+
+Zweck : Sprung zu einer angegebenen Zeile
+
+Syntax : GOTO <Zeilennummer>
+
+Erklärung : <Zeilennummer>: INT-Konstante
+ Statt GOTO darf auch GO #ib(3)#TO#ie(3)# geschrieben werden.
+
+ Die Programmausführung wird in der Zeile mit der angegebenen
+ Zeilennummer fortgesetzt. Die Zeile mit der Zeilennummer muß im
+ Programm existieren.
+
+
+Beispiel : 10 INPUT "Monat (1-12)", monat%
+ 20 IF monat% < 1 OR monat% > 12 THEN GOTO 10
+
+
+Vergleiche : ON-, IF-, GOSUB- Anweisungen
+
+
+
+Funktion : HEX$
+
+Zweck : Erzeugung der hexadezimalen Darstellung einer Zahl als Text
+
+Syntax : HEX$ (<INT-Ausdruck>)
+
+Erklärung : Die Funktion liefert die hexadezimale (Zweierkomplement-) Darstel­
+ lung der Zahl, die sich aus dem INT-Ausdruck ergibt.
+
+
+Beispiel : 10 PRINT HEX$ (10000)
+ Ausgabe: 2710
+
+Vergleiche : OCT$-Funktion
+
+
+
+Anweisung : IF
+
+Zweck : Sprung zu einer angegebenen Zeile
+
+Syntax : IF <Bedingung>
+ #right#[,] #ib(3)#THEN#ie(3)# <Anweisung(en)>|<Zeilennummer>
+ #right#[ [,] #ib(3)#ELSE#ie(3)# <Anweisung(en)>|<Zeilennummer>]
+ IF <Bedingung> [,] GOTO <Zeilennummer>
+ #right#[ [,] ELSE <Anweisung(en)>|<Zeilennummer>]
+
+Erklärung : <Bedingung> : numerischer Ausdruck
+ <Anweisung(en)>: Eine oder mehrere BASIC-Anweisungen, wobei
+ mehrere wie gewohnt durch ':' zu trennen sind
+ <Zeilennummer> : INT-Konstante
+ Statt GOTO darf auch GO TO geschrieben werden.
+
+ Anhand der Bedingung wird entschieden, ob die Abarbeitung des
+ Programms mit dem THEN- oder ELSE-Zweig fortgesetzt werden
+ soll. Mit dem THEN-Zweig wird das Programm fortgesetzt, wenn die
+ Bedingung erfüllt ist (, d.h. der numerische Ausdruck ungleich null
+ ist). Im anderen Fall (Bedingung nicht erfüllt, numerischer Ausdruck
+ gleich null) wird das Programm mit dem ELSE-Teil fortgesetzt. Ist
+ kein ELSE-Teil angegeben, so wird die Abarbeitung des
+ Programmes in der folgenden #on("iZeile#off("i (nicht nach ':') fortgesetzt.
+
+ Sind statt Anweisungen Zeilennummern nach THEN oder ELSE
+ angegeben, so entspricht dies einem GOTO (s.d.) zu diesen Zeilen­
+ nummern.
+
+
+Hinweis : Auch eine IF-Anweisung muß in #on("ieiner#off("i Programmzeile stehen.
+
+
+Beispiel : 10 IF a >= b THEN IF a > b THEN
+ #right#PRINT "a größer b" ELSE PRINT "a gleich b"
+ #right#ELSE PRINT "a kleiner b"
+
+
+ Das Beispiel zeigt, daß bei geschachtelten IF-Anweisungen die
+ ELSE-Teile immer auf das letzte vorhergehende IF bezogen werden,
+ für das noch kein ELSE-Teil gefunden wurde.
+
+
+
+Vergleiche : GOTO-, GOSUB-, ON-Anweisungen
+
+
+
+Operator : IMP
+
+Siehe Kapitel 4.4. (Operatoren)
+
+
+
+Funktion : INKEY$
+
+Zweck : Holen eines Zeichens von der Tastatur
+
+Syntax : INKEY$
+
+Erklärung : Die Funktion liefert ein Textzeichen aus dem Tastaturzeichenpuffer.
+ Wurde kein Zeichen eingegeben, so wird ein Leertext (niltext) gelie­
+ fert.
+ Die gelieferten Zeichen erscheinen nicht auf dem Bildschirm.
+
+
+Beispiel : 10 REM Schreibmaschine
+ 20 LET a$ = INKEY$
+ 30 IF ASC (a$) = 27 THEN STOP
+ 40 PRINT a$;
+ 50 GOTO 20
+
+
+ Die eingegebenen Zeichen werden ausgegeben. Abbruch mit ESC.
+
+Vergleiche : INPUT$-Funktion, INPUT-Anweisung
+
+
+
+Anweisung : INPUT
+
+Zweck : Einlesen von Daten von der Tastatur
+
+Syntax : INPUT [;] [<Eingabeaufforderung> ,|; ][ #ib(3)#EOF#ie(3)#
+ <Zeilennummer>]
+ #right#<Variable> [, <Variable> ] [...]
+
+Erklärung : <Eingabeaufforderung>: TEXT-Konstante
+ <Zeilennummer>: INT-Konstante
+ <Variable>: Variable, der der eingelesene Werte
+ zugewiesen werden soll
+
+ Mit der INPUT-Anweisung werden Daten zur Laufzeit des
+ Programms von der Tastatur in Variablen eingelesen.
+
+ Folgt dem INPUT-Statement ein Semikolon, so wird nach
+ Beendigung der Eingabe kein Zeilenwechsel vorgenommen.
+
+ Fehlt die <Eingabeaufforderung>, so wird "? " als Eingabe­
+ aufforderung ausgegeben.
+ Folgt der ein Semikolon, so wird "? " noch zusätzlich ausge­
+ geben. Bei einem Komma wird dieser Standard-Prompt unter­
+ drückt.
+
+ Folgt der <Eingabeaufforderung> die Zeichenfolge 'EOF', so wird
+ bei Eingabe eines Leertextes zu der nach 'EOF' angegebenen
+ Zeilennumer verzweigt.
+
+ Sollen mehrere Variablen eingelesen werden, so muß der Benutzer
+ auch entsprechend viele Daten (durch Kommata getrennt) zur Verfü­
+ gung stellen.
+
+ Wird nichts eingegeben beziehungsweise nur die richtige Anzahl von
+ Kommata, so wird den entsprechenden Variablen 0, 0.0 bzw. 'niltext'
+ zugewiesen.
+
+ Bei der Eingabe für eine Textvariable können alle Zeichen (außer
+ Steuerzeichen) eingegeben werden. Beginnt eine Eingabe mit dem
+ Anführungszeichen oder endet sie damit, dann muß sie auch damit
+ enden beziehungsweise beginnen. Diese beiden Anführungszeichen
+ werden nicht mit zugewiesen. Innerhalb dieser Texteingabe dürfen
+ Anführungszeichen stehen, aber keine Kommata.
+
+ Eingaben für numerische Variablen müssen in der für Konstanten
+ üblichen Schreibweise erfolgen. Vorzeichen sind allerdings zusätzlich
+ erlaubt.
+
+ Vor Zuweisung der eingegebenen Werte an die Variablen werden
+ Anzahl und Typ(en) und die Anzahl überprüft.
+ Dabei können folgende Fehlerfälle auftreten:
+ - "falscher Typ":
+ Es wurde ein Text statt einer Zahl eingegeben, es wurde ein REAL
+ statt eines INTs eingegeben oder eine Texteingabe ist fehlerhaft.
+ - "zu wenig Daten"
+ - "zu viele Daten"
+ - "Überlauf":
+ Es wurde eine zu große (oder zu kleine) Zahl eingegeben.
+
+ Kommt es zu einem Fehler, dann wird nach der Meldung "?Eingabe
+ wiederholen ! (<Fehlerbeschreibung>)" die Eingabe zum Editieren
+ angeboten.
+
+Hinweis : Bei Eingabe von 'ESC k' kann die letzte Eingabezeile zum Editieren
+ zurückgeholt werden.
+
+ Die Eingabe kann mit der Systemprozedur 'sysin' aus einer Datei
+ erfolgen. Aus der Eingabedatei wird für jedes INPUT-Statement eine
+ Zeile eingelesen. Die Ausgabe der Eingabeaufforderung und der
+ Zeilenwechsel nach der Eingabe werden unterdrückt. Sind die
+ Eingabedaten fehlerhaft, so wird das Programm mit 'errorstop'
+ abgebrochen.
+
+ Wird die Ausgabe mit 'sysout' umgeleitet, so werden die Eingabe­
+ aufforderung, die Eingabezeichenfolge und der Zeilenwechsel nach
+ der Eingabe auf den Bildschirm und in die Ausgabedatei ausgegeben,
+ auch dann, wenn der Text der Eingabe aus einer Datei eingelesen
+ wurde.
+
+
+Beispiel : 1990 INPUT "Name, Vorname, Alter";
+ #right#name$, vorname$, alter%
+
+
+Vergleiche : INKEY$-, INPUT$-Funktionen
+
+
+
+Funktion : INPUT$
+
+Zweck : Holen einer Zeichenfolge von der Tastatur
+
+Syntax : INPUT$ (<Anzahl Zeichen>)
+
+Erklärung : <Anzahl Zeichen>: INT-Ausdruck
+
+ Die Funktion liefert eine Folge von <Anzahl Zeichen> Textzeichen
+ aus dem Tastaturzeichenpuffer. Enthält der Puffer nicht alle ge­
+ wünschten Zeichen, so wird auf weitere Zeichen von der Tastatur
+ gewartet.
+ Die gelieferten Zeichen erscheinen nicht auf dem Bildschirm.
+
+
+Beispiel : 10 PRINT "Bitte drei Zeichen eingeben !"
+ 20 LET a$ = INPUT$ (3)
+ 30 PRINT "Danke schön !"
+
+
+Vergleiche : INKEY$-Funktion, INPUT-Anweisung
+
+
+
+Funktion : INSTR
+
+Zweck : Suchen einer Zeichenfolge in einer anderen
+
+Syntax : INSTR ( [<Startposition>,] <TEXT-Ausdruck1>,
+ #right#<TEXT-Ausdruck 2>)
+
+Erklärung : <Startposition>: INT-Ausdruck
+
+ Die Funktion liefert die Position, ab der der TEXT-Ausdruck 2 das
+ erste Mal im TEXT-Ausdruck 1 vorkommt.
+ Die Position wird als INT geliefert.
+
+
+Beispiel : 10 LET a$ = "hallihallo"
+ 20 LET b$ = "all"
+ 30 PRINT INSTR (a$, b$); INSTR (5, a$, b$)
+ Ausgabe: 2 7
+
+
+
+Funktion : INT
+
+Zweck : Ermittlung der nächstkleineren ganzen Zahl
+
+Syntax : INT (<REAL-Ausdruck>)
+
+Erklärung : Die Funktion liefert die größte ganze Zahl, für die gilt:
+ n kleiner gleich <REAL-Ausdruck>.
+ Bei positiven Werten bedeutet das, daß die Nachkommastellen abge­
+ schnitten werden.
+ Das Ergebnis wird als REAL geliefert.
+
+
+Beispiel : 10 PRINT INT (11.74); INT (-11.74)
+ Ausgabe: 11 -12
+
+Vergleiche : CINT-, FIX-Funktionen
+
+
+
+Anweisung : KILL
+
+Zweck : Löschen einer Datei in der Task
+
+Syntax : KILL <Dateiname>
+
+Erklärung : <Dateiname>: TEXT-Ausdruck
+ Die Datei <Dateiname> wird (ohne Nachfrage) gelöscht.
+
+
+Beispiel : 2110 KILL "Scratchdatei"
+
+
+
+
+Funktion : LEFT$
+
+Zweck : Erzeugung eines Teiltextes aus einem anderen Text
+
+Syntax : LEFT$ (<TEXT-Ausdruck>, <Anzahl Zeichen>)
+
+Erklärung : <Anzahl Zeichen>: INT-Ausdruck
+
+ Die Funktion liefert die ersten <Anzahl Zeichen> Textzeichen des
+ TEXT-Ausdrucks.
+
+
+Beispiel : 10 LET a$ = "hallihallo"
+ 20 PRINT LEFT$ (a$, 4)
+ Ausgabe: hall
+
+Vergleiche : MID$-, RIGHT$-Funktionen, LSET-, MID$-, RSET-
+ Anweisungen
+
+
+
+Funktion : LEN
+
+Zweck : Ermittlung der Länge eines Textes
+
+Syntax : LEN (<TEXT-Ausdruck>)
+
+Erklärung : Die Funktion liefert die Anzahl der im TEXT-Ausdruck enthaltenen
+ Zeichen (also die Länge des Textes). Die Länge wird als INT
+ geliefert.
+ Ein Leertext (niltext, "") hat die Länge null.
+
+
+Beispiel : 10 LET a$ = "hallihallo"
+ 20 PRINT LEN (a$)
+ Ausgabe: 10
+
+
+
+Anweisung : LET
+
+Zweck : Zuweisung eines Wertes an eine Variable
+
+Syntax : [LET] <Variable> = <Ausdruck>
+
+Erklärung : Die LET-Anweisung ermöglicht das Zuweisen von Werten an Variab­
+ len (dazu gehören auch die Elemente von Feldern).
+
+ Das Schlüsselwort LET ist optional, d.h. eine Zuweisung wird auch
+ ohne dieses Schlüsselwort erkannt.
+
+ #on("iZuweisung an TEXT-Variablen:#off("i
+ LET <TEXT-Variable> = <TEXT-Ausdruck> oder <num.
+ Konstante>
+ Die numerische Konstante wird automatisch in einen TEXT umge­
+ wandelt (vgl. STR$-Funktion)
+
+ #on("iZuweisung an INT-Variablen:#off("i
+ LET <INT-Variable> = <num. Ausdruck>
+ Ist der numerische Ausdruck ein REAL-Ausdruck, so wird automa­
+ tisch nach INT konvertiert (vgl. CINT-Funktion).
+
+ #on("iZuweisung an REAL-Variablen:#off("i
+ LET <REAL-Variable> = <num. Ausdruck>
+ Ist der numerische Ausdruck ein INT-Ausdruck, so wird automatisch
+ nach REAL konvertiert (vgl. CDBL-Funktion).
+
+
+Beispiel : 10 LET t$ = "murmel marmel"
+ 20 LET t$ = 1245.3 'wie "1245.3"
+ 30 LET i% = 852
+ 40 LET i% = 12.73 'aufgerundet: 13
+ 50 LET r = 564 'wie 564.
+ 60 LET r = 157.36
+
+
+
+
+Anweisung : LINE INPUT
+
+Zweck : Einlesen einer Eingabe von der Tastatur in eine TEXT-Variable
+
+Syntax : LINE INPUT [;] [<Eingabeaufforderung>;]
+ #right#<TEXT-Variable>
+
+Erklärung : Die LINE INPUT-Anweisung ermöglicht das Einlesen von Eingaben
+ in TEXT-Variablen, aber im Gegensatz zu INPUT ohne Beachtung
+ von Trennzeichen (z.B. ",").
+
+ Steht direkt nach LINE INPUT ein Semikolon, so wird nach Beendi­
+ gung der Eingabe der Zeilenwechsel unterdrückt.
+
+ Der eingegebene Text wird (bis auf das CR-Zeichen) der TEXT-
+ Variablen zugewiesen.
+
+
+Beispiel : 2110 LINE INPUT "Name: ";name$
+
+
+ Der Benutzer könnte nun auch folgendes eingeben:
+ Neumann, Alfred E.
+
+Vergleiche : INPUT-Anweisung
+
+
+
+Funktion : LOG
+
+Zweck : Berechnung des natürlichen Logarithmus einer Zahl
+
+Syntax : LOG (<REAL-Ausdruck>)
+
+Erklärung : Die Funktion liefert den natürlichen Logarithmus des Wertes des
+ REAL-Ausdrucks.
+ Bei nicht-positiven Werten kommt es zu einem Fehler in der
+ EUMEL-Prozedur 'log2'.
+ Das Ergebnis der Funktion wird als REAL geliefert.
+
+
+Beispiel : 10 PRINT LOG (10.0)
+ Ausgabe: 2.302585
+
+Vergleiche : EXP-Funktion (Komplementärfunktion)
+
+
+
+Funktion : LPOS
+
+Zweck : Ermittlung der aktuellen Druckspalte
+
+Syntax : LPOS (<num. Ausdruck>)
+
+Erklärung : Geliefert wird die Nummer der Spalte (als INT), in die das nächste
+ nächste Zeichen mit LPRINT ausgegeben wird. Die Spalte ganz links
+ hat die Nummer 1.
+ Der Argument-Ausdruck ist ein Dummy-Argument (hat keinen
+ Einfluß auf den gelieferten Wert).
+
+
+Beispiel : 3010 IF LPOS (0) > 65 THEN LPRINT
+ 3020 LPRINT name$
+
+
+ Falls die Druckposition hinter Spalte 65 liegt, wird eine neue Druck­
+ zeile begonnen.
+
+Vergleiche : LPRINT-Anweisung, TAB-, POS-Funktion
+
+
+
+Anweisung : LPRINT
+
+Zweck : Ausgabe in eine Druckdatei
+
+Syntax : LPRINT [#ib(3)#USING#ie(3)# <Format> ;]
+ #right#[ #ib(3)#TAB#ie(3)# (<Spalte>) | , | ; | <Ausdruck> ] [...]
+
+Erklärung : <Format> : TEXT-Ausdruck für USING (vgl. PRINT)
+ <Spalte> : INT-Ausdruck (vgl. PRINT)
+ <Ausdruck>: TEXT-Ausdruck oder numerischer Ausdruck
+
+ Die LPRINT-Anweisung arbeitet wie PRINT (siehe dort), mit dem
+ Unterschied, daß LPRINT die Zeichen nicht auf den Bildschirm, son­
+ dern in eine Datei mit dem Namen "BASIC LPRINT OUTPUT"
+ ausgibt. Diese Datei wird automatisch eingerichtet, falls sie noch
+ nicht existiert. Ist sie schon vorhanden, so werden die auszugeben­
+ den Zeichen am Ende der Datei angefügt.
+ Nach oder bei Ablauf des Programms kann die Datei (evtl. nach
+ vorheriger Aufbereitung durch Textverarbeitungsprogramme) mit
+ 'print', wie im EUMEL-System üblich, an den Drucker geschickt
+ werden. Der Benutzer ist selbst dafür verantwortlich, daß er die
+ Druckdatei, sofern die Daten nicht mehr benötigt werden, vor einem
+ neuen Programmlauf leert oder löscht. Versäumt er dies, so bleiben
+ die alten Daten in der Druckdatei, und die neuen Ausgaben werden
+ hinten angefügt. Das Löschen der Druckdatei kann zum Beispiel
+ durch das BASIC-Programm mit der KILL-Anweisung erreicht
+ werden.
+
+ Die Art der Ausgabe und die Syntax ist sonst analog zur PRINT-
+ Anweisung (siehe Erläuterungen dort).
+
+
+Beispiel : 2110 LPRINT "Dieser Text geht in die Druckdatei"
+ 2120 LPRINT TAB (12); "Datum: " DATE$
+ 2130 LPRINT 1, 2, 3
+
+
+Vergleiche : PRINT-Anweisung, LPOS-Funktion
+
+
+
+Anweisung : LSET
+
+Zweck : Ersetzen von Zeichen eines Textes von links her
+
+Syntax : LSET <TEXT-Variable> = <TEXT-Ausdruck>
+
+Erklärung : Das Ergebnis des TEXT-Ausdrucks wird, links beginnend, in der
+ TEXT-Variablen eingesetzt. Es werden höchstens so viele Zeichen
+ ersetzt, wie bisher schon in der Variablen vorhanden waren, das heißt
+ die Länge des Textes in der Variablen ändert sich nicht.
+
+
+Beispiel : 210 LET a$ = "12345"
+ 220 LSET a$ = "ABCDEFG"
+ 230 PRINT a$,
+ 240 LSET a$ = "abc"
+ 250 PRINT a$
+ Ausgabe: ABCDE abcDE
+
+Vergleiche : MID$-, RSET-Anweisungen, LEFT$-, MID$-, RIGHT$-Funk­
+ tionen
+
+
+
+Anweisung : MID$
+
+Zweck : Ersetzen von Zeichen innnerhalb eines Textes
+
+Syntax : MID$ (<TEXT-Variable>, <Startposition>
+ #right#[, <Anzahl Zeichen>] ) = <TEXT-Ausdruck>
+
+Erklärung : <Startposition> : INT-Ausdruck
+ <Anzahl Zeichen>: INT-Ausdruck
+
+ Das Ergebnis des TEXT-Ausdrucks wird, bei <Startposition>
+ beginnend, in der TEXT-Variablen eingesetzt. Es werden höch­
+ stens LEN <TEXT-Variable> Textzeichen ersetzt. Ist keine
+ <Anzahl Zeichen> angegeben, so werden so viele Zeichen des
+ TEXT-Ausdrucks wie möglich in der TEXT-Variablen eingetragen.
+ Außerdem gilt: Es wird nicht über das bisherige Ende des Variablen­
+ inhalts ersetzt, das heißt die Länge des Textes in der Variablen
+ ändert sich nicht.
+
+
+Beispiel : 210 LET a$ = "12345"
+ 220 MID$ (a$, 3) = "ABCDEFG"
+ 230 PRINT a$,
+ 240 MID$ (a$, 2, 1) = "abc"
+ 250 PRINT a$
+ Ausgabe: 12ABC 1aABC
+
+Vergleiche : LEFT$-, MID$-, RIGHT$-Funktionen, LSET-, RSET-
+ Anweisungen
+
+
+
+Funktion : MID$
+
+Zweck : Erzeugung eines Teiltextes aus einem anderen Text
+
+Syntax : MID$ (<TEXT-Ausdruck>,
+ #right#<Startposition> [, <Anzahl Zeichen>])
+
+Erklärung : <Startposition> : INT-Ausdruck
+ <Anzahl Zeichen>: INT-Ausdruck
+
+ Die Funktion liefert höchstens <Anzahl Zeichen> Textzeichen des
+ TEXT-Ausdrucks von Position <Startposition> an.
+ Wird <Anzahl Zeichen> nicht angegeben, so werden alle Zeichen
+ ab Startposition geliefert.
+ Werden rechts von <Startposition> keine Zeichen mehr gefunden
+ oder ist <Anzahl Zeichen> gleich null, so wird ein Leertext geliefert.
+
+
+Beispiel : 10 LET a$ = "hallihallo"
+ 20 PRINT MID$ (a$, 4, 4),
+ 30 PRINT MID$ (a$, 6)
+ Ausgabe: liha hallo
+
+Vergleiche : LEFT$-, RIGHT$-Funktionen, LSET-, MID$-, RSET-
+ Anweisungen
+
+
+
+Funktion : MKD$, MKI$
+
+Zweck : Codierung von Zahlenwerten in Texte
+
+Syntax : MKD$ (<REAL-Ausdruck>)
+ MKI$ (<INT-Ausdruck>)
+
+Erklärung : Mit MKD$ und MKI$ können INTs und REALs zu Texten codiert
+ werden.
+
+ Die Funktion MKD$ liefert einen 8 Zeichen langen TEXT, der den
+ Wert des REAL-Ausdrucks codiert enthält.
+ Vergleichbar arbeitet MKI$, das einen 2 Zeichen langen TEXT liefert,
+ der den Wert des INT-Ausdrucks darstellt.
+
+ Mit MKD$ und MKI$ codierte Werte können mit CVD und CVI (s.d.)
+ wieder decodiert werden.
+
+
+Beispiel : 10 zahl$ = MKD$ (3.1415)
+ 20 PRINT CVD (zahl$)
+ Ausgabe: 3.1415
+
+Vergleiche : CVD-, CVI-Funktionen
+
+
+
+Operator : MOD
+
+Siehe Kapitel 4.4. (Operatoren)
+
+
+
+Anweisung : NAME
+
+Zweck : Umbenennen einer Datei
+
+Syntax : NAME <alter Name> AS <neuer Name>
+
+Erklärung : <alter Name>: TEXT-Ausdruck
+ <alter Name>: TEXT-Ausdruck
+
+ NAME benennt die Datei <alter Name> in <neuer Name> um.
+
+
+Beispiel : 10 NAME "Käufer" AS "Kunden"
+
+
+
+
+Anweisung : NEXT
+
+Zweck : Markierung des Endes einer FOR-Schleife
+
+Syntax : NEXT [<num. Variable>] [, <num. Variable>] [...]
+
+Erklärung : NEXT markiert das Ende einer FOR-Schleife (vergleiche FOR-
+ Anweisung).
+
+ Wird keine Variable angegeben, so bezieht sich das NEXT auf das
+ letzte textuell vorhergehende FOR.
+ Wird eine Laufvariable angegeben, so muß sie mit der im letzten
+ FOR verwendeten Laufvariable übereinstimmen.
+ Werden mehrere Variablen angegeben, so werden durch die
+ NEXT-Anweisung mehrere FOR-Schleifen abgeschlossen.
+ Beachten Sie, daß FOR-Schleifen sich nicht überschneiden dürfen,
+ sondern nur Schachtelungen zulässig sind. Es kommt daher auf die
+ Reihenfolge der Variablen bei den NEXT-Anweisungen an. Die
+ letzte (innerste) FOR-Schleife muß als erste wieder mit dem zuge­
+ hörigen NEXT abgeschlossen werden.
+
+Vergleiche : FOR-, WHILE-Anweisungen
+
+
+
+Operator : NOT
+
+Siehe Kapitel 4.4. (Operatoren)
+
+
+
+Funktion : OCT$
+
+Zweck : Erzeugung der oktalen Darstellung einer Zahl als Text
+
+Syntax : OCT$ (<INT-Ausdruck>)
+
+Erklärung : Die Funktion liefert die oktale (Zweierkomplement-) Darstellung der
+ Zahl, die sich aus dem INT-Ausdruck ergibt.
+
+
+Beispiel : 10 PRINT OCT$ (10000)
+ Ausgabe: 23420
+
+Vergleiche : OCT$-Funktion
+
+
+
+Anweisung : ON
+
+Zweck : Ausführung eines "berechneten" Sprungs oder Unterprogramm-
+ Aufrufs
+
+Syntax : ON <Sprungziel Nr.> GOTO | GOSUB
+ #right#<Zeilennummer> [, <Zeilennummer>] [...]
+
+Erklärung : <Sprungziel Nr.>: INT-Ausdruck
+ <Zeilennummer> : INT-Konstante
+
+ ON ermöglicht die Verzweigung des Programms an eine von mehre­
+ ren Stellen abhängig vom Ergebnis eines INT-Ausdrucks.
+ Gelangt das Programm an eine ON-Anweisung, dann wird zunächst
+ der Wert des INT-Ausdrucks berechnet. Dieses Ergebnis bildet dann
+ die Nummer n des Sprungziels. Danach wird zur n-ten Zeilen­
+ nummer, die nach GOTO beziehungsweise GOSUB steht, verzweigt.
+ Die maximale Anzahl von Zeilennummern, die nach GOTO oder
+ GOSUB angegeben werden dürfen, ist 512.
+ Nimmt <Sprungziel Nr.> einen Wert an, zu dem keine Zeile in der
+ Liste gefunden wird (z.B. Werte kleiner gleich null oder Werte größer
+ als die Anzahl der angegebenen Zeilennummern), so wird das Pro­
+ gramm mit der der ON-Anweisung folgenden Programmzeile fortge­
+ setzt.
+
+ Statt GOTO und GOSUB darf auch GO TO beziehungsweise
+ GO SUB geschrieben werden.
+
+Hinweis : Die ON-Anweisung muß in #on("ieiner#off("i Programmzeile stehen.
+
+
+Beispiel : 260 INPUT "Menüpunkt 1, 2 oder 3", a
+ 270 ON VAL (a) GOTO 300, 400, 500
+ 280 GOTO 260
+ 300 PRINT "Menüpunkt 1"
+ .
+ .
+ 400 PRINT "Menüpunkt 2"
+ .
+ .
+ 500 PRINT "Menüpunkt 3"
+
+
+ Entsprechend der Eingabe wird nach 300, 400 oder 500 verzweigt.
+ Bei Fehleingaben wird Zeile 280 ausgeführt.
+
+Vergleiche : GOSUB-, GOTO-, IF-Anweisungen
+
+
+
+Anweisung : OPTION BASE
+
+Zweck : Festlegung des kleinsten Wertes für Feldindizes
+
+Syntax : OPTION BASE 0|1
+
+Erklärung : OPTION BASE legt fest, ob die nachfolgend dimensionierten Felder
+ Elemente mit dem Index 0 erhalten, oder ob der niedrigste Index 1
+ ist. Voreingestellt ist OPTION BASE 0.
+
+Hinweis : Der niedrigste Feldindex kann für jedes Feld individuell eingestellt
+ werden. Die OPTION BASE-Anweisung gilt für alle Felder, deren
+ Dimensionierung ihr textuell nachfolgen. Eine erneute OPTION
+ BASE-Anweisung kann dann die Untergrenze für die #on("iihr#off("i folgenden
+ Dimensionierungen festlegen.
+
+
+Beispiel : 10 DIM a (100) 'Indizes 0-100
+ 20 OPTION BASE 1
+ 30 b$ (3) = "hallo" 'Indizes 1-10
+ 40 DIM a% (5) 'Indizes 1-5
+ 50 OPTION BASE 0
+ 60 DIM c% (9) 'Indizes 0-9
+ 70 LET d (4) = 12.3 'Indizes 0-10
+
+
+Vergleiche : DIM-Anweisung
+
+
+
+Operator : OR
+
+Siehe Kapitel 4.4. (Operatoren)
+
+
+
+Funktion : POS
+
+Zweck : Ermittlung der aktuellen Cursorspalte
+
+Syntax : POS (<num. Ausdruck>)
+
+Erklärung : Geliefert wird die Nummer der Spalte (als INT), in der sich der Cursor
+ auf dem Bildschirm befindet. Die Spalte ganz links hat die Num­
+ mer 1.
+ Der Argument-Ausdruck ist ein Dummy-Argument (hat keinen
+ Einfluß auf den gelieferten Wert).
+
+
+Beispiel : 10 CLS
+ 20 PRINT "testtext";
+ 30 PRINT POS (0)
+ Ausgabe: testtext 9
+
+
+Vergleiche : CSRLIN-, LPOS-Funktionen
+
+
+
+Anweisung : PRINT
+
+Zweck : Ausgabe auf den Bildschirm
+
+Syntax : PRINT [#ib(3)#USING#ie(3)# <Format> ;]
+ #right#[ #ib(3)#TAB#ie(3)# (<Spalte>) | , | ; | <Ausdruck> ] [...]
+
+Erklärung : <Format> : TEXT-Ausdruck für USING (s. u.)
+ <Spalte> : INT-Ausdruck (s. u.)
+ <Ausdruck>: TEXT-Ausdruck oder numerischer Ausdruck, der
+ ausgegeben werden soll.
+
+ PRINT dient der Ausgabe von Zeichen auf dem Bildschirm.
+ Numerische Werte werden mit sieben signifikanten Ziffer ausgege­
+ ben. Bei Exponentendarstellung werden für den Exponent maximal 3
+ Ziffern ausgegeben. Hinter allen numerischen Werten und vor posi­
+ tiven numerischen Werten wird jeweils ein Leerzeichen ausgegeben.
+
+ TAB bewirkt eine Positionierung des Cursors auf die angegebene
+ Spalte (die Spalte ganz links hat die Nummer 1). Ist die Spaltenzahl
+ größer als die mit WIDTH eingestellte Ausgabebreite, so wird auf die
+ Spalte mit der Nummer Spalte MODULO Ausgabebreite positioniert.
+ Eine Spaltennummer kleiner gleich null bewirkt eine entsprechende
+ Warnung.
+ Ist die Spalte mit der angegebenen Nummer in der aktuellen Zeile
+ bereits überschritten, dann wird auf die nächste Zeile positioniert.
+
+ Ein Semikolon bewirkt, daß der Cursor an der gerade erreichten
+ Position bleibt.
+
+ Ein Komma bewirkt die Positionierung auf die nächste gültige Spal­
+ te, für deren Nummer gilt: Nummer MODULO 16 ist 1.
+ Das Komma dient also der Ausgabe in 16 Zeichen breiten Zonen.
+
+ Endet die PRINT-Anweisung mit TAB (<Spalte>), einem Komma
+ oder einem Semikolon, dann wird kein Zeilenvorschub ausgelöst.
+
+ #onbold#USING
+ Der EUMEL-BASIC-Compiler unterstützt auch die PRINT
+ USING-Anweisung für formatierte Ausgaben.
+ Der nach dem Wort USING angegebene TEXT-Ausdruck spezifi­
+ ziert das Ausgabeformat für eine PRINT USING-Anweisung.
+
+ Formatierung von Texten:
+ "!": Nur das erste Zeichen einer Zeichenfolge wird ausgegeben
+ "\n Leerzeichen\": Es werden die 2 + n ersten Zeichen einer
+ Zeichenfolge ausgegeben
+ "&": Alle Zeichen einer Zeichenfolge werden ausgegeben
+
+ Formatierung von Zahlen:
+ "\#": bezeichnet eine Ziffernposition
+ ".": Position des Dezimalpunkts
+ "+": (vor oder nach Zahlen) Ausgabe des Vorzeichens
+ "-": (nach Zahlen) gegebenenfalls Ausgabe von "-" hinter der
+ Zahl
+ "**": Führende Leerstellen werden mit Sternchen aufgefüllt; wirkt
+ außerdem wie "\#\#".
+ "$$": Es wird ein Dollarzeichen links vor der formatierten Zahl ausgegeben;
+ wirkt außerdem wie "\#\#".
+ "**$": Führende Leerstellen werden mit Sternchen ausgefüllt und direkt vor
+ der formatierten Zahl wird ein Dollarzeichen ausgegeben; wirkt
+ außerdem wie "\#\#\#".
+ ",": (vor Dezimalpunkt) Unterteilung der Vorkommastellen in Dreier­
+ gruppen mittels Komma
+ "^^^^": Position des Exponenten
+ "_": Ein Zeichen, das einem Unterstreichungsstrich folgt, wird unverändert
+ ausgegeben
+
+ Ist der Format-Ausdruck fehlerhaft, so kommt es zum Fehler "USING-
+ Format fehlerhaft".
+ Überschreitet eine auszugebende Zahl in irgendeiner Hinsicht die im
+ Format-Ausdruck für sie vorgesehene Stellenzahl, so wird das Zeichen "%"
+ ausgegeben, um den Fehler anzuzeigen.
+
+
+Hinweis : 1. PRINT (und PRINT USING) richtet sich bei allen Ausgaben nach
+ der mit WIDTH eingestellten Ausgabebreite.
+ 2. Alle Ausgaben von PRINT können mit der Systemprozedur
+ 'sysout' in eine Datei umgeleitet werden. Dann wird nichts auf
+ das Terminal ausgegeben.
+ 3. Das Verhalten beim Erreichen der letzten Bildschirmzeile kann
+ mit der Prozedur 'basic page' gesteuert werden. Vergleiche
+ hierzu Kapitel 5, "Steuerung der Bildschirmausgabe".
+
+
+Beispiel : 10 PRINT "hallo", 2 ^ 32 TAB (33) "Ende";
+
+ Ausgabe: hallo 4.294967E+09 Ende
+ Position: 1234567890123456789012345678901234567890
+
+
+Vergleiche : WRITE-, LPRINT-Anweisungen, POS-, CSRLIN-, SPC-
+ Funktionen
+
+
+
+Anweisung : RANDOMIZE
+
+Zweck : Festlegung eines Anfangswertes für den Zufallszahlengenerator
+
+Syntax : RANDOMIZE [<num. Ausdruck>]
+
+Erklärung : Mit RANDOMIZE erhält der Zufallszahlengenerator einen bestimmten
+ Startwert.
+ Ist kein numerischer Ausdruck angegeben, so wird während des
+ Programmlaufs die Meldung "Startwert des Zufallszahlen­
+ generators ?" ausgegeben und ein Startwert eingelesen.
+
+ Wird der Zufallszahlengenerator immer mit dem gleichen Wert gestar­
+ tet, so liefert er auch immer die gleichen Zufallszahlen. Soll er immer
+ verschiedene Werte liefern, so kann er zum Beispiel mit der System­
+ uhr auf zufällige Startwerte gesetzt werden (RANDOMIZE TIMER).
+
+
+Beispiel : 10 RANDOMIZE 4711
+ 20 FOR i = 1 TO 5
+ 30 PRINT INT (RND * 10);
+ 40 NEXT i
+ Ausgabe: 5 6 2 9 6
+
+Vergleiche : RND-Funktion
+
+
+
+Anweisung : READ
+
+Zweck : Auslesen von Daten aus DATA-Anweisungen
+
+Syntax : READ <Variable> [, <Variable>] [...]
+
+Erklärung : <Variable>: numerische Variable oder TEXT-Variable
+
+ Die READ-Anweisung liest die nächsten Elemente aus der aktuellen
+ DATA-Anweisung (s.d.) in die angegebenen Variablen ein.
+
+ In TEXT-Variablen können sowohl "quoted strings" als auch "un­
+ quoted strings" (vgl. DATA-Anweisung) eingelesen werden.
+ In numerische Variablen können dagegen nur "unquoted strings"
+ eingelesen werden. Außerdem müssen die Zeichen des "unquoted
+ string" eine gültige Darstellung einer numerischen Konstanten (even­
+ tuell mit Vorzeichen) sein. Sind diese Bedingungen nicht erfüllt, so
+ kommt es bei der Ausführung des Programms zu entsprechenden
+ Fehlern.
+
+ Eine READ-Anweisung kann Daten aus vorangehenden und nach­
+ folgenden DATA-Anweisungen lesen.
+ Alle DATA-Anweisungen eines Programms bilden zusammen einen
+ großen sequentiellen Speicher, auf den mit READ der Reihe nach
+ zugegriffen wird. Intern wird ein sogenannter READ-DATA-Zeiger
+ geführt, der immer auf das nächste auszulesende Element zeigt.
+
+ Die RESTORE-Anweisung (s.d.) ermöglicht es, den READ-DATA-
+ Zeiger auf das erste Element einer bestimmten DATA-Zeile zu
+ setzen.
+
+ Sind keine Daten mehr für READ vorhanden, so wird die Ausführung
+ des Programms mit der Fehlermeldung "Keine Daten mehr für
+ READ" abgebrochen.
+
+
+Beispiel : 2020 PRINT "Stadt", "Land", "Fluß"
+ 2030 READ stadt$, land$, fluß$
+ 2040 PRINT stadt$, land$, fluß$
+ .
+ 5000 DATA Köln, Bundesrepublik Deutschland, Rhein
+
+
+Vergleiche : DATA-, RESTORE-Anweisungen
+
+
+
+Anweisung : REM
+
+Zweck : Ermöglicht das Einfügen von Kommentaren in ein Programm
+
+Syntax : REM <Zeichenfolge>
+
+Erklärung : <Zeichenfolge>: Beliebige Folge von Zeichen
+
+ Wird eine REM-Anweisung gefunden, so wird der Rest der Pro­
+ grammzeile nicht weiter beachtet. Die Compilierung wird in der fol­
+ genden Zeile fortgesetzt.
+ Es empfielt sich, von Kommentarzeilen möglichst oft Gebrauch zu
+ machen, weil sie den Programmtext dokumentieren und strukturieren.
+
+Hinweis : Nach REM können keine weiteren Anweisungen mehr in einer Pro­
+ grammzeile stehen, da sie nicht übersetzt werden. Auch der Doppel­
+ punkt wird nach REM nicht beachtet.
+
+
+Beispiel : 1000 REM Ausgabe des Feldes
+ 1010 FOR i = 1 TO feldgroesse%
+ 1020 PRINT "Eintrag"; i; feld (i)
+ 1030 NEXT i
+
+
+
+Anweisung : RESTORE
+
+Zweck : Setzen des READ-DATA-Zeigers auf den Anfang einer angegebe­
+ nen Zeile
+
+Syntax : RESTORE [<Zeilennummer>]
+
+Erklärung : <Zeilennummer>: INT-Konstante
+
+ Der READ-DATA-Zeiger (vgl. DATA-Anweisung) wird auf die Zeile
+ <Zeilennummer> gesetzt.
+ Wird keine Zeilennummer angegeben, so wird für <Zeilennummer>
+ 1 eingesetzt.
+
+ Existiert die Programmzeile <Zeilennummer> nicht oder ist in ihr
+ keine DATA-Anweisung vorhanden, so wird der Zeiger auf die
+ nächste textuell folgende DATA-Anweisung gesetzt.
+ Folgt der angegebenen Zeilennummer im Programm keine DATA-
+ Anweisung mehr, kommt es zu der Fehlermeldung "RESTORE: Keine
+ DATA-Anweisung in oder nach Zeile <Zeilennummer> gefunden !"
+
+
+Beispiel : 10 READ a, b, c
+ 20 RESTORE
+ 30 READ d, e, f
+ 40 DATA 2, 3, 5
+ 50 PRINT a; b; c; d; e; f
+ Ausgabe: 2 3 5 2 3 5
+
+Vergleiche : DATA-, READ-Anweisungen
+
+
+
+Anweisung : RETURN
+
+Zweck : Rücksprung aus einem Unterprogramm
+
+Syntax : RETURN
+
+Erklärung : RETURN bewirkt einen Rücksprung aus dem Unterprogramm hinter
+ die aufrufende GOSUB-Anweisung.
+
+ Es dürfen auch mehrere RETURN-Anweisungen in einem Unterpro­
+ gramm vorkommen, um es an verschiedenen Stellen zu verlassen.
+
+ Wird ein RETURN gefunden, ohne daß ein GOSUB durchlaufen
+ wurde, so wird mit der Fehlermeldung "RETURN ohne GOSUB"
+ abgebrochen.
+
+
+Beispiel : 140 GOSUB 10000 'Zeige Uhrzeit
+ .
+ .
+ 370 GOSUB 10000 'Zeige Uhrzeit
+ 9990 END
+ 10000 REM Unterprogramm Zeige Uhrzeit
+ 10010 PRINT "Es ist " + TIME$ + " Uhr"
+ 10020 RETURN
+
+
+Vergleiche : GOSUB-, ON-Anweisungen
+
+
+
+Funktion : RIGHT$
+
+Zweck : Erzeugung eines Teiltextes aus einem anderen Text
+
+Syntax : RIGHT$ (<TEXT-Ausdruck>, <Anzahl Zeichen>)
+Erklärung : <Anzahl Zeichen>: INT-Ausdruck
+
+ Die Funktion liefert die letzten <Anzahl Zeichen> Textzeichen des
+ TEXT-Ausdrucks.
+ Ist <Anzahl Zeichen> größer gleich der Länge des TEXT-
+ Ausdrucks, so wird der gesamte Ausdruck geliefert.
+
+
+Beispiel : 10 LET a$ = "hallihallo"
+ 20 PRINT RIGHT$ (a$, 5)
+ Ausgabe: hallo
+
+Vergleiche : LEFT$-, MID$-Funktionen, LSET-, MID$-, RSET-Anweisungen
+
+
+
+Funktion : RND
+
+Zweck : Erzeugung von Zufallszahlen
+
+Syntax : RND [<num. Ausdruck>]
+
+Erklärung : Wird kein Argument angegeben, so wird ein Wert größer null für den
+ Ausdruck angenommen.
+
+ RND (x) liefert
+
+ für x > 0:
+ eine neue Zufallszahl. Es gilt immer: 0 <= RND < 1. Der Betrag
+ des Arguments hat keinen Einfluß auf das Ergebnis.
+
+ für x = 0:
+ die letzte gelieferte Zufallszahl noch einmal.
+
+ für x < 0:
+ eine neue Zufallszahl. Vorher wird aber RANDOMIZE x (s.d.) ausge­
+ führt.
+
+ Die Zufallszahlen werden als REALs geliefert.
+ Der Zufallszahlengenerator kann mit der RANDOMIZE-Anweisung
+ auf bestimmte Startwerte eingestellt werden.
+
+
+Beispiel : 10 FOR i = 1 TO 5
+ 20 PRINT INT (RND * 10)
+ 30 NEXT i
+ Ausgabe (z.B.): 7 9 9 5 0
+
+Vergleiche : RANDOMIZE-Anweisung
+
+
+
+Anweisung : RSET
+
+Zweck : Ersetzen von Zeichen eines Textes von rechts her
+
+Syntax : RSET <TEXT-Variable> = <TEXT-Ausdruck>
+
+Erklärung : Das Ergebnis des TEXT-Ausdrucks wird, rechts beginnend, in der
+ TEXT-Variablen eingesetzt. Es werden höchstens so viele Zeichen
+ ersetzt, wie bisher schon in der Variablen vorhanden waren, das heißt
+ die Länge des Textes in der Variablen ändert sich nicht.
+ Soll ein Text eingesetzt werden, der länger ist als der Text in der
+ Variablen, so wird die Variable nicht verändert.
+
+
+Beispiel : 210 LET a$ = "ABCDEFG"
+ 220 RSET a$ = "12345"
+ 230 PRINT a$,
+ 240 RSET a$ = "abc"
+ 250 PRINT a$
+ Ausgabe: AB12345 AB12abc
+
+Vergleiche : LSET-, MID$-Anweisungen, LEFT$-, MID$-, RIGHT$-Funk­
+ tionen
+
+
+
+Funktion : SGN
+
+Zweck : Ermittlung des Vorzeichens einer Zahl
+
+Syntax : SGN (<num. Ausdruck>)
+
+Erklärung : SGN (x) liefert
+ für x > 0: 1
+ für x = 0: 0
+ für x < 0: -1 .
+
+
+Beispiel : 10 a = -12.74
+ 20 PRINT SGN (a); SGN (-a); SGN (0 * a)
+ Ausgabe: -1 1 0
+
+Vergleiche : ABS-Funktion
+
+
+
+Funktion : SIN
+
+Zweck : Berechnung des Sinus eines Radiantwertes
+
+Syntax : SIN (<Winkel>)
+
+Erklärung : <Winkel>: REAL-Ausdruck, der den Winkel in Radiant angibt.
+ Die Funktion liefert den Sinus des Winkels als REAL.
+
+
+Beispiel : 10 PI = 3.141593
+ 20 PRINT SIN (PI/4)
+ Ausgabe: .7071068
+
+Vergleiche : COS-, TAN-Funktionen
+
+
+
+Funktion : SPACE$
+
+Zweck : Erzeugung einer bestimmten Anzahl von Leerzeichen
+
+Syntax : SPACE$ (<INT-Ausdruck>)
+
+Erklärung : Die SPACE$-Funktion liefert einen TEXT, der aus so vielen Leerzei­
+ chen (Code 32) besteht, wie der Wert des INT-Ausdrucks angibt.
+
+
+Beispiel : 10 PRINT "123456789"
+ 20 PRINT "^" + SPACE$ (7) + "^"
+
+ Ausgabe: 123456789
+ ^ ^
+
+
+Vergleiche : STRING$-Funktion
+
+
+
+Funktion : SPC
+
+Diese Funktion entspricht exakt der SPACE$-Funktion und wurde nur aus Kompatibi­
+litätsgründen implementiert.
+
+
+
+Funktion : SQR
+
+Zweck : Berechnung der Quadratwurzel einer Zahl
+
+Syntax : SQR (<num. Ausdruck>)
+
+Erklärung : SQR (x) liefert die Quadratwurzel des durch den numerischen Aus­
+ druck angegebenen Wertes.
+ Das Ergebnis wird als REAL geliefert.
+
+
+Beispiel : 10 PRINT SQR (100);
+ 20 PRINT SQR (2);
+ 30 PRINT SQR (17.453)
+ Ausgabe: 10 1.414214 4.177679
+
+
+
+Anweisungsbestandteil : STEP
+
+Siehe FOR-Anweisung
+
+
+
+Anweisung : STOP
+
+Zweck : Beenden der Programmausführung eines BASIC-Programms mit
+ Meldung
+
+Syntax : STOP
+
+Erklärung : STOP beendet die Programmausführung des BASIC-Programms.
+ Im Gegensatz zu END (s.d.) erzeugt STOP dabei die Meldung "STOP
+ beendet das Programm in Zeile ...".
+
+ STOP-Anweisungen dürfen im Programm an beliebiger Stelle
+ stehen, und es darf auch mehr als eine STOP-Anweisung in einem
+ Programm vorkommen.
+ Der Compiler übersetzt ein Programm auch nach Erreichen einer
+ STOP-Anweisung weiter.
+
+
+Beispiel : 3220 IF eingabe$ = "Ende" THEN STOP
+
+
+Vergleiche : END-Anweisung
+
+
+
+Funktion : STR$
+
+Zweck : Konvertierung einer Zahl in einen Text
+
+Syntax : STR$ (<num. Ausdruck>)
+
+Erklärung : Die Funktion liefert die Darstellung des Wertes des numerischen
+ Ausdrucks als TEXT.
+ Die Zahlen werden so als Text geliefert, wie sie bei einer PRINT-
+ Anweisung auf dem Bildschirm erscheinen würden.
+
+
+Beispiel : 10 LET zahl$ = STR$ (1e6)
+ 20 PRINT zahl$; LEN (zahl$)
+ Ausgabe: 1000000 7
+
+Vergleiche : VAL-Funktion (Komplementärfunktion)
+
+
+
+Funktion : STRING$
+
+Zweck : Erzeugung eines Textes mit mehreren gleichen Zeichen
+
+Syntax : STRING$ (<Anzahl>, <Code>|<TEXT-Ausdruck>)
+
+Erklärung : <Anzahl>: INT-Ausdruck
+ <Code> : INT-Ausdruck (Wert im Bereich 0 bis 255)
+
+ Die Funktion liefert <Anzahl> mal das Zeichen,
+ - das den ASCII-Code <Code> hat oder
+ - das am Anfang vom Ergebnis des TEXT-Ausdrucks steht.
+
+
+Beispiel : 10 LET pfeil$ = STRING$ (10, "=") + ">"
+ 20 PRINT pfeil$;" ";STRING$ (5, 35) '35 entspr. \#
+ Ausgabe: ==========> \#\#\#\#\#
+
+Vergleiche : SPACE$-Funktion
+
+
+
+Anweisungsbestandteil : SUB
+
+Siehe GOSUB-Anweisung
+
+
+
+Anweisung : SWAP
+
+Zweck : Tauschen der Inhalte zweier Variablen
+
+Syntax : SWAP <Variable1>, <Variable2>
+
+Erklärung : SWAP tauscht die Inhalte der beiden Variablen.
+
+ Die beiden Variablen müssen vom gleichen Typ sein.
+
+
+Beispiel : 3220 LET a = 10
+ 3230 LET b = 20
+ 3240 SWAP a, b
+ 3250 PRINT a; b
+ Ausgabe: 20 10
+
+
+
+Anweisungsbestandteil : TAB
+
+Siehe PRINT- und LPRINT-Anweisung
+
+
+
+Funktion : TAN
+
+Zweck : Berechnung des Tangens eines Radiantwertes
+
+Syntax : TAN (<Winkel>)
+
+Erklärung : <Winkel>: REAL-Ausdruck, der den Winkel in Radiant angibt.
+ Die Funktion liefert den Tangens des Winkels als REAL.
+
+
+Beispiel : 10 PI = 3.141593
+ 20 PRINT TAN (PI/4)
+ Ausgabe: 1
+
+Vergleiche : COS-, SIN-Funktionen
+
+
+
+Anweisungsbestandteil : THEN
+
+Siehe IF-Anweisung
+
+
+
+Funktion : TIMER
+
+Zweck : Lesen der Systemuhr (CPU-Zeit der Task)
+
+Syntax : TIMER
+
+Erklärung : Die bisher von der Task verbrauchte CPU-Zeit (in Sekunden) wird
+ als REAL geliefert.
+
+ TIMER eignet sich auch zum Starten des Zufallszahlengenerators
+ (vgl. RANDOMIZE-Anweisung).
+
+
+Beispiel : 2010 LET starttime = TIMER
+ .
+ .
+ 2620 PRINT "Verbrauchte CPU-Zeit:";
+ 2630 PRINT TIMER - starttime; "Sekunden"
+
+
+Vergleiche : TIME$-Funktion
+
+
+
+Funktion : TIME$
+
+Zweck : Abrufen der aktuellen Tageszeit
+
+Syntax : TIME$
+
+Erklärung : Die Tageszeit wird als Text in der Form HH.MM.SS geliefert.
+
+
+Beispiel : 10 PRINT "Es ist jetzt "; TIME$; " Uhr"
+ Ausgabe (z.B.): Es ist jetzt 10:51:17 Uhr
+
+Vergleiche : DATE$-, TIMER-Funktionen
+
+
+
+Anweisungsbestandteil : TO
+
+Siehe FOR- und GOTO-Anweisungen
+
+
+
+Anweisung : TRON / TROFF
+
+Zweck : Ein- und Ausschalten der TRACE-Funktion
+
+Syntax : TRON
+ TROFF
+
+Erklärung : Der TRACE-Modus dient der Suche nach logischen Fehlern bei der
+ Entwicklung von BASIC-Programmen.
+
+ TRON schaltet den TRACE-Modus für die nachfolgend übersetzten
+ Programmzeilen ein.
+
+ Ist der TRACE-Modus eingeschaltet, so wird für jede gefundene
+ Zeilennummer die Ausgabe dieser Zeilennummer in eckigen
+ Klammern mit in den erzeugten Code aufgenommen. Dies hat dann
+ während des Laufens den Effekt, daß immer bei Abarbeitung der im
+ TRACE-Modus übersetzten Zeilen die aktuelle Zeilennummer aus­
+ gegeben wird. Es ist so leicht zu verfolgen, in welcher Reihenfolge
+ die Zeilen des Programms ausgeführt werden.
+
+ TROFF schaltet den TRACE-Modus für die textuell folgenden Pro­
+ grammzeilen wieder aus.
+
+
+Beispiel : 5220 TRON
+ 5230 REM hier beginnt die kritische
+ 5240 REM Programmstelle
+ .
+ .
+ .
+ 5970 TROFF
+
+
+ Die Zeilen 5230 bis 5970 werden im TRACE-Modus übersetzt.
+
+
+
+Anweisungsbestandteil : USING
+
+Siehe PRINT-Anweisung
+
+
+
+Funktion : USR
+
+Zweck : Aufruf einer wertliefernden insertierten Prozedur
+
+Syntax : USR <Prozedurname>
+ #right#[ (<Parameter> [, <Parameter>] [...] ) ]
+
+Erklärung : <Prozedurname>: Folge aus Zeichen, die für Prozeduren im
+ EUMEL-System zugelassen sind (also Buchstaben und - ab der
+ zweiten Stelle - Zahlen), jedoch keine Leerzeichen.
+
+ <Parameter>: <CONST-Parameter> | <VAR-Parameter>
+
+ <CONST-Parameter>: Ausdruck (genau des von der Prozedur
+ benötigten Typs)
+ <VAR-Parameter>: Variable (genau des von der Prozedur benö­
+ tigten Typs)
+
+ Die Prozedur mit dem angegebenen <Prozedurnamen> und den
+ angegebenen Parametern wird aufgerufen.
+ Die USR-Funktion liefert nach Ausführung der Prozedur das von der
+ Prozedur übergebene Ergebnis (Typ INT, REAL oder TEXT).
+
+ Mögliche Fehlerfälle:
+ - Eine Prozedur mit dem Namen <Prozedurnamen> und den ange­
+ gebenen Parametern gibt es nicht.
+ - Die Prozedur liefert keinen Wert.
+ - Die Prozedur liefert einen Typ, der in BASIC unbekannt ist (zum
+ Beispiel BOOL).
+ - Die Prozedur benötigt Parametertypen, die in BASIC nicht bekannt
+ sind (z.B. BOOL, FILE, TASK, QUIET).
+ - Ein Parameter ist CONST, es wird aber ein VAR-Parameter ver­
+ langt.
+
+ Weitere Informationen finden Sie in Kapitel 4.7.
+
+Hinweis : 1. Bei den Parametern wird keine Typkonvertierung vorgenommen.
+ 2. Der Prozedurname muß (entgegen der ELAN-Gewohnheit) ohne
+ Leerzeichen angegeben werden.
+ 3. USR ist die einzige Funktion, bei der das Argument (nämlich der
+ Prozeduraufruf) nicht in Klammern stehen darf.
+
+
+Beispiel : 10 LET euler = USR e
+ 20 PRINT euler
+ Ausgabe: 2.718282
+
+Vergleiche : CALL-, CHAIN-Anweisungen
+
+
+
+Funktion : VAL
+
+Zweck : Konvertierung eines Texts in eine Zahl
+
+Syntax : VAL (<TEXT-Ausdruck>)
+
+Erklärung : Die Funktion liefert den Wert der Zahl, deren Darstellung in dem
+ übergebenen TEXT-Ausdruck enthalten ist. Führende Leerstellen
+ werden dabei überlesen.
+ Sobald ein nicht wandelbares Zeichen festgestellt wird, wird der bis
+ dahin ermittelte Wert (am Anfang null) geliefert.
+
+
+Beispiel : 10 LET zahl$ = "-1.256E-63"
+ 20 PRINT VAL (zahl$)
+ Ausgabe: -1.256E-63
+
+Vergleiche : STR$-Funktion (Komplementärfunktion)
+
+
+
+Anweisung : WEND
+
+Zweck : Markierung des Endes einer WHILE-Schleife
+
+Syntax : WEND
+
+Erklärung : WEND markiert das Ende einer WHILE-Schleife (vergleiche
+ WHILE-Anweisung).
+
+Vergleiche : WHILE-, FOR-Anweisungen
+
+
+
+Anweisung : WHILE
+
+Zweck : Beginn einer abweisenden Schleife
+
+Syntax : WHILE <Bedingung>
+ <Schleifenrumpf>
+
+Erklärung : <Bedingung> : numerischer Ausdruck
+ <Schleifenrumpf>: Folge von Programmzeilen
+
+ Die WHILE-Anweisung erlaubt die komfortable Programmierung von
+ abweisenden Schleifen (sogenannten WHILE-WEND-Schleifen) in
+ BASIC.
+ Gelangt das Programm während der Ausführung an eine WHILE-
+ Anweisung, so wird zunächst der Bedingungs-Ausdruck ausge­
+ wertet. Ist die Bedingung nicht erfüllt (falsch, Wert gleich null), so
+ wird das Programm mit der nächsten Anweisung hinter der korres­
+ pondierenden WEND-Anweisung fortgesetzt.
+ Ist die Bedingung dagegen erfüllt (wahr, Wert ungleich null), so
+ werden die Anweisungen des Schleifenrumpfs abgearbeitet. Beim
+ Erreichen der WEND-Anweisung springt das Programm wieder zur
+ WHILE-Anweisung zurück, die Bedingung wird erneut überprüft und,
+ je nach Ergebnis, wird der Schleifenrumpf oder die Anweisung nach
+ WEND ausgeführt.
+
+ WHILE-WEND-Schleifen dürfen (auch mit FOR-NEXT-Schleifen,
+ s.d.) geschachtelt werden. Überschneidungen von WHILE-WEND-
+ Schleifen und FOR-NEXT-Schleifen sind jedoch nicht zulässig.
+
+
+Beispiel : 10 LET weiter$ = "j"
+ 20 WHILE LEFT$ (weiter$, 1) = "j"
+ 30 REM Hier beginnt das eigentliche Programm
+ .
+ .
+ 1650 INPUT "Weiter ? (j/n)", weiter$
+ 1660 WEND
+
+
+ Das eigentliche Programm wird so lange ausgeführt, bis der Benutzer
+ etwas anderes als "j" an der ersten Stelle von 'weiter$' eingibt.
+
+Vergleiche : FOR-, IF-Anweisungen
+
+
+
+Anweisung : WIDTH
+
+Zweck : Einstellung der Bildschirmbreite
+
+Syntax : WIDTH <Zeichen pro Zeile>
+
+Erklärung : <Zeichen pro Zeile> : INT-Ausdruck
+
+ Mit der WIDTH-Anweisung wird festgelegt, wie viele Zeichen pro
+ Zeile bei Ausgaben auf den Bildschirm oder in Dateien pro Zeile
+ ausgegeben werden sollen.
+ Soll für die Druckdatei eine andere Anzahl von Zeichen pro Zeile
+ gelten als für den Bildschirm, dann muß vor jeder Sequenz von
+ LPRINT-Anweisungen die gewünschte Anzahl mit WIDTH einge­
+ stellt werden.
+ WIDTH gilt auch für Ausgaben in 'sysout'-Dateien.
+ Insbesondere bei der Ausgabe in Dateien kann ein Wert von mehr als
+ 80 Zeichen pro Zeile sinnvoll sein.
+
+
+Beispiel : 10 REM es sollen nur 45 Zeichen pro Zeile
+ 20 REM ausgegeben werden
+ 30 WIDTH 45
+
+
+Vergleiche : PRINT-, LPRINT-, WRITE-Anweisungen
+
+
+
+Anweisung : WRITE
+
+Zweck : Ausgabe von Zahlen und Texten auf dem Bildschirm
+
+Syntax : WRITE [<Ausdruck>] [, <Ausdruck>] [...]
+
+Erklärung : <Ausdruck>: numerischer Ausdruck oder TEXT-Ausdruck
+
+ Die WRITE-Anweisung erlaubt die Ausgabe von Daten auf dem
+ Bildschirm. Die angegebenen Ausdrücke werden ausgewertet und
+ ausgegeben. Dabei werden numerische Werte im gleichen Format
+ wie bei der PRINT-Anweisung (s.d.) ausgegeben, mit der Einschrän­
+ kung, daß den Zahlen keine Leerstelle folgt.
+ Die Ergebnisse von Text-Ausdrücken werden von Anführungszei­
+ chen umschlossen ausgegeben.
+ Alle Einzelausgaben werden durch Kommata voneinander getrennt.
+
+ Nach Ausgabe aller angegebenen Ausdrücke wird der Cursor an den
+ Anfang der nächsten Zeile positioniert.
+
+
+Beispiel : 10 LET a = 10.7: b = 20
+ 20 LET c$ = "Testtext"
+ 30 WRITE a, b, c$
+ Ausgabe: 10.7, 20,"Testtext"
+
+Vergleiche : PRINT-, LPRINT-, WIDTH-Anweisungen
+
+
+
+Operator : XOR
+
+Siehe Kapitel 4.4. (Operatoren)
+
diff --git a/doc/basic/basic handbuch.3 b/doc/basic/basic handbuch.3
new file mode 100644
index 0000000..14cb499
--- /dev/null
+++ b/doc/basic/basic handbuch.3
@@ -0,0 +1,698 @@
+#page nr ("%",97)#
+#head#
+EUMEL-BASIC-Compiler 9. Anpassung von Programmen an den EUMEL-BASIC-Compiler %
+
+#end#
+
+9. Anpassung von Programmen an den EUMEL-BASIC-Compiler
+
+
+9.1. Unterschiede zwischen BASIC-Inter­
+ pretern und dem EUMEL-BASIC-
+ Compiler
+
+Bei der Anpassung von Programmen für BASIC-Interpreter an den EUMEL-
+BASIC-Compiler gibt es einige Besonderheiten zu beachten, die auf den unterschied­
+lichen Arbeitsweisen von Compilern gegenüber Interpretern beruhen.
+Bei Interpretern fällt die Übersetzung und Ausführung des Quellprogramms zeitlich
+zusammen (genau genommen gibt es ja gar keine Übersetzung, sondern das Quell­
+programm wird #on("i")#interpretiert#off("i")#). Dies hat zur Folge, daß auch nicht zur Ausführung
+bestimmte Anweisungen (z.B. Dimensionierungen, Typfestlegungen etc.) erst während
+der Ausführung des Programms erkannt und ausgewertet werden.
+Bei Compilern hingegen muß deutlich zwischen der Übersetzungszeit (Compiletime)
+und der Laufzeit (Runtime) eines Programms unterschieden werden.
+Der wesentliche Unterschied zwischen Compilern und Interpretern liegt nun in der
+Reihenfolge der Kenntnisnahme von den Anweisungen. Während der Interpreter von
+den Anweisungen in der Reihenfolge ihres Auftretens entlang des Programmablaufs
+Kenntnis nimmt, werden die Anweisungen vom Compiler in der Reihenfolge ihres
+textuellen Auftretens zur Kenntnis genommen.
+Da es sich bei dem EUMEL-BASIC-Compiler um einen One-Pass-Compiler
+handelt, ist es zwingend notwendig, daß
+- DIM-Anweisungen vor dem ersten Zugriff auf das zu dimensionierende Feld
+ stehen.
+- OPTION BASE-Anweisungen vor den betreffenden Dimensionierungen stehen.
+- DEF FN-Anweisungen vor dem ersten Aufruf der zu definierenden Funktion ste­
+ hen.
+- DEFINT- beziehungsweise DEFSTR-Anweisungen vor der ersten Verwendung der
+ betreffenden Variablen erscheinen.
+
+Einige Interpreter lassen sogar den Abschluß von FOR-NEXT- und WHILE-
+WEND-Schleifen an mehreren Stellen im Programm zu (z.B. mehrere NEXT-
+Anweisungen zu einer FOR-Anweisung). Auch solche "Kunstgriffe" gestattet der
+EUMEL-BASIC-Compiler (aus den oben geschilderten Gründen) nicht.
+
+
+
+
+9.2. Abweichungen von ISO 6373-1984
+ (Minimal-BASIC)
+
+
+
+Der EUMEL-BASIC-Compiler weicht in folgenden Punkten von der ISO-Norm
+6373-1984 für Minimal-BASIC ab:
+- Treten bei der Auswertung von numerischen Ausdrücken Überläufe auf, so wird
+ nicht, wie im Standard vorgesehen, eine Warnung ausgegeben und mit bestimmten
+ Höchstwerten weitergerechnet, sondern die Ausführung des BASIC-Programms
+ wird mit einer entsprechenden Fehlermeldung abgebrochen.
+- Nimmt die Sprungziel-Nummer bei der ON-Anweisung einen fehlerhaften Wert an
+ (Nummer < 1 oder Nummer > Anzahl Sprungziele), dann wird nicht, wie im
+ Standard empfohlen, mit einer Fehlermeldung abgebrochen, sondern es wird (wie
+ auch in Microsoft-BASIC üblich) das Programm mit der der ON-Anweisung fol­
+ genden Anweisung fortgesetzt.
+- Bei der DATA-Anweisung müssen nicht unbedingt Zeichenfolgen angegeben
+ werden. Werden sie weggelassen, dann wird bei Ausführung der READ-
+ Anweisung null beziehungsweise Leertext geliefert (vergleiche Kapitel 8, DATA-
+ Anweisung).
+- Bei den Eingaben für eine INPUT-Anweisung können ebenfalls die Daten wegge­
+ lassen werden. Auch hier wird null beziehungsweise Leertext geliefert (vergleiche
+ Kapitel 8, INPUT-Anweisung)
+
+
+Die Erweiterungen gegenüber ISO 6373 sollen hier nicht im einzelnen aufgeführt
+werden. Bitte vergleichen Sie in Zweifelsfällen die Normungsschrift mit dieser Doku­
+mentation!
+
+
+
+
+9.3. Anpassung von Microsoft-BASIC Pro­
+ grammen an den EUMEL-BASIC-
+ Compiler
+
+
+
+Bei der Entwicklung des EUMEL-BASIC-Compilers wurde zwar auf Übereinstim­
+mung mit Microsoft-BASIC Wert gelegt, von einer echten Kompatibilität kann aber
+aufgrund einer ganzen Reihe fehlender Anweisungen und Funktionen nicht gespro­
+chen werden.
+Gegenüber Microsoft-BASIC fehlen vor allem:
+- alle "Direkt-Kommandos" (RUN, LIST, LOAD, SAVE, MERGE usw.). Die Aufgaben
+ dieser Anweisungen werden von den Prozeduren des EUMEL-Systems über­
+ nommen.
+- im weiteren Sinne "hardware-nahe" oder an Maschinensprache orientierte Anwei­
+ sungen und Funktionen (CALL, PEEK, POKE, USR, WAIT usw.)
+- die ERROR-Handling Anweisungen (ON ERROR, RESUME)
+- die Dateiverarbeitungs-Anweisungen und -Funktion (INPUT\#, PRINT\# u.a.; die
+ INPUT- und PRINT-Anweisungen wurden aber auf Zusammenarbeit mit 'sysin'
+ und 'sysout' abgestimmt.)
+- die Single-Precision-Variablen (Single- und Double-Precision-Variablen wer­
+ den beide auf den Datentyp REAL abgebildet.)
+- die hexadezimalen und oktalen Konstanten
+
+Anweisungen und Funktionen, die sich abweichend vom Microsoft-Standard verhal­
+ten, sind vor allem:
+- CALL, CHAIN, USR
+- ERROR, ERR, ERL
+- LSET, RSET
+
+Wichtige Erweiterungen gegenüber Microsoft-BASIC sind:
+- Möglichkeit des Aufrufs von ELAN-Prozeduren
+- Maximale Anzahl von Zeichen pro Zeile: 32000
+- Maximale Anzahl von Zeichen pro TEXT-Objekt: 32000
+- OPTION BASE wirkt auf einzelne Felder (und nicht unbedingt auf ein ganzes
+ Programm)
+
+#on ("b")#
+Hinweis zur Verwendung von MS-BASIC-Programmen im EUMEL-System#off ("b")#
+Sollen Microsoft-BASIC-Programme in das EUMEL-Systemm übernommen wer­
+den, so ist dabei so vorzugehen:
+1. Speichern Sie das Programm von MS-BASIC aus mit der ASCII-SAVE-Option
+ ab.
+ Beispiel: SAVE "PROGRAMM.BAS",A
+2. Lesen Sie das Programm mittels "DOSDAT" (Programm zum Lesen von MS-
+ DOS-Dateien) im "file ascii"-Modus ein:
+
+ reserve ("file ascii", /"DOS"); fetch ("PROGRAMM.BAS", /"DOS")
+
+Danach steht ihnen das BASIC-Program in der EUMEL-Textdatei
+"PROGRAMM.BAS" zur Verfügung.
+
+#page#
+#head#
+EUMEL-BASIC-Compiler Anhang A: Reservierte Wörter %
+
+#end#
+
+Anhang A: #ib(4)#Reservierte Wörter#ie(4)#
+Dieser Anhang enthält eine Übersicht über alle vom EUMEL-BASIC-Compiler
+erkannten reservierten Wörter.
+
+ABS Funktion
+AND Operator
+AS Anweisungsbestandteil
+ASC Funktion
+ATN Funktion
+BASE Anweisungsbestandteil
+CALL Anweisung
+CDBL Funktion
+CHAIN Anweisung
+CHR$ Funktion
+CINT Funktion
+CLEAR nicht implementiert
+CLOSE nicht implementiert
+CLS Anweisung
+COMMON nicht implementiert
+FIELD nicht implementiert
+COS Funktion
+CSRLIN Funktion
+CVD Funktion
+CVI Funktion
+DATA Anweisung
+DATE$ Funktion
+DEF Anweisung
+DEFDBL Anweisung
+DEFINT Anweisung
+DEFSNG Anweisung
+DEFSTR Anweisung
+DIM Anweisung
+ELSE Anweisungsbestandteil
+END Anweisung
+EOF Anweisungsbestandteil
+EQV Operator
+ERL Funktion
+ERM$ Funktion
+ERR Funktion
+ERROR Anweisung
+EXP Funktion
+FIX Funktion
+FOR Anweisung
+FRE Funktion
+GET nicht implementiert
+GO Anweisungsbestandteil
+GOSUB Anweisung
+GOTO Anweisung
+HEX$ Funktion
+IF Anweisung
+IMP Operator
+INKEY$ Funktion
+INPUT Anweisung
+INPUT$ Funktion
+INSTR Funktion
+INT Funktion
+KILL Anweisung
+LEFT$ Funktion
+LEN Funktion
+LET Anweisung
+LINE Anweisungsbestandteil
+LOC nicht implementiert
+LOG Funktion
+LPOS Funktion
+LPRINT Anweisung
+LSET Anweisung
+MID$ Anweisung/Funktion
+MKD$ Funktion
+MKI$ Funktion
+MOD Operator
+NAME Anweisung
+NEXT Anweisung
+NOT Operator
+OCT$ Funktion
+ON Anweisung
+OPEN nicht implementiert
+OPTION Anweisung
+OR Operator
+OUT nicht implementiert
+POS Funktion
+PRINT Anweisung
+PUT nicht implementiert
+RANDOMIZE Anweisung
+READ Anweisung
+REM Anweisung
+RESTORE Anweisung
+RESUME nicht implementiert
+RETURN Anweisung
+RIGHT$ Funktion
+RND Funktion
+RSET Anweisung
+SGN Funktion
+SIN Funktion
+SPACE$ Funktion
+SPC Funktion
+SQR Funktion
+STEP Anweisungsbestandteil
+STOP Anweisung
+STR$ Funktion
+STRING$ Funktion
+SUB Anweisungsbestandteil
+SWAP Anweisung
+TAB Anweisungsbestandteil
+TAN Funktion
+THEN Anweisungsbestandteil
+TIME$ Funktion
+TIMER Funktion
+TO Anweisungsbestandteil
+TROFF Anweisung
+TRON Anweisung
+USING Anweisungsbestandteil
+USR Funktion
+VAL Funktion
+WAIT nicht implementiert
+WEND Anweisung
+WHILE Anweisung
+WIDTH Anweisung
+WRITE Anweisung
+XOR Operator
+#page#
+#head#
+EUMEL-BASIC-Compiler Anhang B: Vom Scanner erkannte Symboltypen %
+
+#end#
+
+Anhang B: Vom #ib(3)#Scanner#ie(3)# erkannte #ib(3)#Symbol­
+typen#ie(3)#
+
+ Der Scanner (ein Paket des EUMEL-BASIC-Systems) hat die Aufgabe, den Pro­
+grammtext Zeichen für Zeichen durchzugehen und auszulesen ('scannen'). Dabei
+werden die Zeichen immer zu logischen Gruppen, sogenannten #on("i")#Symbolen#off("i")# zusammen­
+gefaßt. Diese Symbole werden dann dem eigentlichen Compilerprogramm geliefert.
+Der Scanner entscheidet nach recht komplizierten Regeln, welche Zeichen aus der
+Quelldatei zu einem Symbol zusammengefaßt werden. Dennoch soll in diesem An­
+hang der Begriff des Symbols etwas näher erklärt werden, da der Anwender (vor allem
+bei den Fehlermeldungen) mit Symboltypen konfrontiert wird.
+
+
+
+Reservierte Wörter
+#on ("b")#
+Anfangszeichen:#off ("b")# Buchstaben
+#on ("b")#
+Folgezeichen:#off ("b")# Buchstaben
+#on ("b")#
+Beispiele:#off ("b")# PRINT, VAL, TAB, SUB, TO
+#on ("b")#
+Vergleiche:#off ("b")# Anhang A
+
+
+
+Operatoren
++ - * / \ ^ MOD
+NOT AND OR XOR EQV IMP
+< > = <= >= <>
+
+#on ("b")#
+Vergleiche:#off ("b")# Kapitel 4.4.
+
+
+
+numerische Konstanten
+#on ("b")#
+Anfangszeichen:#off ("b")# Ziffern 0 bis 9, Dezimalpunkt '.'
+#on ("b")#
+Folgezeichen:#off ("b")# zusätzlich: 'd', 'D', 'e' oder 'E', am Schluß auch '%', '!' oder '\#'
+#on ("b")#
+Beispiele:#off ("b")# 1.0, 1.256d123, 12!
+#on ("b")#
+Vergleiche:#off ("b")# Kapitel 4.2.
+
+
+
+TEXT-Konstanten
+#on ("b")#
+Anfangszeichen:#off ("b")# Anführungszeichen
+#on ("b")#
+Folgezeichen:#off ("b")# Alle Zeichen, sogar Doppelpunkte, Apostrophe und Steuerzei­
+ chen. Anführungszeichen dürfen #on("i")#innerhalb#off("i")# von
+ TEXT-Konstanten nicht vorkommen. Eine
+ TEXT-Konstante #on("i")#muß#off("i")# aber mit einem Anfüh­
+ rungszeichen enden.
+#on ("b")#
+Beispiele:#off ("b")# "tadellos", "!?': alles mögliche"
+#on ("b")#
+Vergleiche:#off ("b")# Kapitel 4.2.
+
+
+
+Variablen
+#on ("b")#
+Anfangszeichen:#off ("b")# Buchstaben
+#on ("b")#
+Folgezeichen:#off ("b")# zusätzlich: Punkt '.', Ziffern 0 bis 9, Zeichen '$', '%', '!' und '\#'
+#on ("b")#
+Beispiele:#off ("b")# zeiger, A$, Zahl!, n%, var\#4.3%
+#on ("b")#
+Vergleiche:#off ("b")# Kapitel 4.3.
+
+
+
+Felder/Feldelemente
+wie Variablen, jedoch gefolgt von '(', den Indexangaben und ')'
+#on ("b")#
+Beispiele:#off ("b")# zeiger (3), A$ (pointer), Zahl! (7), n% (a, b, c + d)
+#on ("b")#
+Vergleiche:#off ("b")# Kapitel 4.3.
+
+
+
+Benutzer-definierte Funktionen
+#on ("b")#
+Anfangszeichen:#off ("b")# FN
+#on ("b")#
+Folgezeichen:#off ("b")# Buchstaben, Punkt '.', Ziffern 0 bis 9,
+ Zeichen '$', '%', '!' und '\#'
+#on ("b")#
+Beispiele:#off ("b")# FNfunct, FNgauss%, FNf!4.5.6d\#
+#on ("b")#
+Vergleiche:#off ("b")# Kapitel 4.5.
+
+
+
+EOS (End of Statement, Anweisungsende)
+Doppelpunkt ':'
+
+#on ("b")#
+Vergleiche:#off ("b")# Kapitel 4.1.
+
+
+
+EOL (End of Line, Zeilenende)
+Apostrophzeichen ' oder Ende der Dateizeile
+EOL bedeutet gleichzeitig auch EOS
+
+#on ("b")#
+Vergleiche:#off ("b")# Kapitel 4.1.
+
+
+
+EOF (End of File, Dateiende)
+Ende der Quelldatei
+EOF bedeutet gleichzeitig auch EOL (und somit auch EOS)
+
+#on ("b")#
+Vergleiche:#off ("b")# Kapitel 4.1.
+
+
+
+Trennzeichen
+Alle bisher nicht genannten Zeichen werden vom Scanner als Trennzeichen behan­
+delt. In BASIC benötigte Trennzeichen sind das Komma (','), das Semikolon (';') sowie
+die beiden runden Klammern '(' und ')'.
+Zeichen mit Codes kleiner als 32 (Steuerzeichen) werden vom Scanner überlesen.
+#page#
+#head#
+EUMEL-BASIC-Compiler Anhang C: Übersicht über die Fehlermeldungen %
+
+#end#
+
+Anhang C: Übersicht über die Fehlermeldungen
+
+
+Übersicht über die verwendeten Fehlermeldungen zur
+Übersetzungszeit
+Diese Übersicht enthält alle zur Übersetzungszeit möglichen Fehler, mit Ausnahme
+der internen Fehler.
+Die Erläuterungen geben die üblichen Ursachen für die Fehlermeldung an. Es wird
+empfohlen, sich im Falle eines Fehlers außerdem in Kapitel 8 über die genaue Syntax
+der betreffenden Anweisung beziehungsweise Funktion zu informieren.
+
+
+#on ("b")#AS ohne NAME#off ("b")#
+AS darf nur in NAME-Anweisungen vorkommen.
+
+#on ("b")#Accessrecht VAR erwartet, CONST gefunden#off ("b")#
+Beim Aufruf einer ELAN-Prozedur (CALL, CHAIN oder USR) wurde ein VAR-Para­
+meter verlangt. Angegeben wurde aber ein CONST-Parameter (zum Beispiel ein
+Ausdruck).
+
+#on ("b")#Ausdruck erwartet#off ("b")#
+Es wurde ein numerischer oder TEXT-Ausdruck erwartet. Diese Fehlermeldung
+erscheint zum Beispiel, wenn nach einem Operator kein Ausdruck mehr gefunden
+wird.
+
+#on ("b")#BASE ohne OPTION#off ("b")#
+BASE darf nur in OPTION BASE-Anweisungen vorkommen.
+
+#on ("b")#Bei SWAP nur gleiche Variablentypen erlaubt#off ("b")#
+Mit SWAP können nur Variablen von genau dem gleichen Typ bearbeitet werden.
+
+#on ("b")#Das Feld ist bereits dimensioniert#off ("b")#
+Diese Fehlermeldung erscheint bei DIM-Anweisungen, wenn das Feld vorher schon
+explizit oder automatisch dimensioniert wurde.
+
+#on ("b")#ELSE ohne IF#off ("b")#
+ELSE darf nur in IF-Anweisungen vorkommen. ELSE muß in der gleichen Zeile
+stehen wie die zugehörige IF-Anweisung.
+
+#on ("b")#Falsche Felddimension:
+Dimensioniert in ... Dimensionen, gefundene Anzahl Indizes: ...#off ("b")#
+Beim Zugriff auf ein Feldelement wurden zu viele oder zu wenig Indizes angegeben.
+
+#on ("b")#FOR ohne NEXT#off ("b")#
+Diese Fehlermeldung erscheint, wenn am Programmende für eine FOR-Anweisung
+kein korrespondierendes NEXT gefunden wurde.
+
+#on ("b")#Falsche Reihenfolge der Zeilennummern#off ("b")#
+Die Zeilennummern wurden nicht in aufsteigender Reihenfolge angegeben.
+
+#on ("b")#Falscher Typ#off ("b")#
+Es wurde ein anderer Datentyp erwartet als angegeben, und es konnte keine automa­
+tische Konvertierung vorgenommen werden.
+
+#on ("b")#Falscher Typ der Operanden#off ("b")#
+Bei einem dyadischen Operator wurden Operanden angegeben, für deren Typen
+dieser Operator nicht definiert ist (vergleiche Kapitel 4.4.).
+
+#on ("b")#Falscher Typ des Operanden#off ("b")#
+Bei einem monadischen Operator wurde ein Operand angegeben, für dessen Typ
+dieser Operator nicht definiert ist (vergleiche Kapitel 4.4.).
+
+#on ("b")#Fehlerhafte Bereichsangabe#off ("b")#
+Diese Fehlermeldung kann bei den Anweisungen DEFDBL, DEFINT, DEFSNG und
+DEFSTR auftreten, wenn bei einer Bereichsangabe der Buchstabe vor dem Binde­
+strich im Alphabet nach dem Buchstaben hinter dem Bindestrich steht.
+
+#on ("b")#Fehlerhafte Dimensionierung: Die Obergrenze muß >= 1 sein#off ("b")#
+Es wurde versucht, ein Feld mit dem größten Index null in einer Dimension zu
+dimensionieren, obwohl die Index-Untergrenze mit OPTION BASE auf eins einge­
+stellt war.
+
+#on ("b")#Fehlerhafte Laufvariable#off ("b")#
+Nach einer NEXT-Anweisung wurde eine Laufvariable gefunden, die nicht zur letzten
+anhängigen FOR-Anweisung gehört. Der Fehler tritt auf, wenn Schleifen geschachtelt
+wurden.
+
+#on ("b")#Fehlerhafte Zeilennummer#off ("b")#
+Die Zeilennumer entspricht nicht der Syntax für Zeilennumern.
+
+#on ("b")#Fehlerhafter Funktionsaufruf#off ("b")#
+- Die Prozedur liefert keinen Wert
+ Es wurde versucht, eine Prozedur mit USR aufzurufen, die keinen Wert liefert.
+- Der Typ des Resultats ist nicht erlaubt, gefunden: ...
+ Es wurde versucht, eine Prozedur mit USR aufzurufen, die ein Objekt liefert,
+ dessen Datentyp in BASIC nicht bekannt ist.
+- Kein Argument erwartet
+ Es wurde versucht, eine benutzer-definierte Funktion, die ohne Parameter definiert
+ wurde, mit Argument(en) aufzurufen.
+- ... Argument(e) erwartet
+ Die Anzahl der angegebenen Argumente ist kleiner als die Anzahl der bei der
+ Funktionsdefinition angegebenen Parameter.
+- Nur ... Argument(e) erwartet
+ Die Anzahl der angegebenen Argumente ist größer als die Anzahl der bei der Funk­
+ tionsdefinition angegebenen Parameter.
+- Kein Resultat erlaubt (gefunden: ...)
+ Bei CALL oder CHAIN wurde versucht, eine wertliefernde Prozedur aufzurufen.
+
+#on ("b")#Funktionsaufruf ohne Zusammenhang#off ("b")#
+Es wurde ein Funktionsaufruf angegeben, wo eine Anweisung erwartet wurde.
+
+#on ("b")#GO ohne TO oder SUB#off ("b")#
+Das reservierte Wort GO kann nur in GO SUB oder GO TO auftreten.
+
+#on ("b")#Interner Fehler#off ("b")#
+Bei der Übersetzung wurde innerhalb des Compilerprogramms ein interner Fehler
+ausgelöst. (vergleiche Kapitel 7.1.)
+
+#on ("b")#Nach OPTION BASE ist nur 0 oder 1 erlaubt#off ("b")#
+Es wurde versucht, eine Zahl > 1 nach OPTION BASE anzugeben.
+
+#on ("b")#NEXT ohne FOR#off ("b")#
+Es wurde eine NEXT-Anweisung gefunden, die keiner FOR-Anweisung zuzuordnen
+ist, da keine "offenen" FOR-Schleifen mehr anhängig sind.
+
+#on ("b")#Nicht implementiert#off ("b")#
+Einige reservierte Wörter werden vom BASIC-Compiler erkannt, obwohl die zugehö­
+rigen Anweisungen oder Funktionen nicht implementiert sind (vgl. Anhang A).
+
+#on ("b")#Parametervariable kommt mehrmals vor#off ("b")#
+Bei der Definition einer "user function" kommt ein Parameter in der Parameterliste
+mehr als einmal vor.
+
+#on ("b")#Rekursive Funktionsdefinition#off ("b")#
+Es wurde versucht, in der Definition einer "user function" die zu definierende Funk­
+tion aufzurufen.
+
+#on ("b")#STEP ohne FOR#off ("b")#
+STEP darf nur in FOR-Anweisungen vorkommen.
+
+#on ("b")#SUB ohne GO#off ("b")#
+SUB darf nur in GOSUB vorkommen.
+
+#on ("b")#Syntaxfehler: <nähere Fehlerangabe>#off ("b")#
+Wenn dieser Fehler erscheint, wurde vom Compiler eine Angabe gefunden, die nach
+den Syntaxregeln dort nicht erwartet wurde oder fehlerhaft ist.
+
+#on ("b")#TAB ohne (L)PRINT#off ("b")#
+TAB darf nur in PRINT- und LPRINT-Anweisungen vorkommen.
+
+#on ("b")#THEN ohne IF#off ("b")#
+THEN darf nur in IF-Anweisungen vorkommen. THEN muß in der gleichen Zeile
+stehen wie die zugehörige IF-Anweisung.
+
+#on ("b")#TO ohne Zusammenhang#off ("b")#
+TO darf nur in FOR-Anweisungen oder in GO TO vorkommen.
+
+#on ("b")#Text zu lang#off ("b")#
+Dieser Fehler erscheint, wenn ein Anführungszeichen fehlt beziehungsweise ein
+Anführungszeichen zu viel gefunden wird.
+
+#on ("b")#Unbekannte Funktion, Argument(e) angegeben: ...#off ("b")#
+Es wurde versucht, eine Funktion mit einem Argument aufzurufen, für dessen Typ die
+Funktion nicht definiert ist.
+
+#on ("b")#Unbekannte Prozedur, Parameter angegeben: ...#off ("b")#
+Die angegebene Prozedur konnte mit den angegebenen Parametertypen nicht gefun­
+den werden.
+
+#on ("b")#Undefinierte 'user function'#off ("b")#
+Es wurde versucht, eine benutzer-definierte Funktion aufzurufen, die (noch) nicht
+definiert wurde.
+
+#on ("b")#USING ohne (L)PRINT#off ("b")#
+USING darf nur in PRINT- und LPRINT-Anweisungen vorkommen.
+
+#on ("b")#WEND ohne WHILE#off ("b")#
+Es wurde eine WEND-Anweisung gefunden, die keiner WHILE-Anweisung zuzuord­
+nen ist, da keine "offenen" WHILE-Schleifen mehr anhängig sind.
+
+#on ("b")#WHILE ohne WEND#off ("b")#
+Diese Fehlermeldung erscheint, wenn am Programmende für eine WHILE-Anweisung
+kein korrespondierendes WEND gefunden wurde.
+
+#on ("b")#Zeile mit dieser Nummer existiert nicht#off ("b")#
+Es wurde versucht, mit GOTO oder GOSUB zu einer Zeilennumer zu verzweigen, die
+im Programm nicht angegeben wurde.
+
+
+
+
+Übersicht über die innerhalb des BASIC-Systems
+ausgelösten Laufzeitfehler
+Die meisten Laufzeitfehler werden auch bei BASIC-Programmen im EUMEL-System
+erzeugt (vergleiche Kapitel 7.2.). Einige werden aber innerhalb des BASIC-Systems
+erzeugt. Die nachfolgende Übersicht enthält die innerhalb des BASIC-Systems aus­
+gelösten Fehler mit Angabe des gelieferten Fehlercodes und der Fehlermeldung.
+
+#on ("b")#Fehlercode:#off ("b")# 1003
+#on ("b")#Fehlermeldung:#off ("b")# RETURN ohne GOSUB
+Eine RETURN-Anweisung wurde gefunden, obwohl keine GOSUB-Anweisung mehr
+anhängig war.
+
+
+#on ("b")#Fehlercode:#off ("b")# 1004
+#on ("b")#Fehlermeldung:#off ("b")# RESTORE: Keine DATA-Anweisung in oder nach
+#right#Zeile ... gefunden
+Eine RESTORE-Anweisung konnte nicht ausgeführt werden, weil in oder nach der in
+der Anweisung angegebenen Zeilennummer keine DATA-Anweisung mehr steht.
+
+
+#on ("b")#Fehlercode:#off ("b")# 1005
+#on ("b")#Fehlermeldung:#off ("b")# bei ^: negative Basis, gebrochener Exponent: ...
+Es wurde versucht, eine negative Zahl mit einer gebrochenen Zahl zu potenzieren.
+
+
+#on ("b")#Fehlercode:#off ("b")# 1005
+#on ("b")#Fehlermeldung:#off ("b")# USING: kein Format gefunden
+Bei einer PRINT USING-Anweisung wurde kein Format für die Ausgabe angegeben
+oder die Formatzeichenkette enthält keine Formatzeichen.
+
+
+#on ("b")#Fehlercode:#off ("b")# 1005
+#on ("b")#Fehlermeldung:#off ("b")# USING-Format fehlerhaft: ...
+Bei einer PRINT USING-Anweisung wurde ein fehlerhaftes Format angegeben.
+
+
+#on ("b")#Fehlercode:#off ("b")# 1004
+#on ("b")#Fehlermeldung:#off ("b")# Keine Daten mehr für READ
+Es stehen keine Daten mehr für die READ-Anweisung zur Verfügung; der READ-
+DATA-Zeiger zeigt hinter das Ende der letzten DATA-Anweisung.
+
+
+#on ("b")#Fehlercode:#off ("b")# 1005
+#on ("b")#Fehlermeldung:#off ("b")# WIDTH: negative Angabe: ...
+Nach WIDTH wurde eine negative Zahl gefunden.
+
+
+#on ("b")#Fehlercode:#off ("b")# 1013
+#on ("b")#Fehlermeldung:#off ("b")# READ: Falscher Datentyp, ... ist kein INT
+Einer INT-Variablen konnte kein Wert zugewiesen werden, da das aktuelle Objekt
+aus der DATA-Liste keine gültige Darstellung eines INT-Wertes war oder ein
+"quoted string" gefunden wurde.
+
+
+#on ("b")#Fehlercode:#off ("b")# 1013
+#on ("b")#Fehlermeldung:#off ("b")# READ: Falscher Datentyp, ... ist kein REAL
+Einer REAL-Variablen konnte kein Wert zugewiesen werden, da das aktuelle Objekt
+aus der DATA-Liste keine gültige Darstellung eines REAL-Wertes war oder ein
+"quoted string" gefunden wurde.
+
+
+#on ("b")#Fehlercode:#off ("b")# 1051 (interner Fehler)
+#on ("b")#Fehlermeldung:#off ("b")# variierend
+Bei der Ausführung des Programms trat in einer Prozedur des BASIC-Systems ein
+interner Fehler auf. (Vergleiche Kapitel 7.)
+
+
+#on ("b")#Fehlercode:#off ("b")# 1080
+#on ("b")#Fehlermeldung:#off ("b")# INPUT-Fehler ( Fehlerart ) : > Eingabezeile <
+Bei einer INPUT-Anweisung, die auf eine mit 'sysin' eingestellte Datei wirken sollte,
+kam es zu einem Fehler der angegebenen Fehlerart. Nach dem Doppelpunkt wird die
+Eingabezeile aus der Eingabedatei ausgegeben.
+#page#
+#head#
+EUMEL-BASIC-Compiler Anhang D: ELAN-Prozeduren des Compilers %
+
+#end#
+
+Anhang D: ELAN-Prozeduren des Compilers
+
+ #on ("b")#PROC #ib(3)#basic#ie(3)# (TEXT CONST dateiname)#off ("b")#
+ Das in der Datei 'dateiname' enthaltene BASIC-Programm wird dem BASIC-
+ Compiler zur Übersetzung übergeben. Werden keine Fehler gefunden, so wird das
+ Programm direkt nach der Übersetzung ausgeführt.
+ Beispiel:
+
+ basic ("Mein liebstes BASIC-Programm")#off ("b")#
+
+
+ #on ("b")#PROC basic (TEXT CONST dateiname, prozedurname)#off ("b")#
+ Das in der Datei 'dateiname' enthaltene BASIC-Programm wird dem BASIC-
+ Compiler zur Übersetzung übergeben. Werden keine Fehler gefunden, dann wird
+ das Programm unter dem Namen 'prozedurname' dauerhaft eingetragen (inser­
+ tiert).
+ Das Programm wird nicht ausgeführt. Beachten Sie, daß der Prozedurname den
+ Vorschriften für ELAN-Prozedurnamen entsprechen muß und außerdem #on ("b")#keine
+ Leerzeichen#off ("b")# enthalten darf. (Zur Namenswahl siehe auch Kapitel 3.)
+ Beispiel:
+
+ basic ("Mein liebstes BASIC-Programm", "liebstesprogramm")#off ("b")#
+
+
+
+ #on ("b")#PROC #ib(3)#basic list#ie(3)# (BOOL CONST status)#off ("b")#
+ Mit der Prozedur 'basic list' kann eingestellt werden, ob die gerade vom Compiler
+ übersetzten Programmzeilen angezeigt werden sollen oder nicht (vergleiche Kapitel
+ 3.).
+
+ basic list (TRUE)#off ("b")#: Die übersetzten Zeile werden angezeigt
+ basic list (FALSE)#off ("b")#: Die übersetzten Zeile werden nicht angezeigt
+
+
+ #on ("b")#PROC #ib(3)#basic page#ie(3)# (BOOL CONST status)#off ("b")#
+ Mit der Prozedur 'basic page' kann eingestellt werden, wie die Ausgaben von
+ BASIC-Programmen behandelt werden, wenn der Bildschirm voll ist (vergleiche
+ Kapitel 5, Steuerung der Bildschirmausgaben).
+
+ basic page (TRUE): Beim Erreichen des Bildschirmendes wird auf einen
+ Tastendruck gewartet (vgl. Kap. 5.)
+ basic page (FALSE): Beim Erreichen des Bildschirmendes wird 'gescrollt'.
+
diff --git a/doc/basic/basic handbuch.index b/doc/basic/basic handbuch.index
new file mode 100644
index 0000000..4ac7e16
--- /dev/null
+++ b/doc/basic/basic handbuch.index
@@ -0,0 +1,232 @@
+#page nr ("%",115)#
+#head#
+EUMEL-BASIC-Compiler Stichwortverzeichnis %
+
+#end#
+
+Stichwortverzeichnis
+
+>= 15
+\ 14
+- 14
++ 14
++ 15
+<= 15
+* 14
+/ 14
+= 15
+> 15
+< 15
+<> 15
+^ 14
+ABS 31
+AND 16
+Anführungszeichen 10
+Argument 21
+Arithmetische Operatoren 14
+Arrays 13
+ASC 32
+ATN 32
+Äquivalenz-Verknüpfung 17
+Aufruf benutzer-definierter Funktionen 21
+Aufruf und Steuerung des BASIC-Compilers 5
+basic 5, 113
+BASIC-Compiler ERROR 28
+basic list 6, 113
+basic page 25, 114
+benutzer-definierte Funktionen 19, 104
+Bildschirmausgaben 25
+CALL 23, 33
+CDBL 35
+CHAIN 23, 35
+CHR$ 35
+CINT 36
+CLS 36
+Codebereichs pro Task 27
+Compiler Error 304 26
+Compiler Error 307 26
+Compiler Error 308 26
+COS 37
+CSRLIN 37
+CVD, CVI 38
+DATA 38
+DATE$ 40
+Datentypen 10
+Datentyp INT 10
+Datentyp REAL 10
+Datentyp TEXT 10
+Debugging 6
+DEFDBL, DEFINT, DEFSNG, DEFSTR 40
+DEF FN 19, 28, 42
+Definition benutzer-definierter Funktionen 19
+DEFINT 12
+DEFSTR 12
+DIM 13, 43
+Dimensionen 13
+Doppelpunkt 8
+ELSE 54
+END 45
+EOF 56
+EOF (End of File, Dateiende) 7, 105
+EOL (End of Line, Zeilenende) 8, 105
+EOS (End of Statement, Anweisungsende) 8, 105
+EQV 17
+ERL 46
+ERM$ 47
+ERR 47
+ERROR 48
+EUMEL-Coder 26
+EUMEL-Textdatei 7
+Exklusiv-ODER-Verknüpfung 17
+EXP 49
+Exponent 10
+Fehlerbehandlung 28
+Fehlercodes 30
+Fehlerzeile 30
+Fehler zur Laufzeit 30, 111
+Fehler zur Übersetzungszeit 28, 106
+Felder (Arrays) 13
+Felder/Feldelemente 104
+Feldnamen 13
+FIX 49
+FOR 50
+FRE 51
+Funktionen 19
+Funktionsaufrufe 19
+Ganzzahlen 10
+Generatorprogramm 4
+Gleitkommazahlen 10
+GOSUB 52
+GOTO 53
+Grenzen des Compilers 26
+Groß-/Kleinschreibung 9
+Hauptdurchlauf 28
+HEX$ 54
+Hochkomma 8
+IF 54
+IMP 17
+Implikations-Verknüpfung 17
+Indizes 13
+INKEY$ 56
+INPUT$ 58
+INPUT 56
+Insertieren von BASIC-Programmen 5
+Installation des BASIC-Compilers 4
+INSTR 59
+INT 59
+Interne Compilerfehler 28
+INTs 10
+INT-Überlauf 15
+KILL 60
+Konstanten 10
+Konvertierung 15, 22
+Kriterien für den Typ einer Variablen 12
+Labels 26
+Leerzeichen 9
+LEFT$ 60
+LEN 61
+LET 61
+LINE INPUT 62
+LOG 63
+Logische Operatoren 16
+LPOS 63
+LPRINT 64
+LSET 65
+Mantisse 11
+MID$ 65, 66
+MKD$, MKI$ 67
+MOD 14
+Modulgrenze 26
+NAME 68
+Namenstabelle 27
+Negation 16
+negative Zahlenwerte 11
+NEXT 50, 68
+NOT 16
+Notation 3
+Notebook 28
+numerische Konstanten 103
+OCT$ 69
+ODER-Verknüpfung 17
+ON 69
+Operatoren 103
+Operatoren, arithmetische 14
+Operatoren, logische 16
+Operatoren, Text- 15
+Operatoren, Vergleichs- 15
+Operator, Zuweisungs- 18
+OPTION BASE 13, 71
+OR 17
+Parameter 19
+POS 72
+PRINT 72
+Prioritäten der Operanden 18
+Programmdatei 7
+Programmsegmente 24
+Programmzeile 7
+RANDOMIZE 75
+READ 75
+REM 77
+Reservierte Wörter 9, 12, 100, 103
+RESTORE 77
+RETURN 78
+RIGHT$ 79
+RND 80
+RSET 81
+Scanner 9, 103
+Schlüsselwörter 9
+Scrolling 25
+SGN 81
+SIN 82
+SPACE$ 82
+SPC 83
+SQR 83
+Standard-Funktionen 19
+STEP 50
+Steuerung der Bildschirmausgaben 25
+Steuerung des BASIC-Compilers 5
+STOP 84
+STR$ 84
+STRING$ 85
+SUB 52
+SWAP 86
+Symbol 9
+Symboltypen 103
+Syntax 7
+sysout 6
+TAB 64, 72
+TAN 86
+Texte 10
+TEXT-Konstanten 104
+Text-Operator + 15
+THEN 54
+TIME$ 88
+TIMER 87
+TO 50, 53
+Trennzeichen 105
+TRON / TROFF 88
+Typanpassung 22
+UND-Verknüpfung 16
+USING 64, 72
+USR 23, 90
+Übersetzen von BASIC-Programmen 5
+Übersichtlichkeit von BASIC-Programmen 7
+VAL 91
+Variablen 12, 104
+Variablennamen 9, 12
+VAR-Parameter 23
+Vergleichsoperatoren 15
+Vordurchlauf 28
+Vorzeichen 11
+Wahrheitswerte 16
+Weitere Schreibregeln 9
+WEND 92
+wertliefernden Prozeduren 23
+WHILE 92
+WIDTH 93
+WRITE 94
+XOR 17
+Zahlen 10
+Zeilennummer 7
+Zuweisungsoperator 18
+
diff --git a/doc/dialog/gs-dialog handbuch.impressum b/doc/dialog/gs-dialog handbuch.impressum
new file mode 100644
index 0000000..b470fe4
--- /dev/null
+++ b/doc/dialog/gs-dialog handbuch.impressum
@@ -0,0 +1,89 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#gs-Dialog
+
+
+
+
+#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#
+
+#free (4.0)##on("b")#
+#center#gs-Dialog
+
+
+#center#Benutzerhandbuch
+
+
+#center#Version 1.0
+
+
+#off("b")##center#copyright
+#center#Eva Latta-Weber
+#center#Software- und Hardware-Systeme, 1988
+#center#ERGOS GmbH, 1990
+#page#
+#block#
+#center#____________________________________________________________________________
+
+
+Copyright:  ERGOS GmbH   März 1990
+
+ Alle Rechte vorbehalten. Insbesondere ist die Überführung in
+ maschinenlesbare Form sowie das Speichern in Informations­
+ systemen, auch auszugsweise, nur mit schriftlicher Einwilligung
+ der ERGOS GmbH gestattet.
+
+
+#center#____________________________________________________________________________
+
+Es kann keine Gewähr übernommen werden, daß das Programm für eine
+bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
+Anwender.
+
+Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
+Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
+Handbuch kann jederzeit ohne Ankündigung geändert werden.
+
+Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
+ erstellt und aufbereitet und auf einem Kyocera Laser­
+ drucker gedruckt.
+
+
+
+
+#center#___________________________________________________________________________
+
+
+
+Ergonomic Office Software GmbH
+
+Bergstr. 7 Telefon: (02241) 63075
+5200 Siegburg Teletex: 2627-2241413=ERGOS
+ Telefax: (02241) 63078
+
+
+#center#____________________________________________________________________________
+
+
diff --git a/doc/dialog/gs-dialog-1 b/doc/dialog/gs-dialog-1
new file mode 100644
index 0000000..59b98c3
--- /dev/null
+++ b/doc/dialog/gs-dialog-1
@@ -0,0 +1,107 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (3)#
+#headodd#
+#center#gs-DIALOG#right#%
+
+#end#
+#headeven#
+%#center#gs-DIALOG
+
+#end#
+
+#center#1
+
+#center#Was kann gs-DIALOG?
+
+
+
+ In diesem Kapitel wollen wir Ihnen erläutern, was
+#on("b")#gs-DIALOG#off("b")# Ihnen für Vorteile bringen soll. Sie haben
+sicher schon mit einem Computer gearbeitet und sich
+mehrfach darüber geärgert, daß Sie mit jedem neuen Pro­
+gramm auch eine neue Bedienung erlernen müssen. Zwar
+sind Sie als EUMEL-Anwender schon sehr verwöhnt, da das
+System sehr homogen ist und bestimmte Systemelemente,
+wie z.B. der Editor, mit immer gleicher Bedienung immer
+wieder auftauchen. Für die jeweiligen Anwendungspro­
+gramme aber gibt es eine Reihe von Kommandos und Tasten­
+folgen, die Sie sich für die Bedienung merken müssen.
+Brauchen Sie Informationen zu den einzelnen Programm­
+teilen, so müssen Sie zumeist in (den gerade nicht griff­
+bereiten) Handbüchern nachschlagen.
+ Und der Anfänger? Er ist am härtesten betroffen! Er
+muß sich nicht nur mit der neuen Maschine auseinander­
+setzen, die technische Handhabung erlernen - von ihm
+erwartet man, daß er sich innerhalb kurzer Zeit eine Rei­
+he von Kommandos einprägt, die für die Bedienung des
+Grundsystems notwendig sind - und darüber hinaus noch
+die Kommandos für die verschiedenen Anwendungsprogram­
+me. Viele resignieren nach den ersten Gehversuchen.
+ Und der Programmierer? Viele Anwender haben keine
+Vorstellung davon, welche Arbeit in einem Programm
+steckt. Einen großen Teil seiner Arbeit verwendet der
+Programmierer darauf, die Benutzerschnittstelle zu ge­
+stalten - den Teil des Programms, mit dem der Anwender in
+Kontakt kommt, über den er mit dem Programm kommuni­
+ziert, einen Dialog führt. Die Gestaltung und Pflege der
+Benutzerschnittstelle kann dabei bis zu 50% der Gesamt­
+arbeit an einem Programm ausmachen.
+
+ #on("b")#gs-DIALOG#off("b")# ist entwickelt worden, um diese Nachteile zu
+beheben bzw. zumindest zu verringern. Grundelemente von
+#on("b")#gs-DIALOG#off("b")# sind die Pull-Down-Menus (Klappmenus), in de­
+nen die zur Verfügung stehenden Funktionen übersicht­
+lich zur Auswahl angeboten werden. So ist es möglich, daß
+eine Vielzahl von Funktionen verwaltet werden - ohne
+daß der Anwender den Überblick verliert. Dabei können zu
+jeder angebotenen Funktion noch Informationen abge­
+rufen werden, so daß ein Blättern in Handbüchern sich
+zumeist erübrigt.
+ Zunächst einmal ist #on("b")#gs-DIALOG#off("b")# gar kein eigenständiges
+Programm. Es ist vielmehr ein Baukastensystem, auf das
+andere Programme zugreifen können. Davon können sowohl
+der Programmierer und erst recht der Anwender profi­
+tieren:
+ Der Programmierer wird bei seiner Arbeit - insbeson­
+dere bei der Gestaltung der Benutzerschnittstelle we­
+sentlich entlastet, da er auf vorgefertigte Komponenten
+zurückgreifen kann. Er kann sich mehr auf die inhalt­
+liche Ausgestaltung seiner Programme konzentrieren.
+ Sie als Anwender profitieren von der #on("u")#einfachen#off("u")# und
+#on("u")#immer einheitlichen Bedienung#off("u")# solcher Programme. Aus
+den Menupunkten können Sie auf einfache Weise auswählen
+und den gewünschten Teil des Programms zur Ausführung
+bringen. Durch diese Bedienung wird der Aufwand, sich in
+ein neues Programmsystem einzuarbeiten, erheblich redu­
+ziert. Die zur Verfügung stehenden Programmfunktionen
+können effektiver ausgenutzt werden, da sie jederzeit
+offensichtlich sind. Informationen zu den einzelnen Pro­
+grammpunkten können Sie jederzeit abrufen, d.h. zumeist
+können Sie auf ein Nachschlagen in den Handbüchern ver­
+zichten.
+ #on("b")#gs-DIALOG#off("b")# ist aber nicht nur ein Baukastensystem, auf
+das andere Programme zugreifen können. Bei nahezu jeder
+Anwendung ist es notwendig, Dateien auf das Archiv zu
+schreiben oder von dort zu holen. Aus diesem Grunde ist
+eine leistungsfähige, komfortable Archivbehandlung in
+das Programmsystem integriert.
+ Ein Austausch von Dateien ist aber nicht nur mit dem
+Archiv möglich. Sie können auch mit anderen Tasks inner­
+halb Ihres Systems (z.B. mit der Vatertask) oder sogar -
+sofern installiert - mit einer Task irgendwo innerhalb
+des EUMEL-Netzes Dateien austauschen. Daneben werden
+noch Funktionen angeboten, die den Umgang mit den Da­
+teien vereinfachen (Verzeichnis, Umbenennen, Kopieren,
+Löschen, Aufräumen etc.).
+ Diese Funktionen stehen Ihnen unabhängig von ande­
+ren Programmen zu Verfügung, sobald Sie #on("b")#gs-DIALOG#off("b")# in­
+stalliert haben. Andererseits finden Sie diese Funktionen
+in immer gleicher Form auch in den meisten Programmen,
+die auf der Basis von #on("b")#gs-DIALOG#off("b")# entwickelt worden sind
+und entwickelt werden.
+
+
+
+
+
diff --git a/doc/dialog/gs-dialog-2 b/doc/dialog/gs-dialog-2
new file mode 100644
index 0000000..a25d35d
--- /dev/null
+++ b/doc/dialog/gs-dialog-2
@@ -0,0 +1,215 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (6)#
+#headodd#
+#center#gs-DIALOG#right#%
+
+#end#
+#headeven#
+%#center#gs-DIALOG
+
+#end#
+
+#center#2
+
+#center#Installation von gs-DIALOG
+
+
+
+ Bevor Sie #on("b")#gs-DIALOG#off("b")# auf Ihrem System benutzen kön­
+nen, müssen Sie das Programm zunächst installieren. Wenn
+#on("b")#gs-DIALOG#off("b")# auf Ihrem System schon zur Verfügung steht,
+können Sie dieses Kapitel ruhig überspringen.
+
+
+2.1 Voraussetzungen:
+
+ Um #on("b")#gs-DIALOG#off("b")# auf Ihrem Computer betreiben zu können,
+muß das EUMEL-Betriebssystem installiert sein. #on("b")#gs-DIALOG#off("b")#
+setzt die Multi-User-Version voraus und ist lauffähig ab
+Version 1.7.5.
+
+
+2.2 Lieferumfang
+
+ #on("b")#gs-DIALOG#off("b")# wird auf einer Diskette geliefert, die alle
+notwendigen Programme enthält. Um den Inhalt der Dis­
+kette feststellen zu können, starten Sie Ihr System und
+bringen es dazu, daß 'gib kommando:' erscheint. Dann legen
+Sie die Diskette ein und geben das Kommando:
+
+ archive ("gs-DIALOG"); list (archive);
+ release (archive) <RETURN>
+
+ Anschließend erscheint eine Übersicht der auf dem
+Archiv vorhandenen Programme. Folgende Programme soll­
+ten sich in der Übersicht befinden:
+
+ "gs-DIALOG MENUKARTEN MANAGER"
+ "gs-DIALOG MM/gen"
+ "gs-DIALOG 1"
+ "gs-DIALOG 2"
+ "gs-DIALOG 3"
+ "gs-DIALOG 4"
+ "gs-DIALOG 5"
+ "gs-DIALOG 6"
+ "gs-DIALOG 7"
+ "gs-MENUKARTE:Archiv"
+ "gs-DIALOG/gen"
+
+ Eventuell können noch weitere Namen auf der Diskette
+vorhanden sein. Wenn Sie den Inhalt der Diskette kon­
+trolliert haben und diese Programme auf der Diskette
+vorhanden sind, können Sie #on("b")#gs-DIALOG#off("b")# installieren.
+ Sollten Sie statt der Übersicht eine Fehlermeldung
+erhalten, überprüfen Sie bitte, ob die Diskette das rich­
+tige Format besitzt oder ob ihr Diskettenlaufwerk Pro­
+bleme macht. Sollten dagegen Programme fehlen, so rekla­
+mieren Sie die Diskette.
+
+
+2.3 Installation
+
+Die Installation erfolgt in #on("u")#zwei Schritten#off("u")#:
+ #on("u")#Zunächst#off("u")# muß eine Task eingerichtet werden, in der
+später alle Menukarten aufbewahrt werden. Diese Menu­
+karten enthalten alle Informationen, die #on("b")#gs-DIALOG#off("b")# für
+den Aufbau und den Umgang mit den Menus benötigt. #on("u")#Der
+Name dieser Task ist vorgegeben#off("u")# ('gs-MENUKARTEN'), da
+#on("b")#gs-DIALOG#off("b")# später auf diese Task zugreift. Sollten Sie
+hier einen anderen Namen wählen, so wird die Task vom
+Generierungsprogramm automatisch umbenannt, um die
+Funktionsfähigkeit von #on("b")#gs-DIALOG#off("b")# zu garantieren!
+ #on("u")#Anschließend#off("u")# kann das Programmsystem selbst in einer
+anderen Task installiert werden. Wie nehmen hier an, daß
+die Task den Namen 'MENU' erhalten soll. (Sie können für
+diese Task auch einen beliebigen anderen Namen wählen.)
+
+
+1) #on("u")#Einrichten der 'Menukarten - Task'#off("u")#
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+#off("b")#
+
+ --> gib supervisor kommando:
+
+#on("b")#
+ begin ("gs-MENUKARTEN") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+
+
+ (Arbeiten mehrere Personen mit dem Computer, dann ist
+es sinnvoll, diese Task vor unbefugtem Zugriff durch ein
+Passwort zu schützen. Wie das gemacht wird, können Sie in
+Ihrem EUMEL-Benutzerhandbuch erfahren.)
+ Legen Sie dann die Archivdiskette ein, auf der sich
+#on("b")#gs-DIALOG#off("b")# befindet, und geben Sie die folgenden Komman­
+dos:
+
+#on("b")#
+ archive("gs-DIALOG") <RETURN>
+
+ fetch("gs-DIALOG MM/gen",archive) <RETURN>
+
+ run <RETURN>
+#off("b")#
+
+ Sie haben damit das Generatorprogramm gestartet; die
+Installation wird automatisch durchgeführt. Lassen Sie
+während des gesamten Vorgangs die Archivdiskette einge­
+legt. Die Generierung ist beendet, wenn der EUMEL-
+Eingangsbildschirm erscheint.
+
+2) #on("u")#Installation des Programmsystems#off("u")#
+
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+#off("b")#
+
+ --> gib supervisor kommando:
+
+#on("b")#
+ begin ("MENU") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+
+
+ (Sichern Sie, wenn gewünscht, auch diese Task durch
+ein Passwort vor unbefugtem Zugriff.)
+ Legen Sie die #on("b")#gs-DIALOG#off("b")#-Archivdiskette ein und geben
+Sie die folgenden Kommandos:
+
+#on("b")#
+ archive("gs-DIALOG") <RETURN>
+
+ fetch("gs-DIALOG/gen",archive) <RETURN>
+
+ run <RETURN>
+#off("b")#
+
+ Sie haben damit das Generatorprogramm gestartet. Die
+Generierung benötigt jetzt aber wesentlich mehr Zeit als
+die zuvor! Lassen Sie während des gesamten Vorgangs die
+Archivdiskette eingelegt. Die Generierung ist beendet,
+wenn der EUMEL-Eingangsbildschirm erscheint. Die Task,
+in der die Generierung stattfindet, wird automatisch zur
+Managertask, das heißt, daß Söhne von ihr eingerichtet
+werden können. Damit ist die Installation von #on("b")#gs-DIALOG#off("b")#
+abgeschlossen - in allen Sohn- und Enkeltasks können
+Sie nun mit dem Kommando:
+
+#on("b")#
+ archiv <RETURN>
+#off("b")#
+
+die Archivverwaltung aufrufen.
+
+
+2.4 Nutzung der 'Semi-Graphik-Zeichen'
+
+ #on("b")#gs-DIALOG#off("b")# verwendet beim Aufbau der Rahmen inner­
+halb der Menus nur solche Zeichen, die auf jedem Computer
+zur Verfügung stehen. Die meisten Computer/Terminals
+verfügen aber über einen Zeichensatz, der es erlaubt,
+solche Rahmen "schöner" darzustellen. #on("b")#gs-DIALOG#off("b")# ist dar­
+auf vorbereitet, diese Eigenschaften auszunutzen.
+ Allerdings ist der Aufruf dieser Graphikzeichen nicht
+einheitlich festgelegt. Verfügen Sie über einen Computer,
+der 'IBM - kompatibel' ist, oder über ein Terminal 'Beehive
+FT20', dann können Sie die Graphikzeichen ganz einfach
+nutzen, denn dafür sind im Programm bereits Befehle vor­
+bereitet.
+
+ibm  graphic char <RETURN> - Mit diesem Befehl stel­
+ len Sie für #on("b")#gs-DIALOG#off("b")#
+ den 'IBM - Graphikzei­
+ chensatz' ein.
+
+ft20 graphic char <RETURN> - Mit diesem Befehl stel­
+ len Sie für #on("b")#gs-DIALOG#off("b")#
+ den 'Beehive FT20 -
+ Graphikzeichensatz'
+ ein.
+
+std  graphic char <RETURN> - Mit diesem Befehl stel­
+ len Sie wieder den
+ 'Standard - Graphik­
+ zeichensatz' ein.
+
+ Nehmen Sie eine solche Einstellung in einer Task vor,
+so erben alle Sohn- und Enkeltasks diese Einstellung. Sie
+können auch in verschiedenen Task unterschiedliche Ein­
+stellungen wählen.
+
+ Verfügen Sie über andere Computer- oder Terminalty­
+pen, die Grapikzeichen darstellen können, so können Sie
+diese ebenfalls nutzen. Sie müßten sich allerdings ein
+kleines ELAN-Programm schreiben. Aber auch das ist ganz
+einfach, da #on("b")#gs-DIALOG#off("b")# auch darauf vorbereitet ist. Wie
+das gemacht wird, wird aber erst in Kapitel 5 erläutert.
+
diff --git a/doc/dialog/gs-dialog-3 b/doc/dialog/gs-dialog-3
new file mode 100644
index 0000000..044720b
--- /dev/null
+++ b/doc/dialog/gs-dialog-3
@@ -0,0 +1,683 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (12)#
+#headodd#
+#center#gs-DIALOG#right#%
+
+#end#
+#headeven#
+%#center#gs-DIALOG
+
+#end#
+
+#center#3
+
+#center#Umgang mit den Menus
+
+
+#center#Eine Beispielsitzung
+
+
+ Wie schon oben erwähnt, ist in #on("b")#gs-DIALOG#off("b")# eine Archiv­
+verwaltung integriert. Anhand dieses Programms möchten
+wir den Umgang mit und die Arbeitsweise von #on("b")#gs-DIALOG#off("b")#
+vorstellen. Als Beispiel wollen wir eine Datei von einer
+Ihrer Archivdisketten ins System holen.
+ Zunächst zu den Begriffen: Die Disketten, die Sie in den
+Rechner einlegen können, um z.B. Dateien (und Programme)
+von anderen Computern übernehmen zu können, bezeichnet
+man als #on("u")#Archiv#off("u")#. Das Archiv (die Diskette) wird benutzt, um
+Daten und Programme vor Beschädigung und Verlust zu
+sichern. Es ist sehr wichtig, daß Sie Ihre Programme und
+Daten auf Archivdisketten sichern, denn ein einziger
+Hardwarefehler könnte die Arbeit von vielen Stunden
+zunichte machen.
+ Da man diese Operationen, d.h. Programme und Daten
+auf Disketten zu sichern und wieder von dort zu holen,
+sehr häufig benötigt, ist die Archivbehandlung fest in
+das #on("b")#gs-DIALOG#off("b")#-Programmsystem integriert und Bestandteil
+nahezu jeden Programms, das unter #on("b")#gs-DIALOG#off("b")# entwickelt
+wird. Unabhängig von anderen Programmen kann die
+Archivbehandlung aber auch benutzt werden, sobald
+#on("b")#gs-DIALOG#off("b")# installiert ist. Das wollen wir jetzt auspro­
+bieren.
+
+
+3.1 Aufruf der Archivverwaltung:
+
+ Richten Sie eine Task als Sohn der Task ein, in der Sie
+#on("b")#gs-DIALOG#off("b")# installiert haben. Nehmen wir hier an, die neue
+Task soll den Namen 'TEST' erhalten - die Task, in der
+#on("b")#gs-DIALOG#off("b")# installiert ist, habe den Namen 'MENU'.
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+#off("b")#
+ --> gib supervisor kommando:
+#on("b")#
+ begin ("TEST","MENU") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+#on("b")#
+ archiv <RETURN>
+#off("b")#
+
+ Mit dem Befehl 'archiv' können Sie jederzeit die Archiv­
+behandlung aufrufen - es erscheint dann folgendes Menu:
+
+
+#on("b")#
+ARCHIV: Dateien Archiv
+-+-------------------+----------------------------------------------------
+ | v Verzeichnis |
+ | --------------- |
+ | l Löschen |
+ | d Drucken |
+ | --------------- |
+ | k Kopieren |
+ | u Umbenennen |
+ | --------------- |
+ | s Speicherplatz |
+ | a Aufräumen |
+ +-------------------+
+
+
+
+
+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+
+3.2 Bedienung des Menusystems
+
+- Aufbau der Menus (Bildschirmaufbau)
+
+ Ein Menu ist ein Angebot von Funktionen, die ein Pro­
+gramm ausführen kann. Aus diesem Angebot kann der Pro­
+grammbenutzer auswählen. In diesem Sinne ist ein solches
+Menu durchaus vergleichbar mit einer Speisenkarte in
+einem Restaurant.
+ Jedes Menu unter #on("b")#gs-DIALOG#off("b")# besitzt eine 'Kopfzeile'
+und eine 'Fußzeile'. In der Kopfzeile ist ganz links der
+Name des Programms angegeben, mit dem Sie gerade arbei­
+ten. Daneben enthält die Kopfzeile die 'Oberbegriffe', mit
+denen die einzelnen Untermenus angesprochen werden
+können. Maximal können hier zehn Oberbegriffe auftau­
+chen - in unserem Beispiel sind es nur zwei.
+ Besondere Bedeutung für die Bedienung der Menus
+kommt der Fußzeile zu. Einerseits wird hier jeweils ange­
+zeigt, welche Tasten Sie zum jeweiligen Zeitpunkt benut­
+zen können, andererseits erhalten Sie über diese Fußzeile
+auch Informationen, wenn #on("b")#gs-DIALOG#off("b")# "mit sich selbst be­
+schäftigt ist", d.h. Operationen ausführt. Wissen Sie also
+nicht mehr weiter, so schauen Sie zuerst auf die Fußzeile
+und beachten Sie die hier stehenden Informationen.
+ Im Bereich zwischen der Kopf- und Fußzeile werden die
+Untermenus ausgegeben. Dieser Bereich wird auch dazu
+benutzt, um Informationen an den Benutzer einzublenden,
+Fragen an ihn zu richten, ihn aus einem Angebot (z.B. von
+Dateien) auswählen zu lassen und vieles mehr.
+ Treiben wir den Vergleich mit der Speisenkarte in ei­
+nem Restaurant noch ein wenig weiter. Bei einem großen
+Angebot kann eine Speisenkarte recht umfangreich wer­
+den. Denken Sie beispielsweise an eine Speisenkarte in
+einem chinesischen Restaurant. Dazu sind neben den an­
+gebotenen Gerichten oft noch Zusatzinformationen (Zube­
+reitungsart, Zutaten etc.) angegeben. Um dem Gast die Aus­
+wahl zu erleichtern, ist die Speisenkarte aber zumeist
+untergliedert; man findet Suppen, warme Vorspeisen, kalte
+Vorspeisen, Gerichte mit Schweinefleisch, mit Rindfleisch,
+mit Geflügel, mit Fisch etc.
+ Ein Computerprogramm kann, ebenso wie ein Restau­
+rant, dem Benutzer ein großes Angebot (an Programmfunk­
+tionen) machen. Von großem Nachteil ist allerdings, daß
+ein Computerbildschirm - im Gegensatz zu einer umfang­
+reichen Speisenkarte - viel zu klein ist, um alle Angebote
+und Informationen gleichzeitig darstellen zu können.
+Außerdem würde ein nahezu vollständig beschriebener
+Bildschirm sehr unübersichtlich sein.
+ Aus diesem Grunde haben wir uns entschlossen, immer
+nur einen Teil des vorhandenen Angebotes an Funktionen
+und der vorhandenen Informationen anzuzeigen - immer
+nur soviel, daß Sie sich auf dem Bildschirm orientieren
+können und den Überblick nicht verlieren. Dazu haben Sie
+die Möglichkeit, jeweils zu bestimmen, auf welche Infor­
+mationen Sie Ihre Aufmerksamkeit richten wollen, was Sie
+angezeigt bekommen möchten.
+
+
+- Auswahl der Menupunkte
+
+ Zu jedem Oberbegriff in der Kopfzeile gehört eine
+Liste von Funktionen, die das Programm dazu zur Auswahl
+anbietet. Allerdings ist immer nur eine Liste (ein Unter­
+menu) sichtbar. Das sichtbare Untermenu gehört immer zu
+dem Oberbegriff in der Kopfzeile, der invers dargestellt
+ist. Wir wollen uns zunächst das Untermenu zum zweiten
+Oberbegriff ('Archiv') anzeigen lassen. Zum Wechsel zwi­
+schen den Oberbegriffen in der Kopfzeile benutzt man die
+Pfeiltasten <links> oder <rechts>. Probieren Sie es einmal
+aus. Es erscheint das folgende Bild auf dem Bildschirm:
+
+
+#on("b")#
+ARCHIV: Dateien Archiv
+-------+-------------------------+----------------------------------------
+ | r Reservieren |
+ | - Neue Diskette |
+ | --------------------- |
+ | - Schreiben |
+ | - Checken |
+ | - Kombination |
+ | - Holen/Lesen |
+ | - Löschen |
+ | --------------------- |
+ | - Verzeichnis |
+ | - Drucken |
+ | --------------------- |
+ | i Initialisieren |
+ | z Zieltask einstellen |
+ +-------------------------+ +---------------------+
+ | Dateiaustausch mit: |
+ | Archiv |
+ | Archivname: |
+ | --- |
+ +---------------------+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+
+ Sie können jetzt sehen, daß ein anderer Oberbegriff in
+der Kopfzeile aktiviert, d.h. invers dargestellt ist. Dane­
+ben wurde noch das sichtbare Untermenu "eingeklappt"
+und ein anderes "ausgeklappt". Man könnte die Unterme­
+nus deshalb auch als 'Klappmenus' bezeichnen - gebräuch­
+lich ist allerdings die Bezeichnung 'Pull-Down-Menus', an
+die wir uns auch halten wollen.
+
+ Sicher haben Sie bemerkt, daß es einen Augenblick
+gedauert hat, bis das Pull-Down-Menu unter dem Menu­
+punkt 'Archiv' erschien. Das hat auch seine Ursache, denn
+#on("b")#gs-DIALOG#off("b")# muß einige Einstellungen vornehmen, die etwas
+Zeit in Anspruch nehmen. Neben dem Pull-Down-Menu ist
+unten rechts auf dem Bildschirm noch ein 'Kasten' sicht­
+bar geworden. Er dient Ihnen zur Information. Da
+#on("b")#gs-DIALOG#off("b")# nicht nur den Austausch von Dateien mit dem
+Archiv, sondern auch mit anderen Tasks ermöglicht, wird
+hier immer angezeigt, mit welcher Task der Dateiaus­
+tausch zur Zeit erfolgt. Ist das Archiv eingestellt, so
+wird auch noch der Name der Diskette angezeigt - aber
+erst wenn das Archiv angemeldet worden ist, was ja mo­
+mentan noch nicht der Fall ist. Deshalb werden nur drei
+Striche ausgegeben.
+ Sicher ist Ihnen das Grundprinzip der Menubehand­
+lung schon klar geworden: Sie müssen sich zuerst inner­
+halb der Kopfzeile für einen Oberbegriff entscheiden.
+Zum gewählten Oberbegriff wird dann jeweils das Angebot
+an zugehörigen Programmfunktionen im darunterstehen­
+den Pull-Down-Menu angezeigt. Dieses Vorgehen hat den
+Vorteil, daß man den kleinen Bildschirm im Prinzip "mehr­
+fach nutzen kann". Die Pull-Down-Menus können sich ja
+ruhig überlappen. Sie merken es gar nicht, da ja nicht
+alle gleichzeitig angezeigt werden.
+ Noch ein Vorteil ist da, Sie können sich auf den Teil
+konzentrieren, für den Sie sich gerade interessieren und
+werden nicht durch andere Informationen abgelenkt. An­
+dererseits können Sie jederzeit auch an die Funktionen
+und Informationen gelangen, die gerade nicht sichtbar
+sind.
+ Sie haben sicher bemerkt, daß nicht nur innerhalb der
+Kopfzeile ein Begriff invers dargestellt ist, sondern
+auch einer innerhalb jedes Pull-Down-Menus. Nachdem man
+sich für einen Oberbegriff entschieden hat, kann man
+nämlich noch zwischen den Funktionen innerhalb des
+Pull-Down-Menus wählen.
+ Da das Pull-Down-Menu zum Oberbegriff 'Archiv' noch
+einige Besonderheiten aufweist, wollen wir uns die Funk­
+tionsweise zuerst am Pull-Down-Menu unter dem Oberbe­
+griff 'Dateien' verdeutlichen. Bitte wechseln Sie deshalb
+durch Betätigung der Pfeiltaste <links> oder <rechts> zum
+ersten Pull-Down-Menu zurück.
+ Ähnlich wie in der Kopfzeile, können Sie auch inner­
+halb des Pull-Down-Menus zu einem anderen Punkt wech­
+seln. Das geschieht durch die Pfeiltasten <hoch> und
+<runter>. Dabei werden 'Trennlinien' innerhalb des Pull-
+Down-Menus, die nur der Untergliederung dienen, über­
+sprungen. Vom obersten Menupunkt gelangt man direkt
+zum untersten und umgekehrt. Probieren Sie es einmal
+aus.
+
+
+- Informationen zu einem Menupunkt.
+
+ Zu jedem Punkt eines Pull-Down-Menus können Sie In­
+formationen abrufen. Das ist ganz einfach, denn Sie
+brauchen sich nur auf den gewünschten Menupunkt zu
+begeben (die Pfeiltasten so betätigen, bis der betreffende
+Menupunkt im Pull-Down-Menu invers dargestellt wird).
+Anschließend betätigen Sie die Fragezeichentaste (<?>).
+ Auf dem Bildschirm erscheint ein Kasten in den die
+Informationen zum Menupunkt eingetragen sind. Zwar wird
+dadurch ein Teil des Bildschirms überschrieben, doch kei­
+ne Angst - sobald Sie auf irgendeine Taste tippen, wird
+der alte Bildschirmzustand wieder hergestellt! Ebenso wie
+die Pull-Down-Menus sind diese Informationen normaler­
+weise verborgen. Auf Anforderung werden sie aber sicht­
+bar - ja es wäre gar nicht möglich alle vorhandenen In­
+formationen gleichzeitig auf dem Bildschirm darzustel­
+len. Es wäre auch unsinnig, denn man benötigt diese In­
+formationen zumeist nur, wenn man sich in das Programm
+einarbeitet. Später, wenn Ihnen der Umgang mit dem Pro­
+gramm vertraut ist, sind diese Informationen überflüssig
+und würden, wenn sie immer sichtbar wären, nur stören.
+
+
+- Informationen zur Bedienung des Menus
+
+ Alles das, was hier ausführlich beschrieben ist, kön­
+nen Sie auch in Kurzform auf dem Bildschirm erfahren,
+denn auch die Informationen, wie das Menu bedient wird,
+sind jeweils im Menu vorhanden. Möchten Sie diese Infor­
+mationen auf dem Bildschirm sehen, so tippen Sie die
+Tastenfolge <ESC><?>, d.h. erst die Taste 'ESC' und dann die
+Fragezeichentaste. Danach erscheint folgender Kasten
+auf dem Bildschirm:
+
+#on("b")#
+ +---------------------------------------+
+ | gs-DIALOG |
+ | |
+ | e ... Erläuterungen (allgemein) |
+ | w ... Wahl eines Menupunktes |
+ | a ... Aktivieren des Menupunktes |
+ | b ... Besondere Tasten / Menuende |
+ | |
+ | z ... Zurück in das Menu |
+ | |
+ | e w a b z |
+ +---------------------------------------+
+#off("b")#
+
+ Wenngleich die Informationen kurz gefaßt sind, so
+haben sie doch nicht alle gleichzeitig auf dem Bildschirm
+Platz. Aus diesem Grunde werden Sie aufgefordert, sich
+weiter zu entscheiden, welche Informationen Sie haben
+möchten. Sie können zwischen mehreren Alternativen wäh­
+len. Die Reihenfolge spielt keine Rolle; Sie können auch
+Informationen mehrmals aufrufen.
+ Der Aufruf kann auf zweierlei Weise erfolgen: Entwe­
+der Sie bewegen mit den Pfeiltasten <links> oder <rechts>
+die Markierung in der letzten Zeile des Kastens auf den
+Buchstaben, der vor dem von Ihnen gewünschten Punkt
+steht und tippen anschließend auf die <RETURN>-Taste
+oder Sie tippen direkt die entsprechende Buchstabentaste
+(z.B. <e>). Beide Vorgehensweisen sind zulässig und haben
+die gleiche Wirkung.
+ Daraufhin werden die gewünschten Informationen
+sichtbar. Durch Tippen irgendeiner Taste verschwinden
+die Informationen wieder vom Bildschirm und sichtbar
+wird wieder der oben abgebildete 'Verteiler'. Erst wenn
+man den Punkt 'z ... Zurück in das Menu' wählt, verschwin­
+det auch dieser Kasten und man gelangt zurück in das
+Menu.
+
+
+- Aktivierbare und nicht aktivierbare Menupunkte
+
+ Wir wollen jetzt endlich unserer Absicht nachgehen,
+eine Datei vom Archiv zu holen. Dazu wechseln wir zuerst
+wieder zum Oberbegriff 'Archiv' in der Kopfzeile. Nach
+kurzer Zeit erscheint das Ihnen schon bekannte Pull-
+Down-Menu. Wenn Sie hier versuchen, die einzelnen Menu­
+punkte innerhalb des Pull-Down-Menus anzusteuern, so
+werden Sie feststellen, daß das nicht möglich ist. Alle
+Menupunkte, die ein Minuszeichen ('-') vor der Bezeichnung
+haben, können nicht angewählt werden. Diese Menupunkte
+sind zur Zeit nicht aktivierbar. Solche Menupunkte kön­
+nen in Menus häufiger auftreten.
+ Das kann mehrere Ursachen haben: Einerseits könnte
+auf diese Weise ein Programmierer ein komplettes Menu
+entwerfen, das schon alle Funktionen zeigt, wenn auch die
+zugehörigen Programme dazu noch nicht fertig sind. Das
+ist aber in unserem Falle nicht so. Hier ist die Ursache
+eine andere: Bevor man im EUMEL-System auf das Archiv­
+laufwerk zugreifen kann, muß man es erst für sich re­
+servieren. Dadurch wird sichergestellt, daß nicht gleich­
+zeitig mehrere Benutzer auf eine Archivdiskette zugrei­
+fen und ggf. Dateien unbeabsichtigt zerstören. Erst wenn
+das Laufwerk reserviert worden ist, kann man auf die
+Diskette zugreifen. Das wird im Menu durch die nicht ak­
+tivierbaren Punkte zum Ausdruck gebracht.
+
+
+- Aktivieren von Menupunkten
+
+ Wir müssen also zuerst das Archiv reservieren. Auch
+hier gibt es (zumeist) zwei Möglichkeiten, den gewünsch­
+ten Menupunkt zu aktivieren. Entweder Sie sorgen durch
+Bedienung der Pfeiltasten dafür, daß der gewünschte
+Menupunkt invers dargestellt wird und betätigen an­
+schließend die <RETURN>-Taste oder - sofern vor dem Me­
+nupunkt ein einzelner Buchstabe oder eine Ziffer aufge­
+listet ist - tippen Sie einfach auf die zugehörige Buch­
+staben- oder Zifferntaste. Tippen Sie hier die Taste <r>.
+ Warten Sie einen Moment, denn es wird überprüft, ob
+das Laufwerk von einer anderen Task benutzt wird. Ist
+dies der Fall, erhalten Sie darüber auf dem Bildschirm
+eine Meldung. Ansonsten wird an Sie die Frage gerichtet,
+ob die Diskette eingelegt ist. Wenn diese Frage erscheint,
+befindet sich das Laufwerk schon "in Ihrem Besitz". Erst
+jetzt ist es sinnvoll, wenn auch andere auf das Laufwerk
+zugreifen können, die Diskette in das Laufwerk zu legen.
+Erst wenn die Frage auf dem Bildschirm erscheint, können
+Sie sicher sein, daß keine andere Task mehr auf das Lauf­
+werk zugreifen kann. Legen Sie also beim Erscheinen der
+Frage eine Ihrer EUMEL-Archivdisketten in das Laufwerk
+und bejahen Sie anschließend die gestellte Frage, indem
+Sie die Taste <j> tippen. (Sie können aber auch - wie schon
+in vorausgehenden Situationen - die Inversdarstellung
+innerhalb des Kastens, in dem die Frage auf dem Bild­
+schirm dargestellt wird, auf das 'Ja' positionieren und
+anschließend die <RETURN>-Taste tippen.)
+ #on("b")#gs-DIALOG#off("b")# ermittelt jetzt den Namen der eingelegten
+Diskette und zeigt diesen im Kasten rechts unten auf dem
+Bildschirm an. Außerdem werden die zuvor nicht aktiver­
+baren Punkte aktivierbar gemacht. Das kann man daran
+erkennen, daß auf dem Bildschirm die Minuszeichen vor
+den betreffenden Menupunkten verschwinden (und Buch­
+staben sichtbar werden).
+ Lassen Sie sich zunächst ein Inhaltsverzeichnis der
+Diskette anzeigen. Dazu brauchen Sie nur den Menupunkt
+'v Verzeichnis' wählen. Wie das gemacht wird wissen Sie ja
+schon. Sie können dabei beobachten, daß vor dem Menu­
+punkt das bisherige Zeichen verschwindet und ein Stern
+(*) sichtbar wird. Daran kann man erkennen, daß #on("b")#gs-DIALOG#off("b")#
+den Auftrag bereits ausführt.
+ Es dauert einen Moment, bis das Verzeichnis erstellt
+ist - anschließend wird es auf dem Bildschirm ausgegeben.
+Paßt das Verzeichnis nicht vollständig auf den Bild­
+schirm, so können Sie sich darin bewegen, blättern etc.,
+wie Sie es aus dem Editor gewohnt sind. Ebenso wird das
+Verzeichnis auch wie der Editor verlassen - durch die
+Tastenfolge <ESC><q> (das wird übrigens auch auf dem
+Bildschirm angezeigt!).
+
+
+- Dateiauswahl
+
+ Sie sollen jetzt eine Datei von der Archivdiskette in
+das System holen, d.h. genauer gesagt von der Diskette
+kopieren. Aktivieren Sie also auf gewohnte Weise den
+Menupunkt 'h Holen/Lesen'. Warten Sie anschließend einen
+Moment, denn #on("b")#gs-DIALOG#off("b")# erstellt eine Liste aller vorhan­
+denen Dateien auf der Diskette und bietet Sie Ihnen an­
+schließend so an, daß Sie komfortabel eine Auswahl tref­
+fen können.
+ Haben Sie die #on("b")#gs-DIALOG#off("b")#-Archivdiskette eingelegt, so
+zeigt sich etwa der folgende Bildschirm:
+
+
+#on("b")#
+ARCHIV: Dateien Archiv
+-------+-------------------------+--------------------------------------
+ +--------------------------------------------------------------------+
+ | Dateien holen/lesen (Archiv) |
+ | |
+ | Bitte alle Dateien ankreuzen, die 'geholt' werden sollen! |
+ |====================================================================|
+ | Auswahl m e h r e r e r Dateien durch Ankreuzen |
+ |....................................................................|
+ |==> o gs-DIALOG MENUKARTEN MANAGER" |
+ | o gs-DIALOG MM/gen |
+ | o gs-DIALOG 1 |
+ | o gs-DIALOG 2 |
+ | o gs-DIALOG 3 |
+ | o gs-DIALOG 4 |
+ | o gs-DIALOG 5 |
+ | o gs-DIALOG 6 |
+ | o gs-DIALOG 7 |
+ | o gs-MENUKARTE:Archiv |
+ |..................................................Weitere Dateien!..|
+ +--------------------------------------------------------------------+
+--|Info: <?> Fertig: <ESC><q> Abbrechen: <ESC><h> |
+In+--------------------------------------------------------------------+
+#off("b")#
+
+
+ Auf dem Archiv sind mehrere Dateien vorhanden. Alle
+werden Ihnen zur Auswahl angeboten. In der obersten
+Zeile wird zur Kontrolle die Funktion angezeigt, die Sie
+gerade gewählt haben. Sie können jetzt die Dateien, auf
+die sich die Operation beziehen sollen, in beliebiger Rei­
+henfolge ankreuzen. Wenn Sie abschließend die Auswahl
+verlassen, werden die Dateien in der Ankreuzreihenfolge
+bearbeitet (hier in die Task geholt).
+ Die Handhabung der Dateiauswahl ist ganz einfach. Der
+Pfeil gibt jeweils an, welche Datei aktuell behandelt
+wird. Zunächst wird vor den Namen jeweils nur ein 'o' aus­
+gegeben. Mit den Pfeiltasten <hoch> und <runter> können
+Sie nun mit dem Pfeil vor den Namen fahren, den Sie an­
+kreuzen möchten. Tippen Sie dann die Taste <x> oder
+<RETURN>, so erscheint in der Anzeige ein 'x' vor dem Na­
+men und eine Zahl, die angibt, die wievielte Datei Sie an­
+gekreuzt haben. Haben Sie sich versehen, so können Sie
+das Kreuz auch wieder löschen. Dazu fahren Sie einfach
+erneut vor den betreffenden Namen, wo ja jetzt ein 'x'
+steht, und tippen die Taste <o> (kleines 'o') oder <RUBOUT>.
+Dadurch wird das Kreuz entfernt und gegebenenfalls eine
+Umnumerierung der schon angekreuzten Dateinamen vor­
+genommen. Verlassen Sie jetzt die Auswahl mit der Tasten­
+folge <ESC><q>, so werden die Dateien nacheinander in der
+von Ihnen angekreuzten Reihenfolge in die Task kopiert.
+ Neben dieser Auswahl, in der #on("u")#m e h r e r e#off("u")# Dateien an­
+gekreuzt (ausgewählt) werden können, gibt es auch eine
+Auswahl, in der nur jeweils #on("u")#e i n e#off("u")# Datei angekreuzt wer­
+den darf. Das ist durch die entsprechende Beschriftung
+auf dem Bildschirm kenntlich gemacht. In einem solchen
+Fall wird die Auswahl nach Ankreuzen eines Namens #on("u")#auto­
+matisch#off("u")# verlassen, d.h. man braucht nicht <ESC><q> zu tip­
+pen!.
+ In einer Dateiauswahl können bis zu 200 Dateien ver­
+waltet werden. Da aber nicht alle Namen gleichzeitig auf
+dem Bildschirm angezeigt werden können, wird jeweils in
+der gepunkteten Zeile angezeigt, ob noch #on("u")#weitere Dateien#off("u")#
+in der Liste vorausgehen oder folgen. In unserem Beispiel
+geht als keine Datei voraus, es folgen aber noch weitere
+Dateien hinter der zuletzt angezeigten Datei.
+ Damit Sie noch komfortabler mit dieser Dateiauswahl
+arbeiten können, gibt es weitere Tastenfolgen die nütz­
+lich sein können. Wenn Sie die Fragezeichentaste (<?>) tip­
+pen, werden Sie auf dem Bildschirm angezeigt. Durch Tip­
+pen irgendeiner weiteren Taste können Sie weiterblättern
+bzw. in die Auswahl zurückgelangen. Folgende Tastenkom­
+mandos stehen Ihnen zur Verfügung:
+
+
+ Positionierungen:
+
+ hoch : zum vorausgehenden Namen
+ runter : zum folgenden Namen
+ HOP hoch : auf den ersten Namen der Seite
+ HOP runter : auf den letzten Namen der Seite
+ ESC 1 : auf den ersten Namen der Liste
+ ESC 9 : auf den letzten Namen der Liste
+
+
+ Auswahl treffen:
+
+ RETURN / x : diesen Namen ankreuzen
+(RUBOUT / o : Kreuz vor dem Namen löschen )
+(HOP RETURN/HOP x: alle folgenden Namen ankreuzen)
+(HOP RUBOUT/HOP o: alle folgenden Namen löschen )
+
+
+ Auswahl verlassen:
+
+ ESC q : Auswahl verlassen
+ ESC h : Auswahl abbrechen
+
+
+
+ Die in Klammern gesetzten Tastenfunktionen kann man
+nur verwenden, wenn die Auswahl #on("u")#mehrerer#off("u")# Dateien zuge­
+lassen ist.
+ Wie Sie sehen, orientiert sich die Bedienung an den
+Tastenfunktionen, die Ihnen schon aus dem Editor be­
+kannt sind. Haben Sie aus Versehen einen Menupunkt ge­
+wählt, so daß Ihnen eine solche Auswahl angeboten wird,
+so können Sie die Auswahl durch <ESC><h> (für 'halt') ab­
+brechen.
+
+
+- Ja/Nein - Fragen
+
+ An verschiedenen Stellen werden Fragen an Sie ge­
+richtet, die Sie mit 'ja' oder 'nein' beantworten müssen.
+Tippen Sie dazu entsprechend je nach Entscheidung die
+Taste <j> (für 'ja') bzw. <n> (für 'nein').
+
+
+- Eingaben
+
+ An einigen Stellen werden Sie aufgefordert, eine Ein­
+gabe zu machen (z.B. einen Dateinamen einzugeben). Sofern
+möglich wird Ihnen auch ein Vorschlag für die Eingabe
+gemacht (z.B. wenn Sie Dateien kopieren oder umbenennen
+wollen). Wenn Sie den gemachten Vorschlag akzeptieren,
+dann brauchen Sie zur Bestätigung nur die <RETURN>-
+Taste zu tippen.
+ Gefällt Ihnen der Vorschlag nicht oder wird Ihnen
+kein Vorschlag gemacht, so machen Sie bitte die ge­
+wünschte Angabe. Zum Schreiben stehen Ihnen alle aus dem
+Editor bekannten Funktionen zur Verfügung. Mit der
+Taste <RUBOUT> können Sie Buchstaben löschen, mit
+<RUBIN> einfügen. Die Eingabe wird durch Tippen der
+<RETURN>-Taste abgeschlossen.
+ Ist der von Ihnen gewünschte Name schon in Ihrer Task
+vorhanden und steht in der Fußzeile der Hinweis 'Zeigen:
+<ESC><z>', dann können Sie sich auch alle vorhandenen
+Namen zur Auswahl anbieten lassen und durch Ankreuzen
+den beabsichtigten Namen auswählen.
+
+
+- Alternativen
+
+ Ihnen können auch mehrere Alternativen angeboten
+werden, zwischen denen Sie wählen müssen. In der unter­
+sten Zeile eines solchen Kastens, in denen Ihnen die Al­
+ternativen auf dem Bildschirm eingeblendet werden, sind
+die Möglichkeiten aufgeführt, die darüber beschreiben
+sind. Mit den Pfeiltasten können sie die Markierung auf
+die gewünschte Alternative positionieren und dann durch
+die <RETURN>-Taste zur Ausführung bringen. (Manchmal
+ist das auch durch Tippen der den Alternativen vorange­
+stellten Buchstaben oder Ziffern möglich).
+
+
+- Verlassen des Menus
+
+ Das Menu kann insgesamt mit der Tastenfolge <ESC><q>
+verlassen werden. Damit das nicht versehentlich ge­
+schieht, wird zur Sicherheit die Frage gestellt, ob Sie das
+Menu tatsächlich verlassen wollen. Verneinen Sie die
+Frage, verbleiben Sie im Menu, ansonsten gelangen Sie
+zurück in die 'gib kommando:' - Ebene.
+
+ Mit dieser Beispielsitzung haben Sie jetzt schon fast
+alle Arten des Umgangs mit #on("b")#gs-DIALOG#off("b")# kennengelernt.
+Sicher ist dies beim ersten Mal sehr verwirrend. Mit den
+folgenden vier grundsätzlichen Regeln können Sie
+#on("b")#gs-DIALOG#off("b")# aber immer bedienen:
+
+ 1. Achten Sie darauf, welche Tastenkombinationen in
+ der Fußzeile angegeben sind. Halten Sie sich daran!
+
+ 2. Rufen Sie - sofern vorhanden - die Hilfsfunktio­
+ nen mit <?> oder <ESC><?> auf. Damit erhalten Sie
+ weitere Informationen.
+
+ 3. Funktioniert eine Tastenkombination nicht (geben
+ Sie dem Rechner eine kurze Zeit zum Reagieren),
+ versuchen Sie die Tastenkombination <ESC><q> (Ver­
+ lassen) oder <ESC><h> (Abbruch). Falls sich darauf­
+ hin etwas ändert, verfahren Sie wie unter 1).
+
+ 4. Erfolgt noch immer keine Reaktion, tippen Sie die
+ <SV>-Taste und versuchen Sie das Programm mit
+ 'halt' zu stoppen. Führt auch das nicht zum Erfolg,
+ hat sich der Rechner "aufgehängt". Wenn Sie keine
+ Erfahrungen mit einer solchen Situation haben,
+ wenden Sie sich an Ihren Systembetreuer.
+
+
+3.3 Zusammenfassung/Kurzbeschreibung
+
+Menu: Sie können jede (aktive) Funktion inner­
+ halb eines Pull-Down-Menus mit den
+ Pfeiltasten anwählen und durch Tippen
+ der <RETURN>-Taste zur Ausführung
+ bringen. (Ersatzweise kann - sofern vor
+ dem Menupunkt ein Buchstabe oder eine
+ Ziffer angegeben ist - die Funktion
+ durch Tippen der entsprechenden Taste
+ direkt zur Ausführung gebracht werden.)
+ Zu jeder Funktion kann durch Tippen der
+ Fragezeichentaste eine Hilfestellung
+ angefordert werden. Gibt man die Tasten­
+ folge <ESC><?>, so wird die Bedienung des
+ Menus auf dem Bildschirm kurz erläutert.
+ Mit der Tastenfolge <ESC><q> wird das
+ Menu (nach einer Sicherheitsabfrage)
+ verlassen.
+
+Dateiauswahl: Hier können Sie die gewünschten Namen
+ mit <x> ankreuzen und das Kreuz mit <o>
+ wieder entfernen. Die Auswahl - sofern
+ mehrere Dateien ausgewählt werden kön­
+ nen - wird durch die Tastenfolge
+ <ESC><q> verlassen. Alle Möglichkeiten
+ der Bedienung werden angezeigt, wenn die
+ Fragezeichentaste getippt wird. Die Aus­
+ wahl wird abgebrochen (ohne Kreuze!),
+ wenn die Tastenfolge <ESC><h> eingege­
+ ben wird.
+
+Eingabe: Hier können Sie eine Zeile eingeben oder
+ eine Vorgabe ändern (wie im Editor). Ein­
+ fügen und Löschen mit RUBIN und RUBOUT.
+ Ist in der Fußzeile die Tastenfolge
+ '<ESC><z>: Zeigen' angegeben, so können
+ Sie darüber auch eine Auswahl anfor­
+ dern, in der Sie bereits vorhandene Na­
+ men nur anzukreuzen brauchen. Zumeist
+ ist auch ein Abbruch der Eingabe durch
+ die Tastenfolge <ESC><h> möglich.
+
+Frage: Beantworten Sie die an Sie gerichtete
+ Frage mit <j> oder <n>. Sie können auch
+ auf dem Bildschirm die Markierung auf
+ die gewünschte Antwort setzten und an­
+ schließend die <RETURN>-Taste tippen.
+
+Alternativen: Aus den angegebenen Möglichkeiten kön­
+ nen Sie eine auswählen, indem Sie entwe­
+ der die der Alternative vorangestellte
+ Taste tippen oder in der letzten Zeile des
+ Kastens die Markierung auf die ge­
+ wünschte Kennzeichnung positionieren
+ und anschließend die <RETURN>-Taste
+ tippen.
+
+Fehler: Die Meldung muß durch Tippen einer be­
+ liebigen Taste quittiert werden.
+
+Bitte warten: Der Rechner ist beschäftigt - keine
+ Taste tippen!
+
+
diff --git a/doc/dialog/gs-dialog-4 b/doc/dialog/gs-dialog-4
new file mode 100644
index 0000000..03d8dc4
--- /dev/null
+++ b/doc/dialog/gs-dialog-4
@@ -0,0 +1,672 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (30)#
+#headodd#
+#center#gs-DIALOG#right#%
+
+#end#
+#headeven#
+%#center#gs-DIALOG
+
+#end#
+#center#4
+
+#center#Beschreibung der Menufunktionen
+
+
+4.1 Menufunktionen zum Oberbegriff 'Dateien'
+
+ In diesem Kapitel werden alle die Menufunktionen be­
+schrieben, die Ihnen unter dem Obergeriff 'Dateien' im
+Menu angeboten werden.
+
+#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich einen Über­
+ blick über die in Ihrer Task vorhandenen Dateien ver­
+ schaffen.
+ Nach Aufruf dieser Funktion wird eine Liste der
+ Dateien auf dem Bildschirm ausgegeben, die sich in
+ Ihrer Task befinden. Da die Liste selbst eine Datei ist,
+ kann sie mit der Tastenkombination <ESC><q> verlassen
+ werden - hierauf wird auch in der Kopfzeile der Datei
+ hingewiesen. Falls nicht alle Dateien auf den Bild­
+ schirm passen, können Sie das Fenster mit <HOP><hoch>
+ bzw. <HOP><runter> rollen.
+
+#on("u")##on("b")#l Löschen#off("b")##off("u")#
+ Mit dieser Funktion können Sie Dateien, die Sie
+ nicht mehr benötigen, die unnötig Platz belegen, lö­
+ schen. Aber Vorsicht! Die Dateien verschwinden durch
+ diese Funktion unwiederbringlich!
+ Zunächst wird der Dateiname der Datei erfragt, die
+ gelöscht werden soll. Hier können Sie direkt den be­
+ treffenden Namen eingeben und die Eingabe mit
+ <RETURN> abschließen. Sie können sich aber auch durch
+ die Tastenfolge <ESC><z> (für 'zeigen') alle in der Task
+ vorhandenen Dateien zur Auswahl anbieten lassen und
+ dort einfach einen Namen ankreuzen.
+ Für jede einzelne Datei wird noch einmal zur
+ Sicherheit angefragt, ob diese auch tatsächlich ge­
+ löscht werden soll. Zur Bestätigung tippen Sie bitte
+ die Taste <j> ('ja') - zur Verhinderung die Taste <n>
+ ('nein').
+
+ Fehlerfälle:
+ - Eine Datei mit dem angegebenen Namen existiert
+ nicht.
+
+#on("u")##on("b")#d Drucken#off("b")##off("u")#
+ Mit dieser Funktion können Sie Dateien über einen
+ angeschlossenen Drucker ausdrucken lassen.
+ Zunächst wird der Dateiname der Datei erfragt, die
+ gedruckt werden soll. Hier können Sie direkt den be­
+ treffenden Namen eingeben und die Eingabe mit
+ <RETURN> abschließen. Sie können sich aber auch durch
+ die Tastenfolge <ESC><z> (für 'zeigen') alle in der Task
+ vorhandenen Dateien zur Auswahl anbieten lassen und
+ dort einfach einen Namen ankreuzen.
+ Die Datei(en) wird/werden anschließend zum Drucker
+ geschickt. Der Vorgang wird auf dem Bildschirm proto­
+ kolliert.
+
+ Fehlerfälle:
+ - Eine Datei mit dem angegebenen Namen existiert
+ nicht.
+ - Die Druckdatei hat einen falschen Typ zum Drucken
+ (ist nicht editierbar).
+ - Der Drucker ist nicht funktionsbereit.
+ - Der Drucker wird nicht über die Task 'PRINTER' be­
+ trieben.
+ - Auf Ihrem System werden die Druckkosten abge­
+ rechnet. Sie müssen sich mit einer Codenummer
+ identifizieren.
+
+#on("u")##on("b")#k Kopieren#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich eine (logische)
+ Kopie einer bereits im System vorhandenen Datei anle­
+ gen. Das ist z.B. dann sinnvoll, wenn Sie sich einen
+ bestimmten Stand einer Datei aufbewahren wollen.
+ Zunächst wird der Dateiname der Datei erfragt, die
+ kopiert werden soll. Hier können Sie direkt den be­
+ treffenden Namen eingeben und die Eingabe mit
+ <RETURN> abschließen. Sie können sich aber auch durch
+ die Tastenfolge <ESC><z> (für 'zeigen') alle in der Task
+ vorhandenen Dateien zur Auswahl anbieten lassen und
+ dort einfach einen Namen ankreuzen.
+ Anschließend wird dieser Name angezeigt und der
+ Name für die Kopie erfragt. Es muß ein Name eingetra­
+ gen werden, der in dieser Task noch nicht für eine
+ Datei vergeben wurde; ansonsten erfolgt ein Hinweis
+ darauf und es wird nicht kopiert!
+ Da man aber oft für die Kopie einen ähnlichen Na­
+ men wie für das Original wählt, wird der 'alte' Name
+ vorgeschlagen. Aus genannten Gründen muß er aber
+ verändert werden. Sie können diesen Namen mit den
+ üblichen Editierfunktionen verändern oder mit
+ <HOP><RUBOUT> löschen und ganz neu eingeben. Auf
+ diese Weise sparen Sie aber eine Menge Tipparbeit,
+ wenn Sie einen langen Namen nur an einer Stelle än­
+ dern wollen.
+
+ Fehlerfälle:
+ - Eine Datei mit dem angegebenen Namen existiert
+ nicht.
+ - Eine Datei mit dem gewünschten Namen existiert
+ bereits in der Task.
+
+#on("u")##on("b")#u Umbenennen#off("b")##off("u")#
+ Mit dieser Funktion können Sie einer bereits vor­
+ handenen Datei einen neuen Namen geben.
+ Zunächst wird der Dateiname der Datei erfragt, die
+ umbenannt werden soll. Hier können Sie direkt den
+ betreffenden Namen eingeben und die Eingabe mit
+ <RETURN> abschließen. Sie können sich aber auch durch
+ die Tastenfolge <ESC><z> (für 'zeigen') alle in der Task
+ vorhandenen Dateien zur Auswahl anbieten lassen und
+ dort einfach einen Namen ankreuzen.
+ Anschließend wird dieser Name angezeigt und der
+ zukünftige Name für die Datei erfragt. Es muß ein
+ Name eingetragen werden, der in dieser Task noch
+ nicht für eine Datei vergeben wurde; ansonsten er­
+ folgt ein Hinweis darauf und die Datei wird nicht
+ umbenannt!
+ Da man aber oft den 'neuen' Namen in Anlehnung an
+ den 'alten' Namen wählt, wird der 'alte' Name vorge­
+ schlagen. Aus genannten Gründen muß er aber verän­
+ dert werden. Sie können diesen Namen mit den üblichen
+ Editierfunktionen verändern oder mit <HOP><RUBOUT>
+ löschen und ganz neu eingeben. Auf diese Weise sparen
+ Sie aber eine Menge Tipparbeit, wenn Sie einen langen
+ Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Datei mit dem angegebenen Namen existiert
+ nicht.
+ - Eine Datei mit dem gewünschten Namen existiert
+ bereits in der Task.
+
+#on("u")##on("b")#s Speicherplatz#off("b")##off("u")#
+ Mit dieser Funktionen können Sie sich zu Ihrer
+ Information den Speicherbedarf anzeigen lassen, den
+ eine Datei auf dem Speichermedium einnimmt.
+ Zunächst wird der Dateiname der Datei erfragt,
+ deren Speicherplatz ermittelt werden soll. Hier kön­
+ nen Sie direkt den betreffenden Namen eingeben und
+ die Eingabe mit <RETURN> abschließen. Sie können sich
+ aber auch durch die Tastenfolge <ESC><z> (für 'zeigen')
+ alle in der Task vorhandenen Dateien zur Auswahl
+ anbieten lassen und dort einfach einen Namen ankreu­
+ zen.
+ Anschließend wird der belegte Speicherplatz der
+ ausgewählten Datei(en) auf dem Bildschirm angezeigt.
+ Die Größe wird in KB (Kilobyte) angegeben. Ein KB ent­
+ spricht etwa 1000 Zeichen, also einer halb vollge­
+ schriebenen Bildschirmseite.
+
+ Fehlerfälle:
+ - Eine Datei mit dem angegebenen Namen existiert
+ nicht.
+
+#on("u")##on("b")#a Aufräumen#off("b")##off("u")#
+ Wenn in einer Datei viel geändert wurde, wird der
+ Platzbedarf dieser Datei erheblich vergrößert ("Text­
+ leichen"). Dies tritt vor allem dann auf, wenn sehr
+ häufig eingefügt wurde. Da der Platzbedarf der Datei
+ zunimmt, sind mehr Speicherzugriffe notwendig, als es
+ dem Inhalt entspricht. Zudem führt die interne Orga­
+ nisation einer solchen Datei zu Einbußen bei der Bear­
+ beitungsgeschwindigkeit.
+ Mit dieser Funktion wird die Datei in eine "fri­
+ sche" Datei gewandelt. Diesen Vorgang nennt man 'Re­
+ organisieren' (Aufräumen). Anschließend belegt die
+ Datei zumeist (erheblich) weniger Speicherplatz als
+ zuvor.
+ Diese Funktion ist allerdings nur mit einer Ein­
+ schränkung nutzbar. Sie läßt sich nur auf Textdateien
+ anwenden, nicht auf andere Dateitypen. Das System
+ nimmt aber die Unterscheidung in Dateitypen automa­
+ tisch vor - allerdings kann es vorkommen, daß Sie den
+ Hinweis erhalten: "... kann nicht aufgeräumt werden!".
+ Zunächst wird der Dateiname der Datei erfragt, die
+ aufgeräumt (reorganisiert werden soll. Hier können
+ Sie direkt den betreffenden Namen eingeben und die
+ Eingabe mit <RETURN> abschließen. Sie können sich
+ aber auch durch die Tastenfolge <ESC><z> (für 'zeigen')
+ alle in der Task vorhandenen Dateien zur Auswahl
+ anbieten lassen und dort einfach einen Namen ankreu­
+ zen.
+ Anschließend wird/werden die ausgewählte(n) Da­
+ tei(en) aufgeräumt (reorganisert). #on("u")#Achtung! Die Funk­
+ tion ist zeitaufwendig!#off("u")#
+
+ Fehlerfälle:
+ - Eine Datei mit dem angegebenen Namen existiert
+ nicht.
+#page#
+4.2 Menufunktionen zum Oberbegriff 'Archiv'
+
+ In diesem Kapitel werden alle die Menufunktionen be­
+schrieben, die Ihnen unter dem Oberbegriff 'Archiv' im
+Menu angeboten werden. Mit den Funktionen in diesem
+Menu können Sie aber nicht nur Dateien auf dem Archiv
+behandeln, sondern auch in anderen Tasks im Multi-
+User-System oder über das EUMEL-Netz sogar auf anderen
+Rechnern!
+ Wenn Sie das Pull-Down-Menu (siehe Seite 12) gerade
+aufgeschlagen haben, sind nicht alle Funktionen akti­
+vierbar! Um weitere Funktionen zu aktivieren, muß erst
+einer der aktivierbaren Menupunkte ausgeführt werden.
+
+#on("u")##on("b")#r Reservieren#off("b")##off("u")# (des Archivlaufwerks)
+ Im EUMEL-Multi-User-System haben normalerweise
+ mehrere Personen das Zugriffsrecht auf das Archiv­
+ laufwerk. Allerdings muß der Zugriff so geregelt wer­
+ den, daß sich die Beteiligten dabei nicht gegenseitig
+ "in die Quere kommen". Ein Zugriff auf das Archiv­
+ laufwerk erfordert zunächst eine Anmeldung. Ist diese
+ Anmeldung erfolgt, kann von den anderen Beteiligten
+ nicht mehr auf das Laufwerk zugegriffen werden - bis
+ es wieder freigegeben worden ist.
+ Diese Anmeldung des Archivlaufwerkes erfolgt
+ über die Menufunktion 'r Reservieren'. Greift bereits
+ eine andere Task auf das Laufwerk zu, so erhalten Sie
+ darüber einen Hinweis auf dem Bildschirm. Ansonsten
+ wird an Sie die Frage gestellt, ob die Diskette einge­
+ legt und das Laufwerk geschlossen ist.
+ Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie
+ den alleinigen Zugriff auf das Laufwerk haben. Des­
+ halb sollten Sie, wenn Sie mit mehreren Personen am
+ Computer arbeiten, erst zum Zeitpunkt der Fragestel­
+ lung die Diskette ins Laufwerk einlegen.
+ Nachdem Sie die Diskette eingelegt und die Frage
+ bejaht haben, ermittelt das System selbständig den
+ Namen der eingelegten Diskette, zeigt den Namen auf
+ dem Bildschirm (im kleinen Kasten rechts unten) an und
+ aktiviert die anderen Menupunkte des Pull-Down-
+ Menus.
+ #on("u")#Beim Verlassen des Pull-Down-Menus, wenn eine
+ andere Zieltask eingestellt wird oder wenn das Menu
+ gänzlich verlassen wird, wird die Reservierung auto­
+ matisch aufgehoben!#off("u")#
+
+ Fehlerfälle:
+ - Das Laufwerk ist von einer anderen Task belegt.
+ - Die Diskette ist falsch eingelegt oder das Lauf­
+ werk ist nicht richtig geschlossen.
+ - Die Diskette ist nicht formatiert bzw. initiali­
+ siert.
+ - Die Diskette kann nicht gelesen werden (keine
+ EUMEL-Diskette, Diskette hat ein falsches Format,
+ Diskette ist verschmutzt...).
+
+#on("u")##on("b")#n Neue Diskette#off("b")##off("u")# (anmelden)
+ Der Dateiaustausch mit einer Diskette ist nur dann
+ möglich, wenn der im System eingestellte Diskettenna­
+ me (auf dem Bildschirm im kleinen Kasten unten rechts
+ sichtbar) mit dem tatsächlichen Namen der Diskette
+ übereinstimmt. Nach einem Diskettenwechsel ist das
+ aber in der Regel nicht mehr der Fall. Greift man dann
+ auf die neu eingelegte Diskette zu, so erscheint die
+ Fehlermeldung: 'Falscher Archivname! Bitte neue Dis­
+ kette anmelden!'.
+ Das Anmelden einer neuen Diskette - ohne einen
+ neuen Reserviervorgang - wird durch diese Menufunk­
+ tion ermöglicht. Nach Aktivieren dieses Menupunktes
+ wird der Name der eingelegten Diskette ermittelt, im
+ System eingestellt und auf dem Bildschirm angezeigt.
+ Im Gegensatz zur Menufunktion 'r Reservieren'
+ greift #on("b")#gs-DIALOG#off("b")# ohne Anfrage an den Benutzer auf
+ das Archivlaufwerk zu (die Reservierung bleibt ja
+ bestehen). Ist das Archivlaufwerk reserviert, so ist
+ die Neuanmeldung einer Diskette über diese Menufunk­
+ tion weniger zeitaufwendig.
+
+ Fehlerfälle:
+ - wie unter 'r Reservieren'
+
+#on("u")##on("b")#s Schreiben#off("b")##off("u")# (Kopieren)
+ Alle Dateien der eigenen Task werden zur Auswahl
+ angeboten. Wenn Sie die Auswahl durch die Tastenfolge
+ <ESC><q> verlassen, überprüft #on("b")#gs-DIALOG#off("b")# zunächst, ob
+ die Dateien in der eingestellten Zietask schon vor­
+ handen sind. Ist das der Fall, erfragt #on("b")#gs-DIALOG#off("b")#, ob
+ die dort vorhandenen Dateien überschrieben, d.h. ge­
+ löscht werden dürfen (s.u.). Anschließend werden alle
+ angekreuzten Dateien in der Reihenfolge, in der Sie
+ sie angekreuzt haben, in die eingestellte Zieltask
+ kopiert. Der Vorgang wird auf dem Bildschirm proto­
+ kolliert. Die Originaldateien in der eigenen Task
+ bleiben dabei erhalten.
+ Wenn in der Zieltask schon eine Datei existiert, die
+ den gleichen Namen hat wie eine Datei, die Sie dorthin
+ kopieren möchten, so wird angefragt, ob die vorher
+ schon existierende Datei überschrieben (gelöscht!)
+ werden soll. Bejahen Sie diese Frage, so wird die be­
+ reits in der Zieltask existierende Datei (unwieder­
+ bringlich) gelöscht und die gewünschte Datei dorthin
+ transportiert. Ein Überschreiben aus Versehen ist
+ nicht möglich, wenn Sie die an Sie gestellte Frage
+ sorgfältig beantworten.
+ Verneinen Sie die Frage, so wird die Datei auch
+ nicht hinübertransportiert! Sie können die Datei aber
+ umbenennen (Menufunktion 'u Umbenennen' unter dem
+ Oberbegriff 'Dateien') und anschließend mit anderem
+ Namen hinüberschreiben.
+ Beachten Sie, daß beim Überschreiben einer Datei
+ auf einer Archivdiskette der Speicherplatz der alten
+ (überschriebenen) Version im allgemeinen nicht wie­
+ derverwendet werden kann. In einem solchen Fall
+ könnte die Diskette voll geschrieben werden, obwohl
+ eigentlich genügend Platz vorhanden wäre. Zur Opti­
+ mierung überprüft #on("b")#gs-DIALOG#off("b")# deshalb zuerst, ob die
+ angekreuzten Dateien schon in der Zieltask vorhanden
+ sind und löscht diese, wenn Sie Ihr Einverständnis
+ geben. Erst anschließend werden die Dateien insgesamt
+ kopiert.
+ Normalerweise ist als Zieltask das Archivlaufwerk
+ der eigenen Station eingestellt. Mit der Menufunktion
+ 'z Zieltask einstellen' kann diese Einstellung aber
+ verändert werden.
+
+ Fehlerfälle:
+ - Die Diskette ist falsch eingelegt oder beschädigt.
+ - Die Diskette kann nicht beschrieben werden
+ (Schreibfehler)
+ - Die Diskette ist voll.
+ - Sehen Sie auch unter 'r Reservieren'
+ 'z Zieltask einstellen'
+
+#on("u")##on("b")#c Checken#off("b")##off("u")#
+ Diese Menufunktion kann nur ausgeführt werden,
+ wenn der Dateiaustausch mit einem Archiv(manager)
+ erfolgt - ansonsten ist diese Menufunktion auch
+ nicht aktivierbar. Die Menufunktion dient dazu, auf
+ Diskette geschriebene Dateien auf Lesefehler hin zu
+ prüfen. Es empfiehlt sich, diese Prüfroutine auf neu
+ auf die Diskette geschriebene Dateien anzuwenden.
+ Sehen Sie dazu auch 'k Kombination'
+ Alle Dateien der eingestellten Zieltask (Archiv)
+ werden zur Auswahl angeboten. Wenn Sie die Auswahl
+ durch die Tastenfolge <ESC><q> verlassen, werden alle
+ angekreuzten Dateien in der Reihenfolge, in der Sie
+ sie angekreuzt haben, "gecheckt", d.h. auf Lesefehler
+ hin überprüft. Der Vorgang wird auf dem Bildschirm
+ protokolliert.
+
+ Fehlerfälle:
+ - Lesefehler auf dem Archiv
+ - Sehen Sie auch unter 'r Reservieren'
+
+#on("u")##on("b")#k Kombination#off("b")##off("u")#
+ Diese Menufunktion ist eine Kombination aus den
+ beiden Menufunktionen 's Schreiben' und 'c Checken'
+ (Sehen Sie weitere Informationen auch dort!).
+ Alle Dateien der eigenen Task werden zur Auswahl
+ angeboten. Wenn Sie die Auswahl durch die Tastenfolge
+ <ESC><q> verlassen, werden alle angekreuzten Dateien
+ in der Reihenfolge, in der Sie sie angekreuzt haben,
+ in die eingestellte Zieltask kopiert (gegebenenfalls
+ müssen bereits vorhandene Dateien gleichen Namens in
+ der Zieltask gelöscht werden). Anschließend werden
+ alle Dateien, die gerade geschrieben wurden, gecheckt,
+ d.h. auf Lesefehler hin untersucht. Beide Vorgänge
+ werden auf dem Bildschirm protokolliert.
+ Da die 'Check' - Operation nur bei Archivmanagern
+ zulässig ist, ist diese Menufunktion ebenfalls nur bei
+ Archivmanagern aktivierbar. Zur Erläuterung sehen
+ Sie bitte auch unter 'z Zieltask einstellen'.
+
+#on("u")##on("b")#h Holen/Lesen#off("b")##off("u")#
+ Die Menufunktion dient dazu, Dateien, die bereits
+ auf einer Archivdiskette oder in einer anderen Task
+ existieren, in die eigene Task zu kopieren.
+ Alle Dateien der eingestellten Zieltask werden zur
+ Auswahl angeboten. Anschließend werden Kopien der
+ angekreuzten Dateien in der Reihenfolge des Ankreu­
+ zens in die eigene Task geholt. Das Original in der
+ Zieltask bleibt dabei unverändert! Der Vorgang wird
+ auf dem Bildschirm protokolliert.
+ Sind in der eigenen Task schon Dateien mit glei­
+ chem Namen vorhanden, so wird gefragt, ob die 'alten'
+ Dateien überschrieben (gelöscht) werden dürfen. Nur
+ wenn Sie zustimmen, werden die in Ihrer Task existie­
+ renden Dateien (unwiederbringlich!) gelöscht und Ko­
+ pien der gleichnamigen Dateien aus der Zieltask ange­
+ fertigt.
+ Stimmen Sie dem Löschvorgang nicht zu, dann blei­
+ ben die bisherigen Dateien in Ihrer Task erhalten -
+ die Dateien aus der Zieltask werden dann aber auch
+ nicht in Ihre Task kopiert! Um dennoch die Kopien zu
+ erhalten, können Sie die namensgleichen Dateien in
+ Ihrer Task umbenennen und dann erst die Dateien aus
+ der anderen Task anfordern.
+ Normalerweise werden die Dateien vom Archiv der
+ eigenen Station geholt. Mit dem Menupunkt 'z Zieltask
+ einstellen' kann diese Einstellung verändert werden.
+
+ Fehlerfälle:
+ - Lesefehler auf dem Archiv
+ - Sehen Sie auch unter 'r Reservieren'
+ 's Schreiben'
+ 'z Zieltask einstellen'
+
+#on("u")##on("b")#l Löschen#off("b")##off("u")#
+ Die Menufunktion dient dazu, Dateien in der Ziel­
+ task (unwiederbringlich!) zu löschen. Dazu werden alle
+ Dateien der eingestellten Zieltask zur Auswahl ange­
+ boten. Anschließend werden die angekreuzten Dateien
+ in der Reihenfolge ihres Ankreuzens gelöscht. Zur
+ Sicherheit muß noch einmal für jede einzelne Datei
+ bestätigt werden, daß sie auch tatsächlich gelöscht
+ werden soll.
+ Beachten Sie, daß beim Löschen einer Datei auf ei­
+ ner Archivdiskette der Speicherplatz im allgemeinen
+ nicht wieder verwendet werden kann. In einem solchen
+ Fall könnte die Diskette voll geschrieben werden,
+ obwohl eigentlich genügend Platz vorhanden wäre.
+ Diese Probleme treten bei anderen Tasks, die keine
+ Archivmanager sind, nicht auf, da deren Speicherplatz
+ intelligenter verwaltet wird.
+ Normalerweise ist als Zieltask das Archiv der eige­
+ nen Station eingestellt. Mit dem Menupunkt 'z Zieltask
+ einstellen' kann diese Einstellung verändert werden.
+
+ Fehlerfälle:
+ - Sehen Sie auch unter 'r Reservieren'
+ 's Schreiben'
+ 'z Zieltask einstellen'
+
+#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie sich einen
+ Überblick über die in der Zieltask (z.B. auf dem Archiv)
+ vorhandenen Dateien verschaffen.
+ Nach Aufruf der Funktion wird eine Liste der Da­
+ teien auf dem Bildschirm ausgegeben, die sich in der
+ Zieltask (z.B. auf dem Archiv) befinden. Ist die Zieltask
+ ein Archiv(manager), so wird auch angezeigt, wieviel
+ Platz auf der Diskette belegt ist. Da die Liste selbst
+ eine Datei ist, kann sie mit der Tastenkombination
+ <ESC><q> verlassen werden. Falls nicht alle Dateinamen
+ auf den Bildschirm passen, können Sie das Fenster mit
+ <HOP><hoch> und <HOP><runter> rollen.
+
+ Fehlerfälle:
+ - Sehen Sie unter 'z Zieltask einstellen'
+
+#on("u")##on("b")#d Drucken#off("b")##off("u")#
+ Das Verzeichnis der Dateien in der Zieltask, das
+ man mit der Menufunktion 'v Verzeichnis' auf dem Bild­
+ schirm angezeigt bekommt, kann mit dieser Menufunk­
+ tion ausgedruckt werden.
+ Zur Sicherheit fragt #on("b")#gs-DIALOG#off("b")# an, ob wirklich ein
+ solches Dateiverzeichnis der Zieltask gedruckt werden
+ soll. Bejaht man die Frage, so wird ein Dateiverzeich­
+ nis erstellt und zum Drucker geschickt.
+
+ Fehlerfälle:
+ - Der Drucker ist nicht funktionsbereit.
+ - Der Drucker wird nicht über die Task 'PRINTER' be­
+ trieben.
+ - Auf Ihrem System werden die Druckkosten abge­
+ rechnet. Sie müssen sich mit einer Codenummer
+ identifizieren.
+
+#on("u")##on("b")#i Initialisieren#off("b")##off("u")#
+ Diese Menufunktion gestattet es, frische Disketten
+ zu formatieren, zu initialisieren bzw. beschriebene
+ Disketten vollständig zu löschen und ggf. dabei umzu­
+ benennen. Bei Aufruf dieser Menufunktion wird - so­
+ fern noch nicht geschehen - das Archivlaufwerk auto­
+ matisch reserviert.
+ Wenn Sie eine fabrikneue Diskette aus der Verpak­
+ kung nehmen, müssen Sie diese zunächst #on("u")#formatieren#off("u")#.
+ Dabei wird die Diskette auf ein festgelegtes physika­
+ lisches Format eingestellt. Ohne daß diese Operation
+ vorausgegangen ist, kann eine Diskette weder be­
+ schrieben noch gelesen werden.
+ Prinzipiell braucht eine Diskette nur ein einziges
+ Mal formatiert zu werden. Sie können Sie jedoch jeder­
+ zeit wieder formatieren - z.B. wenn Sie Disketten ha­
+ ben, von denen Sie nicht genau wissen, für welche
+ Zwecke sie zuvor verwendet wurden.
+ Wenn Sie diese Menufunktion aktivieren, werden Sie
+ zunächst gefragt, ob Sie die Diskette auch formatie­
+ ren wollen. Bejahen Sie die Frage, so werden Ihnen
+ mehrere Formate zur Auswahl angeboten:
+
+#on ("b")#
+ +------------------------------------+
+ | Formatieren einer Diskette |
+ | |
+ | Dies sind die möglichen Formate: |
+ | |
+ | 1 ..... 40 Spur - 360 KB |
+ | 2 ..... 80 Spur - 720 KB |
+ | 3 ..... 5 1/4" - 1,2 MB |
+ | 4 ..... 3 1/2" - 1,4 MB |
+ | s ..... Standard - Format |
+ | |
+ | 1 2 3 4 s |
+ +------------------------------------+
+#off("b")#
+
+ Erkundigen Sie sich bei Ihrem Händler, welches
+ Format Sie bei Ihrem Rechner und den von Ihnen ver­
+ wendeten Disketten einstellen müssen. Manche Rechner
+ unterstützen diese Operation innerhalb des EUMEL-
+ Systems auch gar nicht, das Formatieren muß dann ir­
+ gendwie anders außerhalb des EUMEL-Systems gesche­
+ hen.
+ Wenn Sie die Formatierung abgeschlossen oder auch
+ übersprungen haben, beginnt die eigentliche Initiali­
+ sierung der Diskette. Dabei wird als erstes der Ar­
+ chivname auf die Diskette geschrieben. Alle alten Da­
+ ten, die sich ggf. auf der Diskette befinden, werden
+ auch bei diesem Vorgang unwiederbringlich (!) ge­
+ löscht.
+ Zur Sicherheit überprüft #on("b")#gs-DIALOG#off("b")# in jedem Falle,
+ ob es sich um eine EUMEL - Diskette handelt, und er­
+ fragt Ihr Einverständnis, ob die Diskette wirklich
+ initialisiert werden soll. Geben Sie hierzu Ihr Ein­
+ verständnis, dann erfragt #on("b")#gs-DIALOG#off("b")# noch den (neuen)
+ Archivnamen. Hatte die Diskette schon einen Namen,
+ dann wird dieser zum Überschreiben angeboten. Wollen
+ Sie den alten Archivnamen beibehalten, so brauchen
+ Sie nur die <RETURN>-Taste zu tippen, ansonsten kön­
+ nen Sie den Namen auch zuvor verändern oder einen
+ ganz neuen Namen hinschreiben. Anhand des ausgege­
+ benen Namens können Sie auch überprüfen, ob Sie die
+ richtige Diskette eingelegt haben.
+ Das Initialisieren funktioniert natürlich nur,
+ wenn Sie als Zieltask einen Archivmanager eingestellt
+ haben - ansonsten ist diese Menufunktion gesperrt
+ (nicht aktivierbar!).
+
+ Fehlerfälle:
+ - Formatieren ist nicht auf dem System möglich
+ - Sehen Sie auch unter 'r Reservieren'
+ 'z Zieltask einstellen'
+
+#on("u")##on("b")#z Zieltask einstellen#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie festlegen, mit
+ welcher Zieltask Sie kommunizieren, d.h. z.B. Dateien
+ austauschen möchten. Normalerweise ist hier das Archiv
+ am eigenen Rechner eingestellt. Das wird auch nach
+ Aufklappen des Pull-Down-Menus im Kasten rechts
+ unten angezeigt.
+ Sie können aber auch eine andere Task einstellen
+ (z.B. die Vatertask oder die Task 'PUBLIC'), um mit diesen
+ Dateien auszutauschen oder um sich auch nur einen
+ Überblick über die dort vorhandenen Dateien zu ver­
+ schaffen. Wenn Sie mit Ihrem Rechner in ein EUMEL-Netz
+ integriert sind, können Sie auch auf Tasks anderer
+ Rechner zugreifen oder auch Disketten von Laufwerken
+ anderer Rechner einlesen (z.B. wenn Sie Disketten ande­
+ rer Formate haben, die von Ihrem Rechner nicht gelesen
+ werden können).
+ Dabei werden zwei Anforderungen an die Zieltask
+ gestellt: Sie muß existieren und bereit für den Datei­
+ austausch sein, d.h es muß eine Managertask sein, auf
+ die Sie Zugriff haben. Versuchen Sie auf andere Tasks
+ zuzugreifen, so erhalten Sie entsprechende (Fehler-)­
+ Meldungen.
+ Zu beachten ist noch, daß es im EUMEL-System ver­
+ schiedene Arten von Managertasks gibt - Archivmana­
+ ger und normale Dateimanager. Der Unterschied besteht
+ darin, daß ein Archivmanager vom Benutzer vor dem
+ Zugriff reserviert werden muß - anschließend hat nur
+ dieser Benutzer (bis zur Aufgabe der Reservierung) ein
+ Zugriffsrechts auf den Manager. Normale Dateimanager
+ können dagegen von mehreren Benutzern in beliebiger
+ Reihenfolge angesprochen werden.
+ Ein Archivmanager kann auch auf bestimmte Disket­
+ tenformate spezialisert sein (z.B. auf das Lesen von
+ DOS-Disketten). Manche Rechner haben auch mehrere
+ Archivmanager für verschiedene Laufwerke etc. Durch
+ Einstellen unterschiedlicher Archivmanager können
+ Sie dann auf verschiedenen Laufwerken archivieren.
+ Nach Aktivieren dieses Menupunktes werden Ihnen
+ die folgenden Alternativen angeboten:
+
+#on ("b")#
+ +-------------------------------------------+
+ | Dateiaustausch gewünscht mit: |
+ | |
+ | a ... Archiv (Eigene Station) |
+ | |
+ | v ... Vatertask |
+ | |
+ | p ... 'PUBLIC' (Eigene Station) |
+ | |
+ | s ... Sonstige Task |
+ | |
+ | |
+ | Archiv Vatertask PUBLIC Sonstige |
+ +-------------------------------------------+
+#off("b")#
+
+ Da der Dateiaustausch mit dem Standardarchiv der
+ eigenen Station (Task: 'ARCHIVE'), mit der Vatertask
+ und der Task 'PUBLIC' recht häufig in Anspruch genom­
+ men wird, sind diese drei Optionen unter den Alterna­
+ tiven direkt angegeben. Entscheiden Sie sich für eine
+ dieser drei Tasks, so nimmt #on("b")#gs-DIALOG#off("b")# alle notwendi­
+ gen Einstellungen vor. Möchten Sie dagegen in Kon­
+ takt mit einer anderen Task treten, so wählen Sie die
+ Alternative 's ... Sonstige Task'.
+
+ In diesem Falle haben Sie noch 3 Angaben zu machen:
+
+ - Zunächst werden Sie nach dem Namen der Zieltask
+ gefragt. Geben Sie den Namen der Zieltask - ohne
+ Anführungsstriche (!) - ein und schließen Sie die
+ Eingabe mit der <RETURN>-Taste ab. (Den ausgegebe­
+ nen Namen der z.Z. eingestellten Task können Sie
+ dabei verändern bzw. überschreiben.)
+ - Dann wird die Nummer der Station im EUMEL-Netz
+ erfragt, auf der sich die Zieltask befindet. Die
+ Nummer Ihrer Station wird als Vorschlag ausgege­
+ ben. Wollen Sie mit einer Task auf Ihrem Rechner
+ kommunizieren, so brauchen Sie diesen Vorschlag
+ nur durch Drücken der <RETURN>-Taste zu bestäti­
+ gen; ansonsten tragen Sie zuvor die entsprechende
+ Stationsnummer ein. Ist Ihr Rechner nicht in ein
+ EUMEL-Netz integriert, so wird die Stationsnummer
+ 0 (Null) ausgegeben. Bitte bestätigen Sie diese Sta­
+ tionsnummer durch Tippen der <RETURN>-Taste.
+ - Zum Abschluß müssen Sie noch angeben, ob die ein­
+ gestellte Zieltask ein Archivmanager ist oder
+ nicht.
+
+ #on("b")#gs-DIALOG#off("b")# versucht dann den Kontakt herzustellen.
+ Je nachdem, welche Einstellung Sie vorgenommen ha­
+ ben, sind bestimmte Funktionen innerhalb des Menus
+ nicht aktivierbar. #on("b")#gs-DIALOG#off("b")# läßt nur die Funktionen
+ zu, die aufgrund Ihrer Einstellungen zulässig sind.
+ Im Kasten rechts unten auf dem Bildschirm wird
+ jeweils angezeigt, welche Zieltask eingestellt ist.
+ Erscheint in diesem Kasten auch ein Hinweis auf den
+ Archivnamen, so haben Sie einen Archivmanager einge­
+ stellt. Ist dagegen vor dem Namen der Zieltask noch
+ eine Zahl und ein Schrägstrich angegeben, so haben
+ Sie eine Zieltask auf einem anderen Rechner einge­
+ stellt.
+ Bedenken Sie, daß Operationen mit Tasks auf ande­
+ ren Stationen länger andauern können - werden Sie
+ nicht ungeduldig!
+ Sie können die Einstellung der Zieltask jederzeit
+ wieder verändern!
+
+ Fehlerfälle:
+ - Die eingestellte Zieltask existiert nicht.
+ - Die eingestellte Zieltask existiert zwar, ist aber
+ nicht empfangsbereit, d.h. ein Zugriff von Ihrer
+ Task aus ist nicht möglich!
+ - Das Netz ist nicht funktionsbereit (Collector-Task
+ fehlt).
+ - Die Kommunikation war nicht erfolgreich.
+ - Die gewünschte Operation kann mit der eingestell­
+ ten Zieltask nicht ausgeführt werden (Zieltask ist
+ z.B. gar kein Archivmanager - Sie aber versuchen,
+ das Laufwerk zu reservieren)
+
diff --git a/doc/dialog/gs-dialog-5 b/doc/dialog/gs-dialog-5
new file mode 100644
index 0000000..f2b17cf
--- /dev/null
+++ b/doc/dialog/gs-dialog-5
@@ -0,0 +1,176 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (49)#
+#headodd#
+#center#gs-DIALOG#right#%
+
+#end#
+#headeven#
+%#center#gs-DIALOG
+
+#end#
+#center#5
+
+#center#Informationen für Lehrer/Programmierer
+
+
+5.1 "Verschlüsselung" der Dateien auf der Diskette
+
+ Wenn Sie sich die Inhalte der Dateien angesehen haben,
+in denen die Programme für #on("b")#gs-DIALOG#off("b")# enthalten sind,
+werden Sie festgestellt haben, daß der Code dicht gepackt
+ist. Das war notwendig, um die gesamten Programme auf
+einer Diskette unterzubringen.
+ Allerdings ist der Code #on("u")#nicht#off("u")# verschlüsselt - nur
+dichter gepackt. Auf der gelieferten Diskette befindet
+sich eine Datei mit Namen "gs-DIALOG decompress". In die­
+ser Datei ist das (einfache) Komprimier- und Dekompri­
+mierprogramm enthalten. Insertieren Sie dieses Programm
+in einer Task. Anschließend stehen Ihnen zwei Befehle zur
+Verfügung:
+
+PROC komprimiere (TEXT CONST dateiname):
+ Die angegebene Datei wird komprimiert; die Datei steht
+ anschließend unter gleichem Namen zur Verfügung.
+
+PROC dekomprimiere (TEXT CONST dateiname):
+ Eine zuvor mit 'komprimiere' bearbeitete Datei wird -
+ bis auf die Leerzeilen - in den Ursprungszustand über­
+ führt. Die Datei steht anschließend wieder unter glei­
+ chem Namen zur Verfügung.
+
+ Dieser 'Service' ist vornehmlich für Lehrer gedacht.
+So können Programmteile im Unterricht Gegenstand von
+Betrachtungen sein; Schüler können nach optimaleren
+Algorithmen für Teillösungen suchen - ggf. Anregungen
+geben. Sinnvoll ist es, das eigentliche Programm nicht zu
+verändern, um die Lauffähigkeit der unter #on("b")#gs-DIALOG#off("b")#
+entwickelten Software nicht zu gefährden.
+
+
+5.2 Nutzung der Graphikzeichen auf anderen Rechnern/
+Terminals
+
+ Wie schon unter "2.4 Nutzung der 'Semi - Graphik -
+Zeichen'" erwähnt, ist #on("b")#gs-DIALOG#off("b")# darauf vorbereitet, für
+'IBM - kompatible Rechner' und für Terminals 'Beehive
+FT20' die Umrahmungen der Kästen als durchgezogene Li­
+nien auszugeben - dadurch gewinnt die Bildschirmdar­
+stellung.
+ #on("b")#gs-DIALOG#off("b")# ist aber hinsichtlich der Graphikzeichen
+nur für diese Endgeräte vorbereitet und benutzt in allen
+anderen Fällen Zeichen des normalen Zeichensatzes.
+ Sie können sich aber, sofern Ihr Rechner/Terminal
+über solche Semi - Graphikzeichen verfügt, leicht selbst
+eine Anpassung dafür erstellen. Auch darauf ist
+#on("b")#gs-DIALOG#off("b")# schon vorbereitet. Keine Angst, versuchen Sie
+es ruhig einmal. Sie können nichts falsch machen; denn
+sollte es Ihnen nicht gelingen, so können Sie jederzeit
+mit dem Befehl 'std graphic char' und einem anschließen­
+den <RETURN> die Standardeinstellung wieder vornehmen.
+ Informieren Sie sich in Ihrer Terminal-/Rechner­
+beschreibung, welche Codes ausgegeben werden müssen, um
+die Grahpikzeichen darzustellen. Folgende Zeichen werden
+benötigt:
+
+ Ecke oben links : ω (f)
+ Ecke oben rechts : � (g)
+ Ecke unten links : � (e)
+ Ecke unten rechts : � (h)
+
+ Balken oben : � (n)
+ Balken unten : ̂ (o)
+ Balken links : ̄ (m)
+ Balken rechts : ̃ (l)
+ Kreuz : ̗ (i)
+
+ waagerechte Linie : ̇ (k)
+ senkrechte Linie : � (j)
+
+ ---------------------------------------------
+
+ ( Cursor sichtbar : ( ESC . 1 ) )
+ ( Cursor unsichtbar : ( ESC . 0 ) )
+
+
+ #on("b")#gs-DIALOG#off("b")# müssen nun die speziellen Codes Ihres Rech­
+ners/Terminals mitgeteilt werden. Dafür stehen die fol­
+genden Prozeduren zur Verfügung:
+
+PROC ecke oben links (TEXT CONST zeichenkette);
+PROC ecke oben rechts (TEXT CONST zeichenkette);
+PROC ecke unten links (TEXT CONST zeichenkette);
+PROC ecke unten rechts (TEXT CONST zeichenkette);
+PROC balken oben (TEXT CONST zeichenkette);
+PROC balken unten (TEXT CONST zeichenkette);
+PROC balken links (TEXT CONST zeichenkette);
+PROC balken rechts (TEXT CONST zeichenkette);
+PROC waagerecht (TEXT CONST zeichenkette);
+PROC senkrecht (TEXT CONST zeichenkette);
+PROC kreuz (TEXT CONST zeichenkette);
+
+PROC cursor on (TEXT CONST zeichenkette);
+PROC cursor off (TEXT CONST zeichenkette);
+
+ Sofern möglich, kann auch noch ein Code eingegeben
+werden, damit der Cursor auf dem Bildschirm sichtbar bzw.
+unsichtbar ist.
+ Wie man sich selbst eine Anpassung schreiben kann,
+wollen wir hier an einem Beispiel aufzeigen. Wir schrei­
+ben dazu eine Anpassung für das Terminal 'Ampex 210+'.
+ In der Terminalbeschreibung ist angegeben, wie das
+Terminal konfiguriert sein muß - diese Konfiguartion
+haben wir eingestellt. Weiterhin ist angegeben, daß auf
+die Grapikzeichen durch die Zeichenfolge 'ESC $' umge­
+schaltet und durch die Zeichenfolge 'ESC %' auf den nor­
+malen Zeichensatz zurückgeschaltet wird. Für die jeweils
+speziellen Graphikzeichen sind bestimmte Buchstaben an­
+zugeben (z.B. für die 'Ecke oben links' der Buchstabe 'f').
+Die Zeichen für dieses Terminal sind oben hinter den Gra­
+phikzeichen in Klammern angegeben. Für 'ESC' muß der Code
+'27' ausgegeben werden.
+
+PACKET eigene graphikanpassung DEFINES
+
+ private graphic char:
+
+PROC private graphic char:
+ ecke oben links (""27"$f"27"%");
+ ecke oben rechts (""27"$g"27"%");
+ ecke unten links (""27"$e"27"%");
+ ecke unten rechts (""27"$h"27"%");
+ balken oben (""27"$n"27"%");
+ balken rechts (""27"$l"27"%");
+ balken links (""27"$m"27"%");
+ balken unten (""27"$o"27"%");
+ waagerecht (""27"$k"27"%");
+ senkrecht (""27"$j"27"%");
+ kreuz (""27"$i"27"%");
+ cursor on (""27".1");
+ cursor off (""27".0");
+END PROC private graphic char;
+
+END PACKET eigene graphikanpassung;
+
+ Nachdem das Programm insertiert und der Befehl
+'private graphic char' gegeben ist, steht in dieser Task
+und allen Söhnen davon die Graphikanpassung für das
+Terminal 'Ampex 210+' zur Verfügung.
+
+
+5.3 Fehlerbehandlung
+
+ Haben Sie z.B. das Menu durch Tippen der <SV>-Taste
+verlassen, so kann es vorkommen, daß anschließend das
+Menu auf dem Bildschirm nicht ordnungsgemäß aufgebaut
+wird. Verlassen Sie dann die Menuebene durch die Tasten­
+folge <ESC><q>.
+
+Wenn 'gib kommando:' erscheint, geben Sie den Befehl
+
+ reset dialog <RETURN>
+
+ Dadurch wird das Menusystem in den Anfangszustand
+gesetzt. Anschließend können Sie das von Ihnen ge­
+wünschte Programm (wieder) aufrufen.
+
diff --git a/doc/dialog/gs-dialog-Inhaltsverzeichnis b/doc/dialog/gs-dialog-Inhaltsverzeichnis
new file mode 100644
index 0000000..741744f
--- /dev/null
+++ b/doc/dialog/gs-dialog-Inhaltsverzeichnis
@@ -0,0 +1,45 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+Inhaltsverzeichnis
+
+
+1 Was kann gs-DIALOG 3
+
+2 Installation von gs-DIALOG 6
+2.1 Voraussetzungen 6
+2.2 Lieferumfang 6
+2.3 Installation 6
+2.4 Nutzung der 'Semi-Graphik-Zeichen' 10
+
+3 Umgang mit den Menus; Eine Beispielsitzung 12
+3.1 Aufruf der Archivverwaltung 12
+3.2 Bedienung des Menusystems 14
+ - Aufbau der Menus (Bildschirmaufbau) 14
+ - Auswahl der Menupunkte 15
+ - Informationen zu einem Menupunkt 18
+ - Informationen zur Bedienung des Menus 19
+ - Aktivierbare und nicht aktivierbare
+ Menupunkte 20
+ - Aktivieren von Menupunkten 21
+ - Dateiauswahl 22
+ - Ja/Nein - Fragen 26
+ - Eingaben 26
+ - Alternativen 26
+ - Verlassen des Menus 27
+3.3 Zusammenfassung/Kurzbeschreibung 28
+
+4 Beschreibung der Menufunktionen 30
+4.1 Menufunktionen zum Oberbegriff 'Dateien' 30
+4.2 Menufunktionen zum Oberbegriff 'Archiv' 36
+
+5 Informationen für Lehrer/Programmierer 49
+5.1 "Verschlüsselung" der Dateien auf der
+ Diskette 49
+5.2 Nutzung der Graphikzeichen auf andere
+ Rechnern/Terminals 50
+5.3 Fehlerbehandlung 53
+
+
+
+
+
diff --git a/doc/dynamo/dynamo handbuch b/doc/dynamo/dynamo handbuch
new file mode 100644
index 0000000..4012973
--- /dev/null
+++ b/doc/dynamo/dynamo handbuch
@@ -0,0 +1,1826 @@
+#block##pageblock##page (2)##setcount (1)##count per page#
+#head#
+#center#DYNAMO-Compiler
+#center#____________________________________________________________
+
+#end#
+#bottom odd#
+#center#____________________________________________________________
+GMD #right#DYNAMO - %
+#end#
+#bottom even#
+#center#____________________________________________________________
+DYNAMO - % #right#GMD
+#end#
+
+#ib#1. Einleitung#ie#
+
+
+
+Diese Handbuch beschreibt die Funktion des EUMEL-DYNAMO-Compilers in der
+Version 3.3+ und seine Einschränkungen oder Änderungen gegenüber dem
+DYNAMO-Sprachstandard. In keiner Weise kann diese Beschreibung eine Einfüh­
+rung in die Programmiersprache DYNAMO ersetzen!
+
+Die beschriebene Compilerversion enthält nun auch ein Modul zur Unterstützung von
+hochauflösender Grafik durch die häufig in IBM-PC/AT-Kompatiblen eingesetzte
+CGA-Grafikkarte. Dennoch ist es einfach möglich, diesen Grafikmodus auszuschal­
+ten, und somit die alte, zeichenorientierte Grafik weiter zu verwenden.
+
+Der DYNAMO-Compiler wurde 1983 von Robert Keil und Torsten Fröhlich (Helm­
+holtz-Gymnasium, Bonn) im Rahmen des MIKROS-Projektes am Informatik-Kolleg
+der GMD entwickelt. Für Spezifikation und Betreuung der Entwicklung war Dr. Diether
+Craemer verantwortlich, software-technische Unterstützung kam von Prof. John
+Henize, Dr. Peter Heyderhoff, Rudolf Legde und Dipl.- Math. Lothar Oppor. Die
+Grafik wurde von D.Giffeler beigesteuert.
+
+
+
+
+#ib#1.1. Referenzliteratur#ie#
+
+
+
+
+ [1] Craemer, Diether
+ "Mathematisches Modellieren dynamischer Vorgänge"
+ e. Einf. in die Programmiersprache DYNAMO
+ Stuttgart, Teuber, 1985
+ ISBN 3-519-02477-2
+
+ [2] Craemer, Diether
+ "Fluß und Zustand - Simulation dynamischer Vorgänge in DYNAMO"
+ in: LOGIN 5 (1985), Heft 1, S. 20-23
+
+ [3] Pugh, Alexander L.
+ "DYNAMO II User's Manual"
+ Cambridge, London 1973: MIT-Press
+ ISBN 0-262-66018-0
+#page#
+
+#ib#1.2. Die Programmiersprache DYNAMO#ie#
+
+
+
+DYNAMO wurde von einer Gruppe um Jay FORRESTER am Massachusetts Institute
+of Technology (MIT) um 1960 entwickelt. Die Sprache basiert auf der #on ("i")# System
+Dynamic#off ("i")# von FORRESTER.
+
+In DYNAMO (#on ("u")##on ("b")#Dyna#off ("b")##off ("u")#mic #on ("u")##on ("b")#Mo#off ("b")##off ("u")#delling Language) können Systeme, in denen Veränderun­
+gen kontinuierlich geschehen, modelliert und simuliert werden.
+
+Kontinuierliche Veränderungen von Größen werden über deren Veränderungsrate im
+Wesentlichen nach folgender Gleichung berechnet
+
+Größe jetzt = Größe früher + DT * Veränderungsrate,
+
+dabei ist DT die Länge des Zeitintervalls von "früher" bis "jetzt".
+
+Außer diesen Gleichungen für Größen braucht man Gleichungen für die Verände­
+rungsraten, für Hilfsgrößen, zur Initialisierung von Größen, zur Definition von Konstan­
+ten und Tabellen, zu Angaben von Simulationsläufen und zur Wiedergabe von Ergeb­
+nissen in Zahlentabellen oder Diagrammen.
+
+Alle diese Gleichungen können einfach in der Form, wie man sie aus dem Mathema­
+tik-Unterricht der Sekundarstufe kennt, hingeschrieben werden, ohne sich Gedanken
+über den Ablauf des Programms machen zu müssen.
+
+#on ("b")#
+DYNAMO ist also eine einfache funktional-applikative, nicht-prozedurale Sprache.#off ("b")#
+
+Das macht ihren Reiz und ihre Leistungsfähigkeit aus, die zur Formulierung der be­
+kannten Weltmodelle von FORRESTER, MEADOWS ("Die Grenzen des Wachstums"),
+PESTEL, MESAROVIC u.a. in dieser Sprache führten.
+
+Anwendungsgebiete der Sprache sind ökologische, gesellschaftliche, wirtschaftliche
+und technische Systeme, deren dynamisches Verhalten der Modellbildner nachbilden
+und studieren möchte.
+
+Im Allgemeinen verfolgt der Modellbildner mit seinem Modell einen Zweck (Verhaltens­
+änderung des nachgebildeten Systems), so daß auch neben gesicherten Fakten die
+Wertvorstellungen des Modellbildners in das Modell eingehen.
+
+
+
+
+#ib#1.3 Kurz-Einführung in die DYNAMO-
+Schreibweise#ie#
+
+
+
+Die System Dynamic Methode benutzt als Analogie-Bild den Archetyp des Flusses:
+
+ - Wasser fließt durch das Flußbett, kann in Seen gestaut und in der Ge­
+ schwindigkeit durch Schleusen und Wehre reguliert werden.
+
+ - Analog dazu "fließt" Geld auf dem Überweisungsweg, wird in Konten gestaut,
+ und die Liquidität kann durch Zinssätze reguliert werden.
+
+ - Gedanken "fließen" auf Nervenbahnen, werden im Gehirn gespeichert, und
+ Gedankenströme werden über Synapsen reguliert.
+
+ - Autos "fließen" über Straßen, werden auf Parkplätzen gestaut, und der Ver­
+ kehrsfluß wird über Ampeln reguliert.
+
+ - Menschen "fließen" über Wanderwege, halten sich in Wohnorten auf, und die
+ Bevölkerungsdynamik wird durch ein komplexes, rückgekoppeltes Zusammen­
+ spiel von Ein- und Auswanderungsraten sowie Geburts- und Sterberaten
+ reguliert.
+
+Am letzten Beispiel wird deutlich, daß sich ein soziales Phänomen nur im Zusam­
+menwirken vieler netzartig miteinander verbundener Variablen beschreiben läßt (wenn
+überhaupt).
+
+Solange jedoch einigen Variablen ZUSTANDS-CHARAKTER ("Wasserstand") und
+anderen VERÄNDERUNGS-CHARAKTER ("Flußgeschwindigkeit") zugeordnet
+werden kann, können die Größen für Berechnungen folgender Art verwendet werden:
+
+
+ Wasserstand jetzt = Wasserstand früher + vergangene Zeit *
+ (Zuflußrate - Abflußrate)
+
+
+analog:
+
+ Bevölkerung jetzt = Bevölkerung früher + vergangene Zeit *
+ (Geburtsrate - Sterberate)
+
+
+Diese Schreibweise kann praktisch so in ein Computerprogramm übernommen wer­
+den. Mit geringfügigen Änderungen handelt es sich bei diesen Gleichungen schon um
+gültige Zeilen in der Programmiersprache DYNAMO.
+
+In DYNAMO wird er Zeitpunkt "jetzt" durch das Anhängsel .K, der Zeitpunkt "früher"
+durch das Anhängsel .J, die Zeitspanne von jetzt bis später durch das Anhängsel .KL,
+die Zeitspanne von früher bis jetzt durch das Anhänsel .JK und die vergangene Zeit
+mit DT (wie "Delta Tempus": Zeitdifferenz) bezeichnet. Die Variablen mit Zustands-
+Charakter heißen LEVELS (Niveaus) und die Veränderungs-Charakter heißen RATES
+(Veränderungsraten, Geschwindigkeiten). Die entsprechenden Gleichungen werden mit
+L bzw. R gekennzeichnet. Es gib weitere Kennzeichnungen:
+
+ C für Konstantendefinition (constant)
+ T für Tabellendefintion (table)
+ A für Hilfsgrößen (auxiliaries)
+ N für Anfangswerte (initial)
+ X für Folgezeile (extension)
+ PRINT für Ausgabe von Zahlen
+ PLOT für Ausgabe von Diagrammen
+
+Ein einfaches Bevölkerungsmodell könnte z.B. so geschriben werden:
+
+
+ L BEVÖLKERUNG.K=BEVÖLKERUNG.J+DT*(GEBURTENRATE.JK
+ X -STERBERATE.JK)
+ R STERBERATE.KL=5
+ R GEBURTENRATE.KL=20
+ N BEVÖLKERUNG=1000
+ C DT=1 (jedes Jahr wird neu berechnet)
+ C LENGTH=60 (60 Jahre werden simuliert)
+ PRINT BEVÖLKERUNG
+
+
+Für eine tiefere Einführung in DYNAMO sollte man die Referenzliteratur zu Rate
+ziehen.
+
+
+
+
+#ib#1.4 Eine erste, kleine Sitzung mit dem
+DYNAMO-System#ie#
+
+
+
+Wir gehen davon aus, daß das DYNAMO-System in ihrer Task generiert worden ist
+(siehe 2.).
+
+ 1. Tippen Sie das obrige Programm mittels des EUMEL-Editors ab.
+
+ 2. Verlassen Sie den Editor mit <ESC><q> und starten Sie den DYNAMO-
+ Compiler durch die Eingabe des Befehls "dynamo".
+
+ 3. Nach erfolgreichem Übersetzen sollte Ihnen nun das DYNAMO-Runtime-
+ System zur Verfügung stehen. Durch den Befehl 'run' wird das Programm aus­
+ geführt und Sie erhalten eine Zahlenkolonne, die die Entwicklung der Bevöl­
+ kerung in den zu untersuchenden 60 Jahren angibt. Falls Ihnen beim Abtippen
+ des Programms Fehler unterlaufen sein sollten, so kann das Programm nicht
+ fehlerfrei übersetzt werden. Fehlermeldunggen zur Compile-Zeit des
+ DYNAMO-Compilers werden im Paralleleditor angezeigt; das Programm kann
+ im oberen der beiden Editorfenster (in diesem befinden Sie sich auch nach
+ Fehlern) korrigiert werden. Danach können Sie erneut wie nach Punkt 2 ver­
+ fahren.
+#page#
+
+
+
+#ib#2. Generierung des DYNAMO-Compilers#ie#
+
+
+
+Der DYNAMO-Compiler, seine Funktionen und die Beispielprogramme werden auf
+zwei Archiv-Disketten a#b#' 360 KB ausgeliefert.
+
+Zum Generieren des DYNAMO-Systems legen Sie bitte die erste Diskette in das
+Dikettenlaufwerk Ihres Rechners und durch folgende Kommandozeile lesen Sie den
+Generator vom Archiv und starten ihn:
+
+
+ archive ("dynamo"); fetch ("dyn.inserter", archive); run
+
+
+Danach holt der Generator alle benötigten Dateien vom eingelegten Archiv bzw. von
+dem zweiten Archiv (nachdem er Sie zum Wechseln der Diskette aufgefordert hat).
+Anschließend wird der DYNAMO-Compiler insertiert. Am Ende der Generierung
+werden Sie gefragt werden, ob Sie den Compiler mit Grafik#u##count ("Grafik")##e# oder ohne benutzen
+wollen. Nach der Meldung "dynamo system generiert" können Sie den Compiler#foot#
+#u##value ("Grafik")##e# Es kann z.Zt. nur eine CGA-Grafikkarte betrieben werden
+#end#
+nutzen.
+#page#
+
+
+
+#ib#3. Der EUMEL-DYNAMO-Compiler#ie#
+
+
+
+Der im EUMEL-System implementierte DYNAMO-Compiler ist ein 2-Pass-
+Compiler, der die DYNAMO-Programme zunächst in ELAN übersetzt. Der Vorteil
+dieser Methode besteht darin, daß es möglich ist, übersetzte Programme unabhängig
+vom DYNAMO-Compiler zur Ausführung bringen zu können.
+
+Die Notation der im folgenden aufgeführten ELAN-Prozeduren des Compilers ent­
+spricht der in den EUMEL-Handbüchern üblichen Prozedurkopf-Schreibweise.
+
+Als Beispiel:
+
+
+ dynamo ("dyn.grasshasenfuchs")
+
+
+ein Beispiel für den Aufruf der Prozedur mit der Prozedurkopf-Schreibweise
+
+ PROC dynamo (TEXT CONST filename)
+
+auf der Kommando-Ebene des Betriebssystems EUMEL.
+
+Der Prozedur 'dynamo' wird beim Aufruf der Dateiname (TEXT) 'filename' übergeben
+und dadurch der Compiler auf die Datei mit dem Namen 'filename' angewendet.
+
+
+
+
+#ib#3.1. Benutzung des DYNAMO-Compiler#ie#
+
+
+
+Um ein DYNAMO-Programm zu Übersetzen, gibt es grundsätzlich zwei Möglichkei­
+ten. Erst einmal kann man ein DYNAMO-Programm in ein ELAN-Programm um­
+wandeln, jedoch ohne es dabei zur Ausführung zu bringen. Dieses ELAN-Programm
+kann man nun unabhängig vom eingentlichen Compiler starten. Die zweite, wohl öfter
+angewendete Methode ist, ein DYNAMO-Programm in ein ELAN-Programm zu
+compilieren, wobei es danach direkt ausgeführt wird. Ob danach ein ELAN-
+Programm zur Verfügung stehen soll, kann der Benutzer selbst entscheiden.
+
+
+PROC dynamo
+
+ Zweck: Aufruf des DYNAMO-Compilers mit 'quelldatei' = 'last param', d.h. das
+ zu übersetzende Programm steht in der zuletzt bearbeiteten Datei.
+
+
+PROC dynamo (TEXT CONST quelldatei)
+
+ Zweck: Ruft den DYNAMO-Compiler für die Datei 'quelldatei' auf. Anmerkung:
+ Gleichbedeutend mit 'dynamo (quelltext, quelltext + ".elan", TRUE)', s.
+ nächste Prozedur.
+
+ Beispiel:
+
+
+ dynamo ("dyn.grashasenfuchs")
+
+
+ Der DYNAMO-Compiler wird auf die Datei "dyn.grashasenfuchs" ange­
+ wendet.
+
+
+PROC dynamo (TEXT CONST quelldatei, zieldatei,
+ BOOL CONST pass2 ausfuehren)
+
+ Zweck: Diese Prozedur startet den DYNAMO-Compiler. 'quelldatei' gibt den
+ Namen der Datei an, in welcher der DYNAMO-Quelltext enthalten ist,
+ 'zieldatei' ist der Name der Datei, die das erzeugte ELAN-Programm
+ beinhalten soll. Wenn 'pass2 ausfuehren' = TRUE, dann wird dieses auch
+ durch den ELAN-Compiler weiterverarbeitet (das Programm wird zur
+ Ausführung gebracht).
+
+ Beispiel:
+
+
+ dynamo ("dyn.grashasenfuchs",
+ "grashasenfuchs.elanprogramm", FALSE)
+
+
+ Im obigen Beispiel wird der in der Datei "dyn.grashasenfuchs" enthaltene
+ DYNAMO-Quelltext in die Datei "grashasenfuchs.elanprogramm" als
+ ELAN-Programm geschrieben. Das ELAN-Programm wird nicht ausge­
+ führt.
+
+
+PROC erase (BOOL CONST erase option)
+
+ Zweck: Wenn 'erase option' = TRUE, so werden die erzeugten ELAN-Programme
+ nach Beendigung der Ausführung gelöscht, bei 'erase option' = FALSE
+ bleiben sie erhalten (Voreinstellung: 'erase option' = FALSE).
+
+
+PROC error listing (TEXT CONST fehlerdatei)
+
+ Zweck: Falls gewünscht ist, die Fehlermeldungen, die ggf. beim Übersetzen ein­
+ treten, auch in eine Datei zu schreiben, so können Sie hier unter 'fehler­
+ datei' einen Dateinamen angeben. Bei der Angabe von "" wird die Umlei­
+ tung in die Datei ausgeschaltet werden (Voreingestellt ist 'fehlerdatei' =
+ "").
+
+
+PROC graphic (BOOL CONST graphic option)
+
+ Zweck: Mit dieser Prozedur läßt sich einstellen, ob bei der DYNAMO-Anweisung
+ PLOT die hochauflösende Grafik ('graphic option' = TRUE) oder die zei­
+ chenorientierte Grafik ('grafik option' = FALSE) verwendet werden soll. Die
+ Voreinstellung wird bei der Installation des Compilers erfragt.
+
+
+PROC protokoll (BOOL CONST protokoll option)
+
+ Zweck: Bei 'protokoll option' = TRUE werden alle Textausgaben, die bei der
+ Laufzeit des DYNAMO-Programmes auftreten, nicht nur auf dem Bild­
+ schirm dargestellt, sondern auch in eine Datei mit dem Namen "dyn.out"
+ protokolliert (voreingestellt ist 'protokoll option' = FALSE). Die Datei
+ "dyn.out" enthält auch Seitenvorschubbefehle ('\#page\#') und sollte nur mit
+ einem EUMEL-Printer ausgedruckt werden.
+
+
+
+
+#ib#3.2. Abweichungen gegenüber dem
+ Sprachstandard#ie#
+
+
+
+ - Die Länge der Namen ist nicht auf 7 Zeichen festgelegt, sondern praktisch be­
+ liebig (32000). Dies ist eine Erweiterung; wer seine Programme auch auf ande­
+ ren DYNAMO-Compilern laufen lassen will, sollte sich aber auf 7 Zeichen be­
+ schränken.
+
+ - Zahlen werden intern mit einer Mantisse von 13 Stellen abgespeichert, von denen
+ nur die ersten 7 bei der Ausgabe dargestellt werden. Die größte darstellbare Zahl
+ ist daher 9.999999999999e126.
+
+ - Die maximale Anzahl der Gleichungen ist auf 950 festgelegt.
+
+ - Der Compiler akzeptiert aus Gründen der besseren Lesbarkeit auch Programme,
+ die in Kleinschrift geschrieben sind. Dabei ist es sinnvoll, die Quellprogramme
+ konsistent zu halten (d.h. Groß- und Kleinschrift nicht zu vermischen). Man
+ sollte grundsätzlich Kleinschrift vorziehen, da diese vom Compiler auch effizienter
+ verarbeitet werden kann.
+
+ - Quellprogramme dürfen eine beliebige Zahl von Leerzeilen enthalten. X - Befeh­
+ le (Fortschreibungszeilen) werden davon nicht beeinflußt.
+
+ - In der augenblicklichen Version 3.3 des Compilers gelten folgende Einschränkun­
+ gen :
+
+ 1. Bei der Verarbeitung von Array-Gleichungen werden Compilerseitig keine
+ Semantik-Überprüfungen auf eventuell unzureichende Initialisierung oder
+ Überlappung (d.h. mehrfaches Setzen desselben Elements) durchgeführt.
+ Defaultmäßig bekommen alle Elemente einer Array-Gleichung bei der Initiali­
+ sierung den Wert '0.0' zugewiesen.
+
+ 2. Die maximale Größe von Tables und Array-Gleichungen ist durch Verwen­
+ dung des Vector-Pakets auf 4000 Elemente festgelegt. Da pro Table-Ele­
+ ment aber zur Zeit eine Zeile im Zielprogramm generiert wird, sollte man dies
+ besser nicht ausnutzen.
+
+ 3. Supplementary-Gleichungen werden aus Kompatibilitäts-Gründen korrekt
+ übersetzt, aber sonst wie Auxiliary-Gleichungen behandelt.
+
+ 4. Print ('prtper')- und Plotperiode ('pltper') werden nur als Konstanten verarbei­
+ tet. Falls Gleichungen für 'prtper' oder 'pltper' angegeben werden, so bewirken
+ diese keine Veränderung.
+
+ 5. Array-Gleichungen dürfen nicht mehr als eine Dimension besitzen.
+
+ 6. Für Gleichungen, die Makro-Aufrufe enthalten, sollten Initialisierungs (N)-
+ Gleichungen angegeben werden.
+
+
+
+#ib#3.3. Das DYNAMO Runtime-System#ie#
+
+
+
+Nach erfolgreicher Übersetzung wird vom Zielprogramm das Runtime-System aufge­
+rufen. In diesem Modus (das DYNAMO-Runtime-System meldet sich mit "dynamo
+runtime system :") ist es möglich, Konstanten zu ändern und DynamoProgramme zur
+Ausführung zu bringen.
+
+Im DYNAMO-Runtime-System stehen folgende Kommandos zur Verfügung (näheres
+zur Notation siehe Kapitel 4, S. #to page ("Anweisungen und Funktionen")#).
+
+
+ run
+
+ Zweck: Ausführen des übersetzten Programms
+
+
+ run <name>
+
+ Zweck: Ausführen des übersetzten Programms und retten des Konstantendaten­
+ raums in des Datenraum mit dem Namen "<name>.const". Existiert der
+ Datenraum bereits, werden die Konstanten aus dem Datenraum in den
+ Lauf übernommen. Somit ermöglicht der Compiler, Konstantenwerte aus
+ einem früheren Lauf wieder zu verwenden.
+
+
+ c <Konstantenname>=Wert [/<Konstantenname>=Wert [...]]
+
+ Zweck: Änderung einer oder mehrerer Konstanten
+
+
+ ?
+
+ Zweck: Anzeigen der Konstanten und ihrer Werte
+
+
+ quit
+
+ Zweck: Verlassen des Runtime-Systems
+
+
+ help
+
+ Zweck: Zeigt eine kurze Erklärung
+
+
+Bei PRINT- und PLOT-Ausgaben sind folgende Kommandos möglich:
+
+ + Nächster Bildschirm
+ o (Off), keine Unterbrechung der Ausgabe (nicht möglich bei hochauflösen­
+ der Grafik)
+ e (End), Zurück zum Runtime System
+ p Phasendiagramm (nur bei hochauflösender Grafik möglich)
+
+
+
+#ib#3.4. Fehlermeldungen des
+ DYNAMO-Compilers#ie#
+
+
+
+Falls der Compiler einen Fehler im DYNAMO-Programm entdeckt, gibt er eine Feh­
+lermeldung nach dem folgenden Muster aus:
+"Fehler in Zeile <zeilennummer> bei >> <symbol> << : <fehlertext>.
+
+Im folgenden sind alle Fehlermeldungen und Möglichkeiten zur Abhilfe aufgelistet,
+sofern diese nicht klar ersichtlich sind:
+
+ 1 GLEICHUNG DOPPELT DEFINIERT
+
+ 2 DOPPELTE INITIALISIERUNG
+
+ 3 FALSCHER ZEILENTYP
+ -> Erlaubt sind : a, c, l, n, r, s, print, plot, note, spec, *, x, macro, mend,
+ for, noise, run.
+
+ 4 VERSCHACHTELTE MAKRO-DEFINITION
+ -> 'mend' - Befehl fehlt.
+
+ 5 MAKRO-NAME ERWARTET
+
+ 6 '(' ERWARTET
+
+ 7 FORMALER PARAMETER ERWARTET
+
+ 8 ')' NACH PARAMETERLISTE ERWARTET
+
+ 9 BEI AUXILIARIES NUR SUBSKRIPTION MIT '.K' ERLAUBT
+
+10 BEI KONSTANTEN-DEFINITION NAME ERWARTET
+
+11 BEI LEVELS NUR SUBSKRIPTION MIT '.K' ERLAUBT
+
+12 BEI RATES NUR SUBSKRIPTTION MIT '.KL' ERLAUBT
+
+13 BEI TABLE-DEFINITIONEN KEINE SUBSKRIPTION ERLAUBT
+
+14 X - BEFEHL HIER NICHT ERLAUBT
+
+15 BEI FOR-DEFINITION NAME ERWARTET
+
+16 '=' NACH FOR-VARIABLE ERWARTET
+
+17 BEREICHSANGABE ERWARTET
+
+18 ',' ERWARTET
+
+19 LOKALE GLEICHUNG NUR IN MAKRO ERLAUBT
+
+20 BEI DEFINITION NAME ERWARTET
+
+21 '=' ERWARTET
+
+22 INDEX NICHT KORREKT
+ -> Als Index ist nur erlaubt : <for variable> !,
+ <add op> <ganze zahl>!.
+ <add op> ::= "+"; "-".
+
+23 ')' NACH INDIZIERUNG ERWARTET
+
+24 PRTPER NICHT DEFINIERT
+ -> Wenn das Programm einen Print-Befehl enthält, muß 'prtper' (Printperiode)
+ als Konstante definiert werden.
+
+25 PLTPER NICHT DEFINIERT
+ -> Wenn das Programm einen Plot-Befehl enthält, muß 'pltper' (Plotperiode)
+ als Konstante definiert werden.
+
+26 '/' ODER ',' BEI PLOT ERWARTET
+
+27 NAME ALS PLOTPARAMETER ERWARTET
+
+28 DOPPELTE SCALE - ANGABE IN EINER GRUPPE
+ -> Wenn mehrere Plotparameter mit ',' getrennt werden (also die gleiche Ska­
+ lierung erhalten), dürfen nicht mehrere feste Skalierungen angegeben wer­
+ den.
+
+29 ERSTE SCALE - ANGABE ERWARTET
+
+30 ZWEITE SCALE - ANGABE ERWARTET
+
+31 ')' NACH SCALE - ANGABE FEHLT
+
+32 PRINTPARAMETER NICHT DEFINIERT
+
+33 PRINTPARAMETER ERWARTET
+
+34 TIME DARF NUR INITIALISIERT WERDEN
+
+35 DT NICHT DEFINIERT
+
+36 LENGTH NICHT DEFINIERT
+
+37 BEI KONSTANTEN - DEFINITION ZAHL ERWARTET
+
+38 BEI INITIALISIERUNG KONSTANTE ERWARTET
+
+39 LEVELS MUESSEN INITIALISIERT WERDEN
+
+40 KONSTANTE BEI TABLE ERWARTET
+
+41 '/' ODER "," ERWARTET
+
+42 TABLE - DEFINITION OHNE BENUTZUNG
+
+43 SIMULTANE GLEICHUNGEN
+ -> Bei dem Versuch, A, R, oder N - Gleichungen zu sortieren, trat eine
+ direkte oder indirekte Rekursion auf.
+
+44 FAKTOR ERWARTET
+ -> Erwartet : <zahl>;
+ <funktions aufruf>;
+ <macro aufruf>;
+ <gleichungs name>;
+ '(', <ausdruck>, ')';
+ <monadischer operator>, <faktor>.
+ <monadischer operator> ::= '+'; '-'.
+
+45 TIME MUSS MIT '.J' ODER '.K' SUBSKRIBIERT WERDEN
+
+46 SYMBOL NICHT DEFINIERT
+
+47 FUNKTION NICHT DEFINIERT
+
+48 UNZULAESSIGE INDIZIERUNG
+ -> Die Indices auf beiden Seiten der Gleichung müssen immer gleich sein.
+
+49 FALSCHE PARAMETERANZAHL
+
+50 FALSCHES TRENNSYMBOL ZWISCHEN PARAMETERN
+
+51 ALS PARAMETER TABLE ERWARTET
+
+52 FALSCHER PARAMETER IN TABLEFUNKTION
+
+53 ZU VIELE AKTUELLE PARAMETER
+
+54 ')' NACH MAKROAUFRUF FEHLT
+
+55 REKURSIVER MAKROAUFRUF
+
+56 BEI N - GLEICHUNG KEINE SUBSKRIPTION ERLAUBT
+
+57 FALSCHE SUBSKRIPTION IN AUXILIARY - GLEICHUNG
+
+58 ')' ERWARTET
+
+59 FALSCHE SUBSKRIPTION IN LEVEL - GLEICHUNG
+
+60 FALSCHE SUBSKRIPTION IN RATE - GLEICHUNG
+
+61 FOR - VARIABLE NICHT DEFINIERT
+ -> Eine FOR - Variable muß vor der ersten Benutzung definiert werden.
+
+62 KONSTANTE ERWARTET
+
+63 FALSCHES REAL - FORMAT
+ -> Exponent fehlt
+
+64 GLOBALE GLEICHUNG IN MACRO NICHT ERLAUBT
+
+65 DOPPELTE DEFINITION BEI MEHRFACHEM MAKROAFRUF
+
+66 ALS NOISE - PARAMETER ZAHL ERWARTET
+#page#
+
+#ib#4. Anweisungen und Funktionen des
+ EUMEL-DYNAMO-Compilers#ie#
+#goal page ("Anweisungen und Funktionen")#
+
+
+Dieses Kapitel gibt eine alphabetische Übersicht über die im EUMEL-DYNAMO-
+Compiler realisierten Anweisungen und Funktionen (wertliefernde Algorithmen).
+
+Die Beschreibung der Anweisungen und Funktionen ist nach der DYNAMO-
+Syntaxregel angegeben, wobei folgende Zeichen mit besonderer Bedeutung verwendet
+werden:
+
+ [] optionale Angabe
+ [...] beliebig häufige Wiederholung der letzten optionalen Angabe
+ < > in spitzen Klammern stehende Namen sind Variablen- bzw. Konstan­
+ tennamen
+ <Name> steht für einen beliebigen Bezeichner gemäß der DYNAMO-Syntax
+ <Zahl> bezeichnet einen beliebigen Wert (also auch eine Ausdruck)
+ {} Alternative Angabe
+
+ X DYNAMO Anweisung, kennzeichnet eine Fortsetzungsszeile der
+ vorhergegangenen Anweiung (S. #to page ("X")#)
+
+Alle Anweisungen und Funktionen werden nach dem gleichen Schema dargestellt:
+
+
+
+Funktionsname#right#Typ (Funkt. oder Anweisung)
+
+
+Zweck: Schlagwort zur Wirkung
+
+Format: Beschreibung des Formates (spezielle Zeichen s.o.)
+
+Erklärung: kurze Beschreibung der Anweisung/Funktion
+
+Beispiel: Anwendung der Anweisung/Funktion
+
+Programm: Beispielprogramm, in welchem die Anweisung/Funktion angewendet wird.
+
+Referenz: Verweis auf ähnliche oder äquivalente Anweisungen/Funktionen im
+ Format '<Funktions- bzw. Anweisungsname>, Seitennummer'.
+
+
+Eine oder mehrere dieser Felder können fehlen (z.B. wenn es keine Referenz oder
+kein Beispielprogramm gibt).
+#page#
+
+
+
+#ib#4.1. Übersicht über die Anweisungen und
+ Funktionen#ie#
+
+
+
+#goal page ("A")##ib (2)#A#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Auxiliary-Gleichung (A-Gleichung, Hilfsgleichung)
+
+Format: A <Auxiliary-Name>.K=<Ausdruck>#u##count ("Ausdruck")##e#
+#foot#
+#u##value ("Ausdruck")##e# genaueres über die Definition eines Ausdruckes siehe [1], S. 93
+#end#
+
+Erklärung: Mit Hilfe von Auxiliary-Gleichungen werden Level- und Hilfsgrößen
+ (Auxiliaries) zum selben Zeitpunkt verknüpft.
+
+Beispiel: A JM.K=MM.K/MEJ
+
+Programm: "dyn.workfluc"
+
+
+
+#ib (2)#ABS#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Absolutbetrag
+
+Format: ABS(<Zahl>)
+
+Erklärung: Liefert den Absolutbetrag
+
+
+ IF <Zahl> >= 0 THEN
+ <Zahl>
+ ELSE
+ - <Zahl>
+ END IF
+
+Beispiel: N X=ABS(A*2.0)
+
+
+
+#goal page ("ARCTAN")#ARCTAN#on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Berechnung der trigonometrischen Funktion Arcustangens
+
+Format: ARCTAN(<Zahl>)
+
+Erklärung: Berechnet den Arcustangens von <Zahl>; Ergebnis im Bogenmaß.
+
+Beispiel: N X=ARCTAN(TAN(1.3)) (X = 1.3)
+
+
+Referenz: COSD, S. #to page ("COSD")#
+ SIN, S. #to page ("SIN")#
+ SIND, S. #to page ("SIND")#
+ TAN, S. #to page ("TAN")#
+ TAND, S. #to page ("TAND")#
+ ARCTAND, S. #to page ("ARCTAN")#
+ COS, S. #to page ("COS")#
+
+
+
+#goal page ("ARCTAND")##ib (2)#ARCTAND#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Berechnung der trigonometrischen Funktion Arcustangens
+
+Format: ARCTAND(<Zahl>)
+
+Erklärung: Berechnet den Arcustangens von <Zahl>; Ergebnis im Gradmaß
+
+Beispiel: N X=ARCTAND(TAND(45.0)) (X = 45.0)
+
+
+Referenz: COSD, S. #to page ("COSD")#
+ SIN, S. #to page ("SIN")#
+ SIND, S. #to page ("SIND")#
+ TAN, S. #to page ("TAN")#
+ TAND, S. #to page ("TAND")#
+ COS, S. #to page ("COS")#
+ ARCTAN, S. #to page ("ARCTAND")#
+
+
+
+#goalpage ("C")##ib (2)#C#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Konstantendefinition
+
+Format: C <Name>=<Zahl>
+
+Erklärung: Werte, die während eines Simulationslaufes gleich bleiben, können durch
+ die Konstantendefintion benannt werden (s. auch 'c' im Runtime-
+ System).
+
+Beispiel: C POPI=30.3
+
+Programm: "dyn.wohnen"
+
+
+
+#goal page ("CLIP")##ib (2)#CLIP#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Wert nach Bedingung
+
+Format: CLIP(<Zahl1>,<Zahl2>,<Zahl3>,<Zahl4>)
+
+Erklärung: Liefert den Wert des ersten Argumentes, wenn das dritte Argument
+ größer oder gleich dem vierten Argument ist. Andernfalls wird der Wert
+ des zweiten Argumentes geliefert.
+
+
+ IF <Zahl3> >= <Zahl4> THEN
+ <Zahl1>
+ ELSE
+ <Zahl2>
+ END IF
+
+Beispiel: N X=CLIP(1.0,2.0,3.0,4.0) (X = 2.0)
+
+
+Programm: "dyn.welt/forrester"
+
+Referenz: FIFGE, S. #to page ("FIFGE")# (äquivalente Funktion)
+
+
+
+#goalpage ("COS")#COS#on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Berechnung der trigonometrischen Funktion Cosinus
+
+Format: COS(<Zahl>)
+
+Erklärung: Es wird der Cosinus des Wertes <Zahl>, welcher im Bogenmaß vorlie­
+ gen muß, geliefert.
+
+Beispiel: N X=COS(1.6)
+
+Referenz: COSD, S. #to page ("COSD")#
+ SIN, S. #to page ("SIN")#
+ SIND, S. #to page ("SIND")#
+ TAN, S. #to page ("TAN")#
+ TAND, S. #to page ("TAND")#
+ ARCTAN, S. #to page ("ARCTAN")#
+ ARCTAND, S. #to page ("ARCTAND")#
+
+
+
+#goal page ("COSD")##ib (2)#COSD#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Berechnung der trigonometrischen Funktion Cosinus
+
+Format: COSD(<Zahl>)
+
+Erklärung: Es wird der Cosinus des Wertes <Zahl>, welcher im Gradmaß vorliegen
+ muß, geliefert.
+
+Beispiel: N X=COSD(33.5)
+
+Referenz: COS, S. #to page ("COS")#
+ SIN, S. #to page ("SIN")#
+ SIND, S. #to page ("SIND")#
+ TAN, S. #to page ("TAN")#
+ TAND, S. #to page ("TAND")#
+ ARCTAN, S. #to page ("ARCTAN")#
+ ARCTAND, S. #to page ("ARCTAND")#
+
+
+
+#goal page ("EXP")##ib (2)#EXP#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Exponentialfunktion zur Basis e
+
+Format: EXP(<Zahl>)
+
+Erklärung: Liefert e#u#<Zahl>#e#
+
+Beispiel: N X=EXP(1.0) (X = 2.71 = e)
+
+
+Referenz: LN, S. #to page ("LN")# (Umkehrfunktion)
+
+
+
+#goal page ("FIFGE")##ib (2)#FIFGE#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Wert nach Bedingung (#on ("u")#f#off ("u")#irst #on ("u")#if#off ("u")# #on ("u")#g#off ("u")#reater or #on ("u")#e#off ("u")#qual)
+
+Format: FIFGE(<Zahl1>,<Zahl2>,<Zahl3>,<Zahl4>)
+
+Erklärung: Liefert den Wert des ersten Argumentes, wenn das dritte Argument
+ größer oder gleich dem vierten Argument ist. Andernfalls wird der Wert
+ des zweiten Argumentes geliefert.
+
+
+ IF <Zahl3> >= <Zahl4> THEN
+ <Zahl1>
+ ELSE
+ <Zahl2>
+ END IF
+
+Beispiel: N X=FIFGE(1.0,2.0,3.0,4.0) (X = 2.0)
+
+
+Referenz: CLIP, S. #to page ("CLIP")# (äquivalente Funktion)
+
+
+
+#goal page ("FIFZE")##ib (2)#FIFZE#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Wert nach Bedingung (#on ("u")#f#off ("u")#irst #on ("u")#if#off ("u")# #on ("u")#ze#off ("u")#ro)
+
+Format: FIFZE(<Zahl1>,<Zahl2>,<Zahl3>)
+
+Erklärung: Wenn der Parameter <Zahl3> den Wert 0 hat, so wird <Zahl1>
+ geliefert, andernfalls <Zahl2>
+
+
+ IF <Zahl3> = 0 THEN
+ <Zahl1>
+ ELSE
+ <Zahl2>
+ END IF
+
+Beispiel: N X=FIFZE(1.0,2.0,3.0) (X = 2.0)
+
+
+Referenz: SWITCH, S. #to page ("SWITCH")#
+
+
+
+#goal page ("FLOOR")##ib (2)#FLOOR#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Vorkommastellen
+
+Format: FLOOR(<Zahl>)
+
+Erklärung: Liefert die Vorkommastellen von <Zahl>
+
+Beipiel: N X=FLOOR(3.14) (X = 3.0)
+
+
+Referenz: FRAC, S. #to page ("FRAC")#
+
+
+
+#ib (2)#FOR#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Schleifen-Definition
+
+Format: FOR <Name>=<Zahl1>,<Zahl2>
+
+Erklärung: <Name> bezeichnet eine Schleifenvariable, die von <Zahl1> bis
+ <Zahl2> hochgezählt wird. Somit ist es möglich, gleiche Berechnungen
+ für die verschiedenen Werte einer Tabelle durchzuführen.
+
+Beispiel: FOR BERECHNUNGSZEITRAUM=1900,2100
+
+
+Programm: "dyn.bev"
+
+
+
+#goal page ("FRAC")##ib (2)#FRAC#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Nachkommastellen
+
+Format: FRAC(<Zahl>)
+
+Erklärung: Liefert die Nachkommastellen von <Zahl>
+
+Beispiel: N X=FRAC(3.14) (X = 0.14)
+
+
+Referenz: FLOOR, S. #to page ("FLOOR")#
+
+
+
+#goal page ("L")##ib (2)#L#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Level-Gleichung
+
+Format: L <Level-Name>.K=<Level-Name>.J+
+ <Vergangenheitsausdruck>
+
+Erklärung: Die Level-Gleichung stellt einen gegenwärtigen Wert in Bezug zu
+ seinem Wert in der Vergangenheit und seiner Veränderungsrate in der
+ bis dahin vergangenen Zeit (Vergangenheitsausdruck s. [1], S. 96).
+
+Beispiel: L HASEN.K=CLIP(HASEN.J+DT*(HGRATE.JK
+ X -HSRATE.JK),0,HASEN.J,0)
+
+Programm: "dyn.grashasenfuchs"
+
+
+
+#goal page ("LN")##ib (2)#LN#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Logarithmus-Funktion
+
+Format: LN(<Zahl>)
+
+Erklärung: Berechnet den natürlichen Logarithmus von <Zahl>
+
+Beispiel: N X=LN(1.0) (X = 0.0)
+
+
+Programm: "dyn.wasseröko"
+
+Referenz: LOG2, S. #to page ("LOG2")#
+ LOG10, S. #to page ("LOG10")#
+ EXP, S. #to page ("EXP")#
+
+
+
+#goal page ("LOG2")##ib (2)#LOG2#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Logarithmus-Funktion
+
+Format: LOG2(<Zahl>)
+
+Erklärung: Berechnet den Logarithmus von <Zahl> zur Basis 2
+
+Beispiel: N X=LOG2(8.0) (X = 3.0)
+
+
+Referenz: LN, S. #to page ("LN")#
+ LOG10, S. #to page ("LOG10")#
+
+
+
+#goal page ("LOG10")##ib (2)#LOG10#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Logarithmus-Funktion
+
+Format: LOG10(<Zahl>)
+
+Erklärung: Berechnet den Logarithmus von <Zahl> zur Basis 10
+
+Beispiel: N X=LOG10(100.0) (X = 2.0)
+
+
+Referenz: LOG2, S. #to page ("LOG2")#
+ LN, S. #to page ("LN")#
+ EXP, S. #to page ("EXP")#
+
+
+
+#goal page ("MACRO")##ib (2)#MACRO#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Macro-Definition
+
+Format: MACRO <Name>(<Ausdruck>[,<Ausdruck>[...]])
+
+Erklärung: Durch die Verwendung der MACRO-Anweisung können Sie einer oder
+ mehreren DYNAMO-Gleichungen einen Namen geben (<Name>).
+ Macros müssen durch MEND abgeschloßen werden und dürfen #on ("u")#nicht#off ("u")#
+ rekursiv aufgerufen werden (vergl. Refinements in ELAN).
+
+Beispiel: MACRO SMOOTH(IN,DEL)
+ L SMOOTH.K=SMOOTH.J+DT*(IN.J-SMOOTH.J)/DEL
+ N SMOOTH=IN
+ MEND
+
+Programm: "dyn.mac" (diese Datei enthält alle bisherigen Makros)
+
+Referenz: MEND, S. #to page ("MEND")#
+
+
+
+#goal page ("MAX")##ib (2)#MAX#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Maximum zweier Größen
+
+Format: MAX(<Zahl1>,<Zahl2>)
+
+Erklärung: Liefert die größere Zahl aus <Zahl1> und <Zahl2>
+
+
+ IF <Zahl1> > <Zahl2> THEN
+ <Zahl1>
+ ELSE
+ <Zahl2>
+ END IF
+
+Beispiel: N X=MAX(1.0,2.0) (X = 2.0)
+
+
+Referenz: MIN, S. #to page ("MIN")#
+
+
+
+#goal page ("MEND")##ib (2)#MEND#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Macro-Definition
+
+Format: MEND
+
+Erklärung: MEND beendet eine Macro-Definition
+
+Beispiel: MACRO SMOOTH(IN,DEL)
+ L SMOOTH.K=SMOOTH.J+DT*(IN.J-SMOOTH.J)
+ X /DEL
+ N SMOOTH=IN
+ MEND
+
+Programm: "dyn.mac" (diese Datei enthält alle bisherigen Makros)
+
+Referenz: MACRO, S. #to page ("MACRO")#
+
+
+
+#goal page ("MIN")##ib (2)#MIN#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Minimum zweier Größen
+
+Format: MIN(<Zahl1>,<Zahl2>)
+
+Erklärung: Liefert die kleinere Zahl aus <Zahl1> und <Zahl2>
+
+Beispiel: N X=MIN(1.0,2.0) (X = 1.0)
+
+
+Programm: "dyn.forst7"
+
+Referenz: MAX, S. #to page ("MAX")#
+
+
+
+#goal page ("N")##ib (2)#N#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Initialisierungsgleichung
+
+Format: N <Name>=<Zahl>
+
+Erklärung: Initialisert eine Variable mit dem Bezeichner <Name> auf den Wert
+ <Zahl>, d.h. es wird ihr ein Startwert zugewiesen.
+
+Beispiel: N X=1900
+
+Programm: "dyn.grashasenfuchs"
+
+
+
+#goal page ("NOISE")##ib (2)#NOISE#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Pseudo-Zufallszahlen-Generator
+
+Format: NOISE(<Zahl>)
+
+Erklärung: Diese Funktion liefert eine Pseudo-Zufallszahl zwischen -0.5 und +0.5
+ und setzt einen neuen Startwert für den Generator fest. Der Parameter
+ <Zahl> wird nicht ausgewertet.
+
+Beispiel: N X=NOISE(0)
+
+Referenz: NORMRN, S. #to page ("NORMRN")#
+
+
+
+#goal page ("NORMRN")##ib (2)#NORMRN#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Pseudo-Zufallszahlen-Generator
+
+Format: NORM(<Zahl1>,<Zahl2>)
+
+Erklärung: Liefert einen Wert zwischen <Zahl1> - <Zahl2> * 2.4 und <Zahl1>
+ + <Zahl2> * 2.4.
+
+Beispiel: N X=NORM(1.0,10.0)
+
+Referenz: NOISE, S. #to page ("NOISE")#
+
+
+
+#ib (2)#NOTE#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Kommentar
+
+Format: NOTE <Kommentarzeile>
+
+Erklärung: Die Zeilen, die mit NOTE gekennzeichnet sind, werden vom Compiler als
+ Kommentarzeilen erkannt und nicht beachtet. NOTE-Zeilen haben nur
+ dokumentierenden Charakter und sind für den Programmlauf ohne jede
+ Bedeutung. Dennoch sollte man, wenn immer möglich, Kommentare in
+ sein DYNAMO-Programm einfügen, denn sie sind in DYNAMO an­
+ nähernd die einzige Möglichkeit, ein Programm lesbar zu machen, damit
+ es auch nach längerer Zeit noch korrigiert werden kann.
+
+Beispiel: NOTE Dies ist eine Kommentarzeile
+
+Programm: "dyn.welt/forrester"
+
+
+
+#goal page ("PLOT")##ib (2)#PLOT#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Darstellen der Ergebnisse in Diagrammform
+
+Format: PLOT <Name>[=<Druckzeichen>][(<Skalenbegin>,
+ <Skalenende>)][/...][,...]
+
+Erklärung: Durch diese Anweisung werden die Größen nach PLTPER Zeiteinheiten
+ in einem Diagramm ausgegeben. Die Angabe eines Druckzeichens ist
+ nur bei zeichenorientierten Grafik erforderlich, denn bei hochauflösender
+ Grafik werden die Graphen der verschiedenen Größen durch unterschied­
+ liche Linientypen gezeichnet; fehlt bei der zeichenorientierten Grafik das
+ Druckzeichen, so werden die Graphen durch die Zahlen von 0...9 darge­
+ stellt. Bei "/" werden verschiedene, bei "," gleiche Skalen benutzt.
+
+Beispiel: PLOT GRAS=G(995,1005)/HASEN=H(85,115)
+ X /FUECHS=F(15,35)
+
+Programm: "dyn.grashasenfuchs"
+
+Referenz: PRINT, S. #to page ("PRINT")#
+
+
+
+#goal page ("POWER")##ib (2)#POWER#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Potenzfunktion
+
+Format: POWER(<Zahl1>,<Zahl2>)
+
+Erklärung: Liefert <Zahl1>#u#<Zahl2>#e#
+
+Beipiel: N X=POWER(2, 2) (X = 4)
+
+
+Referenz: SQRT, S. #to page ("SQRT")#
+
+
+
+#goal page ("PRINT")##ib (2)#PRINT#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Darstellung der Ergebnisse in Tabellenform
+
+Format: PRINT <Name>[/...][,...]
+
+Erklärung: Durch diese Anweisung werden die Werte (<Name>) nach PRTPER
+ Zeiteinheiten in einer Tabelle ausgegeben. Die Ausgabe kann umgeleitet
+ werden (s. 'protokoll').
+
+Beispiel: PRINT GBEV,BEV(1),BEV(40),BEV(60),BEV(63)
+ X ,BEV(65),ZBEV,PRENT
+
+Programm: "dyn.bev"
+
+Referenz: PLOT, S. #to page ("PLOT")#
+
+
+
+#goal page ("R")##ib (2)#R#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Rate-Gleichung
+
+Format: R<Rate-Name>.KL=<Gegenwartsausdruck>
+
+Erklärung: Eine Rate-Gleichung stellt die Veränderungsrate in Bezug zu den aktu­
+ ellen Level-Größen.
+
+Beispiel: R FGRATE.KL=FGK*HASEN*FUECHS.K
+
+
+Programm: "dyn.grashasenfuchs"
+
+Referenz: A, S. #to page ("A")#
+ C, S. #to page ("C")#
+ L, S. #to page ("L")#
+
+
+
+#ib (2)#RAMP#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Wert nach Bedingung
+
+Format: RAMP(<Zahl1>,<Zahl2>)
+
+Erklärung: Wenn TIME kleiner <Zahl2>, dann liefert RAMP 0, andernfalls wird
+ <Zahl1> * (TIME - <Zahl2>) geliefert.
+
+
+ IF TIME < <Zahl2> THEN
+ 0
+ ELSE
+ <Zahl1> * (TIME - <Zahl2>)
+ END IF
+
+
+
+#goal page ("RUN")##ib (2)#RUN#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Überschrift
+
+Format: RUN <Überschrift>
+
+Erklärung: Gibt dem aktuellen Lauf eine Überschrift. Gleichzeitig ist
+ "<Überschrift>.const" der Name eines Datenraums, in dem die Kon­
+ stanten dieses Laufs aufgehoben werden (s. 'run' im Runtime-System).
+
+Beispiel: RUN Überschrift
+
+Referenz: *, S. #to page ("*")#
+
+
+
+#ib (2)#S#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Supplementary-Gleichung
+
+Format: S <Name>.K=<Vergangenheitsausdruck>
+
+Erklärung: Gleichungen für Hilfsgrößen werden durch Supplementary-Gleichungen
+ ausgedrückt.
+
+Beispiel: S SCHADSTOFFVERHÄLTNIS.K=COZWEI.K/OZWEI.K
+
+
+
+
+#ib (2)#SCLPRD#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Skalarprodukt
+
+Format: SCLPRD(<Tabelle1>,<Zahl1>,<Zahl2>,<Tabelle2>,<Zahl3>)
+
+Erklärung: Liefert das Skalarprokukt der Tabellen <Tabelle1> und <Tabelle2>,
+ wobei <Zahl1> und <Zahl2> den Ausschnitt aus der ersten Tabelle
+ angeben und <Zahl3> den Startindex für den Vektor in der zweiten
+ Tabelle angibt.
+
+Beispiel: GB.K=SCLPRD(BEV.K,15,44,GR,1)/2
+
+
+Programm: "dyn.bev"
+
+
+
+#goal page ("SIN")##ib (2)#SIN#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Berechnung der trigonometrischen Funktion Sinus
+
+Format: SIN(<Zahl>)
+
+Erklärung: Berechnet den Sinus von <Zahl>, welche im Bogenmaß angegeben
+ wird.
+
+Beispiel: N X=SIN(0.5)
+
+Referenz: COS, S. #to page ("COS")#
+ COSD, S. #to page ("COSD")#
+ SIND, S. #to page ("SIND")#
+ TAN, S. #to page ("TAN")#
+ TAND, S. #to page ("TAND")#
+ ARCTAN, S. #to page ("ARCTAN")#
+ ARCTAND, S. #to page ("ARCTAND")#
+
+
+
+#goal page ("SIND")##ib (2)#SIND#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Berechnung der trigonometrischen Funktion Sinus
+
+Format: SIND(<Zahl>)
+
+Erklärung: Berechnet den Sinus von <Zahl>, welche im Gradmaß angegeben wird.
+
+Beispiel: N X=SIND(45.0)
+
+Referenz: COS, S. #to page ("COS")#
+ SIN, S. #to page ("SIN")#
+ COSD, S. #to page ("COSD")#
+ TAN, S. #to page ("TAN")#
+ TAND, S. #to page ("TAND")#
+ ARCTAN, S. #to page ("ARCTAN")#
+ ARCTAND, S. #to page ("ARCTAND")#
+
+
+
+#ib (2)#SPEC#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Lauf-Anweisung
+
+ DT=<Zahl1>
+Format: SPEC { LENGTH=<Zahl2> }[/...]
+ PLTPER=<Zahl3>
+ PRTPER=<Zahl4>
+
+Erklärung: Durch die Lauf-Anweisung werden die Systemkonstanten festgesetzt.
+ Sie darf pro Lauf nur einmal benutzt werden.
+
+Beispiel: SPEC DT=1/PLTPER=1/PRTPER=1/LENGTH=2000
+
+
+Referenz: C, S. #to page ("C")# (SPEC kann durch C-Def. ersetzt werden)
+
+
+
+#goal page ("SQRT")##ib (2)#SQRT#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Quadratwurzel
+
+Format: SQRT(<Zahl>)
+
+Erklärung: Berechnet die Quadratwurzel aus <Zahl>
+
+Beispiel: N X=SQRT(4.0) (X = 2.0)
+
+
+Referenz: POWER, S. #to page ("POWER")#
+
+
+
+#ib (2)#STEP#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+Zweck: Wert nach Bedingung
+
+Format: STEP(<Zahl1>,<Zahl2>)
+
+Erklärung: Ist TIME kleiner <Zahl2>, so wird 0 geliefert, ansonsten <Zahl1>
+
+
+ IF TIME < <Zahl2> THEN
+ 0.0
+ ELSE
+ <Zahl1>
+ END IF
+
+Beispiel: N X=STEP(12.0,12.0)
+
+
+
+#goal page ("SUM")##ib (2)#SUM#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Summierung einer Tabelle
+
+Format: SUM(<Tabelle>)
+
+Erklärung: Liefert die Summe der Einträge in einer Tabelle
+
+Beispiel: A GESAMTBEV.K=SUM(BEV.K)
+
+Programm: "dyn.bev"
+
+Referenz: SUMV, S. #to page ("SUMV")#
+
+
+
+#goal page ("SUMV")##ib (2)#SUMV#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Summierung einer Tabelle
+
+Format: SUMV(<Tabelle>,<Zahl1>,<Zahl2>)
+
+Erklärung: Summierung der Einträge in der Tabelle von Element <Zahl1> bis
+ Element <Zahl2>
+
+Beispiel: A ZBEV.K=SUMV(BEV.K,16,59) Teilbevölkerung
+
+
+Programm: "dyn.bev"
+
+Referenz: SUM, S. #to page ("SUM")#
+
+
+
+#goal page ("SWITCH")##ib (2)#SWITCH#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Wert nach Bedingung
+
+Format: SWITCH(<Zahl1>,<Zahl2>,<Zahl3>)
+
+Erklärung: Wenn der Parameter <Zahl3> den Wert 0 hat, so wird <Zahl1>
+ geliefert, andernfalls <Zahl2> (gleichbedeutend mit FIFZE).
+
+
+ IF <Zahl3> = 0 THEN
+ <Zahl1>
+ ELSE
+ <Zahl2>
+ END IF
+
+Beispiel: N X=SWITCH(1.0,2.0,3.0) (X = 2.0)
+
+
+Referenz: FIFZE, S. #to page ("FIFZE")#
+
+
+
+#goal page ("T")##ib (2)#T#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Tabellen-Definition
+
+Format: T <Name>=<Zahl1>[/<Zahl2>[....]]
+
+Erklärung: Durch die T-Anweisung wird eine Tabelle definiert, die Elemente wer­
+ den durch "/" getrennt hintereinander angegeben.
+
+Beispiel: T TABELLE=1/2/3/4/5/6/8/9/10/11/12
+
+
+Programm: "dyn.bev"
+
+Referenz: TABLE, S. #to page ("TABLE")#
+ TABHL, S. #to page ("TABHL")#
+
+
+
+#goal page ("TABHL")##ib (2)#TABHL#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Tabellenfunktion
+
+Format: TABHL(<Tabelle>,<Zahl1>,<Zahl2>,<Zahl3>)
+
+Erklärung: IF <Zahl1> < <Zahl2> THEN
+ <Tabelle> (<Zahl2>)
+ ELIF <Zahl2> <= <Zahl1> AND <Zahl1> <= <Zahl3> THEN
+ TABLE (<Tabelle>, <Zahl1>, <Zahl2>, <Zahl3>)
+ ELSE
+ <Tabelle> (<Zahl3>)
+ END IF
+
+Beispiel: A BRMM.K=TABHL(BRMMT,MSL.K,0,5,1)
+
+
+Programm: "dyn.welt/forrester"
+
+Referenz: T, S. #to page ("T")#
+ TABLE, S. #to page ("TABLE")#
+
+
+
+#goal page ("TABLE")##ib (2)#TABLE#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Tabellenfunktion
+
+Format: TABLE(<Tabelle>,<Zahl1>,<Zahl2>,<Zahl3>,<Zahl4>)
+
+Erklärung: Verknüpft die Werte aus <Tabelle> mit <Zahl1>, wobei <Zahl2> den
+ ersten und <Zahl3> den letzten Tabelleneintrag angibt. <Zahl4> stellt
+ die Schrittweite dar.
+
+Beispiel: T TABELLE=1/2/3/4/5
+ A BEISP.K=TABLE(TABELLE,X.K,2,4,1)
+
+Programm: "dyn.welt/forrester"
+
+Referenz: T, S. #to page ("T")#
+ TABHL, S. #to page ("TABHL")#
+
+
+
+#goal page ("TAN")##ib (2)#TAN#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Berechnung der trigonometrischen Funktion Tangens
+
+Format: TAN(<Zahl>)
+
+Erklärung: Berechnet den Tangens von <Zahl>, welche im Bogenmaß angegeben
+ wird.
+
+Beispiel: N X=TAN(0.5)
+
+Referenz: COS, S. #to page ("COS")#
+ SIN, S. #to page ("SIN")#
+ COSD, S. #to page ("COSD")#
+ SIND, S. #to page ("TAN")#
+ TAND, S. #to page ("TAND")#
+ ARCTAN, S. #to page ("ARCTAN")#
+ ARCTAND, S. #to page ("ARCTAND")#
+
+
+
+#goal page ("TAND")##ib (2)#TAND#ie (2)##on ("i")##right#Funktion#off ("i")#
+
+
+Zweck: Berechnung der trigonometrischen Funktion Tangens
+
+Format: TAND(<Zahl>)
+
+Erklärung: Berechnet den Tangens von <Zahl>, welche im Gradmaß angegeben
+ wird.
+
+Beispiel: N X=TAND(45.0)
+
+Referenz: COS, S. #to page ("COS")#
+ SIN, S. #to page ("SIN")#
+ COSD, S. #to page ("COSD")#
+ TAN, S. #to page ("TAN")#
+ SIND, S. #to page ("SIND")#
+ ARCTAN, S. #to page ("ARCTAN")#
+ ARCTAND, S. #to page ("ARCTAND")#
+
+
+
+#goalpage ("X")##ib (2)#X#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Fortsetzungszeile
+
+Format: X <Fortsetzungszeile>
+
+Erklärung: Eine in der vorangegangenen Zeile nicht beendete Anweisung wird nach
+ einer X-Anweisung fortgesetzt (Es können beliebig viele X-Anweisun­
+ gen nacheinander folgen).
+
+Beispiel: T TABELLE=1/2/3/4/5/6/7/8/9/10/11/12/13/14
+ X /15/16/17/18/19
+
+Programm: "dyn.bev"
+
+
+
+#goal page ("*")##ib (2)#*#ie (2)##on ("i")##right#Anweisung#off ("i")#
+
+
+Zweck: Überschrift
+
+Format: * <Überschrift>
+
+Erklärung: Gibt dem aktuellen Lauf eine Überschrift
+
+Beispiel: * Überschrift
+
+Referenz: RUN, S. #to page ("RUN")#
+#page#
+
+#ib#5. Makros in DYNAMO#ie#
+
+
+
+
+Der DYNAMO-Compiler bietet die Möglichkeit, benutzereigene Funktionen zu definie­
+ren. Makros werden ähnlich wie Refinements in ELAN in das DYNAMO-Programm
+eingesetzt. Beim EUMEL-DYNAMO-Compiler werden mit "zz" beginnende Namen
+generiert, so daß Sie es vermeiden sollten, eigene Namen mit "zz" beginnen zu
+lassen. Weiterhin sollte man als Namen der aktuellen Parameter nicht die Namen der
+formellen Parameter verwenden.
+
+Folgende Makros werden standardmäßig vom DYNAMO-Compiler zur Verfügung
+gestellt:
+
+ macro delay1 (in, del) Verzögerung erster Ordnung
+
+ macro delay3 (in, del) Verzögerung dritter Ordnung
+ Material
+
+ macro delay3p (in, del, ppl) Verzögerung dritter Ordnung mit
+ Pipeline
+
+ macro delinf3 (in, del) Verzögerung dritter Ordnung für
+ Information
+
+ macro smooth (in, del) Verzögerung erster Ordnung für
+ Information
+
+
+
+
+#ib#5.1. Insertieren von Makros#ie#
+
+
+
+
+Makros werden durch folgende Prozedur in die Compilertabelle eingetragen:
+
+
+PROC insert macro (TEXT CONST filename):
+
+ Zweck: Fügt die in der Datei 'filename' enthaltenen Makros in die Makrotabelle ein.
+ Die Datei sollte zweckmäßigerweise nur Makrodefinitionen enthalten. Es ist
+ - im Gegensatz zu normalen DYNAMO-Programmen - nicht nötig, die
+ Systemkonstanten zu definieren (die Standard-Makros sind in der Datei
+ "dyn.mac" enthalten; diese Datei kann beliebig ergänzt werden).
+
+
+
+
+#ib#5.2. Aufbau eines Makros#ie#
+
+
+
+
+Makros beginnen in DYNAMO immer mit der Anweisung MACRO (s. auch Seite #to page ("MACRO")#)
+und enden mit MEND (s. Seite #to page ("MEND")#). Dazwischen steht ein Makrorumpf, bestehend
+aus einer oder mehreren DYNAMO-Gleichungen. Beim Makroaufruf können, soweit
+vorher definiert, Parameter angegeben werden, jedoch rekursiv aufrufen kann man
+Makros nicht.
+
+Beispiel: MACRO SMOOTH (IN, DEL)
+ L SMOOTH.K = SMOOTH.J + DT * (IN.J - SMOOTH.J)
+ X /DEL
+ N SMOOTH = IN
+ MEND
+
+Lokale Variablen in Makros beginnen mit einem $-Zeichen. Der Makro-Expandierer
+ersetzt das $-Zeichen durch "zz" gefolgt von einer Zahl. Aus diesem Grund sollen
+eigene Namen nicht mit "zz" beginnen.
+
+Falls Sie eine Fehlermeldung bekommen, die sich auf einen mit "zz" beginnenden
+Namen bezieht, sollten Sie den Fehler in dem entsprechenden Makro suchen.
+
+#on ("b")#
+Achtung: #off ("b")#Makros sollten nur von fortgeschrittenden DYNAMO-Programmieren
+ verwendet werden, da Makros Eigenschaften von Refinements (textuelle
+ Ersetzung) und Prozeduren (Parameterübergabe) vereinigen. Der daraus
+ folgende Effekt ist nicht ganz einfach zu durchschauen.
+#page#
+
+
+
+#ib#6. Erweiterung des Sprachumfangs#ie#
+
+
+
+
+Während Makros in DYNAMO geschrieben werden, ist es ferner möglich, die Menge
+der Funktionen mittels der Sprache ELAN zu erweitern.
+
+Hierbei geht man wie folgt vor:
+
+ 1. Schreiben einer Funktion in ELAN (näheres siehe unten)
+
+ 2. Einbinden der Funktion in die Tabellen des DYNAMO-Compilers
+
+ 2.1. Einschreiben des Namens der Funktion, gefolgt von den Typen der Ein­
+ gabeparameter in die bestehende Datei "dyn.std", wobei folgende Typen
+ existieren:
+
+ r real (Datentyp REAL)
+ t table (Datentyp TAB)
+
+ Abgeschlossen wird die "dyn.std"-Datei durch die Zeichensequenz "/*".
+
+ Beispiele:
+
+ power rr table trrrr /*
+
+
+ 2.2. Laden der Funktion(en) mittels der Prozedur 'init std ("dyn.std")'
+
+
+Eine zur Einbindung in den DYNAMO-Compiler vorgesehene ELAN-Funktion wird
+unter Beachtung gewisser Regeln erstellt:
+
+ 1. Die deklarierten ELAN-Prozeduren dürfen nur Parameter vom Typ REAL oder
+ TAB besitzen oder gänzlich ohne Parameter sein.
+
+ 2. Der Typ des Resultaten muß vom Typ REAL sein.
+
+Zur Manipulation von Tabellen wurde der Datentyp TAB geschaffen, auf welchen man
+wie auf das Standard-Vektorpaket zugreifen kann.
+
+Beispiel:
+
+ REAL PROC abs (REAL CONST a):
+ IF a < 0.0 THEN
+ -a
+ ELSE
+ a
+ END IF
+ END PROC abs;
+
+ PROC sumv (TAB CONST tab, REAL CONST erstes, letztes):
+ REAL VAR summe := 0.0;
+ INT VAR i;
+ FOR i FROM int (erstes) UPTO int (letztes) REPEAT
+ summe INCR wert (tab, i)
+ END REPEAT;
+ summe
+ END PROC sumv
+
+
+
+
+#ib#6.1. Für fortgeschrittende ELAN-Program­
+ mierer#ie#
+
+
+
+Der Quellcode des EUMEL-DYNAMO-Compilers wird mit ausgeliefert. Daher
+können Einschränkungen (s. 3.2 Abweichungen gegenüber dem Sprachstandard)
+leicht beseitigt werden. Wem z.B. die Anzahl der Gleichungen (950) zu wenig ist, der
+kann im Quelltext des Compilers diesen Wert (annähernd) beliebig nach oben hin
+erhöhen.
+
diff --git a/doc/dynamo/dynamo handbuch.index b/doc/dynamo/dynamo handbuch.index
new file mode 100644
index 0000000..af77d79
--- /dev/null
+++ b/doc/dynamo/dynamo handbuch.index
@@ -0,0 +1,69 @@
+#block##pageblock##page (52)#
+#head#
+#center#DYNAMO-Compiler
+#center#____________________________________________________________
+
+#end#
+#bottom odd#
+#center#____________________________________________________________
+GMD #right#DYNAMO - %
+#end#
+#bottom even#
+#center#____________________________________________________________
+DYNAMO - % #right#GMD
+#end#
+Anhang - Übersicht über Anweisungen und
+Funktionen
+
+
+#clear pos##l pos (0.0)##r pos (10.0)##fillchar (" ")#
+#table#
+A 21
+ABS 21
+ARCTAND 22
+C 23
+CLIP 23
+COSD 24
+EXP 25
+FIFGE 25
+FIFZE 26
+FLOOR 26
+FOR 27
+FRAC 27
+L 28
+LN 28
+LOG2 29
+LOG10 29
+MACRO 30
+MAX 31
+MEND 31
+MIN 32
+N 32
+NOISE 33
+NORMRN 33
+NOTE 34
+PLOT 35
+POWER 35
+PRINT 36
+R 36
+RAMP 37
+RUN 37
+S 38
+SCLPRD 38
+SIN 39
+SIND 39
+SPEC 40
+SQRT 40
+STEP 41
+SUM 41
+SUMV 42
+SWITCH 42
+T 43
+TABHL 43
+TABLE 44
+TAN 44
+TAND 45
+X 45
+* 46
+#table end#
+
diff --git a/doc/dynamo/dynamo handbuch.inhalt b/doc/dynamo/dynamo handbuch.inhalt
new file mode 100644
index 0000000..2d1b1f3
--- /dev/null
+++ b/doc/dynamo/dynamo handbuch.inhalt
@@ -0,0 +1,131 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#DYNAMO
+
+
+
+
+#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#
+#block#
+#center#____________________________________________________________________________
+
+ Copyright 1988
+
+ Selbstverlag GMD
+ Alle Rechte vorbehalten.
+ Insbesondere ist die Überführung in maschinenlesbare
+ Form, sowie das Speichern in Informationssystemen, auch
+ auszugsweise, nur mit schriftlicher Genehmigung der
+ GMD gestattet.
+#center#____________________________________________________________________________
+
+
+ Herausgeber:
+
+ Gesellschaft für Mathematik und Datenverarbeitung mbH
+
+ Postfach 1240, Schloß Birlinghoven
+ D-5205 Sankt Augustin 1
+ Telefon(02241) 14-1, Telex 8 89 469 gmd d
+ Telefax(02241) 14 28 89, BTX *43900\#
+ Teletex 2627-224135=GMDVV
+
+
+Autor:
+
+ Christian Szymanski
+
+nach Anregungen von:
+
+ Diether Craemer, Robert Keil
+
+überarbeitet von:
+
+ Thomas Müller
+
+Texterstellung:
+
+ Dieser Text wurde mit der EUMEL-Textverarbeitung erstellt und aufbereitet und
+ mit dem Agfa Laserdrucksystem P400 gedruckt.
+
+
+
+ Hinweis:
+
+#on("italics")#
+ Diese Dokumentation wurde mit größtmöglicher Sorgfalt erstellt. Dennoch wird
+ für die Korrektheit und Vollständigkeit der gemachten Angaben keine Gewähr
+ übernommen. Bei vermuteten Fehlern der Software oder der Dokumentation
+ bitten wir um baldige Meldung, damit eine Korrektur möglichst rasch erfolgen
+ kann. Anregungen und Kritik sind jederzeit willkommen.#off("italics")#
+#page#
+#pagenr ("%", 1")##setcount (1)##block##pageblock##count per page#
+#head#
+#center#DYNAMO-Compiler
+#center#____________________________________________________________
+
+#end#
+#bottom odd#
+#center#____________________________________________________________
+GMD #right#DYNAMO - %
+#end#
+#bottom even#
+#center#____________________________________________________________
+DYNAMO - % #right#GMD
+#end#
+
+Inhalt
+
+
+
+#clear pos##lpos (0.0)##r pos (10.0)##fillchar (" ")#
+#table#
+1. Einleitung 2
+ 1.1. Referenzliteratur 2
+ 1.2. Die Programmiersprache DYNAMO 3
+ 1.3. Kurz-Einführung in die DYNAMO-Schreibweise 4
+ 1.4. Eine erste, kleine Sitzung mit dem DYNAMO-System 6
+
+2. Generierung des DYNAMO-Compilers 7
+
+3. Der EUMEL-DYNAMO-Compiler 8
+ 3.1. Benutzung des DYNAMO-Compiler 8
+ 3.2. Abweichungen gegenüber dem Sprachstandard 11
+ 3.3. Das DYNAMO Runtime-System 12
+ 3.4. Fehlermeldungen des DYNAMO-Compilers 14
+
+4. Anweisungen und Funktionen des EUMEL-DYNAMO-Compilers 19
+ 4.1. Übersicht über die Anweisungen und Funktionen 21
+
+5. Makros in DYNAMO 47
+ 5.1. Insertieren von Makros 48
+ 5.2. Aufbau eines Makros 48
+
+6. Erweiterung des Sprachumfangs 50
+ 6.1. Für fortgeschrittende ELAN-Programmierer 51
+
+Anhang - Übersicht über Anweisungen unf Funktionen 52
+#table end#
+
diff --git a/doc/eudas/abb.1-1 b/doc/eudas/abb.1-1
new file mode 100644
index 0000000..06c27fd
--- /dev/null
+++ b/doc/eudas/abb.1-1
@@ -0,0 +1,94 @@
+init dgs;
+window (0.0, 0.0, 13.5, 7.1); (*viewport (0.0,0.0,13.5,7.1); *)
+scale (1.0,1.0,0.0,0.0);
+(*clear pixels;*)
+
+karteikasten (1.0, 3.5, "Kartei A", "Wegner", "Herbert");
+karteikasten (5.0, 0.5, "Kartei B", "Regmann", "Karin");
+
+LET myname = "abb.1-1";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (10000);
+*)
+PROC karteikasten (REAL CONST x, y, TEXT CONST name, t name, t vorname) :
+
+ move (x - 0.1, y);
+ draw (x + 3.6, y);
+ draw (x + 3.6, y + 1.0);
+ draw (x - 0.1, y + 1.0);
+ draw (x - 0.1, y);
+
+ move (x + 0.1, y + 1.1);
+ draw (x + 0.5, y + 1.5);
+ move (x + 0.1, y + 1.1);
+ draw (x + 3.6, y + 1.1);
+ move (x - 0.1, y + 1.0);
+ draw (x + 0.5, y + 1.6);
+
+ move (x + 3.6, y);
+ draw (x + 5.2, y + 1.6);
+ draw (x + 5.2, y + 2.6);
+ draw (x + 3.6, y + 1.0);
+ move (x + 3.6, y + 1.1); draw (x + 5.0, y + 2.5);
+ move (x + 5.2, y + 2.6); draw (x + 5.0, y + 2.6);
+
+ move (x + 0.5, y + 1.1);
+ draw (x + 0.5, y + 2.5);
+ draw (x + 4.0, y + 2.5);
+ draw (x + 4.0, y + 1.5);
+ move (x + 0.5, y + 2.5);
+ draw (x + 1.5, y + 3.5);
+ draw (x + 5.0, y + 3.5);
+ draw (x + 5.0, y + 2.5);
+ move (x + 5.0, y + 3.5);
+ draw (x + 4.0, y + 2.5);
+ REAL VAR x off := 0.1;
+ WHILE x off < 1.0 REP
+ move (x + 0.5 + xoff, y + 2.5 + x off);
+ draw (x + 4.0 + xoff, y + 2.5 + xoff);
+ draw (x + 4.0 + xoff, y + 1.5 + xoff);
+ x off INCR 0.1
+ END REP;
+ font size (0.5);
+ font expansion (1.5);
+ move (x + 0.5, y + 0.2); draw (name);
+ font size (0.25);
+ move (x + 0.7, y + 2.10); draw ("Name");
+ move (x + 0.7, y + 1.65); draw ("Vorname");
+ move (x + 0.7, y + 1.20); draw ("Strasse");
+ move (x + 2.1, y + 2.10); draw (": " + t name);
+ move (x + 2.1, y + 1.65); draw (": " + t vorname);
+ move (x + 2.1, y + 1.20); draw (":");
+
+END PROC karteikasten;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/eudas/abb.4-1 b/doc/eudas/abb.4-1
new file mode 100644
index 0000000..439e052
--- /dev/null
+++ b/doc/eudas/abb.4-1
@@ -0,0 +1,43 @@
+init dgs;
+window (0.0, 0.0, 13.5, 3.2); viewport (0.0,0.0,13.5,3.2);
+(* scale (2.0,2.0,0.0,0.0); *)
+(*clear pixels;*)
+
+font size (0.25);
+font expansion (1.5);
+
+INT VAR i;
+FOR i FROM 0 UPTO 4 REP
+ move (2.0, real (i) * 0.5);
+ draw (10.0, real (i) * 0.5);
+ move (2.1, real (i) * 0.5 + 0.1);
+ draw ("Feld " + code (code ("E") - i));
+END REP;
+move (2.0, 2.5);
+draw (10.0, 2.5);
+move (2.0, 2.5);
+draw (2.0, 0.0);
+move (3.5, 3.0);
+draw (10.0, 3.0);
+FOR i FROM 1 UPTO 4 REP
+ move (2.0 + real (i) * 1.5, 3.0);
+ draw (2.0 + real (i) * 1.5, 0.0);
+ move (2.2 + real (i) * 1.5, 2.6);
+ draw ("Satz " + text (i))
+END REP;
+move (9.5, 3.0);
+draw (9.5, 0.0);
+(*
+pause (1000);
+*)
+
+LET myname = "abb.4-1";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+
+
diff --git a/doc/eudas/abb.4-2 b/doc/eudas/abb.4-2
new file mode 100644
index 0000000..a836def
--- /dev/null
+++ b/doc/eudas/abb.4-2
@@ -0,0 +1,46 @@
+init dgs;
+window (0.0, 0.0, 13.5, 2.0); viewport (0.0,0.0,13.5,2.0);
+(*scale (1.7,1.7,-1.6,0.0);*)
+(*
+clear pixels;
+*)
+
+kasten (1.0, 0.0, 3.0, 1.5);
+kasten (7.0, 0.0, 3.0, 1.5);
+font size (0.4); font expansion (1.5);
+move (1.8, 0.6); draw ("Menü");
+move (7.9, 0.6); draw ("Hilfe");
+move (4.5, 1.0); draw (6.5, 1.0);
+ draw (6.25, 1.25); move (6.5, 1.0); draw (6.25, 0.75);
+move (6.5, 0.5); draw (4.5, 0.5);
+ draw (4.75, 0.75); move (4.5, 0.5); draw (4.75, 0.25);
+font size (0.25);
+move (5.0, 1.1); draw ("ESC '?'");
+move (5.0, 0.6); draw ("ESC 'q'");
+move (10.5, 1.0); draw (11.5, 1.0); draw (11.5, 0.5); draw (10.5, 0.5);
+ draw (10.75, 0.75); move (10.5, 0.5); draw (10.75, 0.25);
+move (11.8, 0.9); draw ("ESC 'w'");
+move (11.8, 0.4); draw ("ESC 'z'");
+
+
+LET myname = "abb.4-2";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (9000);
+*)
+PROC kasten (REAL CONST x anf, y anf, x l, y l) :
+
+ move (x anf, y anf);
+ draw (x anf, y anf + y l);
+ draw (x anf + x l, y anf + y l);
+ draw (x anf + x l, y anf);
+ draw (x anf, y anf)
+
+END PROC kasten;
+
diff --git a/doc/eudas/abb.6-1 b/doc/eudas/abb.6-1
new file mode 100644
index 0000000..fb83242
--- /dev/null
+++ b/doc/eudas/abb.6-1
@@ -0,0 +1,75 @@
+init dgs;
+window (0.0, 0.0, 13.5, 4.0); viewport (0.0,0.0,13.5,4.0);
+(*scale (1.0,1.0, 0.0,0.0);*)
+(*
+clear pixels;
+*)
+
+move (2.25, 1.0); draw (4.75, 1.0);
+move (2.25, 3.0); draw (4.75, 3.0);
+ move (2.5, 1.0); draw (2.5, 3.3);
+ move (3.0, 1.0); draw (3.0, 3.3);
+ move (3.5, 1.0); draw (3.5, 3.3);
+ move (4.0, 1.0); draw (4.0, 3.3);
+ move (4.5, 1.0); draw (4.5, 3.3);
+font size (0.30); font expansion (1.5);
+move (2.6, 3.1); draw ("4");
+move (2.6, 2.0); draw ("M");
+move (3.1, 3.1); draw ("5");
+move (3.1, 2.0); draw ("N");
+move (3.6, 3.1); draw ("6");
+move (3.6, 2.0); draw ("O");
+move (4.1, 3.1); draw ("7");
+move (4.1, 2.0); draw ("P");
+ pfeil (3.75, 0.75);
+
+move (5.0, 2.0); draw (7.0, 2.0); draw (6.75, 2.25);
+ move (7.0, 2.0); draw (6.75, 1.75);
+move (5.0, 2.1); draw ("Einfügen");
+
+move (7.25, 1.0); draw (8.5, 1.0); move (9.0, 1.0); draw (10.25, 1.0);
+move (7.25, 3.0); draw (8.5, 3.0); move (9.0, 3.0); draw (10.25, 3.0);
+ move (7.5, 1.0); draw (7.5, 3.3);
+ move (8.0, 1.0); draw (8.0, 3.3);
+ move (8.5, 1.0); draw (8.5, 3.3);
+ move (9.0, 1.0); draw (9.0, 3.3);
+ move (9.5, 1.0); draw (9.5, 3.3);
+ move (10.0, 1.0); draw (10.0, 3.3);
+move (7.6, 3.1); draw ("4");
+move (7.6, 2.0); draw ("M");
+move (8.1, 3.1); draw ("5");
+move (8.1, 2.0); draw ("N");
+move (8.6, 3.1); draw ("6");
+move (9.1, 3.1); draw ("7");
+move (9.1, 2.0); draw ("O");
+move (9.6, 3.1); draw ("8");
+move (9.6, 2.0); draw ("P");
+
+pfeil (8.75, 0.75);
+
+PROC pfeil (REAL CONST x spitze, y spitze) :
+
+ move (x spitze, y spitze);
+ draw (x spitze + 0.25, y spitze - 0.25);
+ draw (x spitze + 0.1, y spitze - 0.25);
+ draw (x spitze + 0.1, y spitze - 0.5);
+ draw (x spitze - 0.1, y spitze - 0.5);
+ draw (x spitze - 0.1, y spitze - 0.25);
+ draw (x spitze - 0.25, y spitze - 0.25);
+ draw (x spitze, y spitze)
+
+END PROC pfeil;
+
+
+LET myname = "abb.6-1";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (9000)
+*)
+
diff --git a/doc/eudas/abb.6-2 b/doc/eudas/abb.6-2
new file mode 100644
index 0000000..7771a29
--- /dev/null
+++ b/doc/eudas/abb.6-2
@@ -0,0 +1,77 @@
+init dgs;
+window (0.0, 0.0, 13.5, 5.0); viewport (0.0,0.0,13.5,5.0);
+(*scale (1.4,1.4, 0.0,0.0);*)
+(*clear pixels;*)
+
+move (2.5, 4.5); draw (12.4, 4.5); draw (12.4, 4.0); draw (11.0, 4.0);
+ draw (11.0, 3.5); move (10.5, 3.5); draw (10.5, 4.0); draw (2.5, 4.0);
+move (13.5, 4.5); draw (12.5, 4.5); draw (12.5, 3.5); move (13.0, 3.5);
+ draw (13.0, 4.0); draw (13.5, 4.0);
+move (2.5, 3.5); draw (13.5, 3.5); move (13.5, 3.0); draw (10.0, 3.0);
+ draw (10.0, 2.5); move (9.5, 2.5); draw (9.5, 3.0); draw (2.5, 3.0);
+move (10.5, 3.0); draw (10.5, 2.5); move (11.0, 2.5); draw (11.0, 3.0);
+move (12.5, 2.5); draw (12.5, 3.0); move (13.0, 3.0); draw (13.0, 2.5);
+move (2.5, 2.5); draw (6.4, 2.5); draw (6.4, 2.0); draw (4.0, 2.0);
+ draw (4.0, 1.5); draw (6.5, 1.5); draw (6.5, 2.5); draw (13.5, 2.5);
+ move (13.5, 2.0); draw (7.0, 2.0); draw (7.0, 1.5); draw (9.0, 1.5);
+ draw (9.0, 1.0); draw (3.5, 1.0); draw (3.5, 2.0); draw (2.5, 2.0);
+move (9.5, 2.0); draw (9.5, 1.0); draw (10.4, 1.0); draw (10.4, 1.5);
+ draw (10.0, 1.5); draw (10.0, 2.0);
+move (10.5, 2.0); draw (10.5, 1.0); draw (13.0, 1.0); draw (13.0, 2.0);
+ move (11.0, 2.0); draw (11.0, 1.5); draw (12.5, 1.5); draw (12.5, 2.0);
+move (4.5, 1.5); draw (4.75, 1.25); draw (4.5, 1.0);
+move (5.5, 1.5); draw (5.75, 1.25); draw (5.5, 1.0);
+move (7.5, 1.5); draw (7.75, 1.25); draw (7.5, 1.0);
+move (11.5, 1.5); draw (11.75, 1.25); draw (11.5, 1.0);
+
+font size (0.25); font expansion (1.4);
+move (2.5, 4.1); draw ("K0");
+move (2.5, 3.1); draw ("N0");
+move (2.5, 2.1); draw ("A0");
+
+move (0.0, 4.1); draw ("'Kalender'");
+move (0.0, 3.1); draw ("'Namen'");
+move (0.0, 2.1); draw ("'Adressen'");
+move (0.0, 1.1); draw ("Arbeitskopie");
+
+move (4.9, 1.1); draw ("A1");
+move (5.9, 1.1); draw ("A2");
+move (7.9, 1.1); draw ("A3");
+move (11.9, 1.1); draw ("K1");
+
+x alignment (right);
+move (13.5, 4.1); draw ("K1");
+move (13.5, 3.1); draw ("N0");
+move (13.5, 2.1); draw ("A2");
+
+x alignment (normal);
+font size (0.2);
+INT VAR i;
+FOR i FROM 0 UPTO 10 REP
+ time (2.5 + real (i) * 1.0, i)
+END REP;
+
+PROC time (REAL CONST x pos, INT CONST nr) :
+
+ move (x pos, 4.9); draw (x pos, 4.6);
+ move (x pos, 3.9); draw (x pos, 3.6);
+ move (x pos, 2.9); draw (x pos, 2.6);
+ move (x pos, 1.9); draw (x pos, 1.6);
+ move (x pos, 0.9); draw (x pos, 0.6);
+ move (x pos + 0.1, 0.6); draw (text (nr))
+
+END PROC time;
+
+
+LET myname = "abb.6-2";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (9000);
+*)
+
diff --git a/doc/eudas/abb.7-1 b/doc/eudas/abb.7-1
new file mode 100644
index 0000000..3536ad9
--- /dev/null
+++ b/doc/eudas/abb.7-1
@@ -0,0 +1,46 @@
+init dgs;
+window (0.0, 0.0, 13.5, 6.0); viewport (0.0,0.0,13.5,6.0);
+(*scale (1.7,1.7, 0.0,0.0);*)
+(*clear pixels;*)
+
+kasten (5.0, 4.5, 3.0, 1.0);
+kasten (5.0, 1.5, 3.0, 1.0);
+kasten (1.5, 3.0, 3.0, 1.0);
+font size (0.35); font expansion (1.5);
+x alignment (center);
+move (6.5, 4.8); draw ("Druckmuster");
+move (6.5, 1.8); draw ("Druckdatei");
+move (3.0, 3.3); draw ("EUDAS-Datei");
+move (6.5, 0.0); draw ("Drucker");
+
+move (6.5, 4.25); draw (6.5, 2.75); draw (6.25, 3.0);
+ move (6.5, 2.75); draw (6.75, 3.0);
+move (4.75, 3.5); draw (6.25, 3.5); draw (6.0, 3.75);
+ move (6.25, 3.5); draw (6.0, 3.25);
+move (6.5, 1.25); draw (6.5, 0.5); draw (6.75, 0.75);
+ move (6.5, 0.5); draw (6.25, 0.75);
+
+
+PROC kasten (REAL CONST x anf, y anf, x l, y l) :
+
+ move (x anf, y anf);
+ draw (x anf, y anf + y l);
+ draw (x anf + x l, y anf + y l);
+ draw (x anf + x l, y anf);
+ draw (x anf, y anf)
+
+END PROC kasten;
+
+
+LET myname = "abb.7-1";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (9000);
+*)
+
diff --git a/doc/eudas/abb.9-1 b/doc/eudas/abb.9-1
new file mode 100644
index 0000000..774b78b
--- /dev/null
+++ b/doc/eudas/abb.9-1
@@ -0,0 +1,41 @@
+init dgs;
+window (0.0, 0.0, 13.5, 4.0); viewport (0.0,0.0,13.5,4.0);
+(*scale (1.7,1.7, 0.0,0.0);*)
+(*clear pixels;*)
+
+move (1.5, 1.0); draw (8.75, 1.0);
+move (1.5, 3.5); draw (8.75, 3.5);
+INT VAR i;
+FOR i FROM 0 UPTO 9 REP
+ move (1.75 + real (i) * 0.75, 3.7);
+ draw (1.75 + real (i) * 0.75, 1.0);
+END REP;
+
+move (4.7, 3.7); draw (4.7, 1.0);
+
+font size (0.25); font expansion (1.5);
+x alignment (center);
+FOR i FROM 0 UPTO 8 REP
+ move (2.125 + real (i) * 0.75, 3.6); draw (text (i + 110))
+END REP;
+FOR i FROM 1 UPTO 5 REP
+ move (2.125 + real (i + 3) * 0.75, 0.6); draw ("(" + text (i) + ")")
+END REP;
+
+font size (0.35); x alignment (left);
+move (2.0, 0.0); draw ("Datei A");
+move (5.0, 0.0); draw ("Datei B");
+
+
+LET myname = "abb.9-1";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (9000)
+*)
+
diff --git a/doc/eudas/abb.9-2 b/doc/eudas/abb.9-2
new file mode 100644
index 0000000..4e9444d
--- /dev/null
+++ b/doc/eudas/abb.9-2
@@ -0,0 +1,96 @@
+init dgs;
+window (0.0, 0.0, 13.5, 6.5); viewport (0.0,0.0,13.5,6.5);
+(*scale (1.7,1.7, 0.0,0.0);*)
+(*clear pixels;*)
+
+INT VAR i;
+move (4.0, 0.0); draw (4.0, 2.0);
+move (5.5, 0.0); draw (5.5, 2.0);
+FOR i FROM 0 UPTO 4 REP
+ move (4.0, real (i) * 0.5);
+ draw (5.5, real (i) * 0.5)
+END REP;
+
+move (4.0, 3.0); draw (4.0, 6.0);
+move (5.5, 3.0); draw (5.5, 6.0);
+FOR i FROM 0 UPTO 6 REP
+ move (4.0, real (i) * 0.5 + 3.0);
+ draw (5.5, real (i) * 0.5 + 3.0)
+END REP;
+
+move (7.5, 2.0); draw (7.5, 6.0);
+move (9.0, 2.0); draw (9.0, 6.0);
+FOR i FROM 0 UPTO 8 REP
+ move (7.5, real (i) * 0.5 + 2.0);
+ draw (9.0, real (i) * 0.5 + 2.0)
+END REP;
+
+strichel (5.5, 6.0, 7.5, 6.0);
+strichel (5.5, 3.0, 7.5, 3.0);
+strichel (5.5, 1.0, 7.5, 3.0);
+strichel (5.5, 0.0, 7.5, 2.0);
+
+move (5.5, 4.75); draw (6.0, 4.75);
+ draw (6.0, 1.75); draw (5.5, 1.75);
+move (4.0, 3.75); draw (3.5, 3.75);
+ draw (3.5, 1.25); draw (4.0, 1.25);
+
+font size (0.4); font expansion (1.5);
+move (0.0, 0.8); draw ("Koppeldatei");
+move (0.0, 4.3); draw ("Hauptdatei");
+move (10.0, 4.3); draw ("virtuelle");
+move (10.0, 3.4); draw ("Datei");
+
+font size (0.3);
+move (4.5, 0.1); draw ("H2");
+move (4.5, 0.6); draw ("H1");
+move (4.5, 1.1); draw ("B");
+move (4.5, 1.6); draw ("A");
+move (4.5, 3.1); draw ("F4");
+move (4.5, 3.6); draw ("B");
+move (4.5, 4.1); draw ("F3");
+move (4.5, 4.6); draw ("A");
+move (4.5, 5.1); draw ("F2");
+move (4.5, 5.6); draw ("F1");
+move (8.0, 5.6); draw ("F1");
+move (8.0, 5.1); draw ("F2");
+move (8.0, 4.6); draw ("A");
+move (8.0, 4.1); draw ("F3");
+move (8.0, 3.6); draw ("B");
+move (8.0, 3.1); draw ("F4");
+move (8.0, 2.6); draw ("H1");
+move (8.0, 2.1); draw ("H2");
+
+PROC strichel (REAL CONST x anf, y anf, x end, y end) :
+
+ REAL VAR laenge := x end - x anf;
+ INT VAR teile := int (abstand/ 0.4);
+ REAL VAR verhaeltnis := (y end - y anf) / laenge;
+ laenge := laenge / (real (2 * teile + 1));
+ INT VAR i;
+ FOR i FROM 0 UPTO teile REP
+ move (x anf + real (i + i) * laenge,
+ y anf + verhaeltnis * real (i + i) * laenge);
+ draw (x anf + real (i + i + 1) * laenge,
+ y anf + verhaeltnis * real (i + i + 1) * laenge)
+ END REP .
+
+abstand :
+ sqrt ((y end - y anf) + (y end - y anf) +
+ (x end - x anf) * (x end - x anf)) .
+
+END PROC strichel;
+
+
+LET myname = "abb.9-2";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (9000);
+*)
+
diff --git a/doc/eudas/abb.9-3 b/doc/eudas/abb.9-3
new file mode 100644
index 0000000..9b190ab
--- /dev/null
+++ b/doc/eudas/abb.9-3
@@ -0,0 +1,113 @@
+init dgs;
+window (0.0, 0.0, 13.5, 7.0); viewport (0.0,0.0,13.5,7.0);
+(*scale (1.7,1.7, 0.0,0.0);*)
+(*clear pixels;*)
+
+x alignment (center);
+font size (0.3); font expansion (1.2);
+kasten (1.5, 5.0, 2.0, 1.5);
+move (2.5, 5.9); draw ("EUDAS-");
+move (2.5, 5.3); draw ("Datei 1");
+move (3.5, 5.75); draw (4.0, 5.75);
+kasten (4.0, 5.0, 2.0, 1.5);
+move (5.0, 5.9); draw ("gekettete");
+move (5.0, 5.3); draw ("Datei A");
+move (6.0, 5.75); draw (6.5, 5.75);
+kasten (6.5, 5.0, 2.0, 1.5);
+move (7.5, 5.9); draw ("gekettete");
+move (7.5, 5.3); draw ("Datei B");
+kasten (1.5, 2.0, 2.0, 1.5);
+move (2.5, 2.9); draw ("gekoppelte");
+move (2.5, 2.3); draw ("Datei C");
+kasten (4.0, 0.0, 2.0, 1.5);
+move (5.0, 0.9); draw ("gekoppelte");
+move (5.0, 0.3); draw ("Datei D");
+
+punkt (9.0, 5.75);
+punkt (9.25, 5.75);
+punkt (9.5, 5.75);
+
+strichel (1.0, 4.5, 10.0, 4.5);
+strichel (1.0, 7.0, 10.0, 7.0);
+strichel (1.0, 4.5, 1.0, 7.0);
+x alignment (right); font size (0.4);
+move (10.0, 3.9);
+draw ("Hauptdatei");
+
+punkt (2.5, 3.75);
+punkt (2.5, 4.0);
+punkt (2.5, 4.25);
+
+punkt (5.0, 1.75);
+punkt (5.0, 2.0);
+punkt (5.0, 2.25);
+punkt (5.0, 2.5);
+punkt (5.0, 2.75);
+punkt (5.0, 3.0);
+punkt (5.0, 3.25);
+punkt (5.0, 3.5);
+punkt (5.0, 3.75);
+punkt (5.0, 4.0);
+punkt (5.0, 4.25);
+
+PROC punkt (REAL CONST x pos, y pos) :
+
+ LET p size = 0.025;
+ move (x pos, y pos + p size);
+ draw (x pos + p size, y pos);
+ draw (x pos, y pos - p size);
+ draw (x pos - p size, y pos);
+ draw (x pos, y pos + p size)
+
+END PROC punkt;
+
+
+PROC strichel (REAL CONST x anf, y anf, x end, y end) :
+
+ REAL VAR laenge := x end - x anf;
+ INT VAR teile := int (abstand/ 0.4);
+ REAL VAR senkrecht, verhaeltnis;
+ IF laenge <> 0.0 THEN
+ verhaeltnis := (y end - y anf) / laenge; senkrecht := 1.0
+ ELSE
+ verhaeltnis := 1.0; senkrecht := 0.0 ;
+ laenge := y end - y anf
+ END IF;
+ laenge := laenge / (real (2 * teile + 1));
+ INT VAR i;
+ FOR i FROM 0 UPTO teile REP
+ move (x anf + real (i + i) * laenge * senkrecht,
+ y anf + verhaeltnis * real (i + i) * laenge);
+ draw (x anf + real (i + i + 1) * laenge * senkrecht,
+ y anf + verhaeltnis * real (i + i + 1) * laenge)
+ END REP .
+
+abstand :
+ sqrt ((y end - y anf) * (y end - y anf) +
+ (x end - x anf) * (x end - x anf)) .
+
+END PROC strichel;
+
+PROC kasten (REAL CONST x anf, y anf, x l, y l) :
+
+ move (x anf, y anf);
+ draw (x anf, y anf + y l);
+ draw (x anf + x l, y anf + y l);
+ draw (x anf + x l, y anf);
+ draw (x anf, y anf)
+
+END PROC kasten;
+
+
+LET myname = "abb.9-3";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (9000)
+*)
+
diff --git a/doc/eudas/abb.9-4 b/doc/eudas/abb.9-4
new file mode 100644
index 0000000..e243265
--- /dev/null
+++ b/doc/eudas/abb.9-4
@@ -0,0 +1,98 @@
+init dgs;
+window (0.0, 0.0, 13.5, 6.0); viewport (0.0,0.0,13.5,6.0);
+(*scale (1.7,1.7, 0.0,0.0);*)
+(*clear pixels;*)
+
+kasten (2.0, 1.0, 1.4, 2.0);
+kasten (3.5, 1.0, 1.4, 2.0);
+kasten (6.5, 1.0, 1.4, 2.0);
+kasten (2.0, 3.4, 1.4, 2.0);
+kasten (5.0, 3.4, 1.4, 2.0);
+kasten (6.5, 3.4, 1.4, 2.0);
+ strichel (3.5, 3.4, 3.5, 5.4);
+ strichel (3.5, 5.4, 4.9, 5.4);
+ strichel (4.9, 5.4, 4.9, 3.4);
+ strichel (4.9, 3.4, 3.5, 3.4);
+move (1.9, 2.7); draw (1.5, 2.7);
+draw (1.5, 4.6); draw (1.9, 4.6);
+
+x alignment (center);
+font size (0.3); font expansion (1.4);
+
+move (2.7, 5.6); draw ("22-1");
+move (2.7, 4.9); draw ("X");
+move (2.7, 4.4); draw ("K");
+move (2.7, 2.5); draw ("K");
+move (2.7, 2.0); draw ("N1");
+move (2.7, 0.4); draw ("(114)");
+
+move (4.2, 5.6); draw ("22-2");
+move (4.2, 4.9); draw ("X");
+move (4.2, 4.4); draw ("K");
+move (4.2, 2.5); draw ("K");
+move (4.2, 2.0); draw ("N2");
+move (4.2, 0.4); draw ("(209)");
+
+move (5.7, 5.6); draw ("23-1");
+move (5.7, 4.9); draw ("Y");
+move (5.7, 4.4); draw ("L");
+
+move (7.2, 5.6); draw ("24-1");
+move (7.2, 4.9); draw ("Z");
+move (7.2, 4.4); draw ("M");
+move (7.2, 2.5); draw ("M");
+move (7.2, 0.4); draw ("(17)");
+
+font size (0.4); x alignment (normal);
+move (8.5, 2.0); draw ("Koppeldatei");
+move (8.5, 4.4); draw ("Hauptdatei");
+
+PROC strichel (REAL CONST x anf, y anf, x end, y end) :
+
+ REAL VAR laenge := x end - x anf;
+ INT VAR teile := int (abstand/ 0.4);
+ REAL VAR senkrecht, verhaeltnis;
+ IF laenge <> 0.0 THEN
+ verhaeltnis := (y end - y anf) / laenge; senkrecht := 1.0
+ ELSE
+ verhaeltnis := 1.0; senkrecht := 0.0 ;
+ laenge := y end - y anf
+ END IF;
+ laenge := laenge / (real (2 * teile + 1));
+ INT VAR i;
+ FOR i FROM 0 UPTO teile REP
+ move (x anf + real (i + i) * laenge * senkrecht,
+ y anf + verhaeltnis * real (i + i) * laenge);
+ draw (x anf + real (i + i + 1) * laenge * senkrecht,
+ y anf + verhaeltnis * real (i + i + 1) * laenge)
+ END REP .
+
+abstand :
+ sqrt ((y end - y anf) * (y end - y anf) +
+ (x end - x anf) * (x end - x anf)) .
+
+END PROC strichel;
+
+PROC kasten (REAL CONST x anf, y anf, x l, y l) :
+
+ move (x anf, y anf);
+ draw (x anf, y anf + y l);
+ draw (x anf + x l, y anf + y l);
+ draw (x anf + x l, y anf);
+ draw (x anf, y anf)
+
+END PROC kasten;
+
+
+LET myname = "abb.9-4";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (9000)
+*)
+
diff --git a/doc/eudas/abb.9-5 b/doc/eudas/abb.9-5
new file mode 100644
index 0000000..c00655c
--- /dev/null
+++ b/doc/eudas/abb.9-5
@@ -0,0 +1,51 @@
+init dgs;
+window (0.0, 0.0, 13.5, 7.0); viewport (0.0,0.0,13.5,7.0);
+(*scale (1.7,1.7, 0.0,0.0);*)
+(*clear pixels;*)
+
+kasten (1.5, 0.0, 3.5, 2.0);
+kasten (7.0, 0.0, 3.5, 2.0);
+kasten (4.0, 4.0, 4.0, 3.0);
+ kasten (5.0, 5.5, 2.0, 1.0);
+
+move (3.25, 2.25); draw (4.75, 3.75);
+ draw (4.5, 3.75); move (4.75, 3.75); draw (4.75, 3.5);
+ move (3.25, 2.25); draw (3.5, 2.25);
+ move (3.25, 2.25); draw (3.25, 2.5);
+move (8.75, 2.25); draw (7.25, 3.75);
+ draw (7.5, 3.75); move (7.25, 3.75); draw (7.25, 3.5);
+ move (8.75, 2.25); draw (8.5, 2.25);
+ move (8.75, 2.25); draw (8.75, 2.5);
+
+x alignment (center);
+font size (0.4); font expansion (1.4);
+
+move (3.25, 0.2); draw ("Benutzer A");
+move (8.75, 0.2); draw ("Benutzer B");
+move (6.0, 4.3); draw ("Manager");
+font size (0.3);
+move (6.0, 5.6); draw ("Kunden");
+
+PROC kasten (REAL CONST x anf, y anf, x l, y l) :
+
+ move (x anf, y anf);
+ draw (x anf, y anf + y l);
+ draw (x anf + x l, y anf + y l);
+ draw (x anf + x l, y anf);
+ draw (x anf, y anf)
+
+END PROC kasten;
+
+
+LET myname = "abb.9-5";
+save pixels (myname + ".p");
+FILE VAR f := sequential file (modify, myname + ".p");
+to line (f, 1); insert record (f);
+write record (f, "#linefeed (0.8)#");
+insert record (f); write record (f, myname);
+to eof (f); insert record (f); write record (f, myname);
+to line (f, 1);
+(*
+pause (9000)
+*)
+
diff --git a/doc/eudas/bildergenerator b/doc/eudas/bildergenerator
new file mode 100644
index 0000000..8129476
--- /dev/null
+++ b/doc/eudas/bildergenerator
@@ -0,0 +1,25 @@
+PROC starten :
+
+ command dialogue (FALSE);
+ disable stop;
+ fetch (name, /"DGS NEC");
+ run (name);
+ save (name + ".p", /"DGS NEC");
+ end (myself)
+
+END PROC starten;
+
+TEXT VAR name;
+
+PROC gen (TEXT CONST t) :
+
+ name := t;
+ begin ("p", PROC starten, a);
+ TASK VAR a;
+ WHILE exists (a) REP pause (100) END REP
+
+END PROC gen;
+
+gen ("abb.4-2");
+gen ("abb.6-1");
+
diff --git a/doc/eudas/eudas.hdb.1 b/doc/eudas/eudas.hdb.1
new file mode 100644
index 0000000..40b5a84
--- /dev/null
+++ b/doc/eudas/eudas.hdb.1
@@ -0,0 +1,267 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (3)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+#center##on("b")#"Was kann EUDAS ?
+
+
+
+In diesem Kapitel wollen wir Ihnen erklären, was EUDAS Ihnen ei­
+gentlich bringen soll. Sie arbeiten sicher nicht nur aus Spaß am
+Computer, sondern wollen ihn für bestimmte Aufgaben einsetzen. Ein
+Computer kann bestimmte Aufgaben nur dann bearbeiten, wenn er
+dafür programmiert worden ist.
+ EUDAS ist nun ein Programm, das allgemein Aufgaben der Da­
+tenverwaltung lösen kann. Zunächst wollen wir Ihnen erläutern,
+wodurch dieses Anwendungsgebiet genau charakterisiert wird.
+
+
+1.1 Textverarbeitung und Datenverwaltung
+
+Es gibt zwei Einsatzbereiche des Computers, die von fast jedem An­
+wender benötigt werden, egal auf welchem Spezialgebiet er tätig ist:
+nämlich die #on("i")#Textverarbeitung#off("i")# und die #on("i")#Datenverwaltung#off("i")#. Durch die
+Unterscheidung dieser beiden Bereiche werden die charakteristi­
+schen Merkmale der Datenverwaltung abgegrenzt.
+
+#on("b")#Textverarbeitung#off("b")# Die Textverarbeitung befaßt sich damit,
+einen beliebigen Text auf einem Rechner zu erfassen und anschließend
+über einen Drucker wieder auszugeben. Der Sinn dieser Arbeit liegt
+darin, daß man einen einmal eingegebenen Text sehr einfach ändern
+kann. Außerdem kann der Computer einige unangenehme Aufgaben
+übernehmen, die beim Schreiben von Texten auftreten: die Auftei­
+lung auf Zeilen und Seiten, die Seitennumerierung und vieles mehr.
+ Charakteristisch für die Textverarbeitung ist, daß der Einfluß
+des Computers sich auf kosmetische Details beschränkt. Die Spei­
+cherung und eventuelle Aufbereitung zum Drucken haben praktisch
+nichts mit dem Inhalt des Textes zu tun. Dies wäre für den Rechner
+auch sehr schwierig, da die im Text enthaltenen Informationen in
+menschlicher Sprache vorliegen, die für einen Rechner nicht ver­
+ständlich ist.
+
+#on("b")#Datenverwaltung#off("b")# Bei der Datenverwaltung werden ebenfalls
+textuelle Informationen gespeichert, diese liegen aber in einer aufberei­
+teten Form vor, die einen Teil des Inhalts für den Computer ver­
+ständlich macht. Bei der Datenverwaltung werden Objekte betrach­
+tet, die verschiedene Eigenschaften haben können. Ein solches
+Objekt kann z.B. eine Person sein. Als Eigenschaften werden mit
+dieser Person zusammenhängende Informationen betrachetet, die für
+die jeweilige Anwendung wichtig sind.
+ Ein Beispiel für eine solche Betrachtungsweise ist der Arbeit­
+nehmer im Betrieb. Einige der typischerweise erfaßten Daten sind
+Name, Adresse, Telefon, Geburtsdatum und Geschlecht. Alle diese
+Daten sind Eigenschaften oder #on("i")#Attribute#off("i")#, die einem bestimmten
+Menschen mehr oder weniger fest zugeordnet sind.
+ Die Betonung inhaltlicher Beziehungen erleichtert es dem Com­
+puter, die gespeicherten Daten in verschiedenen Variationen aus­
+zuwerten.
+
+#on("b")#Beispiel#off("b")# Um die Unterscheidung zwischen Textverarbeitung
+und
+Datenverwaltung deutlicher zu machen, werden im folgenden Bei­
+spiel die Informationen über eine Person in zwei unterschiedlichen
+Formen dargeboten, die für den Menschen die gleiche Aussagekraft
+haben:
+
+ 1. Frau Magdalene Kant, geb. Hagedorn, wurde am 12. Januar
+ 1946 geboren. Sie wohnt in Bonn in der Meckenheimer Allee
+ 112. Seit 1977 arbeitet sie in unserer Firma. Sie ist tele­
+ fonisch erreichbar unter der Nummer 0228/356782.
+
+ 2. Name: Magdalene
+ Vorname: Kant
+ Geburtsname: Hagedorn
+ Geburtsdatum: 12.01.46
+ Geschlecht: weiblich
+ Strasse: Meckenheimer Allee 112
+ PLZ: 5200
+ Wohnort: Bonn 1
+ Vorwahl: 0228
+ Telefon: 356782
+ beschäftigt seit: 1977
+
+Die Form der Darstellung wie in der ersten Alternative eignet sich
+nur für den Menschen, da die gleiche Information auf viele ver­
+schiedene Weisen ausgedrückt werden könnte (z.B. unterschiedlicher
+Satzbau). Die zweite Alternative beschränkt sich auf die für die
+bestimmte Anwendung wesentlichen Zusammenhänge; der Computer
+kann die Aufteilung der Information in einzelne Attribute ausnut­
+zen.
+ In dieser zweiten Form können Sie Daten mit EUDAS erfassen
+und auch auswerten. Die Attribute können Sie jeweils passend zu
+den erfaßten Daten selbst bestimmen.
+ Für Daten in der ersten Form steht Ihnen die EUMEL-Textver­
+arbeitung zur Verfügung. EUDAS wurde so entwickelt, daß Sie auch
+Daten an die Textverarbeitung übergeben können.
+ Es ist nämlich möglich, einen freien Text aus der Attributdar­
+stellung automatisch zu erzeugen, indem Sie dem Computer den
+Satzbau mit entsprechenden Platzhaltern vorgeben. Der Rechner
+setzt die einzelnen Attribute dann an die angegebenen Stellen.
+Diese Funktion ist ein Kernstück von EUDAS und wird in Abschnitt
+1.3 näher erläutert.
+
+
+1.2 EUDAS als Karteikasten
+
+Wie Sie vielleicht schon bemerkt haben, ähnelt die zweite Form der
+Darstellung einer Karteikarte, auf der Platz für bestimmte Einträge
+freigehalten wird. Anhand dieses Modells können Sie sich in vielen
+Fällen die Arbeitsweise von EUDAS veranschaulichen. Sie sollten die
+Analogie allerdings nicht zu weit treiben: EUDAS schaufelt ja nicht
+wirklich mit Karteikarten herum. Manche Funktionen sind eben
+computerspezifisch und ließen sich mit Karteikarten gar nicht
+durchführen.
+ Mit EUDAS können Sie die möglichen Einträge auf den Karteikar­
+ten (also die Attribute) völlig frei bestimmen; die einzige Beschrän­
+kung besteht darin, daß Sie in einem Karteikasten nur Karten mit
+völlig gleichem Aufbau verwenden können. Wenn Sie eine neue Kar­
+teikarte entwerfen wollen, brauchen Sie nur Namen für die einzel­
+nen Einträge anzugeben. EUDAS zeigt Ihnen dann quasi eine Karte
+am Bildschirm, in der diese Einträge aufgeführt sind.
+ Sie können nun am Bildschirm Daten auf diese Karteikarten
+schreiben. Dabei dürfen die Einträge fast beliebig lang sein; wenn
+der Platz auf dem Bildschirm nicht reicht, können Sie sich Ihre
+überdimensionale Karteikarte in Ausschnitten ansehen.
+ Die einmal eingegebenen Daten bleiben nun so lange gespei­
+chert, wie Sie wollen (bzw. bis Ihr Rechner zusammenfällt). Haben
+Sie beim Eintragen Fehler gemacht, können Sie diese jederzeit kor­
+rigieren oder später noch weitere Informationen ergänzen.
+
+#free (7.5)#
+
+#center#Abb. 1-1 EUDAS als Karteikasten
+
+
+#on("b")#Anwendungen#off("b")# Mit den gespeicherten Daten können Sie nun
+ver­
+schiedene Dinge anstellen (bzw. vom Rechner anstellen lassen). Das
+Einfachste ist natürlich das, was Sie mit einer Kartei auch machen
+würden, sich nämlich einzelne Karteikarten anzuschauen.
+ Um eine bestimmte Karteikarte herauszufinden, geben Sie
+EUDAS einfach den Inhalt vor, nach dem gesucht werden soll. Hier
+zeigt sich bereits der erste Vorteil eines Computers: Die Suche in
+der EUDAS-Kartei ist viel schneller, als Sie es von Hand könnten.
+Außerdem kann der Rechner keine Karte zufällig übersehen.
+ EUDAS zeigt sich auch dann überlegen, wenn Sie einen ganz
+bestimmten Teil der Kartei durchforsten müssen. Eine Bücherei muß
+z.B. regelmäßig alle Bücher heraussuchen, deren Leihfrist über­
+schritten ist. Der Computer durchsucht in solchen Fällen ermü­
+dungsfrei auch große Datenmengen.
+ Wenn Sie die Karteikarten in einer bestimmten Reihenfolge
+haben wollen, kann EUDAS auch das Sortieren übernehmen. Weitere
+automatische Vorgänge betreffen z.B. das Rauswerfen überflüssiger
+oder veralteter Karten. Die Einträge können auch nach einer be­
+stimmten Vorschrift alle geändert werden. Solche Aufgaben treten
+z.B. in der Schule auf, wo die Schüler jedes Jahr versetzt werden
+müssen (natürlich bis auf Ausnahmen).
+ Auch Beziehungen zwischen verschiedenen Karteien kann
+EUDAS herstellen. Dies kann man noch einmal an dem Beispiel der
+Bücherei illustrieren. Wenn ein Buch gefunden wurde, dessen Leih­
+frist überschritten ist, muß der zugehörige Ausleiher gefunden und
+angeschrieben werden. Das Heraussuchen beider Karten kann EUDAS
+in einem Arbeitsgang durchführen.
+
+
+1.3 Drucken
+
+Eine besondere Stärke von EUDAS ist die Möglichkeit, die gespei­
+cherten Daten in schriftlicher Form auszuwerten. Dadurch, daß die
+Daten in einer Form gespeichert sind, die den Inhalt widerspiegelt,
+können die gleichen Daten in vielen verschiedenen Formen auf
+Papier ausgegeben werden.
+
+
+
+
+ Karl Eudas
+ An Poltersdorf
+ XXXXXXXXXXX
+ XXXXXXXXXXX
+
+ XXXX XXXXXXXXXXXX
+
+ Lieber XXXXXXX !
+
+ Dies ist ein Beispiel für ein
+ Druckmuster.
+
+ Viele Grüße
+
+
+
+#center#Abb. 1-2 Muster für die Druckausgabe
+
+
+Zu diesem Zweck geben Sie EUDAS ein Muster des gewünschten Aus­
+drucks vor. Der Rechner setzt dann an entsprechend markierten
+Leerstellen die gespeicherten Informationen ein und druckt das
+Ergebnis aus. Auf diese Weise ersparen Sie sich die umfangreiche
+Schreibarbeit, die anfällt, wenn die Informationen auf den Kartei­
+karten in anderer Form benötigt werden.
+ Natürlich müssen Sie zum Entwerfen des Formulars kein ge­
+wiefter Programmierer sein. Wenn Sie einen Rundbrief verschicken
+wollen, schreiben Sie den Brief, als wollten Sie Ihn nur einmal
+schicken. Lediglich im Adressfeld müssen Sie Platzhalter an den
+Stellen vorsehen, an denen später die wirklichen Adressen stehen
+sollen.
+
+#on("b")#Verwendungsmöglichkeiten#off("b")# Die Möglichkeiten für solche
+Formulare
+sind unbegrenzt. Beispiele sind Briefe, Adreßaufkleber, Überwei­
+sungsaufträge und sortierte Listen. Mit den Inhalten einer Kartei
+können Sie beliebig viele verschiedene Ausgaben erzeugen. Bei dem
+obigen Beispiel der Leihbücherei könnten Sie EUDAS dazu einsetzen,
+nicht nur die säumigen Ausleiher herauszufinden, sondern die Mah­
+nung gleich fertig für einen Fensterbriefumschlag herzustellen. Für
+den Bediener bliebe die einzige Tätigkeit, diesen Vorgang anzuwer­
+fen.
+ Wie weiter oben schon erwähnt, können Sie diese Ausgaben von
+EUDAS auch zur Textverarbeitung übernehmen. So können Sie zum
+Beispiel die Literaturliste für ein Buch mit EUDAS führen und Aus­
+züge später jeweils an die passenden Stellen einfügen.
+
+#on("b")#Berechnungen#off("b")# Die Druckfunktion von EUDAS kann jedoch nicht
+nur
+zum Ausfüllen von Formularen verwendet werden. Wenn Sie Berech­
+nungen anstellen oder Auswertungen vornehmen wollen, können Sie
+im Druckmuster auch Anweisungen der Sprache ELAN verwenden.
+Damit haben Sie eine komplette Programmiersprache für Ihre Muster
+zur Verfügung.
+ Ehe Sie einen Schreck bekommen: Selbst für komplizierte Muster
+brauchen Sie nur einen ganz kleinen Teil von ELAN zu beherrschen,
+da die meiste Arbeit immer von EUDAS übernommen wird (Sie müssen
+also nicht etwa selber ein ganzes Programm schreiben).
+ Anwendungen für diese Möglichkeit gibt es genug. Angefangen
+von einfachen Zählungen bis hin zu statistischen Auswertungen,
+von einfachen Summen bis zum kompletten Rechnungsschreiben.
+Immer nimmt Ihnen EUDAS alles das ab, was automatisch ablaufen
+kann. Sie versorgen EUDAS nur noch mit den passenden Formeln für
+Ihre Anwendung.
+
+
+1.4 Grenzen
+
+Natürlich können Sie nicht alle Probleme mit EUDAS gleichermaßen
+gut lösen. EUDAS verwendet ein einfaches Modell (Karteikasten) und
+versucht, mit möglichst wenig Informationen von Ihrer Seite auszu­
+kommen. Kompliziertere Sachverhalte verlangen auch kompliziertere
+Strukturen, die Sie dann selbst entwerfen müssen. Eine einfache
+Lösung mit EUDAS kann in solchen Fällen zu langsam oder zu um­
+ständlich sein.
+ Wenn Sie jedoch die wenigen Strukturprinzipien von EUDAS
+verstanden haben, werden Sie sehr schnell viele Probleme mit
+EUDAS lösen können. Zuerst erfassen Sie einfach alle Daten, die Sie
+brauchen und überlegen sich erst dann, in welcher Form Sie diese
+Daten haben wollen. Auch nachträglich können Sie jederzeit noch
+neue Daten und Formulare hinzufügen, so daß Sie mit der Zeit
+EUDAS gewinnbringend für viele Routineaufgaben benutzen werden.
+
diff --git a/doc/eudas/eudas.hdb.10 b/doc/eudas/eudas.hdb.10
new file mode 100644
index 0000000..442f575
--- /dev/null
+++ b/doc/eudas/eudas.hdb.10
@@ -0,0 +1,510 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (97)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+10 Datenabfrage am Bildschirm
+
+
+
+10.1 Feldauswahl
+
+Da die Anzahl der möglichen Felder bei EUDAS-Dateien viel größer
+ist als die Anzahl der zur Verfügung stehenden Zeilen auf dem
+Bildschirm (255 gegenüber 22), muß es eine Möglichkeit geben, auch
+die übrigen Felder anzusehen.
+
+#on("b")#Rollen#off("b")# Dazu kann man den Bildschirmausschnitt in
+vertikaler
+Richtung #on("i")#rollen#off("i")#. Sie müssen sich die Bildschirmanzeige als einen
+Ausschnitt des wirklichen Satzes vorstellen. Um weitere Inhalte des
+Satzes zu sehen, verschieben Sie den Ausschnitt einfach.
+ Dazu dienen die beiden Tastenkombinationen ESC OBEN und ESC
+UNTEN. Diese Kombinationen wirken nur im Menü "Einzelsatz". An
+der Bildschirmanzeige ändert sich natürlich nur dann etwas, wenn
+es noch weitere Felder zum Anzeigen gibt.
+ Ob dies der Fall ist, können Sie an zwei Indikatoren ablesen.
+Zum einen wird hinter dem letzten Feld eine markierte Abschluß­
+zeile ausgegeben. Ist diese nicht sichtbar, gibt es noch Felder, die
+Sie mit ESC UNTEN hochholen können. Zum anderen steht die Num­
+mer der ersten Zeile in der Überschrift. Ist diese Nummer größer als
+1, können Sie mit ESC OBEN noch Felder sichtbar machen.
+ Das Rollen ist oft auch dann notwendig, wenn sich ein Feld
+über mehrere Zeilen erstreckt. In diesem Fall kann es passieren,
+daß die erste Zeile des Feldes nicht mehr sichtbar ist, da sie ober­
+halb des Anzeigebereichs liegen würde.
+
+#on("b")#Feldauswahl#off("b")# Eine weitere Möglichkeit bei zu vielen Feldern
+be­
+steht darin, nur die interessanten Felder zur Anzeige auszuwählen.
+Dies geschieht mit der Funktion
+#free (0.2)#
+
+ F Feldauswahl
+
+#free (0.2)#
+Ihnen werden alle Felder zur Auswahl angeboten. Kreuzen Sie die
+Felder an, die Sie sehen wollen und denken Sie daran, daß die Rei­
+henfolge des Ankreuzens beachtet wird. Anschließend werden Ihnen
+nur die ausgewählten Felder angezeigt. Falls Sie kein Feld ankreu­
+zen, bleibt die alte Feldauswahl bestehen.
+ Wollen Sie wieder alle Felder sehen, müssen Sie diese nicht alle
+einzeln ankreuzen. Mit HOP 'x' in der Auswahl werden alle Felder
+angekreuzt (die noch nicht angekreuzt waren). Diese Tastenkombi­
+nation können Sie allgemein bei einer Auswahl verwenden. Sie
+können die Kreuzchen mit 'o' auch wieder löschen, um zum Beispiel
+"alle außer einem" auszuwählen.
+ Beachten Sie, daß die Auswahl der anzuzeigenden Felder nichts
+mit der eigentlichen Dateistruktur zu tun hat, sondern nur für die
+Anzeige gilt. Den Verarbeitungsfunktionen (zum Beispiel Drucken)
+stehen natürlich nach wie vor alle Felder zur Verfügung.
+ Unvermutete Effekte können dann entstehen, wenn Sie bei
+einer eingestellten Feldauswahl ändern oder einfügen. Die nicht
+ausgewählten Felder werden beim Ändern natürlich nicht geändert
+und beim Einfügen einfach leer gelassen.
+
+
+10.2 Satzeditor
+
+An dieser Stelle sollen noch einige weitere Funktionen des Satz­
+editors vorgestellt werden, die Sie noch nicht kennengelernt haben.
+
+#on("b")#Rollen im Satzeditor#off("b")# Sie können auch rollen, wenn Sie sich
+im
+Satzeditor befinden (also beim Suchen, Einfügen und Ändern). Den­
+ken Sie daran, daß Sie die Einzelsatzanzeige immer mit ESC OBEN
+und ESC UNTEN rollen, während sonst (Editor, Auswahl von Datei­
+namen) immer mit HOP OBEN und HOP UNTEN gerollt wird.
+ Diese Diskrepanz hat technische Gründe und läßt sich leider
+nicht vermeiden. Wie Sie sich vielleicht erinnern, führt das Blättern
+mit HOP OBEN und HOP UNTEN im Satzeditor dazu, daß die Korre­
+spondenz zwischen Feldnamen und Feldinhalt verlorengeht. Daher
+muß an dieser Stelle mit ESC statt HOP gearbeitet werden.
+
+#on("b")#Ähnliche Sätze#off("b")# Wenn Sie mehrere ähnliche Sätze eintragen
+müssen,
+bietet Ihnen EUDAS eine Erleichterung an. Sie können nämlich beim
+Einfügen die Daten eines anderen Satzes übernehmen.
+ Dazu müssen Sie beim Ändern oder Einfügen des anderen Satzes
+ESC 'p' drücken. Der Inhalt des Satzes wird dann in einen Zwischen­
+speicher gebracht. Beachten Sie, daß im Gegensatz zum EUMEL-
+Editor kein Text markiert sein muß, sondern immer der ganze Satz
+transportiert wird.
+ Beim Einfügen eines neuen Satzes können Sie diesen Satz dann
+mit ESC 'g' in den Satzeditor übernehmen. Alle vorherigen Inhalte
+werden überschrieben. Anschließend können Sie die Daten nach
+Wunsch abändern.
+ Der Inhalt des Zwischenspeichers kann beliebig oft auf diese
+Weise kopiert werden. Der Inhalt des Zwischenspeichers wird bei
+Ändern der Feldauswahl oder beim Öffnen einer neuen Datei ge­
+löscht.
+
+#on("b")#Tagesdatum#off("b")# Im Satzeditor können Sie mit ESC 'D' das
+aktuelle
+Tagesdatum abfragen. Es wird an der aktuellen Cursorposition ein­
+getragen, als ob Sie es selbst getippt hätten.
+ Auf diese Weise können Sie Sätze einfach mit Datum versehen
+oder nach Sätzen suchen, die mit dem Tagesdatum in Beziehung
+stehen (zum Beispiel 'Fälligkeit = Heute').
+
+
+10.3 Suchmuster
+
+Die bisher genannten Möglichkeiten des Suchmusters sind noch
+etwas beschränkt. Eine Bedingung in unserer Adressendatei, die wir
+im Suchmuster noch nicht ausdrücken können, wäre zum Beispiel:
+Suche alle Adressen der Personen, die Wegner oder Simmern heißen.
+ Diese Alternative, Wegner ODER Simmern, kann nun in EUDAS
+durch ein Komma ausgedrückt werden:
+
+
+ Name Wegner,Simmern
+ Vorname
+
+
+Beachten Sie, daß hinter dem Komma kein Leerzeichen folgen darf,
+wie Sie es vielleicht gewohnt sind, in einem Text zu schreiben.
+EUDAS kann nämlich nicht unterscheiden, ob Sie das Leerzeichen
+nur aus optischen Gründen geschrieben haben, oder ob Sie danach
+suchen wollen.
+
+#on("b")#Lokale Alternative#off("b")# Die eben beschriebene
+Konstruktionsmethode
+heißt #on("i")#lokale Alternative#off("i")#. Lokal deshalb, weil Sie nur innerhalb
+eines Feldes gilt. Was das bedeuten soll, sehen Sie, wenn Sie die
+Bedingung mit einer weiteren Bedingung für ein anderes Feld kom­
+binieren:
+
+
+ Name Wegner,Simmern
+ Vorname
+ Strasse
+ PLZ 5*
+ Ort
+
+
+Dieses Muster hat die Bedeutung: Wähle alle Personen namens Weg­
+ner oder Simmern aus, die im PLZ-Bereich 5 wohnen. Die beiden
+Bedingungen für den Namen sind mit der Bedingung für die PLZ mit
+UND verknüpft - das heißt, eine der beiden ersten Bedingungen muß
+zutreffen #on("i")#und#off("i")# die untere Bedingung. Dieses UND ist global, da es
+Bedingungen für verschiedene Felder miteinander verbindet.
+ Natürlich können Sie für mehrere Felder gleichzeitig lokale
+Alternativen angeben. Eine anderes Suchmuster könnte zum Beispiel
+so aussehen:
+
+
+ Name Wegner,Simmern
+ Vorname
+ Strasse
+ PLZ 5,5000
+ Ort
+
+
+In diesem Fall muß eine ausgewählte Person Wegner oder Simmern
+heißen und in Köln wohnen.
+
+#on("b")#Globale Alternative#off("b")# Es wird nun aber für bestimmte
+Situationen
+noch eine andere Art von Alternativen benötigt. Als Beispiel soll
+ein Suchmuster dienen, das folgende Bedingung ausdrückt. Gesucht
+ist eine weibliche Person mit Namen Simmern oder eine männliche
+Person mit Namen Wegner.
+ Dieser Fall läßt sich mit unseren bisherigen Mitteln nicht lö­
+sen. Es wird nämlich eine Alternative zwischen zwei zusammen­
+gesetzten Bedingungen gefordert. Als Ausweg bietet sich an, prak­
+tisch mehrere Suchmuster anzugeben, die dann mit ODER verknüpft
+werden.
+ Um diese verschiedenen Suchmuster optisch am Bildschirm zu
+kennzeichnen, wird ein Semikolon als sogenannte #on("i")#globale Alternati­
+ve#off("i")# verwendet. Das Semikolon trennt das Suchmuster quasi in ver­
+schiedene Spalten auf, die jeweils eine eigene Bedingung enthalten
+können. Unser gewünschtes Suchmuster würde also so aussehen:
+
+
+ Name Wegner;Simmern
+ Vorname
+ Strasse
+ PLZ
+ Ort
+ m/w m;w
+
+
+Ebenso wie bei lokalen Alternativen darf hinter dem Semikolon kein
+Leerzeichen folgen. Daher kann das zweite Semikolon auch nicht
+direkt unter dem ersten stehen. Die Spalten werden also einfach nur
+durchgezählt: nach dem ersten Semikolon beginnt die zweite Spal­
+te, nach dem zweiten Semikolon die dritte usw.
+ In Zeilen, in denen keine Bedingungen stehen, kann auch das
+Semikolon weggelassen werden. Es kann ebenfalls weggelassen wer­
+den, wenn die weiteren Spalten leer sind. Steht ein Semikolon direkt
+am Anfang der Zeile, so ist die erste Spalte leer.
+ Um dies zu illustrieren, sei hier noch ein weiteres Beispiel
+angegeben:
+
+
+ Name Wegner
+ Vorname ;Anna-Maria
+ Strasse
+
+
+In diesem Fall muß eine ausgewählte Person mit Nachnamen Wegner
+oder mit Vornamen Anna-Maria heißen.
+
+#on("b")#Stern#off("b")# Bis jetzt haben Sie hauptsächlich Bedingungen
+betrachtet,
+die exakt zutreffen mußten. Sie wissen aber bereits, daß man auch
+Bedingungen angeben kann, bei denen nur ein Teil des zu suchen­
+den Feldes bekannt ist, nämlich indem der unbekannte Teil mit
+einem Stern markiert wird.
+ In Kapitel 5 haben Sie gelernt, daß der Stern nur am Anfang
+und Ende des Musters stehen kann. Dies trifft nicht ganz zu, denn
+Sie können den Stern auch inmitten eines Textes anwenden. So
+trifft die Bedingung 'Si*n' auf alle Namen zu, die mit 'Si' beginnen
+und mit 'n' enden.
+ Beachten Sie hier das "und" in der Formulierung der Bedingung.
+Das Muster ist eigentlich eine Schreibweise für zwei Bedingungen
+für ein Feld, die mit UND verknüpft sind.
+ Sie können auch noch weitere Sterne in das Muster aufnehmen.
+Dabei gibt es jedoch eine Kleinigkeit zu beachten. Das Muster
+'*x*y*' bedeutet: das Feld muß ein 'x' und ein 'y' enthalten. Über
+die Reihenfolge der beiden Zeichen ist jedoch in dieser Bedingung
+nichts gesagt, obwohl es vielleicht vom Aussehen suggeriert wird.
+ Denken Sie daran, keine zwei Sterne nebeneinander zu schrei­
+ben - eine solche Bedingung hätte keinen Sinn.
+ Es gibt eine weitere spezielle Bedingung, die mit Hilfe des
+Sterns formuliert wird. Ein einzelner Stern bedeutet nämlich: Das
+Feld ist nicht leer. Beachten Sie den kleinen Unterschied: ein Stern
+in einem Muster kann für einen beliebigen Text stehen, der auch
+leer sein kann. Ein einzelner Stern jedoch steht für einen beliebigen
+Text, der nicht leer ist.
+ Damit Sie ein Gefühl für die Verwendung des Sterns bekommen,
+hier noch ein paar Beispiele:
+
+
+Mei*r*
+
+ Der Name beginnt mit 'Mei' und enthält ein 'r'. Trifft zu auf
+ 'Meier', 'Meiring', aber nicht auf 'Meiling' oder 'Merzei'.
+
+
+Donau*dampf*schiff*schaft
+
+ Feld beginnt mit 'Donau', endet mit 'schaft' und enthält
+ 'dampf' und 'schiff'. Trifft zu auf 'Donaudampfschiffahrtsge­
+ sellschaft', aber auch auf 'Donaugesellschiffdampffahrtschaft'.
+
+
+Roller*erfahren
+
+ Dieses Muster muß man ganz genau interpretieren. Es bedeutet:
+ der Inhalt beginnt mit 'Roller' und endet mit 'erfahren'. Das
+ Muster trifft nicht nur auf 'Roller erfahren' sondern auch auf
+ 'Rollerfahren' zu. Der Stern verliert also in diesem Fall seine
+ symbolische Bedeutung als Platzhalter für einen bestimmten
+ Text.
+
+#on("b")#Vergleiche#off("b")# Es gibt in EUDAS noch weitere Muster, die
+einen gan­
+zen Bereich von Werten auswählen. Diese betreffen Bedingungen der
+Art "größer als" und "kleiner als". Solche Vergleichsbeziehungen
+werden durch zwei Punkte dargestellt.
+ So wählt das Muster 'K..' alle Felder aus, die in der alphabe­
+tischen Reihenfolge hinter 'K' liegen, wobei das 'K' selbst mit ein­
+geschlossen ist. Umgekehrt trifft '..K' auf alle Felder zu, die davor
+liegen.
+ Sie können beide Bedingungen auch kombinieren. So trifft die
+Bedingung 'A..K' auf alle Felder zu, die im Lexikon unter 'A' bis
+'J' erscheinen (die Felder mit 'K' sind hier ausgeschlossen). Beach­
+ten Sie, daß die direkte Kombination wieder die Verknüpfung zweier
+einzelner Bedingungen mit UND darstellt.
+
+#on("b")#Negation#off("b")# Um den Bereich möglicher Suchmuster noch zu
+erweitern,
+können Sie einzelne Bedingungen auch noch verneinen. Dies ge­
+schieht durch Voranstellen zweier Minuszeichen. So bedeutet das
+Muster '--Meier', daß alle Personen ausgewählt werden, die nicht
+Meier heißen.
+ Die Verneinung bezieht sich immer auf das unmittelbar folgende
+Muster (bis zum nächsten Komma, Semikolon oder dem Zeilenende)
+und nicht etwa auf eine ganze Zeile. Sie umfaßt jedoch die UND-
+Verknüpfung der kombinierten Bedingungen. So sind zum Beispiel die
+Muster '--E..M', '--E..,--..M' und '..E,M..' völlig gleichbedeu­
+tend.
+
+#on("b")#Feldvergleich#off("b")# Als letztes haben Sie im Suchmuster auch
+noch die
+Möglichkeit, ein Feld mit anderen Feldern des gleichen Satzes zu
+vergleichen. Bisher hatten Sie ein Feld ja immer nur mit konstanten
+Texten verglichen.
+ Um dies zu erreichen, geben Sie statt eines Vergleichstextes
+den Feldnamen des Feldes an, mit dem Sie vergleichen wollen. Zur
+Kennzeichnung müssen Sie dem Namen noch ein '&' voranstellen.
+Diese Konstruktion funktioniert mit allen bisher besprochenen Ver­
+gleichen. Beispielsweise trifft
+
+
+ Feld1 ..&Feld2
+
+
+auf alle Sätze zu, in denen der Inhalt von Feld1 kleiner ist als der
+Inhalt von Feld2.
+ Im Gegensatz zum Druckmuster dürfen in den Feldnamen zwar
+Leerzeichen enthalten sein, nicht jedoch
+#free (0.2)#
+
+ .. * , ;
+
+#free (0.2)#
+da diese Zeichen als reservierte Zeichen gelten und jeweils als
+Begrenzer wirken. Die gleiche Beschränkung gilt dementsprechend
+auch für konstante Vergleichstexte.
+ Beachten Sie, daß hinter dem '&' bis zum nächsten Begrenzer­
+zeichen ein gültiger (vorhandener) Feldname stehen muß. Anderen­
+falls wird der Text als konstantes Muster betrachtet.
+ Wie schon oben gesagt, kann der Feldvergleich mit allen Ver­
+gleichen verwendet werden. Auch gemischte Konstruktionen sind
+zulässig, beispielsweise
+
+
+ Feld1 A..&Feld3,*&Feld9*
+
+
+Diese Bedingung trifft zu, wenn Feld1 größer oder gleich 'A', aber
+kleiner als der Inhalt von Feld3 ist, oder wenn der Inhalt von Feld9
+darin vorkommt.
+
+#on("b")#Optimierung#off("b")# Hier noch eine Bemerkung zur Geschwindigkeit
+des
+Suchens. Je mehr Bedingungen Sie angeben, desto mehr Vergleiche
+müssen beim Suchen angestellt werden und desto länger dauert es.
+ Das erste Feld einer Datei erfährt jedoch eine Sonderbehand­
+lung. Wenn Sie für dieses Feld ein Muster für Übereinstimmung
+angeben, kann der Suchvorgang enorm beschleunigt werden, da das
+erste Feld einer Datei intern speziell verwaltet wird. Damit das
+Verfahren funktioniert, dürfen keine globalen Alternativen oder
+lokale Alternativen für das erste Feld verwendet werden.
+ Diese Suchoptimierung sollten Sie bereits beim Einrichten einer
+Datei berücksichtigen. Geben Sie als erstes Feld das an, nach dem
+am ehesten direkt gesucht wird. Typisches Beispiel hierfür ist der
+Nachname, aber auch Artikelnummern sind sinnvoll. Wichtig ist, daß
+das erste Feld nicht zu oft identisch ist und auch mehr als zwei
+Buchstaben enthält, damit die Optimierung ihre volle Wirksamkeit
+entfaltet.
+ Denken Sie daran, daß durch die Feldauswahl ein beliebiges
+Feld als erstes auf dem Bildschirm stehen kann. Für die Optimierung
+wird jedoch immer das Feld betrachtet, das beim Einrichten der
+Datei als erstes angegeben wurde.
+
+
+10.4 Markieren
+
+Manchmal entsteht die Situation, daß Sie eine Reihe von Sätzen
+bearbeiten wollen, aber keine Suchbedingung formulieren können,
+die auf alle diese Sätze zutrifft. In diesem Fall bietet EUDAS Ihnen
+die Möglichkeit, solche Sätze von Hand zu markieren.
+ Ein Beispiel: Sie haben eine ganze Reihe von Sätzen geändert
+und wollen diese Änderungen als Protokoll ausdrucken. Es läßt sich
+aber nicht mit Hilfe eines Suchmusters feststellen, welche Sätze
+geändert wurden.
+ Als Abhilfe wählen Sie bei jedem geänderten Satz die Funktion
+#free (0.2)#
+
+ M Markierung
+
+#free (0.2)#
+Dadurch wird der bisher unmarkierte Satz markiert. Dies wird
+kenntlich an der Anzeige 'MARK+' in der Überschrift. Sobald Sie den
+ersten Satz markiert haben, erscheint bei jedem Satz, ob er markiert
+ist oder nicht.
+ Haben Sie einen Satz irrtümlich markiert, können Sie die Mar­
+kierung mit der gleichen Funktion auch wieder entfernen.
+ Alle Funktionen, die bisher die durch das Suchmuster ausge­
+wählten Sätze bearbeitet haben, arbeiten nun nur noch auf den
+markierten Sätzen. Somit können Sie anschließend mit der Druck­
+funktion die gewünschten Sätze drucken. Die Markierung hat also
+Priorität über die eingestellte Suchbedingung. Lediglich die Bewe­
+gung am Bildschirm beachtet immer nur die Suchbedingung.
+ Sie können alle Markierungen der Datei mit der Funktion
+#free (0.2)#
+
+ Alle Markier.
+ L Löschen
+
+#free (0.2)#
+im Menü 'Gesamtdatei' wieder entfernen. Anschließend wird beim
+Drucken wieder das Suchmuster beachtet. Die Markierungen ver­
+schwinden auch, wenn eine neue Datei geöffnet wird. Die Markie­
+rungen sind also nicht permanent in einer Datei gespeichert, son­
+dern existieren nur, während die Datei geöffnet ist.
+ Bei Koppeldateien können Sie aus technischen Gründen immer
+nur alle Kombinationen auf einmal markieren. Die Markierung einer
+Kombination markiert auch alle anderen Kombinationen des gleichen
+Satzes.
+
+
+10.5 Übersicht
+
+Wie Sie bisher gesehen haben, zeigte EUDAS immer einen einzigen
+Satz in dem Standardformular auf dem Bildschirm. Es gibt jedoch
+auch eine Möglichkeit, mehrere Sätze gleichzeitig zu betrachten.
+Dazu dient die Funktion
+#free (0.2)#
+
+ U Übersicht
+
+#free (0.2)#
+im Menü 'Gesamtdatei'.
+ In der Übersicht nimmt jeder Satz nur eine Bildschirmzeile in
+Anspruch. Die Feldinhalte werden, durch Komma getrennt, in der
+Zeile nacheinander aufgezählt, bis kein Platz mehr vorhanden ist.
+Am Anfang jeder Zeile steht die Satznummer und ob der jeweilige
+Satz markiert ist (entweder '+' für markiert oder '-'). In der Über­
+schrift stehen in gleicher Weise die Feldnamen angegeben.
+ Der aktuelle Satz wird innerhalb der Übersichtsanzeige immer
+durch eine inverse Satznummer dargestellt. Es werden nur die durch
+das eingestellte Suchmuster ausgewählten Sätze gezeigt. Trifft die
+Selektionsbedingung nicht auf den aktuellen Satz zu, wird an seiner
+Stelle zur Information ein leerer Platzhalter angezeigt. Hinter dem
+letzten Satz wird auch das Dateiende als besonders gekennzeichne­
+ter Satz angegeben.
+
+___________________________________________________________________________________________
+
+ ÜBERSICHT: Blättern: HOP OBEN, HOP UNTEN Ende: ESC q Hilfe: ESC ?
+ Satznr. Name, Vorname, PLZ, Ort, Strasse, m/w,
+ 1 - Wegner, Herbert, Krämergasse 12, 5000, Köln, m,
+ 2 - Sandmann, Helga, Willicher Weg 109, 5300, Bonn 1, w,
+ 3 - Katani, Albert, Lindenstr. 3, 5210, Troisdorf, m,
+ 4 - Ulmen, Peter, Mozartstraße 17, 5, Köln 60, m,
+ 5 - Regmann, Karin, Grengelweg 44, 5000, Köln 90, w,
+ 6 - Arken, Hubert, Talweg 12, 5200, Siegburg, m,
+ 7 - Simmern, Anna-Maria, Platanenweg 67, 5, Köln 3, w,
+ 8 - Kaufmann-Drescher, Angelika, Hauptstr. 123, 53, Bonn 2, w,
+ 9 - Fuhrmann, Harald, Glockengasse 44, 5000, Köln 1, m,
+ 10 - Seefeld, Friedrich, Kabelgasse, 5000, Köln-Ehrenfeld, m,
+ 11 - << DATEIENDE >>
+
+___________________________________________________________________________________________
+
+
+#center#Abb. 10-1 Übersicht
+
+
+#on("b")#Feldauswahl#off("b")# Wenn Sie die Funktion aufrufen, haben Sie
+zuerst
+noch die Möglichkeit, nur einen Teil der vorhandenen Felder zur
+Anzeige auszuwählen. Dazu bejahen Sie die Frage und können dann
+die Felder in der gewünschten Reihenfolge ankreuzen. Analog zur
+Funktion 'Feldauswahl' wird auch hier die zuletzt für die Übersicht
+verwendete Feldauswahl beibehalten, wenn Sie die Frage verneinen
+oder kein Feld ankreuzen. Die Feldauswahl für die Übersicht ist
+unabhängig von der Feldauswahl für die normale Satzanzeige.
+ Von der Möglichkeit zur Feldauswahl sollten Sie Gebrauch ma­
+chen, denn durch die komprimierte Darstellung der Übersicht kann
+meistens nur ein kleiner Teil eines Satzes dargestellt werden.
+
+#on("b")#Rollen#off("b")# Nachdem die Sätze auf dem Bildschirm erschienen
+sind,
+haben Sie wieder die Möglichkeit, die Darstellung zu rollen. Dazu
+können Sie die Pfeiltasten OBEN und UNTEN sowie die Tastenkombi­
+nationen HOP OBEN und HOP UNTEN verwenden. Diese Funktionen
+verschieben den invers dargestellten aktuellen Satz und funktio­
+nieren wie im Editor. Beachten Sie auch hier wieder den Unterschied
+zum Rollen in der Einzelsatzanzeige.
+ Das Rollen wirkt wie ein Positionieren mit 'Weiter' oder 'Zu­
+rück'. Nach der Rückkehr aus der Übersicht können Sie sich also an
+einer ganz anderen Stelle in der Datei befinden.
+ Es stehen Ihnen zum Rollen auch noch die folgenden Tasten­
+kombinationen zur Verfügung (wie im Editor): HOP RETURN macht
+den aktuellen Satz zum ersten auf der Seite. ESC '1' zeigt den er­
+sten Satz der Datei, ESC '9' analog dazu den letzten.
+ Wenn Sie eine komplizierte Suchbedingung eingestellt haben
+und EUDAS viele Sätze erfolglos überprüfen muß, dauert der Bild­
+aufbau natürlich entsprechend lange. EUDAS gibt zu Ihrer Informa­
+tion aber immer die Nummer des Satzes aus, der gerade überprüft
+wird. Außerdem werden Tastenbefehle nach jeder Zeile angenommen,
+so daß Sie schon weiterblättern können, wenn Sie den ersten Satz
+gesehen haben.
+
+#on("b")#Markieren#off("b")# In der Übersicht können Sie auch Sätze
+markieren. Mit
+'+' markieren Sie den aktuellen Satz; mit '-' entfernen Sie die Mar­
+kierung wieder. So können Sie einfach die Sätze ankreuzen, die Sie
+später bearbeiten wollen.
+
+#on("b")#Verlassen#off("b")# Mit ESC 'q' können Sie die Übersicht wieder
+verlassen,
+auch mitten beim Aufbau des Bildes. Haben Sie erkannt, daß EUDAS
+sinnlos mit einer falschen Suchbedingung sucht, können Sie die
+Funktion auch mit ESC 'h' (Halt) abbrechen und gegebenenfalls ein
+neues Suchmuster einstellen.
+
diff --git a/doc/eudas/eudas.hdb.11 b/doc/eudas/eudas.hdb.11
new file mode 100644
index 0000000..6a59847
--- /dev/null
+++ b/doc/eudas/eudas.hdb.11
@@ -0,0 +1,674 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (109)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+11 Funktionen zur Bearbeitung
+
+
+
+11.1 Sortieren
+
+Wenn Sie die Sätze in Ihrer EUDAS-Datei in einer bestimmten Rei­
+henfolge haben wollen (dies wird in vielen Fällen zum Drucken
+verlangt), müssen Sie die Datei sortieren. Sie können EUDAS ange­
+ben, in welcher Reihenfolge die Sortierung erfolgen soll. Um die
+aktuelle Datei zu sortieren, rufen Sie die Funktion
+#free (0.2)#
+
+ Akt. Datei
+ S Sortieren
+
+#free (0.2)#
+auf. Falls die Datei noch nie sortiert wurde, wird Ihnen auf jeden
+Fall die Sortierreihenfolge zum Auswählen angeboten. Anderenfalls
+werden Sie gefragt, ob Sie die vorherige Sortierreihenfolge ändern
+wollen.
+ Das Sortieren wird als Veränderung betrachtet und nur auf der
+Arbeitskopie durchgeführt!
+
+#on("b")#Sortierreihenfolge#off("b")# Die Sortierreihenfolge gibt an, welche
+Felder in
+welcher Reihenfolge beim Vergleichen zweier Sätze benutzt werden
+sollen. Zuerst wird das an erster Stelle angegebene Feld verglichen.
+Sind die Inhalte hier unterschiedlich, wird die Einordnung der Sätze
+nach diesem Feld bestimmt.
+ Sind die Inhalte in diesem Feld aber gleich, so wird nach dem
+nächsten Feld verglichen. Ist kein weiteres Feld in der Sortierrei­
+henfolge angegeben, wird der Vergleich an dieser Stelle mit einem
+zufälligen Ergebnis abgebrochen, das heißt, es kann nicht vorher­
+gesagt werden, welcher der beiden Sätze zuerst kommt.
+ Die Sortierreihenfolge können Sie in einer Menüauswahl einge­
+ben. Kreuzen Sie die Felder an, die Sie vergleichen wollen und ach­
+ten Sie auf die richtige Reihenfolge. Die eingegebene Reihenfolge
+wird in der Datei gespeichert, um beim nächsten Sortiervorgang
+wiederverwendet zu werden.
+ Nachdem Sie alle bei der Sortierung zu berücksichtigenden
+angekreuzt haben, werden Sie für jedes dieser Felder gefragt, ob
+nach dem Feld aufsteigend oder absteigend sortiert werden soll.
+
+#on("b")#Ablauf#off("b")# Der Ablauf des Sortierens wird durch Ausgabe von
+Satz­
+nummern dargestellt. Bis zur ausgegebenen Satznummer sind alle
+Sätze richtig sortiert. Bei Bedarf kann der Vorgang durch SV und
+dann 'halt' abgebrochen werden. Die Datei bleibt dabei auf jeden
+Fall intakt.
+
+#on("b")#Optimierung#off("b")# Die gespeicherte Sortierreihenfolge wird auch
+noch zu
+einer weiteren Optimierung benutzt. Wenn eine Datei sortiert war
+und nur wenige Änderungen stattgefunden haben, brauchen beim
+nächsten Sortiervorgang nur die wenigen veränderten Sätze einzeln
+einsortiert zu werden. Das funktioniert natürlich nur unter der
+Voraussetzung, daß die gleiche Sortierreihenfolge gewählt wird. Das
+Sortieren braucht in diesem Fall erheblich weniger Zeit.
+
+#on("b")#Probleme#off("b")# Normalerweise werden die einzelnen Felder nach
+dem
+EUMEL-Zeichencode verglichen. Das bedeutet, daß sich die Reihen­
+folge der Zeichen nach dem EUMEL-Zeichencode richtet. Ein Zeichen
+mit einem höheren Code wird also vor einem Zeichen mit einem
+niedrigeren Code einsortiert.
+ In manchen Fällen ergeben sich mit diesem Vergleichsverfahren
+aber auch Schwierigkeiten. Wenn in einem Feld Zahlen oder DM-
+Beträge stehen, führt die Methode zu falschen Ergebnissen. Die '10'
+wird zum Beispiel vor der '2' einsortiert. Warum? Texte werden
+immer linksbündig geschrieben und verglichen. Bei Zahlen richtet
+sich die Wertigkeit jedoch nach dem Abstand vom Komma.
+ Da bei Texten zuerst das erste Zeichen verglichen wird, ent­
+steht hier durch Vergleich von '1' und '2' der Eindruck, die '10'
+käme vor der '2'. Korrigieren könnte man dies, indem man ein Leer­
+zeichen vor die '2' schreibt. Wenn also die (nicht geschriebenen)
+Dezimalkommata direkt untereinanderstehen, werden Zahlen richtig
+verglichen.
+
+#on("b")#Typ ZAHL#off("b")# EUDAS hat jedoch eine bequemere Art, dieses
+Problem zu
+behandeln. Ein Feld, das Zahlen enthalten soll, bekommt einen spe­
+ziellen Typ ZAHL zugewiesen, der zu einer richtigen Sortierung
+führt.
+ Bei Feldern vom Typ ZAHL ignoriert EUDAS bei Vergleichen alle
+nichtnumerischen Zeichen und vergleicht den Wert der Zahl. So
+können Sie zum Beispiel in einem Satz '2,50 DM' und im anderen
+Satz '10 DM' eintragen - EUDAS kann jetzt die richtige Reihenfolge
+feststellen.
+ Übrigens: falls Sie numerische Werte lieber mit einem Dezi­
+malpunkt statt einem Dezimalkomma schreiben, können Sie EUDAS
+das mit dem ELAN-Kommando
+
+
+ dezimalkomma (".")
+
+
+mitteilen. Wenn Sie ein solches Kommando eingeben wollen, können
+Sie im EUDAS-Menü ESC ESC drücken. In der Statuszeile erscheint
+dann die Aufforderung:
+
+
+ Gib Kommando:
+
+
+Hier können Sie wie im Editor oder im EUMEL-Monitor ein beliebiges
+Kommando eingeben und ausführen.
+ Die Normaleinstellung für das Dezimalkomma erreichen Sie
+wieder durch das Kommando
+
+
+ dezimalkomma (",")
+
+
+
+#on("b")#Typ ändern#off("b")# Die Feldtypen sind eine permanente Eigenschaft
+einer
+EUDAS-Datei. Beim Einrichten einer neuen Datei wird zunächst der
+Standardtyp für alle Felder genommen. Sie erhalten jedoch Gelegen­
+heit, abweichende Feldtypen zu vergeben, wenn Sie die Frage
+
+___________________________________________________________________________________________
+
+ Feldnamen oder Feldtypen ändern (j/n) ?
+___________________________________________________________________________________________
+
+
+bejahen.
+ Auch nachträglich können Sie die Feldtypen noch ändern. Dies
+geschieht mit der Funktion
+#free (0.2)#
+
+ F Feldstrukt.
+
+#free (0.2)#
+im Menü 'Öffnen'. Zunächst werden Sie gefragt, ob Sie noch weitere
+Feldnamen anfügen wollen. So könnten Sie die Datei um weitere
+Felder ergänzen, die bei allen Sätzen zunächst leer sind. Die neuen
+Felder müssen Sie wie beim Einrichten der Datei untereinander im
+Editor schreiben.
+ Als zweites erscheint dann die gleiche Frage wie oben. Wenn
+Sie diese bejahen, wird Ihnen eine Auswahl der zu ändernden Fel­
+der mit Feldnamen und den zugehörigen Feldtypen angeboten. Kreu­
+zen Sie hier die Felder an, deren Feldtypen Sie ändern möchten.
+ Da Sie mit dieser Funktion sowohl Feldnamen als auch Feld­
+typen verändern können, wird Ihnen für jedes Feld zunächst der
+Name zum Ändern angeboten. Sie können den Namen korrigieren oder
+überschreiben. Die Namensänderung hat jedoch keine Auswirkung
+auf den Feldinhalt!
+ Wenn Sie den Namen nicht ändern wollen, drücken Sie einfach
+RETURN. Anschließend können Sie für das Feld den neuen Feldtyp
+angeben. Tippen Sie einen der vier Feldtypen als Text ein und
+drücken Sie RETURN. Anschließend hat das Feld einen neuen Typ.
+Die verschiedenen möglichen Typen werden jetzt genau erklärt.
+
+#on("b")#Feldtypen#off("b")# TEXT ist der Standardtyp, der die Feldinhalte
+nach
+EUMEL-Zeichencode vergleicht. Den Typ ZAHL hatten wir schon
+weiter oben kennengelernt. Daneben gibt es noch den Typ DATUM.
+ Dieser Typ vergleicht Daten der Form 'tt.mm.jj'. Soll ein sol­
+ches Datum richtig einsortiert werden, müßte es anderenfalls in der
+Reihenfolge umgedreht werden (also 'jj.mm.tt'). Dies ist aber nicht
+nötig, wenn das Feld den Typ DATUM bekommt. Beachten Sie, daß
+alle Inhalte, die nicht die beschriebene Form haben, als gleich be­
+trachtet werden.
+ Der letzte Typ ist DIN. Dabei werden Texte nach DIN 5007 ver­
+glichen. Das bedeutet, daß Groß- und Kleinbuchstaben als gleich
+angesehen werden, daß alle nichtalphabetischen Zeichen ignoriert
+werden und die Umlaute ihren richtigen Platz bekommen (Umlaute
+werden in normalen Texten hinter allen anderen Zeichen einsor­
+tiert). Da hierfür ein relativ großer Zeitaufwand notwendig ist,
+sollte dieser Typ nur dann gewählt werden, wenn er erforderlich ist.
+Den schnellsten Vergleich ermöglicht der Typ TEXT.
+
+#on("b")#Hinweis#off("b")# Beachten Sie, daß mit der Vergabe von Feldtypen
+keine
+Überprüfung der Eingabe verbunden ist. Insbesondere beim Datum
+wird nicht geprüft, ob die Form 'tt.mm.jj' eingehalten wurde. Wollen
+Sie solche Überprüfungen vornehmen, lesen Sie bitte Abschnitt 11.3.
+
+
+11.2 Kopieren
+
+In diesem Abschnitt sollen Sie erfahren, wie Sie eine EUDAS-Datei
+#on("i")#kopieren#off("i")# können. Diese Funktion kann nicht nur ein inhaltsgleiches
+Duplikat einer EUDAS-Datei herstellen (dies könnten Sie einfacher
+durch eine logische Kopie bewerkstelligen, s. 16.1), sondern auch
+komplizierte Umstrukturierungen vornehmen.
+
+#on("b")#Kopiermuster#off("b")# Der Schlüssel zu dieser Leistungsfähigkeit
+ist das
+#on("i")#Kopiermuster#off("i")#. Wie beim Druckmuster legen Sie dadurch die genauen
+Auswirkungen der Funktion fest.
+ Für jedes Feld in der Zieldatei, in die kopiert werden soll,
+enthält das Kopiermuster die Angabe, woraus der Inhalt dieses
+Feldes entstehen soll. Durch Auswahl und Reihenfolge dieser Anga­
+ben bestimmen Sie die Struktur der Zieldatei.
+ Im einfachsten Fall sieht die Kopieranweisung für ein Feld wie
+folgt aus:
+
+
+ "Feldname" K f ("Feldname");
+
+
+Das 'K' dient zur Festlegung der Kopierfunktion. Auf der linken
+Seite steht in Anführungsstrichen der Name des Zielfeldes. Der
+Ausdruck auf der rechten Seite gibt den zukünftigen Inhalt des
+Feldes an. Der Ausdruck im obigen Beispiel steht einfach für den
+Inhalt des Feldes 'Feldname' in der aktuellen Datei. Das Semikolon
+am Ende dient zur Abgrenzung, da der ganze Ausdruck auch mehrere
+Zeilen lang sein darf.
+ In der oben genannten Form würde das Feld 'Feldname' iden­
+tisch in die Zieldatei kopiert. Weitere Möglichkeiten besprechen wir
+später.
+
+#on("b")#Feldreihenfolge#off("b")# Zunächst wollen wir uns damit befassen,
+wie Sie
+die Feldreihenfolge in der Zieldatei beeinflussen können. Dies ge­
+schieht einfach dadurch, daß Sie die Kopieranweisungen in der ge­
+wünschten Reihenfolge aufschreiben. Damit können wir bereits ein
+erstes komplettes Beispiel betrachten:
+
+
+ "Name" K f ("Name");
+ "Vorname" K f ("Vorname");
+ "PLZ" K f ("PLZ");
+ "Ort" K f ("Ort");
+ "Strasse" K f ("Strasse");
+ "m/w" K f ("m/w");
+
+
+Dieses Kopiermuster würde die bereits beschriebene Adressendatei
+identisch kopieren, da alle Felder in der gleichen Reihenfolge vor­
+kommen.
+ Wenn Sie jedoch die Feldreihenfolge ändern wollen (um zum
+Beispiel ein anderes Feld als erstes zu optimieren), brauchen Sie
+bloß die Reihenfolge im Kopiermuster zu verändern:
+
+
+ "Ort" K f ("Ort");
+ "Name" K f ("Name");
+ "Vorname" K f ("Vorname");
+ "PLZ" K f ("PLZ");
+ "Strasse" K f ("Strasse");
+ "m/w" K f ("m/w");
+
+
+Im Gegensatz zur Auswahl der Feldreihenfolge für die Anzeige än­
+dern Sie so die Feldreihenfolge für die Zieldatei permanent.
+
+#on("b")#Felder anfügen#off("b")# Die beiden angegebenen Kopiermuster haben
+jedoch
+nur dann die beschriebene Wirkung, wenn die Zieldatei noch nicht
+existert. Bei einer existierenden Datei kann die Feldreihenfolge
+nicht mehr geändert werden; daher hat die Reihenfolge der Kopier­
+anweisungen dann keine Wirkung.
+ Sie können jedoch zu einer existierenden Zieldatei noch Felder
+hinzufügen. EUDAS verwendet nämlich folgende einfache Vorschrift:
+
+#limit (12.0)#
+ Wenn als Zielfeld in einer Kopieranweisung ein Feld
+ genannt wird, das in der Zieldatei noch nicht vorkommt,
+ wird es als weiteres Feld der Zieldatei hinzugefügt.
+#limit (13.5)#
+
+Diese Strategie hat im Fall der nicht existierenden Datei zur Folge,
+daß alle Felder neu sind und in der Reihenfolge ihres Auftretens
+eingerichtet werden. Existiert die Datei schon, werden zusätzliche
+Felder am Ende angefügt.
+ Beachten Sie, daß zusätzliche Felder für eine existierende
+Datei nur in den neu hinzukopierten Sätzen gefüllt sind. In den
+alten Sätzen bleiben alle neuen Felder einfach leer.
+
+#on("b")#Satzauswahl#off("b")# An dieser Stelle sollte erwähnt werden, daß
+wie bei
+allen Funktionen, die die gesamte Datei betreffen, nur die durch die
+Suchbedingung ausgewählten Sätze kopiert werden. Ist mindestens
+ein Satz markiert, werden nur die markierten Sätze kopiert und die
+Suchbedingung ignoriert.
+
+#on("b")#Teildatei#off("b")# Jetzt können Sie auch die zweite wichtige
+Aufgabe des
+Kopierens verstehen. Sie können aus einer Datei einen Teil der
+Sätze und einen Teil der Felder #on("i")#herausziehen#off("i")#. Danach haben Sie
+unter Umständen eine wesentlich kleinere Datei, die sich auch
+schneller bearbeiten läßt. Gerade wenn Sie nicht den allerneuesten
+64-Bit-Supercomputer haben, können Sie so viel Zeit sparen, wenn
+Sie wiederholt nur mit einem Teil der Datei arbeiten müssen.
+ Die Auswahl der Sätze für einen solchen Zweck erfolgt über ein
+Suchmuster; im Kopiermuster geben Sie dann nur die gewünschten
+Felder an.
+
+#on("b")#Aufruf#off("b")# An dieser Stelle wollen wir jetzt endlich
+behandeln, wie
+Sie die Kopierfunktion aufrufen. Dazu gibt es die Auswahl
+#free (0.2)#
+
+ Satzauswahl
+ K Kopieren
+
+#free (0.2)#
+im Menü "Gesamtdatei". Als erstes werden Sie nach dem Namen der
+Zieldatei gefragt. Existiert die Zieldatei schon und war sie vorher
+sortiert, werden Sie gefragt, ob Sie die Datei zum Schluß wieder
+sortieren wollen. Wie immer beim Sortieren werden auch hier gege­
+benenfalls nur die neu hinzugekommenen Sätze einsortiert.
+ Als nächstes müssen Sie den Namen des Kopiermusters angeben.
+Da das Kopiermuster eine normale Textdatei ist, können Sie sich
+einen beliebigen Namen ausdenken, unter dem das Muster dann
+gespeichert wird.
+ Wollen Sie das Kopiermuster nicht aufbewahren, sondern nur
+einmal verwenden, brauchen Sie keinen Namen anzugeben. Drücken
+Sie einfach RETURN und für die Dauer des Kopierens wird das
+Kopiermuster als unbenannte Datei eingerichtet.
+ Nachdem Sie den Namen des Kopiermusters eingegeben haben,
+gelangen Sie in den Editor, wo Sie das Muster ändern können. Damit
+Sie beim ersten Mal nicht so viel tippen müssen, bietet EUDAS Ihnen
+bei einer neuen Musterdatei ein #on("i")#Standard-Kopiermuster#off("i")# zum Ändern
+an. Das Aussehen des Standard-Kopiermusters richtet sich danach,
+ob die Zieldatei schon existiert oder nicht.
+ Existiert die Zieldatei noch nicht, so werden im Standard-
+Kopiermuster alle Felder der Ausgangsdatei in ihrer originalen Rei­
+henfolge angegeben. Wenn Sie dieses Muster nicht noch ändern, wird
+die aktuelle Datei identisch kopiert.
+ Sie können jedoch die Feldreihenfolge verändern oder Felder
+weglassen, indem Sie einfach die entsprechenden Zeilen vertauschen
+oder löschen. Für Umbenennungen überschreiben Sie einfach den
+Namen auf der linken Seite der Kopieranweisung. So können Sie das
+Kopiermuster mit geringstem Aufwand erstellen.
+ Existiert die Zieldatei jedoch schon, werden Ihnen im Kopier­
+muster alle Felder der Zieldatei angeboten. Bei Feldern, die in der
+aktuellen Datei nicht vorkommen, erscheint folgende Anweisung:
+
+
+ "Anrede" K "";
+
+
+Obwohl die Anweisung in diesem Fall keine Wirkung hat (wenn man
+sie wegließe, würde das Feld ebenfalls leer bleiben), ist sie dennoch
+aufgeführt, damit Sie auf der rechten Seite einen entsprechenden
+Ausdruck einsetzen können.
+ Bei den angebotenen Anweisungen hat eine Änderung der Rei­
+henfolge oder eines Feldnamens keinen Sinn, da diese Felder ja alle
+bereits existieren. Jedoch können Sie die Ausdrücke auf der rechten
+Seite variieren und neue Anweisungen (Felder) hinzufügen.
+
+#on("b")#Ablauf#off("b")# Wenn Sie die Eingabe des Kopiermusters mit ESC 'q'
+verlas­
+sen, wird das Kopiermuster übersetzt. Dabei können Fehlermeldun­
+gen auftreten. Sie können dann die Fehler korrigieren, wobei Sie die
+Fehlermeldungen gleichzeitig auf dem Bildschirm sehen können. War
+das Kopiermuster korrekt, werden alle ausgewählten (bzw. markier­
+ten) Sätze der aktuellen Datei in die Zieldatei kopiert und diese
+anschließend gegebenenfalls noch sortiert.
+ Die kopierten Sätze werden jeweils am Ende der Zieldatei ange­
+fügt. War die Zieldatei vorher schon sortiert, können Sie angeben,
+daß die neuen Sätze zum Schluß noch einsortiert werden. Anderen­
+falls können Sie die Datei anschließend mit der Funktion 'Sortieren'
+sortieren.
+
+#on("b")#ELAN-Ausdrücke#off("b")# Wenn Sie schon einmal programmiert haben,
+wird
+Ihnen vielleicht aufgefallen sein, daß ein Kopiermuster einem
+ELAN-Programm verdächtig ähnlich sieht. Diese Vermutung trügt Sie
+nicht. Dies läßt den Schluß zu, daß Sie noch mehr ELAN hier an­
+bringen können.
+ Haben Sie noch nie programmiert, sollten Sie jetzt nicht in
+Panik geraten, denn das Wichtigste dieses Abschnitts haben Sie
+bereits gelernt. Vielleicht sind Ihnen die folgenden Beispiele bereits
+ganz nützlich. Um alle Möglichkeiten auszunutzen, sollten Sie sich
+aber irgendwann (später!) mit den Kapiteln 14 und 15 befassen, in
+denen Sie Genaueres erfahren.
+ Zunächst sei festgestellt, daß der rechte Teil einer Kopieran­
+weisung ein beliebiger ELAN-Ausdruck sein kann, der einen TEXT
+liefert. Den wichtigsten Ausdruck kennen Sie bereits:
+
+
+ f ("Feldname")
+
+
+liefert den Inhalt des Feldes 'Feldname' des aktuellen Satzes der
+aktuellen Datei. Gibt es das Feld nicht, erscheint eine Fehlermel­
+dung bei der Ausführung.
+ Sie können jedoch auch einen konstanten Text angeben, der
+dann für alle Sätze gleich ist. Dazu schließen Sie den Text einfach
+in Anführungsstriche ein. Die folgende Kopieranweisung dient dazu,
+ein neues Feld einzurichten, das aber vorläufig noch leer bleiben
+soll:
+
+
+ "Feldname" K "";
+
+
+Ebenso können Sie mehrere Felder zu einem neuen verbinden, zum
+Beispiel:
+
+
+ "Wohnort" K f ("PLZ") + " " + f ("Ort");
+
+
+Das Pluszeichen kennzeichnet die Aneinanderreihung von zwei Tex­
+ten. Denken Sie auch immer an das Semikolon am Ende. In gleicher
+Weise können Sie viele andere Textfunktionen verwenden, die in
+Kapitel 14 beschrieben sind.
+ Prinzipiell können Sie auch Bedingungen mit IF abfragen, wie
+zum Beispiel in der folgenden Übersetzung:
+
+
+ IF f ("m/w") = "w" THEN
+ "Anrede" K "Frau"
+ ELSE
+ "Anrede" K "Herr"
+ END IF;
+
+
+Auf diese Weise können Sie Kodierungen verschiedenster Art auto­
+matisch umsetzen. Sie müssen hierbei jedoch unbedingt darauf ach­
+ten, daß innerhalb der IF-Konstruktion immer eine Kopieranweisung
+ausgeführt wird. Falls nämlich kein Fall zutrifft und für ein Feld
+keine Kopieranweisung ausgeführt wird, wird das Feld bei einer
+neuen Datei auch nicht richtig eingerichtet.
+
+
+11.3 Tragen
+
+In Kapitel 6 hatten Sie gesehen, wie man einzelne Sätze aus der
+aktuellen Datei in eine andere trägt, und auch, wie man sie wieder
+zurückholen kann. Diese Funktion diente im wesentlichen dazu,
+nicht mehr benötigte Sätze zu entfernen.
+ Sie haben aber auch die Möglichkeit, eine ganze Reihe von
+Sätzen in einem Arbeitsgang zu tragen, nämlich alle durch das
+Suchmuster ausgewählten beziehungsweise alle markierten Sätze.
+Diese Funktion dient ebenfalls dazu, Sätze zu entfernen, beispiels­
+weise alle Sätze, die vor einem gewissen Stichtag liegen. Als wei­
+tere Anwendung können Sie beim Tragen aber auch Bedingungen
+überprüfen.
+ Diese #on("i")#Prüfbedingungen#off("i")# sollen sicherstellen, daß die Daten in
+einer Datei ganz bestimmten Richtlinien entsprechen. Zum Beispiel
+kann geprüft werden, ob ein eingegebenen Datum stimmen kann, ob
+ein Satz doppelt aufgenommen wurde oder ob eine Artikelnummer die
+richtige Anzahl von Stellen hat.
+ Die Prüfbedingungen werden einer Datei fest zugeordnet. Sie
+können mit der Funktion
+#free (0.2)#
+
+ P Prüfbed.
+
+#free (0.2)#
+im Menü 'Öffnen' eingegeben oder geändert werden. Die Prüfbedin­
+gungen werden als Text im Editor geschrieben.
+
+#on("b")#Ablauf#off("b")# Das ganze Verfahren läuft nun so ab: Sie fügen neue
+Sätze
+immer erst in eine Zwischendatei ein, die die gleiche Struktur wie
+die eigentliche Datei hat. Wenn Sie alle Sätze fertig eingegeben
+haben, tragen Sie diese Datei komplett in die gewünschte Datei.
+Dabei werden die Prüfbedingungen getestet.
+ Erfüllt ein Satz die Bedingungen, wird er anstandslos getragen.
+Trifft eine Bedingung aber nicht zu, bleibt der Satz in der Zwi­
+schendatei und eine entsprechende Meldung wird ausgegeben. Die
+Meldungen werden gespeichert, um Sie später nochmal abrufen zu
+können.
+ Sie müssen jetzt in der Zwischendatei die notwendigen Ände­
+rungen durchführen, damit die Prüfbedingungen erfüllt werden. Beim
+Aufruf der Funktion
+#free (0.2)#
+
+ A Ändern
+
+#free (0.2)#
+können Sie mit Hilfe der Tastenkombination ESC 'P' (großes P) die
+Datei mit den Fehlermeldungen in einem kleinen Teilfenster editie­
+ren. Anhand dieser Hinweise können Sie dann den Satz korrigieren.
+Die Meldungen bleiben bis zum nächsten Öffnen oder Tragen erhal­
+ten.
+ Nach der Korrektur können Sie den gleichen Vorgang erneut
+aufrufen - es sind ja nur noch die zuerst fehlerhaften Sätze in der
+Zwischendatei. Bei Bedarf können Sie diesen Vorgang wiederholen,
+bis alle Sätze korrekt übernommen worden sind.
+
+#on("b")#Aufruf#off("b")# Das Tragen wird aufgerufen durch die Funktion
+#free (0.2)#
+
+ Satzauswahl
+ T Tragen
+
+#free (0.2)#
+Nach Eingabe des Zieldateinamens müssen Sie noch angeben, ob Sie
+die Prüfbedingungen testen wollen.
+
+#on("b")#Prüfbedingungen#off("b")# Zu diskutieren bleibt noch die Form der
+Prüfbe­
+dingungen. Diese stellen ein kleines ELAN-Programm dar, in dem
+einige spezielle Prozeduren zum Prüfen enthalten sind. Wenn Sie
+nicht ELAN programmieren können, sollte Sie diese Bemerkung nicht
+erschrecken: die Prüfbedingungen sind einfach genug.
+ Sie schreiben also die Prüfbedingungen jeweils untereinander.
+Eine mögliche Bedingung ist
+
+
+ wertemenge ("Feldname", "Wert1,Wert2,Wert3,Wert4");
+
+
+Diese Bedingung gibt an, daß das Feld einen der angegebenen Werte
+haben muß. Die Werte werden untereinander durch Komma getrennt.
+Es gibt jedoch keine Möglichkeit, Werte mit Komma darzustellen, da
+das Komma immer als Trennung wirkt. Leerzeichen dürfen in den
+Werten vorkommen, sie müssen dann aber auch genau so im Feld
+stehen.
+ Wir könnten zum Beispiel eine Bedingung für unser Feld 'm/w'
+wie folgt formulieren
+
+
+ wertemenge ("m/w", "m,w");
+
+
+EUDAS würde sich dann beschweren, wenn das Feld leer wäre (ir­
+gendein Geschlecht muß die Person ja wohl haben). Wenn das Feld
+auch leer sein darf, geben Sie einfach zwei Kommata hintereinander
+oder ein Komma am Anfang an:
+
+
+ wertemenge ("m/w", ",m,w");
+
+
+Eine andere Möglichkeit der Prüfbedingung besteht darin, eine
+Maske für ein Feld zu definieren. Diese Maske gibt an, daß an be­
+stimmten Stellen des Feldes nur bestimmte Zeichen stehen dürfen.
+So könnte man zum Beispiel folgende Maske für ein Datumsfeld
+angeben:
+
+
+ feldmaske ("Datum", "99.99.99");
+
+
+Die Neunen haben hier eine spezielle Bedeutung und und stehen für
+eine beliebige Ziffer. Es gibt noch einige weitere Zeichen, die eine
+reservierte Bedeutung haben, nämlich:
+
+
+ '9' für jede Ziffer (wie schon erwähnt)
+ 'X' für jedes Zeichen
+ 'A' für jeden Großbuchstaben
+ 'a' für jeden Kleinbuchstaben
+ '*' für eine Folge beliebiger Zeichen
+
+
+Alle anderen Zeichen im Muster stehen für sich selbst. Eine Sonder­
+stellung besitzt der Stern; er sollte sparsam verwendet werden, da
+seine Benutzung etwas aufwendiger ist. Der Stern kann auch für
+eine leere Zeichenfolge stehen. Als weiteres Beispiel könnte man
+definieren
+
+
+ feldmaske ("Name", "A*");
+
+
+damit immer ein Name angegeben ist, der noch dazu mit einem Groß­
+buchstaben beginnt.
+ Für Bedingungen, die sich nicht mit diesen beiden Prozeduren
+formulieren lassen, gibt es noch
+
+
+ pruefe ("Feldname", Bedingung);
+
+
+Diese Prozedur erhält einen logischen (booleschen) Wert als Parame­
+ter, der einen Vergleich darstellt. Ist dieser Parameter falsch
+(FALSE), wird eine entsprechende Fehlermeldung protokolliert. So
+könnte man folgende Bedingung angeben:
+
+
+ pruefe ("Alter", wert ("Alter") > 18.0);
+
+
+Diese Bedingung würde sicherstellen, daß alle Personen in der Datei
+volljährig sind ('wert' ist eine von EUDAS definierte Funktion, die
+den Inhalt eines Feldes als REAL-Zahl liefert - denken Sie auch
+daran, daß der ELAN-Compiler Zahlen mit Dezimalpunkt geschrieben
+haben möchte).
+ Da die Prüfbedingungen ein ELAN-Programm sind, können Sie
+natürlich sämtliche ELAN-Anweisungen verwenden.
+ Weiterhin haben Sie die Möglichkeit, Doppeleinträge zu verhin­
+dern. Dazu geben Sie mit Hilfe der Prozedur
+
+
+ eindeutige felder (n);
+
+
+wieviele Felder vom ersten an eindeutig sein sollen. Ein zu tragen­
+der Satz, der mit irgendeinem anderen Satz in diesen Feldern über­
+einstimmt, wird als fehlerhaft zurückgewiesen. In unserer Adressen­
+datei könnte man
+
+
+ eindeutige felder (2);
+
+
+angeben. Damit würde ein neuer Satz mit bereits vorhandenem Na­
+men und Vornamen abgelehnt.
+
+#on("b")#Limit#off("b")# Aus technischen Gründen können die Prüfbedingungen
+einer
+Datei nur 2000 Zeichen umfassen. Wollen Sie aufwendigere Bedin­
+gungen konstruieren, sollten Sie sich diese als Prozedur definieren
+und insertieren. In den Prüfbedingungen müssen Sie dann nur diese
+Prozedur aufrufen.
+
+
+11.4 Automatische Änderungen
+
+Mit EUDAS können Sie die geöffnete Datei nicht nur satzweise von
+Hand ändern, sondern auch automatisch die ganze Datei. Dazu müs­
+sen Sie dem Rechner eine Vorschrift geben, nach der er handeln
+kann. Ein solches #on("i")#Änderungsmuster#off("i")# stellt im Prinzip schon ein klei­
+nes Programm dar. Der Änderungsvorgang wird durch die Auswahl
+#free (0.2)#
+
+ V Verändern
+
+#free (0.2)#
+aufgerufen. Dabei wird der Name des Änderungsmusters erfragt. Dies
+ist eine normale Textdatei. Existiert das Muster noch nicht, können
+Sie den Inhalt an dieser Stelle im Editor angeben. Anschließend
+werden alle ausgewählten Sätze nach der Vorschrift bearbeitet.
+Dabei wird jeweils die aktuelle Satznummer ausgegeben.
+
+#on("b")#Änderungsmuster#off("b")# Da auch ein Kopiermuster ein Programm ist,
+ist
+es nicht erstaunlich, daß Änderungsmuster ganz ähnlich aussehen.
+Eine typische Zeile sieht etwa so aus:
+
+
+ "Feldname" V "neuer Inhalt";
+
+
+Diese Zeile bedeutet: Ersetze den Inhalt des Feldes 'Feldname'
+durch den Text 'neuer Inhalt'. Anstelle des neuen Textes kann
+wieder ein beliebiger ELAN-Ausdruck stehen. Ein Beispiel, in dem
+ein Feld einen Stern angehängt bekommt, sieht dann so aus:
+
+
+ "Feldname" V f ("Feldname") + "*";
+
+
+Beachten Sie, daß Sie den Ausdruck auf der rechten Seite eventuell
+in Klammern setzen müssen (obwohl der Operator 'V' die niedrigste
+Priorität hat). Wenn Sie sich nicht sicher sind, können Sie den Aus­
+druck immer in Klammern einschließen.
+ Ebenso wie im Kopiermuster können Sie hier beliebige ELAN-
+Ausdrücke verwenden. Auch IF-Abfragen und ähnliche Konstruktio­
+nen sind möglich, im Gegensatz zum Kopiermuster sogar ohne Be­
+schränkungen.
+ Im Vergleich zu einem separat geschriebenen ELAN-Programm
+hat das Änderungsmuster den Vorteil, daß Sie nur die eigentlichen
+Veränderungsanweisungen kodieren müssen. Die wiederholte Anwen­
+dung auf die ausgewählten Sätze erledigt EUDAS automatisch. Wol­
+len Sie eine solche Änderungsanweisung fest insertieren, so brau­
+chen Sie das Muster nur in eine Prozedur zu verpacken und EUDAS
+zu übergeben (Näheres s. Referenzhandbuch).
+
diff --git a/doc/eudas/eudas.hdb.12 b/doc/eudas/eudas.hdb.12
new file mode 100644
index 0000000..fba5ca5
--- /dev/null
+++ b/doc/eudas/eudas.hdb.12
@@ -0,0 +1,446 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (123)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+12 Weitere Möglichkeiten zum Drucken
+
+
+
+12.1 Anschluß an die Textverarbeitung
+
+Auf zweierlei Art und Weise kann der EUDAS-Druckgenerator mit
+den Programmen der EUMEL-Textverarbeitung zusammenarbeiten.
+Zum ersten können Ausgabedateien des Druckprozesses anschließend
+mit den Textkosmetik-Werkzeugen bearbeitet werden. Zum anderen
+kann EUDAS im Editor direkt Daten aus einer EUDAS-Datei in die
+editierte Datei importieren.
+
+#on("b")#Druckrichtung#off("b")# Wie Sie schon in Kapitel 7 gesehen haben,
+kann
+man die Ausgabe des Druckgenerators statt auf den Drucker in eine
+Datei umleiten. Die Datei erhält dann einen automatisch generierten
+Namen. Sie können jedoch auch festlegen, daß die Ausgabe in eine
+ganz bestimmte Datei geschrieben werden soll. Dazu wählen Sie die
+Funktion
+
+
+ Ausgabe
+ R Richtung
+
+
+im Druckmenü. Es erscheint die Frage
+
+___________________________________________________________________________________________
+
+ Ausgabe automatisch zum Drucker (j/n) ?
+___________________________________________________________________________________________
+
+
+Verneinen Sie die Frage und es erscheint
+
+___________________________________________________________________________________________
+
+ Ausgabe in bestimmte Datei (j/n) ?
+___________________________________________________________________________________________
+
+
+Wenn Sie diese Frage auch verneinen, erhält die Ausgabedatei einen
+automatisch generierten Namen. Wenn Sie die Frage aber bejahen,
+können Sie anschließend den Namen der Ausgabedatei angeben.
+ Existiert die angegebene Datei schon, wird der Ausdruck am
+Ende der Datei angefügt. Anderenfalls wird die Datei neu eingerich­
+tet.
+ Die Angabe der Ausgabedatei gilt jedoch nur für den folgenden
+Druckvorgang. Wenn Sie mehrmals in die gleiche Datei drucken wol­
+len, müssen Sie den Namen immer wieder neu angeben. Falls Sie dies
+vergessen, wird die folgenden Male wieder ein Name automatisch
+generiert.
+
+#on("b")#Begrenzung der Dateigröße#off("b")# Für kleinere Systeme ist es
+vorteilhaft,
+wenn die Druckausgabe nicht in einer großen Datei gesammelt wird,
+sondern sich auf mehrere kleine Dateien verteilt. Da die Ausgabe­
+datei nach dem Drucken gelöscht wird, kann man auf diese Weise
+einen Hintergrundengpaß vermeiden. Es besteht die Möglichkeit, die
+maximale Größe der Ausgabedatei mit dem ELAN-Kommando
+
+
+ maxdruckzeilen (1000)
+
+
+auf eine bestimmte Zeilenzahl (maximal 4000) zu beschränken. Wenn
+der Druckgenerator nach der Bearbeitung eines Satzes feststellt,
+daß diese Maximalzahl überschritten wurde, wird die Ausgabedatei
+direkt gedruckt (falls durch 'Richtung' eingestellt) und eine neue
+Ausgabedatei eröffnet.
+
+#on("b")#Initialisierungsteil#off("b")# Dabei ist jedoch zu beachten, daß
+Drucker­
+steuerungsanweisungen, die im Vorspann eingestellt wurden, jetzt in
+der neuen Datei nicht mehr vorhanden sind. In einem solchen Fall
+würden die folgenden Teile der Ausgabe mit einer anderen Einstel­
+lung gedruckt.
+ Um dies zu vermeiden, können Sie solche Anweisungen in den
+#on("i")#Initialisierungsteil#off("i")# schreiben. Der Initialisierungsteil umfaßt alle
+Zeilen des Druckmusters bis zum ersten Abschnitt, also bis zur
+ersten Anweisung. Zeilen im Initialisierungsteil werden beim Eröff­
+nen einer neuen Ausgabedatei an den Anfang dieser Datei ge­
+schrieben.
+ Druckersteuerungsanweisungen, die ein bestimmtes Schriftbild
+der Ausgabe erzeugen ('type', 'limit', 'linefeed', 'start' usw.), sollten
+also in den Initialisierungsteil vor Beginn aller Abschnitte ge­
+schrieben werden.
+
+#on("b")#Nachbearbeitung#off("b")# Wenn Sie in der Druckausgabe verschiedene
+Schriften oder Proportionalschrift verwenden wollen, sollten Sie die
+folgenden Hinweise beachten. Da EUDAS keine Informationen über
+die Schriftbreiten und -größen hat, werden alle Schrifttypen gleich
+behandelt. Dies gilt insbesondere für die Zeilenbreite, die ja durch
+das Dateilimit des Druckmusters festgelegt ist.
+ So kann es passieren, daß Zeilen mit kleinen Schrifttypen zu
+früh abgeschnitten werden, während Zeilen mit großen Schriften
+nicht mehr auf das Blatt passen. Für diesen Fall sollten Sie das
+größte benötigte Limit einstellen (zum Beispiel 135 bei Schmal­
+schrift auf DIN A 4) und die Ausgabedatei anschließend mit 'line­
+form' bearbeiten.
+ 'lineform' verteilt zu langen Text auf mehrere Zeilen. Außerdem
+werden gegebenenfalls Trennungen durchgeführt.
+ 'lineform' benötigt zur Information Absatzmarken. Fehlt an
+einer Zeile die Absatzmarke, wird die nächste Zeile so weit wie
+möglich direkt angehängt. Die Absatzmarken in der Ausgabedatei
+werden direkt aus dem Druckmuster übernommen (es ist nicht mög­
+lich, Absatzzeilen durch eingesetzte Leerzeichen zu erzeugen). Im
+Normalfall sollten alle Zeilen im Druckmuster eine Absatzmarke
+haben.
+ Wenn Sie seitenorientierte Überschriften haben möchten, kön­
+nen Sie auch 'pageform' einsetzen. Die gewünschten Überschrift­
+anweisungen können Sie im Initialisierungsteil angeben.
+ Die beiden Funktionen wählen Sie über den Menüpunkt
+
+
+ N Nachbearb.
+
+
+im Druckmenü. Dort können Sie den Namen der Ausgabedatei ange­
+ben, die Sie bearbeiten möchten. Es wird jeweils gefragt, ob Sie
+'lineform' und 'pageform' anwenden wollen. Das Ergebnis der Bear­
+beitung können Sie danach ausdrucken.
+
+#on("b")#EUDAS im Editor#off("b")# Wenn Sie sich im Editor zum Zweck der
+Textver­
+arbeitung befinden, können Sie Daten aus einer EUDAS-Datei direkt
+in die editierte Datei übernehmen. Dazu wählen Sie zunächst die
+gewünschten Sätze aus - danach geben Sie den Namen eines Druck­
+musters an. EUDAS druckt die gewählten Sätze unter Beachtung des
+Druckmusters direkt in die editierte Datei.
+ Wenn Sie das Kommando
+
+
+ eudas
+
+
+im Editor geben (nach ESC ESC), gelangen Sie in ein spezielles
+Kurzprogramm, das alle notwendigen Information von Ihnen erfragt.
+ Zunächst müssen Sie den Namen der gewünschten EUDAS-Datei
+angeben. Diese Datei wird dann automatisch geöffnet. Vorher geöff­
+nete Dateien werden nach Anfrage gesichert. Beachten Sie, daß
+keine Datei mehr geöffnet ist, wenn Sie später EUDAS wieder normal
+aufrufen.
+ Danach wird Ihnen eine Übersicht aller Sätze gezeigt - in einer
+Form, die Sie aus der Funktion 'Übersicht' bereits kennen. Wie dort
+wird Ihnen zunächst eine Auswahl der Felder angeboten, um die
+Anzeige übersichtlich zu halten. Anschließend können Sie noch ein
+Suchmuster angeben.
+ In der Übersicht können Sie sich dann zu einem bestimmten
+Satz bewegen oder mehrere Sätze markieren. Nach dem Verlassen der
+Übersicht können Sie den aktuellen Satz oder alle ausgewählten
+(bzw. markierten) Sätze drucken. Natürlich können Sie auch beide
+Fragen verneinen.
+ Zum Drucken wird der Name des Druckmusters erfragt. Dieses
+muß bereits existieren. Die Ausgabe wird an der Stelle eingefügt, an
+der der Cursor in der editierten Datei steht - die Zeile wird bei
+Bedarf aufgesplittet.
+ Nach dem Drucken können Sie den Vorgang wiederholen, wenn
+Sie zum Beispiel einen weiteren Satz drucken wollen. Dazu können
+Sie auch ein neues Suchmuster angeben. Markierungen von Sätzen
+werden nach dem Drucken gelöscht.
+
+
+12.2 Spaltendruck
+
+Für manche Anwendungen reicht es nicht aus, wenn die bearbeite­
+ten Sätze jeweils untereinander in der Ausgabe erscheinen. Häufig­
+stes Beispiel dafür ist der Etikettendruck. Hierfür werden vielfach
+mehrbahnige Formulare eingesetzt.
+ In diesem Fall müssen die Sätze bis zur gewünschten Anzahl
+von Spalten nebeneinander gesetzt werden - erst danach wird die
+nächste Reihe angefangen.
+ EUDAS unterstützt diese Anwendung. Dazu wird hinter der
+'%WIEDERHOLUNG'-Anweisung die Anzahl der Spalten als Parameter
+geschrieben (durch Leerzeichen getrennt). Der Wiederholungsteil
+wird dann mit der angegebenen Anzahl von Spalten gedruckt. Zu
+beachten ist, daß Vorspann und Nachspann diese Spaltenanordnung
+durchbrechen, also immer hinter dem bisher Gedruckten beginnen.
+ Die Spaltenbreite wird vom Dateilimit des Druckmusters be­
+stimmt. Die Zeilen eines Wiederholungsteils werden bis zum Limit
+mit Leerzeichen aufgefüllt, wenn der nächste Wiederholungsteil
+danebengesetzt wird.
+ Alternativ kann die Spaltenbreite in Zeichen auch als zweiter
+Parameter angegeben werden. Der Wert gilt jedoch nur für den Wie­
+derholungsteil - Vor- und Nachspann richten sich immer nur nach
+dem Dateilimit.
+ Es spielt keine Rolle, ob die nebeneinandergesetzten Wieder­
+holungsteile unterschiedliche Längen haben. Die kürzeren Teile
+werden einfach bei Bedarf durch Leerzeilen ergänzt. Es ist jedoch zu
+beachten, daß sich auf diese Weise unterschiedliche Längen für die
+einzelnen Reihen ergeben können.
+ Beispiel: Das Ergebnis für Satz 1, 3, 4 und 5 sei vier Zeilen
+lang, für Satz 2 aber fünf Zeilen. Bei zweispaltigem Druck wird die
+erste Reihe eine Zeile länger als die folgenden (s. dazu Abb. 12-1).
+
+
+ Satz 1 Satz 2
+ braucht braucht
+ vier Zeilen. ausnahmsweise
+ ---------------- fünf Zeilen.
+ ----------------
+ Satz 3 Satz 4
+ braucht braucht
+ vier Zeilen. vier Zeilen.
+ ---------------- ----------------
+ Satz 5
+ braucht
+ vier Zeilen.
+ ----------------
+
+#center#Abb. 12-1 Seitenaufteilung beim Spaltendruck
+
+
+#on("b")#Beispiel#off("b")# Zum Abschluß noch als Beispiel ein Druckmuster
+für ein
+dreibahniges Etikettenformular. Die Spaltenbreite und die Länge des
+Wiederholungsteils richten sich natürlich nach dem verwendeten
+Formular und müssen im Einzelfall ausprobiert werden.
+
+
+ % VORSPANN
+ \#start (1.0, 0.8)\#
+ % WIEDERHOLUNG 3 40
+
+ &Vorname %Name
+ &Strasse
+
+ &PLZ %Ort
+ \#free (1.693)\#
+
+
+
+12.3 Modi
+
+Gesetzt der Fall, Sie wollen eine Tabelle drucken, deren Einträge
+auf jeden Fall in voller Länge erscheinen sollen, auch wenn sie die
+Spaltenbreite überschreiten. Dies würde bedeuten, daß Tabellenein­
+träge nach rechts geschoben werden, wenn vorhergehende Einträge
+länger sind. Für diesen Fall können also nur Feldmuster variabler
+Position (mit '%') eingesetzt werden. Diese werden jedoch auch nach
+links geschoben, wenn vorher kürzere Inhalte auftreten.
+
+#on("b")#Tabellenmodus#off("b")# Um dieses Linksschieben zu unterdrücken,
+können
+Sie mit folgender Anweisung im Musterteil in den #on("i")#Tabellenmodus#off("i")#
+umschalten:
+
+
+ % MODUS 2
+
+
+Der so eingestellte Modus gilt bis zum Ende des jeweiligen Ab­
+schnitts. Zu Beginn eines Abschnitts ist der Modus 1 (Normalmodus)
+eingestellt.
+
+#on("b")#Beispiel#off("b")# Um diese Anweisung auszuprobieren, sollten Sie
+folgendes Druckmuster auf unsere Beispieldatei anwenden:
+
+
+ % WIEDERHOLUNG
+ % MODUS 2
+ &Vorname %Name
+
+
+In der Ausgabe können Sie sehen, daß der Nachname nicht nach
+links geschoben wird, so daß eine Tabelle entsteht. Ist der Vorname
+jedoch zu lang, wird die Tabelleneinteilung durchbrochen und der
+Nachname nach rechts geschoben, um den Vornamen nicht abschnei­
+den zu müssen:
+
+
+ Herbert Wegner
+ Helga Sandmann
+ Albert Katani
+ Peter Ulmen
+ Karin Regmann
+ Hubert Arken
+ Anna-Maria Simmern
+ Angelika Kaufmann-Drescher
+ Harald Fuhrmann
+ Friedrich Seefeld
+
+
+#on("b")#Zeilenfortsetzung#off("b")# Eine weitere Möglichkeit, überlange
+Feldinhalte
+einzusetzen, besteht darin, daß der Rest des Inhaltes, der nicht
+mehr in den reservierten Raum paßt, in der nächsten Zeile fortge­
+setzt wird. Dies wird im Modus 3 erreicht. Falls ein Feldinhalt ab­
+geschnitten werden müßte, wird in diesem Modus die gleiche Mu­
+sterzeile nochmal mit den restlichen Inhalten gedruckt. Dies wird
+fortgesetzt, bis alle Inhalte abgearbeitet sind.
+ Damit die Fortsetzung sinnvoll ist, wird das letzte Wort ganz in
+die nächste Zeile übernommen, falls es zerschnitten würde (ähnlich
+wie im Editor). Der dadurch freiwerdende Raum in der vorigen Zeile
+wird mit Leerzeichen gefüllt. Ist rechtsbündiges Einsetzen verlangt,
+werden die einzelnen Teile jeweils rechtsbündig in ihrem reservier­
+ten Platz justiert.
+ Dieser Modus ist besonders interessant, wenn Sie längere Kom­
+mentare in eine EUDAS-Datei eintragen, die Sie dann natürlich auch
+wieder drucken wollen. Den Text tragen Sie bereits in mehreren
+Zeilen in die EUDAS-Datei ein. Beachten Sie, daß der Umbruch des
+Textes im Druck nicht mit dem Umbruch des Textes am Bildschirm
+übereinstimmt. Wollen Sie dies verhindern, müssen Sie jeden Absatz
+des Textes in ein eigenes Feld schreiben.
+ Wie zu Anfang des Kapitels bereits angedeutet, kann der Um­
+bruch bei Proportionalschrift nicht korrekt sein, da EUDAS die Zei­
+chenbreiten nicht kennt. Um die nachfolgende Bearbeitung mit
+'lineform' zu ermöglichen, werden bei fortgesetzten Feldern grund­
+sätzlich keine Absatzmarken an die Zeilen geschrieben. Lediglich die
+letzte Fortsetzungszeile erhält eine Absatzmarke.
+ In den Fortsetzungszeilen, werden die Feldmuster, deren Inhalte
+bereits abgearbeitet sind, leer eingesetzt. Die Mustertexte zwischen
+den Feldmustern werden in den Fortsetzungszeilen durch Leerzei­
+chen ersetzt.
+ Die Anzahl der Fortsetzungszeilen kann durch die Anweisung
+
+
+ % MEHR n
+
+
+auf eine bestimmte Zahl 'n' festgelegt werden. Wenn alle Inhalte
+abgearbeitet wurden, aber die Anzahl der Zeilen noch nicht erreicht
+ist, werden entsprechend viele Zeilen mit leeren Inhalten erzeugt.
+ Die Zeilenwiederholung kann auch mit dem Tabellenmodus kom­
+biniert werden. Dies wird im Modus 4 erreicht. Felder variabler
+Position werden auch in diesem Modus nicht nach links geschoben.
+Außerdem werden aber in Fortsetzungszeilen die Mustertexte zwi­
+schen den Feldmustern wiederholt, um z.B. Tabellenbegrenzungen zu
+erzeugen.
+
+#on("b")#Beispiele#off("b")# Zur Verdeutlichung hier noch einige Beispiele.
+Das folgende Druckmuster:
+
+
+ % WIEDERHOLUNG
+ % MODUS 3
+ Kommentar: &Kommentar
+ ----------
+
+
+könnte folgende Ausgabe bewirken:
+
+
+ Kommentar: Dies ist ein längerer Kommentar aus
+ einer EUDAS-Datei, der zum Drucken
+ auf eine Breite von 48 Zeichen
+ umbrochen worden ist. Nur die letzte
+ Zeile hat eine Absatzmarke.
+ ----------
+
+
+Soll die Anzahl der Zeilen immer gleich bleiben, könnte man folgen­
+des Druckmuster verwenden:
+
+
+ % WIEDERHOLUNG
+ % MODUS 3
+ % MEHR 5
+ Kommentar: &Kommentar
+ ----------
+
+
+Mit einem kürzeren Text ergäbe sich folgendes Bild:
+
+
+ Kommentar: Nur ein kurzer Text.
+
+
+
+
+ ----------
+
+
+Für eine Tabelle würde man den Modus 4 benutzen:
+
+
+ % VORSPANN
+ --------------------------------------------------------
+ ! Abk. ! Kommentar !
+ !---------+--------------------------------------------!
+ % WIEDERHOLUNG
+ % MODUS 4
+ ! &abk ! &Kommentar&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !
+ ----------+---------------------------------------------
+
+
+Als Ausgabe könnte folgender Text erscheinen:
+
+
+ --------------------------------------------------------
+ ! Abk. ! Kommentar !
+ !---------+--------------------------------------------!
+ ! MA11 ! Dieser Kurs hat eine Menge an besonderen !
+ ! ! Eigenschaften, die ihn für jüngere !
+ ! ! Teilnehmer geeignet erscheinen lassen. !
+ !---------+--------------------------------------------!
+ ! TD04 ! Stellt keine besonderen Anforderungen. !
+ !---------+--------------------------------------------!
+ ! PM01 ! Seit dem 01.01. eingerichtet und noch !
+ ! ! nicht voll besetzt. !
+ ----------+---------------------------------------------
+
+
+Beachten Sie hier, daß Tabelleneinträge hier nicht wie im Modus 2
+geschoben, sondern auf weitere Zeilen verteilt werden, wenn sie zu
+lang sind. Außerdem werden die Tabellenbegrenzungen mit wieder­
+holt. Das Feldmuster für Kommentar muß jedoch mit fester Länge
+angegeben werden, da sonst die rechte Tabellenbegrenzung bis zum
+Dateilimit geschoben würde.
+
+#on("b")#Zusammenfassung#off("b")# Zum Abschluß dieses Abschnitts eine
+Zusammenfassung aller möglichen Modi:
+
+ Modus Effekt
+
+ 1 Normalmodus.
+ '%'-Feldmuster werden auch nach links geschoben.
+ Keine Zeilenwiederholung.
+
+ 2 Tabellenmodus.
+ '%'-Feldmuster werden nicht nach links geschoben.
+ Keine Zeilenwiederholung.
+
+ 3 Normalmodus mit Zeilenwiederholung.
+ '%'-Feldmuster werden auch nach links geschoben.
+ Zeilenwiederholung ohne Zwischentexte.
+
+ 4 Tabellenmodus mit Zeilenwiederholung.
+ '%'-Feldmuster werden nicht nach links geschoben.
+ Zeilenwiederholung mit Zwischentexten.
+
+
diff --git a/doc/eudas/eudas.hdb.13 b/doc/eudas/eudas.hdb.13
new file mode 100644
index 0000000..435fbfc
--- /dev/null
+++ b/doc/eudas/eudas.hdb.13
@@ -0,0 +1,757 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (133)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+13 Programmierung von Druckmustern
+
+
+
+13.1 Abkürzungen
+
+In den vorigen Kapiteln haben Sie erfahren, daß man Feldmuster
+von ganz bestimmter Länge definieren kann, deren Inhalt in genau
+dieser Länge eingesetzt und bei Bedarf abgeschnitten wird. Bei der
+Angabe dieser Länge spielt jedoch die Länge des Feldnamens eine
+ganz entscheidende Rolle. Das kürzeste Feldmuster fester Länge, das
+Sie definieren können, ist nämlich zwei Zeichen länger als der Feld­
+name (ein Musterzeichen vorher und eins nachher).
+ Hätte das Feld 'PLZ' den Namen 'Postleitzahl' bekommen, so
+müßte ein solches Feldmuster mindestens eine Länge von 14 Zeichen
+haben. Damit Sie mit diesem Feldnamen auch ein Feldmuster der
+Länge 4 bekommen können (Postleitzahlen haben in den seltensten
+Fällen mehr als 4 Stellen), haben Sie die Möglichkeit, den Namen
+'Postleitzahl' für die Verwendung im Druckmuster geeignet abzu­
+kürzen.
+ Abkürzungen haben jedoch noch eine viel weitreichendere
+Bedeutung. Mit ihnen ist es möglich, nicht nur die Feldinhalte einer
+EUDAS-Datei einzusetzen, sondern auch jeden anderen Text, den Sie
+mit einem ELAN-Programm erzeugen können.
+ Die einfachsten zusätzlichen Daten, die Sie verwenden können,
+sind z.B. Datum und Uhrzeit. Für weitergehende Zwecke können Sie
+die Inhalte der EUDAS-Datei auch für Berechnungen verwenden und
+damit so umfangreiche Probleme wie das Schreiben von Rechnungen
+oder statistische Auswertungen unter Verwendung eines Druck­
+musters lösen.
+
+#on("b")#Abkürzungsteil#off("b")# Abkürzungen werden in einem speziellen
+Abkür­
+zungsteil am Ende eines Abschnittes angegeben. Der Abkürzungsteil
+wird durch die Anweisung
+
+
+ % ABKUERZUNGEN
+
+
+eingeleitet. Eine Abkürzungsdefinition hat eine ähnliche Form wie
+ein Refinement (Falls Sie nicht wissen, was das ist, vergessen Sie
+es). Zu Beginn steht der Name der Abkürzung in Form eines Feld­
+musters, beginnend in der ersten Spalte. Danach folgt, durch Leer­
+zeichen getrennt, ein Doppelpunkt in der gleichen Zeile. Daran
+schließt sich ein beliebiger ELAN-Ausdruck an, der sich in freiem
+Format über beliebig viele Zeilen erstrecken kann und mit einem
+Punkt abgeschlossen werden muß. Dieser ELAN-Ausdruck muß ein
+TEXT-Objekt liefern.
+
+#on("b")#Feldinhalt#off("b")# Für die Abfrage von Inhalten aus einer
+EUDAS-Datei ist der Ausdruck
+
+
+ f ("Feldname")
+
+
+vordefiniert. Die Abkürzung des Feldes 'Postleitzahl' würde also als
+Ausschnitt folgendermaßen aussehen:
+
+
+ % ABKUERZUNGEN
+ &p : f ("Postleitzahl") .
+
+
+Mit dieser Definition kann man im Muster so verfahren, als ob das
+Feld 'Postleitzahl' auch 'p' hieße. Diese einfachste Form der Ab­
+kürzung können Sie natürlich variieren, indem Sie für 'p' und
+'Postleitzahl' Ihre eigenen Namen einsetzen.
+
+#on("b")#Übersetzung#off("b")# Beachten Sie, daß das Druckmuster in ein
+ELAN-Pro­
+gramm umgeformt werden muß, da ELAN-Ausdrücke in ihm vorkom­
+men. Das automatisch erzeugte ELAN-Programm wird dann vom
+ELAN-Compiler übersetzt und ausgeführt. Fehler in den ELAN-Aus­
+drücken im Abkürzungsteil können erst vom ELAN-Compiler ent­
+deckt werden. Dieser kennt jedoch das Druckmuster nicht und mel­
+det die Fehler anhand des generierten Programms. Sie müssen in
+einem solchen Fall aufpassen, daß Sie die Fehlerquelle an der rich­
+tigen Stelle im Druckmuster lokalisieren (Hilfestellungen dazu sind
+im Kapitel über die Übersetzung von Druckmustern zu finden).
+
+#on("b")#Beispiel#off("b")# Um die Verwendung von Abkürzungen zu
+demonstrieren, wollen wir folgendes Druckmuster betrachten:
+
+
+ % VORSPANN
+ Adressenliste als Beispiel für Abkürzungen
+ Stand: &Datum
+ ------------------------------------------
+ % ABKUERZUNGEN
+ &Datum : date .
+
+ % WIEDERHOLUNG
+ &&l : &Vorname %Name
+ &Strasse
+ &&p& &Ort
+ ------------------------------------------
+ % ABKUERZUNGEN
+ &l : lfd nr .
+ &p : f ("PLZ") .
+
+ % NACHSPANN
+ &l Adressen gedruckt.
+
+
+Dieses Beispiel enthält eine ganze Reihe interessanter Details. Als
+erstes sollten Sie registrieren, daß auch im Vorspann oder Nach­
+spann Feldmuster verwendet werden können. Soll in diesem Fall ein
+Feldinhalt aus der EUDAS-Datei eingesetzt werden, so werden beim
+Vorspann die Inhalte des ersten und beim Nachspann die Inhalte des
+letzten durch Suchmuster ausgewählten Satzes verwendet. Daher
+kann auch jeder Abschnitt einen Abkürzungsteil haben. Abkürzun­
+gen gelten jedoch für alle Abschnitte (s. '&l'); die Aufteilung in
+mehrere Abkürzungsteile fördert im wesentlichen die Übersichtlich­
+keit.
+ Versuchen Sie, an diesem Beispiel die wichtigsten Unterschiede
+zwischen dem #on("i")#Musterteil#off("i")# und dem #on("i")#Abkürzungsteil#off("i")# eines Abschnittes
+zu verstehen. Das Format des Musterteiles soll in die Ausgabe
+übernommen werden; daher ist dort die Stellung jedes Wortes wich­
+tig. Im Abkürzungsteil definieren Sie Abkürzungen ohne bestimm­
+tes Format - mit der einzigen Ausnahme, daß eine Abkürzungs­
+definition mit einem '&' in der ersten Spalte anfangen und ein
+Leerzeichen vor dem Doppelpunkt haben muß. Wie Sie sehen, dürfen
+dort Leerzeilen zur besseren Lesbarkeit eingefügt werden.
+Sie sollten bei unserem Beispiel folgende Ausgabe erhalten:
+
+
+ Adressenliste als Beispiel für Abkürzungen
+ Stand: 28.12.84
+ ------------------------------------------
+ 1 : Herbert Wegner
+ Krämergasse 12
+ 5000 Köln
+ ------------------------------------------
+ 2 : Helga Sandmann
+ Willicher Weg 109
+ 5300 Bonn 1
+ ------------------------------------------
+ 3 : Albert Katani
+ Lindenstr. 3
+ 5210 Troisdorf
+ ------------------------------------------
+ 4 : Peter Ulmen
+ Mozartstraße 17
+ 5 Köln 60
+ ------------------------------------------
+ 5 : Karin Regmann
+ Grengelweg 44
+ 5000 Köln 90
+ ------------------------------------------
+ 6 : Hubert Arken
+ Talweg 12
+ 5200 Siegburg
+ ------------------------------------------
+ 7 : Anna-Maria Simmern
+ Platanenweg 67
+ 5 Köln 3
+ ------------------------------------------
+ 8 : Angelika Kaufmann-Drescher
+ Hauptstr. 123
+ 53 Bonn 2
+ ------------------------------------------
+ 9 : Harald Fuhrmann
+ Glockengasse 44
+ 5000 Köln 1
+ ------------------------------------------
+ 10 : Friedrich Seefeld
+ Kabelgasse
+ 5000 Köln-Ehrenfeld
+ ------------------------------------------
+ 10 Adressen gedruckt.
+
+
+Nun zu den Abkürzungen im einzelnen. Das Feld 'PLZ' muß abge­
+kürzt werden, damit es rechtsbündig vor den Ort gedruckt werden
+kann. Die Abkürzung 'p' benutzt die im vorigen Kapitel beschriebe­
+ne Form zur Abfrage des Feldinhaltes.
+ 'Datum' wird als Abkürzung für das aktuelle Datum definiert,
+ein häufig benötigter Fall. 'date' ist der ELAN-Ausdruck, der das
+Datum liefert. (Bemerkung für ELAN-Programmierer: der Name der
+Abkürzung gehorcht nicht der ELAN-Syntax für Bezeichner).
+ Eine für Tabellen sinnvolle Funktion wird bei der Definition
+von 'l' verwendet. Der von EUDAS definierte Ausdruck 'lfd nr' lie­
+fert die laufende Nummer des gerade gedruckten Satzes als Text.
+Dabei ist zu beachten, daß die laufende Nummer nicht mit der Satz­
+nummer übereinstimmt, sondern nur während des Druckvorganges
+von 1 an bei jedem gedruckten Satz hochgezählt wird. Diese Funk­
+tion dient dazu, die Sätze in der Liste durchzunumerieren.
+ Die laufende Nummer soll in der Liste rechtsbündig mit Doppel­
+punkt vor dem Namen stehen. Dazu wird das Feldmuster '&&l' be­
+nutzt, eine Form, die eigentlich keinen Sinn hat (die Kombination
+'variable Länge' und 'rechtsbündig' gibt es nicht). Um ein möglichst
+kurzes Feldmuster schreiben zu können, wird in diesem Fall jedoch
+feste Länge unterstellt (auch ohne folgendes '&'). Damit hat das
+kürzeste Feldmuster fester Länge drei Zeichen sowohl im linksbün­
+digen ('&l&') wie auch im rechtsbündigen Fall ('&&l').
+
+#on("b")#Auswertungen#off("b")# Die Verwendung der Abkürzung 'l' im Nachspann
+kann als erstes Beispiel für eine Auswertungsfunktion gelten. Da
+für den Nachspann die Daten des letzten Satzes verwendet werden,
+erscheint hier die laufende Nummer des letzten Satzes und somit die
+Anzahl der Sätze, die gedruckt wurden. Das kann dazu benutzt
+werden, die Sätze zu zählen, die eine bestimmte Suchbedingung
+erfüllen. Folgendes Druckmuster zählt die Anzahl der Frauen oder
+Männer in der Datei:
+
+
+ % NACHSPANN
+ &l Personen mit dem Geschlecht '%<m/w>' vorhanden.
+ % ABKUERZUNGEN
+ &l : lfd nr .
+
+
+Wenn Sie vor dem Drucken jetzt die Suchbedingung 'm' für das Feld
+'m/w' einstellen, werden alle Männer ausgewählt. Das Drucken be­
+steht in diesem Fall nur aus dem Hochzählen der laufenden Nummer
+für jeden Mann. Im Nachspann kann das Ergebnis dann ausgegeben
+werden; zugleich soll der aktuelle Wert des Feldes 'm/w' gedruckt
+werden, damit das Druckmuster auch für das Zählen der Frauen
+verwendet werden kann.
+ Die beiden möglichen Ausgaben würden dann so aussehen:
+
+
+ 6 Personen mit dem Geschlecht 'm' vorhanden.
+
+ 4 Personen mit dem Geschlecht 'w' vorhanden.
+
+
+#on("b")#Zusammenfassung#off("b")# Wir können die Erkenntnisse dieses
+Abschnittes wie folgt zusammenfassen:
+
+* Feldmuster können auch im Vorspann und Nachspann verwendet
+ werden. Im Vorspann werden die Daten des ersten, im Nachspann
+ die Daten des letzten ausgewählten Satzes verwendet.
+
+* Der Musterteil eines Abschnittes definiert ein Format; der Ab­
+ kürzungsteil ist formatfrei.
+
+* 'lfd nr' dient zum Durchnumerieren aller gedruckten Sätze.
+
+* Ein rechtsbündiges Feldmuster hat immer auch feste Länge.
+
+#on("b")#Komplexe Abkürzungen#off("b")# Mit Hilfe von Abkürzungen können wir
+jetzt auch bessere Musterbriefe schreiben. Ein Problem, das bereits
+angesprochen wurde, besteht darin, daß in der Anrede je nach Ge­
+schlecht 'Herr' oder 'Frau' stehen soll. Um dieses Problem zu lösen,
+wird der Inhalt des Feldes 'm/w' benötigt.
+ Da in einer Abkürzung jede ELAN-Anweisung erlaubt ist, die
+einen Text liefert, können natürlich auch #on("i")#IF-Anweisungen#off("i")# verwen­
+det werden. Mit diesen Informationen können wir jetzt die Abkür­
+zung 'Anrede' definieren:
+
+
+ % ABKUERZUNGEN
+ &Anrede :
+ IF f ("m/w") = "w" THEN
+ "Frau"
+ ELSE
+ "Herr"
+ END IF .
+
+
+Für Nicht-Programmierer: Die IF-Anweisung besteht aus einer Ab­
+frage und zwei Alternativen. Die Abfrage steht zwischen dem IF und
+dem THEN und besteht in der Regel aus einer Abfrage, ob zwei
+Dinge gleich oder ungleich (<>), größer oder kleiner sind. Außerdem
+können mehrere Abfragen mit AND (und) und OR (oder) kombiniert
+werden. Näheres dazu im Kapitel 14.
+ Die Alternative hinter dem THEN wird ausgewählt, wenn die
+Abfrage zutrifft. An dieser Stelle sind wieder beliebige Ausdrücke
+erlaubt, die einen Text liefern, einschließlich erneuter IF-Anwei­
+sungen (Schachtelung). Die Alternative zwischen ELSE und END IF
+wird ausgewählt, wenn die Abfrage nicht zutrifft.
+
+#on("b")#Textkonstanten#off("b")# Bisher wurden nur ELAN-Funktionen als
+Textlie­
+feranten betrachtet ('date', 'lfd nr', 'f'). In unserem Fall werden
+aber #on("i")#Textkonstanten#off("i")# in den Alternativen der IF-Anweisung benö­
+tigt. Textkonstanten werden in ELAN in Anführungsstriche einge­
+schlossen, die aber nicht zum Text gehören. Innerhalb einer Text­
+konstanten werden Leerzeichen wie alle anderen Zeichen angesehen
+(erscheinen also auch nachher in der Ausgabe).
+ Bei solchen Abkürzungen, die längere Anweisungen umfassen,
+sollten Sie das freie Format ausnutzen und eine möglichst über­
+sichtliche Darstellung wählen. Wie Sie sehen, muß nur der Doppel­
+punkt noch in der ersten Zeile stehen, der Rest kann sich beliebig
+auf die folgenden Zeilen erstrecken.
+
+#on("b")#Beispiel#off("b")# Ein typischer Einsatz einer IF-Anweisung für die
+Anrede sieht so aus:
+
+
+ % WIEDERHOLUNG
+
+ Sehr geehrte&Anrede %<Name>!
+
+ ...
+ % ABKUERZUNGEN
+ &Anrede :
+ IF f ("m/w") = "m" THEN
+ "r Herr"
+ ELSE
+ " Frau"
+ END IF .
+
+
+Sie sollten jetzt diese Konstruktion in einen Musterbrief einfügen
+können. Probieren Sie ihn dann als Beispiel aus !
+
+#on("b")#Weitere Möglichkeiten#off("b")# Durch Verwendung von Abkürzungen ist
+es
+auch möglich, rechtsbündige Felder mit einer Länge von weniger als
+3 Zeichen zu simulieren. Dies geschieht mit Hilfe der Textoperatio­
+nen von ELAN. Ohne ELAN-Vorkenntnisse können Sie dieses Bei­
+spiel überlesen. In unserer Liste im obigen Beispiel sind die laufen­
+den Nummern höchstens zweistellig und sollten deshalb auch nur
+zwei Stellen belegen. Dies würde folgende Abkürzung ermöglichen:
+
+
+ % ABKUERZUNGEN
+ &l : text (lfd nr als zahl, 2) .
+ lfd nr als zahl : int (lfd nr) .
+
+
+Die Prozedur 'text' wird dazu benutzt, eine Zahl rechtsbündig auf
+zwei Stellen zu formatieren (s. EUMEL-Benutzerhandbuch). Da die
+Abkürzung immer eine Länge von zwei Zeichen hat, kann sie auch in
+einem Feldmuster variabler Länge eingesetzt werden. Die Attribute
+'feste Länge' und 'rechtsbündig' werden in diesem Fall also nicht
+durch das Feldmuster, sondern durch die Abkürzung selbst erzeugt.
+ Um die Prozedur 'text' anwenden zu können, muß die laufende
+Nummer als Zahl (sprich: INT-Objekt) vorliegen. Diese Umwandlung
+wird mit der Prozedur 'int' vorgenommen, die einen Text in eine
+Zahl umwandelt. Obwohl man 'int (lfd nr)' direkt in den Aufruf von
+'text' hätte schreiben können, wird hier als Demonstration dafür ein
+Refinement verwendet.
+ Refinements können in einem Abkürzungsteil neben Abkürzun­
+gen stehen und von allen Abkürzungen benutzt werden. Sie werden
+ähnlich geschrieben wie Abkürzungen, nur ihr Name muß in Klein­
+buchstaben geschrieben werden, dafür muß er nicht in der ersten
+Spalte anfangen und kann Leerzeichen enthalten. Bei komplizierte­
+ren Ausdrücken sollten Refinements zur besseren Lesbarkeit einge­
+setzt werden.
+ Sie können die IF-Anweisung auch mit beliebig vielen ELIF-
+Teilen versehen. Achten Sie jedoch darauf, daß die IF-Anweisung
+#on("i")#immer#off("i")# irgendeinen Wert liefern muß. Sie dürfen also den ELSE-Teil
+nicht weglassen. Statt einer IF-Anweisung können Sie natürlich
+auch eine SELECT-Anweisung verwenden. Es stehen Ihnen im Prin­
+zip alle werteliefernden Anweisungen von ELAN zur Verfügung.
+ Die Programmiersprache ELAN bietet Ihnen noch weit mehr
+Möglichkeiten, als hier beschrieben werden können. So können Sie
+sich eigene Prozeduren definieren und diese dann in Abkürzungen
+verwenden. In Kapitel 14 und 15 finden Sie eine Einführung in die
+wichtigsten Konstrukte, die für EUDAS gebraucht werden.
+
+
+13.2 Bedingte Musterteile
+
+Wenn größere Teile des Druckmusters in Abhängigkeit von bestimm­
+ten Daten unterschiedlich ausfallen sollen, werden die dazu benö­
+tigten Abkürzungen sehr umfangreich. Für solche Fälle kann man
+IF-Anweisungen auch im Musterteil eines Abschnitts verwenden. In
+diesem Fall werden die Alternativen der IF-Anweisung durch
+Musterzeilen dargestellt.
+ Im Musterteil müssen jedoch die Zeilen, die Teil der IF-An­
+weisung sind, von den Musterzeilen unterschieden werden. Deshalb
+werden die Anweisungszeilen durch ein '%'-Zeichen in der ersten
+#on("i")#und#off("i")# zweiten Spalte gekennzeichnet. Das zweite '%'-Zeichen dient
+zur Unterscheidung von Anweisungen an den Druckgenerator, die
+nicht an den ELAN-Compiler übergeben werden sollen.
+ Mit einer IF-Anweisung im Musterteil kann man das Anredepro­
+blem auch folgendermaßen lösen:
+
+
+ % WIEDERHOLUNG
+ %% IF f ("m/w") = "w" THEN
+ Sehr geehrte Frau &<Name>!
+ %% ELSE
+ Sehr geehrter Herr &<Name>!
+ %% END IF;
+
+
+Beachten Sie den Unterschied, daß die IF-Anweisung hier mit einem
+Semikolon abgeschlossen werden muß - in Abkürzungen mußte ja ein
+Punkt danach folgen. Außerdem darf hier der ELSE-Teil (die zweite
+Alternative) fehlen, während in einer Abkürzung in jeder Alternati­
+ve etwas stehen muß (zumindest der leere Text "").
+ Falls sich der IF-THEN-Teil über mehr als eine Zeile erstrek­
+ken soll, muß jede dieser Zeilen mit '%%' beginnen, da die Folgezei­
+len sonst als Musterzeilen gedruckt würden. Benutzen Sie in einem
+solchen Fall jedoch besser ein Refinement, das Sie im Abkürzungs­
+teil definieren müssen.
+ Sie können im Musterteil auch andere ELAN-Anweisungen
+verwenden. Der Unterschied zu Abkürzungen liegt darin, daß die
+Musterzeilen nicht als Werte angesehen werden, die die Anweisung
+liefern muß, sondern als Anweisungen, die dort aufgeführten Mu­
+sterzeilen einzusetzen und zu drucken. Daher kann im Musterteil
+auch eine FOR-Schleife sinnvoll sein, wenn in Abhängigkeit eines
+Wertes eine bestimmte Anzahl von Zeilen gedruckt werden soll.
+
+
+13.3 Übersetzung
+
+Wenn Sie bis jetzt auch als ELAN-Programmierer immer noch nicht
+ganz durchblicken, wie Sie welche ELAN-Anweisungen verwenden
+können, dann ist das noch kein Anlaß zur Sorge. Es ist kaum mög­
+lich, die genauen Auswirkungen beliebiger Anweisungen zu be­
+schreiben, ohne den Übersetzungsprozeß zu schildern, der diese
+Anweisungen zu einem ELAN-Programm zusammenbindet. Daher soll
+diese Übersetzung jetzt genauer erklärt werden.
+
+#on("b")#Übersetzungsmechanismus#off("b")# Alle Zeilen eines Abkürzungsteils
+wer­
+den direkt in das Programm übernommen, wobei der Name einer Ab­
+kürzung durch einen beliebig gewählten Refinementnamen ersetzt
+wird ('abk' + eine laufende Nummer). Alle Abkürzungen und Re­
+finements werden als globale Refinements definiert, also außerhalb
+von Prozeduren. Dadurch wird erreicht, daß sie an jeder Stelle
+verwendet werden können.
+ Damit eine Abkürzung richtig als Refinement übersetzt wird,
+muß sie ein TEXT-Objekt als Wert liefern. Die anderen Refinements
+sind beliebig, da Sie nur in selbstdefinierten Anweisungen verwen­
+det werden. Die Refinements der Abkürzungen werden in einer Zu­
+weisung an eine TEXT-Variable verwendet, damit der Druckgenera­
+tor auf den entsprechenden Wert zugreifen kann.
+ Jeder Abschnitt wird dagegen als eine Prozedur übersetzt. Jede
+Folge von Musterzeilen wird in eine Anweisung übersetzt, diese
+Musterzeilen einzusetzen und zu drucken. Jede '%%'-Anweisung
+wird einfach unverändert dazwischen geschrieben. Die Vorspann-
+Prozedur wird einmal zu Anfang aufgerufen, die Prozedur für den
+Wiederholungsteil einmal für jeden ausgewählten Satz und die Nach­
+spann-Prozedur einmal am Schluß.
+ Bei Fehlern im ELAN-Teil zeigt der Compiler das erzeugte Pro­
+gramm zusammen mit seinen Fehlermeldungen im Paralleleditor. Sie
+müssen nun die Fehlermeldung lokalisieren und anhand der eben
+gegebenen Hinweise in das ursprüngliche Druckmuster zurücküber­
+setzen, damit Sie dort den Fehler korrigieren können.
+
+#on("b")#Beispiel#off("b")# Nun müßten Sie genug Informationen haben, um
+beliebige
+ELAN-Anweisungen in das Druckmuster einfügen zu können. Als
+Beispiel wollen wir versuchen, alle Männer und Frauen in der
+Adressendatei zu zählen, ohne ein Suchmuster einstellen zu müssen
+und ohne den Druckvorgang zweimal ablaufen zu lassen (wie dies
+bei dem obigen Beispiel der Fall war). Ein erster Versuch könnte so
+aussehen:
+
+
+ % VORSPANN
+ %% INT VAR maenner, frauen;
+ %% maenner := 0;
+ %% frauen := 0;
+ % WIEDERHOLUNG
+ %% IF f ("m/w") = "m" THEN
+ %% maenner INCR 1
+ %% ELSE
+ %% frauen INCR 1
+ %% END IF
+ % NACHSPANN
+ &maenner Männer und %frauen Frauen vorhanden.
+
+
+Aber Vorsicht! In diesem Beispiel sind mehrere Fehler eingebaut.
+Finden Sie sie!
+
+#on("b")#Fehler im Beispiel#off("b")# Der erste Fehler befindet sich im
+Nachspann.
+Hier wird versucht, die Namen der beiden Variablen 'maenner' und
+'frauen' direkt in einem Feldmuster zu verwenden. Diese beiden
+Namen sind dem Druckgenerator nicht bekannt, sondern nur dem
+ELAN-Compiler. Um die Werte der beiden Variablen einsetzen zu
+können, müssen Sie also zwei geeignete Abkürzungen definieren.
+ Der zweite Fehler ist schwieriger zu finden. Wie oben gesagt,
+wird jeder Abschnitt in eine Prozedur übersetzt. Die in einem Ab­
+schnitt definierten Variablen können also nur in diesem Abschnitt
+verwendet werden (sie sind lokal) und auch nicht im Abkürzungs­
+teil, da dieser wieder global vereinbart wird. Die beiden im Vor­
+spann definierten Variablen stehen also im Wiederholungsteil und im
+Nachspann nicht zur Verfügung.
+
+#on("b")#Anweisungen im Initialisierungsteil#off("b")# Für diesen Fall gibt
+es die
+Möglichkeit, ELAN-Anweisungen vor allen Abschnitten im Initiali­
+sierungsteil zu definieren. Diese Anweisungen sind dann ebenfalls
+global. Das richtige Druckmuster finden Sie auf der nächsten Seite.
+ Natürlich könnten Sie die Initialisierung der beiden Variablen
+auch noch aus dem Vorspann herausnehmen. Denken Sie daran, daß
+Sie aus INT-Variablen erst einen Text machen müssen, ehe Sie sie
+in eine Musterzeile einsetzen können. Beachten Sie Schreibweise der
+Variablen: in ELAN können die Umlaute nicht in Bezeichnern ver­
+wendet werden, daher muß die Variable mit 'ae' geschrieben wer­
+den. Im Mustertext und in Abkürzungs- und Feldnamen können die
+Umlaute jedoch frei verwendet werden.
+
+
+ %% INT VAR maenner, frauen;
+ % VORSPANN
+ %% maenner := 0;
+ %% frauen := 0;
+ % WIEDERHOLUNG
+ %% IF f ("m/w") = "m" THEN
+ %% maenner INCR 1
+ %% ELSE
+ %% frauen INCR 1
+ %% END IF
+ % NACHSPANN
+ &m Männer und %f Frauen vorhanden .
+ % ABKUERZUNGEN
+ &m : text (maenner) .
+ &f : text (frauen) .
+
+
+
+13.4 Gruppen
+
+Der Druckgenerator bietet die Möglichkeit, Vorspann und Nachspann
+nicht nur am Anfang und am Ende, sondern auch an bestimmten
+Stellen zwischen Sätzen zu drucken. Diese Stellen sind dadurch
+bestimmt, daß ein bestimmtes Merkmal (z.B. ein Feldinhalt) seinen
+Wert ändert. Ein solches Merkmal wird im Druckmuster #on("i")#Gruppe#off("i")# ge­
+nannt.
+ Ein Beispiel für die Verwendung von Gruppen ist eine Schüler­
+datei, die nach Klassen geordnet ist. Definiert man das Feld 'Klas­
+se' als Gruppe, so wird jeweils am Ende einer Klasse ein Nachspann
+und am Beginn einer Klasse ein Vorspann gedruckt.
+ Dieses Verfahren ist eine Erweiterung der bisher beschriebenen
+Methode, indem eine Datei quasi in mehrere Dateien untergliedert
+wird, die jedoch in einem Arbeitsgang gedruckt werden können.
+Voraussetzung dafür ist jedoch, daß die Datei nach dem Gruppen­
+merkmal geordnet ist - der Druckgenerator sammelt nicht erst alle
+Schüler einer Klasse aus der Datei, sondern erwartet sie hinter­
+einander.
+
+#on("b")#Gruppendefinition#off("b")# Eine Gruppe wird im Initialisierungsteil
+des
+Druckmusters (also vor allen Abschnitten) definiert. Notwendige
+Daten sind eine Nummer zur Identifizierung und das Merkmal. Die
+Nummer sollte am sinnvollsten von 1 an vergeben werden; die mög­
+lichen Werte sind nach oben hin beschränkt. Das Merkmal ist ein
+beliebiger ELAN-Ausdruck, der einen Text liefert. Sinnvollerweise
+wird er den Inhalt eines Feldes enthalten.
+ Gruppendefinitionen müssen nach allen ELAN-Anweisungen im
+Initialisierungsteil folgen, und zwar, weil die Gruppendefinitionen
+alle in einer Prozedur zusammengefaßt werden, die bei jedem neuen
+Satz auf Gruppenwechsel testet.
+ Unter der Annahme, daß die oben erwähnte Schülerdatei ein
+Feld 'Klasse' besitzt, würde die Gruppe wie folgt definiert:
+
+
+ % GRUPPE 1 f ("Klasse")
+
+
+Nach der Anweisung 'GRUPPE' folgt die Gruppennummer und dann
+ein ELAN-Ausdruck. Die ganze Definition muß in einer Zeile stehen;
+reicht der Platz nicht aus, müssen Sie in einem Abkürzungsteil ein
+Refinement definieren.
+
+#on("b")#Klassenliste#off("b")# Das komplette Druckmuster für die
+Klassenliste könn­
+te folgendes Aussehen haben, wenn außer 'Klasse' auch noch die
+Felder 'Name' und 'Vorname' vorhanden sind:
+
+
+ % GRUPPE 1 f ("Klasse")
+ % VORSPANN
+ Klassenliste für Klasse &Klasse
+ ----------------------------
+ % WIEDERHOLUNG
+ &Vorname %Name
+ % NACHSPANN
+ \#page\#
+
+
+Wenn eine Gruppe definiert ist, werden im Nachspann immer die
+Feldinhalte des letzten Satzes vor dem Gruppenwechsel gedruckt, im
+Vorspann die Inhalte des ersten Satzes nach dem Wechsel. Daher
+kann hier im Vorspann die Klasse gedruckt werden, da sie sich erst
+ändert, wenn schon wieder der nächste Vorspann gedruckt wird.
+
+#on("b")#Mehrere Gruppen#off("b")# Wie die Identifikation über eine
+Gruppennummer
+vermuten läßt, können Sie mehrere Gruppen definieren. Nachspann
+und Vorspann werden jeweils gedruckt, wenn sich das Merkmal ir­
+gendeiner Gruppe ändert. Ob eine bestimmte Gruppe gewechselt hat,
+kann mit der Abfrage
+
+
+ BOOL PROC gruppenwechsel (INT CONST gruppennummer)
+
+
+in einer IF-Anweisung ermittelt werden. Vor dem ersten und nach
+dem letzten Satz wechseln automatisch alle Gruppen.
+ Die ganze Datei bildet eine Quasi-Gruppe mit der Nummer 0.
+Sie ist immer definiert und wechselt nur vor dem ersten und nach
+dem letzten Satz. Sie ist es, die bewirkt, daß Vorspann und Nach­
+spann in ihrer normalen Weise gedruckt werden.
+
+#on("b")#Anwendungsbeispiel#off("b")# Um einige der Möglichkeiten zu
+illustrieren,
+die durch Gruppen geschaffen werden, wollen wir als Beispiel eine
+Anwendung betrachten, die neue Wege für die Benutzung von EUDAS
+aufzeigt.
+ Aus einer Datei, in der für jede Bestellung der Kunde, der Ar­
+tikel, die bestellte Menge und der Einzelpreis des Artikels einge­
+tragen werden, sollen anschließend Rechnungen gedruckt werden.
+Die Datei soll folgende Felder haben:
+
+
+ 'Kundennummer'
+ 'Artikelnummer'
+ 'Einzelpreis'
+ 'Menge'
+
+
+Als Voraussetzung müssen die Bestellungen in der Datei jeweils
+nach Kunden geordnet vorliegen. Die Kundennummer wird als Gruppe
+definiert, so daß die Bestellungen eines Kunden zu einer Rechnung
+zusammengefaßt werden können. Das Druckmuster rechnet dann die
+einzelnen Preise zusammen und gibt eine Endsumme aus.
+ Damit in der Rechnung Name und Adresse des Kunden auftau­
+chen können, wird zu der Bestellungsdatei die Kundendatei gekop­
+pelt, die folgende Felder haben soll:
+
+
+ 'Kundennummer'
+ 'Name'
+ 'Vorname'
+ 'Strasse'
+ 'PLZ'
+ 'Ort'
+
+
+Stellen Sie sich zum Ausprobieren des folgenden Druckmusters ge­
+gebenenfalls eigene Daten zusammen. Hier nun das Druckmuster:
+
+
+ %% REAL VAR gesamtpreis, summe;
+ % GRUPPE 1 f ("Kundennummer")
+ % VORSPANN
+ %% summe := 0.0;
+ Fa. Kraus & Sohn
+ Schotterstr. 10
+
+ 5000 Köln 1
+ &Vorname %Name
+ &Strasse
+
+ &PLZ &Ort &Datum
+
+ R E C H N U N G
+ ===============
+
+ Menge Artikelnr. Einzelpreis Gesamtpreis
+ ------------------------------------------------
+ % ABKUERZUNGEN
+ &Datum : date .
+
+ % WIEDERHOLUNG
+ %% gesamtpreis := round
+ %% (wert ("Einzelpreis") * wert ("Menge"), 2);
+ %% summe INCR gesamtpreis;
+ &Menge &Artikelnummer &&&&epr&& &&&&gpr&&
+ % ABKUERZUNGEN
+ &epr : f ("Einzelpreis") .
+ &gpr : zahltext (gesamtpreis, 2) .
+
+ % NACHSPANN
+ ------------------------------------------------
+ Summe: &&&&sum&&
+ + 14% MWSt. &&&Mwst&&
+ =========
+ Endbetrag &&&&end&&
+ \#page\#
+ % ABKUERZUNGEN
+ &sum : zahltext (summe, 2) .
+ &Mwst : zahltext (mwst, 2) .
+ &end : zahltext (summe + mwst, 2) .
+ mwst : round (summe * 0.14, 2) .
+
+
+Im Initialisierungsteil dieses Druckmusters wird die Kundennummer
+als Gruppe definiert. Dies hat zur Folge, daß für jeden neuen Kun­
+den eine neue Rechnung begonnen wird, nachdem vorher im Nach­
+spann die Rechnungssumme des vorherigen Kunden berechnet und
+ausgedruckt wurde. Vor dieser Gruppendefinition sind 'gesamtpreis'
+und 'summe' definiert, die später als globale Variablen zur Verfü­
+gung stehen sollen. Diese Zeile darf nicht nach der Gruppendefini­
+tion stehen.
+ Im Vorspann wird der Kopf der Rechnung angegeben. Dieser
+enthält neben den Daten des Kunden (aus der gekoppelten Kun­
+dendatei) noch das Datum. Die Kundennummer wird nur zum Kop­
+peln und als Gruppenmerkmal benötigt, erscheint also nicht auf der
+Rechnung.
+ Es fällt auf, daß im Firmennamen ein '&'-Zeichen auftaucht,
+das doch für die Markierung von Feldmustern reserviert ist. Die
+beiden Musterzeichen können jedoch im normalen Text auftauchen,
+wenn ihnen direkt ein Leerzeichen folgt. In diesem Fall werden Sie
+nicht als Beginn eines Feldmusters interpretiert, sondern unverän­
+dert gedruckt. Der gleiche Fall taucht noch mit '%' im Nachspann
+auf.
+ Im Wiederholungsteil wird zunächst aus dem Einzelpreis und der
+Menge des jeweiligen Artikels der Gesamtpreis für diesen Artikel
+berechnet. Für die Abfrage der Feldinhalte wird die Funktion 'wert'
+verwendet, die wie 'f' funktioniert, jedoch gleich einen REAL-Wert
+liefert.
+ Zu beachten ist, daß 'wert' wie beim Sortieren von Zahl alle
+Sonderzeichen ignoriert. Weiterhin müssen die Zahlen mit dem ein­
+gestellten Dezimalkomma geschrieben werden (also normalerweise
+mit Komma), damit ihr Wert richtig erkannt wird. Anderenfalls soll­
+ten Sie den Dezimalpunkt einstellen (s. 11.1).
+ Damit kaufmännisch richtig gerechnet wird, wird der Gesamt­
+preis auf 2 Nachkommastellen gerundet und erst dann aufsummiert.
+Würde der Gesamtpreis nur zum Einsetzen gerundet, könnten bei der
+anschließenden Addition der nicht gerundeten Werte eine falsche
+Gesamtsumme entstehen.
+ Erst nach diesen Berechnungen kann die Musterzeile folgen, in
+die die Werte dann eingesetzt werden. Um eine Ausgabe mit zwei
+Nachkommastellen zu erzeugen, wird die von EUDAS definierte
+Funktion 'zahltext' benutzt. Diese erzeugt aus einem REAL-Wert
+einen Text mit der angegebenen Anzahl von Kommastellen und setzt
+das korrekte Dezimalkomma ein. Das Ergebnis dieser Funktion wird
+dann rechtsbündig eingesetzt.
+ Im Nachspann wird dann der summierte Wert mit aufgeschlage­
+ner Mehrwertsteuer gedruckt. Die Mehrwertsteuer muß ebenfalls auf
+zwei Nachkommastellen gerundet werden.
+
+#on("b")#Erweiterung#off("b")# Zur Erweiterung könnten Sie die Bestelldatei
+noch mit
+einer Artikeldatei koppeln, die etwa folgende Struktur haben würde:
+
+
+ 'Artikelnummer'
+ 'Bezeichnung'
+ 'Einzelpreis'
+
+
+In diesem Fall könnten Sie noch jeweils die Artikelbezeichnung in
+eine Rechnungszeile drucken. Außerdem würde der Preis zentral
+gespeichert. Eine entsprechende Änderung des Druckmusters sollte
+Ihnen keine Schwierigkeiten bereiten.
+
+
+
diff --git a/doc/eudas/eudas.hdb.14 b/doc/eudas/eudas.hdb.14
new file mode 100644
index 0000000..1aa3c87
--- /dev/null
+++ b/doc/eudas/eudas.hdb.14
@@ -0,0 +1,724 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (151)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+14 Ausdrücke in ELAN
+
+
+
+14.1 Was sind Ausdrücke ?
+
+In diesem Kapitel wollen wir uns mit ELAN-Ausdrücken beschäfti­
+gen, wie sie für EUDAS gebraucht werden. Natürlich kann dies keine
+ernsthafte Einführung für ELAN-Programmierer sein - mit solchen
+Ambitionen halten Sie sich am besten an die entsprechende ELAN-
+Literatur.
+ Dieser Text richtet sich eher an den Benutzer, der kaum Erfah­
+rung mit ELAN hat, aber die Möglichkeiten von EUDAS optimal nut­
+zen will. Viele fortgeschrittene Fähigkeiten von EUDAS laufen ja
+über ELAN-Programme.
+
+#on("b")#Vorkommen#off("b")# Sie haben ELAN-Ausdrücke bereits an
+verschiedenen
+Stellen eingesetzt, wenn Sie sich mit den vorhergehenden Kapiteln
+befaßt haben. ELAN-Ausdrücke werden in nahezu allen Verarbei­
+tungsfunktionen benötigt.
+ Im Druckmuster dienen sie dazu, den Inhalt eines Feldmusters
+festzulegen. Die Definition einer Abkürzung besteht immer aus dem
+Namen der Abkürzung und einem Ausdruck. Ebenso wird in einer
+Gruppendefinition ein Ausdruck angegeben.
+ Beim Kopiermuster und beim Änderungsmuster besteht jeweils
+die rechte Seite einer Anweisung aus einem Ausdruck. Weiterhin
+werden Ausdrücke auch in anderen ELAN-Konstruktionen benötigt,
+wie zum Beispiel direkt am Anfang einer IF-Anweisung.
+
+#on("b")#Bedeutung#off("b")# Ein Ausdruck steht allgemein für einen Wert. Im
+ein­
+fachsten Fall kann dies eine Konstante sein, der Wert des Aus­
+drucks ändert sich also nicht. Anderenfalls spricht man von einem
+zusammengesetzten Ausdruck. Dessen Wert ergibt sich dann durch
+die Ausführung der im Ausdruck angegebenen Operationen. Dieser
+Wert kann je nach dem aktuellen Zustand des Systems verschieden
+sein, da er jedes Mal neu berechnet wird, wenn er gebraucht wird.
+ Ein Beispiel für einen zusammengesetzten Ausdruck ist 2+2
+Dieser Ausdruck steht für den Wert 4.
+ Der Wert eines Ausdrucks ist das, was uns eigentlich interes­
+siert. Beim Druckvorgang wird dieser Wert dann gedruckt, beim
+Kopieren und Verändern in ein Feld eingetragen.
+
+#on("b")#Zusammensetzung#off("b")# Ausdrücke lassen sich aus verschiedenen
+Ele­
+menten zusammensetzen. Grundlage bilden die Konstanten. Konstan­
+ten können durch #on("i")#Operatoren#off("i")# miteinander verknüpft werden. So ist
+in dem Ausdruck 2+3 das '+' ein Operator, der die Konstanten 2
+und 3 verknüpft. Das Ergebnis der Verknüpfung hängt natürlich vom
+jeweiligen Operator ab.
+ Wie Sie schon in der Schule gelernt haben ("Punktrechnung vor
+Strichrechnung"), muß man die Reihenfolge der Operatoren festlegen,
+wenn mehrere Operatoren im Spiel sind. Ähnliche Regeln gibt es für
+alle Operatoren in ELAN.
+ Wenn eine andere Reihenfolge der Operatoren erwünscht ist,
+können Sie diese durch Einsatz von Klammern verändern. Auch dies
+dürfte Ihnen aus der Schule noch in Erinnerung sein. Der Unter­
+schied in ELAN ist lediglich, daß es dort einige zusätzliche Opera­
+toren gibt, die Ihnen nicht aus der Mathematik vertraut sind.
+ Ein weiteres Konstruktionselement von Ausdrücken sind #on("i")#Funk­
+tionen#off("i")#. Auch diese kennen Sie aus der Schule. Lediglich die
+Schreibweise muß für den "dummen" Computer etwas ausführlicher
+gehalten werden (Beispiel: sin (3.14 * x)).
+ Die Argumente der Funktion hinter dem Funktionsnamen müssen
+auf jeden Fall in Klammern stehen. In der Terminologie der Pro­
+grammiersprachen spricht man von #on("i")#Parametern#off("i")#. Parameter können
+wieder komplexe Ausdrücke sein. Bei Funktionen mit mehreren
+Parametern werden diese durch Komma getrennt:
+
+
+ min (2.5 * x, x + 1.25)
+
+
+
+14.2 Datentypen
+
+Bevor wir beginnen, konkrete Ausdrücke zu behandeln, müssen wir
+erst das Konzept der #on("i")#Datentypen#off("i")# einführen. Grundidee dabei ist,
+daß es verschiedene Klassen von Werten gibt, die nicht einfach
+untereinander gemischt werden können.
+ So gibt es in ELAN einen grundlegenden Unterschied zwischen
+#on("i")#Zahlen#off("i")# und #on("i")#Texten#off("i")#. Texte bestehen aus einer beliebigen Aneinan­
+derreihung von Zeichen, die im Normalfall nur für den betrachten­
+den Menschen eine Bedeutung haben. Mit Zahlen kann man dagegen
+Berechnungen anstellen.
+ Der tiefere Grund für die Trennung in verschiedene Typen ist
+also, daß für jeden Typ gewisse Operationen definiert snd, die nur
+für diesen Typ sinnvoll sind. So ist zum Beispiel die Addition der
+beiden Texte "abc" und "-/-" völlig sinnlos.
+ Aber nicht nur die Operationen sind verschieden, sondern auch
+die interne Darstellung im Rechner. So werden der Text "1234" und
+die Zahl 1234 völlig anders gespeichert, obwohl man ihnen die glei­
+che Bedeutung beimessen könnte.
+
+#on("b")#Grundtypen#off("b")# In ELAN gibt es vier verschiedene Grundtypen,
+die für
+uns wichtig sind. Sie können sich in ELAN auch eigene Typen
+schaffen, dies geht jedoch weit über unsere Bedürfnisse hinaus.
+ Der in EUDAS am meisten verwendete Typ heißt #on("i")#TEXT#off("i")#. TEXT-
+Objekte bestehen aus einer Folge von 0 bis 32000 Zeichen. Die Zei­
+chen entstammen einem Satz von 256 verschiedenen Symbolen, die
+jeweils eine andere Darstellung haben. Einige der Zeichen lassen
+sich überhaupt nicht darstellen, sondern führen bestimmte Funktio­
+nen aus (zum Beispiel Bildschirm löschen).
+ Sämtliche Feldinhalte einer EUDAS-Datei sind TEXTe, ebenso
+die Zeilen von Textdateien. Auch Datei- und Feldnamen sind
+TEXTe. Von daher besteht eigentlich kein Grund, warum Sie sich
+außer zur Programmierung noch mit anderen Datentypen beschäfti­
+gen sollten.
+ Neben den Texten gibt es noch die Zahlen. Diese sind in ihrer
+internen Darstellung so beschaffen, daß ein effizientes Rechnen mit
+ihnen möglich ist. Andererseits können sie nicht mehr beliebige
+Informationen darstellen, sondern haben eine sehr eingeschränkte
+Bedeutung.
+ Um unterschiedichen Bedürfnissen gerecht zu werden, gibt es in
+ELAN zwei verschiedene Zahltypen. Der Typ #on("i")#INT#off("i")# umfaßt nur ganze
+Zahlen ohne Kommastellen. Damit die Zahl möglichst wenig Spei­
+cherplatz belegt, ist der Wertebereich bei den meisten Rechnern auf
+-32768..32767 beschränkt (die krummen Zahlen ergeben sich wegen
+der Binärarithmetik des Rechners). Dieser Typ eignet sich am besten
+zum Abzählen und zum Auswählen aus einer festen Anzahl von
+Objekten (zum Beispiel Feld 1 bis Feld 255).
+ Zum eigentlichen Rechnen gibt es den Typ #on("i")#REAL#off("i")#. Dieser umfaßt
+auch Kommazahlen. Genauigkeit, Wertebereich und Darstellung sind
+nahezu identisch mit den Möglichkeiten eines Taschenrechners. der
+Typ REAL wird immer dann verwendet, wenn mit realen Größen
+(Geldbeträge, physikalische Werte) gerechnet werden muß.
+ Zuletzt gibt es noch den Typ #on("i")#BOOL#off("i")#. Er hat nur zwei mögliche
+Werte, nämlich TRUE (wahr) und FALSE (falsch). Er wird dazu benö­
+tigt, Ausdrücke zu schreiben, die den Zweig einer IF-Anweisung
+bestimmen.
+
+#on("b")#Denotation#off("b")# ELAN verfügt über einen strengen Typenschutz;
+das
+heißt, Objekte verschiedenen Typs dürfen nicht gemischt werden.
+Daher muß schon bei der Schreibweise der Konstanten festgelegt
+sein, welchen Typ die Konstante hat.
+ Bei Texten geschieht dies durch den Einschluß in Anführungs­
+striche. Die Anführungsstriche sorgen gleichzeitig auch für eine
+Abgrenzung der Zeichen des Textes und des umgebenden Programms.
+Sie kennen diese Schreibweise bereits von vielen Stellen in EUDAS.
+ Ebenfalls keine Probleme bereitet der Typ BOOL, da die
+Schreibweise der beiden möglichen Werte TRUE und FALSE eindeutig
+ist.
+ Problematisch wird es bei den Zahlen. Da die ganzen Zahlen in
+den rationalen Zahlen enthalten sind, muß für die ganzen Zahlen
+durch die Schreibweise festgelegt werden, zu welchem der beiden
+Typen sie gehören. Man hat festgelegt, daß REAL-Zahlen immer mit
+Komma geschrieben werden müssen, während Zahlen ohne Komma den
+Typ INT haben (das Komma wird in ELAN bei den REAL-Zahlen in
+internationaler Schreibweise als Punkt notiert).
+ So ist 4 eine INT-Zahl, während 4.0 den Typ REAL besitzt.
+Denken Sie in Zukunft immer daran, welcher Zahltyp jeweils ver­
+langt wird und richten Sie die Schreibweise danach.
+
+#on("b")#Unterschied zu Feldtypen#off("b")# Verwechseln Sie die hier
+vorgestellten
+Datentypen nicht mit den Feldtypen einer EUDAS-Datei. Die Feld­
+typen beziehen sich immer auf den gleichen Datentyp, nämlich
+TEXT. Die Feldtypen bestimmen lediglich die spezielle Behandlung
+des Feldes beim Suchen und Sortieren, während Datentypen tat­
+sächlich Unterschiede in der Speicherung und den anwendbaren
+Operationen bedeuten.
+ Daher können Sie Feldtypen auch nach Bedarf ändern, während
+der Datentyp eines Objekts ein für alle Mal feststeht. Merken Sie
+sich, daß Feldinhalte in EUDAS immer den Typ TEXT haben.
+
+#on("b")#Umwandlungen#off("b")# Obwohl verschiedene Datentypen nicht
+miteinander
+gemischt werden dürfen, können sie mit speziellen Funktionen in­
+einander umgewandelt werden. So ist zum Beispiel die Addition von
+1 und 1.5 verboten, aber der folgende Ausdruck
+
+
+ real (1) + 1.5
+
+
+liefert den Wert 2.5 mit dem Typ REAL. Umgekehrt geht die Um­
+wandlung mit der Funktion 'int', dabei werden jedoch die Nachkom­
+mastellen abgeschnitten. Weitere Hinweise dazu erhalten Sie im
+Abschnitt 14.4.
+ Wichtiger jedoch ist die Umwandlung von Zahlen in TEXT-Ob­
+jekte. Was Sie auf Ihrem Bildschirm oder Ausdruck sehen, sind ja
+immer nur Zeichenfolgen und damit Texte. Zahlen (INT oder REAL)
+in ihrer internen Darstellung können Sie prinzipiell nicht sehen. Sie
+müssen zur Darstellung immer in Texte umgewandelt werden.
+ Auch beim Rechnen mit Werten aus EUDAS-Dateien müssen
+mehrere Umwandlungen stattfinden. Der Feldinhalt, der ja ein TEXT
+ist, muß zunächst in eine Zahl umgewandelt werden. Dann wird mit
+dieser Zahl gerechnet. Wenn das Ergebnis wieder in ein Feld einge­
+tragen oder gedruckt werden soll, muß eine Rückumwandlung in
+einen Text vorgenommen werden.
+ Die zum Umwandeln benötigten Funktionen werden ebenfalls im
+Abschnitt 14.4 besprochen.
+
+#on("b")#Funktionsbeschreibung#off("b")# In den zwei folgenden Abschnitten
+sollen
+die wichtigsten Funktionen und Operatoren anhand von Beispielen
+beschrieben werden. Da jede Funktion nur auf bestimmte Datentypen
+angewendet werden kann, gibt es eine Notation, die genau die Form
+eines Funktionsaufrufs festlegt.
+
+
+ INT PROC min (INT CONST a, b)
+
+
+Die obige Schreibweise hat folgende Bedeutung: Spezifiziert wird die
+Funktion 'min', die als Ergebnis einen INT-Wert liefert (das INT
+ganz links). Die Bezeichnung PROC gibt an, daß es sich um eine
+Funktion handelt. In Klammern ist dann angegeben, welche Parame­
+ter verwendet werden müssen. Die Funktion hat zwei Parameter,
+beide vom Typ INT. Die Bezeichnung CONST gibt an, daß auch Kon­
+stanten verwendet werden dürfen (Normalfall).
+ Zu beachten ist, daß bei jedem Aufruf beide Parameter vorhan­
+den und vom Typ INT sein müssen. Anderenfalls gibt es eine Feh­
+lermeldung.
+ Die gleiche Schreibweise wird auch zur Spezifikation von Ope­
+ratoren verwendet:
+
+
+ INT OP + (INT CONST a, b)
+
+
+Jedoch dürfen Operatoren nicht mit Parametern in Klammern ge­
+schrieben werden, sondern der Operator wird zwischen die Parameter
+geschrieben.
+ Eine Besonderheit von ELAN ist es, daß es verschiedene Opera­
+toren und Funktionen mit gleichem Namen geben kann. Die Funktio­
+nen werden nur unterschieden nach dem Typ ihrer Parameter. So
+gibt es nicht nur den oben genannten Operator '+', sondern auch
+den folgenden:
+
+
+ REAL OP + (REAL CONST a, b)
+
+
+Obwohl im Aussehen gleich, handelt es sich doch um verschiedene
+Operatoren mit möglicherweise völlig verschiedener Wirkung. Dies
+sieht man an diesem Beispiel:
+
+
+ TEXT OP + (TEXT CONST a, b)
+
+
+Dieser Operator führt nun keine Addition aus, sondern eine #on("i")#Verket­
+tung#off("i")# zweier Texte. Je nach Typ der Parameter wird der entspre­
+chende Operator ausgesucht.
+
+
+14.3 TEXT-Funktionen
+
+In diesem Abschnitt wollen wir die wichtigsten Funktionen und
+Operatoren zur Behandlung von Texten beschreiben. Wie Sie noch
+sehen werden, spielt dabei aber auch der Typ INT eine gewisse
+Rolle.
+
+#on("b")#EUDAS-Abfragen#off("b")# Die wichtigste Funktion zur Abfrage von
+Inhal­
+ten der aktuellen Datei sollten Sie bereits kennen:
+
+
+ TEXT PROC f (TEXT CONST feldname)
+
+
+Neu ist eigentlich nur die Schreibweise der Spezifikation. Sie sollten
+aber in der Lage sein, daraus einen konkreten Ausdruck zu kon­
+struieren. Bisher haben wir immer die Schreibweise
+
+
+ f ("Feldname")
+
+
+verwendet. Dies ist jedoch nur ein Beispiel. Die korrekte Angabe
+finden Sie oben.
+ Die Funktion 'f' darf natürlich nicht angewendet werden, wenn
+keine Datei geöffnet ist. In die Verlegenheit kommen Sie aber nur
+beim Ausprobieren, denn alle gefährlichen EUDAS-Funktionen sind
+sonst gesperrt.
+ Falls das angegebene Feld nicht existiert, wird mit einer Feh­
+lermeldung abgebrochen. Beachten Sie, daß dies immer erst bei der
+Ausführung festgestellt werden kann. Bei der Eingabe, zum Beispiel
+eines Druckmusters, kann dies noch nicht überprüft werden.
+ Eine weitere Abfrage, die EUDAS während des Druckens ermög­
+licht, ist die Funktion
+
+
+ TEXT PROC lfd nr
+
+
+Diese hat keine Parameter und liefert die laufende Nummer des
+gedruckten Satzes.
+ Diese beiden Funktionen können als Ausgangsbasis dienen zur
+Manipulation mit weiteren Funktionen.
+
+#on("b")#Verkettung#off("b")# Zur Verkettung von Teiltexten gibt es den oben
+schon
+beschriebenen Operator '+'. Wenn Sie mehr als zwei Texte verketten
+wollen, können Sie den Operator beliebig hintereinander verwenden:
+
+
+ f ("PLZ") + " " + f ("Ort")
+
+
+Wie in diesem Beispiel können Sie sowohl Konstanten als auch Tex­
+te, die von anderen Funktionen geliefert werden, verketten. Beach­
+ten Sie, daß die Texte immer ohne Zwischenraum aneinandergehängt
+werden; daher wird im obigen Beispiel ein Leerzeichen extra ange­
+geben.
+ Wenn Sie eine bestimmte Anzahl von gleichen Zeichen haben
+möchten (zum Beispiel für horizontale Linien oder große Zwischen­
+räume), können Sie dafür folgenden Operator verwenden:
+
+
+ TEXT OP * (INT CONST anzahl, TEXT CONST einzeltext)
+
+
+Hier sehen Sie als Beispiel einen Operator, der mit verschiedenen
+Datentypen arbeitet. Sie müssen die Parameter jedoch immer in der
+angegebenen Reihenfolge benutzen. Das folgende Beispiel ist kor­
+rekt:
+
+
+ 20 * "-"
+
+
+während dies nicht erlaubt ist:
+
+
+ "-" * 20
+
+
+Wieder können Sie diesen Operator mit anderen Funktionen verknü­
+pfen:
+
+
+ "!" + 10 * " " + "!" + 5 * "-" + "!"
+
+
+Da der Multiplikationsoperator Vorrang vor der Addition hat, kom­
+men Sie hier sogar ohne Klammern aus (überlegen Sie sich, wo ein
+Fehler auftreten würde, wenn dies nicht so wäre). Als Ergebnis
+dieses komplexen Ausdrucks ergäbe sich der folgende Text:
+
+
+ "! !-----!"
+
+
+#on("b")#Teiltexte#off("b")# Um auch Teile von Texten bearbeiten zu können,
+werden
+die Zeichen eines Textes von 1 an (mit INT-Zahlen) durchnumeriert.
+Anhand dieser Positionen können Sie Teiltexte extrahieren.
+ Damit Sie die Position des letztes Zeichens (und damit die An­
+zahl der Zeichen) erfragen können, gibt es die Funktion
+
+
+ INT PROC length (TEXT CONST text)
+
+
+Wieviel Zeichen in einem Feld stehen, können Sie also mit
+
+
+ length (f ("Feldname"))
+
+
+erfahren.
+ Einen Teiltext bekommen Sie mit der Funktion 'subtext'. Diese
+gibt es in zwei Ausführungen.
+
+
+ TEXT PROC subtext (TEXT CONST text, INT CONST anfang)
+
+
+liefert den Teiltext von einer bestimmten Position an (einschließ­
+lich) bis zum Textende. Mit
+
+
+ TEXT PROC subtext (TEXT CONST t, INT CONST anf, ende)
+
+
+können Sie auch die Position des letzten Zeichens (einschließlich)
+angeben. Daher würden die beiden folgenden Aufrufe
+
+
+ subtext (f ("Feldname"), 1)
+ subtext (f ("Feldname"), 1, length (f ("Feldname")))
+
+
+den Feldinhalt unverändert liefern. Ein weiteres Beispiel:
+
+
+ subtext ("Ein Text als Beispiel", 5, 8)
+
+
+liefert als Ergebnis "Text".
+ Es gibt noch den Operator 'SUB', der jeweils nur ein Zeichen
+aus dem Text liefert:
+
+
+ TEXT OP SUB (TEXT CONST text, INT CONST stelle)
+
+
+Der Aufruf ist gleichwertig zu einem Aufruf von 'subtext', in dem
+beide Stellen gleich sind.
+ Bei beiden Funktionen wird nicht vorhandener Text einfach
+ignoriert. So liefert
+
+
+ subtext ("Hallo", 4, 8)
+
+
+das Ergebnis "lo" und
+
+
+ "Hallo" SUB 10
+
+
+den leeren Text "".
+
+#on("b")#Verschachtelte Ausdrücke#off("b")# Wie Sie bereits gesehen haben,
+kann
+man Ausdrücke ineinander verschachteln. Dies ist in unserem Fall
+sehr nützlich, wenn Teiltexte bestimmt werden sollen, deren Posi­
+tion nicht konstant ist. Ein Beispiel, in dem 'length' bei der Fest­
+legung der Endposition verwendet wird, haben Sie weiter oben
+bereits gesehen.
+ Als weitere Möglichkeit können Sie mit Positionen, die ja INT-
+Zahlen sind, ganz normal rechnen. Folgender Ausdruck liefert zum
+Beispiel die letzten drei Zeichen eines Feldes:
+
+
+ subtext (f ("Feldname"), length (f ("Feldname")) - 2)
+
+
+Wichtig ist, daß ein Ausdruck, der wieder als Parameter für einen
+anderen Ausdruck verwendet werden soll, den richtigen Typ hat,
+der von dem anderen Ausdruck verlangt wird.
+ In dem obigen Beispiel muß als Position ein INT verwendet
+werden. Diese Position wird vom Operator '-' berechnet. Es gibt
+aber nur einen Subtraktionsoperator, der einen INT liefert, nämlich
+den, der wiederum zwei INTs subtrahiert. Glücklicherweise sind
+sowohl 'length' als auch die 2 vom Typ INT, anderenfalls wäre der
+Ausdruck fehlerhaft. 'length' wiederum benötigt einen TEXT als
+Parameter, der von der Funktion 'f' stammt, die als Parameter eben­
+falls einen TEXT verlangt.
+ Wie Sie sehen, kann es durchaus verwickelt zugehen, wenn ein
+Ausdruck aus den verschiedensten Teilausdrücken unterschiedlichen
+Typs zusammengesetzt ist. Die gleiche Überprüfung wie eben ge­
+schildert sollten Sie bei jedem Ausdruck vornehmen, damit keine
+Fehlermeldung erscheint.
+
+#on("b")#Variable Positionen#off("b")# Zur Berechnung von Positionen gibt es
+noch eine weitere nützliche Prozedur, nämlich
+
+
+ INT PROC pos (TEXT CONST text, teiltext)
+
+
+Sie liefert die Position, an der der angegebene Teiltext zum ersten
+Mal in dem Text vorkommt, oder 0, wenn der Teiltext nicht darin
+vorkommt. So ist
+
+
+ pos ("Hallo", "l") = 3
+
+
+und
+
+
+ pos ("Hallo", "lo") = 4
+
+
+und
+
+
+ pos ("Hallo", "xx") = 0
+
+
+Diese Funktion kann zum Beispiel dazu verwendet werden, ein Feld
+in mehrere Teile aufzuspalten. Sind zum Beispiel Name und Vorname
+in einem Feld durch Leerzeichen getrennt hintereinandergeschrie­
+ben, liefert
+
+
+ subtext (f ("Name"), 1, pos (f ("Name"), " ") - 1)
+
+
+den Vornamen und entsprechend
+
+
+ subtext (f ("Name"), pos (f ("Name"), " ") + 1)
+
+
+den Nachnamen. Soll die Position erst ab einer gewissen Stelle ge­
+sucht werden, gibt es noch die folgende Variation der Funktion:
+
+
+ INT PROC pos (TEXT CONST text, teiltext, INT CONST ab)
+
+
+Bei dieser Funktion wird erst ab der angegebenen Stelle einschließ­
+lich gesucht.
+
+
+14.4 Rechenfunktionen
+
+#on("b")#Umwandlungen#off("b")# Bevor mit dem Inhalt eines Feldes gerechnet
+wer­
+den kann (auch wenn das Feld den Feldtyp ZAHL hat), muß der Wert
+des Feldinhaltes als REAL-Zahl berechnet werden. Dazu gibt es die
+Funktion
+
+
+ REAL PROC wert (TEXT CONST feldname)
+
+
+Die Funktion 'wert' ignoriert alle Sonderzeichen in dem Feld außer
+dem Minuszeichen (als Vorzeichen) und dem eingestellten Dezimal­
+komma. Wenn das Feld 'Summe' beispielsweise "-***20,09 DM" ent­
+hält, ergibt sich
+
+
+ wert ("Summe") = 20.09
+
+
+Zum kaufmännischen Rechnen ist es manchmal erforderlich, den Wert
+auf eine bestimmte Anzahl von Nachkommastellen zu runden. Diese
+Anzahl kann man bei einer Variante von 'wert' als Parameter ange­
+ben:
+
+
+ REAL PROC wert (TEXT CONST feldname,
+ INT CONST kommastellen)
+
+
+Mit den so erhaltenen Werten können Sie dann die weiter unten
+beschriebenen Berechnungen durchführen. Bevor Sie das Ergebnis
+jedoch drucken oder in ein Feld eintragen können, müssen Sie den
+REAL-Wert wieder in einen TEXT verwandeln. Dazu dient die Funk­
+tion
+
+
+ TEXT PROC zahltext (REAL CONST wert,
+ INT CONST kommastellen)
+
+
+Der übergebene Wert wird mit der gewünschten Anzahl von Komma­
+stellen als Text formatiert. Dazu wird der Wert gerundet. Außerdem
+wird statt eines Punktes das eingestellte Dezimalkomma eingesetzt.
+Die Länge des Textes richtet sich nach der Anzahl von benötigten
+Stellen, es werden also keine führenden Nullen oder Leerzeichen
+eingesetzt (dafür kann man den Text beim Drucken ja rechtsbündig
+einsetzen).
+ Wird 0 als Kommastellen angegeben, wird auch kein Dezimal­
+komma erzeugt (Darstellung wie ein INT). Als Abkürzung können Sie
+auch
+
+
+ TEXT PROC zahltext (TEXT CONST feldname,
+ INT CONST kommastellen)
+
+
+als Ersatz für
+
+
+ zahltext (wert ("Feldname"), kommastellen)
+
+
+verwenden. So kann ein Feld einheitlich zum Drucken formatiert
+werden.
+
+#on("b")#Arithmetik#off("b")# Sowohl mit INT- als auch mit REAL-Zahlen
+(jedoch
+nicht gemischt) können Sie die üblichen Rechenoperatoren '+', '-'
+und '*' verwenden. Auch Minimum ('min') und Maximum ('max') sind
+für zwei Parameter dieser Typen definiert.
+ Lediglich die Division wird bei beiden Typen unterschiedlich
+gehandhabt. Für REAL-Zahlen gibt es den Operator '/' für die
+übliche Division. Da die ganzzahlige Division eine andere Bedeutung
+hat, wird dafür der Operator 'DIV' verwendet. Den Rest der ganz­
+zahligen Division liefert 'MOD'.
+ 'abs' liefert den Wert eines REAL oder INT ohne das Vorzeichen.
+Die Umwandlungsfunktionen 'int' und 'real' hatten wir ja bereits
+weiter oben erwähnt.
+ Für REAL-Zahlen gibt es noch weitere mathematische Funktio­
+nen (Exponentialfunktion, Trigonometrie), die Sie am besten im
+EUMEL-Benutzerhandbuch nachschlagen, wenn Bedarf dafür besteht.
+
+
+14.5 Abfragen
+
+#on("b")#IF-Abfragen#off("b")# Wie Sie schon im vorigen Kapitel gesehen
+haben,
+kann man in Druckmustern auch IF-Abfragen als Ausdrücke ver­
+wenden. Die IF-Abfragen können zwar auch ineinander verschach­
+telt werden, sie dürfen jedoch nicht mehr innerhalb eines normalen
+Ausdrucks angewendet werden.
+ Eine IF-Abfrage enthält 3 Teilausdrücke in folgender Form:
+
+
+ IF 'BOOL-Ausdruck' THEN
+ 'Ausdruck1'
+ ELSE
+ 'Ausdruck2'
+ END IF
+
+
+Der erste Ausdruck muß einen Wert vom Typ BOOL liefern, der ent­
+scheidet, welcher der beiden Teilausdrücke ausgewertet wird. Wir
+werden gleich noch sehen, was für Möglichkeiten es da gibt.
+ Die beiden Teilausdrücke dürfen auch wieder IF-Abfragen sein,
+sind sie es jedoch nicht, dürfen in ihnen dann keine IF-Abfragen
+mehr vorkommen. Die IF-Abfragen liegen also immer auf der äußer­
+sten Ebene.
+ Die beiden Teilausdrücke dürfen einen beliebigen Typ haben, er
+muß jedoch für beide gleich sein.
+ Als Ergebnis der IF-Abfrage wird 'Ausdruck1' geliefert, wenn
+der BOOL-Ausdruck wahr ist, sonst 'Ausdruck2'.
+
+#on("b")#Vergleiche#off("b")# Die wesentlichen Operationen, die boolesche
+Ausdrücke
+zur Verwendung in IF-Abfragen bilden, sind die Vergleichsoperato­
+ren:
+
+
+ = <> <= >= < >
+
+
+Sie vergleichen jeweils zwei Elemente vom Typ TEXT, INT oder REAL
+und liefern TRUE (wahr) oder FALSE (falsch). Selbstverständlich
+können auch sie zwei zusammengesetzte Teilausdrücke vergleichen.
+ Eine Anwendung ist zum Beispiel der Test, ob ein Text in einem
+anderen enthalten ist:
+
+
+ IF pos (f ("Betrag"), "DM") > 0 THEN
+ "deutsches Geld"
+ ELSE
+ "ausländisches Geld"
+ END IF
+
+
+Die Funktion 'pos' wird hier dazu benutzt, festzustellen, ob es sich
+um deutsches oder ausländisches Geld handelt.
+ Oft müssen jedoch mehrere Vergleiche miteinander kombiniert
+werden. Zu diesem Zweck gibt es die beiden Operatoren AND (und)
+und OR (oder). Damit AND das Ergebnis TRUE liefert, müssen beide
+Vergleiche wahr sein, bei OR muß mindestens einer der beiden wahl
+sein.
+ Die Reihenfolge aller dieser Operatoren ist so gewählt, daß
+normalerweise keine Klammern benötigt werden. Funktionen haben
+immer Vorrang vor Operatoren, bei den Operatoren kommt die Multi­
+plikation vor der Addition, dann kommen die Vergleiche, danach das
+AND und danach das OR. Alle anderen Operatoren (#on("i")#insbesondere
+SUB#off("i")#) teilen sich den letzten Rang.
+ Wenn Sie also in einem Ausdruck mehrere Vergleiche mit AND
+und OR verknüpfen, und das OR soll stärker binden als das AND,
+müssen Sie dies durch Klammern ausdrücken.
+ Den oben besprochenen Operator SUB sollten Sie immer in
+Klammern setzen, wenn Sie ihn in einem Vergleich benutzen. Da er
+die niedrigste Priorität hat, gäbe es sonst mit Sicherheit Fehler:
+
+
+ IF (f ("Name") SUB 1) = "M" THEN
+ "vielleicht Müller"
+ ELSE
+ "bestimmt nicht"
+ END IF
+
+
+#on("b")#Refinements#off("b")# Bisher hatten wir gesagt, daß IF-Abfragen
+nicht
+innerhalb von anderen Ausdrücken verwendet werden dürfen. Diese
+Einschränkung kann man umgehen, indem man #on("i")#Refinements#off("i")# verwen­
+det.
+ Ein Refinement hat im Druckmuster eine ähnliche Wirkung wie
+eine Abkürzung, lediglich der Name darf nur mit Kleinbuchstaben
+und Ziffern geschrieben sein und kann nicht als Feldmuster ver­
+wendet werden.
+
+
+ &abk :
+ subtext (f ("Name"), namensanfang) .
+ namensanfang :
+ IF pos (f ("Name"), " ") > 0 THEN
+ pos (f ("Name"), " ") + 1
+ ELSE
+ length (f ("Name"))
+ END IF .
+
+
+Innerhalb von Refinements dürfen auch wieder andere Refinements
+verwendet werden.
+ Auch in Kopier- und Änderungsmustern können Sie Refinements
+verwenden. Hier müssen Sie jedoch darauf achten, daß alle Refine­
+ments am Ende gesammelt werden und vor dem ersten Refinement
+ein Punkt stehen muß. Ebenso müssen die Refinements wie im
+Druckmuster durch Punkte voneinander getrennt sein:
+
+
+ "Anrede" K anrede;
+ .
+ anrede :
+ IF f ("m/w") = "w" THEN
+ "Frau"
+ ELSE
+ "Herr"
+ END IF .
+
+
+
diff --git a/doc/eudas/eudas.hdb.15 b/doc/eudas/eudas.hdb.15
new file mode 100644
index 0000000..c0a22cf
--- /dev/null
+++ b/doc/eudas/eudas.hdb.15
@@ -0,0 +1,286 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (165)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+15 Anweisungen in ELAN
+
+
+
+15.1 Variablen und Zuweisungen
+
+Im vorigen Kapitel haben wir Ausdrücke in ELAN kennengelernt. Der
+Wert eines Ausdrucks wird bei jeder Verwendung erneut berechnet.
+Wenn wir den Wert eines Ausdrucks aufbewahren wollen, müssen wir
+ihn schon in eine EUDAS-Datei schreiben.
+ Oft tritt jedoch die Notwendigkeit auf, Werte zu merken, ohne
+sie in einer Datei zu speichern. Beispiel dafür ist ein Zählvorgang im
+Druckmuster. In jedem Wiederholungsteil muß der dazukommende
+Wert zum bisherigen, aufsummierten und aufbewahrten Wert addiert
+werden. Das Zwischenergebnis der Zählung muß also irgendwo ge­
+speichert werden.
+
+#on("b")#Variablen#off("b")# Zu diesem Zweck gibt es Variablen. Sie sind
+ähnlich wie
+Felder in einer Datei. Ihre Existenz ist jedoch unabhängig von einer
+Datei. Außerdem sind sie zu Anfang nicht einfach leer, sondern
+haben einen undefinierten Wert.
+ Variablen müssen im Programm definiert werden. Sie existieren
+dann während der Ausführung dieses Programms und gehen an­
+schließend verloren. Zu Beginn des Programms sind sie, wie schon
+gesagt, undefiniert.
+ Eine Variable muß immer einen Typ haben. Dieser Typ ist für
+die Lebensdauer der Variable unveränderlich. Die Variable kann
+natürlich nur Werte dieses Typs annehmen.
+ Eine Variablendefinition (oder auch -deklaration) besteht aus
+der Angabe eines Typs, dem Schlüsselwort VAR und einem freige­
+wählten Namen. Wie schon bei den Refinements darf ein solcher
+Name nur aus Kleinbuchstaben (keine Umlaute) und eventuell Zif­
+fern bestehen. Dagegen darf der Name Leerzeichen enthalten.
+Beispiel:
+
+
+ INT VAR zaehler;
+ TEXT VAR feldname;
+ REAL VAR mein ergebnis 1;
+
+
+Das Semikolon am Ende beschließt die Definition.
+ Die Lebensdauer einer Variablen hängt davon ab, an welcher
+Stelle sie definiert ist. Eine Variable, die im Druckmuster im Initia­
+lisierungsteil definiert ist, behält ihren Wert für die gesamte Dauer
+des Druckvorgangs. Eine Variable in einem Abschnitt lebt dagegen
+nur für eine Abarbeitung dieses Abschnitts. Bei der nächsten Abar­
+beitung ist sie wieder undefiniert.
+ Das gleiche gilt für Kopier- und Änderungsmuster. Auch hier
+sind Variablen nur für die Dauer der Bearbeitung eines Satzes
+gültig.
+
+#on("b")#Zuweisung#off("b")# Um einer Variablen einen Wert zu geben, führt
+man eine
+#on ("i")#Zuweisung#off("i")# aus. Die Zuweisung wird durch Doppelpunkt und Gleich­
+heitszeichen aneinandergeschrieben gekennzeichnet. Auf der linken
+Seite steht die Variable, auf der rechten Seite eine Ausdruck:
+
+
+ zaehler := 1;
+
+
+Wie oben schließt das Semikolon die Anweisung ab. Nach der Aus­
+führung hat die Variable den Wert 1. Der Wert vorher ist für die
+Zuweisung egal, er kann definiert oder undefiniert sein.
+ Eine Variable kann in einem Ausdruck verwendet werden, indem
+man einfach den Namen hinschreibt. Der Ausdruck
+
+
+ zaehler + 1
+
+
+hat nach der obigen Zuweisung den Wert 2. Eine Variable muß bei
+der Verwendung definiert sein, sonst können beliebige Fehler ent­
+stehen. Es muß also vor der ersten Verwendung ausdrücklich eine
+Zuweisung erfolgt sein.
+ Da Variablen in Ausdrücken verwendet werden können und
+Ausdrücke auf der rechten Seite einer Zuweisung stehen, ist folgen­
+de Konstruktion möglich:
+
+
+ zaehler := zaehler + 1;
+
+
+Diese Zeile bewirkt, daß der Wert der Variable um 1 erhöht wird.
+Zuerst wird bei der Zuweisung der Wert des Ausdrucks auf der rech­
+ten Seite bestimmt. Zu diesem Zeitpunkt habe die Variable bei­
+spielsweise den Wert 1. Der Ausdruck hat dann den Wert 2 (1+1).
+Dieser Wert wird der neue Wert der Variablen.
+ Bei der nächsten Ausführung würde sich der gleiche Vorgang
+wiederholen, so daß die Variable anschließend den Wert 3 hat.
+ Auch bei der Zuweisung gilt natürlich, daß die Variable auf der
+linken Seite den gleichen Datentyp haben muß wie der Ausdruck auf
+der rechten Seite.
+
+#on("b")#Initialisierung#off("b")# Sie können Variablendeklaration und
+Zuweisung
+auch miteinander verknüpfen, so daß die Variable gleich zu Anfang
+einen Wert erhält:
+
+
+ INT VAR zaehler := 0;
+
+
+Dieses Verfahren ist eine gute Vorsichtsmaßregel, damit Sie keine
+undefinierten Variablen verwenden.
+
+#on("b")#Inkrement#off("b")# Da der Fall so häufig auftritt, daß der Wert
+einer Vari­
+ablen um einen bestimmten Wert erhöht wird (bei allen Zählvorgän­
+gen), gibt es auch dafür eine Abkürzung, und zwar die beiden Ope­
+ratoren INCR und DECR.
+
+
+ zaehler INCR 1;
+ mein ergebnis 1 DECR 24.4;
+
+
+Die Operatoren sind für REALs und INTs definiert. INCR erhöht um
+einen Betrag, DECR erniedrigt. Auf der rechten Seite darf wieder ein
+beliebiger Ausdruck stehen.
+ Für TEXTe gibt es eine ähnliche Abkürzung, allerdings nur für
+die Addition (Verkettung). Hier heißt der Operator CAT. Die beiden
+folgenden Zeilen haben die gleiche Bedeutung:
+
+
+ feldname := feldname + ".";
+ feldname CAT ".";
+
+
+
+15.2 Weitere Konstruktionen
+
+#on("b")#IF#off("b")# Die Ihnen bereits bekannte IF-Konstruktion dient nicht
+nur
+dazu, Werte zu liefern, sondern steuert auch die Abarbeitung von
+beliebigen Anweisungen. Diese Anweisungen können Kopier- und
+Änderungsanweisungen sein (s. Kapitel 11), oder die oben beschrie­
+benen Zuweisungen.
+ In einem Teil der IF-Konstruktion können auch mehrere Anwei­
+sungen stehen. Diese müssen dann jedoch unbedingt durch Semiko­
+lon getrennt sein. Mehrere Anweisungen hintereinander haben ein­
+fach die Bedeutung der Ausführung in der notierten Reihenfolge.
+ Als drittes kann auch der ELSE-Teil weggelassen, da nicht in
+jedem Fall ein Ergebnis erwartet wird. Falls die Bedingung nicht
+zutrifft, muß nicht unbedingt etwas ausgeführt werden.
+
+
+ IF zaehler > 0 THEN
+ zaehler DECR 1;
+ mein ergebnis 1 INCR wert ("zaehlfeld")
+ END IF;
+
+
+Auch diese IF-Konstruktion kann wieder geschachtelt werden. Für
+viele Fälle gibt es jedoch einen ELIF-Teil, der die Verschachtelung
+erspart:
+
+
+ IF f ("m/w") = "m" THEN
+ maenner INCR 1
+ ELIF f ("m/w") = "w" THEN
+ frauen INCR 1
+ ELSE
+ zweifelhaft INCR 1
+ END IF;
+
+
+Der ELIF-Teil beinhaltet noch einmal einen Test. Dieser Test wird
+jedoch nur dann durchgeführt, wenn die erste Bedingung falsch war.
+Gibt es noch mehr Wahlmöglichkeiten, können Sie beliebig viele
+ELIF-Teile benutzen.
+ Beachten Sie, daß die letzte Anweisung in einem Teil der IF-
+Konstruktion nicht unbedingt ein folgendes Semikolon haben muß
+(das Semikolon soll nur trennen). Ein Semikolon an dieser Stelle
+kann aber auch nicht schaden.
+
+#on("b")#Werteliefernde Programme#off("b")# Nicht nur Ausdrücke können Werte
+lie­
+fern, sondern auch ganze Anweisungsfolgen. Dies ist eine Erweite­
+rung der werteliefernden IF-Konstruktion. Sie können dies für Ab­
+kürzungen oder Refinements ausnutzen.
+
+
+ endergebnis :
+ gesammelte zeichen CAT ".";
+ gesammelte zeichen .
+
+
+In diesem Beispiel werden in einer Textvariable bestimmte Zeichen
+gesammelt. Zum Schluß soll ein Punkt angefügt werden und dieser
+Text dann als Ergebnis des Refinements geliefert werden.
+ Damit eine Anweisungsfolge einen Wert liefert, muß am Ende
+der Anweisungsfolge ein Ausdruck stehen. Der Wert des Ausdrucks
+nach Abarbeitung der Anweisungen ist dann der Wert der Anwei­
+sungsfolge.
+ Allerdings kann man den gleichen Wert oft verschieden aus­
+drücken. Folgendes Refinement hat die gleiche Wirkung wie oben:
+
+
+ endergebnis :
+ gesammelte zeichen + "." .
+
+
+In manchen Fällen ist eine Formulierung als werteliefernde Anwei­
+sungsfolge jedoch übersichtlicher.
+
+#on("b")#Beispiel#off("b")# Zum Abschluß dieses Kapitels wollen wir als
+Beispiel eine
+statistische Auswertung einer Zahlenreihe als Druckmuster formu­
+lieren.
+ Gegeben sei eine Datei mit folgenden Feldern:
+
+
+ "Meßwert 1"
+ "Meßwert 2"
+
+
+Wir wollen als Ergebnis Mittelwert und Standardabweichung der
+beiden Meßwerte ausdrucken. Dazu dient das Druckmuster auf der
+folgenden Seite.
+ Im Initialisierungsteil des Druckmusters werden die notwendi­
+gen Variablen definiert und initialisiert. Beachten Sie hier, daß in
+einer Definition mehrere Variablen durch Komma getrennt aufgeführt
+werden können, wenn sie den gleichen Typ haben.
+ Im Wiederholungsteil müssen dann jeweils die Zwischensummen
+aktualisiert werden. Da mit der Funktion 'wert' eine relativ auf­
+wendige Umwandlung verbunden ist, wird der Wert des jeweiligen
+Feldes erst einmal in einer Variable zwischengespeichert, da er
+mehrmals benötigt wird. Diese Zwischenspeicherungsvariable muß
+nicht initialisiert werden
+ Im Nachspann werden dann die Ergebnisse gedruckt. Die Formeln
+sind jeweils als Abkürzungen definiert. Die Funktion 'zahltext' sorgt
+dafür, daß die Werte mit drei Nachkommastellen (gerundet) aufge­
+führt werden.
+ Da die Formeln relativ komplex sind, werden sie auf mehrere
+Zeilen verteilt (in ELAN hat das Zeilenende keine Bedeutung).
+
+
+ %% REAL VAR
+ %% messwert,
+ %% summe 1 := 0.0, quadratsumme 1 := 0.0,
+ %% summe 2 := 0.0, quadratsumme 2 := 0.0;
+ %% INT VAR anzahl := 0;
+ % WIEDERHOLUNG
+ %% anzahl INCR 1;
+ %% messwert := wert ("Meßwert 1");
+ %% summe 1 INCR messwert;
+ %% quadratsumme 1 INCR messwert * messwert;
+ %% messwert := wert ("Meßwert 2");
+ %% summe 2 INCR messwert;
+ %% quadratsumme 2 INCR messwert * messwert;
+ % NACHSPANN
+ &anz Meßwerte.
+ Meßwert 1 Meßwert 2
+ Mittelwert &&mw1&&&& &&mw2&&&&
+ Standardabweichung &&st1&&&& &&st2&&&&
+ % ABKUERZUNGEN
+ &mw1 : zahltext (summe 1 / real (anzahl), 3) .
+ &mw2 : zahltext (summe 2 / real (anzahl), 3) .
+ &st1 : zahltext
+ (sqrt ((quadratsumme 1 - summe 1 * summe 1 /
+ real (anzahl)) / real (anzahl - 1)), 3) .
+ &st2 : zahltext
+ (sqrt ((quadratsumme 2 - summe 2 * summe 2 /
+ real (anzahl)) / real (anzahl - 1)), 3) .
+
+
+Mit entsprechenden Formeln können Sie dieses Beispiel für Ihre
+eigenen Statistiken erweitern. Die Beispiele der letzten beiden Ka­
+pitel sollten Ihnen genügend Anregungen dafür gegeben haben.
+
diff --git a/doc/eudas/eudas.hdb.16 b/doc/eudas/eudas.hdb.16
new file mode 100644
index 0000000..5f5d575
--- /dev/null
+++ b/doc/eudas/eudas.hdb.16
@@ -0,0 +1,350 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (171)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+16 Dateiverwaltung mit EUDAS
+
+
+
+16.1 Dateien im System
+
+Zum Bearbeiten von Dateien innerhalb des Systems gibt es das Menü
+'Dateien', das Sie bereits in Kapitel 4 kurz kennengelernt haben.
+An dieser Stelle sollen die übrigen Funktionen dieses Menüs be­
+sprochen werden.
+
+
+ --------------
+ Dateien System
+ U Übersicht
+ --------------
+ Datei
+ L Löschen
+ N Umbenennen
+ K Kopieren
+ P Platzbedarf
+ A Aufräumen
+ --------------
+
+#center#Abb. 16-1 Menü 'Dateien'
+
+
+Beachten Sie, daß alle Funktionen in diesem Menü mit Dateien
+beliebiger Struktur arbeiten können, also sowohl mit Textdateien
+als auch EUDAS-Dateien (und anderen). Dies liegt daran, daß
+Dateien an dieser Stelle einfach als "schwarze Kästen" mit beliebi­
+gem Inhalt betrachtet werden.
+
+#on("b")#Übersicht#off("b")# Die Funktion 'Übersicht' haben Sie bereits
+ausprobiert.
+Sie zeigt in einem Editorfenster an der rechten Seite alle Dateien,
+die sich in Ihrer Task befinden. Falls nicht alle Dateien auf den
+Bildschirm passen, können Sie das Fenster mit HOP OBEN und HOP
+UNTEN rollen. Sie verlassen die Übersicht wie üblich mit ESC 'q'.
+
+#on("b")#Löschen#off("b")# Auch die Funktion 'Löschen' sollten Sie schon
+kennen.
+Mit dieser Funktion verschwindet eine Datei auf Nimmerwieder­
+sehen. Daher werden Sie sicherheitshalber immer gefragt, ob Sie die
+Datei wirklich löschen wollen. Sie können in einer Auswahl auch
+alle zu löschenden Dateien ankreuzen (dann wird trotzdem nochmal
+gefragt).
+ Eine EUDAS-Datei, die gerade geöffnet ist, können Sie nicht
+löschen (sonst würde EUDAS zumindest durcheinanderkommen). Sie
+müssen die Datei zuerst sichern - oder nicht sichern, aber die
+Arbeitskopien löschen.
+
+#on("b")#Umbenennen#off("b")# Mit der Funktion 'Umbenennen' können Sie einer
+Datei
+einen neuen Namen geben. Sie werden zuerst aufgefordert, den alten
+Namen der Datei einzugeben. Alternativ können Sie hier wieder die
+umzubenennenden Dateien auswählen. Danach wird Ihnen (für jede
+ausgewählte Datei) der alte Dateiname zum Überschreiben angebo­
+ten.
+ Sie können diesen Namen mit den üblichen Editierfunktionen
+verändern oder mit HOP RUBOUT löschen und ganz neu eingeben.
+Auf diese Weise sparen Sie sich erheblichen Tippaufwand, wenn Sie
+einen langen Dateinamen an nur einer Stelle verändern wollen.
+
+#on("b")#Kopieren#off("b")# Wie in Abschnitt 11.2 bereits angedeutet, gibt es
+eine
+Funktion zum logischen Kopieren von Dateien. Dies ist eine Funk­
+tion, die sich auf spezielle Eigenschaften des EUMEL-Systems
+stützt. Wenn Sie eine Datei #on("i")#logisch#off("i")# kopieren, wird lediglich ein
+Verweis kopiert. Die Daten werden zunächst nur einmal für beide
+Dateien gespeichert.
+ Natürlich hätte das Ganze wenig Sinn, wenn danach bei Ände­
+rungen immer beide Dateien geändert würden. Bei Änderungen an
+einer Datei werden jedoch nur die geänderten Daten getrennt ange­
+legt, der Rest wird weiterhin gemeinsam benutzt. Die beiden Dateien
+sind also nach außen hin komplett unabhängig, intern werden je­
+doch gemeinsame Daten so weit wie möglich geteilt. Auf diese Weise
+wird sowohl Zeit als auch Speicherplatz gespart.
+ Dieses Verfahren ist besonders dann sinnvoll, wenn Sie sich
+einen bestimmten Stand einer Datei aufbewahren wollen. In diesem
+Fall stellen Sie sich eine logische Kopie her und arbeiten mit dem
+Original weiter. Es werden dann nur die Daten zusätzlich angelegt,
+die Sie seit der Kopie verändert haben.
+ EUDAS benutzt die gleiche Funktion auch für die Arbeitskopie.
+Die Arbeitskopie teilt ebenfalls ihre Daten mit dem Original. Ande­
+renfalls wäre es ja auch zeitlich gar nicht möglich, beim Öffnen eine
+Arbeitskopie anzufertigen.
+ Beim Aufruf der Funktion 'Kopieren' werden Sie zunächst nach
+dem Namen der Datei gefragt (wie üblich mit Auswahlmöglichkeit).
+Dann können Sie einen neuen Namen für die Kopie angeben. Dieser
+neue Name darf jedoch nicht für eine andere Datei vergeben sein.
+Wollen Sie eine andere Datei überkopieren, müssen Sie diese zu­
+nächst löschen.
+ Denken Sie daran, daß die hier beschriebene Funktion sich
+wesentlich vom Kopieren im Menü 'Gesamtdatei' unterscheidet. Dort
+wird nämlich eine tatsächliche Kopie durchgeführt, dafür können Sie
+sich dann auch selektiv bestimmte Daten herausgreifen. Außerdem
+gilt die dortige Funktion nur für EUDAS-Dateien.
+
+#on("b")#Platzbedarf#off("b")# Zu Ihrer Information können Sie sich auch den
+Platz­
+bedarf anzeigen lassen, den eine Datei auf dem Speichermedium hat.
+Wenn Sie den Namen der Datei angegeben haben, wird Ihnen die
+Größe in "Kilobyte" (KB) angegeben. Ein KB entspricht etwa 1000
+Zeichen, also einer halben vollgeschriebenen Bildschirmseite.
+ Bei logisch kopierten Dateien wird für jede Datei der benötigte
+Platz separat angegeben. Sie können die Zahlen also nicht einfach
+addieren, um den Gesamtspeicherbedarf zu ermitteln, da Sie dann
+die gemeinsam benutzten Bereiche doppelt zählen würden.
+
+#on("b")#Aufräumen#off("b")# Wenn eine Datei viel geändert wurde, führen zwei
+Effekte zu einer langsameren Verarbeitung dieser Datei. Zum einen
+wird durch Textleichen der Platzbedarf größer. Dies tritt vor allem
+dann auf, wenn zu einzelnen Sätzen immer etwas hinzugefügt wurde
+(eine Folge der Flexibilität, mit variablen Textlängen operieren zu
+dürfen).
+ Da der Platzbedarf der Datei also wächst, sind mehr Speicher­
+zugriffe notwendig, als es dem Inhalt entspricht. Doch nicht nur der
+Platz, sondern auch die Verteilung der Sätze machen sich unange­
+nehm bemerkbar. Da vergrößerte Sätze intern am Ende der Datei
+gespeichert werden, werden logisch aufeinanderfolgende Sätze phy­
+sikalisch weit verstreut.
+ Der gleiche Effekt ensteht auch durch Umsortieren oder Ein­
+fügen von Sätzen. Um die Datei sequentiell zu bearbeiten, sind also
+ständig wechselnde Speicherzugriffe erforderlich.
+ Die beiden beschriebenen Effekte führen zur Geschwindigkeits­
+verringerung. Dies kann verhindert werden, indem die Datei in eine
+frische Datei umkopiert wird. Diesen Vorgang nennt man #on("i")#Reorgani­
+sieren#off("i")#. Dafür gibt es die Funktion 'Aufräumen'.
+ Während des Umkopierens werden die Satznummern ausgegeben.
+Achten Sie darauf, daß zum Reorganisieren genügend Platz auf dem
+System vorhanden ist, um eine komplette Kopie der zu reorganisie­
+renden Datei aufzunehmen.
+ Zum Reorganisieren muß nämlich tatsächlich eine physikalische
+Kopie angefertigt werden. Eine logische Kopie oder das Schreiben
+auf das Archiv reorganisieren eine Datei dagegen nicht, wohl aber
+die Funktion 'Kopieren' im Menü 'Gesamtdatei'.
+ Da der Inhalt gelesen werden muß, funktioniert die Funktion
+'Aufräumen' im Gegensatz zu den oben gemachten Versprechungen
+nur für Textdateien oder EUDAS-Dateien, nicht aber für andere
+Dateitypen. Die Unterscheidung der Dateitypen wird automatisch
+vorgenommen.
+
+
+16.2 Dateien auf dem Archiv
+
+Mit den Funktionen im Menü 'Archiv' können Sie nicht nur Dateien
+auf dem Archiv behandeln, sondern auch in anderen Tasks oder per
+EUMEL-Netz sogar auf anderen Rechnern.
+
+
+ --------------
+ Dateien Archiv
+ U Übersicht
+ D Üb. Drucken
+ --------------
+ Datei
+ K Kopieren
+ vom Archiv
+ S Schreiben
+ auf Archiv
+ L Löschen
+ auf Archiv
+ --------------
+ Archivdiskette
+ I Init
+ --------------
+ Z Zielarchiv
+ P Paßwort
+ R Reservieren
+ --------------
+
+#center#Abb. 16-2 Menue 'Archiv'
+
+
+#on("b")#Zielarchiv#off("b")# Dazu können Sie die Task einstellen, mit der
+Sie arbei­
+ten möchten. Normaleinstellung ist die Task 'ARCHIVE', die Ihre
+Archivdiskette bedient. Dies wird auch in der untersten Bildschirm­
+zeile angezeigt.
+ Die Task stellen Sie mit der Funktion 'Zielarchiv' ein. Sie
+werden dann nach dem Namen der Task gefragt. Diese Task muß
+eine Managertask sein (also unabhängig vom Bildschirm arbeiten)
+und sie muß bereits existieren.
+ Wenn Sie auf Ihrem Rechner das EUMEL-Netz installiert haben,
+werden Sie auch nach der Nummer der Zielstation gefragt, also der
+Nummer des Rechners, auf dem die gewünschte Task arbeitet. Durch
+Drücken von RETURN wird automatisch Ihre eigene Stationsnummer
+verwendet.
+ Nun gibt es zwei Arten von Managertasks, mit denen EUDAS
+zusammenarbeiten kann, #on("i")#Archivmanager#off("i")# und normale Dateimanager.
+Der Unterschied besteht darin, daß ein Archivmanager für einen
+Benutzer reserviert werden muß, damit man nicht auf Disketten
+eines anderen Benutzers zugreifen kann. Normale Dateimanager
+können und sollen dagegen von mehreren Benutzern in beliebiger
+Reihenfolge angesprochen werden.
+ Manche Rechner haben mehrere Archivmanager für mehrere
+Diskettenlaufwerke. Durch das Einstellen des Zielarchivs können Sie
+auf verschiedenen Laufwerken archivieren. Ein Archivmanager kann
+sich natürlich auch auf einem anderen Rechner befinden. Sie benut­
+zen dann dessen Diskettenlaufwerk.
+ Beim Einstellen des Zielarchivs wird als letztes gefragt, ob die
+Zieltask ein Archivmanager ist oder nicht. Im Normalfall sollten Sie
+die Frage bejahen, wenn Sie 'ARCHIVE' einstellen, und ansonsten
+verneinen (s. die obigen Ausnahmefälle).
+ Das eingestellte Zielarchiv wird jeweils in der untersten Bild­
+schirmzeile angezeigt.
+ Die Reservierung eines Archivmanagers findet beim ersten Zu­
+griff statt. Beim Umschalten des Zielarchivs oder Verlassen des
+Menüs wird die Reservierung automatisch wieder aufgehoben.
+
+#on("b")#Übersicht#off("b")# Mit der Funktion 'Übersicht' können Sie eine
+Auflistung
+aller Dateien abrufen, die sich auf der Archivdiskette (bzw. in dem
+eingestellten Manager) befinden. Wie die Dateiübersicht im System
+können Sie die Darstellung wie im Editor rollen und mit ESC 'q'
+verlassen.
+ Wollen Sie die Übersicht gedruckt haben, rufen Sie die Funktion
+'Übersicht drucken' auf. Die Übersicht wird dann nochmals zusam­
+mengestellt und gleich gedruckt.
+
+#on("b")#Schreiben und Lesen#off("b")# Mit den Funktionen 'Kopieren vom
+Archiv'
+und 'Schreiben auf Archiv' können Sie Dateien zwischen dem Archiv
+und Ihrer Task hin und her transportieren. Es wird jeweils eine
+Kopie angefertigt, das heißt das Original auf der Diskette oder in
+Ihrer Task wird nicht verändert.
+ Wenn die transportierte Datei an ihrem Ziel schon existiert,
+wird gefragt, ob die vorher existierende Datei gelöscht (überschrie­
+ben) werden soll. Überschreiben aus Versehen ist nicht möglich,
+wenn Sie die Frage sorgfältig beantworten.
+ Beim Aufruf der Funktionen können Sie den gewünschten Da­
+teinamen angeben oder in der Auswahl ankreuzen. Die Auswahl ist
+hier besonders sinnvoll, wenn Sie mehrere Dateien (eventuell sogar
+in einer bestimmten Reihenfolge) sichern müssen. Außerdem können
+Sie ja keine Datei transportieren, die nicht existiert; alle Möglich­
+keiten werden Ihnen also durch Ankreuzen angeboten.
+ Beachten Sie, daß beim Überschreiben einer Datei auf einer
+Archivdiskette der Speicherplatz der alten (überschriebenen) Ver­
+sion im allgemeinen nicht wiederverwendet werden kann. In diesem
+Fall kann das Archiv voll werden, obwohl eigentlich genügend Platz
+da wäre.
+
+#on("b")#Löschen#off("b")# Das gleiche Problem tritt auf beim Löschen einer
+Datei
+auf dem Archiv. Mit der Funktion 'Löschen auf Archiv' können Sie
+zwar die Datei auf der Diskette ungültig machen, der Platz wird
+jedoch nur dann wiederverwendet, wenn es die letzte Datei auf der
+Diskette war. Anderenfalls bleiben "Leichen" übrig, die Sie in der
+Archivübersicht als Striche erkennen können.
+ Diese Probleme treten jedoch mit anderen Managern nicht auf,
+da diese Ihren Speicherplatz intelligenter verwalten können.
+
+#on("b")#Initialisieren#off("b")# Als Abhilfe bei einem übergelaufenen Archiv
+müssen
+Sie das ganze Archiv initialisieren und neu beschreiben. Dazu gibt
+es die Funktion 'Init'.
+ Diese Funktion müssen Sie auch dann verwenden, wenn Sie eine
+Archivdiskette zum ersten Mal verwenden. Auf dem Archiv muß
+nämlich als erstes der Archivname eingetragen werden, ehe es be­
+nutzt werden kann. Diesen Namen müssen Sie hier angeben.
+ Alle alten Daten des Archivs werden komplett gelöscht. Daher
+müssen Sie vorher die noch gültigen Daten vom Archiv ins System
+kopiert haben. Wenn das Archiv vorher schon beschrieben war,
+werden Sie anhand des Namens gefragt, ob Sie die richtige Diskette
+zum Überschreiben eingelegt haben.
+ Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen,
+müssen Sie diese vor der Initialisierung #on("i")#formatieren#off("i")#. Dabei wird die
+Diskette auf ein bestimmtes physikalisches Format eingestellt. Ohne
+diese Operation ist weder Schreiben noch Lesen überhaupt möglich.
+ In der Regel muß eine Diskette nur einmal formatiert werden.
+Sie können sie jedoch jederzeit wieder formatieren (wenn Sie zum
+Beispiel nicht wissen, was Ihnen da für eine alte Diskette in die
+Finger geraten ist).
+ Am Anfang des Initialisierens werden Sie gefragt, ob Sie die
+Diskette formatieren wollen. Manche Rechner unterstützen diese
+Operation innerhalb des EUMEL-Systems nicht. In diesem Fall (und
+natürlich auch sonst normalerweise) müssen Sie die Frage vernei­
+nen. Das Formatieren muß dann vorher irgendwie außerhalb des
+Systems geschehen sein.
+ Das Initialisieren funktioniert natürlich nur bei Archivmana­
+gern. Bei einer anderen Zieltask ist diese Funktion gesperrt.
+
+#on("b")#Paßwort#off("b")# Dateien in einem allgemeinen Dateimanager (nicht
+jedoch
+auf dem Archiv) können Sie mit einem Paßwort gegen unbefugten
+Zugriff sichern. Sinnvolle Voraussetzung dafür ist, daß der Datei­
+manager selbst mit einem anderen Paßwort gegen Betreten gesichert
+ist.
+ Das von Ihnen verwendete Paßwort geben Sie mit der Funktion
+'Paßwort' ein. Damit Ihnen niemand über die Schulter schauen
+kann, werden alle Zeichen auf dem Bildschirm als Punkte darge­
+stellt. Anschließend müssen Sie das Paßwort noch einmal eingeben,
+damit sich kein unbemerkter Schreibfehler eingeschlichen hat.
+ Das Paßwort wird dann bei allen Transport- und Löschopera­
+tionen abgefragt. Eine Datei im Manager erhält Ihr Paßwort zuge­
+wiesen, wenn Sie sie das erste Mal im Manager ablegen. Bei allen
+folgenden Zugriffen muß das gleiche Paßwort eingestellt sein, sonst
+wird der Zugriff verweigert.
+ Natürlich können Sie für verschiedene Dateien verschiedene
+Paßwörter einstellen. Trotz Einstellung eines Paßworts können auch
+andere Benutzer ihre Dateien im gleichen Manager ablegen.
+ Sie können auch für Schreiben (und Löschen) sowie Lesen
+unterschiedliche Paßwörter einstellen. Dazu benutzen Sie einfach
+einen Trennstrich in der Form
+
+
+ Schreibpaßwort/Lesepaßwort
+
+
+Soll eine Datei überhaupt nicht überschrieben oder gelöscht werden
+können, können Sie '-' als Schreibpaßwort verwenden:
+
+
+ -/Lesepaßwort
+
+
+Die Datei kann dann nur beim direkten Betreten der Managertask
+verändert werden.
+ Wollen Sie die Paßworteinstellung wieder aufheben, drücken Sie
+bei der Paßworteingabe nur RETURN, da der leere Text als "kein
+Paßwort" interpretiert wird.
+
+#on("b")#Reservieren#off("b")# Wollen Sie eine Task als Zieltask verwenden,
+die zwar
+kein Archivmanager ist, aber reserviert werden muß (zum Beispiel
+'DOS' zum Ansprechen fremder Diskettenformate) müssen Sie die
+Reservierung mit der Funktion 'Reservieren' selbst vornehmen. Die
+Zieltask darf nicht als Archivmanager gekennzeichnet sein (dann ist
+die Funktion 'Reservieren' nämlich gesperrt).
+ Bei der Reservierung müssen Sie den Reservierungsparameter
+(abhängig von der Art der Zieltask - bei 'DOS' beispielsweise den
+Modus) als Text eingeben. Nach der Reservierung können Sie die
+anderen Funktionen des Archivmenüs verwenden.
+ Die Freigabe der Zieltask erfolgt automatisch beim Verlassen
+des Menüs oder beim Einstellen einer neuen Zieltask.
+
diff --git a/doc/eudas/eudas.hdb.2 b/doc/eudas/eudas.hdb.2
new file mode 100644
index 0000000..f3f14e1
--- /dev/null
+++ b/doc/eudas/eudas.hdb.2
@@ -0,0 +1,178 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (11)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+2 Installation des Programms
+
+
+
+Bevor Sie EUDAS auf Ihrem System benutzen können, müssen Sie das
+Programm zuvor installieren. Wenn EUDAS schon auf Ihrem System
+zur Verfügung steht, können Sie dieses Kapitel getrost überlesen.
+
+
+2.1 Lieferumfang
+
+EUDAS wird auf einer Diskette geliefert, die alle notwendigen Pro­
+gramme enthält. Um den Inhalt der Diskette feststellen zu können,
+starten Sie Ihr System und bringen es dazu, daß 'gib kommando:'
+erscheint. Dann legen Sie die Diskette ein und geben das Kommando
+
+
+ archive ("EUDAS"); list (archive); release (archive)
+
+
+Anschließend erscheint eine Übersicht der auf dem Archiv vorhan­
+denen Programmteile. Folgende Namen sollten sich in dieser Über­
+sicht wiederfinden:
+
+
+ "eudas.1"
+ "eudas.2"
+ "eudas.3"
+ "eudas.4"
+ "eudas.init"
+ "eudas.generator"
+ "Adressen"
+
+
+Eventuell können noch weitere Namen in der Übersicht auftauchen.
+Sollte einer der angegebenen Namen nicht vorhanden sein, rekla­
+mieren Sie die Diskette. Falls Sie statt der Übersicht eine Fehler­
+meldung erhalten, sollten Sie überprüfen, ob die Diskette das rich­
+tige Format besitzt oder Ihr Diskettenlaufwerk Probleme bereitet.
+ Wenn Sie so den Inhalt der Diskette kontrolliert haben, können
+Sie EUDAS installieren. Je nachdem, ob Sie ein Single-User oder ein
+Multi-User System benutzen, sind die Anweisungen unterschiedlich.
+Sie brauchen nur den Sie betreffenden der beiden folgenden Ab­
+schnitte zu lesen. Falls Sie nicht wissen, welches System Sie benut­
+zen: ein Multi-User System wird auf der Systemdiskette und am
+Bildschirm durch die Kennzeichnung 'EUMEL x.y.z/M' identifiziert,
+bei einem Single-User System steht als letztes Zeichen ein 'S'.
+
+
+2.2 Single-User
+
+Dieser Abschnitt betrifft Sie nur, wenn Sie EUDAS auf einem
+Single-User System installieren wollen.
+ Sie können EUDAS immer nur auf einer bestimmten Hinter­
+grunddiskette installieren. Auf dieser Diskette sollten noch min­
+destens 250 KB frei sein (stellen Sie dies durch das Kommando
+'storage info' sicher). EUDAS kann anschließend auch nur auf dieser
+Diskette verwendet werden.
+ Starten Sie nun die gewünschte Diskette. Dann legen Sie die
+Diskette, auf der EUDAS sich befindet, in das Archivlaufwerk. Geben
+Sie dann das Kommando
+
+
+ archive ("EUDAS"); fetch ("eudas.generator", archive); run
+
+
+Sie haben damit das Generatorprogramm gestartet, das die Installa­
+tion automatisch durchführt. Lassen Sie während dieses Vorganges
+das EUDAS-Archiv eingelegt. Sie werden benachrichtigt, wenn die
+Generierung abgeschlossen ist.
+ Wenn Sie EUDAS auf allen Ihren Hintergrunddisketten haben
+möchten, können Sie das so erzeugte System als Muttersystem
+sichern. Mit dem Kommando 'save system' können Sie den Hinter­
+grund komprimiert auf eine leere Archivdiskette schreiben. Mit
+dieser Sicherung können Sie dann jederzeit neue Systemdisketten
+wie von Ihrem Originalsystem herstellen.
+
+#on("b")#Einschränkungen#off("b")# Aus Platzgründen hat die
+Single-User-Version von EUDAS folgende Einschränkungen:
+#free (0.2)#
+ Sie können die Funktionen Ketten und Koppeln nicht verwenden.
+#free (0.2)#
+ Sie können im Druckmuster keine ELAN-Anweisungen und -Aus­
+ drücke verwenden.
+#free (0.2)#
+ Es stehen nur einige allgemeine Hilfstexte zur Verfügung.
+#free (0.2)#
+ Funktionen, die mehrere Tasks vorausssetzen, sind ebenfalls
+ gesperrt.
+#free (0.2)#
+Die betreffenden Funktionen sind zwar gegebenenfalls im Menü
+enthalten, lassen sich aber nicht aufrufen.
+
+
+2.3 Multi-User
+
+Dieser Abschnitt betrifft Sie nur, wenn Sie EUDAS auf einem Mul­
+ti-User System installieren wollen.
+ EUDAS muß in einer bestimmten Task installiert werden. Alle
+neuen Söhne und Enkel dieser Task können dann EUDAS aufrufen.
+Im Normalfall wird diese Task 'PUBLIC' sein.
+ Zum Installieren müssen Sie in diese Task gehen (in diesem
+Beispiel 'PUBLIC'). Dazu rufen Sie durch Tippen der SV-Taste den
+Supervisor und geben das Kommando
+
+
+ continue ("PUBLIC")
+
+
+Stelle Sie mit Hilfe des 'storage info'-Kommandos fest, ob auf Ihrem
+Hintergrund noch mindestens 300 KB frei sind (dieser Platz wird zur
+Generierung benötigt). Dann legen Sie die EUDAS-Archivdiskette ein
+und geben folgendes Kommando
+
+
+ archive ("EUDAS"); fetch ("eudas.generator", archive); run
+
+
+Falls die Task 'PUBLIC' Söhne besitzt, werden Sie gefragt, ob Sie
+diese löschen wollen. EUDAS steht nämlich nur in den Söhnen zur
+Verfügung, die #on("i")#nach#off("i")# der Installation eingerichtet wurden. Antworten
+Sie auf die Frage durch einfaches Tippen von 'j' oder 'n'. wenn Sie
+die Frage verneinen, können Sie die Generierung zu diesem Zeit­
+punkt auch noch abbrechen und zunächst die Söhne aufräumen.
+ Es erscheint die Frage
+
+
+ Ausführliche Hilfstexte installieren ? (j/n)
+
+
+Verneinen Sie die Frage, wenn in Ihrem System der Speicherplatz
+kritisch ist (zum Beispiel wenn Sie keine Festplatte haben). Es
+werden dann nur die wichtigsten allgemeinen Hilfstexte installiert
+(Ersparnis etwa 40 KByte).
+ Anschließend wird die automatische Generierung gestartet.
+Lassen Sie die EUDAS-Archivdiskette eingelegt. Die Generierung ist
+beendet, wenn das EUMEL-Bild erscheint. Die Task, in der die
+Generierung stattfindet, wird automatisch zu einer Managertask, das
+heißt, daß man von ihr Söhne einrichten kann.
+ Sie können das so erweiterte System auch mit 'save system' auf
+einer oder mehreren Archivdiskette sichern. Lesen Sie dazu die
+Hinweise zur Systemsicherung im EUMEL-Systemhandbuch.
+
+#on("b")#Korrekturversionen#off("b")# Falls Sie später einmal eine
+Korrekturversion
+von EUDAS bekommen, sollten Sie vor der neuen Generierung die
+Task, in der EUDAS vorher generiert war, löschen (Vorsicht: alle
+Söhne werden mitgelöscht) und wieder neu einrichten. Anderenfalls
+bleibt die alte Version als unzugängliche "Leiche" auf Ihrem System
+liegen.
+ In diesem Fall und auch, wenn Sie mehrere Programme in der
+gleichen Task installieren, kann es zum Überlauf der internen Über­
+setzertabellen kommen. Für größere Installationen oder wenn Sie
+viele verschiedene Programme benutzen, empfiehlt es sich, zur
+Generierung eine eigene Task 'EUDAS' als Sohn von 'PUBLIC' zu
+verwenden. Sie dürfen dann aber in 'PUBLIC' nicht zu viel insertie­
+ren, da 'EUDAS' ja alle Programme von 'PUBLIC' erbt. Denken Sie
+daran, daß Sie EUDAS nur in Tasks benutzen können, die unter der
+Task 'EUDAS' eingerichtet wurden.
+
+
+
+
+
+
diff --git a/doc/eudas/eudas.hdb.3 b/doc/eudas/eudas.hdb.3
new file mode 100644
index 0000000..e89ff4f
--- /dev/null
+++ b/doc/eudas/eudas.hdb.3
@@ -0,0 +1,515 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (15)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+3 Ein Beispiel zum Ausprobieren
+
+
+
+Bevor Sie in die tieferen Geheimnisse von EUDAS einsteigen, sollen
+Sie in diesem Kapitel erst einige Erfahrungen mit der Bedienung
+sammeln. Dadurch erhalten Sie Sicherheit im Umgang mit dem Pro­
+gramm und haben bereits einen Eindruck dessen, was Sie anschlie­
+ßend erwartet.
+ Das Durchlesen dieses Kapitels ist nur dann sinnvoll, wenn Sie
+die Anweisungen selbst am Rechner ausprobieren. Anderenfalls
+beginnen Sie besser mit dem nächsten Kapitel.
+ Im folgenden sind die Eingaben, die Sie machen sollen, kursiv
+gedruckt, während Ausgaben des Rechners normal erscheinen.
+Außerdem erscheinen spezielle Tasten in spitzen Klammern:
+
+
+ <RET>
+
+
+Bitte tippen Sie nicht die eckigen Klammern oder Großbuchstaben,
+sondern die entsprechende Taste. Oft haben die Sondertasten auch
+etwas andere Bezeichnungen (die obige zum Beispiel 'CR', 'Carriage
+Return', 'RETURN', 'ENTER'). Bitte fragen Sie bei Unklarheiten Ihren
+Systemlieferanten oder -betreuer.
+
+
+3.1 Start
+
+Die Anweisungen zum Starten von EUDAS sind unterschiedlich, je
+nachdem wie Ihr System eingerichtet ist. Bitte beachten Sie daher
+die verschiedenen Fälle.
+
+1. Falls Sie EUDAS nicht selbst installiert haben, fragen Sie am
+ besten Ihren Systembetreuer. Ansonsten verhalten Sie sich wie
+ unter 2.
+
+2. Falls Sie EUDAS nach den Anweisungen von Kapitel 2 in einem
+ Multi-User-System eingerichtet haben, müssen Sie zunächst eine
+ Arbeitstask (Arbeitsbereich) einrichten. Dazu tippen Sie die
+ SV-Taste (diese trägt häufig die unterschiedlichsten Bezeich­
+ nungen). Es erscheint
+
+
+ EUMEL x.y.z/M
+
+ gib supervisor kommando :
+
+
+ Sie tippen nun folgendes Kommando:
+
+
+ #on("i")#begin ("arbeit")#off("i")#<RET>
+
+
+ Vergessen Sie nicht die RETURN-Taste am Schluß. Machen Sie
+ jetzt weiter bei Punkt 4.
+
+3. Falls Sie ein Single-User-System besitzen, starten Sie die
+ Systemdiskette und geben das Datum ein. Dann machen Sie wei­
+ ter mit Punkt 4.
+
+4. Danach erscheint:
+
+
+ gib kommando :
+
+
+ und Sie tippen:
+
+
+ #on("i")#eudas#off("i")#<RET>
+
+
+ Als Ergebnis wird das EUDAS-Eingangsmenü angezeigt (s. Abb.
+ 3-1 auf der nächsten Seite).
+
+
+3.2 Daten eintragen
+
+Als Beispiel sollen Sie eine kleine Adressenkartei einrichten. Der
+Fachausdruck für eine elektronische Kartei ist #on("i")#Datei#off("i")#.
+
+___________________________________________________________________________________________
+
+ EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
+ --------------:
+ EUDAS-Datei :
+ O Öffnen :
+ - Ketten :
+ - Koppeln : EEEEE U U DDDD A SSSS
+ --------------: E U U D D A A S
+ Arbeitskopie : EEE U U D D AAAAA SSS
+ - Sichern : E U U D D A A S
+ --------------: EEEEE UUU DDDD A A SSSS
+ Aktuelle Datei:
+ - Notizen : Version 4.3
+ - Feldstrukt. : Stand: 14.07.87
+ - Prüfbeding. :
+ --------------: (C) Copyright
+ Mehrbenutzer : Thomas Berlage
+ M Manager : Software-Systeme
+ --------------:
+ :
+ :
+ :
+ :
+ :
+ Akt.Datei: Manager: Datum: 22.07.87
+___________________________________________________________________________________________
+
+
+#center#Abb. 3-1 EUDAS-Eingangsmenü
+
+
+ Zunächst müssen Sie eine neue Datei einrichten. Dazu tippen
+Sie die Leertaste. Dadurch wird die invers dargestellte Funktion
+'Öffnen' ausgeführt. Folgen Sie bitte dem nachstehenden Dialog auf
+der rechten Bildschirmseite:
+
+
+ Name der Datei: #on ("i")#Mitglieder#off("i")#<RET>
+ "Mitglieder" neu einrichten ? (j/n) #on("i")#j#off("i")#
+
+
+Unter der Überschrift 'Neue Feldnamen' tippen Sie jetzt folgendes
+(bitte keine Leerstellen vor den Namen tippen):
+
+
+ #on("i")#Name#off("i")#<RET>
+ #on("i")#Vorname#off("i")#<RET>
+ #on("i")#PLZ#off("i")#<RET>
+ #on("i")#Ort#off("i")#<RET>
+ #on("i")#Strasse#off("i")#<RET>
+ #on("i")#m/w#off("i")#<ESC>#on("i")#q#off("i")#
+
+
+Zum Schluß beantworten Sie noch eine Frage:
+
+
+ Feldnamen oder Feldtypen aendern ? (j/n) #on("i")#n#off("i")#
+
+
+Damit ist die neue Datei eingerichtet.
+ Nun tippen Sie die Pfeiltaste <RECHTS>. Es erscheint ein neues
+Menübild (s. Abb. 3-2).
+
+___________________________________________________________________________________________
+
+ EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
+ --------------: Satz 1 .........ENDE... Mitglieder .......... Feld 1
+ Positionieren : Name
+ W Weiter : Vorname
+ Z Zurück : PLZ
+ N Satz.Nr : Ort
+ --------------: Strasse
+ Suchbedingung : m/w
+ S Setzen : ...........................................................
+ L Löschen :
+ M Markierung :
+ --------------:
+ Datensatz :
+ E Einfügen :
+ A Ändern :
+ T Tragen :
+ H Holen :
+ --------------:
+ F Feldauswahl :
+ --------------:
+ :
+ :
+ :
+
+___________________________________________________________________________________________
+
+
+#center#Abb. 3-2 Menü 'Einzelsatz'
+
+
+Nun tippen Sie so lange die Pfeiltaste <UNTEN>, bis die Funktion
+'Einfügen' invers markiert ist. Dann tippen Sie die Leertaste zum Aus­
+führen dieser Funktion. Die Schreibmarke springt nach rechts ins
+Datenfeld zum Eingeben. Geben Sie jetzt den ersten Datensatz wie
+folgt ein:
+
+
+ #on("i")#Wegner#off("i")#<RET>
+ #on("i")#Herbert#off("i")#<RET>
+ #on("i")#5000#off("i")#<RET>
+ #on("i")#Köln#off("i")#<RET>
+ #on("i")#Krämergasse 12#off("i")#<RET>
+ #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
+
+
+Anschließend wird das Datenfeld wieder freigemacht, so daß Sie
+gleich den zweiten Datensatz eingeben können. Dies tun Sie auf die
+gleiche Weise, nur mit anderen Daten:
+
+
+ #on("i")#Sandmann#off("i")#<RET>
+ #on("i")#Helga#off("i")#<RET>
+ #on("i")#5300#off("i")#<RET>
+ #on("i")#Bonn 1#off("i")#<RET>
+ #on("i")#Willicher Weg 109#off("i")#<RET>
+ #on("i")#w#off("i")#<ESC>#on("i")#w#off("i")#
+
+
+Ebenso verfahren Sie dann weiter mit den folgenden Daten. Falls Sie
+sich vertippt haben, können Sie mit den vier Pfeiltasten an die
+entsprechende Stelle gehen und die falschen Buchstaben über­
+schreiben.
+
+
+ #on("i")#Katani#off("i")#<RET>
+ #on("i")#Albert#off("i")#<RET>
+ #on("i")#5210#off("i")#<RET>
+ #on("i")#Troisdorf#off("i")#<RET>
+ #on("i")#Lindenstr. 3#off("i")#<RET>
+ #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
+
+ #on("i")#Ulmen#off("i")#<RET>
+ #on("i")#Peter#off("i")#<RET>
+ #on("i")#5#off("i")#<RET>
+ #on("i")#Köln 60#off("i")#<RET>
+ #on("i")#Mozartstraße 17#off("i")#<RET>
+ #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
+
+ #on("i")#Regmann#off("i")#<RET>
+ #on("i")#Karin#off("i")#<RET>
+ #on("i")#5000#off("i")#<RET>
+ #on("i")#Köln 90#off("i")#<RET>
+ #on("i")#Grengelweg 44#off("i")#<RET>
+ #on("i")#w#off("i")#<ESC>#on("i")#w#off("i")#
+
+ #on("i")#Arken#off("i")#<RET>
+ #on("i")#Hubert#off("i")#<RET>
+ #on("i")#5200#off("i")#<RET>
+ #on("i")#Siegburg#off("i")#<RET>
+ #on("i")#Talweg 12#off("i")#<RET>
+ #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
+
+ #on("i")#Simmern#off("i")#<RET>
+ #on("i")#Anna-Maria#off("i")#<RET>
+ #on("i")#5#off("i")#<RET>
+ #on("i")#Köln 3#off("i")#<RET>
+ #on("i")#Platanenweg 67#off("i")#<RET>
+ #on("i")#w#off("i")#<ESC>#on("i")#w#off("i")#
+
+ #on("i")#Kaufmann-Drescher#off("i")#<RET>
+ #on("i")#Angelika#off("i")#<RET>
+ #on("i")#53#off("i")#<RET>
+ #on("i")#Bonn#off("i")#<RET>
+ #on("i")#Hauptstr. 123#off("i")#<RET>
+ #on("i")#w#off("i")#<ESC>#on("i")#w#off("i")#
+
+ #on("i")#Fuhrmann#off("i")#<RET>
+ #on("i")#Harald#off("i")#<RET>
+ #on("i")#5000#off("i")#<RET>
+ #on("i")#Köln 1#off("i")#<RET>
+ #on("i")#Glockengasse 44#off("i")#<RET>
+ #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
+
+
+Bei der letzten Adresse ist die letzte Taste unterschiedlich, da Sie
+keine weiteren Daten mehr eintragen wollen. Bitte beachten Sie dies.
+
+
+ #on("i")#Seefeld#off("i")#<RET>
+ #on("i")#Friedrich#off("i")#<RET>
+ #on("i")#5000#off("i")#<RET>
+ #on("i")#Köln-Ehrenfeld#off("i")#<RET>
+ #on("i")#Kabelgasse#off("i")#<RET>
+ #on("i")#m#off("i")#<ESC>#on("i")#q#off("i")#
+
+
+Damit die neu eingetragenen Daten permanent gespeichert sind,
+müssen Sie sie #on("i")#sichern#off("i")#. Dazu kehren Sie durch Tippen von <LINKS>
+in das erste Menü zurück. Dort tippen Sie wieder so lange <UNTEN>,
+bis die Funktion 'Sichern' markiert ist. Tippen Sie dann die Leer­
+taste zum Ausführen und folgen dem nachstehenden Dialog:
+
+
+ Arbeitskopie "Mitglieder" veraendert! Sichern ? (j/n) #on("i")#j#off("i")#
+ Alte Version ueberschreiben ? (j/n) #on("i")#j#off("i")#
+ Interne Arbeitskopien loeschen ? (j/n) #on("i")#j#off("i")#
+
+
+Damit steht Ihnen nun eine Mitgliederdatei mit 10 Einträgen zur
+weiteren Verfügung.
+
+
+3.3 Daten abfragen
+
+Um Daten abzufragen, müssen Sie die Datei zunächst wieder öffnen.
+Dazu bewegen Sie die inverse Markierung durch mehrmaliges Tippen
+von <OBEN> nach oben bis zur Funktion 'Öffnen' und tippen Sie die
+Leertaste. Danach ergibt sich folgender Dialog:
+
+
+ Name der Datei: #on("i")#Mitglieder#off("i")#<RET>
+ Wollen Sie etwas aendern (eine Arbeitskopie einrichten)
+ ? (j/n) #on("i")#n#off("i")#
+
+
+Danach gehen Sie durch Tippen von <RECHTS> in das zweite Menü.
+Dort erscheint jetzt die zehnte Adresse.
+ Zunächst sollen Sie an den Anfang gehen. Dazu schieben Sie
+die Markierung auf die Funktion 'Satz.Nr' mit Hilfe der Pfeiltasten
+und tippen dann die Leertaste. Nach folgender Angabe
+
+
+ Neue Satznummer: #on("i")#1#off("i")#<RET>
+
+
+erscheint die erste Adresse. Nun sollen Sie nach der Adresse von
+Harald Fuhrmann suchen. Dazu bringen Sie die Markierung auf die
+Funktion 'Suchbedingung Setzen' und tippen die Leertaste. Die
+Schreibmarke springt wieder in das Datenfeld. Dort geben Sie ein:
+
+
+ #on("i")#Fuhrmann#off("i")#<ESC>#on("i")#q#off("i")#
+
+
+In der markierten Überschrift erscheint 'SUCH-' zum Zeichen, daß
+eine Suchbedingung eingestellt ist. Dann schieben Sie die Markie­
+rung auf die Funktion 'Weiter' und tippen die Leertaste. Kurz da­
+nach erscheint die Adresse von Herrn Fuhrmann mit dem Hinweis
+'SUCH+' (gefunden).
+ Führen Sie dann die Funktion 'Zurück' aus (Verschieben der
+Markierung und Tippen der Leertaste). Es erscheint wieder die erste
+Adresse mit dem Hinweis 'SUCH-' (kein weiterer Fuhrmann gefun­
+den). Führen Sie dann die Funktion `Suchbedingung Löschen' aus.
+Der 'SUCH'-Hinweis verschwindet wieder.
+ Als nächstes sollen Sie die Daten nach allen weiblichen Mit­
+gliedern durchsuchen. Dazu führen Sie wieder die Funktion 'Such­
+bedingung Setzen' aus. Diesmal tippen Sie im Datenfeld fünfmal die
+Pfeiltaste <UNTEN>, bis die Schreibmarke neben der Bezeichnung
+'m/w' steht. Dort tippen Sie
+
+
+ #on("i")#w#off("i")#<ESC>#on("i")#q#off("i")#
+
+
+Wenn Sie jetzt die Funktion 'Weiter' ausführen, erscheint das erste
+weibliche Mitglied, Frau Sandmann. Da aber noch weitere Frauen in
+der Datei vorkommen, führen Sie erneut 'Weiter' aus und es erschei­
+nen die nächsten weiblichen Mitglieder.
+ Wenn kein gesuchtes Mitglied mehr gefunden wurde, erscheint
+ein leeres Datenfeld mit den Bezeichnungen 'ENDE' und 'SUCH-' in
+der Überschrift. Durch mehrmaliges Ausführen von 'Zurück' können
+Sie die weiblichen Mitglieder wieder in der umgekehrten Reihenfolge
+ansehen, bis Sie an den Anfang der Datei kommen.
+ Bitte lassen Sie die Suchbedingung eingestellt, denn im näch­
+sten Abschnitt wollen wir alle weiblichen Mitglieder ausdrucken.
+
+
+3.4 Drucken
+
+Zuerst begeben Sie sich durch zweimaliges Tippen von <RECHTS> in
+das Druckmenü, das in Abb. 3-3 gezeigt wird.
+
+___________________________________________________________________________________________
+
+ EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
+ --------------:
+ Satzauswahl :
+ D Drucken :
+ --------------:
+ Druckausgabe :
+ R Richtung :
+ --------------:
+ Textdatei :
+ E Editieren :
+ A Ausdrucken :
+ N Nachbearb. :
+ --------------:
+ :
+ :
+ :
+ :
+ :
+ :
+ :
+ :
+ :
+ :
+ Akt.Datei: "Mitglieder" Datum: 22.07.87
+___________________________________________________________________________________________
+
+
+#center#Abb. 3-3 Menü 'Drucken'
+
+
+Zunächst müssen Sie ein Druckmuster erstellen, das angibt, wie der
+Druck aussehen soll. Dazu führen Sie die Funktion 'Textdatei Edi­
+tieren' aus. Es erscheint die Aufforderung:
+
+
+ Name der Datei: #on("i")#liste#off("i")#<RET>
+
+
+Dann wird der Bildschirm gelöscht und Sie können folgendes einge­
+ben:
+
+
+ #on("i")#% VORSPANN#off ("i")#<RET>
+ #on("i")#Liste der weiblichen Mitglieder#off ("i")#<RET>
+ #on("i")#-------------------------------#off ("i")#<RET>
+ #on("i")#% WIEDERHOLUNG#off ("i")#<RET>
+ #on("i")#&Vorname %Name#off ("i")#<ESC>#on("i")#q#off("i")#
+
+
+Ebenso wie beim Eingeben von Daten können Sie hier mit den Pfeil­
+tasten auf fehlerhafte Stellen zurückgehen und dort korrigieren.
+ Nun sollten Sie sich vergewissern, ob Ihr Drucker eingeschaltet
+und bereit (Ready) ist. Falls Sie keinen Drucker haben, folgen Sie
+bitte den Anweisungen unter 2. Anderenfalls gehen Sie wie folgt
+vor.
+
+1. Rufen Sie die Funktion 'Richtung' auf und beantworten Sie
+ folgende Frage:
+
+
+ Ausgabe automatisch zum Drucker ? (j/n) #on("i")#j#off("i")#
+
+
+ Dann rufen Sie die Funktion 'Drucken' auf und geben den Namen
+ des Druckmusters an:
+
+
+ Name des Druckmusters: #on("i")#liste#off ("i")#<RET>
+
+
+ Als Ergebnis sollte folgende Liste auf Ihrem Drucker erscheinen:
+
+
+ Liste der weiblichen Mitglieder
+ -------------------------------
+ Helga Sandmann
+ Karin Regmann
+ Anna-Maria Simmern
+ Angelika Kaufmann-Drescher
+
+
+2. Rufen Sie die Funktion 'Richtung' auf und beantworten Sie
+ folgende Fragen:
+
+
+ Ausgabe automatisch zum Drucker ? (j/n) #on("i")#n#off("i")#
+ Ausgabe in bestimmte Datei ? (j/n) #on("i")#n#off("i")#
+
+
+ Dann rufen Sie die Funktion 'Drucken' auf und geben den Namen
+ des Druckmusters an:
+
+
+ Name des Druckmusters: #on("i")#liste#off ("i")#<RET>
+
+
+ Nach dem Ende des Druckprozesses (wenn das Sternchen vor
+ 'Drucken' wieder durch ein 'D' ersetzt worden ist), rufen Sie
+ wieder die Funktion 'Textdatei Editieren' auf und geben folgen­
+ den Namen an:
+
+
+ Name der Datei: #on("i")#liste.a$1#off("i")#<RET>
+
+
+ Es erscheint die gleiche Ausgabe wie unter 1 beschrieben auf
+ dem Bildschirm. Wenn Sie die Ausgabe genug gesehen haben,
+ kehren Sie durch
+
+
+ <ESC>#on("i")#q#off("i")#
+
+
+ wieder in das Menü zurück.
+
+
+3.5 Ergebnis
+
+Da Sie sich wieder im Menü befinden, könne Sie EUDAS durch
+
+ <ESC>#on("i")#q#off("i")#
+
+wieder verlassen. Danach können Sie Ihre Sitzung beenden, etwas
+Anderes tun oder EUDAS erneut aufrufen.
+
+ Sie haben nun selbst ausprobiert, wie Sie unter EUDAS Daten
+eingeben können, wie Sie diese Daten abrufen und in ihnen suchen
+können. Sie haben die Daten auch schon ausgedruckt.
+ Damit Sie besser verstehen, was Sie soeben gemacht haben,
+werden Sie in den folgenden vier Kapiteln die Grundfunktionen von
+EUDAS mit den dazugehörigen Erläuterungen kennenlernen.
+ Danach können Sie dann selber Ihre eigene Anwendung entwer­
+fen und EUDAS zu Ihrer Arbeitserleichterung einsetzen.
+
+
+
+
+
+
diff --git a/doc/eudas/eudas.hdb.5 b/doc/eudas/eudas.hdb.5
new file mode 100644
index 0000000..b5927ea
--- /dev/null
+++ b/doc/eudas/eudas.hdb.5
@@ -0,0 +1,386 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (43)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+5 Gespeicherte Daten abfragen
+
+
+
+5.1 Öffnen
+
+Als letzte Vorbereitung, bevor Sie mit der Adreßdatei spielen kön­
+nen, müssen Sie die Datei wie einen Karteikasten #on("i")#öffnen#off("i")#. Nach dem
+Öffnen beziehen sich alle weiteren Funktionen auf die gerade ge­
+öffnete Datei. Aus diesem Grund darf auch immer nur eine einzige
+Datei geöffnet sein - als hätte auf Ihrem Schreibtisch nur ein Kar­
+teikasten Platz.
+ Dazu wählen Sie jetzt wieder das erste Menü an. Dort finden
+Sie die Funktion
+#free (0.2)#
+
+ O Öffnen
+
+#free (0.2)#
+Wählen Sie diese Funktion aus. Dann drücken Sie die Leertaste, um
+die Funktion auszuführen. Als erstes erscheint im unteren Teil des
+Bildschirms eine Frage:
+
+___________________________________________________________________________________________
+
+ Wollen Sie etwas aendern (eine Arbeitskopie anlegen) (j/n) ?
+___________________________________________________________________________________________
+
+
+Der Cursor bleibt hinter der Frage stehen. Sie kennen diesen Frage­
+zustand ja schon.
+ In diesem Fall wollen Sie an der Spieldatei nichts verändern,
+Sie beantworten die Frage also mit einem 'n'. Als nächstes werden
+Sie nach dem Namen gefragt (Beachten Sie auch hier wieder die
+Statuszeile).
+ Tippen Sie nun 'Adressen' und beenden Sie die Eingabe mit
+RETURN. EUDAS öffnet die Datei und kehrt zum Menü zurück. Alter­
+nativ können Sie die Datei auch in einer Auswahl ankreuzen, wenn
+Sie ESC 'z' tippen.
+
+#on("b")#Fußzeile#off("b")# Nach der Ausführung dieser Funktion sollten Sie
+Ihre
+Aufmerksamkeit auf die letzte Zeile des Bildschirms richten. Hier
+finden Sie jetzt folgendes vor:
+
+___________________________________________________________________________________________
+
+ Akt.Datei: "Adressen" Manager: Datum: 22.07.87
+___________________________________________________________________________________________
+
+
+Neben dem Datum und dem eingestellten Manager (dies kommt viel
+später) sehen Sie hier, welche Datei Sie geöffnet haben und nun
+bearbeiten können. Diese Fußzeile finden Sie auch in den ande­
+ren Menüs. Lediglich die mittlere Angabe ändert sich bei den ande­
+ren Menüs (eine Erläuterung dazu finden Sie in späteren Kapiteln).
+
+#on("b")#Anzeige#off("b")# Zum Anzeigen der Daten in der Adreßdatei müssen Sie
+das
+zweite Menü 'Einzelsatz' anwählen (durch Drücken der Pfeiltaste
+RECHTS). Am linken Rand erscheint das neue Menü mit den Anzei­
+gefunktionen. Der Rest des Bildschirms enthält das Formular für die
+Adreßdatei mit den Daten des ersten Satzes. Abbildung 5-1 zeigt
+das Bild, das sich dann ergibt.
+
+___________________________________________________________________________________________
+
+ EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
+ --------------: Satz 1 ................... Adressen ....... Zeile 1
+ Positionieren : Name Wegner
+ W Weiter : Vorname Herbert
+ Z Zurück : PLZ 5000
+ N Satz.Nr : Ort Köln
+ --------------: Strasse Krämergasse 12
+ Suchbedingung : m/w m
+ S Setzen : ...........................................................
+ L Löschen :
+ M Markierung :
+ --------------:
+ Datensatz :
+ - Einfügen :
+ - Ändern :
+ - Tragen :
+ - Holen :
+ --------------:
+ F Feldauswahl :
+ --------------:
+ :
+ :
+ :
+
+___________________________________________________________________________________________
+
+
+#center#Abb. 5-1 Menü 'Einzelsatz'
+
+
+Das automatisch generierte Formular zeigt immer genau einen Satz.
+Das Formular besteht aus drei Teilen: der Überschrift, dem Feldteil
+und der Abschlußzeile. In der #on("i")#Überschrift#off("i")# steht der Name der Datei
+("Adressen"), die Satznummer (1) und die Nummer der ersten ange­
+zeigten Zeile (immer 1, außer wenn die Datei mehr Felder hat, als
+auf den Bildschirm passen). In manchen Fällen können auch noch
+weitere Informationen dort auftauchen, wie wir später sehen wer­
+den.
+ Im #on("i")#Feldteil#off("i")# befindet sich der eigentliche Inhalt, und zwar sind
+links markiert die Feldnamen zu sehen, während rechts die zugehö­
+rigen Inhalte des betreffenden Satzes stehen. Dieses Bild ähnelt
+einer Karteikarte mit einem festen Format.
+ Die #on("i")#Abschlußzeile#off("i")# am Ende gibt an, daß für diesen Satz keine
+weiteren Informationen mehr vorhanden sind. Wir werden aber spä­
+ter noch sehen, wie man anderenfalls die restlichen Informatio­
+nen sichtbar machen kann.
+
+
+5.2 Bewegen
+
+Nun wollen Sie nicht immer nur einen Satz betrachten (das wäre ja
+furchtbar langweilig). Daher müssen Sie die Möglichkeit haben, sich
+in der Datei zu "bewegen". Dies geschieht mit Hilfe der beiden
+Funktionen
+#free (0.2)#
+
+ W Weiter
+
+#free (0.2)#
+und
+#free (0.2)#
+
+ Z Zurück
+
+#free (0.2)#
+Sie haben die Wirkung, daß der Satz mit der nächsthöheren bzw.
+nächstniedrigeren Satznummer angezeigt wird. Natürlich funktioniert
+dies nur, wenn noch ein Satz vorhanden ist: am Anfang (Satz 1)
+können Sie nicht zurückgehen. In diesem Fall ignoriert EUDAS Ihren
+Befehl einfach.
+ Wenn Sie bis zum Ende der Datei gehen (keine Angst - diese
+Datei enthält nur 10 Sätze), werden Sie feststellen, daß zum Schluß
+ein ganz leerer Satz erscheint. Dieser Satz ist eine Art Endemarkie­
+rung; er informiert Sie, daß keine weiteren Sätze vorhanden sind.
+Dieser Satz ist aber kein richtiger Satz, daher wird in der Über­
+schrift 'ENDE' angezeigt. (Wenn Ihnen diese Art Endemarkierung
+merkwürdig erscheint: sie hat schon einen triftigen Grund, s.6.2).
+ Um einen Satz mit bekannter Satznummer gezielt anzuwählen,
+können Sie die Funktion
+#free (0.2)#
+
+ N Satz.Nr
+
+#free (0.2)#
+verwenden. Sie müssen anschließend die Satznummer eingeben (Bitte
+mit RETURN beenden). Ist der Satz vorhanden, erscheint dieser,
+ansonsten stehen Sie am Ende der Datei.
+
+#on("b")#Aufruf über Buchstaben#off("b")# Vielleicht ist Ihnen inzwischen
+schon
+aufgefallen, daß vor jeder Funktion in einem Menü ein Buchstabe
+steht. Damit hat es folgendes auf sich: da das Positionieren des
+Cursors zum Auswählen einer Funktion mehrere Tastendrücke erfor­
+dern kann, haben Sie die Möglichkeit, jede Funktion auch über
+einen Buchstaben auszuführen.
+ Dies ist besonders dann sinnvoll, wenn Sie mit den eben be­
+sprochenen Funktionen schnell in der Datei "blättern" wollen. An­
+dererseits müssen Sie sich aber für eine schnelle Reaktion auch
+einige der Tasten merken. Für die Praxis empfiehlt sich folgender
+Kompromiß: die meistgebrauchten Funktionen über Buchstaben und
+der Rest durch Positionieren im Menü.
+
+
+5.3 Suchen
+
+Stellen Sie sich vor, die Datei wäre größer und Sie müßten eine
+bestimmte Adresse heraussuchen. Dazu würden Sie durch die ganze
+Datei durchgehen, bis die gewünschte Adresse erscheint. Das wäre
+natürlich bei vielen Adressen eine ungeheuer mühselige Arbeit, die
+mit einem Karteikasten wahrscheinlich schneller zu erledigen wäre.
+ EUDAS bietet Ihnen jedoch die Möglichkeit, nach bestimmten
+Sätzen zu suchen. Dazu müssen Sie angeben, wonach gesucht werden
+soll. Als Beispiel wollen wir die Adresse von Frau Simmern su­
+chen. Bewegen Sie sich zunächst zurück bis auf den ersten Satz.
+Dann wählen Sie die Funktion
+#free (0.2)#
+
+ Suchbedingung
+ S Setzen
+
+#free (0.2)#
+Auf dem Bildschirm verschwinden die Feldinhalte und der Cursor
+steht hinter dem ersten Feldnamen. Dies bedeutet, daß Sie neben
+die Feldnamen etwas schreiben können. Auch in der Statuszeile
+erscheint statt der Anzeige der Menünamen ein Hinweis auf die
+Eingabemöglichkeit (s. Abb. 5-2). Sie befinden sich jetzt in einem
+Zustand, in dem Sie hinter die Feldnamen etwas schreiben können
+(dem sogenannten #on("i")#Satzeditor#off("i")#).
+ Als Angabe, was gesucht werden soll, schreiben Sie jetzt in der
+ersten Zeile neben 'Name' die Bedingung 'Simmern'. Sie haben jetzt
+ein einfaches #on("i")#Suchmuster#off("i")# angegeben. Ein Suchmuster besteht aus
+Bedingungen, die neben die Feldnamen geschrieben werden. Unser
+einfaches Suchmuster lautet übersetzt:
+
+ Wähle alle Sätze aus, bei denen 'Simmern' im Feld 'Name'
+ steht.
+
+Beenden Sie die Eingabe des Suchmusters mit ESC 'q'. Es erscheint
+wieder das vorherige Bild, mit dem Unterschied, daß jetzt in der
+Überschrift ein 'SUCH-' auftaucht. EUDAS steht immer noch auf dem
+ersten Satz.
+ Die Anzeige 'SUCH' gibt an, daß ein Suchmuster eingestellt
+wurde. Das Minuszeichen bedeutet, daß der aktuelle Satz die Such­
+bedingung jedoch #on("i")#nicht#off("i")# erfüllt.
+
+___________________________________________________________________________________________
+
+ SUCHMUSTER EINGEBEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
+ --------------: Satz 1 .................... ............... Zeile 1
+ Positionieren : Name Simmern
+ W Weiter : Vorname
+ Z Zurück : PLZ
+ N Satz.Nr : Ort
+ --------------: Strasse
+ Suchbedingung : m/w
+ * Setzen : ...........................................................
+ L Löschen :
+ M Markierung :
+ --------------:
+ Datensatz :
+ - Einfügen :
+ - Ändern :
+ - Tragen :
+ - Holen :
+ --------------:
+ F Feldauswahl :
+ --------------:
+ :
+ :
+___________________________________________________________________________________________
+
+
+#center#Abb. 5-2 Eingabe eines Suchmusters
+
+
+#on("b")#Positionierung#off("b")# Das Suchen beginnt erst, wenn Sie sich in
+der Datei
+bewegen. In diesem Fall erhalten die Funktionen 'Satz weiter' und
+'Satz zurück' eine etwas geänderte Bedeutung. Sie gehen nämlich
+nicht einfach zum nächsten bzw. vorigen Satz, sondern zum näch­
+sten bzw. vorigen Satz.
+ Als Indikator, daß Sie sich auf dem gesuchten Satz befinden,
+dient die Anzeige 'SUCH+'. Probieren Sie dies jetzt aus, indem Sie
+weitergehen. Als nächster Satz erscheint der gewünschte Satz 7. Die
+nicht ausgewählten Sätze wurden also übersprungen. Das gleiche
+passiert, wenn Sie noch weiter gehen. Da kein passender Satz mehr
+vorhanden ist, erscheint der leere Endesatz.
+
+#limit (12.0)#
+ Denken Sie daran, daß das Einstellen der Suchbedingung
+ noch keine Suche bewirkt. Diese müssen Sie selbst
+ durch Positionieren mit 'Weiter' oder 'Zurück' auslösen.
+#limit (13.5)#
+
+Sollten Sie sich nicht am Anfang der Datei befinden, wenn Sie eine
+Suchbedingung einstellen, kann es sein, daß sich der gesuchte Satz
+vor oder hinter der aktuellen Position befindet. In diesem Fall
+müssen Sie entscheiden, ob Sie vorwärts oder rückwärts gehen.
+Wenn Sie rückwärts gehen und der Satz ist nicht in diesem Ab­
+schnitt, erscheint der erste Satz mit der Anzeige 'SUCH-'. Gehen Sie
+dann wieder vorwärts, finden Sie den Satz auf jeden Fall.
+ Die Funktion 'Satz.Nr' richtet sich natürlich nicht nach der
+eingestellten Bedingung, da Sie ja eine bestimmte Satznummer wün­
+schen. Aus der 'SUCH'-Anzeige können Sie jedoch entnehmen, ob
+die Suchbedingung auf diesen Satz zutrifft.
+
+#on("b")#Suchbedingung löschen#off("b")# Wollen Sie wieder alle Sätze sehen,
+müssen Sie die Funktion
+#free (0.2)#
+
+ Suchbedingung
+ L Löschen
+
+#free (0.2)#
+auswählen. Die Anzeige 'SUCH' verschwindet wieder, um anzudeu­
+ten, daß keine Suchbedingung mehr eingestellt ist.
+
+#on("b")#Beispiel#off("b")# Um den Charakter einer Selektion nochmal deutlich
+zu
+machen, sollen Sie jetzt eine Bedingung einstellen, die auf mehrere
+Sätze zutrifft. Dies hätte uns auch eben passieren können, wenn es
+mehrere Simmern gegeben hätte. Wir können zum Beispiel alle weib­
+lichen Personen auswählen.
+ Als erstes löschen Sie die alte Suchbedingung. Tun Sie dies
+nicht, wird Ihnen beim nächsten Eingeben das alte Suchmuster zum
+Ändern angeboten. Dies ist praktisch, wenn ein Suchmuster nicht
+den erhofften Erfolg brachte und Sie es modifizieren wollen.
+ Danach wählen Sie erneut die Funktion 'Suchbedingung setzen'.
+Nun bewegen Sie den Cursor mit der Pfeiltaste UNTEN neben den
+Feldnamen 'm/w'. Dort tragen Sie die Bedingung 'w' ein. Verlassen
+Sie die Eingabe mit ESC 'q'.
+ Wenn Sie sich jetzt in der Datei bewegen, sehen Sie, daß immer
+nur weibliche Personen angezeigt werden - die männlichen werden
+unterdrückt (in Umkehrung der Realität).
+
+
+ ! 1 ! ! 3 ! 4 ! ! 6 !
+ +-----+-----+-----+-----+-----+-----+-----+
+ !Name ! .. ! ! .. ! .. ! ! .. !
+ ! ! ! ! ! ! ! !
+ : : : : :
+ ! ! ! ! ! ! ! !
+ !m/w ! w ! ! w ! w ! ! w !
+ +-----+-----+ +-----+-----+ +-----+
+
+#center#Abb. 5-3 Wirkung einer Selektion
+
+
+
+5.4 Suchbedingungen
+
+Im letzten Abschnitt haben Sie gesehen, wie das Einstellen einer
+Suchbedingung funktioniert. In diesem Abschnitt sollen Sie weitere
+Möglichkeiten zur Formulierung von Suchmustern kennenlernen.
+ Die erste Möglichkeit kennen Sie schon. Wenn neben einen
+Feldnamen ein Text geschrieben wird, bedeutet dies, daß ausge­
+wählte Sätze im Inhalt dieses Feldes mit dem Text übereinstimmen
+müssen.
+
+#on("b")#Kombination#off("b")# Nun kann es sein, daß mehrere Bedingungen
+gelten
+müssen. Im ersten Beispiel des vorigen Abschnitts hätten wir zum
+Beispiel auch noch den Vornamen 'Anna-Maria' angeben können, um
+bei mehreren Simmern die richtige auszuwählen. Wird also in mehre­
+re Felder eine Bedingung geschrieben, müssen alle diese Bedingun­
+gen gleichzeitig zutreffen.
+ Würden Sie in unserem Beispiel noch als dritte Bedingung 'm'
+für das Feld 'm/w' angeben, würde gar kein Satz mehr ausgewählt,
+da Anna-Maria Simmern natürlich nicht männlich ist. Auch das
+kann also passieren.
+
+
+ Name Simmern
+ Vorname Anna-Maria
+ ..
+ ..
+ m/w m
+
+#center#Abb. 5-4 Kombination von Bedingungen
+
+
+#on("b")#Stern#off("b")# Die Bedingungen, die wir bis jetzt kennengelernt
+haben,
+müssen alle ganz exakt zutreffen. Häufig tritt aber der Fall auf,
+daß der gesuchte Name nicht genau bekannt ist. In diesem Fall
+kann der Name im Suchmuster auch teilweise eingegeben werden.
+Der unbekannte Teil am Anfang oder am Ende wird einfach durch
+einen Stern markiert.
+ Wenn Sie also als Bedingung 'Sim*' für den Namen angeben, so
+würde dies auf den Namen Simmern zutreffen, aber zum Beispiel
+auch auf Simmerath oder Simon. Die Bedingung '*mern' würde nicht
+nur auf Simmern zutreffen, sondern auch auf Pommern.
+ Der Stern kann aber auch für einen leeren Text stehen. So
+trifft 'Simmern*' auf Simmern zu, aber auch auf Doppelnamen. die
+mit Simmern beginnen. Wissen Sie jetzt nicht, ob Simmern in dem
+Doppelnamen vorne oder hinten erscheint, können Sie auch an bei­
+den Seiten einen Stern machen. Die Bedingung '*Simmern*' trifft
+nicht nur auf Simmern, sondern sowohl auf Deckerath-Simmern als
+auch auf Simmern-Jakob zu.
+ Es gibt noch eine Reihe von weiteren Möglichkeiten, Bedingun­
+gen im Suchmuster zu formulieren. Auch komplexe Kombinationen
+von Bedingungen sind möglich. Mit dem bisher Besprochenen sollten
+Sie aber in vielen Fällen auskommen. Die übrigen Möglichkeiten
+werden in Abschnitt 10.2 erklärt. Schauen Sie bei Bedarf dort nach.
+
+
diff --git a/doc/eudas/eudas.hdb.6 b/doc/eudas/eudas.hdb.6
new file mode 100644
index 0000000..e617881
--- /dev/null
+++ b/doc/eudas/eudas.hdb.6
@@ -0,0 +1,394 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (51)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+6 Daten eingeben und ändern
+
+
+
+6.1 Neue Datei einrichten
+
+Nachdem Sie sich bis jetzt an einer existierenden Datei erprobt
+haben, können Sie nun dazu übergehen, eine eigene neue Datei
+einzurichten. Als Beispiel sollen Sie ein kleines Telefonregister
+erstellen.
+ Dazu gehen Sie wieder in das Menü 'Öffnen' zurück und wäh­
+len erneut die Funktion
+#free (0.2)#
+
+ O Öffnen
+
+#free (0.2)#
+indem Sie mehrmals OBEN tippen, bis die Funktion markiert. Dann
+tippen Sie die Lerrtaste zum Ausführen. Als Dateinamen geben Sie
+'Telefonnummern' an.
+ Da die Datei 'Telefonnummern' noch nicht existiert, werden Sie
+gefragt:
+
+
+ "Telefonnummern" neu einrichten ? (j/n) #on("i")#j#off("i")#
+
+
+Es kann ja sein, daß Sie sich vertippt haben und eine andere,
+existierende Datei meinten. In unserem Fall wird die Datei aber
+wirklich neu eingerichtet, daher bejahen Sie die Frage.
+
+#on("b")#Feldnamen eingeben#off("b")# Wenn Sie beim Öffnen eine Datei neu
+einrich­
+ten, müssen Sie zuerst die Feldnamen festlegen, zum Beispiel diese:
+
+
+ 'Name'
+ 'Vorname'
+ 'Strasse'
+ 'PLZ'
+ 'Ort'
+ 'Telefon'
+ 'Bemerkungen'
+
+
+Ihnen wird jetzt Gelegenheit gegeben, die Feldnamen untereinander
+einzugeben. Zur Korrektur können Sie die gleichen Tasten verwen­
+den wie im Editor (beachten Sie dazu die Statuszeile am oberen
+Bildschirmrand.
+ Geben Sie die Namen in dieser Reihenfolge ein. Tippen Sie nach
+jedem Namen die RETURN-Taste, damit der nächste Name in eine
+neue Zeile kommt. Beenden Sie die Eingabe mit ESC 'q'.
+ Die folgende Frage ermöglicht es Ihnen, noch weitere Eigen­
+schaften der Felder festzulegen. Dies ist jedoch im Normalfall nicht
+nötig. Beantworten Sie also die Frage mit 'n'. Ihre Datei ist nun
+eingerichtet.
+ Wie Sie sehen, besteht das Einrichten einer Datei eigentlich
+nur aus der Eingabe der Feldnamen. Wenn Sie später noch Felder
+anfügen wollen, ist dies ohne weiteres möglich.
+
+
+6.2 Sätze Einfügen
+
+Nachdem die Datei nun eingerichtet worden ist, sollen Sie zunächst
+einige Sätze eingeben. Wenn Sie wieder das Menü 'Einzelsatz' an­
+wählen, sehen Sie nur den leeren Satz mit der Anzeige 'ENDE', der
+das Dateiende markiert. Um neue Sätze aufzunehmen, gibt es die
+Funktion
+#free (0.2)#
+
+ E Einfügen
+
+#free (0.2)#
+Wenn Sie diese Funktion aufrufen, geschieht etwas Ähnliches wie
+beim Eingeben des Suchmusters. Der Cursor wandert wieder hinter
+den ersten Feldnamen und in der Statuszeile erscheint die Auffor­
+derung
+
+___________________________________________________________________________________________
+
+ SATZ EINFUEGEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
+___________________________________________________________________________________________
+
+
+Sie können nun die Feldinhalte der einzelnen Felder neben die
+entsprechenden Feldnamen schreiben. Mit der RETURN-Taste schlie­
+ßen Sie eine Zeile ab und gelangen in die nächste.
+ Um eventuelle falsche Eingaben zu korrigieren, können Sie
+ähnlich wie im Editor mit den Pfeiltasten herumfahren und falsche
+Eingaben überschreiben. Die Taste RUBOUT löscht falsche Zeichen.
+Sie beenden die Eingabe mit ESC 'q'. Anschließend ist der neue Satz
+vorhanden.
+
+
+#free (4.5)#
+
+#center#Abb. 6-1 Einfügen
+
+
+#on("b")#Wirkung#off("b")# Die Wirkungsweise der Funktion 'Einfügen'
+verdeutlicht
+die Abb. 6-1. Dargestellt ist ein Ausschnitt aus einer Datei mit den
+Sätzen 4 bis 7 und durch Buchstaben dargestellten, beliebigen In­
+halten. Satz 6 sei der aktuelle Satz.
+ Beim Einfügen wird nun vor dem aktuellen Satz eine Lücke für
+den neuen Satz geschaffen, die zunächst noch leer ist und dann von
+Ihnen ausgefüllt werden muß. Die Satznummern aller folgenden Sätze
+erhöhen sich um 1.
+ Die Leerstelle bleibt nur dann erhalten, wenn Sie Daten für den
+neuen Satz eingeben. Anderenfalls wird nach ESC 'q' wieder der alte
+Zustand hergestellt.
+ Dieses Verfahren erklärt auch, warum das Ende der Datei ein
+leerer Pseudosatz ist. Um nämlich am Ende der Datei einen neuen
+Satz anzufügen, muß man vor dem Endesatz einen Satz einfügen.
+ Nachdem Sie also jetzt den ersten Satz eingegeben haben,
+müssen Sie sich wieder zum Ende bewegen, damit der nächste Satz
+hinter dem ersten steht. Für diesen häufig benötigten Vorgang gibt
+es eine Abkürzung: Wenn Sie die Eingabe mit ESC 'w' (Weiter) statt
+ESC 'q' beenden, geht EUDAS nach dem Einfügen des Satzes weiter
+zum nächsten und fügt dort wieder einen Satz ein.
+ Auf diese Weise können Sie also schnell eine ganze Reihe von
+Sätzen nacheinander eingeben. Nachdem Sie einen Satz eingegeben
+haben, tippen Sie ESC 'w' und können gleich anschließend schon mit
+der Eingabe des nächsten Satzes beginnen. Alle so eingegebenen
+Sätze erscheinen nachher in der Reihenfolge der Eingabe.
+
+#on("b")#Satzeditor#off("b")# Bei der Eingabe eines neuen Satzes haben Sie
+nahezu
+alle Möglichkeiten, die auch der EUMEL-Editor bietet. Der be­
+schreibbare Bereich ist jedoch kleiner. Er umfaßt das ganze Gebiet,
+in dem sonst die Feldinhalte erscheinen.
+ Wie beim Editor können Sie den Cursor mit den Cursortasten
+(Pfeiltasten) bewegen. Mit der Taste RUBOUT können Sie ein Zeichen
+löschen. Die restlichen Zeichen der Zeile rücken dann nach. Mit
+RUBIN dagegen schalten Sie in einen Einfügemodus um. Alle einge­
+gebenen Zeichen werden dann eingefügt - der Rest der Zeile rückt
+entsprechend nach rechts. Nochmaliges Tippen von RUBIN schaltet
+wieder in den alten Modus. Welcher Modus eingeschaltet ist, steht
+in der Überschriftzeile.
+ Mit der Kombination ESC RUBOUT können Sie den Rest einer
+Zeile ab der Cursorposition löschen. Steht der Cursor in der ersten
+Spalte, wird dementsprechend die ganze Zeile gelöscht. Im Unter­
+schied zum EUMEL-Editor rücken die folgenden Zeilen jedoch nicht
+herauf.
+ Entsprechend fügen Sie mit der Funktion ESC RUBIN eine neue
+Zeile ein. Dies ist immer dann erforderlich, wenn ein Feldinhalt
+nicht auf eine Zeile paßt. Der Teil der Zeile, der hinter dem Cursor
+steht, wird bei ESC RUBIN in die neue Zeile mitgenommen.
+ Normalerweise tippen Sie ESC RUBIN, wenn Sie an das Ende
+einer Zeile kommen. Wenn Sie aber weiterschreiben, wird die Zeile
+einfach gerollt. Dies ist nicht weiter schlimm, aber Sie können den
+ganzen Feldinhalt nicht auf einmal sehen.
+ In der normalen Anzeige wird ein überlanger Inhalt auf jeden
+Fall auf mehrere Zeilen verteilt.
+
+#on("b")#Warnung#off("b")# Ein Hinweis für alle, die sich mit der
+Editorbedienung
+schon auskennen: EUDAS benutzt den Editor als Unterprogramm.
+Jedoch haben einige Editorfunktionen unliebsame Auswirkungen.
+Besonders gefährlich sind hier HOP RUBOUT und HOP RUBIN. Diese
+Funktion zerstören die Korrespondenz zwischen Feldnamen und
+Feldinhalten, das heißt der Feldinhalt steht nicht mehr neben dem
+Feldnamen.
+ Weiterhin können Sie das Editorbild rollen, ohne daß die Feld­
+namen mitrollen (zum Beispiel wenn Sie in der untersten Zeile
+RETURN drücken). In diesem Fall ist die Korrespondenz auch nicht
+erhalten, das heißt die Inhalte stehen falsch, sind aber eigentlich
+richtig.
+ In solchen Fällen erscheint am oberen oder unteren Rand der
+Hinweis "Bitte ESC '1' druecken". Wenn das Editorbild nur gerollt
+wurde, verschwindet durch ESC '1' der Hinweis wieder und das Bild
+ist in Ordnung. Wenn jedoch Zeilen gelöscht oder eingefügt wurden,
+müssen Sie diese Änderungen von Hand wieder rückgängig machen,
+bis der Hinweis verschwindet. Sie sollten also HOP RUBOUT und HOP
+RUBIN im Satzeditor nicht verwenden.
+ Im Zweifelsfall, wenn Sie meinen, den Satz durcheinanderge­
+bracht zu haben, können Sie immer mit ESC 'h' abbrechen. Es steht
+dann der vorherige Zustand für einen neuen Versuch zur Verfügung.
+
+
+6.3 Daten ändern
+
+Wenn Sie nachträglich noch eingegebene Daten ändern wollen, kön­
+nen Sie die Funktion
+#free (0.2)#
+
+ A Ändern
+
+#free (0.2)#
+verwenden. Sie haben anschließend wie beim Einfügen Gelegenheit,
+neue Daten einzugeben. Allerdings werden Ihnen die bisherigen
+Daten gleich mit angeboten, so daß Sie nur die Änderungen ein­
+geben müssen. Alles andere kann unverändert bleiben. Auch diese
+Funktion wird mit ESC 'q' verlassen. ESC 'w' funktioniert beim
+Ändern ebenfalls (der nächste Satz wird zum Ändern angeboten).
+ Stellen Sie beim Ändern oder Einfügen fest, daß Sie irgendeinen
+krassen Fehler gemacht haben, können Sie die Operation mit ESC 'h'
+abbrechen. Beim Ändern bleibt dann der alte Zustand unverändert,
+beim Einfügen wird kein Satz eingefügt.
+
+#on("b")#Löschen#off("b")# Für den Fall, daß Sie einen Satz wieder ganz aus
+der
+Datei löschen wollen, hat EUDAS eine besondere Vorsichtsmaßnahme
+vorgesehen. Damit der Satz nicht gleich unwiederbringlich verloren­
+geht, müssen Sie ihn zunächst in eine andere Datei #on("i")#tragen#off("i")#. Falls
+das Löschen ein Irrtum war, können Sie den Satz von dort noch
+wiederholen. In vielen Fällen besteht ohnehin die Anforderung, daß
+auch die nicht mehr aktuellen Daten noch eine gewisse Zeit aufge­
+hoben werden müssen.
+ Zum Tragen gibt es die Funktion
+
+
+ Datensatz
+ T Tragen
+
+
+Sie werden nach einem Dateinamen gefragt. Geben Sie hier zum
+Beispiel 'müll' an. Da diese Datei noch nicht existiert, werden Sie
+gefragt, ob Sie sie neu einrichten wollen (falls Sie sich vielleicht
+verschrieben haben). Danach wird der aktuelle Satz in die Datei
+'müll' transportiert. Am Bildschirm erscheint der nächste Satz. Der
+getragene Satz kommt an das Ende der Zieldatei.
+ Eine Bedingung beim Tragen ist, daß die Zieldatei immer die
+gleichen Felder haben muß wie die aktuelle Datei. Sie können also
+nicht aus verschieden strukturierten Dateien in die gleiche Datei
+tragen.
+ Zum Zurückholen eines Satzes benutzen Sie die Funktion
+
+
+ Datensatz
+ H Holen
+
+
+Der letzte Satz der Datei, die Sie angeben, wird vor dem aktuellen
+Satz eingefügt. Dadurch wird der Effekt des letzten Tragens wieder
+aufgehoben.
+ Um die getragenen Sätze endgültig zu vernichten, müssen Sie
+die Zieldatei als Ganzes löschen. Die dazu notwendige Funktion aus
+dem Menü 'Dateien' haben Sie bereits in Abschnitt 4.4 kennenge­
+lernt.
+
+
+6.4 Arbeitskopie sichern
+
+Wenn Sie eine Datei zum Ändern öffnen oder sie gerade neu einge­
+richtet haben, wird von dieser Datei intern eine Arbeitskopie ange­
+legt, die dann geändert wird. Sie müssen diese Arbeitskopie nach
+den Änderungen sichern, damit die Änderungen wirksam werden.
+ In unserem Beispiel ist die Datei "Telefonnummern" immer noch
+leer. Die Änderungen sind momentan nur in der internen Kopie
+vorhanden. Wenn Sie die Datei zum Beispiel auf eine Archivdiskette
+schreiben wollten, würden Sie eine leere Datei auf der Diskette
+haben.
+ Zum Sichern rufen Sie die Funktion
+#free (0.2)#
+
+ S Sichern
+
+#free (0.2)#
+im ersten Menü auf. Es erscheint dann folgende Frage:
+
+___________________________________________________________________________________________
+
+ Arbeitskopie "Telefonnummern" veraendert! Sichern (j/n) ?
+___________________________________________________________________________________________
+
+
+Beantworten Sie diese Frage mit 'j'. Als nächstes wird gefragt:
+
+___________________________________________________________________________________________
+
+ Alte Version überschreiben (j/n) ?
+___________________________________________________________________________________________
+
+
+Beantworten Sie auch diese Frage mit 'j'. Die Arbeitskopie über­
+schreibt dann die (leere) Version vor dem Ändern.
+ Wenn Sie die Frage verneint hätten, könnten Sie anschließend
+einen neuen Namen für die Arbeitskopie angeben. Dies wäre dann
+sinnvoll, wenn Sie den Stand vor den Änderungen noch aufbewahren
+wollen. In diesem Fall ist es jedoch nutzlos, die alte leere Datei
+noch behalten zu wollen.
+ Abschließend wird gefragt, ob Sie die Arbeitskopien löschen
+wollen. Wenn Sie noch weiter mit der Datei arbeiten wollen, vernei­
+nen Sie diese Frage. Die Datei bleibt dann geöffnet. Anderenfalls
+müßten Sie die Datei neu öffnen, wenn Sie sie wieder ansehen wol­
+len.
+
+#on("b")#Arbeitskopien#off("b")# Es ist sehr wichtig, daß Sie sich die
+Funktionsweise
+mit der Arbeitskopie immer vor Augen halten, damit Sie später bei
+der Arbeit mit EUDAS nicht überrascht werden.
+ Eine Arbeitskopie wird immer dann angelegt, wenn Sie beim
+Öffnen einer EUDAS-Datei angeben, daß Sie diese Datei ändern
+wollen. In dem Beispiel haben Sie eine neue Datei eingerichtet.
+EUDAS nimmt dann automatisch an, daß Sie ändern wollen. Öffnen
+Sie eine existierende Datei, werden Sie gefragt
+
+___________________________________________________________________________________________
+
+ Wollen Sie etwas ändern (Arbeitskopie anlegen) (j/n) ?
+___________________________________________________________________________________________
+
+
+Wenn Sie diese Frage verneinen, wird keine Arbeitskopie angelegt;
+alle Änderungsfunktionen werden jedoch gesperrt. Daran können Sie
+auch erkennen, daß keine Arbeitskopie vorliegt.
+ Die Arbeitskopie, die EUDAS sich anlegt, ist anonym. Wenn Sie
+sich also im Menü 'Dateien' eine Übersicht zeigen lassen, erscheint
+nur das Original. Bevor Sie mit diesem Original etwas anstellen
+(zum Beispiel auf Archiv schreiben), sollten Sie sich vergewissern,
+daß Sie die Arbeitskopie gesichert haben, da das Original sonst
+nicht auf dem neuesten Stand ist.
+ Um Sie in diesem Fall zu warnen, erscheint vor einer geöffneten
+Datei in einer Dateiauswahl das Symbol <!>, zum Beispiel:
+
+
+ o <!> "Telefonnummern"
+ o "Mitglieder"
+
+
+Wenn Sie dieses Symbol sehen, sollten Sie die Datei lieber erst
+sichern, bevor Sie etwas mit ihr anstellen.
+
+#on("b")#Beispiel#off("b")# Um die Arbeitsweise von EUDAS noch besser zu
+verstehen,
+betrachten Sie das Beispiel in Abb. 6-2. Nehmen Sie an, Sie haben
+drei EUDAS-Dateien 'Kalender', 'Namen' und 'Adressen' mit ihren
+Anfangsinhalten K0, N0 und A0 (symbolisch). In dem Diagramm sind
+die Vorgänge zu den Zeitpunkten 0 bis 10 mit ihren Auswirkungen
+auf die Inhalte der Dateien und der Arbeitskopie dargestellt.
+
+
+#free (5.5)#
+#center#Abb. 6-2 Beispiel zur Arbeitskopie
+
+
+Zu den einzelnen Zeitpunkten passiere folgendes:
+
+0: Anfangszustand. Es wurde noch keine Datei geöffnet, also ist
+ keine Arbeitskopie vorhanden. Es könnte aber auch eine
+ beliebige Datei ohne Änderungserlaubnis geöffnet sein.
+#free (0.2)#
+1: Die Datei 'Adressen' wird geöffnet zum Ändern. Der momen­
+ tane Zustand der Datei wird als Arbeitskopie übernommen.
+#free (0.2)#
+2: Es wird eine Änderung vorgenommen (zum Beispiel) ein Satz
+ eingefügt). Diese Änderung betrifft aber nur die Kopie - die
+ Datei 'Adressen' als Original bleibt unverändert.
+#free (0.2)#
+3: Eine weitere Änderung führt zum Inhalt A2 der Arbeitsko­
+ pie.
+#free (0.2)#
+4: Aufruf von 'Sichern'. Die alte Version von 'Adressen' wird
+ überschrieben und durch den Inhalt A2 ersetzt. Die Frage
+ nach dem Löschen der Arbeitskopie wird verneint; daher bleibt
+ die Kopie auch erhalten.
+#free (0.2)#
+5: Die Kopie wird erneut verändert.
+#free (0.2)#
+6: Aufruf von 'Sichern'. Die Frage, ob die Kopie gesichert wer­
+ den soll, wird verneint. Die Arbeitskopie soll jedoch gelöscht
+ werden. Als Ergebnis geht die Änderung A3 verloren (viel­
+ leicht war diese Änderung ein Irrtum). Die Datei 'Adressen'
+ wird nicht verändert. Es ist keine Arbeitskopie mehr vor­
+ handen.
+#free (0.2)#
+7: Die Datei 'Namen' wird zum Ändern geöffnet.
+#free (0.2)#
+8: Die Datei 'Kalender' wird zum Ändern geöffnet. Da an der
+ vorigen Arbeitskopie keine Änderungen vorgenommen wurden,
+ kann die Kopie einfach überschrieben werden. Anderenfalls
+ wäre an dieser Stelle die Möglichkeit zum Sichern angeboten
+ worden.
+#free (0.2)#
+9: Es wird eine Änderung durchgeführt.
+#free (0.2)#
+10: Die geänderte Arbeitskopie wird gesichert, das Original über­
+ schrieben und die Arbeitskopie gelöscht (Normalfall).
+
+
diff --git a/doc/eudas/eudas.hdb.7 b/doc/eudas/eudas.hdb.7
new file mode 100644
index 0000000..d6f1bf3
--- /dev/null
+++ b/doc/eudas/eudas.hdb.7
@@ -0,0 +1,687 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (61)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+7 Ausdrucken der Daten
+
+
+
+7.1 Druckmuster
+
+Nachdem Sie sich die Inhalte der EUDAS-Datei ausgiebig am Bild­
+schirm angesehen haben, möchten Sie die gespeicherten Daten sicher
+auch in gedruckter Form auf Papier sehen. Sie können eine
+EUDAS-Datei jedoch nicht ohne weiteres ausdrucken, da sie eine
+andere Struktur als normale Textdateien hat.
+ Vor dem Drucken müssen also die Inhalte der EUDAS-Datei
+zunächst in lesbarer Form in eine Textdatei geschrieben werden.
+EUDAS kann diese Aufgabe jedoch ohne Ihre Hilfe nicht alleine be­
+wältigen.
+ Es taucht nämlich das Problem auf, daß die Dateiinhalte in
+vielen verschiedenen Formen dargestellt werden können (Sie erin­
+nern sich sicher noch an das erste Kapitel). Vielleicht wollen Sie
+bestimmte Überschriften haben oder die Daten müssen auf ein be­
+stimmtes Formular passen.
+ Um die Ausgabe nach Ihren Wünschen zu gestalten, müssen Sie
+also dem Rechner genau angeben, an welcher Stelle welche Felder
+gedruckt werden sollen usw. Dies geht am einfachsten, indem Sie
+dem Rechner ein Muster vorsetzen, nach dem er dann die richtigen
+Ausdrucke erstellen kann. Dieses Muster schreiben Sie in eine eige­
+ne Textdatei, die #on("i")#Druckmuster#off("i")# genannt wird. Aus den Daten der
+EUDAS-Datei und der Form, die im Druckmuster angegeben ist, wird
+dann eine weitere Textdatei erzeugt, die die Daten in der ge­
+wünschten Form enthält und die anschließend automatisch gedruckt
+werden kann.
+ Durch ein Druckmuster erhalten Sie fast völlige Freiheit in der
+Gestaltung Ihrer Ausdrucke. Zum Beispiel können aus einer einzigen
+Adressendatei einfache Listen, Einladungskarten oder Rundbriefe
+erzeugt werden. Für eine einfache Adressenliste entspricht das
+Druckmuster einer Zeile der Liste, wobei angegeben wird, in welche
+Spalten die Inhalte gedruckt werden. Zum Drucken von Einladungs­
+karten wird als Druckmuster eine Einladungskarte verwendet, in der
+die Stellen markiert sind, an denen die Adresse erscheinen soll. Das
+gleiche kann man mit einem Brief machen, der dann mit jeder
+Adresse einmal ausgedruckt wird.
+
+#on("b")#Druckverfahren#off("b")# Man kann sich diesen Druckprozeß wie folgt
+vorstellen:
+
+
+#free (6.5)#
+
+#center#Abb. 7-1 Druckverfahren
+
+
+Vereinfacht gesagt (das genaue Verfahren wird später beschrieben)
+wird für jeden Satz der EUDAS-Datei das Druckmuster einmal in die
+Druckdatei übernommen. Dabei werden die Inhalte aus der EUDAS-
+Datei in einer noch anzugebenden Weise an den gewünschten Stellen
+eingefügt.
+ Im weiteren sollen Sie erfahren, wie ein Druckmuster genau
+aussieht und wie daraus ein Ausdruck entsteht.
+
+#on("b")#Beispiel#off("b")# Im folgenden sollen Sie zur Demonstration die
+bereits in
+Kapitel 3 und 4 beschriebene Beispieldatei verwenden. Nach Mög­
+lichkeit sollten Sie die angegebenen Beispiele mit dieser Datei
+selbst am Rechner ausprobieren.
+
+Folgende Sätze befinden sich in der Datei:
+
+
+ Vorname Name, Strasse, PLZ Ort, m/w
+ -------------------------------------------------------
+ Herbert Wegner, Krämergasse 12, 5000 Köln, m
+ Helga Sandmann, Willicher Weg 109, 5300 Bonn 1, w
+ Albert Katani, Lindenstr. 3, 5210 Troisdorf, m
+ Peter Ulmen, Mozartstraße 17, 5 Köln 60, m
+ Karin Regmann, Grengelweg 44, 5000 Köln 90, w
+ Hubert Arken, Talweg 12, 5200 Siegburg, m
+ Anna-Maria Simmern, Platanenweg 67, 5 Köln 3, w
+ Angelika Kaufmann-Drescher, Hauptstr. 123, 53 Bonn 2, w
+ Harald Fuhrmann, Glockengasse 44, 5000 Köln 1, m
+ Friedrich Seefeld, Kabelgasse, 5000 Köln-Ehrenfeld, m
+
+
+Wie Sie sehen, wurde die Reihenfolge der Felder gegenüber der Datei
+teilweise verändert und Name und Vorname ohne Komma hinterein­
+andergeschrieben, während die anderen Feldinhalte durch Komma
+getrennt sind. Diese Liste wurde unter Verwendung eines Druck­
+musters erzeugt.
+ Da dieses Druckmuster jedoch vorerst noch zu kompliziert ist,
+sollen Sie erst einmal ein einfacheres Druckmuster erstellen und
+versuchen, nur die Namen aus der Datei in Tabellenform auszuge­
+ben.
+ Das dafür nötige Druckmuster hat folgendes Aussehen:
+
+
+ % WIEDERHOLUNG
+ ! &Name ! &Vorname !
+
+
+Das Druckmuster besteht nur aus zwei Zeilen, von der die zwei­
+te das eigentliche Muster darstellt. Die erste Zeile ist eine #on("i")# Anwei­
+sung#off("i")# an den Druckgenerator. 'WIEDERHOLUNG' gibt an, daß die
+folgenden Zeilen für jeden Satz wiederholt werden sollen (warum
+diese Angabe notwendig ist, werden Sie später einsehen). Das Pro­
+zentzeichen kennzeichnet eine Anweisung und muß unbedingt in der
+ersten Spalte des Druckmusters stehen, also ganz am linken Rand.
+ In der zweiten Zeile ist zu sehen, daß das Zeichen '&' dazu
+benutzt wird, die Stellen zu markieren, an denen nachher Feldin­
+halte eingesetzt werden sollen. Hinter dem '&'-Zeichen folgt der
+Name des Feldes, das an dieser Stelle eingesetzt werden soll. Eine
+solche Konstruktion wird #on("i")#Feldmuster#off("i")# genannt. Beachten Sie, daß
+Feldnamen hier immer ohne Anführungsstriche geschrieben werden
+müssen. Die Ausrufungszeichen bilden den eigentlichen Mustertext
+und werden unverändert als Tabellenbegrenzung in die Ausgabe
+übernommen.
+ Als Ergebnis des Druckprozesses sollte folgende Ausgabe auf
+dem Drucker erscheinen:
+
+
+ ! Wegner ! Herbert !
+ ! Sandmann ! Helga !
+ ! Katani ! Albert !
+ ! Ulmen ! Peter !
+ ! Regmann ! Karin !
+ ! Arken ! Hubert !
+ ! Simmern ! Anna-Maria !
+ ! Kaufmann-Drescher ! Angelika !
+ ! Fuhrmann ! Harald !
+ ! Seefeld ! Friedrich !
+
+
+Sie können erkennen, daß die Feldmuster in der Ausgabe jeweils
+durch den Inhalt des zugehörigen Feldes ersetzt worden sind. Der
+übrige Text in der Musterzeile ist unverändert geblieben. Beachten
+Sie, daß das '&' ein reserviertes Zeichen ist, das ein Feldmuster im
+umgebenden Text kennzeichnet und daher (vorerst) nicht gedruckt
+werden kann.
+
+
+7.2 Aufruf
+
+In diesem Abschnitt sollen Sie erfahren, wie Sie diese Ausgabe
+selbst erzeugen können. Damit der Druckgenerator arbeiten kann,
+müssen Sie die Datei 'Adressen' erst einmal öffnen. Anschließend
+wählen Sie das Menü 'Drucken' an.
+
+#on("b")#Druckmuster erstellen#off("b")# Als nächstes müssen Sie das
+Druckmuster erstellen. Hierfür gibt es die Funktion
+#free (0.2)#
+
+ Textdatei
+ E Editieren
+
+#free (0.2)#
+da das Druckmuster eine normale Textdatei ist.
+ Wählen Sie diese Funktion. Sie werden dann nach einem Namen
+für das Druckmuster gefragt. Wir wollen das Druckmuster 'Namens­
+liste' nennen - Sie können aber auch einen beliebigen anderen
+Namen wählen. Denken Sie daran, die Anführungsstriche nicht mit
+einzugeben.
+ Es erscheint anschließend das gewohnte Editorbild mit einer
+entsprechenden Statuszeile. Geben Sie die zwei Zeilen des Druck­
+musters ein und beenden Sie den Editor mit ESC 'q'. Damit ist das
+Druckmuster fertig.
+
+ Die hier beschriebene Funktion können Sie nicht nur zum Er­
+stellen, sondern auch zum Ändern und einfachen Ansehen eines
+Druckmusters bzw. einer Textdatei allgemein verwenden. Es wird
+Ihnen immer der jeweilige Inhalt präsentiert, den Sie dann nach
+Belieben abändern können oder nicht.
+
+___________________________________________________________________________________________
+
+ EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
+ --------------:
+ Satzauswahl :
+ D Drucken :
+ --------------:
+ Druckausgabe :
+ R Richtung :
+ --------------:
+ Textdatei :
+ E Editieren :
+ A Ausdrucken :
+ N Nachbearb. :
+ --------------:
+
+___________________________________________________________________________________________
+
+#center#Abb. 7-2 Menü "Drucken"
+
+
+#on("b")#Ausgaberichtung#off("b")# Bevor Sie jetzt weitermachen, sollten Sie
+über­
+prüfen, ob an Ihrem System ein Drucker angeschlossen ist. Der
+Drucker sollte bei den folgenden Versuchen betriebsbereit sein.
+ Ist kein Drucker angeschlossen oder wollen Sie kein Papier
+verschwenden, haben Sie die Möglichkeit, den Ausdruck als Text­
+datei zu erhalten. Dazu wählen Sie die Funktion
+#free (0.2)#
+
+ Ausgabe
+ R Richtung
+
+#free (0.2)#
+an. Beantworten Sie beide Fragen, die Ihnen gestellt werden, mit
+'n'. Die Ausgaben stehen dann nachher in Dateien mit einem Namen
+der Form
+#free (0.2)#
+
+ Namensliste.a$n
+
+#free (0.2)#
+die Sie sich mit der oben beschriebenen Funktion dann genau wie
+ein Druckmuster anschauen können. Der Name besteht also aus dem
+Namen des Druckmusters, dem ein '.a$' angehängt wird. Die Nummer
+'n' dient zur Unterscheidung bei mehreren aufeinanderfolgenden
+Ausgaben. Um Verwirrung zu vermeiden, sollten Sie die Datei nach
+dem Anschauen löschen (im Menü 'Dateien').
+
+#on("b")#Druckaufruf#off("b")# Wenn Sie diese Hinweise beachtet haben, können
+Sie den Druckvorgang mit der Auswahl
+#free (0.2)#
+
+ Satzauswahl
+ D Drucken
+
+#free (0.2)#
+starten. Sie werden hier nach dem Namen des Druckmusters gefragt,
+das Sie verwenden wollen (Sie können ja durchaus eine ganze Reihe
+von verschiedenen Druckmustern haben).
+ Sie können den Ablauf des Druckvorganges daran verfolgen,
+daß jeweils die Nummer des Satzes ausgegeben wird, der gerade
+bearbeitet wird. Probieren Sie eventuell auch kleine Abwandlungen
+des Druckmusters aus, indem Sie die Tabellenspalten schmaler oder
+breiter machen oder die Ausrufungszeichen durch ein anderes Zei­
+chen ersetzen (je nach Geschmack).
+
+#on("b")#Ausgabedatei#off("b")# Wollen Sie die erzeugte Ausgabe (die in der
+Datei
+'Namensliste.a$1' steht) irgendwann tatsächlich ausdrucken, ver­
+wenden Sie die Funktion
+#free (0.2)#
+
+ A Ausdrucken
+
+#free (0.2)#
+Sie werden dann nach dem Namen der Textdatei gefragt. Beachten
+Sie, daß Sie diese Funktion #on("i")#nicht#off("i")# zum Drucken von EUDAS-Dateien
+verwenden können, da aus einer EUDAS-Datei erst eine Druckdatei
+erzeugt werden muß.
+ Auch wenn Sie angegeben haben, daß die Ausgabe des Druck­
+prozesses direkt ausgedruckt werden soll, startet Ihr Drucker erst,
+wenn EUDAS die ganze Datei durchgegangen ist und der Vorgang für
+Sie beendet ist. Dies liegt am EUMEL-System, das nur vollständige
+Druckaufträge entgegennimmt, damit sich mehrere Benutzer nicht in
+die Quere kommen können. In einem Multi-User-System können Sie
+weiterarbeiten, während der Drucker beschäftig ist.
+
+#on("b")#Fehler#off("b")# Bevor der eigentliche Druckprozeß gestartet wird,
+wird das
+Druckmuster auf unsinnige oder unverständliche Konstruktionen
+überprüft. Ist dem Druckgenerator etwas suspekt, gibt er eine Feh­
+lermeldung aus, in der die fragliche Situation von seiner Seite aus
+beschrieben wird. Er kann natürlich nicht Ihren Fehler "verstehen".
+Daher müssen Sie unter Umständen eine Fehlermeldung erst inter­
+pretieren, ehe Sie die wahre Ursache erkennen können.
+ Damit Sie einen aufgetretenen Fehler gleich korrigieren können,
+werden Ihnen das Druckmuster und die Fehlermeldungen parallel auf
+dem Bildschirm zum Ändern und Anschauen angeboten. Sie können
+mit dem Editor das Druckmuster ändern und in den Fehlermeldungen
+blättern. Diese Konfiguration wird Paralleleditor genannt. Mit ESC
+'w' wechseln Sie zwischen den beiden Bildschirmhälften.
+
+#on("b")#Suchbedingung#off("b")# Wollen Sie nicht alle Namen ausdrucken, so
+können
+Sie vorher ein Suchmuster einstellen, das nur auf die gewünschten
+Namen zutrifft (wie im Kapitel 5 beschrieben). Der Druckgenerator
+richtet sich immer nach dem aktuell eingestellten Suchmuster und
+druckt nur die ausgewählten Sätze. Wenn Sie zum Beispiel die Na­
+men aller Frauen ausdrucken wollen, stellen Sie im Tastenmodus ein
+Suchmuster ein (das sollten Sie können), das für das Feld 'm/w' die
+Bedingung 'w' enthält. Danach können Sie den Druckgenerator auf­
+rufen. Vergessen Sie nicht, das Suchmuster anschließend wieder zu
+löschen.
+
+#on("b")#Feldnamen abfragen#off("b")# Wenn Sie selber ein Druckmuster
+erstellen,
+wird es häufiger vorkommen, daß Sie die genaue Schreibweise der
+Feldnamen nicht im Kopf haben. Für diesen Zweck definiert EUDAS
+im Editor eine spezielle Tastenkombination.
+ Wenn Sie dort ESC 'F' tippen (großes 'F'), erhalten Sie eine
+Auswahl aller Felder der gerade geöffneten Datei. Sie können sich
+die Namen einfach ansehen, aber auch direkt in den Text des
+Druckmusters übernehmen.
+ Wenn Sie nämlich vor dem Verlassen der Auswahl mit ESC 'q'
+ein Feld ankreuzen, wird anschließend der Name in Anführungs­
+strichen an die Position geschrieben, an der vor dem Aufruf der
+Cursor stand. Auf diese Weise können Sie sich auch das Tippen
+langer Feldnamen vereinfachen.
+ Beachten Sie, daß Sie im Normalfall im Druckmuster die Anfüh­
+rungsstriche wieder entfernen müssen. Die Anführungsstriche dienen
+zur Abgrenzung, wie weit der Feldname geht. Falls der Name Leer­
+zeichen enthält, beachten Sie bitte den Absatz 'Abgrenzung der
+Feldnamen' in Abschnitt 7.4.
+
+
+7.3 Abschnitte
+
+Die Tabellen, die Sie bis jetzt erzeugen können, sehen optisch noch
+nicht sehr gut aus. Es fehlt auf jeden Fall eine vernünftige Über­
+schrift. Um eine Überschrift zu erzeugen, können Sie im Druckmuster
+einen #on("i")#Vorspann#off("i")# definieren, der ganz zu Anfang einmal gedruckt
+wird.
+ Dieser Vorspann wird durch die Anweisung
+
+
+ % VORSPANN
+
+
+eingeleitet (bitte nicht vergessen, daß das '%'-Zeichen für eine
+Anweisung in der ersten Spalte stehen muß). Die folgenden Zeilen
+bis zur 'WIEDERHOLUNG'-Anweisung gehören zum Vorspann. Ein
+Druckmuster für unsere Namensliste mit Überschrift könnte dann so
+aussehen:
+
+
+ % VORSPANN
+ Alle Namen aus der EUDAS-Datei 'adressen'
+ -----------------------------------------
+ % WIEDERHOLUNG
+ ! &Name ! &Vorname !
+
+
+Der Druckgenerator erzeugt mit diesem Druckmuster die gewünschte
+Liste mit Überschrift. Sie können als Vorspann natürlich auch einen
+beliebigen anderen Text verwenden.
+ In einer analogen Weise können Sie die Liste noch durch eine
+waagerechte Linie abschließen, indem Sie einen #on("i")#Nachspann#off("i")# definie­
+ren. Die dafür notwendige Anweisung heißt
+
+
+ % NACHSPANN
+
+
+Die Zeilen nach dieser Anweisung werden gedruckt, nachdem alle
+Sätze bearbeitet worden sind. Das folgende Druckmuster erzeugt
+schon eine sehr schöne Liste:
+
+
+ % VORSPANN
+ Alle Namen aus der EUDAS-Datei 'adressen'
+ -----------------------------------------
+ % WIEDERHOLUNG
+ ! &Name ! &Vorname !
+ % NACHSPANN
+ -----------------------------------------
+
+
+nämlich:
+
+
+ Alle Namen aus der EUDAS-Datei 'adressen'
+ -----------------------------------------
+ ! Wegner ! Herbert !
+ ! Sandmann ! Helga !
+ ! Katani ! Albert !
+ ! Ulmen ! Peter !
+ ! Regmann ! Karin !
+ ! Arken ! Hubert !
+ ! Simmern ! Anna-Maria !
+ ! Kaufmann-Drescher ! Angelika !
+ ! Fuhrmann ! Harald !
+ ! Seefeld ! Friedrich !
+ -----------------------------------------
+
+
+Die drei Teile, aus denen ein Druckmuster bestehen kann (Vorspann,
+Nachspann und Wiederholungsteil), werden #on("i")#Abschnitte#off("i")# genannt. Wie
+Sie später noch sehen werden, haben Abschnitte eine Reihe von
+gemeinsamen Eigenschaften. Ein Abschnitt wird durch eine eigene
+Anweisung eingeleitet und endet, wenn ein anderer Abschnitt be­
+ginnt oder das Druckmuster zu Ende ist. Alle Abschnitte können
+auch weggelassen werden, irgendein Abschnitt muß aber immer
+vorhanden sein. So ist es zum Beispiel möglich, ein Druckmuster zu
+bauen, das nur aus einem Nachspann besteht (Sie werden allerdings
+jetzt noch nicht verstehen können, warum so etwas sinnvoll sein
+kann).
+ Zum Abschluß dieses Kapitels hier noch einmal eine Übersicht
+der bisher vorgestellten Anweisungen:
+
+
+ Anweisung ! Bedeutung
+ ---------------+----------------------------------
+ % VORSPANN ! leitet Vorspann ein
+ % WIEDERHOLUNG ! leitet Wiederholungsteil ein
+ % NACHSPANN ! leitet Nachspann ein
+
+
+
+7.4 Feldmuster
+
+Mit den bis jetzt beschriebenen Möglichkeiten des Druckgenerators
+können Sie schon sehr viel anfangen. Es fehlt aber noch die Mög­
+lichkeit, mehrere Feldinhalte direkt hintereinander zu schreiben,
+egal wie lang diese Inhalte sind. Diese Fähigkeit wird zum Beispiel
+für die anfangs vorgestellte Liste benötigt.
+
+#on("b")#Variable Position#off("b")# Die Feldmuster, die Sie bis jetzt
+kennen, begin­
+nen mit einem '&'-Zeichen und werden immer genau an der Stelle
+gedruckt, an der sie stehen (feste Position). Sie können ein Feld­
+muster aber auch mit '%' beginnen lassen. In diesem Fall kann der
+Inhalt verschoben werden (variable Position), je nachdem, ob vorhe­
+rige Inhalte kürzer oder länger sind.
+ '%' ist wie '&' ein reserviertes Zeichen, kann also nicht direkt
+gedruckt werden. Da '&' und '%' Feldmuster einleiten, heißen sie
+#on("i")#Musterzeichen#off("i")#.
+ Um Feldmuster variabler Position einmal auszuprobieren, soll­
+ten Sie unser bisheriges Druckmuster in der folgenden Weise um­
+schreiben:
+
+
+ % WIEDERHOLUNG
+ &Vorname %Name
+
+
+(Vorspann und Nachspann der Einfachheit halber mal weggelassen).
+Als Ergebnis erhalten wir:
+
+
+ Herbert Wegner
+ Helga Sandmann
+ Albert Katani
+ Peter Ulmen
+ Karin Regmann
+ Hubert Arken
+ Anna-Maria Simmern
+ Angelika Kaufmann-Drescher
+ Harald Fuhrmann
+ Friedrich Seefeld
+
+
+Das Feldmuster '%Name' ist also entsprechend der Länge des Vor­
+namens nach links oder nach rechts gerutscht. Zu beachten ist, daß
+ein Feldmuster mit '%' nicht in der ersten Spalte stehen darf, denn
+dann würde die Zeile als Anweisung angesehen. Ein Feldmuster
+variabler Position wäre ja auch in der ersten Spalte wenig sinnvoll.
+
+#on("b")#Feste Länge#off("b")# Außer den beiden bisher besprochenen einfachen
+Arten (mit '&' oder '%') gibt es noch weitere Ausprägungen von
+Feldmustern für besondere Fälle. Wird ein Feldmuster noch von
+weiteren Musterzeichen gefolgt, dann wird dieses Feldmuster immer
+in der reservierten Länge eingesetzt. Die reservierte Länge reicht
+vom ersten bis zum letzten Musterzeichen. Durch die zusätzlichen
+Musterzeichen wird also ein bestimmter Platz freigehalten.
+ Ersetzt man im obigen Druckmuster '&Vorname' durch
+'&Vorname&&', wird der Effekt des folgenden '%'-Feldes wieder
+aufgehoben, da jetzt für alle Vornamen die gleiche Länge verwendet
+wird (Probieren Sie dies aus).
+ Bei einem solchen Feldmuster mit fester Länge wird der Inhalt
+abgeschnitten, falls er diese Länge überschreitet; ist der Inhalt
+kürzer, wird rechts mit Leerstellen aufgefüllt. Aber auch bei Feld­
+mustern mit variabler Länge (also ohne folgende Musterzeichen)
+kann abgeschnitten werden, nämlich genau dann, wenn der Inhalt so
+lang ist, daß ein folgendes Feld mit fester Position (mit '&' anfan­
+gend) überschrieben würde. Hätten wir also in unserem ersten
+Druckmuster nicht genügend Platz für die Spalten vorgesehen,
+wären einige Namen abgeschnitten worden (probieren Sie es nochmal
+aus, falls es Ihnen nicht schon passiert ist).
+ In einem weiteren Fall werden Feldmuster variabler Länge
+abgeschnitten, nämlich wenn die generierte Zeile die maximale
+Zeilenlänge überschreitet. Die maximale Zeilenlänge richtet sich
+nach dem Dateilimit, das für das Druckmuster eingestellt ist. Nor­
+malerweise ist dies 77, so daß Sie in Normalschrift die Zeilenbreite
+auf einem DIN A4-Blatt nicht überschreiten.
+ Benutzen Sie jedoch breites Papier oder eine schmale Schrift,
+sollten Sie während der Eingabe des Druckmusters ESC ESC tippen
+und das Kommando
+
+
+ limit (135)
+
+
+eingeben. EUDAS nutzt dann die volle Zeilenbreite aus.
+
+#on("b")#Rechtsbündig#off("b")# Sie sind jetzt aber noch nicht zu Ende mit
+den
+Feldmustervariationen. Eine letzte Möglichkeit besteht darin, den
+Inhalt rechtsbündig in ein Feldmuster einzusetzen. Dies hat natür­
+lich nur Sinn bei fester Länge. Man erreicht dies dadurch, daß man
+das Feldmuster mit mehreren Musterzeichen beginnen läßt. So ist
+
+
+ %%Vorname%
+
+
+die rechtsbündige Version von
+
+
+ %Vorname%%
+
+
+Beide Feldmuster sind gleich lang, beim ersten wird jedoch am lin­
+ken Rand aufgefüllt oder abgeschnitten, beim zweiten dagegen am
+rechten Rand.
+
+#on("b")#Zusammenfassung#off("b")# Hier noch einmal eine Zusammenstellung
+aller möglichen Feldmustertypen:
+
+
+ Typ ! Beispiel ! Position ! Länge ! bündig
+ ----+-----------+------------------------------
+ 1 ! &Name ! fest ! variabel ! links
+ 2 ! %Name ! variabel ! variabel ! links
+ 3 ! &Name&&& ! fest ! fest ! links
+ 4 ! %Name%%% ! variabel ! fest ! links
+ 5 ! &&&Name& ! fest ! fest ! rechts
+ 6 ! %%%Name% ! variabel ! fest ! rechts
+
+
+Wir können zusammenfassen:
+#free (0.2)#
+* Feldmuster dienen im Druckmuster dazu, Stellen zu markieren, an
+ denen Inhalte eingesetzt werden sollen.
+#free (0.2)#
+* Feldmuster beginnen mit einem Musterzeichen ('&' oder '%');
+ darauf folgt der Feldname.
+#free (0.2)#
+* Durch '&' wird feste und durch '%' variable Position festgelegt.
+#free (0.2)#
+* Durch zusätzliche Musterzeichen kann eine feste Länge angege­
+ ben werden; mehrere Musterzeichen am Anfang führen zu rechts­
+ bündigem Einsetzen.
+
+#on("b")#Abgrenzung der Feldnamen#off("b")# Als nächstes sollen Sie den Fall
+be­
+trachten, daß Sie einen Namen in der oft auftretenden Form
+
+
+ Name, Vorname
+
+
+schreiben wollen. Die Schwierigkeit liegt in dem Komma, das direkt
+hinter dem Namen folgen soll. Sie könnten versuchen, diese Situa­
+tion im Druckmuster folgendermaßen darzustellen:
+
+
+ % WIEDERHOLUNG
+ &Name, %Vorname
+
+
+In diesem Fall erhalten Sie aber die Fehlermeldung
+
+
+ FEHLER in Zeile 2 bei >>Name,<<
+ diese Abkuerzung ist nicht definiert
+
+
+Wenn Sie sich nicht genau vorstellen können, wie der Druckgenera­
+tor ein Feldmuster liest, wird Ihnen dieser Fehler mysteriös er­
+scheinen, denn 'Name' ist doch als Feld definiert (was eine Abkür­
+zung ist, werden Sie in Kapitel 13 lernen). Den entscheidenden
+Hinweis liefert jedoch das Komma. Offensichtlich hat der Druck­
+generator das Komma als Teil des Feldnamens angesehen.
+ Dies liegt daran, daß ja irgendwann der Feldname in einem
+Feldmuster beendet sein muß. Normalerweise interpretiert der
+Druckgenerator ein Leerzeichen oder Musterzeichen als Ende des
+Namens, alle vorherigen Zeichen gehören mit zum Feldnamen. Wenn
+nun aber nach dem Feldmuster kein Leerzeichen folgen soll (wie in
+unserem Beispiel) oder der Feldname selbst Leerzeichen enthält
+(dies ist ja erlaubt, könnte aber im Druckmuster nie erkannt wer­
+den), muß noch eine zusätzliche Angabe erfolgen.
+ In solchen Fällen kann der Feldname in spitze Klammern einge­
+schlossen werden. Der Druckgenerator sieht den Feldnamen dann bei
+der ersten schließenden Klammer als beendet an, wobei die Klam­
+mern natürlich nicht zum Feldnamen gehören, aber auch nicht ge­
+druckt werden.
+ Das obige Beispiel müßte also richtig so formuliert werden:
+
+
+ % WIEDERHOLUNG
+ &<Name>, %Vorname
+
+
+Wenn Sie dieses Druckmuster ausprobieren, werden Sie sehen, daß
+die Namen tatsächlich in der gewünschten Form erscheinen.
+
+#on("b")#Leerautomatik#off("b")# Es gibt noch eine trickreiche Automatik in
+EUDAS,
+die in manchen Fällen ganz nützlich ist - und zwar in Fällen, in
+denen Sie mehrere Felder als Aufzählung durch Leerzeichen ge­
+trennt drucken wollen. Nehmen wir an, unsere Adreßdatei hätte
+noch ein Feld 'Titel', in das Sie bei Bedarf 'Dr.' oder 'Prof. Dr.'
+eintragen. In der Adresse würden Sie dann angeben:
+
+
+ &Titel %Vorname %Name
+
+
+Wenn der Titel jedoch leer ist, würde ein störendes Leerzeichen vor
+dem Namen bleiben. In einem solchen Fall entfernt EUDAS das Leer­
+zeichen automatisch. Vorbedingung für diese Automatik ist, daß es
+sich um ein Feld variabler Länge handelt und vor dem Feld noch ein
+Leerzeichen steht (außer in Spalte 1).
+
+#on("b")#Aufgabe#off("b")# Sie sollten jetzt die Möglichkeiten des
+Druckgenerators
+soweit kennengelernt haben, daß Sie ein Druckmuster für die zu
+Anfang des Kapitels erwähnte Liste aller Dateiinhalte erstellen
+können. Versuchen Sie dies zunächst allein, ehe Sie die Lösung
+nachschauen.
+
+
+Hier nun die Lösung:
+
+
+ % VORSPANN
+ Vorname Name, Strasse, PLZ Ort, m/w
+ -------------------------------------------------------
+ % WIEDERHOLUNG
+ &Vorname %<Name>, %<Strasse>, %PLZ %<Ort>, %m/w
+
+
+Beachten Sie die spitzen Klammern, die nötig sind, um das Kom­
+ma ohne Zwischenraum anzuschließen.
+
+#on("b")#Beispiel#off("b")# Als letztes Beispiel sollen Sie einen Fall
+betrachten, bei
+dem pro Satz mehr als eine einzelne Listenzeile gedruckt werden
+soll, und zwar sollen Sie einen Brief schreiben, in den der Druck­
+generator die Adressen verschiedener Leute einfügen soll. Die Er­
+stellung von Formbriefen ist eine sehr häufige Anwendung von
+EUDAS. Mit den bisher beschriebenen Konstrukten kann man etwa
+folgendes Druckmuster schreiben:
+
+
+ % WIEDERHOLUNG
+ &Vorname %Name
+ &Strasse
+ &PLZ %Ort
+
+ Lieber &Vorname !
+
+ Ich lade Dich mit diesem Brief zu
+ meiner nächsten Party ein.
+ Bring gute Laune und was zu Essen mit.
+
+ Viele Grüße
+ \#page\#
+
+
+Die letzte Zeile zeigt eine Möglichkeit, von der Sie wahrscheinlich
+öfter Gebrauch machen werden, nämlich Druckersteuerungsanwei­
+sungen in das Druckmuster einzufügen. Die Anweisung '\#page\#'
+wird an den Drucker weitergereicht und bewirkt, daß nach jedem
+Brief eine neue Seite angefangen wird (Sie wollen sicher nicht
+mehrere Briefe auf ein Blatt drucken). Sie können auch andere An­
+weisungen verwenden, z.B. neue Schrifttypen einstellen. Informieren
+Sie sich gegebenenfalls, welche Anweisungen die Textkosmetik zur
+Verfügung stellt.
+
+#on("b")#Ausblick#off("b")# Sie kennen jetzt bereits einen großen Teil der
+Möglich­
+keiten des Druckgenerators. Einige wünschenswerte Fähigkeiten
+fehlen jedoch noch. So wäre es vorteilhaft, wenn abhängig vom
+Inhalt des Feldes 'm/w' die Anrede 'Sehr geehrter Herr' oder 'Sehr
+geehrte Frau' erzeugt werden könnte. Außerdem könnte das im
+Rechner vorhandene Datum automatisch in den Brief übernommen
+werden. Diese Möglichkeiten werden den Kapiteln 12 und 13 be­
+schrieben.
+ Sie sollten diese jedoch erst dann durchlesen, wenn Sie eine
+gewisse Sicherheit im Umgang mit Druckmustern erlangt haben.
+Zuvor sollten Sie die Inhalte dieses Kapitels beherrschen, damit Sie
+EUDAS gut nutzen können.
+
diff --git a/doc/eudas/eudas.hdb.8 b/doc/eudas/eudas.hdb.8
new file mode 100644
index 0000000..83246e9
--- /dev/null
+++ b/doc/eudas/eudas.hdb.8
@@ -0,0 +1,211 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (75)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+8 Was war und was noch kommt
+
+
+
+8.1 Rückblick
+
+So! Wenn Sie bis hierhin gut mitgearbeitet haben, haben Sie die
+erste und wichtigste Etappe beim Erlernen von EUDAS schon ge­
+schafft. Bevor Sie kennenlernen, was für Möglichkeiten Ihnen EUDAS
+sonst noch bietet, wollen wir die wichtigsten Dinge rekapitulieren,
+die Sie gelernt haben sollten.
+
+#on("b")#EUDAS-Dateien#off("b")# Sie sollten wissen, wie EUDAS-Dateien
+aussehen,
+und daß sie sich von normalen Textdateien unterscheiden. Diese
+Unterscheidung sollten Sie immer beachten, denn es gibt Funktio­
+nen, die nur EUDAS-Dateien annehmen (zum Beispiel 'Öffnen'),
+andere, die nur Textdateien annehmen (zum Beispiel 'Textdatei
+erstellen') und solche, die mit beliebigen Arten von Dateien "ohne
+Ansehen der Person" funktionieren (zum Beispiel 'Kopieren vom
+Archiv').
+
+#on("b")#Bedienung#off("b")# Sie sollten wissen, wie man eine Funktion im
+Menü
+aufruft; wie Sie EUDAS die notwendigen Informationen (zum Beispiel
+Dateinamen) mitgeben und wie Sie in besonderen Situationen (Feh­
+ler, Abbruch) reagieren können. Zur problemlosen Bedienung sollten
+Sie auch die jeweilige Statuszeile interpretieren können.
+
+#on("b")#Dateiverwaltung#off("b")# Sie sollten wissen, wie Sie Dateien von
+Archiv­
+disketten holen und dort auch wieder abspeichern können. Dazu ist
+die Dateiauswahl durch Ankreuzen sehr hilfreich. Sie sollten von
+Anfang an darauf achten, daß Sie Ihre Dateien regelmäßig auf dem
+Archiv sichern, damit Sie bei etwaigen Problemen mit Ihrem Rechner
+die Daten nicht verlieren.
+
+#on("b")#Öffnen#off("b")# Sie sollten wissen, daß Sie eine EUDAS-Datei vor
+dem
+Bearbeiten erst öffnen müssen. Weiterhin sollten Sie mit der Ar­
+beitskopie umgehen können, die EUDAS bei Änderungen anlegt.
+Denken Sie daran, Ihre Datei nach Änderungen zu sichern. Sie soll­
+ten auch neue EUDAS-Dateien mit eigener Struktur anlegen können.
+
+#on("b")#Ansehen und Ändern#off("b")# Sie sollten wissen, wie Sie die Daten
+Ihrer
+EUDAS-Dateien am Bildschirm abrufen können - entweder manuell
+oder mit Hilfe eines Suchmusters. Sie sollten Änderungen und Ein­
+fügungen durchführen können.
+
+#on("b")#Drucken#off("b")# Sie sollten wissen, wie Sie die Daten einer
+EUDAS-Datei
+mit Hilfe eines Druckmusters ausdrucken können. Denken Sie daran,
+daß dies ein zweistufiger Vorgang ist (Generierung der Druckdatei -
+Ausgeben an Drucker), den Sie an verschiedenen Stellen beeinflus­
+sen können.
+
+Lesen Sie das entsprechende Kapitel erneut durch, wenn Sie sich bei
+einem Punkt dieser Aufzählung nicht sicher sind. Wichtig ist auch,
+daß Sie die bschriebenen Funktionen selbst am Rechner ausprobiert
+haben.
+ Wenn Sie dies alles geduldig absolviert haben, sind Sie in der
+Lage, EUDAS sinnvoll für Ihre eigenen Probleme einzusetzen. Sie
+sollten jetzt ruhig versuchen, eigene Lösungen zu realisieren. Sicher
+werden Sie dabei erkennen, daß Ihnen noch einige Möglichkeiten
+fehlen. Die Chancen sind aber gut, daß EUDAS Ihnen diese Möglich­
+keiten bietet.
+ Im nächsten Abschnitt erhalten Sie einen Überblick darüber,
+was EUDAS noch zur Verfügung stellt. Dort können Sie sich orien­
+tieren, welche Kapitel Sie lesen sollten, wenn Sie bestimmte Fragen
+haben.
+
+
+8.2 Ausblick
+
+Im zweiten Teil dieses Handbuchs erwarten Sie eine ganze Reihe
+interessanter Themen. Dort werden Erweiterungen und Verallgemei­
+nerungen von Funktionen beschreiben, die Sie bereits kennen. Viele
+Funktionen sind jedoch ganz neu und manchmal auch nicht ganz
+einfach zu beherrschen.
+
+#on("b")#Kapitel 9#off("b")# Das neunte Kapitel befaßt sich mit der
+grundsätzlichen
+Struktur der geöffneten Datei. Sie erfahren, daß Sie mehr als eine
+Datei gleichzeitig öffnen und bearbeiten können. Zum einen können
+Sie gleichartige Dateien verketten oder Dateien über Beziehungen
+koppeln. Insbesondere das Koppeln ist eine wichtige Grundlage für
+viele fortgeschrittene Anwendungen von EUDAS.
+ In diesem Kapitel wird auch beschrieben, wie Sie auf einem
+Mehrplatzsystem von mehreren Plätzen aus auf die gleichen EUDAS-
+Dateien zugreifen können. Die Fähigkeiten von EUDAS auf diesem
+Gebiet erreichen nicht das Niveau von großen Datenbanksystemen,
+sind jedoch einfach anzuwenden und in vielen Fällen nützlich.
+
+#on("b")#Kapitel 10#off("b")# Im zehnten Kapitel erfahren Sie, wie Sie den
+Bildschirm
+übersichtlicher gestalten können, wenn Sie Dateien mit zahlreichen
+Feldern benötigen. Sie können bestimmte Felder auswählen, aber
+auch die Sätze einfach ausschnittweise ansehen.
+ Das Suchmuster besitzt noch viele Fähigkeiten, die im ersten
+Teil nicht zur Sprache gekommen sind. Sie können mehrere Bedin­
+gungen auf verschiedene Weisen miteinander kombinieren. Auch
+einige neue Vergleiche treten auf. Außerdem können Sie mehrere
+Felder eines Satzes miteinander vergleichen.
+ Zum schnellen Überblick steht Ihnen eine Funktion bereit, die
+jeweils einen Satz pro Bildschirmzeile anzeigt. In dieser Übersicht
+können Sie blättern und auch Sätze markieren (ankreuzen), um Sie
+später zu bearbeiten.
+
+#on("b")#Kapitel 11#off("b")# Das elfte Kapitel ist den Funktionen zur
+Bearbeitung
+gewidmet. Dort erfahren Sie, wie Sie eine Datei sortieren können.
+Außerdem können Sie eine Datei ausschnittweise kopieren, wobei Sie
+noch eine Vielzahl von Manipulationsmöglichkeiten haben.
+ Auch das Tragen von mehreren Sätzen in einem Arbeitsgang ist
+möglich. Dabei können Konsistenzbedingungen einer Datei überprüft
+werden.
+ Als letztes erfahren Sie, wie man eine EUDAS-Datei automa­
+tisch nach einer beliebigen Vorschrift ändern kann. Hier, wie bei
+den vorherigen Funktionen, werden Sie zum ersten Mal erkennen,
+wieviel man mit der Programmiersprache ELAN innerhalb von EUDAS
+ohne viel Aufwand machen kann.
+
+#on("b")#Kapitel 12#off("b")# Das nächste Kapitel zeigt Ihnen weitere
+Möglichkeiten
+zum Drucken. Sie können die Druckausgabe vor dem Drucken noch
+mit den Programmen der EUMEL-Textverarbeitung aufbereiten. Auch
+innerhalb der EUMEL-Textverarbeitung können Sie EUDAS aufrufen,
+um Daten aus einer EUDAS-Datei in den Text einzufügen.
+ EUDAS kann auch in mehreren Spalten drucken (zum Beispiel
+für Etiketten). Schließlich wird noch beschrieben, wie Sie lange
+Felder auf mehrere Zeilen aufteilen können und welche speziellen
+Möglichkeiten Sie zur Erzeugung von Tabellen haben.
+
+#on("b")#Kapitel 13#off("b")# Ab hier beginnt die Beschreibung dessen, was
+die
+Ausgabe des Druckgenerators so ungeheuer anpassungsfähig macht:
+die Verwendung der Programmiersprache ELAN.
+ Mit einfachsten ELAN-Elementen können Sie komplizierte For­
+matierungswünsche erfüllen. Dazu können Sie den Inhalt von Feld­
+mustern durch vorherige Bearbeitung und durch die Abfrage von
+Bedingungen manipulieren. Ganze Musterteile können in Abhängig­
+keit von Bedingungen variabel gestaltet werden.
+ Auch der Ablauf von Druckvorgängen kann von Bedingungen
+abhängig gemacht werden. So lassen sich gesteuert Vorspann und
+Nachspann innerhalb des Ausdrucks einfügen und Zwischenüber­
+schriften oder -summen bilden (Gruppenverarbeitung).
+
+#on("b")#Kapitel 14 und 15#off("b")# Für denjenigen, der noch nie mit ELAN zu
+tun
+hatte, werden diese Möglichkeiten sicher nicht ganz einfach zu
+verstehen sein. Obwohl die vorherigen Kapitel viele benutzbare
+Beispiele enthalten, ist zur vollen Ausnutzung ein gewisses Ver­
+ständnis von ELAN notwendig.
+ Dies soll in den Kapitel 14 und 15 vermittelt werden, und zwar
+in dem Umfang, in dem es in EUDAS nötig ist (Sie sollen hier nicht
+zum ELAN-Programmierer ausgebildet werden). Für den ELAN-
+Kenner bieten diese Kapitel sicher nichts Neues, aber sie enthalten
+viele Beispiele und Beschreibungen der Funktionen, die für EUDAS
+wichtig sind.
+ Dabei geht Kapitel 15 weiter auf die Sprachmittel für Zählvor­
+gänge, Auswertungen und statistische Anwendungen ein, während in
+Kapitel 14 die grundlegenden Ausdrücke zur Formulierung von
+Manipulationen besprochen werden.
+
+#on("b")#Kapitel 16#off("b")# Im letzten Kapitel geht es dann wieder
+harmloser zu.
+Hier werden die Funktionen beschrieben, die unter EUDAS zur
+allgemeinen Dateiverwaltung zur Verfügung stehen. Im Grunde sind
+dies alles Funktionen, die vom EUMEL-System zur Verfügung ge­
+stellt werden. EUDAS integriert sie lediglich in ein Menüsystem,
+damit Sie als Benutzer die Funktionen möglichst einfach aufrufen
+können.
+ Aber auch dem erfahrenen EUMEL-Benutzer bieten die Funktio­
+nen einen zusätzlichen Komfort, da auch hier die praktische Aus­
+wahl durch Ankreuzen in allen Funktionen vertreten ist. Außerdem
+wird die Anzahl von Tastendrücken zum Erreichen eines Ziels ver­
+ringert. Daher besteht auch für den "Profi" keine Notwendigkeit,
+grundsätzlich mit einer Kommandoschnittstelle weiterzuarbeiten.
+
+#on("b")#Referenzhandbuch#off("b")# Im Referenzhandbuch sind alle hier
+besproche­
+nen Funktionen noch einmal in einer sehr kurzen, zusammenfassen­
+den und abstrakten Form aufgeführt. Dort sollen Sie nachschlagen,
+wenn Sie eine ganz bestimmte Information suchen und sich mit
+EUDAS bereits auskennen.
+ Sie können jedoch auch ohne das Referenzhandbuch auskommen,
+denn alles, was Sie wissen müssen, steht auch hier im Benutzer­
+handbuch.
+ Das Referenzhandbuch enthält auch einen Teil, der sich spe­
+ziell an den ELAN-Programmierer wendet, der besondere Anwendun­
+gen mit EUDAS realisieren will. Allerdings sollten alle dort be­
+schriebenen Möglichkeiten mit Vorsicht betrachtet werden, da sie im
+Normalfall nicht so abgesichert sind, wie die hier beschriebenen
+Fähigkeiten. Auch sollten Sie mit den Einsatzmöglichkeiten von
+ELAN, wie sie in den Kapitel 11 und 13 beschrieben sind, wirklich
+alle praktischen Probleme erledigen können.
+
diff --git a/doc/eudas/eudas.hdb.9 b/doc/eudas/eudas.hdb.9
new file mode 100644
index 0000000..341feca
--- /dev/null
+++ b/doc/eudas/eudas.hdb.9
@@ -0,0 +1,556 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (83)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+9 Das virtuelle Dateikonzept
+
+
+
+9.1 Konzept
+
+Bisher haben Sie zu einem Zeitpunkt immer nur eine EUDAS-Datei
+bearbeiten können. Wenn Sie zu einer anderen Datei wechseln woll­
+ten, mußten Sie die eine Datei sichern und die andere Datei wieder
+öffnen. Es gibt jedoch Fälle, in denen Beziehungen zwischen mehre­
+ren Dateien bestehen. Daher kann EUDAS auch mit mehreren Dateien
+gleichzeitig umgehen.
+ Es hat jedoch Vorteile, wenn man nur mit einer Datei arbeitet.
+Sie müssen dann nicht immer den Namen der gewünschten Datei
+angeben, wenn Sie eine Funktion ausführen. Dies brauchen Sie nur
+einmal beim Öffnen zu tun - danach ist eindeutig festgelegt, wel­
+che Datei gemeint ist.
+ EUDAS versucht diese Vorteile auch bei mehreren Dateien zu
+erhalten. Die verschiedenen Dateien werden so kombiniert, daß eine
+neue Datei entsteht. Sie arbeiten dann nur mit dieser Datei, die alle
+Daten der Einzeldateien enthält.
+ Damit Sie aber nicht so lange warten müssen, geschieht dieser
+Kombinationsvorgang erst beim Ansehen. Die kombinierte Datei ist
+also nicht wirklich vorhanden, sondern ihre Einzelsätze werden nur
+bei Bedarf erzeugt. Daher heißt diese Gesamtdatei auch #on("i")#virtuelle#off("i")#
+(scheinbare) Datei.
+ Eine Kombination von Dateien ist auf zwei Arten möglich. Sie
+können gleichartige Dateien hintereinander#on("i")#ketten#off("i")#, oder Sie können
+Dateien über gemeinsame Felder #on("i")#koppeln#off("i")#. Beide Methoden können
+auch kombiniert werden.
+
+#on("b")#Änderungen#off("b")# Die virtuelle Datei kann auch verändert werden.
+Die
+Veränderungen werden dann in den entsprechenden Ursprungsda­
+teien vorgenommen. Es ist jedoch nicht immer eindeutig, wie diese
+Änderungen aussehen sollen. Achten Sie daher auf die speziellen
+Regeln, die bei solchen Änderungen gelten, damit Sie die Auswir­
+kungen einer Änderung abschätzen können.
+ Wenn Sie Veränderungen vorgenommen haben, müssen Sie die
+Arbeitskopien anschließend wieder sichern. Denken Sie daran, daß
+EUDAS immer auf unbenannten Kopien arbeitet, wenn Sie ändern
+wollen. Beim Sichern von mehreren Dateien wird Ihnen zu jeder
+Datei einzeln angezeigt, ob sie tatsächlich verändert wurde. Sie
+können dann ebenfalls einzeln entscheiden, ob Sie die Datei sichern
+wollen oder nicht.
+
+
+9.2 Ketten
+
+Wenn Sie einmal EUDAS-Dateien mit mehreren tausend Sätzen er­
+stellen, werden Sie feststellen, daß deren Handhabung recht um­
+ständlich sein kann. Da die Datei sehr groß ist, dauern zum Beispiel
+Kopiervorgänge aufs Archiv viel länger als bei kleinen Dateien.
+ Wenn Sie nun auch noch für jede kleine Änderung die Datei
+vom Archiv holen und anschließend wieder zurückschreiben müssen,
+werden Sie einen Weg suchen, diese Arbeit zu erleichtern. Die ein­
+fachste Möglichkeit wäre, einen schnelleren Rechner zu kaufen. Dies
+ist gleichzeitig aber auch die teuerste.
+
+
+#free (4.5)#
+
+#center#Abb. 9-1 Verkettung von A und B
+
+
+EUDAS ermöglicht es Ihnen nun, die große Datei in mehrere kleine
+aufzuspalten. In der Regel gibt es bei solch großen Dateien ein
+Kriterium, nach dem die Sätze in verschiedene Dateien verteilt
+werden können. Jede einzelne Datei kann nun bequem geändert
+werden.
+ Ein Problem entsteht jedoch, wenn alle Dateien zusammen ver­
+arbeitet werden müssen (zum Beispiel beim Drucken). Für einen
+solchen Vorgang können Sie die kleineren Dateien logisch aneinan­
+derketten.
+ Dies bedeutet für Sie, daß alle kleinen Dateien wie eine große
+Datei wirken. Wenn Sie beim Bewegen in der Datei das Ende einer
+einzelnen Datei erreichen, kommen Sie automatisch an den Anfang
+der nächsten Datei.
+
+#on("b")#Aufruf#off("b")# Damit dies funktioniert, müssen die Dateien
+natürlich
+gleiche Feldstruktur haben. Außerdem ist die Zahl der verkettbaren
+Dateien aus technischen Gründen auf 10 beschränkt.
+ Sie können die Dateien verketten, indem Sie die Funktion
+#free (0.2)#
+
+ K Ketten
+
+#free (0.2)#
+im Menü 'Öffnen' aufrufen.
+
+#on("b")#Änderungen#off("b")# In der virtuellen Datei ist sowohl Einfügen als
+auch
+Ändern erlaubt. Beim Einfügen ist jedoch zu beachten, daß am Ende
+einer Datei nicht angefügt werden kann. Dies liegt daran, daß Sie
+entweder vor dem letzten Satz der einen Datei oder vor dem ersten
+Satz der anderen Datei einfügen. Der Endesatz der einen Datei, der
+normalerweise sichtbar wäre, wird übersprungen.
+ Am Ende der letzten Datei können Sie natürlich anfügen, da
+deren Endemarkierung als Ende der ganzen Datei ja wieder sichtbar
+ist.
+
+
+9.3 Koppeln
+
+Nachdem das Verketten von Dateien noch ganz einfach zu verstehen
+war, kommt jetzt eine Funktion auf Sie zu, die kompliziertere Mög­
+lichkeiten in sich birgt: nämlich das Koppeln.
+ Es kommt häufiger vor, daß sich ein Feld einer Datei auf einen
+bestimmten Satz in einer anderen Datei bezieht. So könnten zum
+Beispiel die Ausleihen einer Bücherei in folgender Datei gespeichert
+sein:
+
+
+ 'Name'
+ 'Vorname'
+ 'Datum'
+ 'Buch-Nr.'
+
+
+Wenn jetzt ein Ausleiher sein Rückgabedatum überschritten hat,
+möchte die Bücherei dem Kunden ein Mahnschreiben schicken. Auf
+diesem Schreiben soll aber nicht die Buch-Nr. erscheinen, sondern
+Autor und Titel des Buches.
+ Diese Sekundärinformationen sind in einer anderen Datei ge­
+speichert, der Bestandskartei:
+
+
+ 'Buch-Nr.'
+ 'Autor'
+ 'Titel'
+ 'Verlag'
+
+
+Alle Dateistrukturen hier sind natürlich zwecks größerer Übersicht­
+lichkeit vereinfacht. Um jetzt dem Kunden das Mahnschreiben zu
+schicken, müssen die Informationen in den beiden Dateien korreliert
+werden.
+
+#on("b")#Aufruf#off("b")# Zuerst wird die Ausleihdatei normal geöffnet. Dazu
+wird dann die Bestandsdatei mit Hilfe der Funktion
+#free (0.2)#
+
+ K Koppeln
+
+#free (0.2)#
+gekoppelt. Dies hat folgenden Effekt:
+ Die Sätze erscheinen normal so, wie sie in der Ausleihdatei
+auftauchen, also für jede Ausleihe genau ein Satz. Dazu erscheint
+aber jeweils die Beschreibung des ausgeliehenen Buches aus der
+Bestandsdatei: die beiden Dateien wurden über das Feld "Buch-Nr."
+gekoppelt.
+ Als Struktur ergibt sich für die kombinierte Datei:
+
+
+ 'Name'
+ 'Vorname'
+ 'Datum'
+ 'Buch-Nr.'
+ 'Titel'
+ 'Autor'
+ 'Verlag'
+
+
+Die Felder der Koppeldatei wurden also noch hinzugefügt.
+
+#on("b")#Koppelfelder#off("b")# Zwei Dinge sind in diesem Zusammenhang
+wichtig:
+Damit der Koppelvorgang ohne allzuviele Vorgaben auskommen kann,
+müssen Felder, über die gekoppelt wird, den gleichen Namen haben
+- und zwar exakt Zeichen für Zeichen. Zum zweiten muß ein solches
+#on("i")#Koppelfeld#off("i")# am Anfang der gekoppelten Datei (in unserem Fall der
+Bestandsdatei) stehen. Dies ist aus technischen Gründen notwendig,
+damit der Koppelvorgang in vernünftiger Geschwindigkeit ablaufen
+kann.
+
+
+#free (7.0)#
+
+#center#Abb. 9-2 Schema des Koppelvorgangs
+
+
+#on("b")#Mehrere Dateien#off("b")# Genau wie beim Ketten ist die Kombination
+der
+Dateien nicht physikalisch, sondern nur scheinbar vollzogen worden.
+Bis zum Limit der maximal geöffneten Dateien (10) können Sie auch
+weitere Dateien dazukoppeln. Die Koppelfelder dieser Dateien kön­
+nen sich jedoch immer nur auf die erste Datei beziehen, also nicht
+auf eine andere Koppeldatei.
+ Dies könnte man in unserem Beispiel ausnutzen. Die Bücherei
+hat sicher auch eine Datei ihrer Mitglieder. Diese könnte etwa so
+aussehen:
+
+
+ 'Name'
+ 'Vorname'
+ 'm/w'
+ 'Strasse'
+ 'PLZ'
+ 'Ort'
+
+
+Diese Datei können wir ebenfalls zur Ausleihdatei dazukoppeln.
+Damit haben wir auch gleich die Quelle gewonnen, aus der wir die
+Anschrift für das Mahnschreiben gewinnen können.
+ Die Kopplung geschieht in diesem Fall über zwei Felder, näm­
+lich 'Name' und 'Vorname'. Damit ein Mitglied eindeutig identifi­
+ziert wird, werden beide Namen gebraucht. Dies berücksichtigt auch
+das Koppelverfahren. Wiederum müssen die Namen exakt mit Namen
+der ersten Datei übereinstimmen.
+ Wenn mehrere Koppelfelder für eine Koppeldatei notwendig sind,
+müssen Sie alle hintereinander stehen. Wäre die Struktur der Mit­
+gliederdatei etwa
+
+
+ 'Name'
+ 'Titel'
+ 'Vorname'
+ 'm/w'
+ 'Strasse'
+ 'PLZ'
+ 'Ort'
+
+
+würde nur über 'Name' gekoppelt, da 'Titel' in der ersten Datei
+nicht vorkommt. Alle weiteren Felder können dann keine Koppelfel­
+der mehr werden. Durch Umstellen der Feldreihenfolge der Koppel­
+datei (durch Umkopieren) oder durch entsprechende Benennung von
+Feldern können Sie immer den gewünschten Effekt erzielen.
+
+
+#free (8.0)#
+
+#center#Abb. 9-3 Aufbau der virtuellen Datei
+
+
+#on("b")#Zusammenfassung#off("b")# An dieser Stelle wollen wir die Ergebnisse
+dieses Abschnitts als Regel zusammenfassen:
+
+#limit (12.0)#
+ Die ersten Felder der Koppeldatei, die wörtlich an be­
+ liebiger Stelle auch in der ersten Datei auftauchen,
+ werden Koppelfelder genannt. Zu einem Satz der ersten
+ Datei wird ein Satz der Koppeldatei gezeigt, der im In­
+ halt der Koppelfelder übereinstimmt.
+#limit (13.5)#
+
+Übersetzt in unser Beispiel heißt dies: 'Buch-Nr.' bzw. 'Name' und
+'Vorname' sind Koppelfelder. Zu einer bestimmten Ausleihe erschei­
+nen die Daten des Buches mit der angegebenen Buch-Nr. bzw. die
+Adresse des Mitgliedes mit den angegebenen Namen.
+
+
+9.4 Auswirkungen des Koppelns
+
+Nachdem Sie nun das Grundprinzip des Koppelns kennen, sollen Sie
+einige Auswirkungen dieses Verfahrens kennenlernen.
+ Ein Beispiel dazu finden Sie in Abb. 9-4. Dargestellt sind je­
+weils die Satznummern und einige Inhalte. Die zweite Zeile in der
+Hauptdatei und die erste in der Koppeldatei stellen das Koppelfeld
+dar.
+
+
+#free (6.5)#
+
+#center#Abb. 9-4 Kombinationen
+
+
+#on("b")#Kombinationen#off("b")# Zuerst muß geklärt werden, was passiert,
+wenn es
+keinen passenden Satz in der Koppeldatei gibt. Zum Beispiel könnte
+eine Buchnummer eingegeben worden sein, die in der Bestandsdatei
+nicht existiert. In diesem Fall zeigt EUDAS für die Felder der Kop­
+peldatei einfach einen leeren Inhalt an (siehe Satz 23 der Haupt­
+datei, es gibt keinen Satz mit 'L' in der Koppeldatei).
+ Wenn umgekehrt zu einem bestimmten Buch keine Ausleihe
+existiert, macht das natürlich nichts - das Buch erscheint nur
+dann, wenn Sie die Bestandsdatei alleine öffnen.
+ Weiterhin kann es passieren, daß es zwei passende Sätze in der
+Koppeldatei gibt. Dies kommt dann vor, wenn zwei Mitglieder glei­
+chen Namen und gleichen Vornamen haben (was gar nicht so selten
+ist). In diesem Fall zeigt EUDAS beide Kombinationen an (siehe
+Satz 23 der Hauptdatei). Die Ausleihe erscheint also zweimal, je­
+weils mit einem anderen Mitglied.
+ Damit man diesen Fall ohne weiteres erkennen kann, führt
+EUDAS bei Kopplungen zwei Nummern: zum einen die normale Satz­
+nummer und zum anderen eine Kombinationsnummer. In dem eben
+besprochenen Fall würde die Satznummer gleichbleiben, die Kombi­
+nationsnummer aber hochgezählt werden. Am Bildschirm wird die
+Kombinationsnummer durch Bindestrich getrennt hinter die Satz­
+nummer geschrieben, wenn Sie Dateien koppeln.
+ Das Durchgehen aller Kombinationen zu einem Satz der Haupt­
+datei passiert aber nur dann, wenn Sie sich mit der Funktion 'Satz
+weiter' in der Datei bewegen. Wenn Sie rückwärts gehen oder auf
+einen bestimmten Satz positionieren, wird immer nur die erste Kom­
+bination angezeigt (Dies hat zum Teil technische Gründe). Beim
+Zurückgehen von Satz 23-1 in dem Beispiel würde also auf Satz
+22-1 positioniert und die Kombination 22-2 übersprungen.
+
+#on("b")#Änderungen#off("b")# Auch wenn Sie Dateien gekoppelt haben, können
+Sie
+immer noch Sätze ändern und einfügen (wenn Sie dies beim Öffnen
+erlaubt haben). Die Auswirkungen der Veränderungen sind jedoch
+nicht mehr ganz so einfach wie bei geketteten Dateien, wo sich die
+Änderungen ja einfach auf den aktuellen Satz bezogen.
+ Als Grundregel gilt, daß Änderungen möglichst wenig Auswir­
+kungen auf die Koppeldateien haben sollen. Das führt dazu, daß
+beim Einfügen eines neuen Satzes oder beim Entfernen eines Satzes
+durch Tragen keine Aktion in der Koppeldatei durchgeführt wird.
+Dies ist auch nicht nötig, denn wenn zum Beispiel ein neuer (zu­
+nächst leerer) Satz eingefügt wird, existiert sowieso noch kein
+passender Satz in der Koppeldatei und die entsprechenden Felder
+bleiben leer. Hingegen darf beim Entfernen eines Satzes der Satz in
+der Koppeldatei nicht entfernt werden, da er ja noch zu einem an­
+deren Satz gehören könnte.
+ Änderungen an den Koppelfeldern können nun zu drei verschie­
+denen Reaktionen führen:
+
+1. Es wird kein Satz der Koppeldatei geändert, sondern nur ein
+ neuer passender Satz gesucht. Dies geschieht immer dann, wenn
+ außer den Koppelfeldern nur leere Inhalte für die Felder der
+ Koppeldatei angegeben sind. Nach dem Ändern oder Einfügen
+ werden dann die Inhalte des neuen Koppelsatzes angezeigt.
+
+ Beispiel: Bei einer Ausleihe geben Sie Name und Vorname des
+ Ausleihers an, nicht aber seine Adresse. Wenn Sie den Satzedi­
+ tor beim Einfügen mit ESC 'q' verlassen, wird die zugehörige
+ Adresse angezeigt (falls der entsprechende Name in der Kop­
+ peldatei vorhanden ist).
+
+2. Es wird ein neuer Satz in der Koppeldatei angefügt. Dies ge­
+ schieht immer dann, wenn die Koppelfelder verändert wurden
+ und die anderen Felder der Koppeldatei nicht leer sind. Da­
+ durch soll verhindert werden, daß die Koppelfelder in einem
+ Satz verändert werden, der vielleicht noch zu einem anderen
+ Satz paßt.
+
+ Beispiel: Sie geben bei einer Ausleihe auch die Adresse mit
+ an. Wenn eine Person mit gleichem Namen und Vornamen bereits
+ existiert, wird die dort gespeicherte Adresse nicht überschrie­
+ ben. Stattdessen wird die zweite Adresse auch in die Koppel­
+ datei eingetragen. Beim nächsten Ansehen bekommen Sie dann
+ zwei Adressen angezeigt. So wird verhindert, daß Sie ungewollt
+ die erste Adresse vernichten.
+
+3. Der Satz in der Koppeldatei wird verändert. Dies geschieht nur
+ dann, wenn die Koppelfelder unverändert geblieben sind, der
+ Rest sich aber geändert hat.
+
+ Beispiel: Sie ändern eine Ausleihe mit der zugehörigen
+ Adresse. Sie geben nur eine neue Straße an und lassen Name
+ und Vorname unverändert. Der Satz in der Koppeldatei enthält
+ anschließend die neue Straße.
+
+Da Koppeldateien keine Sortierung besitzen müssen, werden neue
+Sätze der Koppeldatei immer am Ende angefügt. Dies ist zu beach­
+ten, wenn die Koppeldatei auch allein verwendet werden soll. Ge­
+gebenenfalls müssen Sie die Koppeldatei dann erst sortieren.
+
+
+9.5 Umschalten auf Koppeldatei
+
+Häufig kommt es vor, daß Sie beim Einfügen eines neuen Satzes mit
+gekoppelten Dateien die Verbindung mit einem existierenden Satz
+der Koppeldatei erreichen wollen, aber den notwendigen Inhalt der
+Koppelfelder nicht auswendig wissen.
+ So wollen Sie beim Eingeben einer Ausleihe Name und Vorname
+des Entleihers nicht immer wieder abtippen. Dabei ist auch die
+Gefahr von Eingabefehlern sehr groß. Stattdessen wollen Sie lieber
+erst den Entleiher in der Mitgliederdatei suchen und dessen Namen
+dann automatisch in den Entleihsatz übernehmen.
+ Hierfür bietet Ihnen EUDAS eine Unterstützung an.
+
+#on("b")#Ausführung#off("b")# Während Sie sich in der virtuellen Datei
+befinden,
+können Sie auf eine bestimmte Koppeldatei umschalten, die Sie dann
+wie eine Einzeldatei bearbeiten können. Beim Zurückschalten haben
+Sie dann die Möglichkeit, die Koppelfelder des gefundenen Satzes zu
+übernehmen.
+ Das Umschalten bewirken Sie durch die Tastenkombination ESC
+'K' (großes K) nur im Menü 'Einzelsatz' sowie im Satzeditor beim
+Einfügen und Ändern. An anderen Stellen hat dieser Befehl keine
+Wirkung. Bei mehreren Koppeldateien werden Ihnen die Dateien der
+Reihenfolge nach angeboten. Durch Verneinung aller Fragen können
+Sie die Funktion ohne Wirkung beenden.
+ Haben Sie nun umgeschaltet, wird Ihnen die Koppeldatei dar­
+geboten, als hätten Sie sie allein geöffnet. Sie können die Datei
+auch beliebig ändern (wenn Sie dies beim Öffnen angegeben haben).
+Nur die Anzeige <KOPPEL> in der Bildüberschrift zeigt an, daß Sie
+sich in einer Koppeldatei befinden. Sie können auch Funktionen in
+anderen Menüs aufrufen.
+ Das Zurückschalten geschieht im Menü 'Einzelsatz' mit der
+gleichen Tastenkombination. Alle Einstellungen der virtuellen Datei
+von vorher bis auf die Feldauswahl bleiben erhalten.
+ Wenn Sie nicht im Menü, sondern im Satzeditor (also beim
+Ändern oder Einfügen) umschalten, werden Sie zunächst wieder aus
+dem Satzeditor rausgeworfen. Sie können dann in der Koppeldatei
+den gewünschten Satz aufsuchen (oder neu eintragen). Beim Zurück­
+schalten werden Sie gefragt, ob Sie die Koppelfelder übernehmen
+wollen oder nicht. Danach kehren Sie automatisch wieder in den
+Satzeditor zurück, wobei jetzt die Koppelfelder gegebenenfalls aus­
+gefüllt oder überschrieben sind.
+ Durch erneutes Umschalten können Sie den Vorgang auch für
+weitere Koppeldateien wiederholen.
+ Die Position, die Sie beim Umschalten in der Koppeldatei einge­
+nommen haben, wird bis zum nächsten Umschalten gespeichert. Sie
+kommen dann zunächst wieder auf den gleichen Satz. So können Sie
+die gleichen Koppelfelder wie beim letzten Mal übernehmen, indem
+Sie einfach zweimal ESC 'K' tippen.
+
+#on("b")#Beispiel#off("b")# Der typische Vorgang beim Entleihen würde dann
+wie folgt
+aussehen. Zunächst öffnen Sie die Entleihdatei mit Änderungser­
+laubnis; dann koppeln Sie die Mitgliederdatei und die Bestandsdatei
+dazu.
+ Für eine neue Ausleihe rufen Sie zunächst die Funktion 'Ein­
+fügen' auf. Dann tippen Sie ESC 'K' und schalten auf die Mitglie­
+derdatei um. Dort suchen Sie das Mitglied und schalten wieder zu­
+rück. Existierte das Mitglied noch nicht, können Sie es gleich ein­
+tragen. Beim Zurückschalten übernehmen Sie den Namen des Mit­
+glieds.
+ Dann tragen Sie die Nummer des Buches ein (die müssen Sie nur
+dann suchen, wenn Sie nicht auf dem Buch steht). Das Entleihdatum
+erhalten Sie mit Hilfe der Tastenkombination ESC 'D' (wird im näch­
+sten Kapitel beschrieben).
+ Wollen Sie mehrere Ausleihen für ein Mitglied eintragen, so
+tippen Sie beim nächsten Einfügen einfach zweimal ESC 'K', ohne
+dazwischen eine Positionierung vorzunehmen.
+
+
+9.6 Mehrfachbenutzung
+
+EUDAS ermöglicht es mehreren Benutzern an einem Rechner, mit den
+gleichen Dateien zu arbeiten. Dies ist eigentlich nichts Besonderes,
+denn das EUMEL-System ist ja bereits von Haus aus dazu geeignet.
+Es müssen jedoch einige Schutzvorkehrungen getroffen werden,
+damit dadurch keine Probleme entstehen.
+ Als Grundvoraussetzung für die Mehrfachbenutzung müssen
+EUDAS-Dateien in einer unabhängigen #on("i")#Managertask#off("i")# gespeichert
+sein. Eine Managertask kann man sich durch das Kommando 'global
+manager' einrichten. In dieser Task sollte dann nicht mehr gearbei­
+tet werden.
+ Stattdessen kann sich der Benutzer Dateien aus dieser Mana­
+gertask kopieren und auch wieder dorthin zurückschreiben. Wie Sie
+dies im EUDAS-Menü bewerkstelligen können, wird im Kapitel 16
+beschrieben. Es sei nochmal betont, daß dies eine Methode ist, die
+Sie für beliebige Dateien verwenden können.
+ Im Kapitel 16 ist weiterhin auch beschrieben, wie Sie solche
+Dateien mit #on("i")#Passworten#off("i")# schützen können, so daß sie nicht jeder
+benutzen kann. Schauen Sie bei Bedarf dort nach.
+
+
+#free (7.7)#
+
+#center#Abb. 9-5 Mehrfachbenutzung
+
+
+#on("b")#Konflikte#off("b")# Wir wollen uns jedoch jetzt um ein Problem
+kümmern, das
+bei dieser Art von Mehrfachbenutzung auftritt. Nehmen wir an,
+unsere Bücherei habe zwei Plätze, an denen Entleihen durchgeführt
+werden können. Beide Plätze sollen mit der gleichen Entleihdatei
+arbeiten (wie Sie gleich noch sehen werden und aus anderen Grün­
+den würde man EUDAS für eine solche Bücherei nicht einsetzen -
+wir wollen hier nur das Prinzip illustrieren).
+ Der Ablauf wäre dann folgendermaßen. Jeder Platz kopiert sich
+für eine Entleihe die gemeinsame Datei aus der Managertask, öffnet
+sie, trägt die Entleihe ein und sichert die Datei wieder. Dann wird
+die Datei in die Managertask zurückgeschrieben, wo sie die alte
+Entleihdatei ersetzt.
+ Abgesehen von dem viel zu hohen manuellen Aufwand kann der
+Fall eintreten, daß beide gleichzeitig eine Entleihe bearbeiten.
+Nehmen wir an, beide benutzen die Entleihdatei mit dem symboli­
+schen Inhalt A. Auf Platz 1 kommt noch die Entleihe B, auf Platz 2
+die Entleihe C dazu. Platz 1 will anschließend den Inhalt AB zu­
+rückschreiben, Platz 2 den Inhalt AC.
+ Je nach der zeitlichen Reihenfolge wird nur eine der beiden
+Versionen übrigbleiben, da derjenige, der später zurücksichert, die
+vorherige Version überschreibt. Richtig sollte die endgültige Version
+ABC herauskommen. Unser Beispiel führt jedoch auf jeden Fall zu
+einer fehlerhaften Datei.
+ Grund dafür ist, daß beim Zurückschreiben der ganzen Datei ein
+Platz gesperrt werden muß, während der andere Platz eine Datei
+zum Ändern angefordert hat. Man könnte auch dazu übergehen, nur
+einzelne Sätze zu übertragen; diese Methode wird jedoch von EUDAS
+wegen des hohen Aufwandes nicht unterstützt (daher würde man
+EUDAS eben auch nicht für eine Mehrplatz-Bücherei nehmen).
+ In vielen Fällen reicht das Sperren ganzer Dateien jedoch aus,
+besonders, wenn nicht ganz so häufig an einzelnen Sätzen geändert
+wird. EUDAS bietet dafür neben der notwendigen Sperre auch noch
+eine automatische Versendung der Dateien an.
+
+#on("b")#Manager#off("b")# Es bietet sich an, dieses Kopieren der Dateien
+beim Öff­
+nen (auch Koppeln und Ketten) und Sichern automatisch durchzu­
+führen. Als Voraussetzung dafür müssen Sie EUDAS angeben, mit
+welcher Managertask Sie arbeiten wollen. Dazu dient die Funktion
+#free (0.2)#
+
+ M Manager
+
+#free (0.2)#
+im Menü 'Öffnen'. Sie werden dann nach dem Namen der Task ge­
+fragt. Geben Sie keinen Namen an, wird der Managermodus wieder
+ausgeschaltet. Welche Task als Manager eingestellt ist, sehen Sie in
+der untersten Bildschirmzeile.
+ In der Task, die Sie angeben, muß EUDAS insertiert sein (oder
+in einem Vater), da sonst die Sperre nicht funktioniert.
+ Wenn Sie nun einen solchen Manager angegeben haben, können
+Sie beim Öffnen Dateinamen aus dieser Task angeben. Auch bei ESC
+'z' werden Ihnen alle Namen aus dem Manager mit angeboten. Wenn
+Sie einen solchen Namen angeben, der nicht aus Ihrer eigenen Task
+stammt, wird die Datei vor dem Öffnen automatisch kopiert. Wenn
+Sie angegeben haben, daß Sie die Datei verändern wollen, wird in
+der Managertask eine entsprechende Sperre gesetzt.
+ Wenn Sie die Datei nach Änderungen dann sichern, wird die
+geänderte Kopie zurückgeschrieben. Die Sperre wird jedoch erst
+dann aufgehoben, wenn Sie die Arbeitskopien endgültig löschen.
+ Möchte nun ein anderer Benutzer diese Datei öffnen, während
+Sie sie ändern, kann er dies nur, wenn er sie nicht ändern will.
+Natürlich wird die Datei dann auch nicht wieder zurückgeschickt.
+Will er sie ändern, erhält er eine Fehlermeldung und kann den
+Versuch später wiederholen.
+
+#on("b")#Vorsichtsmaßregeln#off("b")# Bedenken Sie, daß der Schutz nur
+wirksam sein
+kann, wenn Sie diesen Vorgang nicht unter Umgehung der Menü­
+steuerung ausführen. Würden Sie sich zum Beispiel eine Datei vom
+Manager holen (s. Kapitel 16), ohne daß Sie ein Änderungsvorhaben
+anmelden können, können Sie diese Datei ja trotzdem ändern und
+wieder zurückschicken. In diesem Fall hat EUDAS keine Kontrolle
+mehr über die Datei.
+ Aus dem gleichen Grund sollten Sie sich die Managertask auch
+nicht an Ihren Bildschirm holen, denn auch dann könnten Sie ohne
+Kontrolle Änderungen durchführen (zudem kann der Manager wäh­
+rend dieser Zeit nicht auf andere Benutzer reagieren).
+ Nur wenn Sie eine neue Datei im Manager anlegen, müssen Sie
+dies von Hand tun. Dazu erstellen Sie die Datei ganz normal und
+schreiben Sie mit der in Kapitel 16 beschriebenen Funktion zum
+Manager. Sie sollten jedoch darauf achten, daß dort nicht schon
+eine Datei gleichen Namens liegt (EUDAS fragt ja dann, ob über­
+schrieben werden soll).
+
diff --git a/doc/eudas/eudas.hdb.inhalt b/doc/eudas/eudas.hdb.inhalt
new file mode 100644
index 0000000..62134f8
--- /dev/null
+++ b/doc/eudas/eudas.hdb.inhalt
@@ -0,0 +1,133 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+Inhalt
+
+
+
+ Vorwort . . . . . . . . . . . . . . . . . . . i
+ Inhalt . . . . . . . . . . . . . . . . . . . . iii
+
+
+I. Die ersten Schritte
+
+#on("b")#1 Was kann EUDAS ?#off("b")#
+#free (0.2)#
+1.1 Textverarbeitung und Datenverwaltung . . . . . 3
+1.2 EUDAS als Karteikasten . . . . . . . . . . . . 5
+1.3 Drucken . . . . . . . . . . . . . . . . . . . 7
+1.4 Grenzen . . . . . . . . . . . . . . . . . . . 9
+
+#on("b")#2 Installation#off("b")#
+#free (0.2)#
+2.1 Lieferumfang . . . . . . . . . . . . . . . . . 11
+2.2 Single-User . . . . . . . . . . . . . . . . . 12
+2.3 Multi-User . . . . . . . . . . . . . . . . . . 13
+
+#on("b")#3 Ein Beispiel zum Ausprobieren#off("b")#
+#free (0.2)#
+3.1 Start . . . . . . . . . . . . . . . . . . . . 15
+3.2 Daten eintragen . . . . . . . . . . . . . . . 16
+3.3 Daten abfragen . . . . . . . . . . . . . . . . 21
+3.4 Drucken . . . . . . . . . . . . . . . . . . . 22
+3.5 Ergebnis . . . . . . . . . . . . . . . . . . . 24
+
+
+II. Einführung in die Benutzung
+
+#on("b")#4 Umgang mit Dateien und Menüs#off("b")#
+#free (0.2)#
+4.1 EUDAS-Dateien . . . . . . . . . . . . . . . . 27
+4.2 EUDAS-Menüs . . . . . . . . . . . . . . . . . 29
+4.3 Archivmenü . . . . . . . . . . . . . . . . . . 32
+4.4 Dateiverwaltung . . . . . . . . . . . . . . . 37
+4.5 Bedienungsregeln . . . . . . . . . . . . . . . 39
+
+#on("b")#5 Gespeicherte Daten abfragen#off("b")#
+#free (0.2)#
+5.1 Öffnen . . . . . . . . . . . . . . . . . . . . 43
+5.2 Bewegen . . . . . . . . . . . . . . . . . . . 45
+5.3 Suchen . . . . . . . . . . . . . . . . . . . . 46
+5.4 Suchbedingungen . . . . . . . . . . . . . . . 49
+
+#on("b")#6 Daten eingeben und ändern#off("b")#
+#free (0.2)#
+6.1 Neue Datei einrichten . . . . . . . . . . . . 51
+6.2 Sätze einfügen . . . . . . . . . . . . . . . . 52
+6.3 Daten ändern . . . . . . . . . . . . . . . . . 55
+6.4 Arbeitskopie sichern . . . . . . . . . . . . . 56
+
+#on("b")#7 Ausdrucken der Daten#off("b")#
+#free (0.2)#
+7.1 Druckmuster . . . . . . . . . . . . . . . . . 61
+7.2 Aufruf . . . . . . . . . . . . . . . . . . . . 64
+7.3 Abschnitte . . . . . . . . . . . . . . . . . . 67
+7.4 Feldmuster . . . . . . . . . . . . . . . . . . 69
+
+#on("b")#8 Was war und was noch kommt#off("b")#
+#free (0.2)#
+8.1 Rückblick . . . . . . . . . . . . . . . . . . 75
+8.2 Ausblick . . . . . . . . . . . . . . . . . . . 76
+
+
+III. Weitere Möglichkeiten
+
+#on("b")#9 Das virtuelle Dateikonzept#off("b")#
+#free (0.2)#
+9.1 Konzept . . . . . . . . . . . . . . . . . . . 83
+9.2 Ketten . . . . . . . . . . . . . . . . . . . . 84
+9.3 Koppeln . . . . . . . . . . . . . . . . . . . 85
+9.4 Auswirkungen des Koppelns . . . . . . . . . . 89
+9.5 Umschalten auf Koppeldatei . . . . . . . . . . 92
+9.6 Mehrfachbenutzung . . . . . . . . . . . . . . 93
+
+#on("b")#10 Datenabfrage am Bildschirm#off("b")#
+#free (0.2)#
+10.1 Feldauswahl . . . . . . . . . . . . . . . . . 97
+10.2 Satzeditor . . . . . . . . . . . . . . . . . . 98
+10.3 Suchmuster . . . . . . . . . . . . . . . . . . 99
+10.4 Markieren . . . . . . . . . . . . . . . . . . 104
+10.5 Übersicht . . . . . . . . . . . . . . . . . . 105
+
+#on("b")#11 Funktionen zur Bearbeitung#off("b")#
+#free (0.2)#
+11.1 Sortieren . . . . . . . . . . . . . . . . . . 109
+11.2 Kopieren . . . . . . . . . . . . . . . . . . . 112
+11.3 Tragen . . . . . . . . . . . . . . . . . . . . 118
+11.4 Automatische Änderungen . . . . . . . . . . . 121
+
+#on("b")#12 Weitere Möglichkeiten zum Drucken#off("b")#
+#free (0.2)#
+12.1 Anschluß an die Textverarbeitung . . . . . . . 123
+12.2 Spaltendruck . . . . . . . . . . . . . . . . . 126
+12.3 Modi . . . . . . . . . . . . . . . . . . . . . 128
+
+#on("b")#13 Programmierung von Druckmustern#off("b")#
+#free (0.2)#
+13.1 Abkürzungen . . . . . . . . . . . . . . . . . 133
+13.2 Bedingte Musterteile . . . . . . . . . . . . . 141
+13.3 Übersetzung . . . . . . . . . . . . . . . . . 142
+13.4 Gruppen . . . . . . . . . . . . . . . . . . . 144
+
+#on("b")#14 Ausdrücke in ELAN#off("b")#
+#free (0.2)#
+14.1 Was sind Ausdrücke ? . . . . . . . . . . . . . 151
+14.2 Datentypen . . . . . . . . . . . . . . . . . . 152
+14.3 TEXT-Funktionen . . . . . . . . . . . . . . . 156
+14.4 Rechenfunktionen . . . . . . . . . . . . . . . 160
+14.5 Abfragen . . . . . . . . . . . . . . . . . . . 161
+
+#on("b")#15 Anweisungen in ELAN#off("b")#
+#free (0.2)#
+15.1 Variablen und Zuweisungen . . . . . . . . . . 165
+15.2 Weitere Konstruktionen . . . . . . . . . . . . 168
+
+#on("b")#16 Dateiverwaltung mit EUDAS#off("b")#
+#free (0.2)#
+16.1 Dateien im System . . . . . . . . . . . . . . 171
+16.2 Dateien auf dem Archiv . . . . . . . . . . . . 174
+
+
+IV. Anhang
+
+ Register . . . . . . . . . . . . . . . . . . . 181
+
diff --git a/doc/eudas/eudas.hdb.macros b/doc/eudas/eudas.hdb.macros
new file mode 100644
index 0000000..d06e6d1
--- /dev/null
+++ b/doc/eudas/eudas.hdb.macros
@@ -0,0 +1,80 @@
+#*format#
+#limit (13.5)##start (3.5,2.5)##pagelength (21.0)##block#
+#:firsthead (false)#
+#linefeed (1.07)#
+#*macro end#
+#*text#
+#type ("prop10")#
+#linefeed (1.07)#
+#*macro end#
+#*beispiel#
+#type ("12")#
+#linefeed (0.97)#
+#*macro end#
+#*bildschirm#
+#type ("17")#
+#linefeed(0.83)#
+#*macro end#
+#*proc#
+#type ("12")#
+#*macro end#
+#*endproc#
+#free (0.1)#
+#type ("prop10")#
+#linefeed (1.0)#
+#*macro end#
+#*abschnitt ($1,$2,$3)#
+#headodd#
+#on("b")#$1#right#$3 %#off("b")#
+#free (1.0)#
+#end#
+#on("b")##ib(9)#$1#ie(9,"   $3")# $2#off("b")#
+#*macro end#
+#*char($1)#
+$1
+#*macro end#
+#*kapitel ($1,$2,$3,$4)#
+#free (1.3)#
+#"nlq"#
+#type("roman.24")#
+#on("b")##center#$1#off("b")#
+#free (0.2)#
+#type ("roman.18")#
+#on("b")##center#$2 #off("b")#
+#on("b")##center# $3#off("b")#
+#on("b")##center#$4#off("b")#
+#type ("prop10")#
+#free (0.6)#
+#headeven#
+#on("b")#% $2 $3 $4#off("b")#
+#free (1.0)#
+#end#
+#headodd#
+#right##on("b")#%#off("b")#
+#free (1.0)#
+#end#
+#*macro end#
+#*f2#
+#free (0.2)#
+#*macro end#
+#*a ($1)#
+#on("b")#$1.#off("b")# 
+#*macro end#
+#*bsp ($1)#
+#type("12")#$1#type("prop")#
+#*macro end#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/eudas/eudas.hdb.titel b/doc/eudas/eudas.hdb.titel
new file mode 100644
index 0000000..b8cc805
--- /dev/null
+++ b/doc/eudas/eudas.hdb.titel
@@ -0,0 +1,99 @@
+#limit (14.0)#
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#E U D A S
+
+
+
+
+#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#
+
+#free (6.0)#
+#on("b")#EUDAS#off("b")#
+#free (1.0)#
+#on("b")#Anwender-#off("b")#
+#on("b")#Datenverwaltungssystem#off("b")#
+#free (2.0)#
+#on ("b")#VERSION 4#off("b")#
+#free(1.0)#
+#on("u")#                                                    #off("u")#
+#free (0.5)#
+#on("b")#BENUTZERHANDBUCH#off("b")#
+#block#
+#page#
+#free (12.0)#
+Ausgabe Juli 1987
+
+Dieses Handbuch und das zugehörige Programm sind urheberrechtlich
+geschützt. Die dadurch begründeten Rechte, insbesondere der Ver­
+vielfältigung in irgendeiner Form, bleiben dem Autor vorbehalten.
+
+Es kann keine Garantie dafür übernommen werden, daß das Pro­
+gramm für eine bestimmte Anwendung geeignet ist. Die Verantwor­
+tung dafür liegt beim Kunden.
+
+Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrekt­
+heit und Vollständigkeit der Angaben wird aber keine Gewähr über­
+nommen. Das Handbuch kann jederzeit ohne Ankündigung geändert
+werden.
+
+(c) Copyright 1987 Thomas Berlage
+ Software-Systeme
+ Im alten Keller 3
+#free (0.1)#
+ D-5205 Sankt Augustin 1
+#page#
+#free (7.0)#
+#center##on("b")#I.#off("b")#
+#free (1.0)#
+#center##on("b")#DIE#off("b")#
+#center##on("b")#ERSTEN#off ("b")#
+#center##on("b")#SCHRITTE#off("b")#
+#page#
+#free (7.0)#
+#center##on("b")#II.#off("b")#
+#free (1.0)#
+#center##on("b")#EINFÜHRUNG#off("b")#
+#center##on("b")#IN DIE#off ("b")#
+#center##on("b")#BENUTZUNG#off("b")#
+#page#
+#free (7.0)#
+#center##on("b")#III.#off("b")#
+#free (1.0)#
+#center##on("b")#WEITERE#off("b")#
+#center##on("b")#MÖGLICHKEITEN#off("b")#
+#page#
+#free (7.0)#
+#center##on("b")#IV.#off("b")#
+#free (1.0)#
+#center##on("b")#ANHANG#off("b")#
+
+
+
+
+
+
+
+
diff --git a/doc/eudas/eudas.hdb.vorwort b/doc/eudas/eudas.hdb.vorwort
new file mode 100644
index 0000000..6f7f17c
--- /dev/null
+++ b/doc/eudas/eudas.hdb.vorwort
@@ -0,0 +1,89 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#EUDAS
+
+
+
+
+#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#
+Vorwort
+
+
+
+Lieber EUDAS-Benutzer !
+
+Dieses Handbuch soll Sie bei Ihrer Arbeit mit EUDAS begleiten. Ob­
+wohl EUDAS nicht schwierig zu bedienen ist, gibt es doch eine Reihe
+von Dingen zu lernen, ehe Sie ein EUDAS-Spezialist geworden sind.
+ Um Ihnen diesen Weg möglichst einfach zu machen, ist die
+EUDAS-Dokumentation in zwei Handbücher aufgeteilt. Dies ist das
+#on("b")#Benutzerhandbuch#off("b")#, das Ihnen eine gut lesbare Einführung in alle
+Fähigkeiten von EUDAS bieten soll. Außerdem gibt es noch das
+#on("b")#Referenzhandbuch#off("b")#, das Ihnen zum Nachschlagen und als Hilfe beim
+Programmieren dienen soll.
+
+ Bis Sie EUDAS gut beherrschen, sollten Sie sich also mit dem
+Benutzerhandbuch beschäftigen. Das Benutzerhandbuch ist nochmal
+in drei Teile aufgeteilt, um Ihnen das Lernen zu erleichtern. In
+jedem Teil werden die vorher behandelten Dinge zyklisch wieder
+aufgenommen und auf höherem Niveau erweitert.
+ Der allererste Teil des Handbuchs umfaßt nur drei Kapitel und
+soll Ihnen über den ersten Tag mit EUDAS hinweghelfen. Dort finden
+Sie eine Übersicht, was Sie mit EUDAS anfangen können, wie Sie das
+Programm auf Ihrem Rechner installieren und ein kurzes Beispiel
+zum Ausprobieren.
+ Im zweiten Teil lernen Sie dann die Grundkonzepte von EUDAS
+anhand von zahlreichen Beispielen kennen. Sie sollten die Beispiele
+am Rechner ausprobieren und ihre Bedeutung verstehen. Nach dem
+Durcharbeiten dieses Teils (was höchstens wenige Tage in Anspruch
+nimmt) sind Sie dann in der Lage, EUDAS für eigene Zwecke anzu­
+wenden.
+ Wenn Ihre Ansprüche dann wachsen, sollten Sie sich mit dem
+dritten Teil befassen. Hier erhalten Sie Einblick in weitergehende
+Möglichkeiten von EUDAS. Die einzelnen Kapitel sind relativ unab­
+hängig voneinander, so daß Sie nur die für Sie interessanten
+genauer durchlesen müssen.
+ In Kapitel 8 finden Sie als Orientierung nicht nur eine Wieder­
+holung dessen, was Sie im zweiten Teil gelernt haben sollten, son­
+dern auch eine Übersicht, welche weiteren Möglichkeiten im dritten
+Teil noch beschrieben werden.
+
+ Im Referenzhandbuch finden Sie später, wenn Sie einige Erfah­
+rung gesammelt haben, eine genaue Beschreibung der Wirkungsweise
+aller Funktionen. Um diese zu verstehen, sollten Sie jedoch bereits
+eine grobe Ahnung der Wirkungsweise haben.
+ Als zweites finden Sie im Referenzhandbuch Informationen für
+Programmierer, die EUDAS-Funktionen in eigenen Programmen ver­
+wenden wollen. Dies sollte jedoch in den meisten Fällen nicht not­
+wendig sein, so daß dieser Teil für Spezialisten reserviert bleibt.
+
+ Trotz größter Bemühungen kann das Handbuch natürlich nicht
+frei von Unklarheiten und Fehlern sein. Anregungen und Kritik sind
+daher dringend erwünscht, um diese Dokumentation zu verbessern.
+
+Und nun viel Spaß bei Ihrer Arbeit mit EUDAS !
+
diff --git a/doc/eudas/eudas.ref.1 b/doc/eudas/eudas.ref.1
new file mode 100644
index 0000000..7c66368
--- /dev/null
+++ b/doc/eudas/eudas.ref.1
@@ -0,0 +1,326 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (3)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+Zustände und Bedienung
+
+
+
+1.1 Zustände
+
+EUDAS befindet sich zu jeder Zeit in einem von 11 verschiedenen
+Zuständen. Für jeden Zustand ist festgelegt, welche Eingabetasten
+benutzt werden können und welche Wirkung sie haben. Bestimmte
+Tastenfunktionen führen in einen anderen Zustand. Obwohl für
+jeden Zustand andere Tastenkombinationen gültig sind, wird für die
+gleiche Funktion in jedem Zustand auch die gleiche Taste oder
+Tastenkombination verwendet.
+ Die wichtigsten Tastenfunktionen eines Zustandes werden in
+der #on("i")#Statuszeile#off("i")# am oberen Bildschirmrand angezeigt.
+ Im folgenden sind alle möglichen Zustände als Übersicht be­
+schrieben. Eine Übersicht der Zustandsübergänge enthält Abb. 1-1.
+ Zu jedem Zustand wird die entsprechende Statuszeile darge­
+stellt sowie alle möglichen Tastenfunktionen und ihre Bedeutung.
+
+EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
+
+_____________________________________________________
+
+OBEN Anwahl der nächsthöheren Funktion
+UNTEN Anwahl der nächsttieferen Funktion
+RECHTS Anwahl des nächsten Menüs zur Rechten
+LINKS Anwahl des nächsten Menüs zur Linken
+HOP OBEN Anwahl der ersten Funktion
+HOP UNTEN Anwahl der letzten Funktion
+'1' .. '6' Anwahl des entsprechenden Menüs
+LEER Ausführen der gewählten Funktion
+'Buchstabe' Ausführen der Funktion mit 'Buchstabe' davor
+ESC '?' Hilfestellung zur gewählten Funktion
+ESC ESC Eingabe von ELAN-Kommandos
+
+
+HILFE: Beenden: ESC q Seite weiter: ESC w Seite zurueck: ESC z
+
+_____________________________________________________
+
+ESC 'w' Blättern zur nächsten Seite
+ESC 'z' Blättern zur vorigen Seite
+ESC 'q' Verlassen (Rückkehr in alten Zustand)
+
+
+AUSWAHL: Ankreuzen: 'x' Durchstreichen: 'o' Beenden: ESC q Hilfe: ESC ?
+
+_____________________________________________________
+
+'x' Auswahl ankreuzen
+'o' Ankreuzen rückgängig machen
+LEER Ankreuzen und Auswahl sofort verlassen
+OBEN Zur nächsten Auswahl nach oben
+UNTEN Zur nächsten Auswahl nach unten
+HOP OBEN Zur obersten Auswahl bzw. eine Seite zurück
+HOP UNTEN Zur untersten Auswahl bzw. eine Seite weiter
+HOP RETURN Aktuelle Auswahl wird erste auf der Seite
+ESC '1' zur ersten Auswahl
+ESC '9' zur letzten Auswahl
+ESC 'q' Auswahl verlassen und weitermachen
+ESC '?' Hilfe zur Auswahl
+HOP 'x' alle freien Wahlen ankreuzen
+HOP 'o' alle Kreuze entfernen
+ESC 'h' Auswahl und Funktion abbrechen
+
+
+EINGABE: Bestätigen: RETURN Zeigen: ESC z Abbrechen: ESC h Hilfe: ESC ?
+
+_____________________________________________________
+
+RECHTS zum nächsten Zeichen
+LINKS zum vorigen Zeichen
+HOP RECHTS zum letzten Zeichen
+HOP LINKS zum ersten Zeichen
+RUBOUT Zeichen löschen
+RUBIN Einfügemodus umschalten
+HOP RUBOUT Rest der Zeile löschen
+'Zeichen' Zeichen überschreiben oder einfügen
+RETURN Eingabe abschließen und weitermachen
+ESC '?' Hilfe zur Eingabe
+ESC 'h' Eingabe und Funktion abbrechen
+ESC 'z' Auswahl zeigen (falls in Statuszeile aufgeführt)
+
+
+FRAGE: Bejahen: j,J Verneinen: n,N Abbrechen: ESC h Hilfe: ESC ?
+
+_____________________________________________________
+
+'j', 'J' Frage bejahen
+'n', 'N' Frage verneinen
+ESC '?' Hilfe zur Frage
+ESC 'h' Frage und Funktion abbrechen
+
+
+!!! FEHLER !!! Quittieren: ESC q Hilfe zur Meldung: ESC ?
+
+_____________________________________________________
+
+ESC '?' Hilfe zum Fehler
+ESC 'Taste' Fehler quittieren
+'Taste' Fehler quittieren
+
+
+SATZ ÄNDERN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
+SATZ EINFÜGEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
+SUCHMUSTER EINGEBEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
+
+_____________________________________________________
+
+ESC OBEN eine Seite zurück blättern
+ESC UNTEN eine Seite vor blättern
+ESC '?' Hilfe zum Satzeditor
+ESC 'p' ganzen Satz merken (nicht bei Suchmuster)
+ESC 'g' Satz durch gemerkten ersetzen (nicht bei Such­
+ muster)
+ESC 'h' Abbruch der Funktion
+ESC 'D' Tagesdatum schreiben
+ESC 'F' Prüffehler nach Tragen editieren
+ESC 'w' Verlassen und mit nächstem Satz erneut aufrufen
+ (nicht im Suchmuster)
+ESC 'z' Verlassen und mit vorigem Satz erneut aufrufen
+ (nicht im Suchmuster)
+ESC RUBIN Rest der Zeile in neue Zeile umbrechen
+ESC RUBOUT Rest der Zeile löschen
+HOP RUBIN nicht verwenden!
+HOP RUBOUT nicht verwenden!
+
+Weitere Tasten siehe EUMEL-Benutzerhandbuch (Editor).
+
+
+Bitte warten..
+
+_____________________________________________________
+
+keine Tasten erlaubt (außer SV)
+
+
+ZEIGEN: Blättern: HOP OBEN, HOP UNTEN Ende: ESC q Hilfe: ESC ?
+
+_____________________________________________________
+
+HOP OBEN auf erste Zeile bzw. eine Seite zurück
+HOP UNTEN auf letzte Zeile bzw. eine Seite vor
+ESC '?' Hilfe zur Übersicht
+ESC 'h' Abbruch der Funktion
+ESC 'q' Verlassen
+
+
+EDITIEREN: Abbruch: ESC h Verlassen: ESC q Hilfe: ESC ?
+
+_____________________________________________________
+
+ESC 'F' Feldnamen anzeigen und auswählen
+ESC 'h' Abbruch der Funktion
+
+Weitere Tasten siehe EUMEL-Benutzerhandbuch (Editor).
+
+
+Gib Kommando:
+
+_____________________________________________________
+
+Tasten siehe EINGABE.
+
+
+#free (18.5)#
+
+#center#Abb. 1-1 Zustandsübergänge
+
+
+
+
+1.2 Menüs
+
+Menüs dienen zur Auswahl von Funktionen. Sie werden am linken
+Rand des Bildschirms angezeigt. Welches Menü aktiv ist, wird durch
+Markierung des Menünamens in der obersten Bildschirmzeile unter
+allen zur Verfügung stehenden Menüs angezeigt. In jedem Menü ist
+die zuletzt ausgeführte Funktion ebenfalls markiert.
+
+#on("b")#Ausführen von Funktionen#off("b")# Zum Ausführen einer bestimmten
+Funk­
+tion wird mit Hilfe der Cursortasten ein bestimmtes Menü und die
+gewünschte Funktion angewählt. Die Funktion wird dann durch
+Drücken der Leertaste ausgeführt. Alternativ kann auch der vor der
+Funktion stehende Buchstabe gedrückt werden.
+ Die einzelnen Menüs können auch durch Nummern (1 bis 6)
+angewählt werden (absolute Positionierung).
+ Soll eine andere Taste als die Leertaste zum Ausführen ver­
+wendet werden, so kann dies durch die Prozedur 'ausfuehrtaste'
+angegeben werden (s. Abschnitt 10.3).
+ Funktionen, deren Ausführung augenblicklich nicht möglich
+oder nicht sinnvoll ist, werden durch ein vorangestelltes Minuszei­
+chen gekennzeichnet. Sie können zwar angewählt, nicht aber ausge­
+führt werden.
+ Durch ESC '?' wird ein erläuternder Hilfstext zur gerade ange­
+wählten Funktion angezeigt. Näheres dazu s. Abschnitt 1.4.
+ Durch ESC ESC kann ein beliebiges ELAN-Kommando eingegeben
+und ausgeführt werden. Die Eingabe des Kommandos erfolgt in der
+Statuszeile.
+
+
+1.3 Auswahl
+
+Die Auswahlfunktion dient dazu, aus vorhandenen Datei- oder
+Feldnamen in bestimmter Reihenfolge auszuwählen. Die einzelnen
+Namen werden untereinander aufgelistet.
+ Vor jedem Namen ist ein 'o' zum Ankreuzen angegeben. Mit den
+Cursortasten kann der Cursor vor einen bestimmten Namen positio­
+niert werden. Mit 'x' kann dieser Name dann angekreuzt werden. Das
+Ankreuzen kann durch 'o' wieder rückgängig gemacht werden.
+ Die Reihenfolge des Ankreuzens wird durch vorangestellte
+Nummern gekennzeichnet. Die Namen werden von der entsprechenden
+Funktion später in genau dieser Reihenfolge verwendet.
+ Wenn nicht alle Namen auf den Bildschirm passen, kann die
+Darstellung gerollt werden. Ein Teil der Überschrift bleibt dabei
+stehen; am Anfang und am Ende wird jeweils eine Abschlußzeile zur
+Kennzeichnung mitgerollt.
+ Mit ESC '?' kann eine Hilfestellung abgerufen werden. Mit ESC
+'q' wird die Auswahl beendet. Mit ESC 'h' können die Auswahl und
+die in Ausführung befindliche Operation abgebrochen werden.
+
+
+1.4 Hilfe und Dialog
+
+In den meisten Situationen kann durch ESC '?' eine spezifische
+Hilfestellung abgerufen werden. Die Anzeige der Hilfsinformation
+geschieht im rechten Bildschirmteil.
+ Die Texte sind seitenweise aufgebaut. Es wird immer eine Seite
+angezeigt. Mit ESC 'w' bzw. ESC 'z' kann auf die nächste bzw, vorige
+Seite umgeblättert werden. Mit ESC 'q' wird die Hilfestellung wieder
+verlassen und die Situation wiederhergestellt, in der die Hilfe auf­
+gerufen wurde.
+
+#on("b")#Fragen#off("b")# Die meisten Funktionen wickeln zur Eingabe von
+zusätz­
+lichen Parametern oder zum Stellen von Fragen einen Dialog in der
+unteren Schirmhälfte ab. Es gibt zwei Möglichkeiten des Dialogs:
+eine Frage oder die Eingabe eines Textes.
+ Bei einer Frage kann man mit 'j' oder 'n' antworten. Sowohl
+große als auch kleine Buchstaben werden akzeptiert. Mit ESC '?'
+kann eine Hilfsinformation zu der Frage abgerufen werden. ESC 'h'
+bricht die fragende Funktion ab.
+
+#on("b")#Eingabe#off("b")# Bei der Eingabe eines Textes können die üblichen
+Opera­
+tionen zum Editieren in einer Zeile verwendet werden. Die Eingabe
+wird durch RETURN beendet. Auch hier kann durch ESC '?' eine
+Hilfsinformation abgerufen werden. ESC 'h' bricht ebenfalls die fra­
+gende Funktion ab. In einigen Fällen (ersichtlich aus der Statuszei­
+le) kann durch ESC 'z' eine Auswahl der verfügbaren Namen abgeru­
+fen werden.
+
+
+1.5 Editor
+
+Der EUMEL-Editor wird in EUDAS auf zweierlei Weise aufgerufen.
+Zum einen dient er im Satzformular zum Eingeben von Daten und
+Suchmustern. Dort wird er als #on("i")#Satzeditor#off("i")# bezeichnet. Da hier die
+Feldnamen mit berücksichtigt werden müssen, gibt es einige Unter­
+schiede zum normalen Editor.
+ An anderen Stellen wird der Editor ohne Änderungen eingesetzt
+zum Eingeben von Feldnamen oder Mustern. In diesem Fall finden
+Sie die Bedienungshinweise im EUMEL-Benutzerhandbuch.
+
+#on("b")#Satzeditor#off("b")# Beim Ändern, Einfügen und Eingeben des
+Suchmusters
+wird im EUDAS-Formular der Editor aufgerufen. Das Editorfenster
+beschränkt sich auf den rechten Teil des Formulars, der einen Teil
+der Überschrift und die Feldinhalte umfaßt. Im Satzeditor können
+dann die entsprechenden Inhalte eingegeben bzw. verändert werden.
+ Rollen unter Beibehaltung der Korrespondenz ist durch ESC
+OBEN und ESC UNTEN möglich. Diese Funktionen wirken wie bei der
+Anzeige - das Editorfenster wird ebenfalls entsprechend mitgerollt.
+Mit ESC '1' kann wie üblich auf die erste, mit ESC '9' auf die letzte
+Zeile gesprungen werden. Auch diese Funktionen passen die Feld­
+namen entsprechend an.
+ Falls die für ein Feld vorgesehenen Zeilen nicht für den Inhalt
+ausreichen, kann durch ESC RUBIN eine weitere Zeile für dieses Feld
+bereitgestellt werden. ESC RUBIN wirkt wie zweimal HOP RUBIN, die
+Korrespondenz mit den Feldnamen bleibt jedoch gewahrt.
+ Zum Löschen steht ESC RUBOUT zur Verfügung. Es löscht eine
+ganze Zeile, aber nur, wenn für dieses Feld noch andere Zeilen zur
+Verfügung stehen, wird die Zeile tatsächlich vom Bildschirm ent­
+fernt. Im Normalfall bleibt sonst eine Leerzeile für dieses Feld ste­
+hen.
+ Ist die Information für ein Feld auf mehrere Zeilen verteilt, so
+werden diese Zeilen zur Verarbeitung aneinandergehängt. Gegebe­
+nenfalls wird zwischen zwei Zeilen noch ein Leerzeichen eingefügt.
+ Der Editor kann wie üblich mit ESC 'q' verlassen werden. ESC
+'h' bricht die Funktion ab, ohne die erfolgten Änderungen und Ein­
+gaben zu berücksichtigen. Mit ESC 'w' und ESC 'z' kann das Bearbei­
+ten von mehreren Sätzen beschleunigt werden. Durch diese Tasten­
+kombinationen wird der Editor verlassen und die gleiche Operation
+(Ändern/Einfügen) beim nächsten bzw. vorigen Satz wiederholt.
+
+#on("b")#Hinweis#off("b")# Aus technischen Gründen kann das Editorfenster
+gegen­
+über den Feldnamen verschoben werden (durch Rollen mit HOP
+UNTEN zum Beispiel). Dabei geht die sichtbare Korrespondenz zwi­
+schen Feldnamen und Feldinhalten verloren. Ein solcher Fall wird
+durch einen markierten Balken mit entsprechender Meldung ange­
+zeigt. Durch ESC '1' wird das Fenster aber wieder zurechtgerückt.
+ Aus diesem Grund sollte im Satzeditor auf HOP OBEN und HOP
+UNTEN sowie auf RETURN am Ende des Fensters verzichtet werden.
+Auch HOP RUBIN und HOP RUBOUT sollten nicht verwendet werden,
+weil auf diese Weise die Anzahl der Zeilen verändert wird. Eine
+solche Störung kann nicht durch ESC '1' beseitigt werden. Von Hand
+müssen die entsprechenden Zeilen wieder gelöscht oder eingefügt
+werden.
+
+
diff --git a/doc/eudas/eudas.ref.10 b/doc/eudas/eudas.ref.10
new file mode 100644
index 0000000..fbfcf7e
--- /dev/null
+++ b/doc/eudas/eudas.ref.10
@@ -0,0 +1,406 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (97)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+10 Programmierung der Menüs
+
+
+
+10.1 Menüformat
+
+EUDAS verwendet drei verschiedene Strukturen zur Benutzerunter­
+stützung: Menü, Auswahl und Hilfestellung. Ein Menü dient zur
+Auswahl von Funktionen, eine Auswahl bietet Feld- oder Datei­
+namen an und eine Hilfestellung zeigt einen Informationstext.
+ Alle diese Strukturen werden aus einer Initialisierungsdatei
+eingelesen. Die Initialisierungsdatei ist eine normale Textdatei. Ihr
+Format soll in diesem Abschnitt beschrieben werden.
+ Die Strukturen können in beliebiger Reihenfolge in der Initiali­
+sierungsdatei stehen. Jede Struktur wird durch eine spezielle
+Anweisung eingeleitet. Anweisungen beginnen ähnlich wie im
+Druckmuster mit einem Prozentzeichen. Dementsprechend gibt es die
+drei Anweisungen
+
+
+ % MENUE "Name"
+ % AUSWAHL "Name"
+ % HILFE "Gebiet/Name"
+
+
+die jeweils eine Struktur einleiten. Beendet wird eine Definition
+immer mit
+
+
+ % ENDE
+
+
+#on("b")#Menü#off("b")# Für ein Menü wird noch der Text angegeben, der auf
+dem
+Bildschirm erscheinen soll. Er wird durch die Anweisung
+
+
+ % BILD
+
+
+eingeleitet. Danach folgen Zeilen mit dem Bildschirminhalt in der
+gewünschten Größe (die tatsächliche Anzeigegröße wird erst beim
+Aufruf angegeben). Dabei werden die Auswahlpositionen, auf denen
+der Cursor sich bewegen kann, durch ein geschütztes Leerzeichen in
+Spalte 2 festgelegt.
+ Nach der Angabe des Bildes muß für jede mögliche Auswahl­
+position noch eine weitere Angabe gemacht werden. Die Auswahl­
+positionen (oder Felder) werden dabei von oben nach unten durch­
+gezählt. Begonnen wird mit der Nummer 1.
+ Eine Felddefinition hat das Format
+
+
+ % FELD nr "Hilfstext" "Tasten"
+
+
+Die Nummer identifiziert das Feld. Der Hilfstext gibt den Namen der
+Hilfestellung an, die gezeigt werden soll, wenn auf diesem Feld ESC
+'?' gedrückt wird. Die Tasten sind alle Zeichen, die gedrückt werden
+können, um dieses Feld direkt auszuführen.
+ Anschließend an die Felddefinition kann in weiteren Zeilen
+noch ein ELAN-Programm folgen, das bei Auswahl des Feldes aus­
+geführt wird.
+
+#on("b")#Auswahl#off("b")# Für eine Auswahl muß zuerst ein Vorspann angegeben
+werden, der immer in den ersten Bildschirmzeilen der Auswahl an­
+gezeigt wird. Dieser wird durch
+
+
+ % VORSPANN
+
+
+eingeleitet. Danach folgt das Bild. Das Bild setzt sich aus drei Tei­
+len zusammen. Die erste Zeile, in der ein geschütztes Leerzeichen
+vorkommt, bildet den Wiederholungsteil. Diese Zeile wird nachher so
+oft wie nötig mit entsprechenden Inhalten wiederholt, wobei das
+geschützte Leerzeichen als Bindestrich dargestellt wird, auf dem
+sich der Cursor bewegen kann. Die Teile davor und danach werden
+jeweils bei Bedarf mitgerollt.
+ Die Wiederholungszeile darf mehrere geschützte Leerzeichen
+enthalten. Die Inhalte werden dann in mehreren Spalten angezeigt.
+Zu beachten ist, daß vor einem Trennstrich noch mindestens fünf
+Zeichen Platz für eine laufende Nummer bleiben müssen.
+
+#on("b")#Hilfe#off("b")# Der Name einer Hilfestellung setzt sich aus zwei
+Teilen
+zusammen, die durch einen Schrägstrich getrennt werden. Der erste
+Name gibt die Kategorie der Hilfestellung an, der zweite Name den
+Einzeltext. Dies dient dazu, die relativ große Zahl der Hilfstexte
+überschaubar zu machen. Als Beispiel
+
+
+ % HILFE "JA/Allgemein"
+
+
+Eine Hilfestellung besteht einfach aus mehreren Seiten Text. Jede
+Seite wird durch die AnweisungQ
+
+
+Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q
+
+
+Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈
+Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈
+Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈
+Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈
+Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q
+
+
+Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q
+
+
+Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q
+Q̈Q̈Q̈Q̈Q̈Q̈Q̈estellung, wobei die Seiten einfach von 1 an durch­
+gezählt werden. Anschließend darf für diese Seite natürlich kein
+Text folgen.
+
+
+10.2 Verwaltung der Menüs
+
+Alle Menüdaten werden intern in Datenräumen gehalten. Dabei sind
+die einzelnen Strukturen getrennt. Mit 'menuedaten einlesen' kön­
+nen Menüdaten aus einer Struktur gelesen und abgespeichert wer­
+den. Existierende Strukturen werden dabei überschrieben, neue
+hinzugefügt.
+ Mit 'menuenamen' können die vorhandenen Strukturen abgefragt
+werden. Mit 'menue loeschen' werden einzelne Strukturen oder alle
+Menüdaten gelöscht. Damit die Datenräume mit den Menüdaten auch
+an Söhne übergeben werden, ist der 'global manager' entsprechend
+geändert. Dies wird im einzelnen durch 'menue manager' bewirkt.
+Der neue Global Manager akzeptiert auch Anfragen von Tasks, die
+nicht Söhne oder Enkel sind.
+
+
+PROC menuedaten einlesen (TEXT CONST dateiname)
+
+ Die in der Datei enthaltenen Strukturen werden eingelesen und
+ abgespeichert. Treten bei diesem Prozeß Fehler auf, so wird
+ eine entsprechende Meldung ins EUMEL-Notizbuch geschrieben
+ und nachher im Paralleleditor angezeigt.
+
+
+THESAURUS PROC menuenamen (INT CONST index)
+
+ Liefert die Namen der Strukturen. Der Index hat folgende Be­
+ deutung:
+ 1: Hilfskategorien
+ 2: Menüs
+ 3: Auswahlen
+ Ist der Index negativ, so werden die Hilfsnamen der entspre­
+ chenden Hilfskategorie geliefert, die im Thesaurus den Index
+ mit umgekehrtem Vorzeichen hat.
+
+
+PROC menue loeschen (TEXT CONST name, INT CONST index)
+
+ Löscht den Namen in dem Thesaurus mit dem angegebenen In­
+ dex, falls dort der Name vorhanden ist.
+
+
+PROC menue loeschen (BOOL CONST hilfen reduzieren)
+
+ Löscht alle Menüdaten. Ist 'hilfen reduzieren' verlangt, wird
+ beim späteren Einlesen der Hilfstexte jeweils nur der erste
+ Text einer Kategorie gespeichert, um Platz zu sparen.
+
+
+PROC global manager
+
+ Geänderter Manager, der die Menüdatenräume in Söhne trans­
+ portiert und Sperren setzen kann. Ersetzt den normalen 'free
+ global manager'. Nur im Multi-User-System vorhanden.
+
+
+PROC menue manager (DATASPACE VAR ds,
+ INT CONST order, phase,
+ TASK CONST order task)
+
+ Eigentliche Manager-Routine. Kann dazu dienen, Managererwei­
+ terungen vorzunehmen. Nur im Multi-User-System vorhanden.
+ Beispiel: der Manager soll nur Aufträge von Söhnen annehmen.
+
+
+ PROC new manager (DATASPACE VAR ds,
+ INT CONST order, phase,
+ TASK CONST order task):
+
+ LET begin code = 4;
+ IF order task < myself OR order = begin code OR
+ order task = supervisor THEN
+ menue manager (ds, order, phase, order task)
+ ELSE
+ errorstop ("kein Sohn")
+ END IF
+
+ END PROC new manager;
+
+ global manager (PROC new manager)
+ (* startet den Manager *)
+
+
+
+10.3 Aufruf
+
+Menüs werden mit der Prozedur 'menue anbieten' aufgerufen. Dabei
+muß neben den Namen ein Fenster übergeben werden, in dem die
+Menüs dann angezeigt werden. Es ist darauf zu achten, daß das
+Fenster groß genug ist, um wenigstens die Auswahlpositionen im
+Bild zu haben.
+ Außerdem muß eine Prozedur übergeben werden, die die einzel­
+nen Funktionen ausführt. Diese Prozedur erhält als Parameter die
+Nummer der ausgewählten Funktion.
+ Mit 'waehlbar' können Auswahlen gesperrt werden. Diese Anga­
+be kann jedoch nicht vor Aufruf von 'menue anbieten' erfolgen, da
+dann alle Sperren erstmal gelöscht werden. Zum Setzen der Sperren
+beim Betreten eines Menüs dient ein besonderer Code, mit dem die
+übergebene Prozedur aufgerufen wird.
+ Eine Auswahl wird mit der Prozedur 'auswahl anbieten' aufge­
+rufen. Diese bekommt ebenfalls ein Fenster übergeben, außerdem
+den Namen einer Hilfestellung, die bei Bedarf aufgerufen werden
+kann. Weiterhin muß eine Prozedur übergeben werden, die die aus­
+zuwählenden Texte erzeugt. Die gewählten Texte können anschlie­
+ßend mit der Prozedur 'wahl' abgefragt werden.
+ Eine Hilfestellung wird durch die Prozedur 'hilfe anbieten'
+ausgegeben. Dabei muß außer dem Namen auch noch ein Fenster
+übergeben werden.
+ Mit 'status anzeigen' kann ein Text in der Statuszeile ausge­
+geben werden. Die Menüprogramme tun dies für ihren Bereich jedoch
+selbst.
+
+
+PROC menue anbieten (ROW 6 TEXT CONST menuenamen,
+ FENSTER VAR f,
+ BOOL CONST esc erlaubt,
+ PROC (INT CONST, INT CONST) interpreter)
+
+ Die angegebenen Menüs werden in dem Fenster 'f' angezeigt.
+ Das Fenster wird nach Beendigung des Menüs als verändert
+ gekennzeichnet. Die Namen der 6 Menüs werden in die Titelzeile
+ aufgenommen. Die Menünamen sollten mit einer Menüidentifika­
+ tion versehen sein, zum Beispiel "EUDAS.Öffnen". Der Text vor
+ dem Punkt wird an den Anfang der Titelzeile gestellt und bei
+ den einzelnen Menünamen unterdrückt. Nicht benötigte Menüs
+ müssen als "" angegeben werden.
+
+ 'esc erlaubt' gibt an, ob mit ESC ESC ein Kommandodialog ge­
+ führt werden kann. Die übergebene Prozedur muß die einzelnen
+ Funktionen ausführen, die als Zahl übergeben werden. Der
+ Interpreter wird im 'disable stop' aufgerufen, daher ist in der
+ Regel ein 'enable stop' erforderlich.
+
+ Die Parameter für 'interpreter' haben folgende Bedeutung:
+ Par. 1: 0 Aufruf zur Initialisierung der Sperren
+ oder anderen Initialisierungen zu Beginn
+ 1..6 Angabe des aktuellen Menüs
+ Par. 2: 1..23 Aufruf der entsprechenden Funktion
+ 0 Eintritt in ein neues Menü (wird vor der
+ Ausgabe dieses Menüs aufgerufen)
+ -1 Verlassen des Menüs
+ -2 Bildschirmupdate (nach Eintritt in das
+ Menü, wenn das Menü ganz ausgegeben ist,
+ oder wenn der Bildschirm nach 'Gib
+ Kommando:' zerstört worden ist)
+
+ FEHLER:
+
+ #on("i")#"Name" existiert nicht.#off("i")#
+ Das angegebene Menü ist nicht vorhanden.
+
+
+PROC waehlbar (INT CONST menuenr, funktionsnr
+ BOOL CONST moeglich)
+
+ Setzt die Funktionssperre der angegebenen Funktion. Muß in­
+ nerhalb von 'menue anbieten' aufgerufen werden. Zu Beginn von
+ 'menue anbieten' sind jeweils alle Funktionen erlaubt.
+
+
+PROC ausfuehrtaste (TEXT CONST taste)
+
+ Setzt die Taste, die Funktionen ausführt. Ist standardmäßig die
+ Leertaste.
+
+ FEHLER:
+
+ #on("i")#falsche Ausfuehrtaste#off("i")#
+ Es muß ein einzelnes Zeichen angegeben werden, das nicht
+ bereits anderweitig verwendet wird.
+
+
+PROC auswahl anbieten (TEXT CONST name, FENSTER CONST f,
+ TEXT CONST hilfe,
+ PROC (TEXT VAR, INT CONST) inhalt)
+
+ Ruft die Auswahl in dem angegebenen Fenster auf. 'hilfe' wird
+ als Hilfestellung verwendet. Die Prozedur 'inhalt' liefert den
+ Text, der an der n-ten Position stehen soll. Wenn keine wei­
+ teren Texte vorhanden sind, muß für alle weiteren Positionen
+ "" geliefert werden.
+
+ FEHLER:
+
+ #on("i")#"Name" existiert nicht.#off("i")#
+ Die angegebene Auswahl ist nicht vorhanden.
+
+
+INT PROC wahl (INT CONST stelle)
+
+ Liefert die Nummer des Textes, der an der n-ten Stelle ausge­
+ wählt wurde. Wurde kein weiterer Text mehr gewählt, so wird 0
+ geliefert.
+
+
+PROC hilfe anbieten (TEXT CONST name, FENSTER CONST f)
+
+ Bietet den Hilfstext in dem angegebenen Fenster an. Existiert
+ die Hilfe innerhalb der angegebenen Kategorie nicht, wird die
+ erste Hilfe der Kategorie angezeigt.
+
+ FEHLER:
+
+ #on("i")#Hilfe existiert nicht#off("i")#
+ Die angegebene Hilfskategorie ist nicht vorhanden.
+
+
+PROC status anzeigen (TEXT CONST zeile)
+
+ Zeigt den angegebenen Text in der obersten Bildschirmzeile an.
+
+
+10.4 Dialog
+
+EUDAS führt den Benutzerdialog in einem Fenster, dessen Größe
+durch 'dialogfenster' eingestellt wird. Das Dialogfenster wird zei­
+lenweise belegt. 'dialog' reserviert eine neue Zeile für eine beliebi­
+ge Ausgabe. Wenn das Fenster voll ist oder überschrieben wurde,
+wird in der ersten Zeile wieder angefangen. Den gleichen Effekt
+kann man mit 'neuer dialog' erreichen.
+ Mit 'ja' kann man im Dialogfenster eine Frage stellen. Als Ant­
+wort kann auch eine Hilfestellung angefordert werden oder die
+Funktion abgebrochen werden. Mit 'editget' kann man nach Auffor­
+derung einen Text eingeben lassen. Dabei stehen die gleichen
+zusätzlichen Möglichkeiten zur Verfügung.
+ Mit 'fehler ausgeben' kann eine durch 'errorstop' erzeugte Feh­
+lermeldung im Dialogfenster angezeigt werden. Der Benutzer muß
+erst eine Taste drücken, ehe er weitermachen kann. Auch hier kann
+eine Hilfestellung zu der Fehlermeldung abgerufen werden.
+
+
+PROC dialogfenster (INT CONST x, y, xl, yl)
+
+ Gibt die Fenstergröße und -position des Dialogfensters an. Für
+ den ganzen Bildschirm müßte (1, 1, 79, 24) angegeben werden.
+
+
+PROC dialog
+
+ Positioniert den Cursor auf die nächste Dialogzeile im Dialog­
+ fenster. Wurde das Fenster verändert, wird das Fenster ge­
+ löscht und auf die erste Zeile positioniert.
+
+
+PROC neuer dialog
+
+ Sorgt dafür, daß der nächste Aufruf von 'dialog' wieder in
+ einem leeren Fenster beginnt.
+
+
+BOOL PROC ja (TEXT CONST frage, hilfe)
+
+ Stellt die angegebene Frage. Es kann die angegebene Hilfsin­
+ formation abgerufen werden. Außerdem wird durch ESC 'h' ein
+ Abbruch (errorstop ("")) erzeugt.
+
+
+PROC editget (TEXT CONST prompt, TEXT VAR eingabe,
+ TEXT CONST res, hilfe)
+
+ Gibt den Text 'prompt' aus und editiert dahinter 'eingabe'. Es
+ kann die angegebene Hilfsinformation abgerufen werden. 'res'
+ gibt an, bei welchen ESC-Folgetasten das Editieren beendet
+ werden soll. In einem solchen Fall wird als Eingabe (ESC + die
+ gedrückte Taste) zurückgeliefert.
+
+
+PROC fehler ausgeben
+
+ Im Dialogfenster wird die letzte Fehlermeldung ausgegeben.
+ Gleichzeitig wird der Fehlerzustand gelöscht. Der Benutzer muß
+ eine Taste drücken, um weiterzumachen. Alternativ kann die
+ Hilfsinformation "FEHLER/" + text (errorcode) abgerufen wer­
+ den.
+
+
diff --git a/doc/eudas/eudas.ref.11 b/doc/eudas/eudas.ref.11
new file mode 100644
index 0000000..48d36c3
--- /dev/null
+++ b/doc/eudas/eudas.ref.11
@@ -0,0 +1,347 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (105)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+11 Programmierung von Anwendungen
+
+
+
+Zur Realisierung eigener EUDAS-Anwendungen mit Hilfe von ELAN-
+Programmen gibt es mehrere Möglichkeiten mit zunehmender Lei­
+stungsfähigkeit, aber auch steigender Komplexität und Fehleranfäl­
+ligkeit. In den folgenden Abschnitten werden die drei wesentlichen
+Methoden vorgestellt. Sie sollten erst dann eine kompliziertere
+Methode in Angriff nehmen, wenn Sie die einfachere beherrschen.
+
+
+11.1 Musterprogramme
+
+Die bevorzugte Methode zur Erstellung eigener Anwendungen unter
+EUDAS ist die Programmierung von Mustern. EUDAS läßt dies bei
+Druckmustern, Kopiermustern und Änderungsmustern zu.
+ In diesem Fall steuert EUDAS den Ablauf des Programms im
+groben automatisch. Die jeweils unterschiedlichen Anweisungen, was
+im einzelnen zu tun ist, werden in ELAN programmiert. Aus dem
+Muster mit diesen zusätzlichen Anweisungen generiert EUDAS dann
+das Programm und führt es mit Hilfe des ELAN-Compilers aus.
+
+#on("b")#Vorteile#off("b")# Diese Methode hat den Vorteil, daß nur die
+minimal not­
+wendigen Anweisungen tatsächlich selbst programmiert werden
+müssen. Dafür reichen bereits geringe ELAN-Kenntnisse vollkommen
+aus. Ein Muster kann relativ schnell erstellt und getestet werden.
+Durch den einfachen Aufbau ist auch die Fehlerwahrscheinlichkeit
+beim Entwickeln geringer als bei anderen Methoden.
+ Daneben lassen sich die Musterprogramme jeweils bequem im
+Menü durch Angabe des Namens oder durch Ankreuzen ausführen,
+also auch durch unbedarfte Benutzer.
+
+#on("b")#Nachteile#off("b")# Nachteil dieser Methode ist, daß jeweils beim
+Aufruf das
+Programm nochmal neu erzeugt und übersetzt werden muß, da die
+Übersetzung auch von der gerade geöffneten Datei abhängt. Dies
+stört besonders bei umfangreichen Druckmustern (auf langsamen
+Rechnern).
+ Zum zweiten wird ein umfangreiches Druckmuster auch bald
+unübersichtlich, da Strukturierungshilfen für größere Programme
+fehlen. Der eigentliche Mustertext ist dann schwer von den zahlrei­
+chen Abkürzungen zu trennen.
+ Als Abhilfe für diese beiden Nachteile bietet es sich an, um­
+fangreichere Abkürzungen bzw. Ausdrücke eingebettet in ein
+ELAN-Paket aus dem Muster herauszunehmen und vorher zu in­
+sertieren.
+ Dadurch fällt zum einen die ständige Neuübersetzung dieser
+Ausdrücke weg, zum anderen ist das eigentliche Muster wieder
+überschaubar. Voraussetzung zur Anwendung eines solchen Musters
+ist dann jedoch, daß das zugehörige Paket in der jeweiligen Task
+bereits vorher übersetzt wurde.
+ Die nachfolgenden Beispiele zeigen, wie dieses Verfahren in der
+Realität aussehen kann.
+
+#on("b")#Beispiel 1#off("b")# In der Schulverwaltung soll ein Kopier- oder
+Ände­
+rungsmuster erstellt werden, das die Versetzung am Schuljahresende
+realisiert. Angenommen wird eine Datei, die alle Schüler enthält.
+Schüler, die nicht versetzt werden, sind vorher im Feld 'Versetzung'
+mit einem beliebigen Text gekennzeichnet worden (zum Beispiel
+'Nachprüfung' o.ä.).
+ Die Versetzung kann auf zweierlei Weise erfolgen: zum einen
+durch automatische Änderung, wenn die alte Version noch auf einer
+Archivdiskette aufgehoben wird, oder durch Kopieren in eine neue
+Datei.
+ Bei beiden Mustern ist die einzige Änderung die Angabe der
+neuen Klasse. Daher bietet es sich an, eine Prozedur 'neue klasse'
+zu definieren, die als Ergebnis die neue Klasse eines Schülers lie­
+fert. Diese Prozedur kann dann im Änderungsmuster wie folgt ver­
+wendet werden:
+
+
+ "Klasse" V neue klasse;
+
+
+Entsprechend läuft die Verwendung im Kopiermuster:
+
+
+ "Name" K f ("Name");
+ "Vorname" K f ("Vorname");
+ "Klasse" K neue klasse;
+ ...
+
+
+Die Prozedur 'neue klasse' muß dann in einem Paket definiert wer­
+den, das etwa folgendes Aussehen haben könnte (spezifische Ände­
+rungen natürlich möglich):
+
+
+ PACKET klassenwechsel DEFINES neue klasse:
+
+ TEXT PROC neue klasse :
+
+ IF f ("Versetzung") = "" THEN
+ klasse um 1 erhoeht
+ ELSE
+ alte klasse ohne zusatz
+ END IF .
+
+ klasse um 1 erhoeht :
+ INT CONST alte klasse := int (f ("Klasse"));
+ IF alte klasse < 9 THEN
+ "0" + text (alte klasse + 1) + zusatz
+ ELSE
+ text (alte klasse + 1) + zusatz
+ END IF .
+
+ zusatz :
+ f ("Klasse") SUB 3.
+
+ alte klasse ohne zusatz :
+ subtext (f ("Klasse"), 1, 2) .
+
+ END PROC neue klasse;
+
+ END PACKET klassenwechsel;
+
+
+Schüler, die versetzt werden, erhalten ihre neue Jahrgangsstufe mit
+dem alten Klassenzusatz zugeteilt. Dabei ist darauf zu achten, daß
+die Klassen 5 bis 9 eine '0' vorangestellt bekommen, damit die
+Sortierung funktioniert.
+ Schüler, die nicht versetzt werden, behalten ihre alte Jahr­
+gangsstufe, allerdings ohne einen Klassenzusatz, der ihnen an­
+schließend manuell zugewiesen werden muß.
+ Zur Benutzung muß das oben angegebene Paket in eine Text­
+datei geschrieben und mit dem Kommando 'insert' fest insertiert
+werden.
+
+#on("b")#Beispiel 2#off("b")# Aus einer Datei mit bibliographischen Einträgen
+sollen
+bestimmte Literaturhinweise gedruckt werden. Der Literaturhinweis
+soll jeweils als Endlostext umbrochen werden. Dafür müssen in einer
+Abkürzung alle Daten verkettet werden. Es sei das folgende ein­
+fache Druckmuster vorgegeben:
+
+
+ % WIEDERHOLUNG
+ % MODUS 3
+ [&<krz>] &titel
+
+ % ABKUERZUNGEN
+ &krz : f ("Kurzbez") . (* z.B. "Lew84" *)
+ &titel : titel lang .
+
+
+Die Prozedur 'titel lang' wird in folgendem Paket definiert:
+
+
+ PACKET bibliographie DEFINES titel lang :
+
+ TEXT VAR puffer; (* verringert Heap-Belastung *)
+
+ TEXT PROC titel lang :
+
+ puffer := f ("Name 1");
+ puffer CAT ", ";
+ puffer CAT f ("Vorname 1");
+ ggf weitere namen;
+ titel kursiv;
+ enthalten in;
+ erscheinungsort und jahr;
+ puffer .
+
+ ggf weitere namen:
+ IF f ("Name 2") <> "" THEN
+ puffer CAT "; ";
+ puffer CAT f ("Name 2")
+ END IF .
+
+ titel kursiv :
+ puffer CAT " \#on (""i"")\#";
+ puffer CAT f ("Titel");
+ puffer CAT "\#off (""i"")\#, " .
+
+ enthalten in :
+ IF f ("in") <> "" THEN
+ puffer CAT " in: ";
+ puffer CAT f ("in");
+ puffer CAT ", "
+ END IF .
+
+ erscheinungsort und jahr :
+ puffer CAT f ("Ort");
+ puffer CAT ", ";
+ puffer CAT f ("Jahr") .
+
+ END PROC titel lang;
+
+ END PACKET bibliographie;
+
+
+Die Puffervariable wird verwendet, um die bei Verwendung des
+Operators '+' entstehende Heapbelastung zu verringern. An diese
+Variable werden nacheinander alle notwendigen Daten mit den ent­
+sprechenden Trennzeichen angehängt.
+ Im Druckmuster wird dieser lange Text dann im Modus 3 auf
+mehrere Zeilen umbrochen, wobei die Einrückung erhalten bleibt. Die
+Druckausgabe kann dann bei Bedarf noch mit 'lineform' bearbeitet
+werden, um einen noch besseren Umbruch zu erzielen.
+
+
+11.2 Dateianwendungen
+
+Die zweite Möglichkeit der Programmierung unter EUDAS besteht
+darin, ELAN-Programme zu schreiben, die EUDAS-Dateien mit Hilfe
+des in Kapitel 6 beschriebenen Datentyps EUDAT manipulieren. Die
+Programmierung gestaltet sich ähnlich wie mit FILEs.
+
+#on("b")#Vorteile#off("b")# Durch dieses Verfahren haben Sie volle Freiheit
+der Pro­
+grammierung. Da lediglich die Struktur der EUDAS-Dateien als
+Datenspeicher verwendet wird, sind sehr viele Anwendungen denk­
+bar.
+ Außerdem können so beliebig viele Dateien gleichzeitig bear­
+beitet werden. Da die Programme nicht auf die virtuelle Datei zu­
+greifen, ist ein Konflikt mit dem aktuellen Zustand von EUDAS
+nahezu ausgeschlossen.
+
+#on("b")#Nachteile#off("b")# Der Nachteil dieses Verfahrens ist, daß viele
+Dinge
+selbst programmiert werden müssen, so zum Beispiel das Durchgehen
+einer Datei. Auch die Hilfsmittel der virtuellen Datei wie Such­
+muster, Koppeln und alle Anwendungen, die auf die virtuelle Datei
+zugreifen, stehen nicht zur Verfügung.
+
+#on("b")#Beispiel 1#off("b")# Die in Abschnitt 6.6 vorgestellte Anwendung als
+Asso­
+ziativspeicher kann als Beispiel für diese Methode dienen.
+
+#on("b")#Beispiel 2#off("b")# Eine EUDAS-Datei (zum Beispiel eine
+Schülerdatei) soll
+in mehrere Dateien aufgespalten werden (zum Beispiel klassen­
+weise). Dies kann durch das folgende Beispielprogramm bewirkt
+werden:
+
+
+ LET
+ klassenfeld = 3,
+ quellname = "Schüler",
+ zielname = "Jahrgang ";
+ ROW 9 EUDAT VAR ziel;
+ EUDAT VAR quelle;
+ SATZ VAR feldnamen;
+
+ quelle oeffnen;
+ zieldateien einrichten;
+ auf satz (quelle, 1);
+ WHILE NOT dateiende (quelle) REP
+ aktuellen satz kopieren;
+ weiter (quelle)
+ END REP .
+
+ quelle oeffnen :
+ oeffne (quelle, quellname);
+ feldnamen lesen (quelle, feldnamen) .
+
+ zieldateien einrichten :
+ INT VAR i;
+ FOR i FROM 1 UPTO 9 REP
+ oeffne (ziel (i), zielname + text (i + 4));
+ feldnamen aendern (ziel (i), feldnamen)
+ END REP .
+
+ aktuellen satz kopieren :
+ SATZ VAR satz;
+ satz lesen (quelle, satz);
+ satz einfuegen (ziel (stufe), satz);
+ weiter (ziel (stufe)) .
+
+ stufe :
+ TEXT VAR klasse;
+ feld lesen (satz, klassenfeld, klasse);
+ int (klasse) - 4 .
+
+
+
+11.3 Integrierte Anwendungen
+
+Die schwierigste Möglichkeit, Anwendungen unter EUDAS zu reali­
+sieren, ist ihre Integration. Ein solches Programm greift selbst auf
+die virtuelle Datei zu, nutzt die Funktionen von EUDAS so weit wie
+möglich und definiert vielleicht sogar ein eigenes Menü.
+
+#on("b")#Vorteile#off("b")# Auf diese Weise können natürlich alle
+Möglichkeiten
+ausgeschöpft werden. Sie können Programme erstellen, die als eine
+natürliche Erweiterung von EUDAS wirken oder EUDAS ganz erset­
+zen.
+
+#on("b")#Nachteile#off("b")# Eine solche Integration ist aber besonders
+schwierig,
+wenn EUDAS und die Erweiterung nebeneinander benutzt werden
+sollen. In diesem Fall hat EUDAS keine komplette Kontrolle der
+Interaktion, so daß leicht undefinierte Zustände möglich sind.
+ Weniger Probleme treten auf, wenn sichergestellt ist, daß nur
+die Anwendung selbst verwendet wird. Auch in diesem Fall ist zu
+beachten, daß EUDAS nicht als Programmierumgebung für Anwen­
+dungssysteme konzipiert wurde und daher nicht immer leicht zu
+benutzen ist.
+ Am einfachsten ist es noch, nur eigene Menüs für eine andere
+Anwendung zu verwenden, da die Menüprozeduren relativ unabhän­
+gig vom Rest sind.
+
+#on("b")#Richtlinien#off("b")# Bei Erweiterungen von EUDAS sind folgende
+Richtlinien zu beachten:
+
+1. Ein Programm, das selber Dateien für die virtuelle Datei öffnen
+ will, sollte vorher prüfen, ob noch eine Datei geöffnet ist und in
+ diesem Fall abbrechen. Beim Multi-User-Betrieb ist nämlich
+ sonst nicht gewährleistet, daß alle Sperren wieder entfernt
+ werden.
+
+2. Ein solches Programm sollte seine eigenen Dateien vor dem
+ Wechsel zu EUDAS selbst wieder sichern und die Arbeitskopien
+ löschen, damit der Ausgangszustand zu Beginn des Programms
+ wiederhergestellt wird.
+
+3. Programme, die Menüs benutzen, sollten nicht unter EUDAS auf­
+ gerufen werden, da sonst eine Beeinflussung der EUDAS-Menüs
+ möglich ist.
+
+An dieser Stelle soll noch einmal von der Erstellung integrierter
+Anwendungen abgeraten werden, wenn es auch andere Möglichkeiten
+gibt, das gegebene Problem mit EUDAS zu lösen. Der hohe Aufwand
+dieser Methode rechtfertigt sich nur in wenigen Fällen.
+ Experimentierfreudige Anwender werden sich durch diese War­
+nung sowieso nicht abhalten lassen. Ihnen sollte aber bewußt sein,
+daß ein solches Vorgehen auf eigene Gefahr stattfindet und kein
+Anspruch auf Beratung oder Fehlerbeseitigung in einem solchen Fall
+besteht.
+
diff --git a/doc/eudas/eudas.ref.2 b/doc/eudas/eudas.ref.2
new file mode 100644
index 0000000..2447897
--- /dev/null
+++ b/doc/eudas/eudas.ref.2
@@ -0,0 +1,830 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (13)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+2 Zusammenstellung der Funktionen
+
+
+
+Im folgenden finden Sie eine Übersicht über alle Menüfunktionen. Zu
+jeder Funktion ist aufgeführt, welche Parameter angegeben werden
+müssen. Die Parameter werden als Text erfragt. Bei einigen Funk­
+tionen können alle möglichen Parameterwerte mit ESC 'z' (Zeigen)
+als Auswahl abgerufen werden. Bei manchen können in der Auswahl
+mehrere Werte angekreuzt werden, die dann nacheinander abgear­
+beitet werden. Welcher Fall zutrifft, ist jeweils aufgeführt.
+
+
+2.1 Menü 'Öffnen'
+
+
+#linefeed (0.5)#
+#on ("b")#O EUDAS-Datei Öffnen#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
+
+Zweck: Stellt eine EUDAS-Datei als aktuelle Arbeitsdatei ein.
+ Falls eine vorher geöffnete Datei verändert wurde,
+ wird sie nach Anfrage gesichert. Falls die zu öffnende
+ Datei noch nicht existiert, kann sie nach Anfrage
+ eingerichtet werden. Dabei müssen dann die Feld­
+ namen angegeben werden.
+
+ Es wird gefragt, ob die Datei geändert werden soll. In
+ diesem Fall wird eine Arbeitskopie hergestellt. Fast
+ alle EUDAS-Funktionen beziehen sich nachher auf die
+ so eingestellte Datei.
+
+ Ist ein Mehrbenutzer-Manager eingestellt, kann auch
+ eine Datei aus dieser Managertask als Parameter
+ angegeben werden. Die Datei wird dann automatisch
+ von dort kopiert und eine Sperre im Manager gesetzt,
+ falls Änderungen vorgenommen werden sollen.
+
+Verweise: Abschnitt 3.2
+ Benutzerhandbuch Abschnitt 5.1 und 9.1
+
+
+#linefeed (0.5)#
+#on("b")#E EUDAS-Datei Ketten#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: EUDAS-Dateiname, mit Zeigen, mehrfache Wahl
+
+Zweck: Falls bereits eine EUDAS-Datei geöffnet ist, kann eine
+ weitere Datei gleicher Struktur logisch angekettet
+ werden. Bei der Bearbeitung werden dann beide Datei­
+ en wie eine zusammenhängende Datei behandelt.
+
+ Die gekettete Datei kann ebenfalls verändert werden,
+ wenn dies beim Öffnen der ersten Datei angegeben
+ wurde. Die angegebene Datei kann auch aus einem
+ Manager stammen.
+
+Verweise: Abschnitt 3.2
+ Benutzerhandbuch Abschnitt 9.2
+
+
+#linefeed (0.5)#
+#on("b")#K EUDAS-Datei Koppeln#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: EUDAS-Dateiname, mit Zeigen, mehrfache Wahl
+
+Zweck: Falls bereits eine Datei geöffnet ist, kann eine andere
+ EUDAS-Datei dazugekoppelt werden. Dazu muß min­
+ destens das erste Feld der zu koppelnden Datei in der
+ bereits geöffneten Datei vorkommen.
+
+ Nach dem Koppeln erscheinen beide Dateien wie eine
+ Datei. Zu jedem Satz der ersten Datei erscheinen je­
+ weils alle Sätze der Koppeldatei, die in dem Koppelfeld
+ übereinstimmen.
+
+ Die gekoppelte Datei kann ebenfalls verändert werden,
+ wenn dies beim Öffnen der ersten Datei angegeben
+ wurde. Die angegebene Datei kann auch aus einem
+ Manager stammen.
+
+Verweise: Abschnitt 3.3
+ Benutzerhandbuch Abschnitt 9.3 und 9.4
+
+
+#linefeed (0.5)#
+#on("b")#S Arbeitskopie Sichern#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Wurde eine EUDAS-Datei geöffnet und verändert, muß
+ zum Schluß die veränderte Arbeitskopie wieder ge­
+ sichert werden. Die Arbeitskopie kann entweder ge­
+ löscht werden, die alte Version ersetzen oder unter
+ einem neuen Namen registriert werden.
+
+ Für jede veränderte Datei wird zunächst erfragt, ob
+ die alte Version überschrieben werden soll. Dies ist
+ der Normalfall. Bei Verneinung dieser Frage muß ein
+ neuer Name für die Arbeitskopie angegeben werden.
+
+ Zum Schluß wird erfragt, ob alle Arbeitskopien ge­
+ löscht werden sollen (Normalfall: ja). Anderenfalls
+ bleiben die Dateien weiter geöffnet.
+
+Verweise: Abschnitt 3.5
+ Benutzerhandbuch Abschnitt 6.4
+
+
+#linefeed (0.5)#
+#on("b")#N Notizen ansehen/ändern#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Zu jeder EUDAS-Datei kann als Notiz ein beliebiger
+ Text gespeichert werden. Dieser Text der aktuellen
+ Datei wird mit dieser Funktion im Editor angezeigt
+ und kann verändert werden, wenn eine Arbeitskopie
+ angelegt wurde. Anderenfalls werden etwaige Verän­
+ derungen einfach ignoriert.
+
+Verweise: Abschnitt 3.1
+
+
+#linefeed (0.5)#
+#on("b")#F Feldstruktur ändern#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Mit dieser Funktion können neue Felder an die aktu­
+ elle Datei angefügt werden. Außerdem lassen sich
+ Feldnamen und Feldtypen ändern. Die Feldtypen be­
+ stimmen die Behandlung eines Feldes beim Suchen oder
+ Sortieren (z.B. von Zahlen).
+
+ Zunächst wird erfragt, ob neue Feldnamen angefügt
+ werden sollen. Diese können dann im Editor eingege­
+ ben werden. Danach wird gefragt, ob Feldnamen oder
+ Feldtypen geändert werden sollen (neu angefügte
+ Felder erhalten erst einmal den Typ TEXT). Falls die
+ Frage bejaht wird, können in einer Auswahl die zu
+ ändernden Felder angekreuzt werden. Für jedes ange­
+ kreuzte Feld werden dann der Name und der Typ zum
+ Überschreiben angeboten.
+
+Verweise: Abschnitt 3.1
+ Benutzerhandbuch Abschnitt 11.1
+
+
+#linefeed (0.5)#
+#on("b")#P Prüfbedingungen ansehen/ändern#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Beim Tragen in eine EUDAS-Datei können Bedingungen
+ für die zu tragenden Sätze überprüft werden. Diese
+ Bedingungen für die aktuelle Datei können mit dieser
+ Funktion angezeigt und, falls erlaubt, auch geändert
+ werden.
+
+Verweise: Abschnitt 3.1 und 4.4
+ Benutzerhandbuch Abschnitt 11.3
+
+
+#linefeed (0.5)#
+#on("b")#M Mehrbenutzer Manager einstellen#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Managertaskname, kein Zeigen
+
+Zweck: EUDAS kann beim Öffnen eine Datei von einer anderen
+ Task des Systems kopieren. Dadurch können mehrere
+ Benutzer kontrolliert auf die gleiche Datei zugreifen.
+ Wenn diese Möglichkeit verwendet werden soll, muß
+ mit dieser Funktion zunächst die in Frage kommende
+ Managertask angegeben werden.
+
+Verweise: Abschnitt 3.7
+ Benutzerhandbuch Abschnitt 9.6
+
+
+2.2 Menü 'Einzelsatz'
+
+
+#linefeed (0.5)#
+#on("b")#W Weiter#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Geht einen Satz weiter in der aktuellen Datei - falls
+ eine Suchbedingung eingestellt ist, weiter zum näch­
+ sten ausgewählten Satz.
+
+Verweise: Abschnitt 4.2
+ Benutzerhandbuch Abschnitt 5.2
+
+
+#linefeed (0.5)#
+#on("b")#Z Zurück#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Geht einen Satz zurück in der aktuellen Datei - falls
+ eine Suchbedingung eingestellt ist, zurück zum vori­
+ gen ausgewählten Satz.
+
+Verweise: Abschnitt 4.2
+ Benutzerhandbuch Abschnitt 5.2
+
+
+#linefeed (0.5)#
+#on("b")#N Auf Satz Nr. ..#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Positioniert auf einen bestimmten Satz der aktuellen
+ Datei, dessen Satznummer eingegeben werden muß, und
+ zwar unabhängig, ob der Satz durch die Suchbedingung
+ ausgewählt wird oder nicht. Trifft die eingestellte
+ Suchbedingung nicht auf den Satz zu, erscheint
+ 'SUCH-' in der Überschrift. Existiert die eingegebene
+ Satznummer nicht, positioniert EUDAS hinter den
+ letzten Satz der Datei.
+
+Verweise: Benutzerhandbuch Abschnitt 5.2
+
+
+#linefeed (0.5)#
+#on("b")#S Suchbedingung Setzen#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Es kann eine neue Suchbedingung für die aktuelle
+ Datei eingegeben werden, bzw. eine vorher eingestellte
+ Suchbedingung wird zum Ändern angeboten. Die Such­
+ bedingung wird in Form eines Suchmusters in das
+ Satzformular geschrieben.
+
+ Die eingestellte Suchbedingung wird beim Positionieren
+ und bei allen Bearbeitungsfunktionen beachtet.
+
+Verweise: Abschnitt 4.2
+ Benutzerhandbuch Abschnitt 5.3, 5.4 und 10.3
+
+
+#linefeed (0.5)#
+#on("b")#L Suchbedingung Löschen#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Die eingestellte Suchbedingung wird wieder gelöscht.
+
+Verweise: Abschnitt 4.2
+ Benutzerhandbuch Abschnitt 5.3
+
+
+#linefeed (0.5)#
+#on ("b")#M Markierung umkehren#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Mit dieser Funktion können einzelne Sätze zur späte­
+ ren Bearbeitung markiert werden. Falls der aktuelle
+ Satz bereits markiert ist, wird die Markierung wieder
+ entfernt, ansonsten wird er markiert.
+
+ Wenn mindestens ein Satz markiert ist, beachten die
+ Bearbeitungsfunktionen nur die markierten Sätze. So
+ kann eine manuelle Auswahl durchgeführt werden. Die
+ Markierung bleibt nur bis zum Sichern bestehen. Sie
+ ist keine permanente Eigenschaft einer EUDAS-Datei.
+
+Verweise: Abschnitt 4.2
+ Benutzerhandbuch Abschnitt 10.4
+
+
+#linefeed (0.5)#
+#on ("b")#E Datensatz Einfügen#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Mit dieser Funktion wird vor dem aktuellen Satz ein
+ leerer Satz eingefügt, für den anschließend die Feld­
+ inhalte im Satzformular eingetragen werden können.
+
+Verweise: Abschnitt 3.4
+ Benutzerhandbuch Abschnitt 6.2 und 10.2
+
+
+#linefeed (0.5)#
+#on ("b")#A Datensatz Ändern#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Die Inhalte des aktuellen Satzes werden im Satzformu­
+ lar zum Ändern angeboten.
+
+Verweise: Abschnitt 3.4
+ Benutzerhandbuch Abschnitt 6.3 und 10.2
+
+
+#linefeed (0.5)#
+#on ("b")#T Datensatz Tragen#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
+
+Zweck: Mit dieser Funktion kann der aktuelle Satz in eine
+ anderen EUDAS-Datei gleicher Struktur transportiert
+ werden. In der Zieldatei wird er am Ende angefügt.
+
+Verweise: Abschnitt 4.4
+ Benutzerhandbuch Abschnitt 6.3
+
+
+#linefeed (0.5)#
+#on ("b")#H Datensatz Holen#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
+
+Zweck: Mit dieser Funktion kann der letzte Satz einer ande­
+ ren Datei vor dem aktuellen Satz eingefügt werden,
+ sofern die Struktur gleich ist. Damit kann ein vorher­
+ gegangenes Tragen rückgängig gemacht werden.
+
+Verweise: Abschnitt 4.4
+ Benutzerhandbuch Abschnitt 6.3
+
+
+#linefeed (0.5)#
+#on ("b")#F Feldauswahl#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Die Felder der aktuellen Datei werden in einer Aus­
+ wahl angeboten. Am Bildschirm werden danach nur die
+ ausgewählten Felder in der gewählten Reihenfolge
+ dargestellt. Die Auswahl hat jedoch nur Auswirkung
+ auf die Darstellung am Bildschirm, anderen Funktionen
+ stehen nach wie vor alle Felder zur Verfügung. Die
+ Auswahl gilt bis zum Sichern, sie wird also nicht mit
+ der Datei abgespeichert.
+
+Verweise: Abschnitt 4.1
+ Benutzerhandbuch Abschnitt 10.1
+
+
+2.3 Menü 'Gesamtdatei'
+
+
+#linefeed (0.5)#
+#on ("b")#K Satzauswahl Kopieren#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
+ Name Kopiermuster, ohne Zeigen
+
+Zweck: Mit dieser Funktion werden die ausgewählten bzw.
+ markierten Sätze der aktuellen Datei in eine andere
+ Datei kopiert. Welche Felder kopiert werden sollen und
+ in welcher Reihenfolge, wird durch ein Kopiermuster
+ festgelegt. Dieses Kopiermuster kann benannt werden
+ oder unbenannt nur für ein Mal erstellt werden. Wird
+ das Kopiermuster neu erstellt, wird ein Standard-
+ Kopiermuster zum Ändern angeboten.
+
+Verweise: Abschnitt 4.4
+ Benutzerhandbuch Abschnitt 11.2
+
+
+#linefeed (0.5)#
+#on ("b")#T Satzauswahl Tragen#off("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
+
+Zweck: Transportieren der ausgewählten bzw. markierten
+ Sätze in eine andere Datei gleicher Struktur. Die Sätze
+ werden in der Zieldatei am Ende eingefügt.
+
+Verweise: Abschnitt 4.4
+ Benutzerhandbuch Abschnitt 11.3
+
+
+#linefeed (0.5)#
+#on ("b")#V Satzauswahl Verändern#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Name Änderungsmuster, mit Zeigen, mehrfache Wahl
+
+Zweck: Bearbeiten der ausgewählten bzw. markierten Sätze
+ der aktuellen Datei nach Vorgabe einer Änderungs­
+ vorschrift.
+
+Verweise: Abschnitt 4.4
+ Benutzerhandbuch Abschnitt 11.4
+
+
+#linefeed (0.5)#
+#on ("b")#U Übersicht Satzauswahl#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Anzeige aller ausgewählten Sätze in einem Über­
+ sichtsformat mit einem Satz pro Bildschirmzeile. Die
+ Felder, die in der Übersicht angezeigt werden sollen,
+ können vorher ausgewählt werden. In der Übersicht ist
+ Blättern und Markieren von Sätzen möglich.
+
+Verweise: Abschnitt 4.1
+ Benutzerhandbuch Abschnitt 10.5
+
+
+#linefeed (0.5)#
+#on ("b")#S Aktuelle Datei Sortieren#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Sortieren der aktuellen Datei in beliebiger Reihenfolge
+ auf- oder absteigend. Zum Sortieren muß eine Ar­
+ beitskopie angelegt sein. Die Feldreihenfolge, in der
+ sortiert werden soll, wird vorher erfragt.
+
+Verweise: Abschnitt 4.3
+ Benutzerhandbuch Abschnitt 11.1
+
+
+#linefeed (0.5)#
+#on ("b")#L Alle Markierungen Löschen#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Löschen aller Markierungen der aktuellen Datei.
+
+Verweise: Abschnitt 4.2
+ Benutzerhandbuch Abschnitt 10.4
+
+
+2.4 Menü 'Drucken'
+
+
+#linefeed (0.5)#
+#on ("b")#D Satzauswahl Drucken#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Name Druckmuster, mit Zeigen, mehrfache Wahl
+
+Zweck: Ausdruck des Inhalts der ausgewählten oder markier­
+ ten Sätze in druckbarer Form nach Vorgabe eines
+ Druckmusters. Die Ausgabe kann automatisch zum
+ Drucker geschickt werden oder erst in einer Datei
+ zwischengespeichert werden.
+
+Verweise: Kapitel 5
+ Benutzerhandbuch Abschnitt 7.1 und 7.2
+
+
+#linefeed (0.5)#
+#on ("b")#R Richtung Druckausgabe#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Mit dieser Funktion kann festgelegt werden, ob die
+ Druckausgabe automatisch zum Drucker geschickt wird,
+ in eine bestimmte Datei oder in eine automatisch
+ eingerichtete Datei geschrieben wird.
+
+ Die Angabe einer bestimmten Datei gilt nur für den
+ nächsten Druckvorgang. Sie muß also gegebenenfalls
+ wieder neu eingestellt werden.
+
+Verweise: Abschnitt 5.2
+ Benutzerhandbuch Abschnitt 7.2 und 12.1
+
+
+#linefeed (0.5)#
+#on ("b")#E Textdatei Editieren#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Name Textdatei, mit Zeigen, mehrfache Wahl
+
+Zweck: Aufruf des EUMEL-Editors zum Erstellen und Ändern
+ von Druckmustern und Änderungsmustern sowie zum
+ Ansehen der Druckausgabe.
+
+Verweise: Benutzerhandbuch Abschnitt 7.2
+
+
+#linefeed (0.5)#
+#on ("b")#A Textdatei Ausdrucken#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Name Textdatei, mit Zeigen, mehrfache Wahl
+
+Zweck: Mit dieser Funktion kann eine Textdatei oder die
+ zwischengespeicherte Ausgabe des Druckens einer
+ EUDAS-Datei zum Drucker geschickt werden.
+
+Verweise: Benutzerhandbuch Abschnitt 7.2
+
+
+#linefeed (0.5)#
+#on ("b")#N Textdatei Nachbearbeiten#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Name Textdatei, mit Zeigen, mehrfache Wahl
+
+Zweck: Mit dieser Funktion kann die zwischengespeicherte
+ Ausgabe des Druckens einer EUDAS-Datei mit den
+ Textkosmetikprogrammen 'lineform' und 'pageform'
+ bearbeitet werden.
+
+Verweise: Benutzerhandbuch Abschnitt 12.1
+
+
+2.5 Menü 'Dateien'
+
+
+#linefeed (0.5)#
+#on ("b")#U Übersicht Dateien System#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Übersicht über die Dateien im System in der aktuellen
+ Benutzertask.
+
+Verweise: Benutzerhandbuch Abschnitt 16.1
+
+
+#linefeed (0.5)#
+#on ("b")#L Datei Löschen#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Dateiname, mit Zeigen, mehrfache Wahl
+
+Zweck: Löschen einer beliebigen Datei in der aktuellen Be­
+ nutzertask nach Anfrage.
+
+Verweise: Benutzerhandbuch Abschnitt 16.1
+
+
+#linefeed (0.5)#
+#on ("b")#N Datei Umbenennen#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Dateiname, mit Zeigen, mehrfache Wahl
+ Neuer Name, ohne Zeigen
+
+Zweck: Umbenennen einer beliebigen Datei in der aktuellen
+ Benutzertask.
+
+Verweise: Benutzerhandbuch Abschnitt 16.1
+
+
+#linefeed (0.5)#
+#on ("b")#K Datei Kopieren#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Dateiname, mit Zeigen, mehrfache Wahl
+ Zieldateiname, ohne Zeigen
+
+Zweck: Anfertigen einer logischen Kopie einer beliebigen
+ Datei in der aktuellen Benutzertask.
+
+Verweise: Benutzerhandbuch Abschnitt 16.1
+
+
+#linefeed (0.5)#
+#on ("b")#P Platzbedarf einer Datei#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Dateiname, mit Zeigen, mehrfache Wahl
+
+Zweck: Zeigt den belegten Speicherplatz einer beliebigen
+ Datei in der aktuellen Benutzertask.
+
+Verweise: Benutzerhandbuch Abschnitt 16.1
+
+
+#linefeed (0.5)#
+#on ("b")#A Datei Aufräumen#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Dateiname, mit Zeigen, mehrfache Wahl
+
+Zweck: Reorganisieren einer Textdatei oder einer EUDAS-
+ Datei, um Platz zu sparen oder den Zugriff zu be­
+ schleunigen. Empfiehlt sich bei stark veränderten
+ oder umsortierten Dateien.
+
+Verweise: Benutzerhandbuch Abschnitt 16.1
+
+
+2.6 Menü 'Archiv'
+
+
+#linefeed (0.5)#
+#on ("b")#U Übersicht Dateien Archiv#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Übersicht aller Dateien auf der eingelegten Archivdis­
+ kette.
+
+Verweise: Benutzerhandbuch Abschnitt 16.2
+
+
+#linefeed (0.5)#
+#on ("b")#D Archivübersicht Drucken#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Die Archivübersicht wird direkt zum Drucker ge­
+ schickt.
+
+Verweise: Benutzerhandbuch Abschnitt 16.2
+
+
+#linefeed (0.5)#
+#on ("b")#K Datei Kopieren vom Archiv#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Dateiname, mit Zeigen, mehrfache Wahl
+
+Zweck: Eine Datei auf der Archivdiskette wird in die aktuelle
+ Benutzertask kopiert.
+
+Verweise: Benutzerhandbuch Abschnitt 16.2
+
+
+#linefeed (0.5)#
+#on ("b")#S Datei Schreiben auf Archiv#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Archivname
+ Dateiname, mit Zeigen, mehrfache Wahl
+
+Zweck: Eine Datei aus der aktuellen Benutzertask wird auf
+ die eingelegte Archivdiskette geschrieben.
+
+Verweise: Benutzerhandbuch Abschnitt 16.2
+
+
+#linefeed (0.5)#
+#on ("b")#L Datei Löschen auf Archiv#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Archivname
+ Dateiname, mit Zeigen, mehrfache Wahl
+
+Zweck: Löschen einer Datei auf der eingelegten Archivdisket­
+ te. Der Platz kann jedoch nicht immer wiederverwendet
+ werden.
+
+Verweis: Benutzerhandbuch Abschnitt 16.2
+
+
+#linefeed (0.5)#
+#on ("b")#I Archivdiskette Initialisieren#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: keine
+
+Zweck: Mit dieser Funktion kann eine Archivdiskette komplett
+ gelöscht werden. Die Diskette kann dabei auch gleich­
+ zeitig formatiert werden, falls der Rechner dies zu­
+ läßt. Das Initialisieren ist notwendig, bevor eine neue
+ Diskette als Archiv verwendet werden kann.
+
+Verweise: Benutzerhandbuch Abschnitt 16.2
+
+
+#linefeed (0.5)#
+#on ("b")#Z Zielarchiv einstellen#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Managertaskname, ohne Zeigen
+
+Zweck: Mit dieser Funktion kann eine Managertask angegeben
+ werden, die als Ziel der Archivoperationen dient.
+ Damit können Dateien auch in beliebigen Managertasks
+ oder über das EUMEL-Netz gesichert werden.
+
+ Es wird erfragt, ob die angegebene Task ein Archiv­
+ manager oder ein gewöhnlicher Dateimanager ist.
+
+Verweise: Benutzerhandbuch Abschnitt 16.2
+
+
+#linefeed (0.5)#
+#on ("b")#P Paßwort einstellen#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Paßwort
+
+Zweck: Mit dieser Funktion kann ein Paßwort eingestellt
+ werden, das bei der Kommunikation mit allgemeinen
+ Managertasks überprüft wird.
+
+Verweise: Benutzerhandbuch Abschnitt 16.2
+
+
+#linefeed (0.5)#
+#on ("b")#R Archivmanager Reservieren#off ("b")#
+#linefeed (1.07)#
+_____________________________________________________
+
+Parameter: Reservierungstext
+
+Zweck: Falls als Zielarchiv eine Managertask eingestellt ist,
+ die zwar kein Archivmanager ist, aber reserviert
+ werden muß (z.B. 'DOS'), kann die Reservierung mit
+ dieser Funktion ausgeführt werden. Die Freigabe
+ erfolgt automatisch beim Verlassen des Menüs.
+
+Verweise: Benutzerhandbuch Abschnitt 16.2
+
+
+
+2.7 Kurzabfrage
+
+Wird 'eudas' innerhalb des EUMEL-Editors aufgerufen, so wird eine
+spezielle Kurzabfrage gestartet. Diese ermöglicht die Übernahme von
+Druckdaten direkt in die editierte Datei.
+ Zunächst wird der Dateiname der zu verwendenden EUDAS-
+Datei erfragt. Diese Datei wird dann geöffnet. Vorher geöffnete und
+veränderte Dateien werden nach Anfrage gesichert.
+ Als nächstes kann für die folgende Übersicht eine Feldauswahl
+eingestellt werden, damit die relevanten Felder auch auf dem Bild­
+schirm erscheinen.
+ Danach beginnt ein wiederholbarer Prozeß mit der Eingabe
+eines Suchmusters nach Anfrage. Die ausgewählten Sätze werden
+dann in einer Übersicht gezeigt. In der Übersicht können auch Sätze
+markiert werden.
+ Nach Verlassen der Übersicht bestehen drei Möglichkeiten zum
+Drucken: Falls mindestens ein Satz markiert wurde, können nach
+Anfrage alle markierten Sätze gedruckt werden. Wurde kein Satz
+markiert, können nach Anfrage alle ausgewählten (bzw. vorher
+angezeigten) Sätze gedruckt werden. Wird diese Frage jeweils ver­
+neint, kann nach Anfrage auch der aktuelle Satz als einziger ge­
+druckt werden.
+ Wurde eine der Fragen bejaht, wird der Name des Druckmusters
+erfragt, das bereits existieren muß. Das Ergebnis der Druckausgabe
+wird dann an der aktuellen Cursorposition in der editierten Datei
+eingefügt.
+ Der Prozeß kann danach mit einem anderen Suchmuster wieder­
+holt werden. Dabei werden alle Markierungen wieder gelöscht.
+
diff --git a/doc/eudas/eudas.ref.3 b/doc/eudas/eudas.ref.3
new file mode 100644
index 0000000..9b58b9b
--- /dev/null
+++ b/doc/eudas/eudas.ref.3
@@ -0,0 +1,270 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (31)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+3 Das virtuelle Dateimodell
+
+
+
+3.1 Dateistruktur
+
+Eine EUDAS-Datei hat folgende Bestandteile:
+
+- 0 bis 5000 #on("i")#Sätze#off("i")#, von 1 an durchnumeriert. Jeder Satz enthält für
+ jedes Feld einen variabel langen Text als Inhalt, der standard­
+ mäßig leer ist.
+
+- 1 bis 256 #on("i")#Felder#off("i")#, die die Sätze aufteilen. Jedes Feld besitzt einen
+ #on("i")#Feldnamen#off("i")# als Text und einen von vier #on("i")#Feldtypen#off("i")# (TEXT, ZAHL,
+ DATUM oder DIN). Der Feldname dient zur Identifizierung des
+ Feldes, der Feldtyp spezifiziert die Art der Behandlung beim Ver­
+ gleichen von Feldern.
+
+- Drei Zusatztexte. Der erste nimmt die #on("i")#Prüfbedingungen#off("i")# auf, der
+ zweite speichert das Datum der letzten Veränderung und der
+ dritte kann allgemeine #on("i")#Notizen#off("i")# aufnehmen.
+
+- Einen #on("i")#Satzzeiger#off("i")#, der einen bestimmten Satz als aktuellen Satz
+ auszeichnet. Der Satzzeiger kann durch Positionierungsoperatio­
+ nen verändert werden.
+
+- Eine #on("i")#Sortierreihenfolge#off("i")#, die angibt, in welcher Feldreihenfolge die
+ Datei zuletzt sortiert worden ist. Dazu für jeden Satz eine Anga­
+ be, ob er entsprechend dieser Reihenfolge an der richtigen Posi­
+ tion steht.
+
+- Eine interne Datenstruktur, die beschleunigten Zugriff auf eine
+ Satz nach dem Inhalt des ersten Feldes ermöglicht. Diese Struktur
+ steht ganz unter Kontrolle von EUDAS und kann nicht von außen
+ manipuliert werden.
+
+
+3.2 Öffnen
+
+#on("b")#Virtuelle Datei#off("b")# Die meisten EUDAS-Funktionen arbeiten
+nicht
+direkt auf einer EUDAS-Datei, sondern auf der sogenannten #on("i")#vir­
+tuellen Datei#off("i")#, die aus mehreren realen Dateien bestehen kann. Die
+virtuelle Datei erscheint nach außen hin wie eine einzelne
+EUDAS-Datei. Die Operationen auf der virtuellen Datei werden je­
+weils auf die einzelnen Bestandteile abgebildet.
+ Damit eine EUDAS-Datei Bestandteil der virtuellen Datei wird,
+muß sie geöffnet werden. Dieses Öffnen kann auf dreierlei Art und
+Weise geschehen.
+ Das Öffnen der ersten Datei stellt eine neue virtuelle Datei
+her. Die Feldnamen und Feldeigenschaften der ersten Datei werden
+in der virtuellen Datei übernommen. Dies ist der Normalfall, in dem
+sich die virtuelle Datei noch nicht von der zugrundeliegenden Datei
+unterscheidet.
+ Bei diesem ersten Öffnen muß angegeben werden, ob die vir­
+tuelle Datei verändert werden soll oder nicht. Falls die virtuelle
+Datei verändert werden soll, wird eine Arbeitskopie aller geöffneten
+Dateien angelegt. Die Ursprungsdateien können erst am Ende der
+Arbeit mit den geänderten Kopien überschrieben werden.
+
+#on("b")#Weitere Dateien#off("b")# Weitere Dateien können gekettet oder
+gekoppelt
+werden. Gekettete Dateien werden logisch an die zuerst geöffnete
+Datei angehängt. Ihre Dateistruktur wird ignoriert, sollte aber mit
+der ersten Datei übereinstimmen. Die Folge aneinander geketteter
+EUDAS-Dateien wird als #on("i")#Hauptdatei#off("i")# bezeichnet.
+ In der Hauptdatei werden die Sätze von 1 an durchnumeriert;
+die Aufeinanderfolge der Sätze wird durch die Anordnung der Sätze
+in den einzelnen Dateien und die Reihenfolge bestimmt, in der die
+Dateien gekettet wurden.
+ Die gekoppelten Dateien werden der Hauptdatei untergeordnet.
+Die in ihnen enthaltenen Informationen werden nur angezeigt, wenn
+sie mit einem Satzinhalt der Hauptdatei korrespondieren. Der
+Mechanismus dieser Satzkopplung wird im nächsten Abschnitt
+beschrieben.
+
+
+#free (8.0)#
+
+#center#Abb. 3-1 Schematischer Aufbau der virtuellen Datei
+
+
+
+3.3 Koppeln
+
+ Die Sätze der gekoppelten Dateien werden in Relation zu den
+Sätzen in der Hauptdatei gesetzt. Zu jedem Satz in der Hauptdatei
+kann eine Anzahl von Sätzen aus jeder Koppeldatei gehören. Diese
+Sätze müssen in den Inhalten der sogenannten #on("i")#Koppelfelder#off("i")# über­
+einstimmen.
+ Welche Felder Koppelfelder sind, richtet sich nach den Feld­
+namen. Die ersten Felder der Koppeldatei, die auch in der Haupt­
+datei vorhanden sind, werden als Koppelfelder betrachtet. Die Kop­
+pelfelder müssen also bei der Koppeldatei am Anfang stehen - in
+der Hauptdatei kann jedes beliebige Feld ein Koppelfeld sein.
+ Wenn eine Datei zur virtuellen Datei gekoppelt wird, werden
+alle Felder, die nicht Koppelfelder sind, in die virtuelle Datei auf­
+genommen. Die Koppelfelder brauchen nicht noch mal wiederholt zu
+werden, da ihr Inhalt ja immer identisch ist.
+ Zu beachten ist, daß bei diesem Verfahren auch Namenskonflik­
+te entstehen können, wenn nach den Koppelfeldern später wieder
+ein Feldname vorkommt, der auch in der Hauptdatei vorhanden ist.
+In den Fällen, in denen Felder durch ihren Namen angesprochen
+werden, ist dann das zweite Feld gleichen Namens nicht verfügbar.
+
+
+#free (7.0)#
+
+#center#Abb. 3-2 Schema des Koppelvorgangs
+
+
+#on("b")#Kombinationen#off("b")# Beim Vorwärtsgehen in der virtuellen Datei
+werden
+zu jedem Satz der Hauptdatei nacheinander alle möglichen Kombina­
+tionen der zugehörigen Koppelsätze angezeigt, denn es können
+mehrere passende Koppelsätze vorhanden sein. Die Satznummer
+bleibt dabei gleich; die einzelnen Kombinationen werden von 1 an
+durchgezählt. Beim Rückwärtsgehen wird aus technischen Gründen
+immer nur die erste Kombination angezeigt.
+ Existiert zu einem Satz kein passender Koppelsatz, so bleiben
+die entsprechenden Felder leer. Die Koppelsätze müssen in der
+ganzen Koppeldatei gesucht werden, daher ist bei großen Koppel­
+dateien die Suchzeit zu berücksichtigen.
+
+
+3.4 Änderungen
+
+In der virtuellen Datei kann auch geändert werden. Dabei ist jedoch
+Vorsicht angebracht. Es muß festgelegt sein, wie Änderungen der
+einzelnen Felder auf die beteiligten Dateien abgebildet werden.
+ Falls die virtuelle Datei keine Koppeldateien enthält, werden
+Änderungen am aktuellen Satz an der zugehörigen Datei durchge­
+führt. Das Löschen eines Satzes wird auch direkt in der Datei
+durchgeführt. Ein neuer Satz wird immer in der Datei eingefügt, zu
+der der aktuelle Satz gehört - am Ende der ersten Datei kann also
+kein Satz eingefügt werden, wenn noch weitere Dateien folgen.
+ Enthält die virtuelle Datei Koppeldateien, werden die Änderun­
+gen in der Hauptdatei wie oben beschrieben durchgeführt. Änderun­
+gen, die Felder in den Koppeldateien betreffen, werden nach folgen­
+der Entscheidungstabelle behandelt:
+
+ 1 2 3 4 5
+ ---------------
+ Koppelfelder verändert N J J N N
+ Übrige Felder verändert N - - J J
+ Übrige Felder leer - J N - N
+ Vorher Koppelsatz vorhanden - - - J N
+ ---------------
+ Neuen Satz einfügen x x
+ Koppelsatz ändern x
+ Kopplung aktualisieren x
+
+Fall 1: Es wurden keine Veränderungen an den Feldern des Kop­
+ pelsatzes vorgenommen, daher ist auch keine Aktion not­
+ wendig.
+
+Fall 2: Eines der Koppelfelder wurde verändert. Die Änderung wird
+ in der Hauptdatei durchgeführt. Die übrigen Felder des
+ Koppelsatzes sind jedoch als leer angegeben. In diesem Fall
+ wird der Koppelsatz nicht verändert, sondern nur eine
+ neue Korrespondenz gesucht.
+
+Fall 3: Eines der Koppelfelder wurde verändert, gleichzeitig ent­
+ halten aber auch die anderen Felder Informationen. In
+ diesem Fall wird ein neuer Satz in der Koppeldatei ange­
+ fügt, der die neuen Inhalte enthält. So wird vermieden,
+ daß an anderer Stelle plötzlich kein passender Koppelsatz
+ mehr vorhanden ist.
+
+Fall 4: Nur Felder der Koppeldatei, die nicht Koppelfelder sind,
+ wurden verändert, außerdem existierte ein korrespondie­
+ render Satz in der Koppeldatei. In diesem Fall werden die
+ Informationen im Koppelsatz abgeändert.
+
+Fall 5: Wie 4, nur war vorher noch kein Koppelsatz vorhanden
+ (Felder waren leer). In diesem Fall muß ein neuer Satz in
+ die Koppeldatei eingefügt werden. Einfügungen in die
+ Koppeldatei geschehen immer am Dateiende.
+
+#on("b")#Einfügen/Löschen#off("b")# Beim Löschen eines Satzes der virtuellen
+Datei
+durch Tragen bleiben die Koppeldateien unverändert. Nach dem
+Einfügen eines neuen Satzes wird nur dann ein Satz in einer Kop­
+peldatei eingefügt, wenn dieser Satz nicht nur Koppelfelder enthal­
+ten würde. Falls beim Einfügen nur die Koppelfelder angegeben
+werden, wird ein korrespondierender Satz in der Koppeldatei ge­
+sucht. Vergleichen Sie hierzu die Regeln beim Ändern.
+
+
+3.5 Sichern
+
+Falls Änderungen der virtuellen Datei erlaubt sind, arbeitet EUDAS
+immer auf Sicherheitskopien der beteiligten Dateien. Eine Datei, die
+wirklich verändert wurde, muß vor dem Aufbau einer neuen virtuel­
+len Datei gesichert oder explizit gelöscht werden.
+ Für jede einzelne Datei kann festgelegt werden, ob sie gesi­
+chert werden soll oder nicht. Als Hilfe wird dazu für jede Datei
+angegeben, ob sie tatsächlich verändert wurde oder nicht. Die
+Arbeitskopie kann beim Sichern die alte Version überschreiben oder
+unter einem neuen Namen gesichert werden.
+ Am Ende des Sicherns können die Arbeitskopien gelöscht wer­
+den. Anderenfalls werden die Dateien so betrachtet, als ob sie di­
+rekt nach dem Sichern wieder geöffnet worden wären und stehen
+weiterhin zur Verfügung.
+ Falls alle Dateien entweder gesichert oder nicht verändert
+sind, werden beim nächsten Öffnen einer neuen virtuellen Datei die
+vorherigen Arbeitskopien gelöscht.
+
+
+3.6 Umschalten auf Koppeldatei
+
+Falls eine Datei gekoppelt ist, kann man die virtuelle Datei auf
+diese Koppeldatei umschalten. Dadurch verhält sich die virtuelle
+Datei so, als ob nur diese Koppeldatei geöffnet wäre. Die Einstel­
+lungen der Hauptdatei wie Markierungen und Suchbedingung bleiben
+jedoch erhalten und stehen beim Zurückschalten wieder zur Verfü­
+gung.
+ Die Satzposition der Koppeldatei beim letzten Umschalten wird
+ebenfalls gespeichert und wird beim nächsten Umschalten wieder
+eingenommen, unabhängig von der tatsächlichen Satzposition der
+Koppeldatei zu diesem Zeitpunkt.
+ Für die Koppeldatei können eigene Markierungen vergeben
+werden, die auch nach dem Umschalten gespeichert bleiben. Auch
+ein Suchmuster kann für die Koppeldatei eingestellt werden, dies
+geht jedoch beim Zurückschalten wieder verloren. Die eingestellte
+Feldauswahl für die Bildschirmanzeige geht leider bei jedem Um­
+schalten verloren.
+ Das Umschalten kann entweder im Menü 'Einzelsatz' oder beim
+Einfügen und Ändern durch ESC 'K' bewirkt werden, ebenso das
+Zurückschalten nur im Menü 'Einzelsatz'. Beim Umschalten aus Ein­
+fügen oder Ändern erfolgt beim Zurückschalten eine Rückkehr in
+diesen Zustand. Dabei können nach Anfrage die Koppelfelder des
+aktuellen Satzes der Koppeldatei in die Hauptdatei übernommen und
+damit eine bestimmte Kopplung bewirkt werden.
+
+
+3.7 Mehrbenutzerbetrieb
+
+Durch Einstellen einer Managertask für den Mehrbenutzerbetrieb
+können auch Dateien dieser Managertask beim Öffnen direkt ver­
+wendet werden. Die Datei wird automatisch aus der Managertask
+kopiert und geöffnet.
+ Falls die Datei geändert werden soll, wird eine Sperre in der
+Managertask gesetzt, die verhindert, daß auch ein anderer Benutzer
+diese Datei zum Ändern öffnet. Beim Sichern erfolgt dann ein Rück­
+schreiben der Arbeitskopie. Die Sperre wird jedoch erst dann zu­
+rückgesetzt, wenn alle Arbeitskopien gelöscht werden, da erst dann
+keine Möglichkeit des Rückschreibens mehr besteht.
+ Alle Dateien der Managertask werden bei der Dateiauswahl zum
+Öffnen mit angeboten. Falls eine Datei in beiden Tasks existiert,
+wird die Datei in der Managertask genommen, die Datei der eigenen
+Task jedoch erst nach Anfrage überschrieben.
+ Damit die Sperre funktionieren kann, muß EUDAS in der Mana­
+gertask zur Verfügung stehen und die Task muß #on("i")#nach#off("i")# dem Insertie­
+ren von EUDAS als 'global manager' definiert werden (nicht 'free
+global manager' verwenden).
+
diff --git a/doc/eudas/eudas.ref.4 b/doc/eudas/eudas.ref.4
new file mode 100644
index 0000000..cfd6daf
--- /dev/null
+++ b/doc/eudas/eudas.ref.4
@@ -0,0 +1,441 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (39)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+4 Ansehen und Bearbeiten
+
+
+
+4.1 Anzeige
+
+Die Anzeige und Eingabe von Einzelsätzen sowie die Eingabe von
+Suchmustern geschieht in einem Standardformular in einem recht­
+eckigen Fenster. Dieses Fenster befindet sich in der rechten Bild­
+schirmhälfte.
+ Das Formular besteht aus vier Teilen: der Überschrift, den
+Feldnamen, den Feldinhalten und der Abschlußzeile (s. Abbildung).
+
+ Überschrift
+#free (0.3)#
+ Satz 33 ..SUCH+..MARK-... datei ............... Feld 1
+ Feld 1
+ Feld 2
+ Feld 3 Feldinhalte
+
+ Feld 4
+ ..............................................................
+#free (0.3)#
+ Feldnamen Abschlußzeile
+
+
+
+#on("b")#Überschrift#off("b")# Die Überschrift zeigt folgende Informationen
+an:
+
+ Satz n[-m]
+ Die Satznummer des aktuellen Satzes, bei gekoppelten Dateien
+ auch die Satzkombination.
+
+ SUCH+/-
+ Zeigt an, ob der aktuelle Satz die eingestellte Suchbedingung
+ erfüllt oder nicht (wird während Eintragungen nicht angezeigt).
+ Wenn keine Suchbedingung eingestellt ist, erscheint diese An­
+ zeige nicht.
+
+ MARK+/-
+ Zeigt an, ob der aktuelle Satz markiert ist oder nicht (Wird
+ während Eintragungen nicht angezeigt). Wenn kein Satz mar­
+ kiert ist, erscheint diese Anzeige nicht.
+
+ ENDE
+ Wird hinter dem letzten Satz der Datei als Kennzeichnung des
+ Endesatzes ausgegeben.
+
+ 'Dateiname'
+ Gibt den Namen der ersten geöffneten Datei an.
+
+ <KOPPPEL>
+ Erscheint statt des Dateinamens, wenn auf eine Koppeldatei
+ umgeschaltet wurde.
+
+ Feld n/Zeile n
+ Zeilennummer des obersten angezeigten Feldes (bei Anzeige)
+ bzw. der aktuellen Cursorzeile (während Eintragungen).
+
+#on("b")#Feldteil#off("b")# Die Feldnamen sind zur Unterscheidung von den
+Feld­
+inhalten invers dargestellt. Die Breite der Feldnamen richtet sich
+nach der Länge des längsten Feldnamens. Ist dieser zu lang, um
+noch eine ordentliche Anzeige zu ermöglichen, wird bei einer be­
+stimmten Länge der Rest des Namens abgeschnitten.
+ Zwischen dem Feldnamen an der linken Seite und dem dane­
+benstehenden Feldinhalt besteht immer eine Korrespondenz, d.h. der
+Inhalt eines Feldes wird direkt neben dem Namen dargestellt. In der
+Regel wird pro Feld eine Bildschirmzeile reserviert. Kann der Feld­
+inhalt jedoch nicht mehr in einer Zeile untergebracht werden, wer­
+den weitere Zeilen zur Darstellung dieses Feldes herangezogen. In
+diesen Zeilen steht statt des Feldnamens nur ein markierter Leer­
+raum.
+ Alle folgenden Zeilen ohne Namen gehören zu dem gleichen
+Feld. Der Inhalt wird auf diese Zeilen umbrochen, d.h. wenn ein
+Wort nicht mehr auf die Zeile paßt, wird es komplett in die nächste
+Zeile geschrieben (wie beim Editor). Wörter werden nur dann zer­
+schnitten, wenn sie nicht als Ganzes auf eine Zeile passen. Wörter
+werden untereinander durch Leerzeichen getrennt.
+ Aus Effizienzgründen werden in bestimmten Fällen auch mehr
+Folgezeilen als nötig angezeigt. Hat nämlich ein neuer Satz einen
+kürzeren Inhalt als der vorige, so werden die Feldnamen nur dann
+wieder zusammengerückt, wenn das ganze Bild neugeschrieben wer­
+den muß. Anderenfalls werden nur die Feldinhalte aktualisiert.
+ Die Bildausgabe wird unterbrochen, wenn 'w' oder 'z' gedrückt
+wurde, da dann die Inhalte des aktuellen Satzes nicht mehr inter­
+essieren.
+
+#on("b")#Rollen#off("b")# Da nicht alle Felder auf den Bildschirm passen
+müssen, kann das Bild gerollt werden.
+ Mit ESC UNTEN wird um eine Seite nach unten geblättert, mit
+ESC OBEN wieder zurück. Hinter dem letzten Feld erscheint ein
+markierter Balken als Abschlußzeile. Weiter als bis zum Erscheinen
+dieses Balken kann nicht gerollt werden. Mit ESC '1' wird ganz an
+den Anfang gerollt, mit ESC '9' ganz ans Ende.
+ Bei Feldern, die sich über mehrere Zeilen erstrecken, kann es
+passieren, daß nach dem Rollen die erste Bildschirmzeile nicht die
+erste Zeile eines Feldes ist, also der erste Teil eines Feldes nicht
+dargestellt wird. Trotzdem wird in diesem Fall in der ersten Anzei­
+gezeile der Feldname angezeigt.
+
+#on("b")#Feldauswahl#off("b")# Man kann auswählen, welche Felder in welcher
+Rei­
+henfolge angezeigt werden sollen. Dies dient der besseren Übersicht.
+Von der Anzeige werden nur die ausgewählten Felder behandelt, die
+anderen Felder bleiben leer, werden nicht verändert oder berück­
+sichtigt. Die Anzeigeauswahl ändert jedoch nichts an der Datei­
+struktur.
+ Die Feldauswahl ist keine permanente Eigenschaft einer
+EUDAS-Datei. Sie geht daher bei einem neuen Öffnen oder beim
+Umschalten auf eine Koppeldatei verloren.
+
+#on("b")#Übersicht#off("b")# Im Gegensatz zur normalen Anzeige, bei der ein
+Satz pro
+Bildschirm dargestellt wird, können in der Übersicht mehrere Sätze
+gleichzeitig überschaut werden. Dabei wird jeder Satz in einer Zeile
+untergebracht. Die Auswahl der Felder, die in der Übersicht er­
+scheinen sollen, wird vor Beginn der Funktion erfragt.
+ In jeder Zeile steht die Nummer des jeweiligen Satzes, eine
+Anzeige, ob er markiert ist (+) oder nicht (-) und die Feldinhalte
+in der gewählten Reihenfolge und Auswahl, jeweils duch Komma und
+Leerzeichen getrennt. Inhalte, die nicht mehr auf die Zeile passen,
+werden abgeschnitten.
+ Es werden nur durch das Suchmuster ausgewählte Sätze ange­
+zeigt. Ist der aktuelle Satz nicht ausgewählt, so erscheint an seiner
+Stelle '<< >>' als Hinweis. In der Überschrift sind die Feldnamen
+angegeben - durch Komma getrennt, so viele wie hinpassen.
+ Die Satznummer des aktuellen Satzes ist jeweils markiert. In
+der Übersicht kann geblättert werden. HOP OBEN und HOP UNTEN,
+OBEN und UNTEN wirken wie im Editor.
+ Durch '+' oder '-' kann auch die Markierung des aktuellen
+Satzes verändert werden.
+
+
+4.2 Satzauswahl
+
+Die Auswahl der Sätze, die gedruckt oder mit den Funktionen aus
+Abschnitt 4.4 bearbeitet werden sollen, kann entweder durch eine
+Suchbedingung oder durch Markierung vorgenommen werden. Wenn
+mindestens ein Satz markiert ist, werden von den Bearbeitungs­
+funktionen nur die markierten Sätze behandelt. Anderenfalls wird
+die eingestellte Suchbedingung beachtet.
+ Die Bildschirmanzeige richtet sich immer nur nach der einge­
+stellten Suchbedingung.
+
+#on("b")#Suchmuster#off("b")# Ein Suchmuster gibt für jedes Feld bestimmte
+Bedin­
+gungen an. Es wird im Standardformular mit Hilfe des Satzeditors
+eingegeben. Dabei stehen neben jedem Feld die Bedingungen für
+dieses Feld in einer intuitiv verständlichen Form. Folgende Einzel­
+bedingungen sind möglich:
+
+ Muster Inhalt ist gleich Muster
+ Muster.. Inhalt ist größergleich Muster
+ ..Muster Inhalt ist kleiner Muster
+ Muster1..Muster2 Inhalt liegt dazwischen
+ *Muster Inhalt endet mit Muster
+ Muster* Inhalt beginnt mit Muster
+ *Muster* Inhalt enthält Muster
+ * Inhalt ist nicht leer
+ ++ Satz markiert (unabhängig vom Feldinhalt)
+
+Die ersten vier Einzelbedingungen beachten auch den Typ eines
+Feldes (wie er bei der Feldstruktur eingegeben werden kann und
+beim Sortieren beachtet wird). So werden z.B. bei der Gleichheit von
+Zahlen alle nicht-numerischen Zeichen ignoriert (s. Sortieren).
+ Die drei Bedingungen mit Stern können auch miteinander ver­
+knüpft werden. Die Einzelbedingungen müssen dann alle zutreffen,
+damit der Satz ausgewählt wird. So bedeutet zum Beispiel das
+Muster 'M1*M2*M3*M4', daß das Feld mit 'M1' beginnen und mit 'M4'
+enden muß. Außerdem muß es 'M2' und 'M3' enthalten, jedoch nicht
+unbedingt in der angegebenen Reihenfolge.
+ Wird der Mustertext durch '&' und einen gültigen Feldnamen der
+aktuellen Datei ersetzt, findet der Vergleich nicht mit einem
+Mustertext, sondern mit dem Inhalt des angegebenen Feldes statt.
+Als Feldtyp für den Vergleich wird in diesem Fall der Typ des Fel­
+des genommen, in dem der Vergleich steht.
+
+#on("b")#Verknüpfung#off("b")# Einzelbedingungen können durch Voranstellen
+von
+'--' verneint werden. Einzelbedingungen für verschiedene Felder
+werden mit UND verknüpft.
+ Es gibt zwei Arten der ODER-Verknüpfung: die lokale und die
+globale. Die lokale ODER-Verknüpfung wird durch ein Komma zwi­
+schen Einzelbedingungen realisiert. Sie hat eine höhere Priorität als
+das UND zwischen verschiedenen Feldern. So hat folgendes Such­
+muster
+
+
+ Feld1 Bed1,Bed2
+ Feld2 Bed3
+
+
+die Bedeutung
+
+
+ ( Bed1 (Feld1) ODER Bed2 (Feld2) ) UND Bed3 (Feld3)
+
+
+Die globale ODER-Verknüpfung wird durch ein Semikolon repräsen­
+tiert. Alle Einzelbedingungen nach dem n-ten Semikolon aller Zeilen
+werden zu einer Alternative zusammengefaßt. Damit hat das Such­
+muster
+
+
+ Feld1 Bed1;Bed2
+ Feld2 Bed3
+
+
+die Bedeutung
+
+
+ ( Bed1 (Feld1) UND Bed3 (Feld2) ) ODER Bed2 (Feld1)
+
+
+Damit ergibt sich für die Priorität der einzelnen Konstruktionen
+folgende Reihenfolge:
+
+ höchste Einzelbedingung
+ Verkettung von Einzelbedingungen (UND)
+ Verneinung
+ lokales ODER
+ UND zwischen Feldern
+ niedrigste globales ODER
+
+#on("b")#Optimierung#off("b")# Wenn für das erste Feld einer Datei eine
+Gleich-
+Bedingung angegeben wurde und keine globale Alternative vorhan­
+den ist, kann der Suchvorgang wegen der Dateistruktur optimiert
+werden, indem nur Sätze untersucht werden müssen, die im ersten
+Feld den gesuchten Text enthalten.
+
+#on("b")#Reservierte Zeichen#off("b")# Im Rahmen der Analyse einer
+Musterzeile
+wirken folgende Zeichenfolgen als unbeschränkt reservierte Zeichen:
+
+
+ , ; .. *
+
+
+Sie dürfen daher in keinem Mustertext oder Feldnamen vorkommen,
+da sie als Separator wirken. Die beiden folgenden Zeichenfolgen
+werden nur zu Anfang eines durch die vorstehenden Separatoren
+gebildeten Abschnitts erkannt:
+
+
+ -- & ++
+
+
+Sie dürfen daher prinzipiell an weiterer Stelle vorkommen, ohne als
+Sonderzeichen erkannt zu werden. Alle anderen Zeichen in der Zeile
+werden dem Mustertext bzw. Feldnamen ohne weitere Interpretation
+zugeordnet.
+
+
+4.3 Sortieren und Reorganisieren
+
+Eine EUDAS-Datei kann in einer beliebigen Feldreihenfolge sortiert
+werden. Mit dieser Angabe kann man bestimmen, welche Felder beim
+Vergleich zweier Sätze berücksichtigt werden sollen und in welcher
+Reihenfolge.
+ Die Sortierreihenfolge wird in der Datei gespeichert und wird
+anschließend immer wieder verwendet, wenn keine anderen Angaben
+gemacht wurden.
+ Der Sortierzustand einer Datei wird ebenfalls gespeichert. Wenn
+nur wenige Sätze seit der letzten Sortierung verändert wurden,
+müssen auch nur diese Sätze einsortiert werden.
+
+#on("b")#Feldtypen#off("b")# Um eine korrekte Sortierung auch von Zahlen oder
+Daten sicherzustellen, wird jedem Feld einer EUDAS-Datei ein Feld­
+typ zugeordnet, der beim Sortieren (und auch beim Suchen) berück­
+sichtigt wird.
+ Es gibt folgende Feldtypen (als Standard wird der Typ TEXT
+verwendet):
+
+ TEXT Vergleich von Texten nach dem EUMEL-Code der einzel­
+ nen Zeichen. Dies ist Standard und sorgt für schnellst­
+ möglichen Vergleich. Die weiteren Typen brauchen erheb­
+ lich mehr Zeit.
+
+ DIN Vergleich nach DIN 5007 (s. EUMEL-Benutzerhandbuch).
+ Umlaute werden korrekt eingeordnet, Groß- und Klein­
+ buchstaben werden gleichbehandelt, Sonderzeichen werden
+ ignoriert.
+
+ ZAHL Der Wert einer Zahl wird verglichen. Außer den Ziffern,
+ dem Dezimalkomma und dem Minuszeichen vor der ersten
+ Ziffer werden alle anderen Zeichen ignoriert. Das Dezi­
+ malkomma ist standardmäßig auf ',' eingestellt, kann aber
+ verändert werden (s. Abschnitt 6.5). Die nicht ignorierten
+ Zeichen werden in eine REAL-Zahl umgewandelt und dann
+ verglichen.
+
+ DATUM Es werden Daten der Form 'tt.mm.jj' verglichen. In diesem
+ Fall werden Tag und Jahr vertauscht und dann vergli­
+ chen. Texte mit einer anderen Länge als 8 werden alle
+ als gleich betrachtet.
+
+#on("b")#Reorganisieren#off("b")# Wenn viele Änderungen an einer EUDAS-Datei
+vorgenommen worden sind, steigt ihr Platzbedarf durch viele Text­
+leichen an. In diesem Fall empfiehlt es sich, die Datei zu reorgani­
+sieren. Auch wenn beim Sortieren viele Sätze vertauscht wurden,
+sollte die Datei reorganisiert werden, da beim Sortieren die physi­
+kalische Reihenfolge der Sätze nicht verändert wird. In diesem Fall
+ergibt sich nach dem Reorganisieren ein Geschwindigkeitsvorteil.
+
+
+4.4 Bearbeiten
+
+#on("b")#Kopieren#off("b")# Durch Kopieren kann ein Ausschnitt aus der
+virtuellen
+Datei in eine andere EUDAS-Datei kopiert werden. Es werden alle
+ausgewählten Sätze kopiert. Wenn mindestens ein Satz markiert ist,
+werden alle markierten Sätze als ausgewählt betrachtet, ansonsten
+alle, die durch die Suchbedingung angegeben sind. Die kopierten
+Sätze werden am Ende der Zieldatei angefügt.
+ Welche Felder kopiert werden sollen, wird durch das Kopier­
+muster angegeben. Hierbei können auch mehrere Felder zu einem
+verschmolzen werden. Allgemein ergeben sich die Felder der Ziel­
+datei aus einem beliebigen ELAN-Ausdruck.
+ Das Kopiermuster ist ein ELAN-Programm und enthält im we­
+sentlichen Ausdrücke der Form
+
+
+ "Feldname" K Ausdruck ;
+
+
+Durch diese Anweisung wird der Ausdruck in das Feld der Zieldatei
+mit dem angegebenen Namen kopiert. Existiert dieses Feld in der
+Zieldatei noch nicht, so wird es als letztes angefügt. Falls die
+Zieldatei noch nicht existiert, wird sie eingerichtet. In diesem Fall
+bestimmt also die Reihenfolge der 'K'-Ausdrücke die Reihenfolge der
+Feldnamen in der Zieldatei.
+ Da die Reihenfolge der 'K'-Ausdrücke wichtig ist, dürfen diese
+nicht in einer IF-Anweisung stehen, sondern müssen für jeden Satz
+komplett in der gleichen Reihenfolge ausgeführt werden.
+
+#on("b")#Standard-Kopiermuster#off("b")# Vor dem Kopieren wird ein Standard-
+Kopiermuster zum Editieren angeboten, das sich nach der Zieldatei
+richtet. Existiert die Zieldatei noch nicht, wird das Muster so kon­
+struiert, daß alle Felder der virtuellen Datei unverändert kopiert
+werden. Wollen Sie einige Felder nicht kopieren, brauchen Sie nur
+die entsprechenden Zeilen zu löschen; wollen Sie die Felder in eine
+andere Reihenfolge bringen, müssen Sie die Zeilen umordnen.
+ Existiert die Zieldatei bereits, gibt das Standard-Kopiermuster
+an, daß alle Felder der Zieldatei einen Wert erhalten. Ist ein Feld
+der Zieldatei in der virtuellen Datei enthalten, so wird dieses ko­
+piert, ansonsten erhält das Feld einen leeren Inhalt. Sie können in
+diesem Fall weitere Felder angeben oder für die leeren Felder Aus­
+drücke formulieren.
+
+#on("b")#Tragen#off("b")# Durch Tragen werden alle ausgewählten Sätze der
+virtuel­
+len Datei in eine andere Datei transportiert. Sie sind in der vir­
+tuellen Datei dann nicht mehr vorhanden. Damit bei diesem Vorgang
+keine Informationen verlorengehen können, muß die Zieldatei so
+viele Felder haben wie die virtuelle Datei. Normalerweise sollte sie
+in der Feldstruktur mit der virtuellen Datei übereinstimmen.
+ Die getragenen Sätze werden jeweils am Ende der Datei ange­
+fügt.
+ Beim Tragen können zusätzlich noch Konsistenzbedingungen
+überprüft werden. Die Prüfbedingungen sind in der Zieldatei gespei­
+chert und können beim Ändern der Feldstruktur angegeben werden.
+ Die Prüfbedingung ist ein ELAN-Programm, das vor dem Tragen
+des jeweiligen Satzes ausgeführt wird. Durch spezielle Testprozedu­
+ren kann das Tragen des Satzes verhindert werden, wenn diese
+Prozeduren ein negatives Ergebnis liefern. Gleichzeitig wird eine
+Meldung in eine Protokolldatei geschrieben, die dann zur Identifi­
+zierung der fehlerhaften Sätze dienen kann.
+ Folgende Prüfprozeduren stehen zur Verfügung (siehe auch
+Abschnitt 8.3):
+
+
+ pruefe ("Feldname", Bedingung)
+
+ Hiermit kann eine beliebige Bedingung (BOOL-Ausdruck in
+ ELAN) überprüft werden.
+
+
+ wertemenge ("Feldname", "Wert1,Wert2,...,Wertn")
+
+ Das Feld muß einen in der angegebenen Liste enthaltenen
+ Werte annehmen.
+
+
+ feldmaske ("Feldname", "Maske")
+
+ Das Feld wird auf Übereinstimmung mit der Maske geprüft.
+ Fünf spezielle Zeichen in der Maske können dabei auf
+ mehrere Zeichen zutreffen:
+ '9' alle Ziffern
+ 'a' alle Kleinbuchstaben, Umlaute, 'ß'
+ 'A' alle Großbuchstaben, Umlaute
+ 'X' alle Zeichen
+ '*' Folge von beliebigen Zeichen
+ Der Stern sollte sparsam angewendet werden, da er verar­
+ beitungsaufwendig ist.
+
+
+ eindeutige felder (n)
+
+ Die Zahl 'n' gibt an, die wieviel ersten Felder der Zieldatei
+ eindeutig sein müssen. Stimmt der zu tragende Satz mit
+ einem Satz der Zieldatei in diesen Feldern überein, wird
+ eine Fehlermeldung erzeugt.
+
+Es können auch einzelne Sätze manuell getragen werden. In diesem
+Fall wird die Prüfbedingung nicht getestet. Ebenso kann der Satz
+wieder zurückgeholt und in der aktuellen Datei eingefügt werden.
+
+#on("b")#Nach Vorschrift ändern#off("b")# Die ausgewählten Sätze der
+virtuellen
+Datei können automatisch nach einer Verarbeitungsvorchrift geän­
+dert werden. Die Verarbeitungsvorschrift ist ein ELAN-Programm, in
+dem mit Hilfe des Operators 'V' Änderungen angegeben werden:
+
+
+ "Feldname" V TEXT-Ausdruck ;
+
+
+Das angegebene Feld erhält den Inhalt, der durch den Ausdruck
+angegeben ist. Änderungen an Koppeldateien werden wie im Dialog
+behandelt (s. Abschnitt 3.4).
+
+
+
+
diff --git a/doc/eudas/eudas.ref.5 b/doc/eudas/eudas.ref.5
new file mode 100644
index 0000000..02971ea
--- /dev/null
+++ b/doc/eudas/eudas.ref.5
@@ -0,0 +1,432 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (49)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+5 Drucken und Druckmuster
+
+
+
+5.1 Druckmustersyntax
+
+Ein Druckmuster ist eine Beschreibung für die Form, in der die In­
+halte einer EUDAS-Datei ausgedruckt werden sollen. Der syntakti­
+sche Aufbau des Druckmusters ist zeilenorientiert und gehorcht
+folgender Syntax:
+
+ Druckmuster :
+ [ Initialisierungsteil ]
+ [ Vorspann ]
+ [ Wiederholungsteil ]
+ [ Nachspann ]
+
+ Initialisierungsteil :
+ ( Kommandozeile #char (""124"")# Textzeile )*
+ ( GRUPPE-Anweisung #char(""124"")# Textzeile )*
+
+ Vorspann :
+ VORSPANN-Anweisung Abschnitt
+
+ Wiederholungsteil :
+ WIEDERHOLUNG-Anweisung Abschnitt
+
+ Nachspann :
+ NACHSPANN-Anweisung Abschnitt
+
+ Abschnitt :
+ Musterteil
+ [ ABKUERZUNGEN-Anweisung Abkürzungsteil ]
+
+ Musterteil :
+ ( Musterzeile #char(""124"")# Kommandozeile #char(""124"")#
+ MODUS-Anweisung #char (""124"")# MEHR-Anweisung )*
+
+Zur Notation: [] bedeutet optional, ()* beliebig häufige Wiederho­
+lung, #char(""124"")# Alternative und keine Angabe einfache Aneinanderreihung.
+Die verschiedenen Zeilentypen werden weiter unten beschrieben.
+ Zusätzlich gilt die Bedingung, daß von Vorspann, Wiederho­
+lungsteil und Nachspann mindestens einer vorhanden sein muß.
+
+#on("b")#Zeilentypen#off("b")# Im Druckmuster gibt es 6 verschiedene
+Zeilentypen:
+
+#on("i")#Kommandozeilen#off("i")#
+ Eine Kommandozeile beginnt mit '%%' in der ersten und zweiten
+ Spalte. Der Inhalt der Zeile ab Spalte 3 wird dem ELAN-Compi­
+ ler übergeben. Die Bedeutung dieser Zeilen ergibt sich aus dem
+ in 5.4 beschriebenen Übersetzungsmechanismus.
+
+#on("i")#Anweisungen#off("i")#
+ Anweisungen beginnen mit '%' in der ersten Spalte und dienen
+ zur Steuerung des Druckgenerators. Der Name der Anweisung
+ muß in Großbuchstaben und ohne Leerzeichen geschrieben
+ werden. Davor dürfen sich noch Leerzeichen befinden. An­
+ schließend können noch Parameter folgen, die nur durch Leer­
+ zeichen getrennt aneinander gereiht werden. Die Syntax einer
+ Anweisung ähnelt der eines Operators in ELAN.
+
+#on("i")#Textzeilen#off("i")#
+ Textzeilen sind die nicht anderweitig markierten Zeilen im
+ Initialisierungsteil. Sie werden unverändert an den Anfang
+ jeder Druckdatei gestellt.
+
+#on("i")#Musterzeilen#off("i")#
+ Musterzeilen sind nicht besonders gekennzeichnete Zeilen im
+ Musterteil. Sie enthalten Feldmuster und werden nach dem
+ Einsetzen von Inhalten in die Ausgabedatei übernommen. Die
+ Interpretation der Musterzeilen wird in Abschnitt 5.3 beschrie­
+ ben.
+
+#on("i")#Abkürzungszeilen#off("i")#
+ Abkürzungszeilen markieren den Beginn einer Abkürzung im
+ Abkürzungsteil eines Abschnittes. Sie werden durch '&' in der
+ ersten Spalte gekennzeichnet. Darauf folgt ohne Zwischenraum
+ der Name einer Abkürzung (ohne Leerzeichen) und danach
+ durch Leerzeichen getrennt ein Semikolon. Der Name der Ab­
+ kürzung wird bei der Übersetzung durch einen Refinementnamen
+ ersetzt und die Zeile dem ELAN-Compiler übergeben. Der Rest
+ der Zeile kann also den Beginn eines werteliefernden Refine­
+ ments enthalten.
+
+#on("i")#Programmzeilen#off("i")#
+ Programmzeilen sind die nicht durch '&' markierten Zeilen im
+ Abkürzungsteil. Sie werden unverändert an den ELAN-Compiler
+ übergeben. Der erlaubte Inhalt richtet sich nach dem Überset­
+ zungsmechanismus (5.4).
+
+
+5.2 Der Druckvorgang
+
+Der Druckvorgang besteht im wesentlichen darin, daß für alle zu
+bearbeitenden Sätze der Wiederholungsteil einmal interpretiert wird
+und das Ergebnis in eine Ausgabedatei geschrieben wird, die dann
+gedruckt werden kann. Wenn mindestens ein Satz markiert ist, wer­
+den alle markierten Sätze der virtuellen Datei bearbeitet, ansonsten
+alle durch die Suchbedingung erfaßten.
+
+#on("b")#Gruppen#off("b")# Eine #on("i")#Gruppe#off("i")# ist eine Folge von Sätzen, die in einem be­
+stimmten Merkmal übereinstimmen. Durch eine GRUPPE-Anweisung
+der Form
+
+
+ % GRUPPE n Ausdruck
+
+
+werden aufeinanderfolgende Sätze mit gleichem Wert des angegebe­
+nen Ausdrucks gruppiert. Über die Nummer 'n' kann festgestellt
+werden, ob sich das angegebene Merkmal verändert hat. Dies ge­
+schieht mit der Prozedur
+
+
+ BOOL PROC gruppenwechsel (INT CONST gruppennr)
+
+
+Immer wenn zwischen zwei Sätzen ein Gruppenwechsel stattfindet,
+wird beim vorigen Satz der Nachspann und beim folgenden Satz der
+Vorspann einmal interpretiert. Dies führt dazu, daß entsprechende
+Vorspann- bzw. Nachspannzeilen gedruckt werden.
+ Vor dem ersten und nach dem letzten zu bearbeitenden Satz
+wechseln alle Gruppen, d.h. dort wird immer ein Vorspann bzw.
+Nachspann erzeugt.
+ Ist ein zu interpretierender Abschnitt nicht vorhanden, so wird
+an dieser Stelle keine Ausgabe erzeugt. Die Textzeilen des Initali­
+sierungsteils werden auf jeden Fall bei Beginn des Druckvorganges
+in die Ausgabedatei geschrieben. Falls die Ausgabedatei voll ist,
+wird eine neue Datei angefangen und die Zeilen des Initialisie­
+rungsteils erneut an den Anfang gestellt.
+
+
+ Satz- Gruppen- Ausgabe
+ nummer merkmal
+#free (0.1)#
+ Initialisierungsteil
+ -------------------------------------------------
+ 1 x Vorspann
+ WDH-Teil
+ 2 x WDH-Teil
+ Nachspann
+ -------------------------------------------------
+ 3 y Vorspann
+ WDH-Teil
+ 4 y WDH-Teil
+ 5 y WDH-Teil
+ Nachspann
+ -------------------------------------------------
+ ENDE
+
+#center#Abb. 5-1 Ablauf des Druckvorganges mit Gruppen
+
+
+#on("b")#Spaltendruck#off("b")# Normalerweise werden die Ausgaben der
+einzelnen
+Abschnitte hintereinander in der Ausgabedatei plaziert. Durch An­
+gabe einer Nummer als Parameter in der WIEDERHOLUNG-Anweisung
+können auch soviel Spalten wie angegeben nebeneinander gedruckt
+werden. Die Spaltenbreite wird dabei durch das Dateilimit (Komman­
+do 'limit' im Editor) festgelegt. Alternativ kann die Spaltenbreite
+auch als zweiter Parameter durch Leerzeichen getrennt angegeben
+werden.
+ Vorspann und Nachspann werden jedoch auf jeden Fall wieder
+in eine eigene Zeile geschrieben, der Spaltendruck also unterbro­
+chen.
+
+
+5.3 Interpretation von Musterzeilen
+
+Musterzeilen können Feldmuster enthalten, die bei der Interpreta­
+tion durch entsprechende Inhalte ersetzt werden, ehe die Muster­
+zeile in die Ausgabedatei übernommen wird. Der Beginn eines Feld­
+musters wird durch ein Musterzeichen ('&' oder '%') markiert. Wo
+und wie der Inhalt eingesetzt wird, kann durch folgende Variationen
+angegeben werden:
+
+
+ Typ ! Beispiel ! Position ! Länge ! bündig
+ ----+-----------+------------------------------
+ 1 ! &Name ! fest ! variabel ! links
+ 2 ! %Name ! variabel ! variabel ! links
+ 3 ! &Name&&& ! fest ! fest ! links
+ 4 ! %Name%%% ! variabel ! fest ! links
+ 5 ! &&&Name& ! fest ! fest ! rechts
+ 6 ! %%%Name% ! variabel ! fest ! rechts
+
+
+Der in dem Feldmuster angegebene Name muß Name einer Abkür­
+zung in irgendeinem Abkürzungsteil oder eines Feldes sein. Der
+Name darf kein Leerzeichen oder Musterzeichen enthalten. Falls dies
+doch der Fall ist, muß der Name in spitze Klammern eingeschlossen
+werden.
+ Bei fester Länge wird bei zu kurzem Inhalt mit Leerzeichen
+aufgefüllt, bei zu langem Inhalt abgeschnitten. Bei linksbündigem
+Einsetzen geschieht dies an der rechten, sonst an der linken Seite.
+ Feldmuster variabler Länge können je nach Inhalt dazu führen,
+daß der folgende Teil der Musterzeile verschoben wird. Für diesen
+Einsetzprozeß gelten die folgenden Regeln:
+
+#on("b")#Position#off("b")# Feldmuster fester Position (mit '&' beginnend)
+werden
+immer in der Position eingesetzt, in der sie stehen. Feldmuster
+variabler Position (mit '%' beginnen) können nach rechts verschoben
+werden, wenn vorherige Inhalte länger als ihre Muster sind, und
+nach links, wenn Modus 1 oder 3 eingestellt ist und vorherige In­
+halte kürzer sind.
+
+#on("b")#Länge#off("b")# Feldmuster variabler Länge erhalten auf jeden Fall
+den
+Platz, der durch die Länge des Feldmusters reserviert ist. Sind die
+Inhalte kürzer, kann der gewonnene Platz als Reserve für andere
+Feldmuster verwendet werden; sind die Inhalte länger, so wird der
+Inhalt so weit eingesetzt, wie noch Reserve vorhanden ist und der
+Rest abgeschnitten.
+ Muß in ein Feldmuster variabler Länge ein leerer Inhalt einge­
+setzt werden, so werden beim Drucken auch die auf das Feldmuster
+folgenden Leerzeichen unterdrückt, falls vor dem Feldmuster noch
+ein Leerzeichen steht oder das Feldmuster in Spalte 1 beginnt.
+ Feldmuster fester Länge werden immer in ihrer reservierten
+Länge eingesetzt. Sie werden im folgenden behandelt wie Feldmuster
+variabler Länge, deren Inhalt so lang ist wie das Feldmuster.
+
+#on("b")#Verteilung#off("b")# Die Verteilung der verschiebbaren Feldmuster
+auf der
+Zeile geschieht jeweils in dem Abschnitt zwischen zwei Feldmustern
+fester Position bzw. Zeilenanfang oder Zeilenende. Für jeden Ab­
+schnitt wird festgestellt, wieviel Stellen die Inhalte insgesamt mehr
+oder weniger als ihre Muster benötigen.
+ Der Längenausgleich geschieht zwischen dem letzten Feldmuster
+und dem Ende des Abschnitts. Dort wird ein Pufferplatz bestimmt,
+der bei Überlänge bis auf ein Leerzeichen verkleinert werden kann
+und an dem bei Unterlänge zusätzliche Leerzeichen eingefügt wer­
+den.
+ Außer am Pufferplatz wird an keinem Mustertext des Abschnitts
+etwas geändert. Zwischentexte zwischen den Feldmustern werden
+unverändert übertragen und mit den umgebenden Feldmustern ver­
+schoben.
+ Als Pufferplatz wird die erste Lücke hinter dem letzten Feld­
+muster eines Abschnittes verwendet, die mehr als ein Leerzeichen
+enthält. Ist keine solche Lücke vorhanden, wird das Ende des Ab­
+schnitts verwendet, falls dort ein Leerzeichen steht, und sonst das
+Ende des letzten Feldmusters.
+ Die durch den Pufferplatz und kürzere Inhalte gewonnene Re­
+serve wird von links an die Feldmuster mit Überlänge verteilt, bis
+die Reserve verbraucht ist.
+
+#on("b")#Zeilende#off("b")# Das Zeilenende wird als ein Quasi-Feldmuster mit
+fester
+Position aufgefaßt, das am Limit der Druckmusterdatei steht. Es
+sind also keine Einsetzungen möglich, die über das Limit der Datei
+hinausgehen. Als Pufferplatz wird hier jedoch die erste Blanklücke
+vom Zeilenende her verwendet, damit Mustertexte am Zeilenende
+gegebenenfalls stehenbleiben. Ist keine solche Lücke vorhanden, so
+wird das Zeilenende als Pufferplatz verwendet.
+ Obwohl nicht als Pufferplatz ausgewiesen, kann der Raum zwi­
+schen Zeilenende und Dateilimit als Reserve verwendet werden.
+
+#on("b")#Modi#off("b")# Der Einsetzmechanismus kann durch die MODUS-Anweisung
+mit einem Parameter verändert werden. Folgende Modi stehen zur
+Verfügung:
+
+
+ Modus ! Effekt
+ ------+----------------------------------------
+ 1 ! Normalmodus.
+ ! '%'-Feldmuster werden auch
+ ! nach links geschoben.
+ ! Keine Zeilenwiederholung.
+ ------+----------------------------------------
+ 2 ! Tabellenmodus.
+ ! '%'-Feldmuster werden nicht
+ ! nach links geschoben.
+ ! Keine Zeilenwiederholung.
+ ------+----------------------------------------
+ 3 ! Normalmodus mit Zeilenwiederholung.
+ ! '%'-Feldmuster werden auch
+ ! nach links geschoben.
+ ! Zeilenwiederholung ohne Zwischentexte.
+ ------+----------------------------------------
+ 4 ! Tabellenmodus mit Zeilenwiederholung.
+ ! '%'-Feldmuster werden nicht
+ ! nach links geschoben.
+ ! Zeilenwiederholung mit Zwischentexten.
+ ------+----------------------------------------
+
+
+Bei Zeilenwiederholung werden Inhalte in einer folgenden Zeile
+fortgesetzt, falls sie in der ersten Zeile nicht untergebracht werden
+konnten. Dazu wird die Musterzeile mit den Restinhalten erneut
+interpretiert. Je nach Modus werden auch die Zwischentexte noch
+wiederholt. Der Restinhalt umfaßt immer noch das ganze letzte Wort,
+das nicht mehr auf die vorige Zeile paßte. Es findet also ein Um­
+bruch statt. Die Positionen, die in der vorigen Zeile vom Anfang des
+Wortes eingenommen würden, werden durch Leerzeichen ersetzt.
+ Durch die MEHR-Anweisung mit einem Parameter kann die Zahl
+der Zeilenwiederholungen für die nächste Musterzeile festgesetzt
+werden. Dies hat jedoch nur eine Auswirkung, falls Zeilenwieder­
+holung zugelassen ist. Stehen zur Interpretation keine Restinhalte
+mehr zur Verfügung, wird mit leeren Inhalten weitergearbeitet. Kann
+ein Inhalt bei der vorgegebenen Anzahl von Zeilen nicht ganz dar­
+gestellt werden, wird der Rest nicht ausgegeben.
+
+
+5.4 Anschluß zum ELAN-Compiler
+
+Falls in einem Druckmuster Abkürzungen, Kommandozeilen oder
+Gruppendefinitionen vorkommen, wird das Druckmuster in ein
+ELAN-Programm umgewandelt, das dann vom ELAN-Compiler über­
+setzt wird.
+ Alle Zeilen eines Abkürzungsteils werden direkt in das Pro­
+gramm übernommen, wobei der Name einer Abkürzung durch einen
+beliebig gewählten Refinementnamen ersetzt wird ('abk' + eine lau­
+fende Nummer). Alle Abkürzungen und Refinements werden als glo­
+bale Refinements definiert, also außerhalb von Prozeduren. Dadurch
+wird erreicht, daß sie an jeder Stelle verwendet werden können.
+ Damit eine Abkürzung richtig als Refinement übersetzt wird,
+muß sie ein TEXT-Objekt als Wert liefern. Die anderen Refinements
+sind beliebig, da sie nur in selbstdefinierten Anweisungen verwen­
+det werden. Die Refinements der Abkürzungen werden in einer Zu­
+weisung an eine TEXT-Variable verwendet, damit der Druckgenera­
+tor auf den entsprechenden Wert zugreifen kann.
+ Jeder Abschnitt wird dagegen als eine Prozedur übersetzt. Eine
+Folge von Musterzeilen wird in eine Anweisung übersetzt, diese
+Musterzeilen einzusetzen und zu drucken. Eine '%%'-Anweisung wird
+einfach unverändert dazwischengeschrieben. Die Prozedur für den
+Wiederholungsteil wird einmal für jeden ausgewählten Satz aufgeru­
+fen, die Vorspann- und die Nachspann-Prozedur einmal bei jedem
+Gruppenwechsel.
+ Anweisungen im Initialisierungsteil werden an den Anfang des
+Programms als globale Definitionen gestellt.
+
+#on("b")#Fehler#off("b")# Findet sich in dem erzeugten ELAN-Programm ein
+Fehler,
+der durch den Druckgenerator nicht erkannt werden konnte (z.B.
+eine Abkürzung liefert keinen Wert), so muß der ELAN-Compiler
+diesen Fehler erkennen. Anschließend zeigt er das erzeugte Pro­
+gramm zusammen mit seinen Fehlermeldungen im Paralleleditor. Sie
+müssen nun die Fehlermeldung lokalisieren und anhand der eben
+gegebenen Hinweise in das ursprüngliche Druckmuster zurücküber­
+setzen, damit Sie dort den Fehler korrigieren können.
+
+
+5.5 Fehlermeldungen
+
+Folgende Fehlermeldungen können bei der Übersetzung eines Druck­
+musters auftreten:
+
+#on("i")#keine schliessende Klammer in Feldmuster#off("i")#
+ Wenn der Name in einem Feldmuster in spitze Klammern einge­
+ schlossen werden soll, muß noch in der gleichen Zeile eine
+ schließende Klammer vorhanden sein.
+
+#on("i")#kein Kommando in Kommandozeile#off("i")#
+ Eine Zeile, die mit '%' beginnt, enthält keinen weiteren Text.
+
+#on("i")#unbekanntes Kommando#off("i")#
+ Das erste Wort in einer Kommandozeile ist kein bekanntes Kom­
+ mando.
+
+#on("i")#kein % WIEDERHOLUNG gefunden#off("i")#
+ Das Druckmuster enthält keine Anweisung, die den Beginn eines
+ Abschnittes markiert. Es muß aber mindestens ein Abschnitt
+ vorhanden sein.
+
+#on("i")#nur GRUPPE-Anweisung erlaubt#off("i")#
+ Im Initialisierungsteil ist nur die GRUPPE-Anweisung erlaubt.
+
+#on("i")#keine ELAN-Anweisung im Initialisierungsteil nach Gruppen­
+definition#off("i")#
+ Sobald im Initialisierungsteil eine GRUPPE-Anweisung aufgetreten
+ ist, ist keine Kommandozeile mehr möglich.
+
+#on("i")#illegale Gruppennummer#off("i")#
+ In einer GRUPPE-Anweisung wurde eine zu große Nummer angege­
+ ben. Gruppen sollten von 1 an durchnumeriert werden.
+
+#on("i")#diese Gruppe wurde schon definiert#off("i")#
+ Eine Gruppennummer wurde mehrfach verwendet.
+
+#on("i")#diese Abkürzung ist nicht definiert#off("i")#
+ Ein Name in einem Feldmuster tritt nicht als Feld-oder Abkür­
+ zungsname auf. Eventuell enthält er ein Leerzeichen!
+
+#on("i")#dieser Abschnitt wurde schon einmal definiert#off("i")#
+ Kein Abschnitt kann mehrmals angegeben werden.
+
+#on("i")#falscher Modus#off("i")#
+ In einer MODUS-Anweisung wurde ein nicht definierter Modus als
+ Parameter angegeben.
+
+#on("i")#diese Anweisung darf im Musterteil nicht vorkommen#off("i")#
+
+#on("i")#im Abkürzungsteil darf keine Anweisung auftreten#off("i")#
+
+#on("i")#in dieser Zeile stehen zu viele Feldmuster#off("i")#
+ Es können maximal 24 Feldmuster in einer Zeile stehen. Abhilfe:
+ mehrere Feldmuster durch eine Abkürzung zusammenfassen.
+
+#on("i")#das Druckmuster enthält zu viele Feldmuster#off("i")#
+ Die Gesamtanzahl der Feldmuster ist begrenzt. Abhilfe: mehrere
+ Feldmuster durch eine Abkürzung zusammenfassen.
+
+#on("i")#nach dem "&" soll direkt der Name einer Abkürzung folgen#off("i")#
+ In einer Abkürzungszeile stehen Leerzeichen hinter dem '&'.
+
+#on("i")#kein Doppelpunkt nach Abkürzung#off("i")#
+ Nach dem Abkürzungsnamen in einer Abkürzungszeile muß durch
+ ein Leerzeichen getrennt ein Doppelpunkt folgen.
+
+#on("i")#Abkürzung mehrfach definiert#off("i")#
+ Die Abkürzung wurde unter dem gleichen Namen schon einmal,
+ vielleicht in einem anderen Abschnitt, definiert.
+
+#on("i")#das Druckmuster enthält zu viele Abkürzungen#off("i")#
+ Abhilfe: mehrere Abkürzungen zu einem Ausdruck zusammenfas­
+ sen.
+
+
diff --git a/doc/eudas/eudas.ref.6 b/doc/eudas/eudas.ref.6
new file mode 100644
index 0000000..7c8ada6
--- /dev/null
+++ b/doc/eudas/eudas.ref.6
@@ -0,0 +1,399 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (61)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+6 Struktur von EUDAS-Dateien
+
+
+
+EUDAS-Dateien können unabhängig von EUDAS über den Daten­
+typ EUDAT manipuliert werden. Die zur Verfügung stehenden Zu­
+griffsoperationen sind in diesem Kapitel beschrieben.
+ Der Datentyp EUDAT ist analog zum Datentyp FILE. Jede
+EUDAT-Variable kann an eine EUDAS-Datei angekoppelt werden.
+Dadurch lassen sich beliebig viele EUDAS-Dateien gleichzeitig be­
+arbeiten. Wie der Abschnitt 6.6 zeigt, sind so auch ganz andere
+Anwendungen realisierbar.
+ Die wesentlichen EUDAS-Funktionen (Ansehen, Suchen, Druk­
+ken) können jedoch nicht direkt auf EUDAT-Variablen angewendet
+werden, sondern greifen auf die virtuelle Datei zu, die im nächsten
+Kapitel beschreiben wird.
+
+
+6.1 Der Datentyp SATZ
+
+Der Datentyp SATZ stellt einen einzelnen EUDAS-Satz dar, der
+intern als TEXT realisiert ist. Ein SATZ besteht aus bis zu 256
+Feldern, die jeweils einen TEXT enthalten können. Nach dem Initi­
+alisieren sind alle Felder mit "" vorbelegt. Die Felder können über
+Nummern von 1 bis 256 angesprochen werden.
+ Damit kann man sich einen SATZ als dynamisches ROW n TEXT
+vorstellen, das bis zu 256 Elemente haben kann. Anders als ein
+entsprechendes ROW belegt ein leerer SATZ praktisch keinen Spei­
+cherplatz.
+ Folgende Zugriffsprozeduren stehen zur Verfügung:
+
+TYPE SATZ
+
+OP := (SATZ VAR, SATZ CONST)
+
+PROC satz initialisieren (SATZ VAR)
+ Jeder SATZ muß vor Benutzung initialisiert werden.
+
+INT PROC felderzahl (SATZ CONST)
+ Liefert die Nummer des höchsten belegten Feldes.
+
+PROC feld lesen (SATZ CONST, INT CONST feldnr,
+ TEXT VAR inhalt)
+ Liest den Inhalt des Feldes 'feldnr' in 'inhalt'.
+
+ FEHLER:
+
+ #on("i")#n ist keine Feldnummer#off("i")#
+ 'n' liegt außerhalb des Bereiches 1..256.
+
+PROC feld bearbeiten (SATZ CONST, INT CONST feldnr,
+ PROC (TEXT CONST, INT CONST, INT CONST) bearbeite)
+ Ruft 'bearbeite' auf, wobei 'bearbeite' ein Text und zwei Posi­
+ tionen in diesem Text übergeben werden. Die Positionen geben
+ das erste und das letzte Zeichen des durch 'feldnr' ausgewähl­
+ ten Feldes an. Ist der Anfang größer als das Ende, so ist das
+ Feld leer.
+
+ FEHLER:
+
+ #on("i")#n ist keine Feldnummer#off("i")#
+ 'n' liegt außerhalb des Bereiches 1..256.
+
+PROC feld aendern (SATZ VAR, INT CONST feldnr,
+ TEXT CONST inhalt)
+ Schreibt 'inhalt' in das Feld mit der Nummer 'feldnr'
+
+ FEHLER:
+
+ #on("i")#n ist keine Feldnummer#off("i")#
+ 'n' liegt außerhalb des Bereiches 1..256.
+
+INT PROC feldindex (SATZ CONST, TEXT CONST muster)
+ Falls eines der Felder 'muster' enthält, wird die Nummer dieses
+ Feldes geliefert, sonst 0.
+
+
+6.2 Der Datentyp EUDAT
+
+Der Datentyp EUDAT muß ähnlich wie ein FILE an einen benann­
+ten oder unbenannten Datenraum angekoppelt werden. Der Daten­
+raum hat anschließend den Typ 3243. Weitere Zugriffe auf eine
+EUDAT-Variable sind erst nach erfolgtem Ankoppeln zulässig. An­
+derenfalls können undefinierte Fehler entstehen.
+
+TYPE EUDAT
+
+PROC oeffne (EUDAT VAR, TEXT CONST dateiname)
+ Koppelt die EUDAT-Variable an die EUDAS-Datei mit dem
+ Namen 'dateiname' an. Die Datei wird eingerichtet, falls sie
+ noch nicht existiert.
+
+ FEHLER:
+
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Die angegebene Datei hat nicht den Typ 3243.
+
+PROC oeffne (EUDAT VAR, DATASPACE CONST ds)
+ Koppelt die EUDAT-Variable an den Datenraum 'ds'.
+
+ FEHLER:
+
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Der Datenraum wurde bereits verwendet und hat nicht den Typ
+ 3243.
+
+Eine EUDAS-Datei ist in Felder und Sätze unterteilt. Die Felder
+werden beim Zugriff über Nummern angesprochen. Jedem Feld ist
+jedoch zur Identifikation ein TEXT als Feldname zugeordnet. Die
+Feldnamen werden als SATZ gespeichert, wobei jedes Feld seinen
+zugeordneten Namen enthält.
+
+INT PROC felderzahl (EUDAT CONST)
+ Liefert Anzahl der benannten Felder. Ist zu Anfang 0.
+
+PROC feldnamen aendern (EUDAT VAR,
+ SATZ CONST neue namen)
+ Setzt die Feldnamen einer Datei. Ist 'felderzahl (neue namen)'
+ größer als die Felderzahl der Datei, so wird die Felderzahl der
+ Datei entsprechend heraufgesetzt.
+
+PROC feldnamen lesen (EUDAT CONST, SATZ VAR namen)
+ Liefert alle Feldnamen in einer SATZ-Variablen.
+
+Eine EUDAS-Datei enthält drei zusätzliche Notiztexte. Zwei davon
+sind bereits reserviert, und zwar:
+#free (0.2)#
+ 1: Prüfbedingungen
+ 2: Datum der letzten Änderung
+
+Der dritte kann für freie Notizen verwendet werden.
+
+PROC notizen lesen (EUDAT CONST, INT CONST notiz nr,
+ TEXT VAR notizen)
+ Schreibt die Notizen der EUDAS-Datei in 'notizen' ('notiz nr' =
+ 1,2,3).
+
+PROC notizen aendern (EUDAT VAR, INT CONST notiz nr,
+ TEXT CONST notizen)
+ Ändert die Notizen. Alte Notizen werden dabei überschrieben
+ ('notiz nr' = 1,2,3).
+
+
+6.3 Satzposition
+
+Eine EUDAS-Datei läßt sich sequentiell vorwärts und rückwärts
+bearbeiten. Dazu gibt es eine aktuelle Satzposition. Ein bestimmter
+Satz kann auch direkt angesprungen werden. Die Prozeduren, die
+nach dem Inhalt des ersten Feldes suchen, arbeiten besonders
+schnell, da die entsprechenden Sätze über eine Hashmethode gefun­
+den werden.
+
+INT PROC satznr (EUDAT CONST)
+ Liefert aktuelle Satzposition.
+
+INT PROC saetze (EUDAT CONST)
+ Liefert Anzahl der Sätze.
+
+BOOL PROC dateiende (EUDAT CONST)
+ Liefert TRUE, wenn 'satznr' groesser als 'saetze' ist. Die letzte
+ erreichbare Satzposition liegt um eins hinter dem letzten Satz
+ (um auch am Ende anfügen zu können).
+
+PROC auf satz (EUDAT VAR, INT CONST satznr)
+ Positioniert auf den gewünschten Satz. Bei nicht existierenden
+ Sätzen wird auf den ersten bzw. hinter den letzten Satz ge­
+ sprungen.
+
+PROC weiter (EUDAT VAR)
+ Geht einen Satz weiter, jedoch nicht über das Dateiende hinaus.
+
+PROC zurueck (EUDAT VAR)
+ Geht einen Satz zurück, falls der erste Satz noch nicht erreicht
+ ist.
+
+PROC auf satz (EUDAT VAR, TEXT CONST muster)
+ Positioniert auf den ersten Satz, der als erstes Feld 'muster'
+ enthält, anderenfalls hinter den letzten Satz.
+
+PROC weiter (EUDAT VAR, TEXT CONST muster)
+ Geht weiter, bis das erste Feld 'muster' enthält, bzw. bis hinter
+ den letzten Satz.
+
+PROC zurueck (EUDAT VAR, TEXT CONST muster)
+ Geht zurück, bis das erste Feld 'muster' enthält, bzw. auf den
+ ersten Satz der EUDAS-Datei.
+
+
+6.4 Satzzugriffe
+
+Der aktuelle Satz ist ein SATZ-Objekt. Auf die Felder des aktuellen
+Satzes kann direkt zugegriffen werden.
+
+PROC feld lesen (EUDAT CONST, INT CONST feldnr,
+ TEXT VAR inhalt)
+ Wirkt wie 'feld lesen' auf den aktuellen Satz.
+
+PROC feld aendern (EUDAT VAR, INT CONST feldnr,
+ TEXT CONST inhalt)
+ Wirkt wie 'feld aendern' auf den aktuellen Satz.
+
+PROC feld bearbeiten (EUDAT CONST, INT CONST feldnr,
+ PROC (TEXT CONST, INT CONST, INT CONST) bearbeite)
+ Wirkt wie 'feld bearbeiten' auf den aktuellen Satz.
+
+Der aktuelle Satz kann auch als Ganzes bearbeitet werden.
+
+PROC satz lesen (EUDAT CONST, SATZ VAR satz)
+ Liefert den aktuellen Satz.
+
+PROC satz aendern (EUDAT VAR, SATZ CONST satz)
+ Ersetzt den aktuellen Satz durch 'satz'.
+
+PROC satz einfuegen (EUDAT VAR, SATZ CONST satz)
+ Fügt 'satz' vor dem aktuellen Satz ein.
+
+ FEHLER:
+
+ #on("i")#EUDAS-Datei voll#off("i")#
+ Eine EUDAS-Datei faßt mindestens 5000 Sätze.
+
+PROC satz loeschen (EUDAT VAR)
+ Löscht den aktuellen Satz.
+
+
+6.5 Sortieren und Reorganisieren
+
+Zum Sortieren können für die einzelnen Felder Typen angegeben
+werden, damit auch Zahlen und Daten richtig sortiert werden kön­
+nen. Außerdem kann die Feldreihenfolge angegeben werden, nach
+der sortiert werden soll.
+
+PROC feldinfo (EUDAT VAR, INT CONST feldnr, info)
+ Setzt den Feldtyp des Feldes 'feldnr'. Es bedeuten
+ -1 : normaler Text (Standard)
+ 0 : Text nach DIN. Ziffern und Sonderzeichen werden igno­
+ riert. Groß-und Kleinbuchstaben gelten gleich. Umlaute
+ werden beachtet.
+ 1 : Zahl (beim Vergleich werden alle Zeichen außer Zif­
+ fern ignoriert).
+ 2 : Datum. Es werden Daten der Form "tt.mm.jj" vergli­
+ chen.
+
+INT PROC feldinfo (EUDAT CONST, INT CONST feldnr)
+ Der Feldtyp des angegebenen Feldes wird geliefert. Zu Anfang
+ ist -1 voreingestellt.
+
+INT PROC unsortierte saetze (EUDAT CONST)
+ Liefert die Anzahl von Sätzen, die seit dem letzten Sortiervor­
+ gang geändert wurden. Bei einer neuen Datei, die noch nie
+ sortiert wurde, wird immer 0 geliefert.
+
+PROC dezimalkomma (TEXT CONST komma)
+ Stellt das Dezimalkomma ein, das beim Vergleich von Zahlen
+ gelten soll.
+
+ FEHLER:
+
+ #on("i")#Nicht erlaubtes Dezimalkomma#off("i")#
+ Nur Texte der Länge 1 sind zugelassen.
+
+TEXT PROC dezimalkomma
+ Liefert das eingestellte Dezimalkomma ("," ist voreingestellt).
+
+PROC sortiere (EUDAT VAR, TEXT CONST reihenfolge)
+ Sortiert die Datei in der von 'reihenfolge' angegebenen Reihen­
+ folge. Dabei enthält 'reihenfolge' an der Stelle 2*i+1 den Code
+ der Feldnummer, die als i-te in der Sortierung berücksichtigt
+ werden soll. Das Zeichen an der Stelle 2*i gibt an, ob das Feld
+ mit der davorstehenden Feldnummer aufsteigend ('+') oder
+ absteigend ('-') sortiert werden soll.
+
+PROC sortiere (EUDAT VAR)
+ Sortiert die Datei in der zuletzt eingestellten Reihenfolge.
+ Wurde noch keine Reihenfolge angegeben, wird die Datei in der
+ Feldreihenfolge sortiert.
+
+TEXT PROC sortierreihenfolge (EUDAT CONST)
+ Liefert die zuletzt eingestellte Reihenfolge. Wurde noch nicht
+ sortiert, so wird "" geliefert.
+
+Nach umfangreichen Änderungen an einer EUDAS-Datei ist eine
+Reorganisation sinnvoll, um "Textleichen" zu beseitigen.
+
+PROC reorganisiere (TEXT CONST dateiname)
+ Die EUDAS-Datei mit dem Namen 'dateiname' wird reorgani­
+ siert.
+
+
+6.6 EUDAS-Dateien als Assoziativspeicher
+
+In diesem Abschnitt soll ein Beispiel erläutert werden, in dem
+EUDAS-Dateien unabhängig von EUDAS für einen ganz anderen
+Zweck benutzt werden. Das folgende kurze Paket soll ein Abkür­
+zungsverzeichnis realisieren, das auf einer EUDAS-Datei basiert.
+
+
+ PACKET abkuerzungsverzeichnis
+ DEFINES
+ verzeichnis laden,
+ abkuerzung einfuegen,
+ abkuerzung aendern,
+ abkuerzung loeschen,
+ langform :
+
+ EUDAT VAR verz;
+ SATZ VAR satz;
+ TEXT VAR inhalt;
+
+ PROC verzeichnis laden (TEXT CONST dateiname) :
+
+ oeffne (verz, dateiname)
+
+ END PROC verzeichnis laden;
+
+ PROC abkuerzung einfuegen (TEXT CONST abk, lang) :
+
+ auf satz (verz, abk);
+ IF NOT dateiende (verz) THEN
+ errorstop ("Abkürzung existiert bereits")
+ ELSE
+ satz initialisieren (satz);
+ feld aendern (satz, 1, abk);
+ feld aendern (satz, 2, lang);
+ satz einfuegen (satz)
+ END IF
+
+ END PROC abkuerzung einfuegen;
+
+ PROC abkuerzung aendern (TEXT CONST abk, lang) :
+
+ auf satz (verz, abk);
+ IF dateiende (verz) THEN
+ errorstop ("Abkürzung existiert nicht")
+ ELSE
+ feld aendern (verz, 2, lang)
+ END IF
+
+ END PROC abkuerzung aendern;
+
+ PROC abkuerzung loeschen (TEXT CONST abk) :
+
+ auf satz (verz, abk);
+ IF NOT dateiende (verz) THEN
+ satz loeschen (verz)
+ END IF
+
+ END PROC abkuerzung loeschen;
+
+ TEXT PROC langform (TEXT CONST abk) :
+
+ auf satz (verz, abk);
+ IF dateiende (verz) THEN
+ inhalt := "";
+ errorstop ("Abkürzung nicht vorhanden")
+ ELSE
+ feld lesen (verz, 2, inhalt)
+ END IF;
+ inhalt
+
+ END PROC langform;
+
+ END PACKET abkuerzungsverzeichnis;
+
+
+Die Prozedur 'verzeichnis laden' koppelt die interne EUDAT-Vari­
+able 'verz' an eine benannte EUDAS-Datei, die eventuell vorher mit
+EUDAS erstellt wurde. In diesem Beispiel sind die Feldnamen egal;
+falls die übergebene EUDAS-Datei noch nicht existiert, wird sie mit
+0 Feldern eingerichtet, was aber nur für eine spätere Anzeige mit
+EUDAS störend wäre.
+ Grundlage für das Aufsuchen einer bestimmten Abkürzung bil­
+det immer die Prozedur 'auf satz', die nach dem Inhalt des ersten
+Feldes optimiert sucht. Falls die Abkürzung nicht gefunden wurde,
+wird auf das Dateiende positioniert, daher wird jeweils 'dateiende'
+abgefragt.
+ Beim Einfügen eines neuen Satzes muß eine komplette Satz­
+variable angegeben werden, die bereits mit den Inhalten gefüllt ist.
+Beim späteren Ändern kann jedoch direkt auf ein Feld zugegriffen
+werden, ohne die Satzvariable explizit rauszuholen.
+ Die Abfrage einer bestimmten Abkürzung bereitet dann keine
+Schwierigkeiten mehr.
+ Für die Verwendung von EUDAS-Dateien in diesem Beispiel
+spricht zum einen die einfache Programmierung, zum anderen aber
+auch die Möglichkeit, das erstellte Verzeichnis mit den Hilfsmitteln
+
diff --git a/doc/eudas/eudas.ref.7 b/doc/eudas/eudas.ref.7
new file mode 100644
index 0000000..31b3031
--- /dev/null
+++ b/doc/eudas/eudas.ref.7
@@ -0,0 +1,447 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (71)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+7 Verwaltung der offenen Dateien
+
+
+Die in diesem Kapitel beschriebene Schnittstelle verbindet mehrere
+EUDAS-Dateien zu einem großen Dateimodell. Diese virtuelle Datei
+dient als Grundlage für die meisten EUDAS-Funktionen. Zuerst muß
+eine Datei als Bestandteil der virtuellen Datei geöffnet werden, ehe
+sie bearbeitet werden kann. Es ist so bei den Funktionen keine
+Angabe mehr nötig, welche Datei gemeint ist.
+ Diese Schnittstelle ist in vielen Teilen für die interne
+EUDAS-Anwendung ausgelegt. Bei einigen Prozeduren werden aus
+Effizienzgründen keinerlei Überprüfungen auf illegale Aufrufe oder
+Parameter durchgeführt. Wollen Sie eine solche Prozedur dennoch
+verwenden, sollten Sie die Einhaltung der angegebenen Bedingungen
+sorgfältig überprüfen.
+
+
+7.1 Dateiverwaltung
+
+Mit 'oeffne' wird eine Datei zum Bearbeiten geöffnet. Mit 'kette' und
+'kopple' können weitere Dateien dazugekettet bzw. dazugekoppelt
+werden. Durch 'sichere' können veränderte Kopien zurückgeschrie­
+ben werden. Durch 'dateien loeschen' werden die internen Kopien
+gelöscht.
+ Mit 'anzahl dateien' kann die Anzahl der vorhandenen Dateien
+erfragt werden. 'anzahl koppeldateien' gibt Auskunft darüber, wie­
+viel Dateien davon gekoppelt sind. 'aendern erlaubt' gibt den Status
+wieder, der beim Öffnen der ersten Datei angegeben wurde. 'inhalt
+veraendert' gibt an, ob die angegebene Datei verändert wurde. Mit
+'eudas dateiname' können die Namen der geöffneten Dateien erfragt
+werden. Bei jedem 'oeffne' wird 'dateiversion' um 1 erhöht. Dies
+dient dazu, ein erfolgtes neues Öffnen von anderen Stellen aus zu
+entdecken.
+ Mit 'auf koppeldatei' kann die virtuelle Datei auf eine Koppel­
+datei umgeschaltet werden, so daß der Eindruck entsteht, nur diese
+Datei wäre geöffnet worden.
+
+PROC oeffne (TEXT CONST dateiname,
+ BOOL CONST aendern erlaubt)
+ Falls Ändern erlaubt sein soll, wird eine Kopie der angegebenen
+ Datei zur Bearbeitung für EUDAS angelegt. Vorher geöffnete
+ Dateien werden gelöscht. Die Änderungserlaubnis wird entspre­
+ chend gesetzt. Es wird die Satzposition der EUDAS-Datei ange­
+ nommen (Ausnahme: steht die EUDAS-Datei hinter dem letzten
+ Satz, wird auf Satz 1 positioniert). 'dateiversion' sowie 'anzahl
+ dateien' werden um 1 erhöht.
+
+ FEHLER:
+#f1#
+ #on("i")#Datei nicht gesichert#off("i")#
+ Eine vorher geöffnete Datei war verändert, aber nicht gesi­
+ chert.
+#f1#
+ #on("i")#Datei existiert nicht#off("i")#
+ Die angegebene Datei ist nicht vorhanden.
+#f1#
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Die angegebene Datei hat nicht den für EUDAS-Dateien festge­
+ legten Typ.
+
+PROC kopple (TEXT CONST dateiname)
+ Die angegebene Datei wird zu den bereits geöffneten Dateien
+ dazugekoppelt. Falls Ändern erlaubt ist, wird eine Kopie dieser
+ Datei verwendet. Dabei werden die ersten Felder der Datei, die
+ bereits in der Hauptdatei vorhanden sind, als Koppelfelder
+ festgelegt. Alle weiteren Felder werden zusätzlich zu den bis­
+ herigen angelegt. 'dateiversion', 'anzahl dateien' und 'anzahl 
+ koppeldateien' werden um 1 erhöht.
+
+ FEHLER:
+#f1#
+ #on("i")#keine Datei geoeffnet#off("i")#
+ Es muß vorher eine Datei geöffnet werden.
+#f1#
+ #on("i")#Zuviel Dateien geoeffnet#off("i")#
+ Die Anzahl der gleichzeitig geöffneten Dateien ist begrenzt.
+#f1#
+ #on("i")#Datei existiert nicht#off("i")#
+ Die angegebene Datei ist nicht vorhanden.
+#f1#
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Die angegebene Datei hat nicht den für EUDAS-Dateien festge­
+ legten Typ.
+#f1#
+ #on("i")#Zu viele Felder#off("i")#
+ Die Anzahl der Felder insgesamt ist begrenzt.
+#f1#
+ #on("i")#Zu viele Koppelfelder#off("i")#
+ Die Anzahl der Koppelfelder ist begrenzt.
+#f1#
+ #on("i")#keine Koppelfelder vorhanden#off("i")#
+ Das erste Feld der zu koppelnden Datei ist in der Hauptdatei
+ nicht vorhanden (unterschiedliche Feldnamen).
+
+PROC kette (TEXT CONST dateiname)
+ Die angegebene Datei wird an die Hauptdatei angekettet, d.h.
+ die Sätze der neuen Datei werden am bisherigen Dateiende
+ angefügt. Falls Ändern erlaubt ist, wird eine Kopie dieser Datei
+ verwendet. Die zu kettende Datei muß in der Feldstruktur nicht
+ mit der Hauptdatei übereinstimmen. Die aktuelle Satzposition
+ wird beibehalten. 'dateiversion' und 'anzahl dateien' werden um
+ 1 erhöht.
+
+ FEHLER:
+#f1#
+ #on("i")#keine Datei geoeffnet#off("i")#
+ Es muß vorher eine Datei geöffnet werden.
+#f1#
+ #on("i")#Zuviel Dateien geoeffnet#off("i")#
+ Die Anzahl der gleichzeitig geöffneten Dateien ist begrenzt.
+#f1#
+ #on("i")#Datei existiert nicht#off("i")#
+ Die angegebene Datei ist nicht vorhanden.
+#f1#
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Die angegebene Datei hat nicht den für EUDAS-Dateien festge­
+ legten Typ.
+
+PROC sichere (INT CONST dateinr, TEXT CONST dateiname)
+ Die geöffneten Dateien werden in der Reihenfolge ihres Öffnens
+ durchnumeriert (von 1 an). Die Arbeitskopie mit der angegebe­
+ nen Nummer wird unter dem angegebenen Namen gesichert, aber
+ selbst nicht verändert. Die vorher unter diesem Namen vorhan­
+ dene Datei wird gelöscht. War die zu sichernde Arbeitskopie
+ verändert worden, so wird sie anschließend als nicht verändert
+ angesehen.
+ Bedingungen:
+ 1 <= dateinr <= anzahl dateien
+
+PROC dateien loeschen (BOOL CONST auch geaenderte)
+ Es werden alle geöffneten Arbeitskopien gelöscht. EUDAS wird
+ wieder in den Anfangszustand versetzt. Wird 'auch geaenderte'
+ angegeben, wird bei geänderten, aber nicht gesicherten Dateien
+ die Fehlermeldung unterdrückt.
+
+ FEHLER:
+#f1#
+ #on("i")#Datei nicht gesichert#off("i")#
+ Eine vorher geöffnete Datei war verändert, aber nicht gesi­
+ chert.
+
+BOOL PROC auf koppeldatei
+ Liefert TRUE, wenn auf eine Koppeldatei umgeschaltet wurde.
+
+PROC auf koppeldatei (INT CONST nr)
+ Umschalten auf Koppeldatei 'nr'. Ist bereits umgeschaltet, wird
+ wieder zurückgeschaltet. In diesem Fall werden bei 'nr' = 1 die
+ Koppelfelder übernommen, anderenfalls nicht. Beim Umschalten
+ bleiben Satzposition, Markierungen und Suchmuster gespeichert.
+ In der Koppeldatei wird die beim letzten Umschalten eingestell­
+ te Position wieder eingenommen. 'dateiversion' wird um 1 er­
+ höht.
+
+INT PROC anzahl dateien
+ Gibt die Anzahl der insgesamt geöffneten Dateien an.
+
+INT PROC anzahl koppeldateien
+ Gibt die Anzahl der gekoppelten Dateien an.
+
+BOOL PROC aendern erlaubt
+ Reflektiert den Status, der bei 'oeffne' gesetzt wurde.
+
+BOOL PROC inhalt veraendert (INT CONST dateinr)
+ Gibt an, ob die geöffnete Datei mit der angegebenen Nummer
+ verändert wurde. Wird ggf. von 'sichere' zurückgesetzt.
+ Bedingung:
+ 1 <= dateinr <= anzahl dateien
+
+TEXT PROC eudas dateiname (INT CONST dateinr)
+ Liefert den Namen, unter dem die entsprechende Datei geöffnet
+ wurde.
+ Bedingung:
+ 1 <= dateinr <= anzahl dateien
+
+INT PROC dateiversion
+ Wird bei jedem 'oeffne', 'kette' und 'kopple' zyklisch erhöht.
+
+INT PROC folgedatei (INT CONST dateinr)
+ Eine geöffnete EUDAS-Datei wird in eine von zwei Listen auf­
+ genommen, die der geketteten Dateien und die der gekoppelten.
+ Diese Prozedur liefert jeweils die Nummer der nächsten Datei in
+ der Liste, am Ende aber 0. Die Liste der geketteten Dateien
+ beginnt immer mit 1, mit 'folgedatei (0)' erhält man die erste
+ gekoppelte Datei.
+ Bedingung:
+ 0 <= dateinr <= anzahl dateien
+
+
+7.2 Feldstruktur
+
+Die einzelnen Sätze der kombinierten EUDAS-Datei sind in Felder
+unterteilt. Diese setzen sich zusammen aus den Feldern der Haupt­
+datei und der einzelnen Koppeldateien, wobei die Koppelfelder je­
+weils nur einmal auftauchen.
+ 'anzahl felder' liefert die Anzahl der vorhanden Felder. Mit
+'feldnamen lesen' und 'feldnamen bearbeiten' können die Feldnamen
+abgefragt werden. 'feldnummer' liefert einen Index für einen vor­
+gegebenen Feldnamen, da die Felder immer über Nummern angespro­
+chen werden.
+ Die Prozeduren 'feld lesen' und 'feld bearbeiten' ermöglichen
+den Zugriff auf den Feldinhalt des aktuellen Satzes; durch 'feld
+aendern' kann dieser Inhalt abgeändert werden.
+
+INT PROC anzahl felder
+ Liefert die Anzahl der vorhanden Felder.
+
+PROC feldnamen lesen (INT CONST feldnr,
+ TEXT VAR feldname)
+ Liefert in 'feldname' den Namen des Feldes mit der Nummer
+ 'feldnr'.
+ Bedingung:
+ 1 <= feldnr <= anzahl felder
+
+PROC feldnamen bearbeiten (INT CONST feldnr,
+ PROC (TEXT CONST, INT CONST, INT CONST) bearbeite)
+ Die Prozedur 'bearbeite' wird aufgerufen. Als Parameter werden
+ ein Text und Anfangs- und Endposition des gewünschten Feld­
+ namens in diesem Text übergeben. Verhindert unnötiges Kopie­
+ ren des Feldnamens in eine TEXT-Variable. Der übergebene
+ Text darf nicht verändert werden!
+ Bedingung:
+ 1 <= feldnr <= anzahl felder
+
+INT PROC feldnummer (TEXT CONST feldname)
+ Liefert den index zu dem angegebenen Feldnamen. Falls ein
+ solcher Name nicht existiert, wird 0 geliefert.
+
+PROC feld lesen (INT CONST feldnr, TEXT VAR inhalt)
+ Liefert den Inhalt des angegebenen Feldes.
+ Bedingung:
+ 1 <= feldnr <= anzahl felder
+
+PROC feld bearbeiten (INT CONST feldnr,
+ PROC (TEXT CONST, INT CONST, INT CONST) bearbeite)
+ Die Prozedur 'bearbeite' wird aufgerufen. Der Feldinhalt des
+ angegebenen Feldes steht im übergebenen Text innerhalb der
+ Grenzen. Ist die Obergrenze kleiner als die Untergrenze, so ist
+ das Feld leer.
+ Bedingung:
+ 1 <= feldnr <= anzahl felder
+
+PROC feld aendern (INT CONST feldnr, TEXT CONST inhalt)
+ Ändert den Inhalt des angegebenen Feldes.
+ Bedingung:
+ NOT ende der datei
+ 1 <= feldnr <= anzahl felder
+
+INT PROC feldinfo (INT CONST feldnummer)
+ Liefert den Typ des angegebenen Feldes.
+ Bedingung:
+ 1 <= feldnummer <= anzahl felder
+
+PROC notizen lesen (INT CONST nr, TEXT VAR inhalt)
+ Liest die angegebenen Notizen ('nr' = 1,2,3) aus der ersten
+ Datei oder der umgeschalteten Koppeldatei.
+
+PROC notizen aendern (INT CONST nr, TEXT CONST inhalt)
+ Ändert die Notizen ('nr' = 1,2,3) der ersten Datei oder der um­
+ geschalteten Koppeldatei.
+
+
+7.3 Positionierung
+
+Das virtuelle Dateimodell von EUDAS verfügt ebenfalls über eine
+Satzposition, die verändert werden kann.
+ Durch 'satznummer' wird die aktuelle Satznummer geliefert,
+beim Koppeln kann über 'satzkombination' die Reihenfolge der Kop­
+pelkombinationen bestimmt werden. 'dateiende' zeigt an, ob die
+Satzposition hinter dem letzten Satz liegt. Mit 'weiter' und 'zurueck'
+erfolgt die eigentliche Positionierung. Hier kann außer der Positio­
+nierung um Einzelsätze auch die Positionierung auf den nächsten
+ausgewählten oder markierten Satz angefordert werden. Mit 'auf 
+satz' schließlich kann ein bestimmter Satz angesprungen werden.
+
+INT PROC satznummer
+ Liefert die Nummer des aktuellen Satzes. Die Sätze werden von
+ 1 an durchnumeriert, wobei über die geketteten Dateien wei­
+ tergezählt wird.
+ Bedingung:
+ anzahl dateien > 0
+
+INT PROC satzkombination
+ Liefert die laufende Nummer der Koppelkombination des aktuel­
+ len Satzes. Wird nur durch 'weiter' im Einzelsatzmodus erhöht.
+ Normalerweise 1.
+ Bedingung:
+ anzahl dateien > 0
+
+BOOL PROC dateiende
+ Gibt an, ob die Satzposition hinter dem letzten Satz liegt.
+
+PROC weiter (INT CONST modus)
+ Erhöht die aktuelle Satzposition. Für 'modus' gibt es 3 Möglich­
+ keiten:
+ 1: Falls eine weitere Satzkombination besteht, wird diese ein­
+ genommen, sonst zum nächsten Satz.
+ 2: Zum nächsten durch Suchbedingung ausgewählten Satz. Wird
+ optimiert.
+ 3: Zum nächsten markierten Satz. Wird optimiert.
+ Ist kein Satz mehr vorhanden, wird die Satzposition hinter dem
+ letzten Satz eingenommen.
+ Bedingung:
+ anzahl dateien > 0
+
+PROC zurueck (INT CONST modus)
+ Geht um einen Satz zurück. Die Modusangabe ist wie bei 'wei­
+ ter', jedoch wird im Modus 1 keine weitere Satzkombination
+ ausprobiert. Die Positionierung endet bei Satz 1.
+ Bedingung:
+ anzahl dateien > 0
+
+PROC auf satz (INT CONST satznr)
+ Geht auf den angegebenen Satz. Ist 'satznr' < 1, wird auf Satz 1
+ positioniert, ist der angegebene Satz nicht vorhanden, wird
+ hinter den letzten Satz positioniert. Es wird jeweils die erste
+ Satzkombination eingenommen.
+ Bedingung:
+ anzahl dateien > 0
+
+
+7.4 Änderungen
+
+Sätze des Dateimodells können eingefügt oder gelöscht werden.
+Durch das Einfügen entsteht ein leerer Satz vor dem aktuellen Satz;
+alle weiteren Sätze rücken eine Stelle weiter. Beim Löschen wird
+dieser Vorgang wieder rückgängig gemacht.
+ Durch 'satz einfuegen' wird ein Leersatz eingefügt; durch
+'satz loeschen' wird der aktuelle Satz gelöscht.
+ Sätze in gekoppelten Dateien werden grundsätzlich nicht ge­
+löscht; auch beim Einfügen entsteht nicht automatisch ein Leersatz
+in den gekoppelten Dateien. Änderungen in den Koppeldateien
+(durch 'feld aendern') werden gepuffert. Durch 'aenderungen ein­
+tragen' werden die Änderungen dann in die Koppeldateien eingetra­
+gen. Dabei kann auch ein neuer Satz in die Koppeldatei eingefügt
+werden. Bei Positionierungen wird diese Prozedur automatisch auf­
+gerufen.
+
+PROC satz einfuegen
+ Fügt vor dem aktuellen Satz einen Leersatz ein.
+ Bedingung:
+ anzahl dateien > 0
+
+PROC satz loeschen
+ Löscht den aktuellen Satz. Hat hinter dem letzten Satz keine
+ Wirkung.
+ Bedingung:
+ anzahl dateien > 0
+
+PROC aenderungen eintragen
+ Trägt die gepufferten Änderungen in die Koppeldateien ein.
+ Dabei können die folgenden Fälle auftreten:
+ 1. Der Satz in der Koppeldatei wird geändert.
+ Dies geschieht dann, wenn vorher ein passender Satz in der
+ Koppeldatei vorhanden war und die Koppelfelder nicht ver­
+ ändert wurden.
+ 2. In der Koppeldatei wird ein neuer Satz eingefügt.
+ Wenn die Koppelfelder und noch andere Felder einer Datei
+ geändert wurden, wird in dieser Datei ein neuer Satz einge­
+ fügt.
+ 3. Es wird neu gekoppelt.
+ Wurden nur die Koppelfelder einer Datei geändert, wird ein
+ neuer, zu diesen Feldern passender Satz gesucht. Nach
+ 'aenderungen eintragen' erscheinen unter den Feldern der
+ Datei die neuen Inhalte.
+
+
+7.5 Suchbedingungen
+
+Über 'suchbedingung' kann eine Suchbedingung eingetragen werden,
+die für jeden Satz geprüft werden soll. Mit 'satz ausgewaehlt' wird
+erfragt, ob der aktuelle Satz die Suchbedingung erfüllt. Die Such­
+bedingung kann mit 'suchbedingung loeschen' wieder ausgeschaltet
+werden.
+ Einzelne Sätze können auch markiert werden. Nach einem Öff­
+nen ist zunächst kein Satz markiert. Durch 'markierung  aendern'
+kann die Markierung eines Satzes geändert werden. 'satz markiert'
+fragt ab, ob der aktuelle Satz markiert ist. 'markierte saetze' liefert
+die Anzahl der markierten Sätze. Mit 'markierungen loeschen' wer­
+den alle Markierungen entfernt.
+
+PROC suchbedingung (INT CONST feldnr,
+ TEXT CONST bedingung)
+ Stellt für das angegebene Feld die im Text als Muster angege­
+ bene Suchbedingung ein. Weitere Aufrufe verknüpfen die Be­
+ dingungen mit UND (auch wenn das gleiche Feld erneut angege­
+ ben wird).
+ Bedingung:
+ anzahl dateien > 0
+ 1 <= feldnr <= anzahl felder
+
+ FEHLER:
+#f1#
+ #on("i")#Suchmuster zu umfangreich#off("i")#
+ Es wurden zu viele Vergleiche gefordert.
+
+BOOL PROC satz ausgewaehlt
+ Gibt an, ob die Suchbedingung auf den aktuellen Satz zutrifft.
+ Hinter dem letzten Satz wird immer FALSE geliefert.
+ Bedingung:
+ anzahl dateien > 0
+
+PROC suchbedingung lesen (INT CONST feldnr, TEXT VAR bedingung)
+ Liefert die zuletzt für das angegebene Feld eingestellte Bedin­
+ gung, falls die Suchbedingung nicht gelöscht und keine Datei
+ neu geöffnet wurde.
+ Bedingung:
+ 1 <= feldnr <= anzahl felder
+
+PROC suchbedingung loeschen
+ Löscht die eingestellte Suchbedingung wieder. Anschließend
+ sind alle Sätze ausgewählt.
+ Bedingung:
+ anzahl dateien > 0
+
+PROC markierung aendern
+ Ändert die Markierung des aktuellen Satzes ins Gegenteil.
+ Bedingung:
+ anzahl dateien > 0
+
+BOOL PROC satz markiert
+ Gibt an, ob der aktuelle Satz markiert ist.
+ Bedingung:
+ anzahl dateien > 0
+
+INT PROC markierte saetze
+ Gibt an, wieviel Sätze insgesamt markiert sind.
+ Bedingung:
+ anzahl dateien > 0
+
+PROC markierungen loeschen
+ Löscht alle Markierungen.
+ Bedingung:
+ anzahl dateien > 0
+
diff --git a/doc/eudas/eudas.ref.8 b/doc/eudas/eudas.ref.8
new file mode 100644
index 0000000..fc2b3bc
--- /dev/null
+++ b/doc/eudas/eudas.ref.8
@@ -0,0 +1,454 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (83)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+8 Funktionen zur Bearbeitung
+
+
+
+Die Verarbeitungsfunktionen arbeiten jeweils auf der aktuell geöff­
+neten Datei. Falls mindestens ein Satz markiert ist, werden nur
+markierte Sätze bearbeitet, anderenfalls die durch die Suchbedin­
+gung ausgewählten Sätze.
+
+
+8.1 Drucken
+
+Zum Drucken wird ein Druckmuster als Textdatei benötigt. Dessen
+Name muß beim Aufruf der Prozedur 'drucke' angegeben werden.
+Werden beim Übersetzen des Druckmusters Fehler entdeckt, so wird
+der Paralleleditor aufgerufen und kein Druckvorgang durchgeführt.
+ Normalerweise sendet der Druckgenerator die Ausgabe direkt
+zum Drucker. Alternativ kann die Ausgabe auch in eine Datei ge­
+schrieben werden. Dieses Verfahren kann mit 'direkt drucken' umge­
+stellt werden. Der Aufruf
+
+
+ direkt drucken (TRUE)
+
+
+sendet alle Dateien direkt zum Drucker, mit
+
+
+ direkt drucken (FALSE)
+
+
+wird die Ausgabe in Dateien abgelegt. Diese Dateien erhalten Namen
+der Form
+
+
+ "Druckmustername.a$n"
+
+
+wobei 'n' eine laufende Nummer zur Unterscheidung ist.
+ Soll die Druckausgabe in eine ganz bestimmte Datei geleitet
+werden, so kann vor dem Aufruf von 'drucke' die Prozedur 'druck­
+datei' aufgerufen werden, die als Parameter den Namen der Ausga­
+bedatei erhält. Existiert die Datei noch nicht, wird sie eingerichtet,
+ansonsten wird die Ausgabe am Ende angehängt.
+ Die Einstellung der Ausgabedatei gilt nur für einen Druckvor­
+gang und überschreibt für diesen Druckvorgang 'direkt drucken'.
+Beim nächsten Druckvorgang wird wieder die durch 'direkt drucken'
+festgelegte Einstellung verwendet.
+ Wenn beim Drucken ein großes Ausgabevolumen anfällt, kann es
+sinnvoll sein, die Ausgabe in mehrere kleine Dateien aufzuteilen.
+Dies gilt auch, wenn direkt gedruckt werden soll, da auch in diesem
+Fall eine Zwischendatei erzeugt werden muß. Die maximale Anzahl
+von Zeilen pro Datei wird durch 'max druckzeilen' angegeben.
+ Der dort angegeben Wert gilt nur ungefähr - ein Wechsel der
+Ausgabedatei findet dann statt, wenn die Ausgabedatei nach Bear­
+beitung eines Satzes die Maximalanzahl überschritten hat. In die
+neue Datei wird anschließend zuerst der Initialisierungsteil des
+Druckmusters kopiert, ehe mit der Ausgabe des nächsten Satzes
+fortgefahren wird.
+
+Die Prozeduren im einzelnen:
+
+
+PROC drucke (TEXT CONST druckmuster)
+
+ Die aktuell geöffnete Datei wird nach dem angegebenen Druck­
+ muster gedruckt.
+
+ FEHLER:
+#f1#
+ #on("i")#Datei "druckmuster" existiert nicht#off("i")#
+ Das angegebene Druckmuster ist nicht vorhanden.
+#f1#
+ #on("i")#keine Datei geoeffnet#off("i")#
+ Zum Drucken muß eine Datei geöffnet sein.
+#f1#
+ #on("i")#direkt Drucken nicht möglich#off("i")#
+ Es ist kein Druckprogramm installiert oder der Spooler läßt sich
+ mit 'print' nicht ansprechen. Der Druck wird abgebrochen, die
+ Ausgabedatei ist noch vorhanden.
+
+
+PROC direkt drucken (BOOL CONST ja)
+
+ Gibt an, ob die Druckausgaben direkt gedruckt oder in einer
+ Datei gesammelt werden sollen.
+
+
+PROC druckdatei (TEXT CONST ausgabedatei)
+
+ Leitet die Druckausgabe des nächsten Druckvorgangs in die
+ Datei 'ausgabedatei'. Die Einstellung von 'direkt drucken' wird
+ für diesen Druckvorgang überschrieben. Die Ausgabe wird am
+ Ende der Datei angehängt, falls nötig, wird die Ausgabedatei
+ vorher eingerichtet.
+
+
+PROC maxdruckzeilen (INT CONST zeilen)
+
+ Stellt die maximale Anzahl von Zeilen für die Ausgabedatei ein.
+ Beim Überschreiten dieses Wertes wird eine neue Datei ange­
+ fangen. Standardwert ist 4000.
+
+
+TEXT PROC lfd nr
+
+ Liefert während des Druckens die laufende Nummer des gerade
+ gedruckten Satzes als Text.
+
+
+BOOL PROC gruppenwechsel (INT CONST gruppennr)
+
+ Kann innerhalb eines Vor- oder Nachspanns beim Drucken ab­
+ gefragt werden, um festzustellen, ob die angegebene Gruppe
+ gewechselt und damit den Vor- bzw. Nachspann mitverursacht
+ hat (es können zu einem Zeitpunkt mehrere Gruppen wechseln).
+ Die Gruppennummer 0 gibt die Standardgruppe an, die nur vor
+ dem ersten und nach dem letzten Satz wechselt.
+
+
+8.2 Kopieren
+
+Zum selektiven Kopieren von EUDAS-Dateien wird ein Kopiermuster
+benötigt. Dieses gibt die Zuordnung zwischen Feldern der Ziel- und
+der Quelldatei an. Die Quelldatei ist immer die aktuell geöffnete
+Datei.
+ Die Kopierfunktion wird durch 'kopiere' aufgerufen. Parameter
+sind der Name der Zieldatei und das Kopiermuster als FILE. Alter­
+nativ kann statt des Kopiermusters eine Prozedur übergeben wer­
+den, die die Kopieranweisungen erhält.
+ Der eigentliche Kopiervorgang wird durch den Operator 'K'
+bewirkt. Dieser erhält den Zielfeldnamen und einen TEXT-Aus­
+druck als Parameter. Der Wert des TEXT-Ausdrucks wird in das
+jeweilige Feld der Zieldatei geschrieben.
+ Existiert die Zieldatei noch nicht, so wird sie mit den Feldern
+eingerichtet, die in den einzelnen 'K'-Ausdrücken angegeben sind
+und zwar in der angeführten Reihenfolge. Existiert die Zieldatei, so
+werden gegebenenfalls noch nicht vorhandene Felder am Ende ange­
+fügt.
+ Die Prozedur 'std kopiermuster' liefert zu einer gegebenen
+Zieldatei ein Standard-Muster, das als Auswahlgrundlage dienen
+kann. Existiert die Zieldatei nicht, werden alle Felder der Quell­
+datei 1 : 1 kopiert, anderenfalls wird zu jedem Feld der Zieldatei
+ein passendes Feld der Quelldatei gesucht - die Feldreihenfolge
+richtet sich in diesem Fall nach der Zieldatei.
+
+
+PROC kopiere (TEXT CONST dateiname,
+ FILE VAR kopiermuster)
+
+ Die aktuell geöffnete Datei wird nach den Angaben in 'kopier­
+ muster' in die Datei 'dateiname' kopiert. Das Kopiermuster wird
+ dem ELAN-Compiler übergeben. Tritt bei der Übersetzung ein
+ Fehler auf, wird der Paralleleditor aufgerufen.
+
+ FEHLER:
+#f1#
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Zieldatei existiert, ist aber keine EUDAS-Datei.
+#f1#
+ #on("i")#keine Datei geoeffnet#off("i")#
+ Es muß eine virtuelle Datei vorhanden sein.
+
+
+PROC kopiere (TEXT CONST dateiname, PROC kopierfunktion)
+
+ Wie oben, nur ist die Kopierfunktion gleich als Prozedur vor­
+ handen.
+
+ FEHLER:
+#f1#
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Zieldatei existiert, ist aber keine EUDAS-Datei.
+#f1#
+ #on("i")#keine Datei geoeffnet#off("i")#
+ Es muß eine virtuelle Datei vorhanden sein.
+
+
+OP K (TEXT CONST feldname, ausdruck)
+
+ Kopiert den Ausdruck in das Feld 'feldname' der Zieldatei.
+ Dieses Feld wird eingerichtet, falls es noch nicht existiert.
+ Dieser Operator ist nur während eines Kopiervorganges de­
+ finiert (also in einem Kopiermuster oder einer Kopierfunktion).
+ Er darf nicht in einer IF-Klausel stehen, sondern muß bei
+ jedem Satz mit gleichem Feldnamen an der gleichen Stelle auf­
+ gerufen werden.
+
+
+PROC std kopiermuster (TEXT CONST dateiname,
+ FILE VAR kopiermuster)
+
+ Liefert ein Standard-Kopiermuster, abhängig von der Zieldatei
+ 'dateiname'. Existiert diese nicht, wird die Quelldatei unverän­
+ dert kopiert, ansonsten richtet sich das Kopiermuster nach der
+ Zieldatei.
+
+
+8.3 Tragen
+
+Durch Tragen können Sätze komplett in eine Zieldatei transportiert
+werden. In der Quelldatei sind sie anschließend nicht mehr vorhan­
+den. Eine ganze Auswahl von Sätzen kann mit 'trage' transportiert
+werden. 'trage satz' transportiert nur den aktuellen Satz. Mit
+'hole satz' kann der letzte Satz der Zieldatei wieder zurückgeholt
+werden, so daß eine EUDAS-Datei auch als Zwischenspeicher für
+Einzelsätze verwendet werden kann.
+ Existiert die Zieldatei bereits, muß sie mindestens so viele
+Felder wie die Quelldatei besitzen, damit keine Informationen ver­
+lorengehen können. Die Feldnamen müssen nicht übereinstimmen.
+Existiert die Zieldatei noch nicht, wird sie mit den Feldern der
+Quelldatei eingerichtet.
+ Die Tragefunktion kann um eine gleichzeitige Prüfung erweitert
+werden. Dabei werden Bedingungen überprüft, die bei der Zieldatei
+gespeichert sind. Sätze, die diese Bedingungen verletzen, werden
+nicht getragen. Eine entsprechende Meldung wird in eine Protokoll­
+datei geschrieben, die als Parameter übergeben werden muß.
+ Die Prüfbedingungen stehen als ausführbares Programm in den
+Notizen der Zieldatei. Prüfbedingungen können mit mehreren Proze­
+duren formuliert werden. 'pruefe' nimmt eine beliebige Bedingung als
+Parameter und gibt bei Mißerfolg eine Meldung aus. 'wertemenge'
+prüft auf Übereinstimmung mit einem der angegebenen Werte. 'feld­
+maske' legt eine Maske für ein Feld fest, die auf den Inhalt zutref­
+fen muß.
+ Mit Hilfe der Prozedur 'eindeutige felder' können Satzduplikate
+erkannt werden. Auch diese werden nicht getragen.
+ Die bei den Prüfbedingungen angegebenen Feldnamen müssen in
+der Quelldatei vorhanden sein. Falls eine Prüfprozedur außerhalb
+von 'trage' aufgerufen wird, führt eine Verletzung der Prüfbedin­
+gung zu einem 'errorstop'.
+
+
+PROC trage (TEXT CONST dateiname,
+ FILE VAR protokoll, BOOL CONST test)
+
+ Alle ausgewählten Sätze werden in die Datei 'dateiname' getra­
+ gen. Diese wird gegebenenfalls eingerichtet. Falls 'test' ange­
+ geben ist, werden die in den Notizen der Zieldatei enthaltenen
+ Bedingungen geprüft. Nur in diesem Fall muß 'protokoll' initial­
+ isiert sein.
+
+ FEHLER:
+#f1#
+ #on("i")#kein Satz zum Tragen vorhanden#off("i")#
+ Die Quelldatei ist leer oder es ist keine Datei geöffnet.
+#f1#
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Zieldatei existiert, ist aber keine EUDAS-Datei.
+#f1#
+ #on("i")#Zieldatei hat falsche Felderzahl#off("i")#
+ Zu wenig Felder in der Zieldatei.
+
+
+PROC trage satz (TEXT CONST dateiname)
+
+ Der aktuelle Satz wird in die Datei 'dateiname' getragen.
+
+ FEHLER:
+#f1#
+ #on("i")#kein Satz zum Tragen vorhanden#off("i")#
+ Keine Datei geöffnet oder Datei ist am Ende.
+#f1#
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Zieldatei existiert, ist aber keine EUDAS-Datei.
+#f1#
+ #on("i")#Zieldatei hat falsche Felderzahl#off("i")#
+ Zu wenig Felder in der Zieldatei.
+
+
+PROC pruefe (TEXT CONST feldname, BOOL CONST bedingung)
+
+ Wenn die angegebene Bedingung FALSE liefert, wird eine Mel­
+ dung in die Protokolldatei geschrieben und der jeweilige Satz
+ nicht getragen.
+
+
+PROC wertemenge (TEXT CONST feldname. menge)
+
+ Es wird geprüft, ob das angegebene Feld in der Wertemenge
+ enthalten ist. Die einzelnen Werte in der Wertemenge werden
+ dabei durch Komma getrennt. Leerzeichen sind signifikant.
+
+
+PROC feldmaske (TEXT CONST feldname, maske)
+
+ Es wird geprüft, ob das angegebene Feld zu der Maske paßt. Die
+ Zeichen in der Maske haben dabei folgende Bedeutung:
+ '9' trifft auf jede Ziffer zu
+ 'X' trifft auf jedes Zeichen zu
+ 'A' trifft auf jeden Großbuchstaben zu (einschließlich
+ Umlaute)
+ 'a' trifft auf jeden Kleinbuchstaben zu (einschließlich
+ Umlaute und 'ß')
+ '*' trifft auf eine Folge beliebiger Zeichen zu (auch die
+ leere Folge). Eine sparsame Verwendung wird empfoh­
+ len, da die Bearbeitung sehr aufwendig ist.
+ Alle anderen Zeichen treffen nur auf ein gleiches Zeichen zu.
+
+
+PROC eindeutige felder (INT CONST anzahl)
+
+ Gibt an, die wieviel ersten Felder einen Satz eindeutig identifi­
+ zieren sollen. Ein Satz, der mit einem Satz der Datei in diesen
+ Feldern übereinstimmt, wird nicht getragen. Ohne diese Angabe
+ wird keine derartige Prüfung vorgenommen.
+
+
+PROC hole satz (TEXT CONST dateiname)
+
+ Holt den letzten Satz der angegebenen Datei und fügt ihn vor
+ dem aktuellen Satz ein.
+
+ FEHLER:
+#f1#
+ #on("i")#"dateiname" existiert nicht#off("i")#
+#f1#
+ #on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Zieldatei existiert, ist aber keine EUDAS-Datei.
+#f1#
+ #on("i")#Zieldatei hat falsche Felderzahl#off("i")#
+ Zu viele Felder in der angegebenen Datei.
+#f1#
+ #on("i")#Kein Satz zum Tragen vorhanden#off("i")#
+ Die angegebene Datei ist leer.
+#f1#
+ #on("i")#keine Datei geoeffnet#off("i")#
+ Es muß eine virtuelle Datei vorhanden sein.
+
+
+8.4 Verarbeitung
+
+Die ausgewählten Sätze der aktuellen Datei können nach einer
+Verarbeitungsvorschrift verändert oder geprüft werden. Dies ge­
+schieht durch die Prozedur 'verarbeite'. Als Parameter kann ent­
+weder ein Verarbeitungsmuster als FILE oder die Verarbeitungs­
+funktion direkt als Prozedur übergeben werden.
+ Die Vorschrift wird durch den Operator 'V' realisiert.
+
+
+PROC verarbeite (FILE VAR verarbeitungsmuster)
+
+ Die aktuelle Datei wird nach dem angegebenen Muster bearbei­
+ tet. Enthält die Vorschrift, die dem ELAN-Compiler übergeben
+ wird, einen Fehler, wird der Paralleleditor aufgerufen.
+
+ FEHLER:
+#f1#
+ #on("i")#keine Datei geoeffnet#off("i")#
+ Es muß eine virtuelle Datei vorhanden sein.
+
+
+PROC verarbeite (PROC verarbeitungsfunktion)
+
+ Wie oben, nur wird die Vorschrift direkt als Prozedur überge­
+ ben.
+
+ FEHLER:
+#f1#
+ #on("i")#keine Datei geoeffnet#off("i")#
+ Es muß eine virtuelle Datei vorhanden sein.
+
+
+OP V (TEXT CONST feldname, ausdruck)
+
+ Das angegebene Feld des aktuellen Satzes wird durch den Aus­
+ druck ersetzt.
+
+ FEHLER:
+#f1#
+ #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")#
+ Das angegebene Feld ist nicht vorhanden.
+
+
+8.5 Funktionen in Ausdrücken
+
+Für Ausdrücke bei den in diesem Kapitel beschriebenen Prozeduren
+sind einfache Funktionen zur Abfrage von Feldinhalten vorhanden.
+Mit 'f' kann der Inhalt eines benannten Feldes erfragt werden, bei
+'wert' wird der Inhalt erst in eine REAL-Zahl umgewandelt, wobei
+nichtnumerische Zeichen ignoriert werden.
+ Die Prozedur 'textdarstellung' kann dazu verwendet werden,
+den Wert einer TEXT-Variablen als TEXT-Denoter in ELAN-Syntax
+darzustellen.
+ Die Prozedur 'zahltext' kann dazu verwendet werden, aus einer
+REAL-Zahl einen mit der richtigen Zahl von Nachkommastellen ver­
+sehenen, variabel langen Text zu machen.
+
+
+TEXT PROC f (TEXT CONST feldname)
+
+ Liefert den Inhalt des angegebenen Feldes.
+
+ FEHLER:
+#f1#
+ #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")#
+
+
+REAL PROC wert (TEXT CONST feldname)
+
+ Liefert den Inhalt des angegebenen Feldes als REAL. Dabei
+ werden nichtnumerische Zeichen ignoriert, ausgenommen das
+ Minuszeichen und das eingestellte Dezimalkomma (s. 'dezimal­
+ komma'). Tritt kein numerisches Zeichen auf, wird der Wert 0.0
+ geliefert.
+
+ FEHLER:
+#f1#
+ #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")#
+
+
+REAL PROC wert (TEXT CONST feldname, INT CONST kommastellen)
+
+ Wie 'wert' mit einem Parameter, nur daß das Ergebnis auf die
+ angegebene Anzahl von Nachkommastellen gerundet wird.
+
+ FEHLER:
+#f1#
+ #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")#
+
+
+TEXT PROC textdarstellung (TEXT CONST anzeigetext)
+
+ Liefert 'anzeigetext' als TEXT-Denoter, also in Anführungs­
+ strichen. Anführungsstriche im Text werden dabei verdoppelt.
+ Steuerzeichen von 0 bis 31 werden in lesbare Form gebracht.
+
+
+TEXT PROC zahltext (REAL CONST wert, INT CONST kommastellen)
+
+ Liefert den Text des angegebenen Werts mit dem eingestellten
+ Dezimalkomma und mit der angegebenen Zahl von Nachkomma­
+ stellen. Sind die Kommastellen 0, wird auch das Komma unter­
+ drückt. Der Text erhält soviel Stellen, wie zur Darstellung
+ benötigt werden.
+
+
+TEXT PROC zahltext (TEXT CONST feldname,
+ INT CONST kommastellen)
+
+ Wirkt wie 'zahltext (wert (feldname), kommastellen)'.
+
diff --git a/doc/eudas/eudas.ref.9 b/doc/eudas/eudas.ref.9
new file mode 100644
index 0000000..dc2dd0d
--- /dev/null
+++ b/doc/eudas/eudas.ref.9
@@ -0,0 +1,194 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (93)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+9 Anzeige
+
+
+
+9.1 Fensterverwalter
+
+Funktionen, die einen Teil des Bildschirms in einem rechteckigen
+Fenster beschreiben, werden über den Fensterverwalter untereinan­
+der koordiniert. Jede Funktion fordert für ihren Fensterbereich eine
+Variable vom Typ FENSTER an. Vor jedem Bildschirmzugriff kann die
+Funktion erfahren, ob andere Programme den Bildschirm im Fenster­
+bereich überschrieben haben. Gleichzeitig meldet sie damit Verän­
+derungen an anderen Fenstern an, die sich mit dem eigenen über­
+schneiden.
+
+
+PROC fenster initialisieren (FENSTER VAR neu)
+
+ Jede Fenstervariable muß vor Benutzung initialisiert werden.
+
+
+PROC fenstergroesse setzen (FENSTER VAR fenster,
+ INT CONST x anf, y anf,
+ x laenge, y laenge)
+
+ Die Fenstergröße des Fensters wird gesetzt. 'x anf' und 'y anf'
+ werden von 1..n gezählt. Die Größe eines 24x80-Bildschirms
+ entspricht den Angaben (1, 1, 79, 24). Da das letzte Zeichen
+ einer Zeile wegen Rollgefahr nicht benutzt werden kann, werden
+ nur 79 Spalten angegeben.
+
+ FEHLER:
+
+ #on("i")#zu viele Fenster#off("i")#
+ Es sind nur 16 verschiedene Fenstergrößen möglich.
+
+
+PROC fenstergroesse (FENSTER CONST fenster,
+ INT VAR x anf, y anf,
+ x laenge, y laenge)
+
+ Meldet die eingestellte Größe des Fensters.
+
+
+PROC fensterzugriff (FENSTER CONST mein fenster,
+ BOOL VAR veraendert)
+
+ Ein Zugriff auf 'mein fenster' wird angemeldet. 'veraendert' gibt
+ an, ob das Fenster seit dem letzten Zugriff durch einen über­
+ schneidenden Zugriff verändert wurde. Beim ersten Zugriff ist
+ 'veraendert' immer TRUE.
+
+
+PROC fenster veraendert (FENSTER CONST fenster)
+
+ Falls ein Unterprogramm eine FENSTER-Variable des Hauptpro­
+ grammes benutzt, kennzeichnet das Unterprogramm das Fenster
+ mit dieser Prozedur als benutzt, damit das Hauptprogramm das
+ Bild neu ausgibt.
+
+
+PROC bildschirm neu
+
+ Gibt an, daß der Bildschirm von einer Funktion benutzt wurde,
+ die ihre Zugriffe nicht über den Fensterverwalter anmeldet.
+ Alle Fenster werden als verändert gekennzeichnet.
+
+
+9.2 Anzeigegrundfunktionen
+
+Sämtliche Anzeigefunktionen werden in einem Fenster abgewickelt,
+dessen Größe durch 'anzeigefenster' bestimmt wird.
+ Die Funktion 'bildausgeben' übernimmt die eigentliche Ausgabe.
+Dabei kann durch Parameter mitgeteilt werden, ob sich an der Datei
+außer der Markierung etwas geändert hat. Hat sich nichts geändert,
+wird zur Optimierung unter Umständen nur die Markierung neu
+ausgegeben. Das Bild wird jedoch auf jeden Fall ganz ausgegeben,
+wenn das Fenster von anderer Seite verändert wurde. Auch das
+Öffnen einer neuen Datei wird automatisch erkannt und richtig
+behandelt.
+ Welche Felder dargestellt werden sollen, kann durch 'feldaus­
+wahl' angegeben werden. Dabei ist für jeden Anzeigemodus eine
+eigene Feldauswahl möglich. Die Darstellung kann durch 'rollen' in
+vertikaler Richtung verschoben werden.
+ Mit 'uebersicht' kann die Übersicht ausgegeben werden. Ihre
+Größe wird durch 'uebersichtsfenster' angegeben.
+
+
+PROC anzeigefenster (INT CONST x anf, y anf,
+ x laenge, y laenge)
+
+ Das Anzeigefenster wird in der entsprechenden Größe reser­
+ viert.
+
+ FEHLER:
+
+ #on("i")#Anzeigefenster zu klein#off("i")#
+ Das Fenster ist zu schmal (< 40 Zeichen), um eine sinnvolle
+ Anzeige zuzulassen.
+
+
+PROC bild ausgeben (BOOL CONST datei veraendert)
+
+ Im Anzeigefenster wird das Bild je nach eingestelltem Modus
+ ausgegeben, wenn das Fenster verändert wurde oder 'satz ver­
+ aendert' TRUE ist. 'satz veraendert' muß immer dann angegeben
+ werden, wenn am Inhalt der virtuellen Datei etwas verändert
+ wurde.
+
+
+PROC feldauswahl (TEXT CONST feldcode)
+
+ Die im aktuellen Modus anzuzeigenden Felder und ihre Reihen­
+ folge werden ausgewählt. Dabei enthält 'feldcodes' an der i-ten
+ Stelle den Code der Feldnummer des Feldes, das an i-ter Posi­
+ tion erscheinen soll.
+
+
+PROC rollen (INT CONST anzahl)
+
+ Die Darstellung wird um die angegebene Anzahl von Zeilen
+ gerollt. Bei einer positiven Angabe wird zu höheren Feld- bzw.
+ Satznummern gerollt (Bild bewegt sich umgekehrt). Beim ersten
+ bzw. letzten Feld bzw. Satz hört das Rollen automatisch auf.
+
+
+PROC uebersichtsfenster (INT CONST x anf, y anf,
+ x laenge, y laenge)
+
+ Legt die Größe des Übersichtsfensters fest.
+
+
+PROC uebersicht (TEXT CONST feldauswahl)
+
+ Ruft eine Übersicht der aktuellen Datei auf, in der geblättert
+ und markiert werden kann. In 'feldauswahl' steht an der Stelle
+ i der Code der Feldnummer, die als i-tes in der Aufzählung
+ erscheinen soll.
+
+
+9.3 Editorfunktionen
+
+Es stehen drei Funktionen zur Verfügung, die den Editor im Anzei­
+gemodus benutzen. Sie dienen zum Einfügen und Ändern sowie zum
+Eingeben eines Suchmusters.
+ Der Editor wird durch ESC 'q' verlassen. Weitere ESC-Funk­
+tionen, die zum Verlassen führen sollen, können durch 'exit zeichen'
+angegegeben und nach Funktionsausführung mit 'exit durch' abge­
+fragt werden.
+
+
+PROC aendern (PROC hilfe)
+
+ Bietet den aktuellen Satz zum Ändern an. Steht die virtuelle
+ Datei am Ende, wird automatisch 'einfuegen' durchgeführt. Bei
+ ESC '?' wird 'hilfe' aufgerufen.
+
+
+PROC einfuegen (PROC hilfe)
+
+ Fügt vor dem aktuellen Satz einen Satz ein, dessen Inhalt im
+ Editor angegeben wird. Bei ESC '?' wird 'hilfe' aufgerufen.
+
+
+PROC suchen (PROC hilfe)
+
+ Im Editor wird eine neue Suchbedingung eingegeben. Bei ESC '?'
+ wird 'hilfe' aufgerufen.
+
+
+PROC exit durch (TEXT CONST zeichenkette)
+
+ Gibt die Zeichen an, die beim Drücken nach ESC zum Verlassen
+ des Editors führen sollen. Die eingegebenen Daten werden je­
+ doch vorher auf jeden Fall noch verarbeitet.
+
+
+TEXT PROC exit durch
+
+ Gibt an, durch welches Zeichen der Editor verlassen wurde.
+
diff --git a/doc/eudas/eudas.ref.fehler b/doc/eudas/eudas.ref.fehler
new file mode 100644
index 0000000..736d009
--- /dev/null
+++ b/doc/eudas/eudas.ref.fehler
@@ -0,0 +1,139 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (115)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+Fehlermeldungen
+
+
+
+In diesem Kapitel sind alle Fehlermeldungen aufgeführt, die von
+EUDAS erzeugt werden und zum Abbruch einer Funktion führen
+können.
+
+#on("i")#'n' ist keine Feldnummer#off("i")#
+ Es wurde eine Nummer als Feldnummer angegeben, die nicht er­
+ laubt ist.
+
+#on("i")#Datei ist keine EUDAS-Datei#off("i")#
+ Es wurde versucht, eine andere Datei als EUDAS-Datei zu bear­
+ beiten.
+
+#on("i")#inkonsistente EUDAS-Datei#off("i")#
+ Die interne Struktur der Datei ist zerstört. Kann durch Hardware­
+ probleme (Archiv-Lesefehler) oder EUDAS-interne Fehler ent­
+ standen sein.
+
+#on("i")#EUDAS-Datei voll#off("i")#
+ Eine EUDAS-Datei kann nur eine bestimmte Anzahl von Sätzen
+ aufnehmen (mindestens 5000).
+
+#on("i")#Nicht erlaubtes Dezimalkomma#off("i")#
+ Als Dezimalkomma kann nur ein einzelnes Zeichen angegeben
+ werden.
+
+#on("i")#Zuviel Dateien geoeffnet#off("i")#
+ Es können nicht mehr als 10 Dateien gleichzeitig geöffnet, geket­
+ tet und gekoppelt sein.
+
+#on("i")#Zu viele Felder#off("i")#
+ Alle geöffneten Dateien zusammen dürfen nicht mehr als 256
+ Felder der virtuellen Datei ergeben.
+
+#on("i")#Zu viele Koppelfelder#off("i")#
+ Es dürfen insgesamt nicht mehr als 32 Koppelfelder entstehen.
+
+#on("i")#keine Koppelfelder vorhanden#off("i")#
+ Eine Datei kann nicht gekoppelt werden, wenn Sie kein Koppelfeld
+ besitzt.
+
+#on("i")#keine Datei geoeffnet#off("i")#
+ Es kann nicht gekettet oder gekoppelt werden, wenn noch keine
+ Datei geöffnet wurde. Ebenfalls sind keine Verarbeitungsproze­
+ duren möglich.
+
+#on("i")#Nicht möglich, wenn auf Koppeldatei geschaltet#off("i")#
+ Wenn auf eine Koppeldatei umgeschaltet wurde, ist Öffnen, Ketten
+ und Koppeln nicht möglich.
+
+#on("i")#kein direkter Dateizugriff bei geketteten oder gekoppelten Dateien#off("i")#
+ Wenn Dateien gekettet oder gekoppelt sind, ist Sortieren und
+ Ändern der Feldstruktur nicht möglich.
+
+#on("i")#Datei nicht gesichert#off("i")#
+ Eine vorher geöffnete Datei ist verändert und nicht gesichert.
+
+#on("i")#Datei wird von anderer Task geändert#off("i")#
+ Das Öffnen der Datei zum Ändern ist im Moment nicht möglich, da
+ ein anderer Benutzer sie bereits ändert.
+
+#on("i")#Suchmuster zu umfangreich#off("i")#
+ Ein Suchmuster darf nicht mehr als 100 Vergleiche erfordern.
+
+#on("i")#direkt Drucken nicht moeglich#off("i")#
+ Entweder ist kein Druckprogramm installiert oder die Spooltask
+ reagiert nicht.
+
+#on("i")#Das Feld "Feldname" ist nicht definiert#off("i")#
+ Sie haben einen falschen Namen angegeben.
+
+#on("i")#Kein Satz zum Tragen vorhanden#off("i")#
+ Es wurde versucht, aus einer leeren Datei oder am Dateiende zu
+ tragen.
+
+#on("i")#Zieldatei hat falsche Felderzahl#off("i")#
+ Eine Zieldatei beim Tragen hat weniger Felder als die aktuelle
+ Datei. Daher würden beim Tragen Informationen verlorengehen.
+
+#on("i")#Zieldatei darf nicht geöffnet sein#off("i")#
+ Eine geöffnete Datei ist als Zieldatei nicht zulässig.
+
+#on("i")#Das Feld "Feldname" verletzt die Pruefbedingung#off("i")#
+ Eine Prüfprozedur wurde außerhalb des Tragens aufgerufen und
+ die Bedingung war nicht erfüllt.
+
+#on("i")#Das Feld "Feldname" ist nicht in der Wertemenge#off("i")#
+ Eine Prüfprozedur wurde außerhalb des Tragens aufgerufen und
+ die Bedingung war nicht erfüllt.
+
+#on("i")#Das Feld "Feldname" stimmt nicht mit der Maske ueberein#off("i")#
+ Eine Prüfprozedur wurde außerhalb des Tragens aufgerufen und
+ die Bedingung war nicht erfüllt.
+
+#on("i")#Zu viele Fenster#off("i")#
+ Es sind nicht mehr als 16 verschiedene Größen von Fenstern
+ möglich.
+
+#on("i")#Fenster zu klein#off("i")#
+ Ein Menü wurde in einem zu kleinen Fenster aufgerufen.
+
+#on("i")#Hilfe existiert nicht#off("i")#
+ Es wurde versucht, eine nicht vorhandene Hilfestellung aufzu­
+ rufen.
+
+#on("i")#Hilfe ist leer#off("i")#
+ Die angewählte Hilfestellung enthält keinen Text.
+
+#on("i")#Anzeigefenster zu klein#off("i")#
+ Das Anzeigefenster muß mindestens 40 Zeichen breit sein.
+
+#on("i")#Ungueltige Satznummer#off("i")#
+ Der angegebene Text stellt keine Satznummer dar.
+
+#on("i")#kein rekursiver Aufruf#off("i")#
+ Innerhalb von EUDAS darf 'eudas' nicht erneut aufgerufen wer­
+ den.
+
+#on("i")#Task existiert nicht#off("i")#
+ Es wurde versucht, eine nicht existente Task als Manager einzu­
+ stellen.
+
+
diff --git a/doc/eudas/eudas.ref.inhalt b/doc/eudas/eudas.ref.inhalt
new file mode 100644
index 0000000..ae997cb
--- /dev/null
+++ b/doc/eudas/eudas.ref.inhalt
@@ -0,0 +1,120 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (3)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+Inhalt
+
+
+
+ Vorwort . . . . . . . . . . . . . . . . . . . i
+ Inhalt . . . . . . . . . . . . . . . . . . . . iii
+
+
+I. Funktionen zum Nachschlagen
+
+#on("b")#1 Zustände und Bedienung#off("b")#
+#free (0.2)#
+1.1 Zustände . . . . . . . . . . . . . . . . . . . 3
+1.2 Menüs . . . . . . . . . . . . . . . . . . . . 8
+1.3 Auswahl . . . . . . . . . . . . . . . . . . . 8
+1.4 Hilfe und Dialog . . . . . . . . . . . . . . . 9
+1.5 Editor . . . . . . . . . . . . . . . . . . . . 9
+
+#on("b")#2 Zusammenstellung der Funktionen#off("b")#
+#free (0.2)#
+2.1 Menü 'Öffnen' . . . . . . . . . . . . . . . . 13
+2.2 Menü 'Einzelsatz' . . . . . . . . . . . . . . 17
+2.3 Menü 'Gesamtdatei' . . . . . . . . . . . . . . 21
+2.4 Menü 'Drucken' . . . . . . . . . . . . . . . . 23
+2.5 Menü 'Dateien' . . . . . . . . . . . . . . . . 25
+2.6 Menü 'Archiv' . . . . . . . . . . . . . . . . 27
+2.7 Kurzabfrage . . . . . . . . . . . . . . . . . 29
+
+#on("b")#3 Das virtuelle Dateimodell#off("b")#
+#free (0.2)#
+3.1 Dateistruktur . . . . . . . . . . . . . . . . 31
+3.2 Öffnen . . . . . . . . . . . . . . . . . . . . 32
+3.3 Koppeln . . . . . . . . . . . . . . . . . . . 33
+3.4 Änderungen . . . . . . . . . . . . . . . . . . 34
+3.5 Sichern . . . . . . . . . . . . . . . . . . . 36
+3.6 Umschalten auf Koppeldatei . . . . . . . . . . 36
+3.7 Mehrbenutzerbetrieb . . . . . . . . . . . . . 37
+
+#on("b")#4 Ansehen und Bearbeiten#off("b")#
+#free (0.2)#
+4.1 Anzeige . . . . . . . . . . . . . . . . . . . 39
+4.2 Satzauswahl . . . . . . . . . . . . . . . . . 42
+4.3 Sortieren und Reorganisieren . . . . . . . . . 44
+4.4 Bearbeiten . . . . . . . . . . . . . . . . . . 46
+
+#on("b")#5 Drucken und Druckmuster#off("b")#
+#free (0.2)#
+5.1 Druckmustersyntax . . . . . . . . . . . . . . 49
+5.2 Der Druckvorgang . . . . . . . . . . . . . . . 51
+5.3 Interpretation von Musterzeilen . . . . . . . 52
+5.4 Anschluß zum ELAN-Compiler . . . . . . . . . . 56
+5.5 Fehlermeldungen . . . . . . . . . . . . . . . 57
+
+
+II. EUDAS für Programmierer
+
+#on("b")#6 Struktur von EUDAS-Dateien#off("b")#
+#free (0.2)#
+6.1 Der Datentyp SATZ . . . . . . . . . . . . . . 61
+6.2 Der Datentyp EUDAT . . . . . . . . . . . . . . 63
+6.3 Satzposition . . . . . . . . . . . . . . . . . 64
+6.4 Satzzugriffe . . . . . . . . . . . . . . . . . 65
+6.5 Sortieren und Reorganisieren . . . . . . . . . 66
+6.6 EUDAS-Dateien als Assoziativspeicher . . . . . 68
+
+#on("b")#7 Verwaltung der offenen Dateien#off("b")#
+#free (0.2)#
+7.1 Dateiverwaltung . . . . . . . . . . . . . . . 71
+7.2 Feldstruktur . . . . . . . . . . . . . . . . . 75
+7.3 Positionierung . . . . . . . . . . . . . . . . 77
+7.4 Änderungen . . . . . . . . . . . . . . . . . . 78
+7.5 Suchbedingungen . . . . . . . . . . . . . . . 79
+
+#on("b")#8 Funktionen zur Bearbeitung#off("b")#
+#free (0.2)#
+8.1 Drucken . . . . . . . . . . . . . . . . . . . 83
+8.2 Kopieren . . . . . . . . . . . . . . . . . . . 85
+8.3 Tragen . . . . . . . . . . . . . . . . . . . . 87
+8.4 Verarbeitung . . . . . . . . . . . . . . . . . 89
+8.5 Funktionen in Ausdrücken . . . . . . . . . . . 90
+
+#on("b")#9 Anzeige#off("b")#
+#free (0.2)#
+9.1 Fensterverwalter . . . . . . . . . . . . . . . 93
+9.2 Anzeigegrundfunktionen . . . . . . . . . . . . 94
+9.3 Editorfunktionen . . . . . . . . . . . . . . . 95
+
+#on("b")#10 Programmierung der Menüs#off("b")#
+#free (0.2)#
+10.1 Menüformat . . . . . . . . . . . . . . . . . . 97
+10.2 Verwaltung der Menüs . . . . . . . . . . . . . 99
+10.3 Aufruf . . . . . . . . . . . . . . . . . . . . 101
+10.4 Dialog . . . . . . . . . . . . . . . . . . . . 103
+
+#on("b")#11 Programmierung von Anwendungen#off("b")#
+#free (0.2)#
+11.1 Musterprogramme . . . . . . . . . . . . . . . 105
+11.2 Dateianwendungen . . . . . . . . . . . . . . . 109
+11.3 Integrierte Anwendungen . . . . . . . . . . . 111
+
+
+III. Anhang
+
+ Fehlermeldungen . . . . . . . . . . . . . . . 115
+ Prozeduren mit Parametern . . . . . . . . . . 119
+ Register . . . . . . . . . . . . . . . . . . . 125
+
diff --git a/doc/eudas/eudas.ref.macros b/doc/eudas/eudas.ref.macros
new file mode 100644
index 0000000..1d24468
--- /dev/null
+++ b/doc/eudas/eudas.ref.macros
@@ -0,0 +1,73 @@
+#*format#
+#limit (13.5)##start (3.5,2.5)##pagelength (21.0)##block#
+#:firsthead (false)#
+#linefeed (1.07)#
+#*macro end#
+#*text#
+#type ("prop10")#
+#linefeed (1.07)#
+#*macro end#
+#*beispiel#
+#type ("12")#
+#linefeed (0.97)#
+#*macro end#
+#*bildschirm#
+#type ("15")#
+#linefeed(0.83)#
+#*macro end#
+#*proc#
+#type ("12")#
+#*macro end#
+#*endproc#
+#free (0.1)#
+#type ("prop10")#
+#linefeed (1.07)#
+#*macro end#
+#*abschnitt ($1,$2,$3)#
+#headodd#
+#on("b")#$1#right#$3 %#off("b")#
+#free (1.0)#
+#end#
+#on("b")##ib(9)#$1#ie(9,"   $3")# $2#off("b")#
+#*macro end#
+#*char($1)#
+$1
+#*macro end#
+#*kapitel ($1,$2,$3,$4)#
+#free (1.3)#
+#"nlq"#
+#type("roman.24")#
+#on("b")##center#$1#off("b")#
+#free (0.2)#
+#type ("roman.18")#
+#on("b")##center#$2 #off("b")#
+#on("b")##center# $3#off("b")#
+#on("b")##center#$4#off("b")#
+#type ("prop10")#
+#free (0.6)#
+#headeven#
+#on("b")#% $2 $3 $4#off("b")#
+#free (1.0)#
+#end#
+#headodd#
+#right##on("b")#%#off("b")#
+#free (1.0)#
+#end#
+#*macro end#
+#*f2#
+#free (0.2)#
+#*macro end#
+#*a ($1)#
+#on("b")#$1.#off("b")# 
+#*macro end#
+#*bsp ($1)#
+#type("12")#$1#type("prop")#
+#*macro end#
+#*f1#
+#free (0.1)#
+#*macro end#
+
+
+
+
+
diff --git a/doc/eudas/eudas.ref.proz b/doc/eudas/eudas.ref.proz
new file mode 100644
index 0000000..2007bc1
--- /dev/null
+++ b/doc/eudas/eudas.ref.proz
@@ -0,0 +1,205 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (119)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+Prozeduren mit Parametern
+
+
+
+
+:= (SATZ VAR, SATZ CONST) 6.1
+
+aendern (PROC hilfe) 9.3
+aendern erlaubt : BOOL 7.1
+aenderungen eintragen 7.4
+anzahl dateien : INT 7.1
+anzahl felder : INT 7.2
+anzahl koppeldateien : INT 7.1
+anzeigefenster (INT CONST x anf, y anf,
+ x laenge, y laenge) 9.2
+auf satz (EUDAT VAR, INT CONST satznr) 6.3
+auf satz (EUDAT VAR, TEXT CONST muster) 6.3
+auf satz (INT CONST satznr) 7.3
+ausfuehrtaste (TEXT CONST taste) 10.3
+auswahl anbieten (TEXT CONST name, FENSTER CONST f,
+ TEXT CONST hilfe,
+ PROC (TEXT VAR, INT CONST) inhalt) 10.3
+
+bild ausgeben (BOOL CONST datei veraendert) 9.2
+bildschirm neu 9.1
+
+dateiende (EUDAT CONST) : BOOL 6.3
+dateiende : BOOL 7.3
+dateien loeschen (BOOL CONST auch geaenderte) 7.1
+dateiversion : INT 7.1
+dezimalkomma (TEXT CONST komma) 6.5
+dezimalkomma : TEXT 6.5
+dialog 10.4
+dialogfenster (INT CONST x anf, y anf,
+ x laenge, y laenge) 10.4
+direkt drucken (BOOL CONST ja) 8.1
+druckdatei (TEXT CONST dateiname) 8.1
+drucke (TEXT CONST mustername) 8.1
+
+editget (TEXT CONST prompt, TEXT VAR eingabe,
+ TEXT CONST res, hilfe) 10.4
+eindeutige felder (INT CONST anzahl) 8.3
+einfuegen (PROC hilfe) 9.3
+eudas dateiname (INT CONST dateinr) : TEXT 7.1
+EUDAT 6.2
+exit durch (TEXT CONST exit zeichen) 9.3
+exit durch : TEXT 9.3
+
+f (TEXT CONST feldname) : TEXT 8.5
+fehler ausgeben 10.4
+feld aendern (SATZ VAR, INT CONST feldnr,
+ TEXT CONST inhalt) 6.1
+feld aendern (EUDAT VAR, INT CONST feldnr,
+ TEXT CONST inhalt) 6.4
+feld aendern (INT CONST feldnr, TEXT CONST inhalt) 7.2
+feldauswahl (TEXT CONST feldcodes) 9.2
+feld bearbeiten (SATZ CONST, INT CONST feldnr,
+ PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 6.1
+feld bearbeiten (EUDAT CONST, INT CONST feldnr,
+ PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 6.4
+feld bearbeiten (INT CONST feldnr,
+ PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 7.2
+felderzahl (SATZ CONST) : INT 6.1
+felderzahl (EUDAT CONST) : INT 6.2
+feldindex (SATZ CONST, TEXT CONST muster) : INT 6.1
+feldinfo (EUDAT VAR, INT CONST feldnr, info) 6.5
+feldinfo (EUDAT CONST, INT CONST feldnr) : INT 6.5
+feld lesen (SATZ CONST, INT CONST feldnr,
+ TEXT VAR inhalt) 6.1
+feld lesen (EUDAT CONST, INT CONST feldnr,
+ TEXT VAR inhalt) 6.4
+feld lesen (INT CONST feldnr, TEXT VAR inhalt) 7.2
+feldmaske (TEXT CONST feldname, maske) 8.3
+feldnamen aendern (EUDAT VAR, SATZ CONST namen) 6.2
+feldnamen bearbeiten (INT CONST feldnr,
+ PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 7.2
+feldnamen lesen (EUDAT CONST, SATZ VAR namen) 6.2
+feldnamen lesen (INT CONST feldnr, TEXT VAR name) 7.2
+feldnummer (TEXT CONST feldname) : INT 7.2
+FENSTER 9.1
+fenstergroesse (FENSTER CONST f,
+ INT VAR x anf, y anf,
+ x laenge, y laenge) 9.1
+fenstergroesse setzen (FENSTER VAR fenster,
+ INT CONST x anf, y anf,
+ x laenge, y laenge) 9.1
+fenster initialisieren (FENSTER VAR fenster) 9.1
+fenster veraendert (FENSTER CONST fenster) 9.1
+fensterzugriff (FENSTER CONST fenster,
+ BOOL VAR veraendert) 9.1
+
+global manager 10.2
+gruppenwechsel (INT CONST gruppennr) : BOOL 8.1
+
+hilfe anbieten (TEXT CONST name, FENSTER CONST f) 10.3
+hole satz (TEXT CONST dateiname) 8.3
+
+inhalt veraendert (INT CONST dateinr) : BOOL 7.1
+ja (TEXT CONST frage, hilfe) : BOOL 10.4
+
+K (TEXT CONST feldname, ausdruck) 8.2
+kette (TEXT CONST dateiname) 7.1
+kopiere (TEXT CONST dateiname, FILE VAR muster) 8.2
+kopiere (TEXT CONST dateiname, PROC kopierfunktion) 8.2
+kopple (TEXT CONST dateiname) 7.1
+
+lfd nr : TEXT 8.1
+
+markierte saetze : INT 7.5
+markierung aendern 7.5
+markierungen loeschen 7.5
+maxdruckzeilen (INT CONST anzahl zeilen) 8.1
+menue anbieten (ROW 6 TEXT CONST menuenamen,
+ FENSTER VAR f,
+ BOOL CONST esc erlaubt,
+ PROC (INT CONST, INT CONST) interpreter) 10.3
+menuedaten einlesen (TEXT CONST dateiname) 10.2
+menue loeschen (TEXT CONST name, INT CONST index) 10.2
+menue loeschen (BOOL CONST hilfen reduzieren) 10.2
+menue manager (DATASPACE VAR ds,
+ INT CONST order, phase,
+ TASK CONST order task) 10.2
+menuenamen (INT CONST index) : THESAURUS 10.2
+
+neuer dialog 10.4
+notizen aendern (EUDAT VAR, INT CONST notiz nr,
+ TEXT CONST notizen) 6.2
+notizen lesen (EUDAT CONST, INT CONST notiz nr,
+ TEXT VAR notizen) 6.2
+
+oeffne (EUDAT VAR, TEXT CONST dateiname) 6.2
+oeffne (TEXT CONST dateiname,
+ BOOL CONST aendern erlaubt) 7.1
+
+pruefe (TEXT CONST feldname, BOOL CONST bedingung) 8.3
+
+reorganisiere (TEXT CONST dateiname) 6.5
+rollen (INT CONST anzahl) 9.2
+
+saetze (EUDAT CONST) : INT 6.3
+SATZ 6.1
+satz aendern (EUDAT VAR, SATZ CONST neuer satz) 6.4
+satz ausgewaehlt : BOOL 7.5
+satz einfuegen (EUDAT VAR, SATZ CONST satz) 6.4
+satz einfuegen 7.4
+satz initialisieren (SATZ VAR satz) 6.1
+satzkombination : INT 7.3
+satz lesen (EUDAT CONST, SATZ VAR satz) 6.4
+satz loeschen (EUDAT VAR) 6.4
+satz loeschen 7.4
+satz markiert : BOOL 7.5
+satznr (EUDAT CONST) : INT 6.3
+satznummer : INT 7.3
+sichere (INT CONST dateinr, TEXT CONST dateiname) 7.1
+sortiere (EUDAT VAR, TEXT CONST reihenfolge) 6.5
+sortiere (EUDAT VAR) 6.5
+sortierreihenfolge (EUDAT CONST) : TEXT 6.5
+status anzeigen (TEXT CONST zeile) 10.3
+std kopiermuster (TEXT CONST dateiname, FILE VAR f) 8.2
+suchbedingung (INT CONST feldnr,
+ TEXT CONST bedingung) 7.5
+suchbedingung loeschen 7.5
+suchen (PROC hilfe) 9.3
+
+textdarstellung (TEXT CONST text) : TEXT 8.5
+trage (TEXT CONST dateiname, FILE VAR protokoll,
+ BOOL CONST test) 8.3
+trage satz (TEXT CONST dateiname) 8.3
+
+unsortierte saetze (EUDAT CONST) : INT 6.5
+
+V (TEXT CONST feldname, ausdruck) 8.4
+verarbeite (FILE VAR verarbeitungsmuster) 8.4
+verarbeite (PROC verarbeitungsfunktion) 8.4
+
+waehlbar (INT CONST menuenr, funktionsnr,
+ BOOL CONST moeglich) 10.3
+wahl (INT CONST stelle) : INT 10.3
+weiter (EUDAT VAR) 6.3
+weiter (EUDAT VAR, TEXT CONST muster) 6.3
+weiter (INT CONST modus) 7.3
+wert (TEXT CONST feldname) : REAL 8.5
+wert (TEXT CONST feldname, INT CONST kommastellen) : REAL 8.5
+wertemenge (TEXT CONST feldname, menge) 8.3
+
+zahltext (REAL CONST wert, INT CONST kommastellen) : TEXT 8.5
+zahltext (TEXT CONST feldname,
+ INT CONST kommastellen) : TEXT 8.5
+zurueck (EUDAT VAR) 6.3
+zurueck (EUDAT VAR, TEXT CONST muster) 6.3
+zurueck (INT CONST modus) 7.3
+
diff --git a/doc/eudas/eudas.ref.reg b/doc/eudas/eudas.ref.reg
new file mode 100644
index 0000000..a34307a
--- /dev/null
+++ b/doc/eudas/eudas.ref.reg
@@ -0,0 +1,436 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (125)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+Register
+
+
+
+#columns (2, 0.5)#
+#limit (6.5)#
+ABKUERZUNGEN-Anweisung 49
+Abkürzungsteil 49
+Abkürzungsverzeichnis 68
+Abkürzungszeile 50
+Abschlußzeile 39
+aendern 96
+Ändern 10, 19
+ -, nach Vorschrift 48
+aendern erlaubt 74
+Änderungen 34
+aenderungen eintragen 79
+Änderungsmuster 21
+Alternative 43
+Ankreuzen 8
+anzahl dateien 74
+anzahl felder 75
+anzahl koppeldateien 74
+Anzeige 39, 93
+anzeigefenster 95
+Arbeitskopie 13, 32
+ -, löschen 15, 36
+ -, sichern 15, 36
+Archivmanager 28
+ -, reservieren 29
+Archiv (Menü) 27
+Archivübersicht drucken 27
+Assoziativspeicher 68
+auf koppeldatei 74
+Aufräumen 26
+auf satz 65, 78
+Auf Satz Nr. 17
+Ausdrucken 24
+Ausführen 8
+ausfuehrtaste 8, 102
+AUSWAHL 97
+AUSWAHL: 4
+Auswahl 8
+ -, Format 98
+auswahl anbieten 103
+
+Bearbeiten 46
+BILD 97
+bild ausgeben 95
+bildschirm neu 94
+
+Datei, aufräumen 26
+ -, kopieren (logisch) 25
+ -, kopieren vom Archiv 27
+ -, löschen 25
+ -, löschen auf Archiv 28
+ -, Platzbedarf 26
+ -, reorganisieren 26
+ -, schreiben auf Archiv 27
+ -, umbenennen 25
+ -, virtuelle 32, 71
+Dateianwendungen 109
+Dateien Archiv, Übersicht 27
+dateiende 64, 78
+dateien loeschen 74
+Dateien (Menü) 25
+Dateien System, Übersicht 25
+Dateilimit 52
+Dateimanager 28
+Dateiname 40
+dateiversion 75
+DATUM 45
+Dezimalkomma 45
+dezimalkomma 67
+dialog 104
+Dialog 9, 103
+dialogfenster 104
+DIN 45
+direkt drucken 83f.
+Druckausgabe, Richtung 23
+druckdatei 85
+drucke 84
+Drucken 23, 49, 83
+ -, Archivübersicht 27
+Drucken (Menü) 23
+Druckmuster 23, 49, 83
+ -, Fehler 56
+Druckvorgang 51
+
+editget 104
+EDITIEREN: 6
+Editieren 23
+ -, Zeile 9
+Editor 9, 29
+eindeutige felder 47, 89
+einfuegen 96
+Einfügen 10, 19
+ -, Satz 36
+ -, Zeile 10
+EINGABE: 4
+Eingabe 9
+Einzelsatz (Menü) 17
+ELAN-Compiler 56
+ELAN-Kommandos 8
+ENDE 97
+Endekennzeichnung 40
+ESC '?' 6
+ESC '9' 4
+ESC '1' 4
+ESC '?' 4
+ESC '?' 3
+ESC 'D' 5
+ESC ESC 3
+ESC 'F' 5f.
+ESC 'g' 5
+ESC 'h' 4ff.
+ESC 'K' 36
+ESC OBEN 5
+ESC 'p' 5
+ESC 'q' 4, 6
+ESC RUBIN 5
+ESC RUBOUT 5
+ESC UNTEN 5
+ESC 'w' 4f.
+ESC 'z' 4f.
+eudas 29
+EUDAS: 3
+EUDAS-Datei, aufspalten 110
+ -, drucken 23, 49, 83
+ -, einrichten 13
+ -, ketten 14, 32
+ -, kopieren 21, 46, 85
+ -, koppeln 14, 32
+ -, nach Vorschrift ändern 48
+ -, öffnen 13, 32
+ -, reorganisieren 67
+ -, sortieren 22
+ -, Struktur 31, 61
+ -, tragen 46, 87
+ -, Übersicht 22
+ -, verändern 21
+eudas dateiname 75
+EUDAT 61, 63, 109
+EUMEL-Netz 28
+exit durch 96
+
+f 91
+FEHLER 5
+fehler ausgeben 104
+Feld 31
+FELD 98
+feld aendern 62, 65, 76
+Feldauswahl 20, 41, 95
+feld bearbeiten 62, 65, 76
+felderzahl 62, 63
+feldindex 62
+feldinfo 66, 77
+Feldinhalt 31, 39
+feld lesen 65, 76
+feldmaske 47, 89
+Feldmuster 53
+Feldname 31, 39
+ -, ändern 16
+ -, anfügen 16
+feldnamen aendern 63
+feldnamen bearbeiten 76
+feldnamen lesen 64, 76
+feldnummer 76
+Feldstruktur 15
+Feldtyp 31, 42
+Feldtypen 45, 66
+ -, ändern 16
+Feldvergleich 43
+Fenster 93
+fenstergroesse 94
+fenstergroesse setzen 93
+fenster initialisieren 93
+fenster veraendert 94
+fensterzugriff 94
+folgedatei 75
+Folgezeilen 41
+Formular 39
+FRAGE: 5
+Fragen 9
+Funktion, ausführen 8
+ -, gesperrte 8
+
+Gesamtdatei (Menü) 21
+Gib Kommando: 6
+global manager 36, 100
+Gruppe 51
+GRUPPE-Anweisung 49
+gruppenwechsel 51, 85
+
+Hauptdatei 32
+HILFE: 4
+HILFE 97, 99
+Hilfe 9
+ -, Format 98
+hilfe anbieten 103
+Holen 19
+hole satz 89
+HOP LINKS 4
+HOP 'o' 4
+HOP OBEN 3ff.
+HOP RECHTS 4
+HOP RETURN 4
+HOP RUBOUT 4
+HOP UNTEN 3ff.
+HOP 'x' 4
+
+inhalt veraendert 74
+Initialisieren 28
+Initialisierungsteil 49
+
+ja 104
+
+K 46, 86
+kette 73
+Ketten 14, 32
+Klassenwechsel 106
+Kombinationen 34
+Kommandos 8
+Kommandozeile 50
+kopiere 86
+Kopieren 21, 46, 85
+Kopieren (logisch) 25
+Kopieren vom Archiv 27
+Kopiermuster 21, 46
+KOPPEL 40
+Koppeldatei, umschalten auf 36
+Koppelfelder 33
+Koppeln 14, 32f.
+kopple 72
+Kurzabfrage 29
+
+LEER 3f.
+Leertaste 8
+lfd nr 85
+lineform 24
+LINKS 3f.
+Literaturangaben 108
+Löschen 25
+ -, Satz 36
+ -, Zeile 10
+Löschen auf Archiv 28
+
+Manager 13
+Manager (Mehrbenutzer) 16, 36
+markierte saetze 81
+Markierung 18, 40, 42
+markierung aendern 81
+Markierungen löschen 22
+markierungen loeschen 81
+maxdruckzeilen 85
+MEHR-Anweisung 50
+MENUE 97
+Menü 8
+ -, Aufruf 101
+ -, Verwaltung 99
+menue anbieten 101
+menuedaten einlesen 99
+Menüformat 97
+menue loeschen 100
+menue manager 100
+menuenamen 100
+Modi 55
+MODUS-Anweisung 50
+Musterprogramme 105
+Musterteil 50
+Musterzeichen 53
+Musterzeile 50
+ -, Interpretation 52
+
+Nachbearbeiten 24
+Nachspann 49
+NACHSPANN-Anweisung 49
+Namenskonflikte 33
+neuer dialog 104
+Normalmodus 55
+Notizen 15, 31, 64
+notizen aendern 64, 77
+notizen lesen 64, 77
+
+'o' 4
+OBEN 3f.
+ODER-Verknüpfung 43
+oeffne 63, 72
+Öffnen 32
+Öffnen (Menü) 13
+
+pageform 24
+Paralleleditor 56, 83
+Paßwort 29
+Platzbedarf 26
+Positionieren 17, 31, 64, 77
+Priorität 44
+Programmzeile 51
+Protokolldatei 47
+Prüfbedingungen 16, 31, 47, 64,
+ 87
+pruefe 47, 88
+Pufferplatz 54
+
+RECHTS 3f.
+Refinement 56
+reorganisiere 67
+Reorganisieren 26, 45, 67
+Reservieren 29
+RETURN 4
+Richtung Druckausgabe 23
+rollen 95
+Rollen 41
+RUBIN 4
+RUBOUT 4
+
+saetze 64
+SATZ 61
+Satz 31
+satz aendern 66
+satz ausgewaehlt 80
+Satzauswahl 42
+Satzeditor 9
+satz einfuegen 66, 79
+Satzformular 39
+satz initialisieren 62
+satzkombination 77
+satz lesen 66
+satz loeschen 66, 79
+satz markiert 81
+satznr 64
+satznummer 77
+Satznummer 39
+Satzposition 64
+Satzzeiger 31
+Satzzugriffe 65
+Schreiben auf Archiv 27
+SEITE 99
+sichere 73
+Sichern 15, 36
+sortiere 67
+Sortieren 22, 31, 44, 66
+Sortierreihenfolge 31, 44
+sortierreihenfolge 67
+Sortierzustand 45
+Spaltendruck 52
+Sperre 36
+Standard-Kopiermuster 21, 46
+status anzeigen 103
+Statuszeile 3
+std kopiermuster 87
+Suchbedingung 17, 39, 42
+ -, löschen 18
+ -, setzen 18
+suchbedingung 80
+suchbedingung lesen 80
+suchbedingung loeschen 80
+suchen 96
+Suchen, Optimierung 44
+Suchmuster 42
+ -, eingeben 10
+
+Tabellenmodus 55
+Tasten 3
+Tastenfunktionen 3
+TEXT 45
+textdarstellung 91
+Textdatei, ausdrucken 24
+ -, editieren 23
+ -, nachbearbeiten 24
+Textzeile 49f.
+trage 88
+Tragen 16, 19, 21, 46, 87
+trage satz 88
+
+uebersicht 95
+uebersichtsfenster 95
+Umbenennen 25
+Umbruch 40, 55
+Umschalten auf Koppeldatei 36
+UND-Verknüpfung 43
+unsortierte saetze 67
+UNTEN 3f.
+Überschrift 39
+Übersicht 22, 41
+Übersicht Dateien Archiv 27
+Übersicht Dateien System 25
+
+V 48, 90
+Verändern 21
+verarbeite 90
+Verarbeitung 89
+Verknüpfung von Bedingungen
+43
+virtuelle Datei 32, 71
+VORSPANN 98
+Vorspann 49
+VORSPANN-Anweisung 49
+
+waehlbar 102
+wahl 103
+Warten 6
+weiter 65, 78
+Weiter 17
+wert 91
+wertemenge 47, 88
+WIEDERHOLUNG-Anweisung 49
+Wiederholungsteil 49
+
+'x' 4
+
+ZAHL 45
+zahltext 91
+Zeichen, reservierte 44
+ZEIGEN: 6
+Zeilenende 54
+Zeilenwiederholung 55
+Zielarchiv 28
+Zurück 17
+zurueck 65, 78
+Zustand 3
+Zustandsübergänge 7
+
diff --git a/doc/eudas/eudas.ref.titel b/doc/eudas/eudas.ref.titel
new file mode 100644
index 0000000..223a839
--- /dev/null
+++ b/doc/eudas/eudas.ref.titel
@@ -0,0 +1,91 @@
+#limit (14.0)#
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#gs-MP BAP
+
+
+
+
+#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#
+#free (6.0)#
+#on("b")#EUDAS#off("b")#
+#free (1.0)#
+#on("b")#Anwender-#off("b")#
+#on("b")#Datenverwaltungssystem#off("b")#
+#free (2.0)#
+#on ("b")#VERSION 4#off("b")#
+#free(1.0)#
+#on("u")#                                                    #off("u")#
+#free (0.5)#
+#on("b")#REFERENZHANDBUCH#off("b")#
+#block#
+#page#
+#free (9.5)#
+Hergestellt mit Hilfe der EUMEL-Textverarbeitung und des Pro­
+gramms FontMaster der Martin Schönbeck GmbH.
+#free (1.7)#
+Ausgabe September 1987
+
+Dieses Handbuch und das zugehörige Programm sind urheberrechtlich
+geschützt. Die dadurch begründeten Rechte, insbesondere der Ver­
+vielfältigung in irgendeiner Form, bleiben dem Autor vorbehalten.
+
+Es kann keine Garantie dafür übernommen werden, daß das Pro­
+gramm für eine bestimmte Anwendung geeignet ist. Die Verantwor­
+tung dafür liegt beim Kunden.
+
+Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrekt­
+heit und Vollständigkeit der Angaben wird aber keine Gewähr über­
+nommen. Das Handbuch kann jederzeit ohne Ankündigung geändert
+werden.
+
+(c) Copyright 1987 Thomas Berlage
+ Software-Systeme
+ Im alten Keller 3
+#free (0.1)#
+ D-5205 Sankt Augustin 1
+#page#
+#free (7.0)#
+#center##on("b")#I.#off("b")#
+#free (1.0)#
+#center##on("b")#FUNKTIONEN#off("b")#
+#center##on("b")#ZUM#off ("b")#
+#center##on("b")#NACHSCHLAGEN#off("b")#
+#page#
+#free (7.0)#
+#center##on("b")#II.#off("b")#
+#free (1.0)#
+#center##on("b")#EUDAS#off("b")#
+#center##on("b")#FÜR#off ("b")#
+#center##on("b")#PROGRAMMIERER#off("b")#
+#page#
+#free (7.0)#
+#center##on("b")#III.#off("b")#
+#free (1.0)#
+#center##on("b")#ANHANG#off("b")#
+
+
+
+
diff --git a/doc/eudas/eudas.ref.vorwort b/doc/eudas/eudas.ref.vorwort
new file mode 100644
index 0000000..f911be8
--- /dev/null
+++ b/doc/eudas/eudas.ref.vorwort
@@ -0,0 +1,81 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#EUDAS
+
+
+
+
+#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#
+#center#1
+
+Vorwort
+
+
+
+Lieber EUDAS-Benutzer!
+
+Dies ist das zweite Handbuch, das Sie zu EUDAS bekommen. Wenn
+Sie sich mit EUDAS noch nicht auskennen, sollten Sie zunächst das
+#on("i")#Benutzerhandbuch#off("i")# zu Rate ziehen, ehe Sie in dieses Handbuch
+schauen.
+
+ Das #on("i")#Referenzhandbuch#off("i")# ist in zwei Teile geteilt. Im ersten Teil
+finden Sie eine Übersicht über alle EUDAS-Funktionen (im Kapitel
+2) sowie zusammengefaßte Informationen über die Bedienung (Kapi­
+tel 1) und die genaue Wirkung der einzelnen Funktionen (Kapitel 3
+bis 5). Dieser Teil soll Ihnen zum Nachschlagen dienen, wenn Sie
+eine bestimmte Information suchen.
+ Im zweiten Teil sind alle Informationen zusammengefaßt, die
+ein Programmierer zur Benutzung der EUDAS-Funktionen braucht. Es
+sei an dieser Stelle jedoch davon abgeraten, sofort eigene Program­
+me zu schreiben, da sich in vielen Fällen die gleiche Wirkung auch
+durch Programmierung innerhalb von EUDAS-Funktionen erreichen
+läßt (zum Beispiel in Druck- und Änderungsmustern).
+ Im Zweifelsfall orientieren Sie sich anhand von Kapitel 11, wie
+Sie Ihr Problem am besten lösen können.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/eudas/ref.abb.1-1 b/doc/eudas/ref.abb.1-1
new file mode 100644
index 0000000..d3b3217
--- /dev/null
+++ b/doc/eudas/ref.abb.1-1
@@ -0,0 +1,42 @@
+#limit (13.5)#
+#start (3.5, 5.0)#
+#lpos (0.5)##c pos (3.5)##c pos (4.7)##cpos (7.0)##c pos (10.5)#
+#table#
+      eudas   ESC q  
+
+    ESC ESC   ESC h
+#free (0.2)#
+GIB KDO:     EUDAS  
+#free (0.2)#
+    ESC h    
+    RET        LEER  'Buchst.'  
+
+        ESC q          
+
+        FEHLER
+
+
+  WARTEN      
+      n, j  
+        FRAGE
+
+      RET  
+        EINGABE
+#linefeed (0.5)#
+
+
+        ESC z          
+      ESC q  
+#linefeed (1.0)#
+        AUSWAHL
+
+      ESC q  
+        EDITIEREN
+
+      ESC q  
+        SATZEDITOR
+ESC ?   ESC q        
+      ESC q  
+HILFE       ZEIGEN
+
+
diff --git a/doc/eudas/register b/doc/eudas/register
new file mode 100644
index 0000000..9cca0fc
--- /dev/null
+++ b/doc/eudas/register
@@ -0,0 +1,490 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (181)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+Register
+
+
+
+#columns (2, 0.5)#
+#limit (6.5)#
+% 63, 69, 148
+%% 141
+& 63, 69, 103, 148
+<!> 57
+-- 103
+.. 102
+.a$ 65
+'+' 107
+'-' 107
+
+Abbruch 35
+Abkürzungen 133
+Abkürzungsteil 134, 140
+Absatzmarken 125, 129
+Abschlußzeile 45
+Abschneiden 71
+Abschnitt 67, 69, 134
+Alternative 99
+ -, globale 100
+ -, lokale 99
+AND 162
+Ändern 55
+Änderungen 83, 85, 90, 95
+ -, automatisch 121
+Änderungsmuster 121, 166
+Anführungsstrich 27, 34
+Ankreuzen 36, 40
+Anrede 138
+Anweisung 63
+ -, Textkosmetik 74
+Anzeige 44
+ -, rollen 97
+Arbeitsbereich 16
+Arbeitskopie 56, 84, 173
+ -, Beispiel 58
+ -, löschen 57
+Arbeitstask 16
+Archiv 32
+ -, anmelden 34
+ -diskette 36
+ -, lesen 34
+ -, löschen 176
+ -manager 175, 177
+ -menü 33, 174
+ -name 34, 36
+ -, schreiben 36
+ -übersicht 175
+Arithmetik 161
+Attribut 4, 29
+Aufräumen 173
+Ausdrucken 66
+Ausdrücke 116, 151
+ -, Zusammensetzung 152
+Ausgabedatei 66
+Ausgaberichtung 65
+Auswahlzustand 36, 40
+Automatische Änderungen 121
+
+Bedienungsregeln 39
+begin 16
+Benutzerhandbuch i
+Berechnungen 8
+Bewegen 45
+Bildschirmaufbau 45
+Bitte warten 34, 40
+blättern 46
+BOOL 154, 162
+
+Carriage Return 15
+CAT 167
+CONST 155
+CR 15
+Cursor 35, 46
+ -tasten 54
+
+date 137
+Datei 27
+ -arten 27
+ -, aufräumen 173
+ -auswahl 36
+ -größe, Begrenzung 124
+ -, kopieren 172
+ -limit 71
+ -, löschen 38, 172
+ -namen 172
+ -, Platzbedarf 173
+ -, reorganisieren 174
+ -sperre 95
+ -, umbenennen 172
+ -verwaltung 37
+ -, virtuelle 83
+Dateien, Archiv 174
+ - (Menü) 38, 171
+ -, System 171
+DATEIENDE 106
+Daten, ändern 55
+ -, anzeigen 44
+ -, sichern 33
+ -typen 152
+ -typen, umwandeln 154
+ -verwaltung 3
+Datum 44, 99, 133, 137
+DATUM 112
+DECR 167
+Denotation 154
+Dezimalkomma 111, 161
+Dezimalpunkt 148
+DIN 112
+Diskette 28, 32
+ -, formatieren 176
+ -, initialisieren 176
+Diskettenlaufwerk 175
+Doppeleinträge 121
+DOS 178
+Druckausgabe, Bearbeitung 125
+Drucken 7, 61
+ -, Ablauf 66
+ -, Aufruf 64, 66
+ - (Menü) 22, 65
+ -, Übersicht 175
+Druckersteuerungsanweisungen
+ 74, 124
+Druckmuster 13, 23, 61, 166
+ -, Fehler 134
+ -, Übersetzung 134, 142
+ -, Zeilenlänge 71
+Druckrichtung 123
+Druckverfahren 62
+
+Editieren 64
+Editor 34, 41, 52, 125
+eindeutige felder 121
+Einfügen 18, 52
+Eingabe, Daten 52
+ -, Suchmuster 46
+Eingabeüberprüfung 112
+Eingabezustand 35, 40
+Eingangsmenü 17
+Einzelsatz (Menü) 18, 44, 92, 97
+ELAN-Anweisungen 141
+ELAN-Ausdrücke 116, 151
+ELAN-Compiler 134
+ELIF 168
+ELSE 139
+ENDE 45
+Endesatz 45, 48, 53, 85
+ENTER 15
+ESC '1' 107
+ESC '?' 31, 39, 40
+ESC '9' 107
+ESC 'D' 99
+ESC ESC 41, 111
+ESC 'F' 67
+ESC 'g' 99
+ESC 'h' 35, 39, 40, 55, 107
+ESC 'K' 92
+ESC OBEN 97
+ESC 'p' 99
+ESC 'P' 118
+ESC 'q' 32ff.,40 , 47, 65, 107
+ESC RUBIN 54
+ESC RUBOUT 54
+ESC UNTEN 97
+ESC 'w' 32, 40, 53
+ESC 'z' 32, 36, 40, 95
+Etiketten 126
+eudas 30, 125
+EUDAS-Archivdiskette 11, 29
+EUDAS-Datei 27, 61, 171
+ -, drucken 61
+ -, einrichten 17, 51
+ -, Grenzen 29
+ -, kopieren 113
+ -, Mehrfachbenutzung 93
+ -, Struktur 28
+EUDAS, Aufruf 30
+ -, Installation 11
+ -, Start 15
+ -, Verlassen 24, 32
+EUMEL-Netz 175
+EUMEL-Textverarbeitung 5
+EUMEL-Zeichencode 110
+
+f 117, 134, 156
+FALSE 154
+Fehler, Druckmuster 66
+ -, quittieren 36
+ -zustand 35, 40
+Feld 29
+Feldauswahl 97, 106
+Felder, anfügen 111, 114
+Feldinhalt 29, 156, 160
+feldmaske 120
+Feldmuster 63, 69
+Feldmustertypen 71
+Feldnamen 29, 67
+ -, abfragen 67
+ -, Abgrenzung 72
+ -, ändern 112
+ -, eingeben 51
+ -, Länge 133
+Feldreihenfolge 113
+Feldstruktur 111
+Feldteil 45
+Feldtypen 110, 154
+ -, ändern 111
+Feldvergleich 103
+Formatieren 177
+Formbrief 74
+Formular 8, 44
+Fragezustand 38, 40
+Funktionen 152
+ -, ausführen 31, 46
+ -, auswählen 30
+ -, gesperrt 31
+Fußzeile 44
+
+Gib Kommando 41, 11
+global manager 93
+GRUPPE 145
+Gruppen 144
+ -definition 145
+ -, mehrere 145
+ -wechsel 145
+gruppenwechsel 145
+
+halt 39, 110
+Hardwarefehler 33
+Hauptdatei 87ff.
+Hilfe 31
+Hilfezustand 31, 40
+Hilfstexte 13, 31
+Hintergrunddiskette 12
+Hintergrundengpaß 124
+Holen 56
+HOP OBEN 40, 98, 106
+HOP RETURN 106
+HOP RUBIN 54
+HOP RUBOUT 54
+HOP UNTEN 40, 98, 106
+HOP 'x' 98
+
+IF 117
+IF-Abfragen 161, 168
+IF-Anweisungen 138
+INCR 167
+Init 176
+Initialisierungsteil 124, 143
+Installation 11
+int 140
+INT 153
+
+K 113
+Karteikarten 5
+KB 173
+Ketten 13, 83, 85, 95
+Kilobyte 173
+Klammern 163
+ -, spitze 72
+Kombination 89
+Kombinationsnummer 90
+Kopieren, logisch 172
+ -, EUDAS-Datei 112
+ - (vom Archiv) 34, 176
+Kopieranweisung 113
+Kopiermuster 113, 115, 166
+ -, Übersetzung 116
+KOPPEL 92
+Koppeldatei, Markierung 105
+ -, Position 93
+ -, umschalten 92
+Koppelfeld 86, 89
+ -, übernehmen 92
+Koppeln 13, 83, 85, 95
+ -, mehrere Dateien 87
+Koppelvorgang, Schema 87
+Korrekturversion 14
+
+Länge, feste 70, 137
+ -, variable 70
+Leerautomatik 73
+Leertaste 17, 31
+length 158
+lfd nr 137, 157
+limit 71, 125
+lineform 125, 129
+LINKS 31, 35
+linksbündig 71
+Linksschieben 128
+list (archive) 34
+Löschen 55
+ - (auf Archiv) 176
+ - (Datei) 172
+
+Manager 93, 95
+Managertask 175
+MARK 104
+Markieren 104
+ -, in Übersicht 107
+Markierung 104
+ -, löschen 105
+maxdruckzeilen 124
+MEHR 129
+Mehrfachbenutzung 93
+Menü 30
+Menüzustand 31, 40
+min 155
+Modi 128
+Multi-User 12
+Multi-User-System 16
+Musterbrief 139
+Musterteil 135
+Musterzeichen 70
+
+Nachbearbeitung 125
+Nachspann 68, 144
+NACHSPANN 68
+Negation 103
+Netz 175
+Numerieren 137
+
+'o' 40, 98
+OBEN 30, 106
+ODER 100
+Öffnen 17, 21, 43, 51, 57, 83, 95
+ - (Menü) 30
+Operatoren 152, 155
+ -, Priorität 163
+OR 163
+
+pageform 125
+Paralleleditor 67, 142
+Parameter 152
+Paßwort 94, 177
+Pfeiltasten 54
+Platzbedarf, Datei 173
+pos 159
+Position, feste 69
+ -, variable 69
+Positionierung 48
+Proportionalschrift 129
+Prüfbedingungen 118
+pruefe 120
+PUBLIC 13
+
+REAL 153
+real 155
+RECHTS 31, 55
+rechtsbündig 71, 137
+Referenzhandbuch i, 79
+Refinement 134, 140, 163
+Reorganisieren 174
+Reservieren 178
+RET 15
+RETURN 15
+Richtung, Druckausgabe 65, 123
+Rollen 97, 106
+RUBIN 35, 54
+RUBOUT 35, 54
+Runden 160
+
+Satz 29
+ -, anwählen 46
+ -editor 41, 47, 53, 92, 98
+ -, einfügen 52
+ -, holen 56
+ -, löschen 55
+ -, tragen 55
+Satz.Nr 46, 48
+Satznummer 45, 90
+Satzauswahl, kopieren 114
+Schreiben (auf Archiv) 36, 176
+Schreibmarke 35
+Schrifttypen 125
+Selektion 48
+Sichern 20, 56, 84, 95
+Single-User 12
+Single-User-System 16
+Sortieren 109
+ -, Optimierung 110
+ -, Zieldatei 115
+Sortierreihenfolge 109
+Spaltenbreite 126
+Spaltendruck 126
+Speicherplatz 14, 38, 176
+ -, Datei 173
+Sperren von Dateien 95
+Standard-Kopiermuster 115
+Stationsnummer 175
+Statistik 169
+Statuszeile 31, 39
+Stern 50, 101
+SUB 158, 163
+subtext 158
+SUCH 47
+Suchbedingung f. Drucken 67
+Suchbedingung, Kombination 49
+Suchbedingung löschen 48
+Suchbedingung setzen 46
+Suchen 21, 46
+ -, Optimierung 104
+Suchmuster 47, 99
+ -, Eingabe 47
+SV-Taste 16, 39
+System 32
+
+Tabellenmodus 128
+Tagesdatum 99
+Task, Manager 93
+Tasks 13
+Teildatei 114
+Teiltexte 158
+TEXT 112, 153
+text 140
+Textdatei 28, 61, 171
+ -, ändern 65
+ -, ansehen 65
+ -, ausdrucken 66
+ -, editieren 64
+Texte, verketten 156
+Text-Funktionen 156
+Textkonstanten 139
+Text, konstanter 117
+Text, Länge 158
+Textverarbeitung 3, 123
+THEN 139
+Tragen 55, 118
+TRUE 154
+
+Uhrzeit 133
+Umbruch 129
+Umlaute 143
+Umschalten auf Koppeldatei 92
+UND 100ff.
+UNTEN 30, 106
+Überschrift 45, 68
+Übersicht (Archiv) 34, 175
+ - (Dateien) 37, 171
+ - (Sätze) 105
+
+V 122
+VAR 165
+Variablen 165
+ -, Initialisierung 143, 167
+ -, Lebensdauer 166
+ -, Typ 165
+Verändern 121
+Vergleiche 102, 162
+virtuelle Datei 83
+Vorspann 68, 144
+VORSPANN 68
+
+Weiter 45, 48, 90
+wert 148, 160
+wertemenge 119
+WIEDERHOLUNG 63, 126
+
+'x' 36, 40
+
+ZAHL 110
+zahltext 148, 160
+Zeichen, reservierte 64, 69, 103
+Zeigen 40
+Zeile einfügen 54
+Zeilenfortsetzung 129
+Zeilenlänge 71
+Zielarchiv 175
+Zieldatei, Struktur 113
+Zurück 45, 48, 90
+Zustand 31, 40
+Zuweisung 166
+
+
diff --git a/doc/eudas/uedas.hdb.4 b/doc/eudas/uedas.hdb.4
new file mode 100644
index 0000000..ecbfd58
--- /dev/null
+++ b/doc/eudas/uedas.hdb.4
@@ -0,0 +1,686 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (27)#
+#headodd#
+#center#EUDAS#right#%
+
+#end#
+#headeven#
+%#center#EUDAS
+
+#end#
+#center#1
+
+4 Umgang mit Dateien und Menüs
+
+
+
+Zu Anfang dieses Teils sollen Sie zunächst die Terminologie von
+EUDAS kennenlernen. Das Karteikartenmodell des ersten Kapitels
+muß ja auf einem Rechner realisiert werden. Dazu müssen erst eini­
+ge Ausdrücke erklärt werden.
+
+
+4.1 EUDAS-Dateien
+
+Der wichtigste Ausdruck, der Ihnen noch sehr häufig begegnen wird,
+ist #on("i")#Datei#off("i")#. Eine Datei ist eine Sammlung von Informationen in einem
+Computer, die als ein Objekt transportiert und behandelt werden
+können. Dieser Name wurde analog zu "Kartei" gebildet, mit dem
+Unterschied, daß eine "Daten-Kartei" gemeint ist.
+ Jede Datei hat einen eigenen Namen, durch den sie identifiziert
+wird. Der Name ist oft in Anführungsstriche eingeschlossen - die
+Anführungsstriche gehören jedoch nicht zum Namen, sondern dienen
+nur zur Abgrenzung, welche Zeichen zum Namen gehören. Der Name
+ist also wie die Aufschrift auf einem Aktenordner. Wenn alle Ordner
+im Schrank stehen, können Sie anhand des Namens den richtigen
+Ordner finden, anderenfalls müßten Sie alle Ordner öffnen.
+
+#on("b")#Dateiarten#off("b")# Dateien werden nun für viele verschiedene Arten
+von
+Informationen benutzt. Sie können einerseits Texte enthalten oder
+auch Karteien, Grafiken, Formeln oder Zahlenkolonnen. Sie haben
+bereits im ersten Kapitel den Unterschied zwischen Datenverwaltung
+und Textverarbeitung kennengelernt. In diesem Zusammenhang sind
+die beiden ersten Verwendungsweisen wichtig.
+
+#limit (12.0)#
+ #on("i")#Textdateien#off("i")#
+ sind Dateien, die normale Texte enthalten, die mit
+ dem Editor verändert und einfach ausgedruckt
+ werden können. In ihnen werden also Informationen
+ gespeichert, wie die Textverarbeitung sie benötigt.
+
+ #on("i")#EUDAS-Dateien#off("i")#
+ sind dagegen Dateien, die Informationen in der
+ Form von Karteikarten enthalten. Sie haben also
+ die Struktur, wie sie von der Datenverwaltung be­
+ nötigt wird.
+#limit (13.5)#
+
+ Der Computer kann aber auch alle Arten von Dateien gleich­
+behandeln, und zwar dann, wenn der Inhalt der Dateien nicht be­
+trachtet werden muß.
+ Ein häufiger Fall ist zum Beispiel, wenn Dateien zur Sicherung
+auf eine Diskette geschrieben werden sollen. In diesem Fall genügt
+die Angabe des Namens; dem Rechner ist es egal, welchen Inhalt die
+Datei hat.
+ Anders ist es aber, wenn Sie den Inhalt betrachten wollen.
+Dazu brauchen Sie dann ein Programm, das die innere Struktur der
+Datei kennt. Textdateien können Sie zum Beispiel mit dem Editor
+ansehen. EUDAS-Dateien müssen Sie jedoch mit EUDAS ansehen, da
+der Editor die EUDAS-Struktur nicht kennt. Es ist in vielen Fällen
+sinnvoll, durch einen Zusatz im Dateinamen zu kennzeichnen, ob es
+sich um eine Textdatei oder eine EUDAS-Datei handelt.
+
+
+#free (3.7)#
+
+#center#Abb. 4-1 Struktur einer EUDAS-Datei
+
+
+#on("b")#Terminologie#off("b")# EUDAS verwendet bestimmte Ausdrücke, um die
+Strukturelemente einer EUDAS-Datei zu kennzeichnen. Die Struktur
+einer EUDAS-Datei ist schematisch in Abb. 4-1 dargestellt. Die
+Ausdrücke wurden nun nicht direkt aus dem Karteikartenmodell
+übernommen, da es auch noch andere Modelle gibt und keine fal­
+schen Assoziationen auftreten sollen.
+ EUDAS verwendet die Bezeichnung #on("i")#Satz#off("i")# für eine Karteikarte.
+Eine EUDAS-Datei besteht also aus einer Anzahl von gleichartigen
+Sätzen. Zur Veranschaulichung kann man sich diese nebeneinander­
+gelegt vorstellen.
+ Jeder Satz ist unterteilt in sogenannte #on("i")#Felder#off("i")#. Ein Feld ent­
+spricht einem Attribut bzw. einem Eintrag auf der Karteikarte. Ein
+Feld ist wiederum unterteilt in einen #on("i")#Feldnamen#off("i")# und einen #on("i")#Feldin­
+halt#off("i")#.
+ Der Feldname identifiziert ein bestimmtes Feld innerhalb eines
+Satzes. Die Feldnamen sind natürlich für alle Sätze gleich. Die
+Feldnamen einer EUDAS-Datei sind beliebig und können von Ihnen
+selbst festgelegt werden.
+ Der Feldinhalt enthält die eigentliche Information des entspre­
+chenden Attributs. Der Feldinhalt darf ebenfalls aus beliebig vielen
+Zeichen bestehen. Die Feldinhalte sind natürlich für jeden Satz
+verschieden und stellen die eigentliche gespeicherte Information
+dar.
+
+#on("b")#Grenzen#off("b")# Aus technischen Gründen gibt es natürlich auch
+einige
+Beschränkungen, die hier nicht verschwiegen werden sollen. Eine
+Datei kann maximal etwa 5000 Sätze enthalten, ein Satz darf aus
+maximal 255 Feldern bestehen. Insgesamt kann ein Satz etwa 32000
+Zeichen umfassen. Die einzelnen Sätze in der EUDAS-Datei werden
+durch ihre jeweilige Positionsnummer identifiziert, also quasi von 1
+bis 5000 durchnumeriert.
+
+
+4.2 EUDAS-Menüs
+
+In den folgenden Abschnitten sollen Sie lernen, wie die Bedienung
+von EUDAS funktioniert. Dazu sollen Sie eine EUDAS-Beispieldatei
+von der EUDAS-Diskette in Ihr System holen. Diese Datei brauchen
+Sie dann später, um die Funktionen von EUDAS zu kennenzulernen.
+ Die Beispieldatei hat den gleichen Inhalt wie die in Kapitel 3
+von Ihnen erstellte Datei. Falls Ihnen also die EUDAS-Archiv­
+diskette nicht zur Verfügung steht, können Sie in diesem Kapitel
+auch jede andere Archivdiskette verwenden.
+ Bitte beachten Sie im folgenden, daß Sie einfache Anführungs­
+striche nicht mit eingeben, doppelte Anführungsstriche aber wohl.
+
+#on("b")#EUDAS-Aufruf#off("b")# Zuerst müssen Sie EUDAS aufrufen. Dazu
+begeben
+Sie sich in die in Kapitel 3 eingerichtete Task ('continue ("arbeit")')
+und geben bei 'gib kommando:' das Kommando 'eudas':
+
+
+ gib kommando:
+ #on("i")#eudas#off("i")#<RET>
+
+
+Falls Ihr System über Menüs gesteuert wird, müssen Sie eine ent­
+sprechende Funktion wählen. Anschließend erscheint folgendes
+Menü:
+
+___________________________________________________________________________________________
+
+ EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
+ --------------:
+ EUDAS-Datei :
+ O Öffnen :
+ - Ketten :
+ - Koppeln :
+ --------------:
+ Arbeitskopie :
+ - Sichern :
+ --------------:
+ Aktuelle Datei:
+ - Notizen :
+ - Feldstrukt. :
+ - Prüfbeding. :
+ --------------:
+ Mehrbenutzer :
+ M Manager :
+ --------------:
+ :
+ :
+ :
+ :
+ :
+ Akt.Datei: Manager: Datum: 22.07.87
+___________________________________________________________________________________________
+
+
+#on("b")#Menüs#off("b")# Ein #on("i")#Menü#off("i")# ist eine Auswahl für einige verschiedene Funk­
+tionen. Die Funktionen sind jeweils benannt und werden durch einen
+davorstehenden Buchstaben oder ein Minuszeichen gekennzeichnet.
+Eine der Funktionen ist immer durch inverse Darstellung markiert.
+ Diese Markierung können Sie nun mit Hilfe der Pfeiltasten OBEN
+und UNTEN verschieben. Auf diese Weise können Sie sich die ge­
+wünschte Funktion auswählen. Die Funktionen werden jedoch durch
+das Markieren nicht ausgeführt. Sie können also beliebig mit den
+Pfeiltasten herumexperimentieren.
+ Ausgeführt wird die markierte Funktion, wenn Sie die Leertaste
+drücken. Sofort erscheint ein Stern vor dem Funktionsnamen, um
+anzuzeigen, daß die Ausführung beginnt. Probieren Sie dies jetzt
+nicht aus, dazu ist später Gelegenheit.
+ Funktionen mit einem Minuszeichen davor können Sie zwar
+anwählen (markieren), aber nicht ausführen. Solche Funktionen sind
+momentan gesperrt, weil ihre Ausführung keinen Sinn hat oder sogar
+Fehler erzeugen würde.
+ Mit den Pfeiltasten LINKS und RECHTS können Sie im Menüzu­
+stand weitere EUDAS-Menüs abrufen. Welche Menüs zur Verfügung
+stehen, zeigt Ihnen die oberste Bildschirmzeile. Das aktuelle Menü
+ist jeweils invers dargestellt.
+
+#on("b")#Hilfe#off("b")# Wenn Sie nun wissen möchten, welche Bedeutung die
+mar­
+kierte Funktion hat (die Funktionsbezeichnungen sind aus Platz­
+gründen sehr kurz gehalten), können Sie einen #on("i")#Hilfstext#off("i")# zu dieser
+Funktion abrufen. Dies erfolgt durch die Betätigung der Tasten ESC
+und '?' hintereinander. Diese doppelten Tastenkombinationen mit der
+ESC-Taste am Anfang werden Ihnen noch sehr häufig begegnen -
+denken Sie immer daran, die Tasten hintereinander und nicht
+gleichzeitig zu tippen. Der zeitliche Abstand zwischen den Tasten­
+drücken kann beliebig lang sein; hingegen sollten Sie eine Taste
+nicht zu lange drücken, da sonst eventuell eine automatische Wie­
+derholfunktion Ihrer Tastatur startet.
+ Probieren Sie nun die Tastenkombination ESC '?' aus. Als Reak­
+tion erscheint in der rechten Hälfte des Bildschirms ein Text. Dieser
+sollte Ihnen die gewünschten Informationen bieten.
+ Gleichzeitig hat sich aber auch die oberste Bildschirmzeile
+verändert. Sie zeigt jetzt folgendes Bild:
+
+___________________________________________________________________________________________
+
+ HILFE: Beenden: ESC q Seite weiter: ESC w Seite zurueck: ESC z
+___________________________________________________________________________________________
+
+
+#on("b")#Zustände#off("b")# Wenn Sie sich nicht im Menü befinden, fungiert
+die ober­
+ste Zeile als sogenannte #on("i")#Statuszeile#off("i")#. Diese Zeile zeigt immer an, in
+welchem #on("i")#Zustand#off("i")# das Programm sich befindet. Der Zustand des Pro­
+gramms hat nämlich Einfluß darauf, welche Tasten Sie drücken
+können und wie das Programm darauf reagiert. Die Statuszeile zeigt
+daher außer dem Zustand auch die wichtigsten Tastenfunktionen.
+ Sie kennen jetzt also schon zwei Zustände von EUDAS: den
+Menüzustand und den Hilfe-Zustand.
+
+#on("b")#Hilfe-Zustand#off("b")# Vom Menüzustand kommen Sie über die
+Tastenkom­
+bination ESC '?' in den Hilfe-Zustand. Im Hilfe-Zustand haben die
+Pfeiltasten OBEN und UNTEN keine Wirkung mehr (probieren Sie dies
+aus).
+ Ein Hilfstext besteht im allgemeinen aus mehreren Seiten. Die
+erste Seite enthält dabei die speziellen Informationen, danach
+folgen dann allgemeine Informationen. Mit den Tastenkombinationen
+ESC 'w' und ESC 'z' können Sie zwischen den Seiten umschalten
+(denken Sie daran, was oben über Tastenkombinationen gesagt
+wurde). Wenn Sie dies ausprobieren, werden Sie auf der zweiten
+Seite allgemeine Hinweise zur Menübedienung finden. Auf der letz­
+ten Seite wird ESC 'w' ignoriert, ebenso ESC 'z' auf der ersten Seite.
+ Mit der Tastenkombination ESC 'q' (quit) kehren Sie aus dem
+Hilfezustand in den vorherigen Zustand zurück. Diese Tastenkombi­
+nation löst allgemein in EUDAS die Rückkehr in den alten Zustand
+aus. Wenn Sie ESC 'q' getippt haben, erscheint die alte Menüzeile
+und Sie können wieder Funktionen auswählen.
+ Der Hilfszustand läßt sich von nahezu allen (noch zu bespre­
+chenden) Zuständen mit ESC '?' aufrufen. Es wird jeweils ein zum
+aktuellen Zustand passender Hilfstext ausgegeben.
+ Die möglichen Zustandsübergange sind nochmal in Abb. 4-2
+zusammengefaßt.
+
+
+#free (2.5)#
+
+#center#Abb. 4-2 Menü- und Hilfezustand
+
+
+#on("b")#EUDAS verlassen#off("b")# Im Menüzustand können Sie EUDAS jederzeit
+durch Tippen von ESC 'q' verlassen. Sie landen dann wieder bei 'gib
+kommando:'.
+
+
+4.3 Archivmenü
+
+#on("b")#System/Archiv#off("b")# An dieser Stelle müssen Sie sich die Begriffe #on("i")#Archiv#off("i")#
+und #on("i")#System#off("i")# klarmachen. Als Archiv bezeichnet man die Möglichkeit,
+bei Bedarf Disketten in Ihren Rechner einlegen können, um Dateien
+(und Programme) von anderen Rechnern zu übernehmen. Um diese
+Dateien bearbeiten zu können, müssen Sie sie in das System (Ihre
+Festplatte oder Hintergrunddiskette) kopieren.
+ Die wichtigste Aufgabe des Archivs ist es, Daten vor Beschädi­
+gung zu sichern. Durch Fehlbedienung oder Systemfehler kann es
+nämlich leicht geschehen, daß die Daten in Ihrem System verloren
+gehen oder zerstört werden. Wenn Sie die Daten jedoch auf einer
+Diskette gesichert und die Diskette sicher verwahrt haben, können
+Sie die Daten wiederherstellen.
+ Es ist sehr wichtig, daß Sie Ihre Dateien auf Archivdisketten
+sichern, denn ein einziger Hardwarefehler kann die Arbeit von
+Jahren vernichten (Sagen Sie nicht: "Mir passiert so etwas nicht" -
+bis jetzt hat es noch jeden erwischt).
+
+___________________________________________________________________________________________
+
+ EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
+ --------------:
+ Dateien Archiv:
+ U Übersicht :
+ D Üb. Drucken :
+ --------------:
+ Datei :
+ K Kopieren :
+ vom Archiv :
+ S Schreiben :
+ auf Archiv :
+ L Löschen :
+ auf Archiv :
+ --------------:
+ Archivdiskette:
+ I Init :
+ --------------:
+ Z Zielarchiv :
+ P Paßwort :
+ - Reservieren :
+ --------------:
+ :
+ :
+ Akt.Datei: Ziel: "ARCHIVE" Datum: 22.07.87
+___________________________________________________________________________________________
+
+
+#center#Abb. 4-3 Archivmenü
+
+
+#on("b")#Archivmenü#off("b")# Wenn Sie EUDAS aufrufen, befinden Sie sich
+immer im
+ersten Menü. Sie benötigen jedoch jetzt Funktionen aus dem sech­
+sten Menü 'Archiv'. Wählen Sie dieses Menü jetzt an. Es erscheint
+das in Abb. 4-3 dargestellte Bild. Die Funktionen in diesem Menü
+befassen sich mit beliebigen Dateien auf dem Archiv.
+ Für den Versuch legen Sie bitte die EUDAS-Archivdiskette ein.
+Dann wählen Sie die Funktion 'Übersicht' in dem Menü an, wenn sie
+nicht schon markiert ist. Sie können nun die ausgewählte Funktion
+durch Tippen der Leertaste ausführen.
+ In der obersten Zeile erscheint nun der Hinweis 'Bitte war­
+ten..'. Er zeigt an, daß nun eine Funktion ausgeführt wird, bei der
+Sie zunächst nichts tun können. Sie sollten in diesem Zustand keine
+Tasten drücken, denn EUDAS kann nicht darauf reagieren.
+
+#on("b")#Archivübersicht#off("b")# Nach einer mehr oder minder langen
+Aktivitäts­
+phase Ihres Diskettenlaufwerks erscheint dann die Archivübersicht.
+Das Erscheinungsbild mit dem markierten Editorbalken in der ober­
+sten Zeile kommt Ihnen vielleicht bekannt vor. Sie haben nämlich
+nichts anderes als das EUMEL-Kommando 'list (archive)' ausgeführt.
+Neu ist lediglich die Statuszeile:
+
+___________________________________________________________________________________________
+
+ ZEIGEN: Blättern: HOP OBEN, HOP UNTEN Beenden: ESC q Hilfe: ESC ?
+___________________________________________________________________________________________
+
+
+Wenn Sie sich die Übersicht angeschaut haben, verlassen Sie den
+Editor wieder mit ESC 'q'.
+ Beachten Sie, daß Sie unter EUDAS das Archiv nicht extra an­
+melden müssen; dies geschieht automatisch, wenn Sie eine Funktion
+aufrufen. Bei Leseoperationen müssen Sie nicht einmal den Archiv­
+namen wissen. Das Archiv wird automatisch wieder abgemeldet,
+wenn Sie das Archivmenü verlassen.
+
+#on("b")#Archiv lesen#off("b")# Unter den in der Übersicht aufgelisteten
+Dateien
+sollten Sie auch die Datei finden, die Sie brauchen. Sie heißt
+'Adressen'. An dieser Stelle ein kleiner Hinweis: An vielen Stellen
+werden Sie sehen, daß Dateinamen in Anführungsstriche einge­
+schlossen sind. Die Anführungsstriche gehören jedoch #on("i")#nicht#off("i")# zum
+Namen. Sie dienen nur zur Abgrenzung, da in Dateinamen beliebige
+Zeichen erlaubt sind. Wenn Sie aufgefordert werden, einen Datei­
+namen einzugeben, müssen Sie dies immer ohne Anführungsstriche
+tun.
+ Hoffentlich haben Sie in der ganzen Diskussion nicht das Ziel
+aus den Augen verloren: Sie sollten eine Datei ins System holen, um
+nachher mit ihr zu experimentieren. Zu diesem Zweck gibt es im
+Archivmenü die Funktion
+#free (0.2)#
+
+ K Kopieren
+ (vom Archiv)
+
+#free (0.2)#
+Wählen Sie diese Funktion jetzt mit den Pfeiltasten aus und drücken
+Sie zum Ausführen die Leertaste.
+
+#on("b")#Eingabezustand#off("b")# Nach kurzem 'Bitte warten..'-Zustand werden
+Sie
+im rechten Bildschirmteil nach dem Namen der Datei gefragt. Gleich­
+zeitig erscheint eine neue Statuszeile. Es ergibt sich folgendes Bild:
+
+___________________________________________________________________________________________
+
+ EINGABE: Bestätigen: RETURN Zeigen: ESC z Abbrechen: ESC h Hilfe: ESC ?
+ --------------:Dateiname:
+ Dateien Archiv:
+ U Übersicht :
+ D Üb. drucken :
+ --------------:
+ Datei :
+ * Kopieren :
+ vom Archiv :
+ ...
+
+___________________________________________________________________________________________
+
+
+Sie können in diesem Zustand den Namen der gewünschten Datei
+eingeben. Außer den in der Statuszeile genannten Funktionen kön­
+nen Sie die aus dem Editor bekannten Tasten benutzen, um den
+Text in der Zeile gegebenenfalls zu korrigieren (Pfeiltasten LINKS
+und RECHTS, RUBOUT, RUBIN). Die Schreibmarke (Cursor) zeigt Ihnen
+an, wo das nächste Zeichen plaziert wird.
+
+#on("b")#Abbruch#off("b")# Eine Tastenkombination verdient noch besondere
+Beach­
+tung: Mit ESC 'h' können Sie in vielen Situationen eine Funktion
+noch abbrechen - zum Beispiel wenn Sie irrtümlich die falsche
+Funktion gewählt haben.
+ Im Gegensatz zu ESC 'q' erfolgt hier die sofortige Rückkehr aus
+der Funktion ins Menü, möglichst ohne daß die Funktion Auswir­
+kungen hinterläßt. Bei einem Abbruch bleibt also in der Regel das
+System unverändert.
+
+#on("b")#Fehlerzustand#off("b")# Um auch die Fehlerbehandlung von EUDAS
+auszu­
+probieren, sollten Sie hier einen falschen Namen eingeben, zum
+Beispiel:
+#free (0.2)#
+
+ Dateiname: #on("i")#Adresen#off("i")#<RET>
+
+#free (0.2)#
+EUDAS sucht jetzt auf der Diskette nach einer Datei dieses Namens,
+findet sie aber nicht. Als Reaktion erscheint dann die Meldung:
+
+___________________________________________________________________________________________
+
+ !!! FEHLER !!! Quittieren: ESC q Hilfe zur Meldung: ESC ?
+ --------------:Dateiname: Adresen
+ Dateien Archiv:>>> "Adresen" gibt es nicht
+ U Übersicht :
+ D Üb. drucken :
+ --------------:
+ ...
+
+___________________________________________________________________________________________
+
+
+Im Normalfall sollten Sie die Fehlermeldung mit ESC 'q' quittieren,
+damit Sie den Befehl erneut versuchen können. Auch hier haben Sie
+die Möglichkeit, eine besondere Information zu dem Fehler abzurufen
+(es liegen jedoch nicht für alle möglichen Fehler spezielle Texte
+vor).
+ Nach dem Quittieren des Fehlers befinden Sie sich wieder im
+Menüzustand. Wiederholen Sie jetzt die Funktion, indem Sie die
+Leertaste tippen. Sie werden dann erneut nach dem Namen gefragt.
+
+#on("b")#Auswahlzustand#off("b")# Um endlich ans Ziel zu kommen, benutzen Sie
+diesmal eine sehr komfortable Abkürzung, die EUDAS Ihnen bietet.
+Durch Drücken von ESC 'z' können Sie sich nämlich alle möglichen
+Namen anzeigen lassen und den gewünschten einfach ankreuzen.
+ Anschließend sieht der Bildschirm wie in Abb. 4-4 aus. In die­
+sem Zustand können Sie mit den Pfeiltasten den Cursor zur ge­
+wünschten Datei bewegen und diese ankreuzen. Da Sie auch meh­
+rere Dateien in beliebiger Folge ankreuzen können, erscheint eine
+'1' vor der Datei zur Anzeige der Reihenfolge. Sie wollen aber nur
+diese eine Datei 'Adressen' holen und beenden die Auswahl daher
+mit ESC 'q'. Wenn alles glattgeht, wird jetzt die Datei vom Archiv
+ins System kopiert.
+
+#on("b")#Archiv schreiben#off("b")# Auf nahezu gleiche Weise können Sie mit
+der Funktion
+
+
+ S Schreiben
+ auf Archiv
+
+
+eine Datei wieder auf die Diskette schreiben. Als erstes müssen Sie
+dann den Namen der Archivdiskette eingeben, damit Sie nicht aus
+Versehen auf eine falsche Archivdiskette schreiben.
+ Auch hier können Sie die gewünschten Dateien ankreuzen (na­
+türlich bietet EUDAS dann die Dateien des Systems an). Sie brau­
+chen keine Angst zu haben, aus Versehen eine Datei mit gleichem
+Namen zu überschreiben - EUDAS fragt in solchen Fällen immer
+nochmal an.
+
+___________________________________________________________________________________________
+
+ AUSWAHL: Ankreuzen: 'x' Durchstreichen: 'o' Beenden: ESC q Hilfe: ESC ?
+ --------------:--------------------------------------------------------------
+ Dateien Archiv: Auswahl der Dateien auf dem Archiv.
+ U Übersicht : Gewuenschte Datei(en) bitte ankreuzen:
+ D Üb. Drucken :--------------------------------------------------------------
+ --------------: o "eudas.1"
+ Datei : o "eudas.2"
+ * Kopieren : o "eudas.3"
+ vom Archiv : o "eudas.4"
+ S Schreiben : o "eudas.init"
+ auf Archiv : o "eudas.generator"
+ L Löschen : o "Adressen"
+ auf Archiv :--------------------------------------------------------------
+ --------------:
+ Archivdiskette:
+ I Init :
+ --------------:
+ Z Zielarchiv :
+ P Paßwort :
+ - Reservieren :
+ --------------:
+ :
+ :
+ Akt.Datei: Ziel: "ARCHIVE" Datum: 22.07.87
+___________________________________________________________________________________________
+
+
+#center#Abb. 4-4 Dateiauswahl
+
+
+
+4.4 Dateiverwaltung
+
+So: nach dieser anstrengenden Arbeit sollen Sie sich überzeugen,
+daß die Datei 'Adressen' nun wirklich im System zur Verfügung
+steht. Dazu gehen Sie mit LINKS ein Menü zurück. Dieses Menü
+beschäftigt sich mit Dateien im System und ist in Abb. 4-5 gezeigt.
+ Auch hier finden Sie eine Funktion "Übersicht". Rufen Sie diese
+auf. Ganz analog zum Archiv erscheint eine Übersicht aller Dateien
+im Editor. Verlassen Sie die Übersicht wieder mit ESC 'q'.
+
+___________________________________________________________________________________________
+
+ EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
+ --------------:
+ Dateien System:
+ U Übersicht :
+ --------------:
+ Datei :
+ L Löschen :
+ N Umbenennen :
+ K Kopieren :
+ P Platzbedarf :
+ A Aufräumen :
+ --------------:
+ :
+ :
+ :
+ :
+ :
+ :
+ :
+ :
+ :
+ :
+ :
+ Akt.Datei: Task: "arbeit" Datum: 22.07.87
+___________________________________________________________________________________________
+
+
+#center#Abb. 4-5 Menü 'Dateien'
+
+
+#on("b")#Datei löschen#off("b")# Eine weitere Funktion aus diesem Menü werden
+Sie ebenfalls noch öfter brauchen, nämlich
+#free (0.2)#
+
+ L Löschen
+
+#free (0.2)#
+Mit dieser Funktion können Sie eine Datei wieder aus dem System
+entfernen - zum Beispiel wenn Sie sich die Adressen angesehen
+haben und danach den Speicherplatz nicht weiter verschwenden
+wollen. Als letztes Beispiel sollen Sie auch diese Funktion aufrufen
+(keine Angst, wir löschen die Datei nicht wirklich, es gibt vorher
+noch eine Notbremse).
+
+#on("b")#Fragezustand#off("b")# Als erstes werden Sie wieder nach dem
+Dateinamen
+gefragt (dies ist Ihnen schon bekannt). Hier haben Sie jetzt die
+Wahl, ob Sie den Namen eingeben oder mit ESC 'z' ankreuzen. Da das
+Löschen unwiederbringlich ist, werden Sie anschließend zur Sicher­
+heit gefragt, ob Sie die Datei wirklich löschen wollen:
+
+___________________________________________________________________________________________
+
+ FRAGE: Bejahen: j,J Verneinen: n,N Abbrechen: ESC h Hilfe: ESC ?
+ --------------:Dateiname: Adressen
+ Dateien System:"Adressen" im System loeschen (j/n) ?
+ U Übersicht :
+ --------------:
+ ...
+
+___________________________________________________________________________________________
+
+
+Diese Frage können Sie bejahen oder verneinen (oder die Funktion
+ohne Auswirkungen abbrechen). In diesem Fall sollten Sie die Frage
+verneinen - es sei denn, Ihnen hat das Spielen mit EUDAS so gut
+gefallen, daß Sie die ganze Prozedur wiederholen und die Datei
+nochmal vom Archiv holen wollen.
+
+
+4.5 Bedienungsregeln
+
+Mit dieser letzten Demonstration haben Sie jetzt schon fast alle
+Arten des Umgangs mit EUDAS kennengelernt. Sicher ist dies beim
+ersten Mal sehr verwirrend. Mit vier Regeln können Sie jedoch
+EUDAS immer bedienen:
+
+#limit (12.0)#
+ 1. Achten Sie darauf, welche möglichen Tastendrücke
+ in der Statuszeile stehen. Richten Sie sich danach!
+#free (0.2)#
+ 2. Sind Sie sich unsicher, rufen Sie Hilfsfunktion mit
+ ESC '?' auf. Damit erhalten Sie weitere Informatio­
+ nen.
+#free (0.2)#
+ 3. Funktioniert diese Tastenkombination nicht (geben
+ Sie dem Rechner eine kurze Zeit zum Reagieren),
+ versuchen Sie die Tastenkombinationen ESC 'h' (Ab­
+ bruch) oder ESC 'q' (Verlassen). Falls sich daraufhin
+ etwas verändert, fangen Sie wieder mit 1. an.
+#free (0.2)#
+ 4. Erfolgt darauf keine Reaktion, drücken Sie die SV-
+ Taste und versuchen Sie das Programm mit 'halt' zu
+ stoppen. Führt auch das nicht zum Erfolg, hat sich
+ Ihr Rechner "aufgehängt". Sie müssen den Rechner
+ dann neu starten. Wenn Sie keine Erfahrung mit
+ einer solchen Situation haben, wenden Sie sich an
+ Ihren Händler oder Systembetreuer.
+#limit (13.5)#
+
+Im Zusammenhang mit dem letzten Punkt sei nochmal auf die Wich­
+tigkeit einer regelmäßigen Datensicherung auf Archivdisketten
+hingewiesen. Im Normalfall sollten Sie aber mit den Punkten 1 bis 3
+zurechtkommen.
+
+#on("b")#Zustände#off("b")# Im letzten Abschnitt haben Sie eine ganze Reihe
+von
+Zuständen kennengelernt, die EUDAS einnehmen kann. In jedem
+Zustand haben Sie verschiedene Möglichkeiten zur Reaktion. Glück­
+licherweise erscheinen diese Möglichkeiten zum großen Teil in der
+Statuszeile.
+ Damit Sie die verwirrenden Erfahrungen des letzten Abschnitts
+etwas ordnen können, wollen wir an dieser Stelle die verschiedenen
+Zustände noch einmal zusammenfassen. Der Beschreibung vorange­
+stellt ist die jeweilige Kennzeichnung am Beginn der Statuszeile.
+
+EUDAS: #on("b")# Sie können mit ESC 'w' und ESC 'z' im Hilfstext blättern. Mit
+ ESC 'q' kommen Sie in den alten Zustand.
+
+AUSWAHL: Hier können Sie die gewünschten Namen mit 'x' ankreuzen
+ und mit 'o' wieder entfernen. Normales Beenden mit ESC 'q'.
+ Hilfestellung durch ESC '?'. Abbruch der gesamten Funktion mit
+ ESC 'h'.
+
+EINGABE: Hier können Sie eine einzelne Zeile eingeben oder ändern
+ (wie im Editor). Einfügen und Löschen mit RUBIN und RUBOUT.
+ Abbruch und Hilfestellung möglich.
+
+FRAGE: Beantworten Sie die gestellte Frage mit 'j' oder 'n'. Abbruch
+ (ESC 'h') und Hilfestellung (ESC '?') möglich.
+
+ZEIGEN: Mit HOP OBEN und HOP UNTEN können Sie in der Übersicht
+ blättern. Ende der Übersicht mit ESC 'q'. Hilfestellung möglich.
+
+!!! FEHLER !!! Quittieren Sie die Meldung mit ESC 'q'. Hilfestellung
+ möglich.
+
+Bitte warten.. In diesem Zustand keine Taste drücken, der Rechner
+ ist beschäftigt.
+
+Drei weitere Zustände, die Sie noch nicht kennengelernt haben, sind
+hier schon mal der Vollständigkeit halber aufgeführt:
+
+SATZ ÄNDERN:
+SATZ EINFÜGEN:
+SUCHMUSTER EINGEBEN: Satzeditor zum Eingeben von Feldinhalten.
+ Normales Verlassen mit ESC 'q'. Abbruch und Hilfestellung mög­
+ lich. Beschreibung s. 6.2.
+
+EDITIEREN: EUMEL-Editor mit Änderungsmöglichkeit für beliebige
+ Texte. Normales Verlassen mit ESC 'q'. Hilfestellung möglich.
+ Beschreibung der Möglichkeiten siehe EUMEL-Benutzerhand­
+ buch.
+
+Gib Kommando: Hier können Sie ein beliebiges ELAN-Kommando ein­
+ geben und mit RETURN bestätigen. Abbruch und Hilfestellung
+ möglich. Kann im Menü durch ESC ESC aufgerufen werden.
+
+Wie Sie sehen, werden auch hier wieder die gleichen Tastenkombi­
+nationen verwendet, die Sie schon kennen.
+ In dieser Übersicht sind jeweils nur die wichtigsten Tastenkom­
+binationen aufgeführt. Informieren Sie sich gegebenenfalls mit ESC
+'?'. Einige weitere Tastenfunktionen werden Sie im folgenden noch
+kennenlernen. Eine vollständige Übersicht finden Sie im Referenz­
+handbuch.
+
diff --git a/doc/graphic/Altes Handbuch - Teil 10 - Graphik b/doc/graphic/Altes Handbuch - Teil 10 - Graphik
new file mode 100644
index 0000000..36fa31e
--- /dev/null
+++ b/doc/graphic/Altes Handbuch - Teil 10 - Graphik
@@ -0,0 +1,831 @@
+#type ("trium10")##limit (13.5)#
+#block##start(2.5,2.5)##pagelength(21.0)##pagenr("%",418)##setcount(22)#
+#headeven#
+% EUMEL-Benutzerhandbuch
+
+
+
+#end#
+#headodd#
+ TEIL 10: Graphik %
+
+
+
+#end#
+#type("triumb14")#
+#ib(9)##center#TEIL 10: Graphik#ie(9)#
+#type("trium10")#
+#free(2.0)#
+#on("bold")##ib(9)##type("triumb14")#1. Übersicht#ie(9)#
+#type("trium10")#
+
+ #limit(12.0)##on("italics")#Dieser Teil des Benutzer-Handbuchs beschreibt die Graphik-
+ Möglichkeiten des EUMEL-Systems. Die Graphik-Pakete ge­
+ hören nicht zum EUMEL-Standard, sondern sind Anwender­
+ pakete, die im Quellcode ausgeliefert und von jeder Installation
+ 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.
+#limit(13.5)##off("italics")#
+
+Das Graphik-System ermöglicht es, durch ELAN-Programme geräteunab­
+hängige Informationen für Zeichnungen ("#ib#Graphiken#ie#") 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
+entspricht 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 Graphi­
+ken existiert der Typ PICTURE, für die Darstellung der Bilder gibt es den Typ
+PICFILE. Dabei müssen Ausschnitt, Maßstab, Betrachtungswinkel und Pro­
+jektionsart erst bei der Darstellung festgelegt werden. Diese Konstruktion 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 erzeugt
+ 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.
+#free(2.0)#
+#ib(9)##type("triumb14")#Erzeugung von Bildern#ie(9)#
+#type("trium10")#
+
+Bilder entstehen in Objekten vom Datentyp
+
+#type("modern12")#
+ PICTURE
+#type("trium10")#
+
+Diese müssen mit der Prozedur
+
+#type("modern12")#
+ nilpicture
+#type("trium10")#
+
+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
+
+#type("modern12")#
+ pen
+#type("trium10")#
+
+genau ein virtueller Stift zugeordnet oder der aktuelle Stift erfragt werden.
+
+Die Erzeugung eines Bildes basiert auf dem Modell eines Plotters. Der (virtuelle)
+Zeichenstift kann mit
+
+#type("modern12")#
+ move
+#type("trium10")#
+
+ohne zu zeichnen an beliebige Stellen gefahren werden (reine Positionierung).
+Mit
+
+#type("modern12")#
+ draw
+#type("trium10")#
+
+wird der Stift veranlaßt, eine Linie von der aktuellen zur angegebenen Zielposi­
+tion 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
+
+#type("modern12")#
+ where
+#type("trium10")#
+
+die die aktuelle Stiftposition liefert.
+#free(2.0)#
+#ib(9)##type("triumb14")#Manipulation von Bildern#ie(9)#
+#type("trium10")#
+
+Erstellte Bilder können als Ganzes manipuliert werden. Die Prozeduren
+
+#type("modern12")#
+ translate (* verschieben *)
+ stretch (* strecken bzw. stauchen *)
+ rotate (* drehen *)
+ reflect (* spiegeln *)
+#type("trium10")#
+
+verändern jeweils das ganze Bild. Es ist aber auch möglich, mehrere Bilder
+zusammenzufügen. Mit
+
+#type("modern12")#
+ CAT
+#type("trium10")#
+
+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.
+#free(2.0)#
+#ib(9)##type("triumb14")#Darstellung#ie(9)#
+#type("trium10")#
+
+Für die Darstellung der erzeugten Bilder existiert der Typ
+
+#type("modern12")#
+ PICFILE
+#type("trium10")#
+
+Dieser besteht aus max. 128 PICTUREs, die mit den Prozeduren
+
+#type("modern12")#
+ put
+ get
+#type("trium10")#
+
+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
+
+#type("modern12")#
+ picture file
+#type("trium10")#
+
+verwandt. Ein neuer PICFILE enthält genau ein leeres PICTURE. Die Darstellung
+der PICFILEs auf Zeichengeräten erfolgt mit der Prozedur
+
+#type("modern12")#
+ plot
+#type("trium10")#
+
+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
+
+#type("modern12")#
+ select pen
+#type("trium10")#
+
+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 zuordnet,
+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
+
+#type("modern12")#
+ viewport
+#type("trium10")#
+
+festgelegt werden. Voreingestellt ist das Quadrat mit der größtmöglichen Seiten­
+länge, d.h. der kürzeren Seite der hardwaremäßigen Zeichenfläche.
+#free(2.0)#
+#ib(9)##type("triumb14")#Darstellung zweidimensionaler Graphik#ie(9)#
+#type("trium10")#
+
+Bei der Darstellung zweidimensionaler Bilder muß der zu zeichnende Ausschnitt
+(das 'Fenster') angegeben werden. Mit der Prozedur
+
+#type("modern12")#
+ window
+#type("trium10")#
+
+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' stan­
+dardmäßig das maximale Zeichenquadrat voreingestellt ist, wird in diesem Fall
+durch gleiche X- und Y-Fenstergröße eine winkeltreue Darstellung erreicht.
+#free(2.0)#
+#ib(9)##type("triumb14")#Darstellung dreidimensionaler Graphik#ie(9)#
+#type("trium10")#
+
+Im dreidimensionalen Fall wird das Fenster ebenfalls mit
+
+#type("modern12")#
+ window
+#type("trium10")#
+
+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 Darstel­
+lungsparameter angegeben werden. Der Betrachtungswinkel wird mit Hilfe der
+Prozedur
+
+#type("modern12")#
+ view
+#type("trium10")#
+
+angegeben. Zur Spezifikation der gewünschten Projektionsart gibt es
+
+#type("modern12")#
+ orthographic (* orthographische Projektion *)
+ perspective (* perspektivische Projektion,
+ der Fluchtpunkt ist frei wählbar *)
+ oblique (* schiefwinklige Projektion *)
+#type("trium10")#
+#free(2.0)#
+#ib(9)##type("triumb14")#Beispiel (Sinuskurve)#ie(9)#
+#type("modern12")#
+
+ 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) .
+#type("trium10")#
+#free(2.0)#
+#ib(9)##type("triumb14")#Beispiel (Würfel)#ie(9)#
+#type("modern12")#
+
+ 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).
+#type("trium10")#
+#free(2.0)#
+#ib(9)##type("triumb14")#Beschreibung der Graphik-Prozeduren#ie(9)#
+#type("trium10")#
+
+ #limit(12.0)##on("italics")#Zweidimensionale PICTUREs brauchen weniger Speicherplatz
+ als dreidimensionale. Daher werden in einigen Fehlermeldun­
+ gen unterschiedliche Größen angegeben.
+#limit(13.5)##off("italics")#
+
+:=
+ 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.
+
+#ib#CAT#ie#
+ 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.
+
+#ib#act picture#ie#
+ PICTURE PROC act picture (PICFILE VAR p)
+ Zweck: Liefert das PICTURE des PICFILEs 'p', auf das mit 'backward' o.ä.
+ positioniert wurde.
+
+#ib#backward#ie#
+ 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.
+
+#ib#draw#ie#
+ 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 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 (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 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)
+
+ 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)
+
+#ib#eof#ie#
+ BOOL PROC eof (PICFILE CONST p)
+ Zweck: Liefert 'TRUE' wenn hinter das Ende des PICFILEs positioniert
+ wurde.
+
+#ib#extrema#ie#
+ 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.
+
+#ib#forward#ie#
+ 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.
+
+#ib#get#ie#
+ 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.
+
+#ib#move#ie#
+ 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 automatisch 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 automatisch auf
+ das nächste umgeschaltet.
+ Fehlerfall:
+ * picfile overflow
+ Das letzte PICTURE ist voll (z. Zeit max. 128 PICTUREs)
+
+#ib#nilpicture#ie#
+ PICTURE PROC nilpicture
+ Zweck: Die Prozedure liefert ein leeres PICTURE zur Initialisierung.
+
+#ib#oblique#ie#
+ 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.
+
+#ib#orthographic#ie#
+ PROC orthographic (PICFILE VAR p)
+ Zweck: Bei dem (dreidimensionalen!) Bild 'p' wird "orthografisch" als Pro­
+ jektionsart eingestellt. Bei der orthografischen Projektion wird ein
+ dreidimensionaler Körper mit parallelen Strahlen senkrecht auf die
+ Projektionsebene abgebildet.
+
+#ib#pen#ie#
+ 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.
+
+#ib#perspective#ie#
+ 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.
+
+#ib#pic no#ie#
+ INT PROC pic no (PICFILE CONST p)
+ Zweck: Liefert die Nummer des aktuellen PICTUREs.
+
+#ib#picture file#ie#
+ DATASPACE PROC picture file (TEXT CONST name)
+ Zweck: Die Prozedur dient zur Assoziation eines benannten Datenraumes mit
+ einem PICFILE (s. Operator ':=').
+
+#ib#plot#ie#
+ 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.
+
+ #on("bold")#Zweidimensional:
+#off("bold")#
+ obligat: 'window' (zweidimensional)
+ optional: 'view' (zweidimensional)
+ 'select pen'
+ 'viewport'
+
+ #on("bold")#Dreidimensional:
+#off("bold")#
+ obligat: 'window' (dreidimensional)
+ optional: 'view' (dreidimensional)
+ 'orthographic', 'perspective', 'oblique'
+ 'viewport'
+ 'select pen'
+
+#ib#put#ie#
+ 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)
+
+#ib#reset#ie#
+ PROC reset (PICFILE VAR p)
+ Zweck: Positioniert auf den Anfang eines Picfiles.
+
+#ib#rotate#ie#
+ 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.
+
+#ib#select pen#ie#
+ 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 Vereinbarun­
+ gen:
+
+ 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
+
+#ib#size#ie#
+ INT PROC size (PICFILE CONST p)
+ Zweck: Liefert die aktuelle Größe eines PICFILEs in Bytes.
+
+#ib#stretch#ie#
+ 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.
+
+#ib#translate#ie#
+ 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
+
+#ib#two dimensional#ie#
+ PROC two dimensional (PICFILE VAR p)
+ Zweck: Setzt als Projektionsart zweidimensional.
+
+#ib#view#ie#
+ 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 eigentli­
+ che 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 Darstellungsfenster
+ ('window') gedreht werden. Bei 'view' verändern sich die Koordina­
+ ten der Punkte nicht, d.h. das Fenster wird mitgedreht.
+
+#ib#viewport#ie#
+ 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
+
+#type("modern12")#
+ 'hormin' - 'hormax' in der Horizontalen,
+ 'vertmin' - 'vertmax' in der Vertikalen.
+#type("trium10")#
+
+ 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
+
+#type("modern12")#
+ viewport (0.0, 1.0, 0.0, 1.0),
+#type("trium10")#
+
+ 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 'view­
+ port' 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 quadratisches
+ 'viewport' gewählt.
+
+#ib#where#ie#
+ 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
+
+#ib#window#ie#
+ 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-Koordi­
+ naten 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 Zeichenfläche
+ abgebildet. (Das ist standardmäßig das größtmögliche Quadrat auf
+ dem ausgewählten Gerät).
+
+ Der Darstellungsmaßstab ergibt sich als
+
+#type("modern12")#
+ x max - x min
+ -----------------------------------------
+ horizontale Seitenlänge der Zeichenfläche
+
+ y max - y min
+ -----------------------------------------
+ vertikale Seitenlänge der Zeichenfläche
+#type("trium10")#
+
+ 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 vorein­
+ gestellt.
+
+ 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 Projektionsart (ortho­
+ grafisch, perspektivisch oder schiefwinklig) und den Betrachtungs­
+ winkeln (s. 'view') auf die spezifizierte Zeichenflä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.
+
+#ib#write is possible#ie#
+ 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/graphic/GRAPHIK.book b/doc/graphic/GRAPHIK.book
new file mode 100644
index 0000000..435d9e4
--- /dev/null
+++ b/doc/graphic/GRAPHIK.book
@@ -0,0 +1,897 @@
+#type ("times8")##limit (11.0)##start (2.2, 1.5)##pagelength (17.4)##block#
+
+#head#
+#type ("triumb14")#
+#center#EUMEL-Grafik-System
+
+#type ("times8")#
+#end#
+#type ("triumb14")# Teil 10: Graphik#type ("times8")#
+
+
+#type ("trium12")#
+#on("b")#1. Übersicht#off("b")#
+#type ("times8")#
+
+#limit (7.0)##type("times6")#
+ #on("i")#Dieser Teil des Benutzer-Handbuchs beschreibt die Graphik-
+ Fähigkeiten des EUMEL-Systems. Die Graphik-Pakete gehö­
+ ren nicht zum Eumel-Standard, sondern sind Anwenderpake­
+ te, die im Quellcode ausgeliefert und von jeder Installation in das
+ System aufgenommen werden können. #off("i")#
+#limit (11.0)#
+#foot#
+ Eventuell müssen Programme erstellt werden, die die Anpassungen für spezielle graphische Geräte einer Installation
+ vornehmen, soweit diese nicht von den EUMEL-Anbietern bezogen werden können.
+#end#
+
+#type("times8")#
+ Das #on("b")#Graphik-System#off("b")# ermöglicht es, durch ELAN-Programme geräteunabhängige Infor­
+ mationen für Zeichnungen (#on("i")#Graphiken#off("i")#) zu erstellen. Die Graphik erzeugenden Programme
+ brauchen dabei keine geräteabhängigen Größen oder 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. Im dreidimensiona­
+ len Fall sind perspektivische, orthografische und schiefwinklige Projektionen mit beliebi­
+ gen Betrachtungswinkeln möglich.
+
+ Bei der EUMEL-Graphik wird streng zwischen Erzeugung und Manipulation von Gra­
+ phiken auf der einen und der Darstellung der erzeugten Bilder auf der anderen Seite
+ unterschieden. Für die Erzeugung und Manipulation der Graphiken wird von den Paketen
+ #on("i")#picture#off("i")# und #on("i")#picfile#off("i")# der Datentype #on("b")#PICTURE#off("b")# bzw. #on("b")#PICFILE#off("b")# zur Verfügung gestellt. Dabei
+ müssen Ausschnitt, Maßstab, Betrachtungswinkel und Projektionsart erst bei der Darstel­
+ lung festgelegt werden. Diese Konstruktion des Graphik-Systems hat folgende Vorteile:
+
+ a) Programme, die Graphik-Information erzeugen, sind geräteunabhängig. Das bedeu­
+ tet, das der Programmierer sich ausschließlich mit einem logischen Problem befassen
+ muß und nicht mit gerätespezifischen Besonderheiten.
+
+ b) Graphiken können auf mehreren unterschiedlich gearteten Geräten mehrmals darge­
+ stellt werden, ohne daß das erzeugende Programm geändert oder neu gestartet werden
+ muß. Z.B. kann ein Programmierer eine Graphik erst auf dem Terminal überprüfen,
+ bevor er die Graphik auf einem Plotter zeichnen läßt.
+
+ c) Graphiken können leicht geändert (z. B. vergrößert oder in eine Richtung gestreckt
+ o.ä.) werden, ohne daß sie erneut erzeugt werden müssen. Zudem können Graphiken
+ aneinander oder übereinander gelegt werden.
+
+ d) Graphiken mit unterschiedlichen Farben, Strichen usw. können leicht erzeugt werden.
+
+ e) Der Anschluß von neuen Graphik.Geräten durch Benutzer ist leicht möglich, ohe daß
+ die Graphik-Programme geändert 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.
+
+ h) Es können auch auf Systemen ohne graphische Ausgabegeräte Graphiken erzeugt
+ werden.
+
+ i) Es können mit einfachen Mitteln universelle Unterprogrammpakete erstellt werden,
+ um die Standardzeichnungen (Darstellen einer Funktion, Balken oder Liniendiagram­
+ me, Achsen etc.) zu erstellen.
+
+
+#type ("trium12")#
+#on("b")#2. Erzeugung von Bildern#off("b")#
+#type ("times8")#
+
+ Bilder entstehen in Objektion vom Datentyp #on("b")#PICTURE#off("b")#. Diese müssen mit der Prozedur
+ #on("i")#nilpicture#off("i")# initialisiert werden. Sie enthalten dann ein leeres Bild, dessen Dimension noch
+ nicht festgelegt ist. Die Dimension eines #on("i")#PICTURE#off("i")#s wird mit dem ersten Schreibzugriff
+ (#on("i")#move, draw#off("i")# o.ä.) festgelegt. Ein #on("i")#PICTURE#off("i")# kann immer nur entweder zwei- oder
+ dreidimensional sein.
+ Außerdem kann einem #on("i")#PICTURE#off("i")# mit der Prozedur #on("i")#pen#off("i")# genau ein virtueller Stift zugeord­
+ net oder der aktuelle Stift erfragt werden (Standardeinstellung: 1).
+
+ Für Erzeugung eines Bildes wird ein virtueller Zeichenstift benutzt, dem bei der Darstel­
+ lung jeweils genau ein realer Stift zugeordnet wird. Dieser Stift kann mit der Prozedur
+ #on("b")#move#off("b")# oder #on("b")#move r #off("b")#auf eine bestimmte Stelle positioniert werden ohne zu zeichnen. Mit
+ #on("b")#draw#off("b")# oder #on("b")#draw r#off("b")# wird eine Linie von der letzten Position zur angegebene Position
+ gezeichnet. Die aktuelle Stiftposition kann dabei mit #on("b")#where#off("b")# abgefragt werden.
+ Außerdem existiert noch die Prozedur #on("b")#draw#off("b")# die einen Text zur Beschriftung der Zeich­
+ nung darstellt, sowie #on("b")#bar#off("b")# zum Zeichnen eines Balkens für Balkendiagramme, #on("b")#circle#off("b")# zum
+ Zeichnen eines Kreisbogens für Kreisdiagramme und #on("b")#mark#off("b")# zum Markiern von Positionen.
+ Dabei wird die aktuelle Stiftposition aber nicht verändert.
+
+#type ("trium12")#
+#on("b")#3. Manipulation von PICTUREs#off("b")#
+#type ("times8")#
+
+ Erstellte PICTUREs können auch als Ganzes manipuliert werde. Dazu dienen die Prozedu­
+ ren #on("b")#translate, stretch#off("b")# und #on("b")#rotate#off("b")#. Es ist auch möglich mehrere PICTURE mit dem Opera­
+ tor #on("b")#CAT#off("b")# aneinanderzufügen, wenn beide PICTURE die gleiche Dimension haben. In
+ solcherart manipulierten Bildern kann ohne Einschränkung weitergezeichnet werden,
+ solange die maximale Größe nicht überschritten wird.
+
+#type ("trium12")#
+#on("b")#4. Darstellung und Speicherung #off("b")#
+#type ("times8")#
+
+ Für die Darstellung und Speicherung der erzeugten Bilder existiert der Typ #on("b")#PICFILE#off("b")#.
+ Dieser besteht aus eienm Datenraum mit max. 1024 PICTUREs, die mit den Prozeduren #on("b")#
+ delete picture, insert picture, read picture, write picture, get picture#off("b")# und #on("b")#put picture#off("b")# einge­
+ geben bzw. ausgegeben werden können.
+ Für die Positionierung innerhalb eines PICFILES stehen die Prozeduren #on("b")#to pic, up, down,
+ eof, picture no, pictures#off("b")# zur Verfügung.
+ Für die Assoziation mit einem benannten Datenraum existiert ähnlich wie beim Datentyp
+ FILE die Prozedur #on("b")#picture file#off("b")#; unbenannte Datenräume können mit dem Operator #on("b")#:=#off("b")#
+ assoziert werden.
+ Die Darstellung des PICFILES auf einem Zeichengerät erfolgt mit der Prozdur #on("b")#plot#off("b")#.
+ Da die Graphiken aber in #on("i")#Weltkoordinaten#off("i")# erzeugt werden und die spätere Darstellung
+ vollkommen unbeachtet bleibt, müssen gewisse Darstellungsparameter für die Zeichnung
+ gesetzt werden. Dies Parameter werden im PICFILE abgelegt und gelten jeweils für alle
+ darin enthaltenen PICTURE. Dadurch ist es möglich, einen PICFILE mit spezifierter
+ Darstellungsart über einen SPOOLER an einen Plotter zu senden oder die bei der letzten
+ Betrachtung gewählte Darstellung beizubehalten oder zu ändern.
+ Für die Darstellung können den virtuellen Stiften mit der Prozedur #on("b")#select pen#off("b")# reale Stifte
+ zugeordnet werden. Voreingestellt ist für alle virtuellen Stifte die Standardfarbe, Standard­
+ stärke und durchgängige Linie. Mit #on("b")#background#off("b")# kann eine bestimmte Hintergrundfarbe
+ gewählt werden.
+ Indem man einem PICTURE den Stift 0 zuordnet, kann man dieses auch Ausblenden
+ wenn es bei dieser Darstellung stört.
+ Die Größe der realen Zeichenfläche kann mit #on("b")#viewport#off("b")# eingestellt werden, wobei die
+ gesamte Zeichenfäche voreingestellt ist. Dadurch können auch mehrere PICFILE auf ein
+ Blatt oder einen Bildschirm gezeichnet werden, wenn man durch Angabe von #on("i")#background
+  (0)#off("i")# das Löschen der Zeichenfläche unterdrückt.
+
+
+#type ("trium12")#
+#on("b")#5. Darstellung zweidimensionaler Graphik#off("b")#
+#type ("times8")#
+
+ Bei der Darstellung zweidimensionaler Bilder muß der zu zeichnende Ausschnitt (das
+ #on("i")#Fenster#off("i")#) angegeben werden. Mit der Prozedur #on("b")#window#off("b")# wird durch Angabe der minimalen
+ und maximalen X- bzw. Y-Koordinaten ein Fenster definiert. Linien, die über dieses
+ Fenster hinausgehen, werden abgeschnitten. Dadurch kann man einen beliebigen Detailaus­
+ schnitt eines Bildes ausgeben, ohne das Bild neu generieren zu müssen.
+ Da das so definierte Fenster auf die mit #on("i")#viewport#off("i")# definierte Zeichenfläche abgebildet wird,
+ ist der Abbildungsmaßstab durch das Zusammenspiel von #on("i")#viewport#off("i")# und #on("i")#window#off("i")# bestimmt.
+ Wenn eine Winkeltreue Darstellung erreicht werdenn soll, muß das Verhältnis der durch
+ #on("i")#viewport#off("i")# eingestellten Breite und Höhe und das Verhältnis des durch #on("i")#window#off("i")# eingestellten
+ Ausschnitts gleich sein.
+
+#type ("trium12")#
+#on("b")#6. Darstellung dreidimensionaler Graphik#off("b")#
+#type ("times8")#
+
+ Bei dreidimensionalen Zeichnungen wird das Fenster ebenfalls mit #on("b")#window#off("b")# definiert,
+ wobei dann allerdings auch der Wertebereich der dritten Dimension (Z-Koordinaten) zu
+ berücksichtigen ist. Auch hierbei werden Linien, die über die spezifierte Darstellungs­
+ fläche hinausgehen abgeschnitten. Das Abschneiden erfolgt allerdings erst nach der Projek­
+ tion auf die Darstellungsfläche, so daß auch Vektoren zu sehen sind, die über das mit
+ #on("i")#window#off("i")# angegebene Quader hinausgehen, wenn ihre Projektion innerhalb der Zeichen­
+ fläche liegt.
+ Da die dreidimensionale Graphik auf eine zweidimensionale Fläche projeziert wird,
+ können aber noch weitere Darstellungsparameter angegeben werden. Der Betrachtungswin­
+ kel wird mit Hilfe der Prozedur #on("b")#view#off("b")# angegeben. Ebenfalls kann mit #on("b")#view#off("b")# der Winkel der
+ Y-Achse zur Horizontalen angegeben werden.
+ Zur Spezifikation der gewünschten Projektionsart existieren #on("b")#orthographic#off("b")# (orthographische
+ Projektion), #on("b")#perspective#off("b")# (perspektivische Projektion, der Fluchtpunkt ist frei wählbar) und
+ #on("b")#oblique#off("b")# (schiefwinklige Projektion).
+
+#page#
+#type ("trium12")#
+#on("b")#7. Beispiele#off("b")#
+#type ("times8")#
+
+ #on("u")#Sinuskurve#off("u")#
+
+#type("micro")#
+initialisiere picfile;
+zeichne überschrift;
+zeichne achsen;
+zeichne sinuskurve;
+wähle darstellung;
+plot (p) .
+
+initialisiere picfile:
+ PICFILE VAR p :: picture file ("SINUS") .
+
+zeichne überschrift:
+ PICTURE VAR überschrift :: nilpicture;
+ move (überschrift, -pi/2.0, 1.0);
+ draw (überschrift, "sinus (x) [-pi, +pi]", 0.0, 1.0, 0.6);
+ put picture (p, überschrift) .
+
+ zeichne achsen:
+ PICTURE VAR achsen :: nilpicture;
+ zeichne x achse;
+ zeichne y achse;
+ put picture (p, achsen) .
+
+ zeichne x achse:
+ move (achsen, -pi, 0.0);
+ draw (achsen, pi, 0.0) .
+
+ zeichne y achse:
+ move (achsen, 0.0, -1.0);
+ draw (achsen, 0.0, +1.0) .
+
+ zeichne sinuskurve:
+ PICTURE VAR sinus :: nilpicture;
+ REAL VAR x :: -pi;
+
+ move (sinus, x, sin (x));
+ REP x INCR 0.1;
+ draw (sinus, x, sin (x))
+ UNTIL x >= pi PER;
+
+ put picture (p, sinus) .
+
+ wähle darstellung:
+ window (p, -pi, pi, -1.0, 1.3);
+ viewport (p, 0.0, 0.0, 0.0, 0.0) .
+
+#page#
+#type ("times8")#
+ #on("u")#Achsenkreuz#off("u")#
+
+#type("micro")#
+initialisiere picfile;
+zeichne die x achse;
+zeichne die y achse;
+zeichne die z achse;
+stelle das achsenkreuz dar .
+
+initialisiere picfile:
+ PICFILE VAR p :: picture file ("KREUZ") .
+
+ zeichne die x achse:
+ PICTURE VAR x achse := nilpicture;
+ move (x achse, -1.0, 0.0, 0.0);
+ draw (x achse, "-X", 0.0, 0.0, 0.0);
+ draw (x achse, 1.0, 0.0, 0.0);
+ draw (x achse, "+X", 0.0, 0.0, 0.0);
+ put picture (p, x achse) .
+
+ zeichne die y achse:
+ PICTURE VAR y achse := nilpicture;
+ move (y achse, 0. 0, -1.0, 0.0);
+ draw (y achse, "-Y", 0.0, 0.0, 0.0);
+ draw (y achse, 0.0, 1.0, 0.0);
+ draw (y achse, "+Y", 0.0, 0.0, 0.0);
+ put picture (p, y achse) .
+
+ zeichne die z achse:
+ PICTURE VAR z achse := nilpicture;
+ move (z achse, 0. 0, 0.0, -1.0);
+ draw (z achse, "-Z", 0.0, 0.0, 0.0);
+ draw (z achse, 0.0, 0.0, 1.0);
+ draw (z achse, "+Z", 0.0, 0.0, 0.0);
+ put picture (p, z achse) .
+
+ stelle das achsenkreuz dar:
+ viewport (p, 0. 0, 1.0, 0.0, 1.0);
+ window (p, -1.1, 1.1, -1.1, 1.1);
+ oblique (p, 0.25, 0.15);
+ plot (p) .
+
+#foot#
+ #type("times6")#
+ Diese beiden Beispielprogramme befinden sich ebenfalls auf dem STD-Archive unter dem Namen #on("i")#Beispiel.Sinus#off("i")# und
+ #on("i")#Beispiel.Kreuz#off("i")#.
+#end#
+
+#page#
+#type ("triumb14")# Beschreibung der Graphik-Prozeduren
+#type ("times8")#
+
+
+#type ("trium12")#
+#on("b")#1. PICTURE-Prozeduren#off("b")#
+#type ("times8")#
+
+#limit (7.0)##type("times6")#
+ #on("i")#Zweidimensionale PICTURES brauchen weniger Speicherplatz
+ als dreidimensionale. Daher werden in einigen Fehlermeldungen
+ unterschiedliche Größen angegeben.
+
+#limit (11.0)##type("times8")#
+
+#type("times10")##on("b")#:=#off("b")##type("times8")#
+ OP := (PICTURE VAR l, PICTURE CONST r)
+ Zweck: Zuweisung
+
+#type("times10")##on("b")#CAT#off("b")##type("times8")#
+ OP CAT (PICTURE VAR l, PICTURE CONST r)
+ Zweck: Aneinanderfügen von zwei PICTURE.
+ Fehlerfälle:
+ * left dimension <> right dimension
+ Es können nur PICTURE mit gleicher Dimension angefügt werden.
+ * Picture overflow
+ Die beiden PICTURE überschreiten die maximale Größe eines PICTURE.
+
+#type("times10")##on("b")#nilpicture#off("b")##type("times8")#
+ PICTURE PROC nilpicture
+ Zweck: Die Prozedur liefert ein leeres PICTURE zur Initialisierung.
+
+ PICTURE PROC nilpicture (INT CONST pen)
+ Zweck: Die Prozedur liefert ein leeres PICTURE mit dem Stift #on("i")#pen#off("i")# zur Initialisierung.
+
+#type("times10")##on("b")#draw#off("b")##type("times8")#
+ PROC draw (PICTURE VAR p, TEXT CONST text, REAL CONST angle, height, ­
+ width)
+ Zweck: Der angegebene Text wird unter dem Winkel #on("i")#angle#off("i")# gegenüber der Waagerech­
+ ten mit der Zeichenhöhe #on("i")#hight#off("i")# und der Breite #on("i")#width#off("i")# gezeichnet. #on("i")#angle#off("i")# wird in
+ Winkelgrad angegeben. #on("i")#height#off("i")# und #on("i")#width#off("i")# werden in #on("i")#Prozenten#off("i")# der Breite bzw.
+ Höhe der Zeichenfläche angegeben, bei 0 wird
+ die Standardhöhe- und breite angenommen.
+ Der Anfang ist dabei die aktuelle Stiftposition, die nicht verändert wird. Es könne
+ auch die Steuerzeichen ""1"", ""2"", ""3"", ""10"", ""13"" benutzt werden,
+ wobei sie immer in der Richtung #on("i")#angle#off("i")# wirken.
+ Fehlerfälle:
+ * Picture overflow
+ Der Text paßt nicht mehr in das PICTURE.
+
+#type("times10")##on("b")#draw#off("b")##type("times8")#
+ PROC draw (PICTURE VAR p, REAL CONST x, y, z)
+ Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y, z).
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is two dimensional
+
+ PROC draw (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y).
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+#type("times10")##on("b")#draw r#off("b")##type("times8")#
+ PROC draw r (PICTURE VAR p, REAL CONST x, y, z)
+ Zweck: Zeichnen einer Linie der Länge (x, y, z) relativ zur aktuellen Position.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is two dimensional
+
+ PROC draw r (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Zeichnen einer Linie der Länge (x, y) relativ zur aktuellen Position.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+#type("times10")##on("b")#move#off("b")##type("times8")#
+ PROC move (PICTURE VAR p, REAL CONST x, y, z)
+ Zweck: Die aktuelle Position wird auf (x, y, z) gesetzt.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is two dimensional
+
+ PROC move (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Die aktuelle Position wird auf (x, y) gesetzt.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+#type("times10")##on("b")#move r#off("b")##type("times8")#
+ PROC move r (PICTURE VAR p, REAL CONST x, y, z)
+ Zweck: Die aktuelle Position wird um (x, y, z) erhöht.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is two dimensional
+
+ PROC move r (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Die aktuelle Position wird um (x, y) erhöht.
+ Position.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+
+#type("times10")##on("b")#bar#off("b")##type("times8")#
+ PROC bar (PICTURE VAR p, REAL CONST width, hight, INT CONST pattern):
+ Zweck: Die Prozedur zeichnet an der aktuellen Position einen Balken mit dem Muster
+ #on("i")#pattern#off("i")#:
+ 0 = Leerer Balken
+ 1 = Gepunkteter Balken
+ 2 = Gefüllter Balken
+ 3 = Horizontale Linien
+ 4 = Vertikale Linien
+ 5 = Gekreuzte Linien
+ 6 = Diagonale Linien von Links nach Rechts
+ 7 = Diagonale Linien von Rechts nach Links
+ 8 = Gekreuzte diagonale Linien
+ > 8 = nicht normiertes Sondermuster
+ Die aktuelle Stiftposition wird dabei nicht verändert.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+ PROC bar (PICTURE VAR p, REAL CONST from, to, hight, INT CONST pattern):
+ Zweck: Die Prozedur zeichnet einen Balken von der Position #on("i")#from#off("i")# zur Position #on("i")#to#off("i")# und der
+ Höhe #on("i")#height#off("i")# mit dem Muster #on("i")#pattern#off("i")#.
+ s.o.
+
+#type("times10")##on("b")#circle#off("b")##type("times8")#
+ PROC circle (PICTURE VAR p, REAL CONST radius, from, to, INT CONST pattern)
+ Zweck: Die Prozedur zeichnet an der aktuellen Position ein Kreissegment vom Winkel
+ #on("i")#from#off("i")# bis #on("i")#to#off("i")# (im Gradmaß) mit dem Muster #on("i")#pattern#off("i")# (s.o.). Der #on("i")#radius#off("i")# wird in
+ Prozenten der Diagonalen der Zeichenfläche angegeben.
+ Die aktuelle Stiftposition wird dabei nicht verändert. Dieses Kreissegment ist in
+ jedem Fall 2-dimensional, so das es durch Drehungen nicht verändert wird.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+#type("times10")##on("b")#mark#off("b")##type("times8")#
+ PROC mark (PICTURE VAR p, REAL CONST size, INT CONST no)
+ Zweck: Es wird ein Marker mit der Größe #on("i")#size#off("i")# in Prozenten der Diagonalen der Zeichen­
+ fläche an der aktuellen Stiftposition ausgegeben, ohne diese zu verändern. Es
+ sollten dabei mindestens 10 verschiedene Marker gewählt werden können.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+
+#type("times10")##on("b")#dim#off("b")##type("times8")#
+ INT PROC dim (PICTURE CONST pic)
+ Zweck: Liefert die Dimension eines PICTURE.
+
+#type("times10")##on("b")#pen#off("b")##type("times8")#
+ INT PROC pen (PICTURE CONST p)
+ Zweck: Liefert den virtuellen Stift des PICTURE
+
+ PICTURE PROC pen (PICTURE CONST p, INT CONST pen)
+ Zweck: Setzen des (virtuellen) Stiftes eines PICTURE.
+ Bei #on("i")#pen#off("i")# = 0 wird das Picture nicht gezeichnet.
+ Fehlerfälle:
+ * pen out of range
+ Der gewünschte Stift ist kleiner als 0 oder größer als 16.
+
+#type("times10")##on("b")#extrema#off("b")##type("times8")#
+ PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y max)
+ Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE.
+ Fehlerfälle:
+ * Picture is three dimensional
+
+ PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y max,  
+ z min, z max)
+ Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE.
+ Fehlerfälle:
+ * Picture is two dimensional
+
+#type("times10")##on("b")#where#off("b")##type("times8")#
+ PROC where (PICTURE CONST p, REAL VAR x, y, z)
+ Zweck: Die Prozedur liefert die aktuelle Stiftposition.
+ Fehlerfälle:
+ * Picture is two dimensional
+
+ PROC where (PICTURE CONST p, REAL VAR x, y, z)
+ Zweck: Die Prozedur liefert die aktuelle Stiftposition. Fehlerfälle:
+ * Picture is three dimensional
+
+#type("times10")##on("b")#rotate#off("b")##type("times8")#
+ PROC rotate (PICTURE VAR p, REAL CONST angle)
+ Zweck: Das PICTURE wird um den Punkt (0, 0) um den Winkel #on("i")#angle#off("i")# (im Gradmaß) im
+ mathematisch positiven Sinn gedreht.
+
+ PROC rotate (PICTURE CONST p, REAL CONST phi, theta, lambda)
+ Zweck: Das PICTURE wird um den Winkel #on("i")#lambda#off("i")# um die Drehachse #on("i")#(phi, theta)#off("i")# ge­
+ dreht.
+
+#type("times10")##on("b")#stretch#off("b")##type("times8")#
+ PROC stretch (PICTURE VAR pic, REAL CONST sx, sy)
+ Zweck: Das PICTURE wird in X-Richtung um den Faktor #on("i")#sx#off("i")#, in Y-Richtung um den
+ Faktor #on("i")#sy#off("i")# gestreckt (bzw. gestaucht). Dabei bewirkt der Faktor
+ s > 1 eine Streckung
+ 0 < s < 1 eine Stauchung
+ s < 0 zusätzlich eine Achsenspiegelung.
+ Fehlerfälle:
+ * Picture is three dimensional
+
+ PROC stretch (PICTURE VAR p, REAL CONST sx, sy, sz)
+ Zweck: s. o.
+ Fehlerfälle:
+ * Picture is two dimensional
+
+#type("times10")##on("b")#translate#off("b")##type("times8")#
+ PROC translate (PICTURE VAR p, REAL CONST dx, dy)
+ Zweck: Das PICTURE wird um #on("i")#dx#off("i")# und #on("i")#dy#off("i")# verschoben. Fehlerfälle:
+ * Picture is three dimensional
+
+ PROC translate (PICTURE VAR p, REAL CONST dx, dy, dz)
+ Zweck: Das PICTURE wird um #on("i")#dx, dy#off("i")# und #on("i")#dz#off("i")# verschoben. Fehlerfälle:
+ * Picture is two dimensional
+
+
+#type ("trium12")#
+#on("b")#2. PICFILE-Prozeduren#off("b")#
+#type ("times8")#
+
+#type("times10")##on("b")#plot#off("b")##type("times8")#
+ PROC plot (TEXT CONST name)
+ Zweck: Der PICFILE mit dem Namen #on("i")#name#off("i")# wird entsprechend der angegebenen Dar­
+ stellungsart gezeichnet. Diese Parameter (#on("i")#perspective, orthographic, oblique, view,
+ window etc.#off("i")#) müssen vorher eingestellt werden.
+ Fehlerfälle:
+ * PICFILE does not exist
+ Es existiert kein PICFILE mit dem Namen #on("i")#name#off("i")#
+
+ PROC plot (PICFILE VAR p)
+ Zweck: Der PICFILE #on("i")#p#off("i")# wird entsprechend der angegebenen Darstellungsart gezeichnet.
+ Diese Parameter müssen vorher eingestellt werden:
+
+ #on("b")#zweidimensional:#off("b")#
+ obligat: #on("i")#window#off("i")# (zweidimensional)
+ optional: #on("i")#view#off("i")# (zweidimensional)
+ #on("i")#viewport#off("i")#
+ #on("i")#select pen#off("i")#
+
+ #on("b")#dreidimensional:#off("b")#
+ obligat: #on("i")#window#off("i")# (dreidimensional)
+ optional: #on("i")#view#off("i")# (dreidimensional)
+ #on("i")#orthographic | perspective | oblique#off("i")#
+ #on("i")#viewport#off("i")#
+ #on("i")#select pen#off("i")#
+
+
+#type("times10")##on("b")#select pen#off("b")##type("times8")#
+ PROC select pen (PICFILE VAR p, INT CONST pen, colour, thickness, line type)
+ Zweck: Für die Darstellung des Bildes #on("i")#p#off("i")# soll dem #on("i")#virtuellen#off("i")# Stift #on("i")#pen#off("i")# ein realer Stift
+ zugeordnet werden, der möglichst die Farbe #on("i")#colour#off("i")# und die Dicke #on("i")#thickness#off("i")# hat
+ und dabei Linien mit dem Typ #on("i")#line type#off("i")# zeichnet. Es wird die beste Annäherung
+ für das Ausgabegerät genommen.
+ Dabei gelten folgende Vereinbarungen:
+
+ #on("b")#Farbe:#off("b")# Negative Farben werden XOR gezeichnet (dunkel wird hell und hell wird
+ dunkel), Farbe 0 ist der Löschstift und positive Farben überschreiben
+ (ersetzen) den alten Punkt mit folgenden Werten:
+
+ 1 Standardfarbe des Endgerätes
+ 2 rot
+ 3 blau
+ 4 grün
+ 5 schwarz
+ 6 weiß
+ > 6 nicht normierte Sonderfarben
+
+
+ #on("b")#Dicke:#off("b")# 0 Standardstrichstärke des Endgerätes
+ > 0 Strichstärke in 1/10 mm.
+
+
+ #on("b")#Linientyp:#off("b")#
+ 0 keine sichtbare Linie
+ 1 durchgängige Linie
+ 2 gepunktete Linie
+ 3 kurz gestrichelte Linie
+ 4 lang gestrichelte Linie
+ 5 Strichpunktlinie
+ > 5 nicht normierte Linie
+
+
+ Die hier aufgeführten Möglichkeiten müssen nicht an allen graphischen Endge­
+ räten vorhanden sein. Der geräteabhängige Graphik-Treiber wählt jeweils die
+ bestmögliche Annäherung.
+
+ Fehlerfälle:
+ * pen out of range
+ #on("i")#pen#off("i")# muss im Bereich 1-16 sein.
+
+#type("times10")##on("b")#background#off("b")##type("times8")#
+ PROC background (PICFILE VAR p, INT CONST colour)
+ Zweck: Der Hintergrund wird auf die Farbe #on("i")#colour#off("i")# (s.o.) gesetzt wenn möglich.
+ Bei der Angabe #on("i")#background (p, 0)#off("i")# wird das Löschen des Bildschirms unterdrückt,
+ so daß das Zeichen mehrerer PICFILE auf einem Blatt möglich wird.
+
+ INT PROC background (PICFILE CONST p):
+ Zweck: Liefert die eingestellte Hintergrundfarbe.
+
+#type("times10")##on("b")#view#off("b")##type("times8")#
+ PROC view (PICFILE VAR p, REAL CONST alpha)
+ Zweck: Setzt den Winkel der Y-Achse zur Senkrechten auf #on("i")#alpha#off("i")# Grad, falls diese nicht
+ senkrecht auf der Betrachtungsebene steht.
+
+ PROC view (PICFILE VAR p, REAL CONST phi, theta)
+ Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne dargestellt, son­
+ dern für die Betrachtung gedreht. Mit der Prozedur #on("i")#view#off("i")# kann die Betrachtungs­
+ richtung durch die Polarwinkel #on("i")#phi#off("i")# und #on("i")#theta#off("i")# (im Gradmass) angegeben werden.
+ Voreingestellt ist #on("i")#phi#off("i")# = 0 und #on("i")#theta#off("i")# = 0, d.h. senkrecht von oben (Die #on("i")#X-
+ Achse#off("i")# bildet die Horizontale und die #on("i")#Y-Achse#off("i")# bildet die Vertikale).
+ Im Gegensatz zu #on("i")#rotate#off("i")# hat #on("i")#view#off("i")# keine Wirkung auf das eigentliche Bild (die
+ PICTURE werden nicht verändert), sondern nur auf die gewählte Darstellung. So
+ addieren sich zwar aufeinanderfolgende #on("i")#Rotationen#off("i")#, #on("i")#view#off("i")# aber geht immer von der
+ Nullstellung aus. Auch kann das Bild durch eine #on("i")#Rotation#off("i")# ganz oder teilweise aus
+ oder in das Darstellungsfenster (#on("i")#window#off("i")# gedreht werden. Bei #on("i")#view#off("i")# verändern sich
+ die Koordinaten der Punkte nicht, d. h. das Fenster wird mitgedreht.
+
+ PROC view (PICFILE VAR p, REAL CONST x, y, z)
+ Zweck: Wie oben, nur werden die Winkel nicht in Polarkoordinaten angegeben, sondern
+ es wird die Blickrichtung als Vektor in Karthesischen Koordinaten angegeben.
+ (Der Betrachtungsvektor muß nicht normiert sein).
+
+#type("times10")##on("b")#viewport#off("b")##type("times8")#
+ 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 Zeichen­
+ fläche des Gerätes hat die Koordinaten (0, 0). Die definierte Zeichenfläche er­
+ streckt sich
+
+ #on("i")#hormin - hormax#off("i")# in der Horizontalen,
+ #on("i")#vertmin - vertmax#off("i")# in der Vertikalen.
+
+ So liegt der linke untere Eckpunkt dann bei (#on("i")#hormin, hormax#off("i")#), der rechte obere
+ Eckpunkt bei (#on("i")#hormax, vertmax#off("i")#).
+
+ Damit sowohl geräteunabhängige als auch maßstabgetreue Zeichnungen möglich
+ sind, können die Koordinaten in drei Arten spezifiziert werden:
+ a) #on("b")#Gerätekoordinaten#off("b")#
+ Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei hat die
+ kürzere Seite der physikalischen Zeichenfläche definitionsgemäß die Länge
+ 1.0.
+ b) #on("b")#Absolute Koordinaten#off("b")#
+ Die Werte werden in #on("i")#cm#off("i")# angegeben. Dabei müssen die Maximalwerte aber
+ größer als 2.0 sein, da sonst Fall a) angenommen wird.
+ c) #on("b")#Maximale Zeichenfläche#off("b")# Bei der Angabe (0.0, 0.0, 0.0, 0.0) wird die maxi­
+ male physikalische Zeichenfläche eingestellt.
+
+ Voreingestellt ist
+ viewport (0.0, 0.0, 0.0, 0.0)
+ d.h. die größtmögliche physikalische Zeichenfläche, beginnend mit der linken
+ unteren Ecke.
+ Der Abbildungsmaßstab wird durch das Zusammenspiel von #on("i")#viewport#off("i")# und
+ #on("i")#window#off("i")# festgelegt (s. dort). Dabei ist insbesondere darauf zu achten, daß winkel­
+ treue Darstellung nur bei gleichen Verhältnissen von X-Bereich und Breite bzw.
+ von Y-Bereich und Höhe möglich ist.
+
+
+#type("times10")##on("b")#window#off("b")##type("times8")#
+ 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-Koordinaten im Intervall [#on("i")#x min, x
+ max#off("i")#] und deren Y-Koordinaten im Bereich [#on("i")#y min, y max#off("i")#] liegen, gehören zum
+ definierten Fenster.Vektoren, die außerhalb dieses Fensters liegen, gehen über die
+ durch #on("i")#viewport#off("i")# Fläche hinaus und werden abgeschnitten.
+
+ Der Darstellungsmaßstab ergibt sich als
+
+ #ub#               x max - x min               #ue#
+ horizontale Seitenlänge der Zeichenfläche
+
+
+ #ub#               y max - y min               #ue#
+ vertikale Seitenlänge der Zeichenfläche
+
+ 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 darzustellende Fenster
+ definiert. Alle Bildpunkte, deren X-Koordinaten im Intervall [#on("i")#x min, x max#off("i")#],
+ deren Y-Koordinaten im Bereich [#on("i")#y min, y max#off("i")#] und deren Z-Koordinaten im
+ Bereich [#on("i")#z min, z max#off("i")#] liegen, gehören zum definierten Fenster. Dieses dreidi­
+ mensionale Fenster (#on("i")#Quader#off("i")#) wird entsprechend der eingestellten Projektionsart
+ (orthographisch, perspektivisch oder schiefwinklig) und den Betrachtungswinkeln
+ (s. #on("i")#view#off("i")#) auf die spezifizierte Zeichenfläche abgebildet.
+ Anders als im zweidimensionalen Fall ist das Problem der Maßstaäbe nicht mehr
+ nur durch das Zusammenspiel von #on("i")#window#off("i")# und #on("i")#viewport#off("i")# zu beschreiben. Hier
+ spielen auch die Projektionsart und Darstellungswinkel herein.
+
+#type("times10")##on("b")#oblique#off("b")##type("times8")#
+ PROC oblique (PICFILE VAR p, REAL CONST a, b)
+ Zweck: Bei dem (dreidimensionalen) Bild #on("i")#p#off("i")# wird #on("u")#schiefwinklig#off("u")# als gewünschte Projek­
+ tionsart eingestellt. Dabei ist (#on("i")#a, b#off("i")#) der Punkt auf der X-Y-Ebene, auf den der
+ EinheitsVektor der Z-Richtung abgebildet werden soll.
+
+#type("times10")##on("b")#orthographic#off("b")##type("times8")#
+ PROC orthographic (PICFILE VAR p)
+ Zweck: Bei dem (dreidimensionalen) Bild #on("i")#p#off("i")# wird #on("u")#orthographisch#off("u")# als gewünschte Projek­
+ tionsart eingestellt. Bei der orthographischen Projektion wird ein dreidimensio­
+ naler Körper mit parallelen Strahlen senkrecht auf der Projektionsebene abge­
+ bildet.
+
+#type("times10")##on("b")#perpective#off("b")##type("times8")#
+ PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz)
+ Zweck: Bei dem (dreidimensionalen) Bild #on("i")#p#off("i")# wird #on("u")#perspektivisch#off("u")# als gewünschte Projek­
+ tionsart eingestellt. Der Punkt (#on("i")#cx, 1/cy, cz#off("i")#) ist der Fluchtpunkt der Projektion,
+ d. h. alle Parallen zur Z-Achse schneiden sich in diesem Punkt.
+
+#type("times10")##on("b")#extrema#off("b")##type("times8")#
+ PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max)
+ Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE.
+
+ PROC extrema (PICFILE VAR p, REAL VAR x min,x max,y min,y max,z min,z max)
+ Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE.
+
+#type ("trium12")#
+#on("b")#3. Prozeduren zur Manipulation von PICFILE#off("b")#
+#type("times 8")#
+
+#type("times10")##on("b")#:=#off("b")##type("times8")#
+ OP := (PICFILE VAR l, PICFILE CONST r)
+ Zweck: Zuweisung des PIFILEs #on("i")#r#off("i")# an das PICFILE #on("i")#l#off("i")#
+
+ OP := (PICFILE VAR p, DATASPACE CONST d)
+ Zweck: Assoziert die PICFILE Variable #on("i")#p#off("i")# mit dem Datenraum #on("i")#d#off("i")# und initialisiert die
+ Variable, wenn nötig.
+ Fehlerfälle:
+ * dataspace is no PICFILE
+ Der anzukoppelnde Datenraum hat einen unzulässigen Typ
+
+#type("times10")##on("b")#picture file#off("b")##type("times8")#
+ DATASPACE PROC picture file (TEXT CONST name)
+ Zweck: Assoziaten eines benannten Datenraumes mit einem PICFILE (s.o.).
+
+#type("times10")##on("b")#to pic#off("b")##type("times8")#
+ PROC to pic (PICFILE VAR p, INT CONST pos)
+ Zweck: Positioniert auf das PICTURE Nummer #on("i")#pos#off("i")#.
+ Fehlerfälle:
+ * Position underflow
+ Es wurde eine Position kleiner Null angegeben.
+ * Position after eof
+ Es wurde versucht, hinter das Ende eines PICFILE zu positionieren. Die letzte
+ erlaubte Position ist #on("i")#pictures (p)+1#off("i")#.
+
+#type("times10")##on("b")#up#off("b")##type("times8")#
+ PROC up (PICFILE VAR p)
+ Zweck: Positioniert genau ein PICTURE zurück.
+ Fehlerfall:
+ * Position underflow
+ Es wurde versucht, vor das erste PICTURE zu positionieren
+
+ PROC up (PICFILE VAR p, INT CONST n)
+ Zweck: Positioniert genau #on("i")#n#off("i")# Picture zurück.
+ Fehlerfall:
+ * Position underflow
+ Es wurde versucht, vor das erste PICTURE zu positionieren
+
+#type("times10")##on("b")#down#off("b")##type("times8")#
+ PROC down (PICFILE VAR p)
+ Zweck: Positioniert genau ein PICTURE vorwärts.
+ Fehlerfall:
+ * Position after eof
+ Es wurde versucht, hinter das Ende eines PICFILE zu positionieren. Die letzte
+ erlaubte Position ist #on("i")#pictures (p)+1#off("i")#.
+
+ PROC down (PICFILE VAR p, INT CONST n)
+ Zweck: Positioniert genau #on("i")#n#off("i")# Picture vorwärts.
+ Fehlerfall:
+ * Position after eof
+ Es wurde versucht, hinter das Ende eines PICFILE zu positionieren Die letzte
+ erlaubte Position ist #on("i")#pictures (p)+1#off("i")#.
+
+#type("times10")##on("b")#delete picture#off("b")##type("times8")#
+ PROC delete picture (PICFILE VAR p)
+ Zweck: Löscht das aktuelle PICTURE
+
+#type("times10")##on("b")#insert picture#off("b")##type("times8")#
+ PROC insert picture (PICFILE VAR p)
+ Zweck: Fügt ein PICTURE #on("u")#vor#off("u")# der aktuellen Position ein.
+
+#type("times10")##on("b")#read picture#off("b")##type("times8")#
+ PROC read picture (PICFILE CONST p, PICTURE VAR pic)
+ Zweck: Liest das aktuelle PICTURE.
+
+#type("times10")##on("b")#write picture#off("b")##type("times8")#
+ PROC write picture (PICFILE VAR p, PICTURE CONST pic)
+ Zweck: Schreibt das PICTURE #on("i")#pic#off("i")# auf der aktuellen Position.
+
+#type("times10")##on("b")#put picture#off("b")##type("times8")#
+ PROC put picture (PICFILE VAR p, PICTURE CONST pic)
+ Zweck: Schreibt das PICTURE #on("i")#pic#off("i")# an die aktuelle Position und erhöht diese um 1.
+
+#type("times10")##on("b")#get picture#off("b")##type("times8")#
+ PROC get picture (PICFILE VAR p, PICTURE VAR pic)
+ Zweck: Liest das PICTURE #on("i")#pic#off("i")# an dir aktuellen Position und erhöht diese um 1.
+
+#type("times10")##on("b")#eof#off("b")##type("times8")#
+ BOOL PROC eof (PICFILE CONST p)
+ Zweck: Liefert genau dann #on("i")#TRUE#off("i")#, wenn das Ende eines PICFILE erreicht ist.
+
+#type("times10")##on("b")#picture no#off("b")##type("times8")#
+ INT PROC picture no (PICFILE CONST p)
+ Zweck: Liefert die Nummer des aktuellen PICTURE.
+
+#type("times10")##on("b")#pictures#off("b")##type("times8")#
+ INT PROC pictures (PICFILE CONST p)
+ Zweck: Liefert die Anzahl PICTURE eines PICFILE.
+
+
+#page#
+#type ("trium12")#
+#on("b")#4. Auslieferungsumfang#off("b")#
+#type ("times8")#
+
+ Die EUMEL-GRAPHIK wird auf einer Diskette mit folgendem Inhalt ausgeliefert.
+ Archive #on("i")#Graphik#off("i")#:
+
+ "gen Graphik"
+ "gen Plotter"
+ "GRAPHIK.book"
+ "GRAPHIK.Picfile"
+ "GRAPHIK.Transform"
+ "GRAPHIK.Plot"
+ "GRAPHIK.Plotter"
+ "GRAPHIK.Server"
+ "GRAPHIK.vektor plot"
+ "ZEICHENSATZ"
+ "PC.plot"
+ "HP7475.plot"
+ "Beispiel.Kreuz"
+ "Beispiel.Sinus"
+
+
+
+ #on("u")#Dateiinhalte#off("u")#
+
+ 1. "gen Graphik" Installationsprogramm für Terminals
+ 2. "gen Plotter" Installationsprogramm für Plotter
+ 3. "GRAPHIK.book" enthält diese Beschreibung.
+ 4. "GRAPHIK.Picfile" enthält die Pakete #on("i")#picture#off("i")# und #on("i")#picfile#off("i")#.
+ 5. "GRAPHIK.Transform" stellt das Paket #on("i")#transformation#off("i")# zur Verfügung, in dem
+ interne Prozeduren zur Projektion definiert werden.
+ 6. "GRAPHIK.Plot" definiert die Prozedur #on("i")#plot#off("i")# zur Darstellung eines
+ PICFILES auf dem Terminal
+ 7. "GRAPHIK.Plotter" definiert die Prozedur #on("i")#plotter#off("i")# zur Darstellung eines
+ PICFILES auf dem Plotter
+ 8. "GRAPHIK.Server" Server für einen Plotter-Spool
+ 9. "GRAPHIK.vektor plot" enthält Hilfsprogramme, die bei der Erstellung einer
+ eigenen Terminalanpassung benutzt werden können.
+ 10. "ZEICHENSATZ" enthält einen Zeichensatz für Terminals die im Graphik
+ Modus keinen Text ausgeben können.
+ 11. "PC.plot" Terminalanpassung für IBM-PC und ähnliche.
+ 12. "HP7475.plot" Terminalanpassung für HP7474-Plotter und Geräte mit
+ HP-GL.
+ 13. "Beispiel.Kreuz" Beispielprogramm
+ 14. "Beispiel.Sinus" Beispielprogramm
+
+#type ("trium12")#
+#on("b")#5. Installation#off("b")#
+#type ("times8")#
+
+
+ In der Datei #on("i")#gen Graphik#off("i")# ist ein Installationspragramm enthalten. Nach dem Starten des
+ Programms mit #on("i")#run ("gen Graphik")#off("i")# fragt es nach dem Dateinamen der Terminalanpas­
+ sung.
+ Steht keine Terminalanpassung für ein Endgerät zur Verfügung (und kann auch nicht
+ beschafft werden) so kann man durch Insertieren der Datei #on("i")#GRAPHIK.Picfile#off("i")# lediglich die
+ Leistungen der Pakete #on("i")#Picture#off("i")# und #on("i")#Picfile#off("i")# nutzen, ohne die erzeugten Graphiken darstellen
+ zu können.
+ Zur Benutzung eines #on("i")#Plotters#off("i")# über einen Spooler wird die Datei #on("i")#gen Plotter#off("i")# gestartet.
+
+
+ Beispiel:
+ 1. archive ("Graphik")
+ 2. fetch all (archive)
+ 3. release (archive)
+ 4. run ("gen Graphik")
+ <-- PC.Plot
+
+
+#type ("trium12")#
+#on("b")#6. Besonderheiten der PC.plot-Anpassung#off("b")#
+#type ("times8")#
+
+
+ Da der IBM-PC verschiedene Graphik- und Text-Modi kennt, wird durch das Pro­
+ gramm #on("i")#PC.plot#off("i")# die Prozedur #on("i")#graphik#off("i")# zusätzlich zur Verfügung gestellt. Sie erlaubt es den
+ PC in verschiedenen Graphik-Modi zu betreiben.
+
+ PROC graphik (INT CONST modus, pause)
+
+ Modus: 0 --- Keine Graphik (normaler Textmodus)
+ 1 --- hochauflösende Graphik, 50 Zeilen,
+ 640 * 400 Punkte, einfarbig
+ 2 --- hochauflösende Graphik, 25 Zeilen,
+ 640 * 400 Punkte, einfarbig
+ 3 --- mittlere Auflösung, 640 * 200 Punkte, 3 Farben
+ 4 --- IBM-PC Auflösung, 320 * 200 Punkte, 3 Farben.
+
+ Pause: Da der PC bei #on("i")#end plot#off("i")# wieder in den Normalmodus umschaltet und die Graphik
+ dann nicht mehr zu sehen ist, kann man eine #on("i")#pause#off("i")# angeben. Die hier eingestellte
+ Zeit ist aber nicht die Länge der Pause, sondern der Kehrwert der Blinkfrequenz
+ proportional.
+
+
diff --git a/doc/graphic/graphik beschreibung b/doc/graphic/graphik beschreibung
new file mode 100644
index 0000000..53ebe49
--- /dev/null
+++ b/doc/graphic/graphik beschreibung
@@ -0,0 +1,661 @@
+#type ("basker12")##limit (16.0)##block#
+
+#head#
+#type ("triumb18")#
+#center#EUMEL-Grafik-System
+#type ("basker12")#
+#end#
+ #on("italics")#gescheit, gescheiter,
+ gescheitert#off("italics")#
+
+#type ("basker14")#
+#on("bold")#Beschreibung der Graphik-Prozeduren#off("bold")#
+#type ("basker12")#
+
+ #on("italics")#Zweidimensionale PICTURE brauchen weniger Speicherplatz als dreidimen­
+ sionale. Daher werden in einigen Fehlermeldungen unterschiedliche Größen
+ angegeben.#off("italics")#
+
+#on("underline")#Picture-Prozeduren#off("underline")#
+PICTURE
+
+
+:=
+ OP := (PICTURE VAR l, PICTURE CONST r)
+ Zweck: Zuweisung
+
+CAT
+ OP CAT (PICTURE VAR l, PICTURE CONST r)
+ Zweck: Aneinanderfügen von zwei PICTURE.
+ Fehlerfälle:
+ * left dimension <> right dimension
+ Es können nur PICTURE mit gleicher Dimension angefügt werden.
+ * Picture overflow
+ Die beiden PICTURE überschreiten die maximale Größe eines
+ PICTURE.
+
+nilpicture
+ PICTURE PROC nilpicture
+ Zweck: Die Prozedur liefert ein leeres PICTURE zur Initialisierung.
+
+draw
+ PROC draw (PICTURE VAR p, TEXT CONST text)
+ Zweck: Der angegebene Text wird gezeichnet. Der Anfang ist dabei die aktuelle
+ Stiftposition, die nicht verändert wird.
+ Fehlerfälle:
+ * Picture overflow
+ Der Text paßt nicht mehr in das PICTURE.
+
+ PROC draw (PICTURE VAR p, TEXT CONST text, REAL CONST angle,
+ height, bright)
+ Zweck: Der angegebene Text wird unter dem Winkel #on("italics")#angle#off("italics")# gegenüber der
+ Waagerechten mit der Zeichenhöhe #on("italics")#hight#off("italics")# und der Breite #on("italics")#bright#off("italics")# gezeich­
+ net. Der Anfang ist dabei die aktuelle Stiftposition, die nicht verändert
+ wird.
+ Fehlerfälle:
+ * Picture overflow
+ Der Text paßt nicht mehr in das PICTURE.
+
+ PROC draw (PICTURE VAR p, REAL CONST x, y, z)
+ Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y, z).
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is two dimensional
+
+ PROC draw (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y).
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+draw r PROC draw r (PICTURE VAR p, REAL CONST x, y, z)
+ Zweck: Zeichnen einer Linie der Länge (x, y, z) relativ zur aktuellen Position.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is two dimensional
+
+ PROC draw r (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Zeichnen einer Linie der Länge (x, y) relativ zur aktuellen Position.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+draw cm
+ PROC draw cm (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y) cm.
+ Dabei werden die angegebenen Projektionsparameter nicht beachtet,
+ sondern die Angaben in #on("bold")#Zentimeter#off("bold")# berechnet.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+
+draw cm r
+ PROC draw cm r (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Zeichnen einer Linie der Länge (x, y) cm relativ zur aktuellen Position.
+ Dabei werden die angegebenen Projektionsparameter nicht beachtet,
+ sondern die Angaben in #on("bold")#Zentimeter#off("bold")# berechnet.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+
+move
+ PROC move (PICTURE VAR p, REAL CONST x, y, z)
+ Zweck: Die aktuelle Position wird auf (x, y, z) gesetzt.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is two dimensional
+
+ PROC move (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Die aktuelle Position wird auf (x, y) gesetzt.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+move r
+ PROC move r (PICTURE VAR p, REAL CONST x, y, z)
+ Zweck: Die aktuelle Position wird um (x, y, z) erhöht.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is two dimensional
+
+ PROC move r (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Die aktuelle Position wird um (x, y) erhöht.
+ Position.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+
+move cm
+ PROC move cm (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Die aktuelle Position wird auf (x, y) cm gesetzt. Dabei werden die an­
+ gegebenen Projektionsparameter nicht beachtet, sondern die Angaben in #on("bold")#
+ Zentimeter#off("bold")# berechnet.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+
+move cm r
+ PROC move cm r (PICTURE VAR p, REAL CONST x, y)
+ Zweck: Die aktuelle Position wird um (x, y) cm erhöht. Dabei werden die an­
+ gegebenen Projektionsparameter nicht beachtet, sondern die Angaben in #on("bold")#
+ Zentimeter#off("bold")# berechnet.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+
+bar
+ PROC bar (PICTURE VAR p, REAL CONST width, hight, INT CONST
+ pattern):
+ Zweck: Die Prozedur zeichnet an der aktuellen Position einen Balken mit dem
+ Muster #on("italics")#pattern#off("italics")#: 0 = Leerer Balken
+ 1 = Gepunkteter Balken
+ 2 = Gefüllter Balken
+ 3 = Horizontale Linien
+ 4 = Vertikale Linien
+ 5 = Gekreuzte Linien
+ 6 = Diagonale Linien von Links nach Rechts
+ 7 = Diagonale Linien von Rechts nach Links
+ 8 = Gekreuzte diagonale Linien.
+ Die aktuelle Stiftposition wird dabei nicht verändert.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+ * Unknown pattern
+ Das angegebene Muster liegt nicht im Bereich 0-8
+
+circle
+ PROC circle (PICTURE VAR p, REAL CONST from, to, INT CONST
+ pattern)
+ Zweck: Die Prozedur zeichnet an der aktuellen Position ein Kreissegment vom
+ Winkel #on("italics")#from#off("italics")# bis #on("italics")#to#off("italics")# (im Gradmaß) mit dem Muster #on("italics")#pattern#off("italics")# (s.o.). Die
+ aktuelle Stiftposition wird dabei nicht verändert.
+ Fehlerfälle:
+ * Picture overflow
+ Zu viele Befehle in einem PICTURE
+ * Picture is three dimensional
+ * Unknown pattern
+ Das angegebene Muster liegt nicht im Bereich 0-8
+
+dim
+ INT PROC dim (PICTURE CONST pic)
+ Zweck: Liefert die Dimension eines PICTURE.
+
+pen
+ INT PROC pen (PICTURE CONST p)
+ Zweck: Liefert den virtuellen Stift des PICTURE
+
+ PROC pen (PICTURE VAR p, INT CONST pen)
+ Zweck: Setzen des (virtuellen) Stiftes eines PICTURE. Bei pen=0 wird das
+ Picture nicht gezeichnet.
+ Fehlerfälle:
+ * pen out of range
+ Der gewünschte Stift ist kleiner als 0 oder größer als 16.
+
+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 Werte des PICTURE.
+ Fehlerfälle:
+ * Picture is three dimensional
+
+ PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y
+ max, z min, z max)
+ Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE.
+ Fehlerfälle:
+ * Picture is two dimensional
+
+where
+ PROC where (PICTURE CONST p, REAL VAR x, y, z)
+ Zweck: Die Prozedur liefert die aktuelle Stiftposition (Angaben mit #on("italics")#cm#off("italics")# werden
+ dabei nicht berücksichtigt).
+ Fehlerfälle:
+ * Picture is two dimensional
+
+ PROC where (PICTURE CONST p, REAL VAR x, y, z)
+ Zweck: Die Prozedur liefert die aktuelle Stiftposition (Angaben mit #on("italics")#cm#off("italics")# werden
+ dabei nicht berücksichtigt).
+ Fehlerfälle:
+ * Picture is three dimensional
+
+rotate:
+ PROC rotate (PICTURE VAR p, REAL CONST angle)
+ Zweck: Das PICTURE wird um den Punkt (0, 0) um den Winkel #on("italics")#angle#off("italics")# (im
+ Gradmaß) im mathematisch positiven Sinn gedreht.
+ Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")#
+ verändert.
+
+ PROC rotate (PICTURE CONST p, REAL CONST phi, theta, lambda ) :
+ PICTURE 1-397
+ Zweck: Das PICTURE wird um den Winkel #on("italics")#lambda#off("italics")# um die Drehachse #on("italics")#(phi,
+ theta)#off("italics")# gedreht.
+ Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")#
+ verändert.
+
+stretch
+ PROC stretch (PICTURE VAR pic, REAL CONST sx, sy)
+ Zweck: Das PICTURE wird in X-Richtung um den Faktor #on("italics")#sx#off("italics")#, in Y-Rich­
+ tung um den Faktor #on("italics")#sy#off("italics")# gestreckt (bzw. gestaucht). Dabei bewirkt der
+ Faktor
+ s > 1 eine Streckung
+ 0 < s < 1 eine Stauchung
+ s < 0 zusätzlich eine Achsenspiegelung.
+ Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")#
+ verändert.
+ Fehlerfälle:
+ * Picture is three dimensional
+
+ PROC stretch (PICTURE VAR p, REAL CONST sx, sy, sz)
+ Zweck: s. o.
+ Fehlerfälle:
+ * Picture is two dimensional
+
+translate
+ PROC translate (PICTURE VAR p, REAL CONST dx, dy)
+ Zweck: Das PICTURE wird um #on("italics")#dx#off("italics")# und #on("italics")#dy#off("italics")# verschoben.
+ Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")#
+ verändert.
+ Fehlerfälle:
+ * Picture is three dimensional
+
+ PROC translate (PICTURE VAR p, REAL CONST dx, dy, dz)
+ Zweck: s. o.
+ Fehlerfälle:
+ * Picture is two dimensional
+
+plot PROC plot (PICTURE CONST p)
+ Zweck: Das Picfile wird gezeichnet.
+ Achtung: Es wird kein #on("italics")#begin plot#off("italics")# oder #on("italics")#end plot#off("italics")# durchgeführt. Es wird
+ auch kein Stift gsetzt und die Projektionsparameter bleiben
+ unverändert.
+
+
+#on("underline")#Graphische PICFILE-Prozeduren#off("underline")#
+plot
+ PROC plot (TEXT CONST name)
+ Zweck: Der PICFILE mit dem Namen #on("italics")#name#off("italics")# wird entsprechend der angegebenen
+ Darstellungsart gezeichnet. Diese Parameter (#on("italics")#perspective, orthographic,
+ oblique, view, window etc.#off("italics")#) müssen vorher eingestellt werden.
+ Fehlerfälle:
+ * PICFILE does not exist
+ Es existiert kein PICFILE mit dem Namen #on("italics")#name#off("underline")#
+
+ PROC plot (PICFILE VAR p)
+ Zweck: Der PICFILE #on("italics")#p#off("italics")# wird entsprechend der angegebenen Darstellungsart ge­
+ zeichnet. Diese Parameter müssen vorher eingestellt werden:
+
+ #on("bold")#zweidimensional:#off("bold")#
+ obligat: #on("italics")#window#off("italics")# (zweidimensional)
+ optional: #on("italics")#view#off("italics")# (zweidimensional)
+ #on("italics")#viewport#off("italics")#
+ #on("italics")#select pen#off("italics")#
+
+ #on("bold")#dreidimensional:#off("bold")#
+ obligat: #on("italics")#window#off("italics")# (dreidimensional)
+ optional: #on("italics")#view#off("italics")# (dreidimensional)
+ #on("italics")#orthographic | perspective | oblique#off("italics")#
+ #on("italics")#viewport#off("italics")#
+ #on("italics")#select pen#off("italics")#
+
+
+select pen
+ PROC select pen (PICFILE VAR p, INT CONST pen, colour, thickness, line
+ type,
+ BOOL VAR hidden lines) Zweck: Für die
+ Darstellung des Bildes #on("italics")#p#off("italics")# soll dem #on("italics")#virtuellen#off("italics")# Stift #on("italics")#pen#off("italics")# ein realer Stift
+ zugeordnet werden, der möglichst die Farbe #on("italics")#colour#off("italics")# und die Dicke #on("italics")#thick­
+ ness#off("italics")# hat und dabei Linien mit dem Typ #on("italics")#line type#off("italics")# zeichnet. Es wird die
+ beste Annäherung für das Ausgabegerät genommen.
+ Wenn #on("italics")#hidden lines#off("italics")# auf TRUE gesetzt wird, werden bei dreidimensionalen
+ Zeichnungen die verdeckten Linien mitgezeichnet, ansonsten werden sie
+ unterdrückt. Um sicherzustellen, das der Algorithmus auch funktioniert,
+ müssen die Linien allerdings von vorn nach hinten gezeichnet werden. Es
+ ist also nicht möglich, das Bild so zu drehen, das die hinteren Linien
+ zuerst gezeichnet werden.
+ Dabei gelten folgende Vereinbarungen:
+
+ #on("bold")#Farbe:#off("bold")# Negative Farben werden XOR gezeichnet (dunkel wird hell und
+ hell wird dunkel), Farbe 0 ist der Löschstift und positive Farben
+ überschreiben (ersetzen) den alten Punkt mit folgenden Werten:
+
+ 1 Standardfarbe des Endgerätes
+ 2 rot
+ 3 blau
+ 4 grün
+ 5 schwarz
+ 6 weiß
+ > 6 nicht normierte Sonderfarben
+
+
+ #on("bold")#Dicke:#off("bold")# 0 Standardstrichstärke des Endgerätes, ansonsten Strichstärke in
+ 1/10 mm.
+
+
+ #on("bold")#Linientyp:#off("bold")#
+ 0 keine sichtbare Linie
+ 1 durchgängige Linie
+ 2 gepunktete Linie
+ 3 kurz gestrichelte Linie
+ 4 lang gestrichelte Linie
+ 5 Strichpunktlinie
+ > 5 nicht normierte Linie
+
+ #on("bold")#Verdeckte Linien:#off("bold")#
+ TRUE Verdeckte Linien werden mitgezeichnet
+ FALSE Verdeckte Linien werden unterdrückt (nur bei drei­
+ dimensionalen PICTURE)
+
+ Die hier aufgeführten Möglichkeiten müssen nicht an allen graphischen
+ Endgeräten vorhanden sein. Der geräteabhängige Graphik-Treiber wählt
+ jeweils die bestmögliche Annäherung.
+
+ Fehlerfälle:
+ * pen out of range
+ #on("italics")#pen#off("italics")# muss im Bereich 1-16 sein.
+
+background
+ PROC background (PICFILE VAR p, INT CONST colour)
+ Zweck: Der Hintergrund wird auf die Farbe #on("italics")#colour#off("italics")# (s.o.) gesetzt wenn möglich.
+
+ INT PROC background (PICFILE CONST p):
+ Zweck: Liefert die eingestellte Hintergrundfarbe.
+
+view
+ PROC view (PICFILE VAR p, REAL CONST alpha)
+ Zweck: Setzt den Winkel der Y-Achse zur Senkrechten auf #on("italics")#alpha#off("italics")# Grad, falls
+ diese nicht senkrecht zur Betrachtungsebene steht.
+
+ PROC view (PICFILE VAR p, REAL CONST phi, theta)
+ Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne dargestellt,
+ sondern für die Betrachtung gedreht. Mit der Prozedur #on("italics")#view#off("italics")# kann die
+ Betrachtungsrichtung durch die Polarwinkel #on("italics")#phi#off("italics")# und #on("italics")#theta#off("italics")# (im Gradmass)
+ angegeben werden. Voreingestellt ist #on("italics")#phi#off("italics")# = 0 und #on("italics")#theta#off("bold")# = 0, d.h. senk­
+ recht von oben.
+
+ Im Gegensatz zu #on("italics")#rotate#off("italics")# hat #on("italics")#view#off("italics")# keine Wirkung auf das eigentliche Bild
+ (PICFILE), sondern nur auf die gewählte Darstellung. So addieren sich
+ zwar aufeinanderfolgende #on("italics")#Rotationen#off("italics")#, #on("italics")#view#off("italics")# aber geht immer von der
+ Nullstellung aus. Auch kann das Bild durch eine #on("italics")#Rotation#off("italics")# ganz oder
+ teilweise aus oder in das Darstellungsfenster (#on("italics")#window#off("italics")# gedreht werden. Bei
+ #on("italics")#view#off("italics")# verändern sich die Koordinaten der Punkte nicht, d. h. das Fenster
+ wird mitgedreht.
+
+ PROC view (PICFILE VAR p, REAL CONST x, y, z)
+ Zweck: Wie oben, nur werden die Winkel nicht in Polarkoordinaten angegeben,
+ sondern es wird die Blickrichtung als Vektor in Karthesischen Koordina­
+ ten angegeben. (Die Länge darf ungleich 1 sein).
+
+viewport
+ PROC viewport (PICFILE VAR p, REAL CONST hormin, hormax, vertmin,
+ vertmax) : 1-709
+ 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 physi­
+ kalischen Zeichenfläche des Gerätes hat die Koordinaten (0, 0). Die
+ definierte Zeichenfläche erstreckt sich
+
+ #on("italics")#hormin - hormax#off("italics")# in der Horizontalen,
+ #on("italics")#vertmin - vertmax#off("italics")# in der Vertikalen.
+
+ So liegt der linke untere Eckpunkt dann bei (#on("italics")#hormin, hormax#off("italics")#), der rechte
+ obere Eckpunkt bei (#on("italics")#hormax, vertmax#off("italics")#).
+
+ Damit sowohl geräteunabhängige als auch maßstabgetreue Zeichnungen
+ möglich sind, können die Koordinaten in zwei Arten spezifiziert werden:
+ a) #on("bold")#Gerätekoordinaten#off("bold")#
+ Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei
+ hat die kürzere Seite der physikalischen Zeichenfläche definitionsge­
+ mäß die Länge 1.0.
+ b) #on("bold")#Absolute Koordinaten#off("bold")#
+ Die Werte werden in #on("italics")#cm#off("italics")# angegeben. Dabei müssen die Maximal­
+ werte aber größer als 2.0 sein, da sonst Fall a) angenommen wird.
+
+ Voreingestellt ist
+
+ viewport (0.0, 1.0, 0.0, 1.0)
+
+ d.h. das größtmögliche Quadrat, beginnend mit der linken unteren Ecke
+ der physikalischen Zeichenfläche. In vielen Fällen wird diese Einstellung
+ ausreichen, so daß der Anwender kein eigenes #on("italics")#viewport#off("italics")# definieren muss.
+
+ Der Abbildungsmaßstab wird durch das Zusammenspiel von #on("italics")#viewport#off("italics")# und
+ #on("italics")#window#off("italics")# festgelegt (s. dort). Dabei ist insbesondere darauf zu achten, daß
+ winkeltreue Darstellung nur bei gleichen X- und Y-Maßstab möglich
+ ist. Da man oft quadratische Fenster (#on("italics")#window#off("italics")#) verwendet, wurde als
+ Standardeinstellung auch ein quadratisches #on("italics")#viewport#off("italics")# gewählt.
+
+ Hinweis: Mit der Prozedur #on("italics")#check limit#off("italics")# aus dem PACKET #on("italics")#basis plot#off("italics")# kann die
+ Überprüfung der Grenzen des eingestellten #on("italics")#viewport#off("italics")#-Bereiches ein-
+ bzw. ausgeschaltet werden. Bei eingeschateter Überprüfung, werden
+ Linien, die den Bereich überschreiten, am Rand abgetrennt.
+
+
+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 darzustel­
+ lende Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im In-
+ tervall [#on("italics")#x min, x max#off("italics")#] und deren Y-Koordinaten im Bereich [#on("italics")#y min, y
+ max#off("italics")#] liegen, gehören zum definierten Fenster.Vektoren, die außerhalb
+ dieses Fensters liegen, gehen über die durch #on("italics")#viewport#off("italics")# Fläche hinaus
+ (s.dort).
+
+ Der Darstellungsmaßstab ergibt sich als
+
+ #ub#               x max - x min               #ue#
+ horizontale Seitenlänge der Zeichenfläche
+
+
+ #ub#               y max - y min               #ue#
+ vertikale Seitenlänge der Zeichenfläche
+
+ 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 darzustellende
+ Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im Intervall [#on("italics")#x
+ min, x max#off("italics")#], deren Y-Koordinaten im Bereich [#on("italics")#y min, y max#off("italics")#] und
+ deren Z-Koordinaten im Bereich [#on("italics")#z min, z max#off("italics")#] liegen, gehören zum
+ definierten Fenster. Dieses dreidimensionale Fenster (#on("italics")#Quader#off("italics")#) wird ent­
+ sprechend der eingestellten Projektionsart (orthographisch, perspektivisch
+ oder schiefwinklig) und den Betrachtungswinkeln (s. #on("italics")#view#off("italics")#) auf die spezi­
+ fizierte Zeichenfläche abgebildet.
+ Anders als im zweidimensionalen Fall ist das Problem der Maßstaäbe
+ nicht mehr nur durch das Zusammenspiel von #on("italics")#window#off("italics")# und #on("italics")#viewport#off("italics")# zu
+ beschreiben. Hier spielen auch die Projektionsart und Darstellungswinkel
+ herein.
+
+oblique:
+ PROC oblique (PICFILE VAR p, REAL CONST a, b)
+ Zweck: Bei dem (dreidimensionalen) Bild #on("italics")#p#off("italics")# wir #on("underline")#schiefwinklig#off("underline")# als gewünschte
+ Projektionsart eingestellt. Dabei ist (#on("italics")#a, b#off("italics")#) der Punkt auf der X-Y-
+ Ebene, auf den der Einheitsvektor der Z-Richtung abgebildet werden
+ soll.
+
+orthographic
+ PROC orthographic (PICFILE VAR p)
+ Zweck: Bei dem (dreidimensionalen) Bild #on("italics")#p#off("italics")# wir #on("underline")#orthographisch#off("underline")# als gewünschte
+ Projektionsart eingestellt. Bei der orthographischen Projektion wird ein
+ dreidimensionaler Körper mit parallelen Strahlen senkrecht auf der Pro­
+ jektionsebene dabgebildet.
+
+perpective
+ PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz)
+ Zweck: Bei dem (dreidimensionalen) Bild #on("italics")#p#off("italics")# wir #on("underline")#perspectivisch#off("underline")# als gewünschte
+ Projektionsart eingestellt. Der Punkt (#on("italics")#cx, 1/cy, cz#off("underline")#) ist der Fluchtpunkt der
+ Projektion, d. h. alle Parallen zur Z-Achse schneiden sich in diesem
+ Punkt.
+
+extrema
+ PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max)
+ Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE.
+
+ PROC extrema (PICFILE VAR p, REAL VAR x min,x max,y min,y max,z
+ min,z max) : 1-651
+ Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE.
+
+
+#on("underline")#Prozeduren zur Manipulation von PICFILE#off("underline")#
+:=
+ OP := (PICFILE VAR p, DATASPACE CONST d)
+ Zweck: Assoziert die PICFILE Variable #on("italics")#p#off("italics")# mit dem Datenraum #on("italics")#d#off("italics")# und initialisiert
+ die Variable, wenn nötig.
+ Fehlerfälle:
+ * dataspace is no PICFILE
+ Der anzukoppelnde Datenraum hat einen unzulässigen Typ
+
+picture file
+ DATASPACE PROC picture file (TEXT CONST name)
+ Zweck: Assoziaten eines benannten Datenraumes mit einem PICFILE (s.o.).
+
+put
+ PROC put (FILE VAR f, PICFILE VAR p)
+ Zweck: Schreibt den Inhalt eines PICFILE in ein FILE. Die Informationen
+ werden im internen Format abgelegt.
+
+get
+ PROC get (PICFILE VAR p, FILE VAR f)
+ Zweck: Liest den Inhalt eines PICFILE aus einem FILE. Die Informationen
+ müssen mit #on("italics")#put#off("italics")# geschrieben worden sein.
+ Fehlerfall:
+ * Picfile overflow
+ Es können nur maximal 1024 Picture (Sätze) in einem PICFILE abgelegt
+ werden.
+
+to first pic
+ PROC to first pic (PICFILE VAR p)
+ Zweck: Positioniert auf das erste PICTURE.
+
+to eof
+ PROC to last pic (PICFILE VAR p)
+ Zweck: Positioniert hinter das letzte PICTURE.
+
+to pic
+ PROC to pic (PICFILE VAR p, INT CONST pos)
+ Zweck: Positioniert auf das PICTURE Nummer #on("italics")#pos#off("italics")#.
+ Fehlerfälle:
+ * Position underflow
+ Es wurde eine Position kleiner Null angegeben. * Position after
+ eof Es wurde versucht, hinter das Ende eines PICFILE zu positionieren
+
+up
+ PROC up (PICFILE VAR p)
+ Zweck: Positioniert genau ein PICTURE zurück.
+ Fehlerfall:
+ * Position underflow
+ Es wurde versucht, vor das erste PICTURE zu positionieren
+
+ PROC up (PICFILE VAR p, INT CONST n)
+ Zweck: Positioniert genau #on("italics")#n#off("italics")# Picture zurück.
+ Fehlerfall:
+ * Position underflow
+ Es wurde versucht, vor das erste PICTURE zu positionieren
+
+down
+ PROC down (PICFILE VAR p)
+ Zweck: Positioniert genau ein PICTURE vorwärts.
+ Fehlerfall:
+ * Position after eof
+ Es wurde versucht, hinter das Ende eines PICFILE zu positionieren
+
+ PROC down (PICFILE VAR p, INT CONST n)
+ Zweck: Positioniert genau #on("italics")#n#off("italics")# Picture vorwärts.
+ Fehlerfall:
+ * Position after eof
+ Es wurde versucht, hinter das Ende eines PICFILE zu positionieren
+
+is first picture
+ BOOL PROC is first picture (PICFILE CONST p)
+ Zweck: Liefert genau dann #on("italics")#TRUE#off("italics")#, wenn das erste PICTURE erreicht ist.
+
+eof
+ BOOL PROC eof (PICFILE CONST p)
+ Zweck: Liefert genau dann #on("italics")#TRUE#off("italics")#, wenn das Ende eines PICFILE erreicht ist.
+
+picture no
+ INT PROC picture no (PICFILE CONST p)
+ Zweck: Liefert die Nummer des aktuellen PICTURE.
+
+pictures
+ INT PROC pictures (PICFILE CONST p)
+ Zweck: Liefert die Anzahl PICTURE eines PICFILE.
+
+delete picture
+ PROC delete picture (PICFILE VAR p)
+ Zweck: Löscht das aktuelle PICTURE
+
+insert picture
+ PROC insert picture (PICFILE VAR p)
+ Zweck: Fügt ein PICTURE #on("underline")#vor#off("underline")# der aktuellen Position ein.
+
+read picture
+ PROC read picture (PICFILE CONST p, PICTURE VAR pic)
+ Zweck: Liest das aktuelle PICTURE.
+
+write picture
+ PROC write picture (PICFILE VAR p, PICTURE CONST pic)
+ Zweck: Schreibt das PICTURE #on("italics")#pic#off("italics")# auf der aktuellen Position.
+
+put picture
+ PROC write picture (PICFILE VAR p, PICTURE CONST pic)
+ Zweck: Schreibt das PICTURE #on("italics")#pic#off("italics")# hinter das letzte PICTURE des PICFILE.
+ Die aktuelle Position wird nicht verändert.
+
+#page#
+ #on("italics")#Wo wir sind, da klappt nichts,
+ aber wir können nicht überall sein !#off("italics")#
+
+#type ("basker14")#
+#on("bold")#Kurzbeschreibung des Graphik-Editors#off("bold")#
+#type ("basker12")#
+
+In der Kommondozeile werden folgende Informationen angezeigt:
+
+#on("revers")#LEN nnnnn <...Name...> DIM n PEN nn Picture nnnn
+#off("revers")#
+
+
+Folgende Kommandos stehen zur Verfügung:
+
+ PICTURE PROC pic neu
+ PICFILE PROC picfile neu
+ PROC neu zeichnen
+
+ OP UP n (n PICTURE up)
+ OP DOWN n (n PICTURE down)
+ OP T n (to PICTURE n)
+
+ PROC oblique (REAL CONST a, b)
+ PROC orthographic
+ PROC perspective (REAL CONST cx, cy, cz)
+ PROC window (BOOL CONST dev)
+ PROC window (REAL CONST x min, x max, y min, y max)
+ PROC window (REAL CONST x min, x max, y min, y max, z min, z max)
+ PROC viewport (REAL CONST h min, h max, v min, v max)
+ PROC view (REAL CONST alpha)
+ PROC view (REAL CONST phi, theta)
+ PROC view (REAL CONST x, y, z)
+
+ PROC pen (INT CONST n)
+ PROC select pen (INT CONST pen, colour, thickness, line type, BOOL CONST
+ hidden)
+ PROC background (INT CONST colour)
+
+ PROC extrema pic
+ PROC extrema picfile
+ PROC selected pen
+
+ PROC rotate (REAL CONST angle)
+ PROC rotate (REAL CONST phi, theta, lambda )
+ PROC stretch (REAL CONST sx, sy)
+ PROC stretch (REAL CONST sx, sy, sz)
+ PROC translate (REAL CONST dx, dy)
+ PROC translate (REAL CONST dx, dy, dz)
+
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis
new file mode 100644
index 0000000..5726636
--- /dev/null
+++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis
@@ -0,0 +1,45 @@
+#limit (11.5)##pagelength (16.5)#
+#start (1.8,1.0)#
+Inhaltsverzeichnis
+
+
+
+1 Was kann gs-Herbert und Robbi 3
+
+2 Allgemeines zum Hamster-/Robotermodell 6
+2.1 Entstehung 6
+2.2 Kurzbeschreibung des Hamster-/Roboter-
+ Modells 7
+2.2.1 Befehle und Tests 7
+2.2.2 Landschafts-/Arbeitsfeldgestaltung 9
+2.3 Einsatzbereich 11
+2.4 Hinweise für den Einsatz in der Ausbildung 12
+2.5 Aufgabenmaterial 14
+2.6 Erfahrungen mit dem Hamster-/Roboter-Modell 14
+
+3 Installation von gs-Herbert und Robbi 17
+3.1 Voraussetzungen 17
+3.2 Lieferumfang 17
+3.3 Installation 18
+3.4 Direktstart des Medells 20
+
+4 Beschreibung der Menufunktionen 22
+4.1 Kurzhinweise zur Bedienung des Menus 23
+4.2 Menufunktionen zum Oberbegriff 'Info' 27
+4.3 Menufunktionen zum Oberbegriff 'Landschaft' 29
+ Menufunktionen zum Oberbegriff 'Arbeitsfeld' 29
+4.4 Menufunktionen zum Oberbegriff 'Programm' 35
+4.5 Menufunktionen zum Oberbegriff 'Lauf' 41
+4.6 Menufunktionen zum Oberbegriff 'Archiv' 46
+
+5 Detailbeschreibung der Basisbefehle 61
+
+6 Zusätzliche Kommandos 66
+
+
+
+
+
+
+
+
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1
new file mode 100644
index 0000000..73c95f9
--- /dev/null
+++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1
@@ -0,0 +1,93 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (3)#
+#headodd#
+#center#gs-Herbert und Robbi#right#%
+
+#end#
+#headeven#
+%#center#gs-Herbert und Robbi
+
+#end#
+#center#1
+
+#center#Was
+#center#kann
+#center#gs-Herbert und Robbi
+
+
+ Mit #on("b")#gs-Herbert und Robbi#off("b")# liegt das von Lothar Oppor
+entwickelte und von Wolfgang Weber weiterentwickelte
+Hamster-Modell nun eingebettet in die komfortable,
+menuorientierte Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")# vor. Das
+Programm stellt eine wesentliche Erweiterung des 'alten'
+Hamster - Modells dar. Neben einer zweiten Modellvarian­
+te (Roboter) wurden eine Reihe nützlicher Funktionen in
+das Modell integriert. Sämtlich Funktionen werden über
+ein übersichtliches Menu angeboten, was gerade dem An­
+fänger die Arbeit mit dem Computer erleichtert.
+
+ #on("b")#gs-Herbert und Robbi#off("b")# kann zur Einführung in das al­
+gorithmische Problemlösen eingesetzt werden und soll
+dazu dienen, Programmierung #on("u")#einfach#off("u")# und #on("u")#spielerisch#off("u")# zu
+erlernen - ohne Ablenkung durch Betriebssystem oder gar
+Hardware-Eigenheiten.
+
+ Das Modell ist so einfach und überschaubar, daß ein
+Anfänger schon nach einer halben Stunde in der Lage ist,
+sich selbst kleine Aufgaben zu stellen und diese zu lösen.
+Die Modellumgebung ist so komfortabel, daß der Anfänger
+nach einer kurzen Einweisung selbständig mit dem Compu­
+termodell umgehen kann.
+
+- Durch die Menuführung sind nur noch wenige Be­
+ triebssystemkommandos zur Bedienung des Systems
+ notwendig.
+
+- Der Benutzer kann jederzeit Informationen anfordern
+ über:
+ - den zur Verfügung stehenden Befehlsumfang,
+ - die Möglichkeiten, den Lauf des Hamsters/Robo­
+ ters zu beeinflussen,
+ - die Möglichkeiten hinsichtlich der Landschafts­
+ gestaltung/Arbeitsfeldgestaltung
+ - die Bedienung des Menusystems
+ - die Wirkung der einzelnen Menufunktionen
+ - die Möglichkeiten/Bedienung des Editors
+
+- Neben der Steuerung des Hamsters/Roboters durch
+ Programme kann der Hamster/Roboter auch interaktiv
+ gesteuert werden; dabei wird ein Protokoll der ausge­
+ führten Aktionen in Form eines ablauffähigen ELAN-
+ Programms angelegt. Dieses Protokoll (Programm) kann
+ jederzeit eingesehen werden. Natürlich kann anschlie­
+ ßend der Hamster/Roboter die gleichen Aktionen, die
+ zuvor von Hand ausgeführt wurden, auch nach diesem
+ Programm ausführen.
+
+- Durch den (optional) erweiterbaren Befehlssatz kann
+ #on("b")#gs-Herbert und Robbi#off("b")# den Erfordernissen und der Lei­
+ stungsfähigkeit der Lernenden leicht angepaßt wer­
+ den.
+
+- Auch das Editieren und Drucken von Programmen sowie
+ Landschaften/Arbeitsfeldern erfolgt vom Menu aus.
+
+- Die Archivoperationen, die gerade Anfängern zunächst
+ große Probleme bereiten, können sämtlichst komforta­
+ bel vom Menu aus gehandhabt werden. Dabei werden
+ Anfragen an den Benutzer gestellt, die zumeist nur
+ mit 'ja' oder 'nein' zu beantworten sind; oder der Be­
+ nutzer hat in einer Auswahlliste die gewünschten Da­
+ teinamen anzukreuzen.
+
+- Die Archivoperationen stehen dem Benutzer auch unab­
+ hängig vom Hamster-/Robotermodell unter #on("b")#gs-DIALOG#off("b")#
+ zur Verfügung, so daß beim Verlassen der Modellum­
+ gebung "kein Bruch zu befürchten ist".
+
+- Die Fehlermeldungen sind detailliert und leicht ver­
+ ständlich, so daß auch Anfänger die Fehlerquelle(n)
+ zumeist ohne zusätzliche Hilfen lokalisieren und be­
+ seitigen können.
+
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2
new file mode 100644
index 0000000..52526d6
--- /dev/null
+++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2
@@ -0,0 +1,389 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (6)#
+#headodd#
+#center#gs-Herbert und Robbi#right#%
+
+#end#
+#headeven#
+%#center#gs-Herbert und Robbi
+
+#end#
+#center#2
+
+#center#Allgemeines
+#center#zum
+#center#Hamster-/Robotermodell
+
+
+2.1 Entstehung
+
+ Das Hamster - Modell wurde in der Gesellschaft für
+Mathematik und Datenverarbeitung (GMD), einer Großfor­
+schungseinrichtung des Bundes und des Landes Nord­
+rhein-Westfalen, von Lothar Oppor in Anlehnung an das
+Modell 'Karel the Robot' von Richard E. Pattis (Stanford
+University, USA) entwickelt und zunächst innerhalb der
+GMD und schon bald im Schulbereich eingesetzt.
+ Wolfgang Weber, Lehrer an der Gesamtschule Leopolds­
+höhe bei Bielefeld, entwickelte in Zusammenhang mit sei­
+ner Arbeit am Landesinstitut für Schule und Weiterbil­
+dung in Soest dieses Modell seit 1984 weiter. Sein Ziel war
+es, das Modell um solche Komponenten zu erweitern, daß es
+auch für Schüler der Sekundarstufe I im Anfangsunter­
+richt eingesetzt werden kann. Besondere Bedeutung kam
+dabei der Entwicklung einer komfortablen, einfach zu be­
+dienenden Benutzerschnittstelle zu, die es dem Anfänger
+ermöglicht, sich von Beginn an mit der eigentlichen Pro­
+blemstellung auseinanderzusetzen, ohne von Betriebssy­
+stem oder gar Hardware-Eigenheiten abgelenkt zu werden.
+ Mit dem vorliegenden Programm #on("b")#gs-Herbert und Robbi#off("b")#,
+das in die komfortable, menuorientierte Benutzer­
+schnittstelle #on("b")#gs-DIALOG#off("b")# eingebettet ist, dürfte diese Ar­
+beit vorerst zu einem Abschluß gebracht sein. Mit diesem
+Programm liegt nun eine Modellumgebung vor, die den
+gestellten Anforderungen gerecht wird.
+
+
+2.2 Kurzbeschreibung des Hamster-/Roboter-Modells
+
+ Das Hamster- und das Roboter - Modell sind analog
+aufgebaut und in Art und Umfang der Befehle identisch.
+Im ersten Modell kann 'Herbert der Hamster', im zweiten
+Modell 'Robbi der Roboter' auf dem Bildschirm durch vier
+sogenannte Basisbefehle gesteuert werden - 'Herbert' in
+einer 'Landschaft', 'Robbi' auf einem 'Arbeitsfeld' - beides
+Ebenen, die aus 23 x 40 Kacheln bestehen.
+ Auf dieser Ebene können sich noch Hindernisse und
+'Körner' (für Herbert) oder 'Werkstücke' (für Robbi) befin­
+den. Die Hindernisse stellen auf dem Bildschirm Barrieren
+dar, die umgangen werden müssen. Die Körner bzw. Werk­
+stücke können von Herbert in seinen 'Backentaschen' bzw.
+von Robbi in seinem 'Behälter' aufgenommen oder daraus
+(wieder) abgelegt werden.
+
+
+2.2.1 Befehle und Tests
+
+ Für die Steuerung von Herbert bzw.Robbi stehen vier
+Basisbefehle zur Verfügung (die in beiden Modellvarian­
+ten gleich sind):
+
+#on("u")#vor#off("u")#
+ Gehe eine Kachel (einen Schritt) in Laufrichtung vor.
+
+#on("u")#links um#off("u")#
+ Drehe Dich, wo Du stehst, um 90 Grad nach links.
+
+#on("u")#nimm#off("u")#
+ Nimm da, wo Du stehst, ein Korn/Werkstück auf.
+
+#on("u")#gib#off("u")#
+ Lege da, wo Du stehst, aus den Backentaschen/dem Be­
+ hälter ein Korn/Werkstück ab.
+
+ Da nur dort ein Korn/Werkstück aufgenommen werden
+kann, wo auch eines vorhanden ist oder nur vorgegangen
+werden kann, wenn die nächste Kachel noch zur Land­
+schaft/zum Arbeitsfeld gehört und nicht blockiert ist,
+sind die Befehle 'nimm', 'gib' und 'vor' nicht uneinge­
+schränkt ausführbar. Aus diesem Grunde sind noch die
+folgenden #on("u")#Basistests#off("u")# definiert:
+
+#on("u")#vorn frei#off("u")#
+ testet, ob die vor ihm liegende Kachel frei ist.
+
+#on("u")#korn da / werkstueck da#off("u")#
+ testet, ob auf der Kachel, auf der er steht, mindestens
+ ein Korn/Werkstück liegt.
+
+#on("u")#backen leer /behaelter leer#off("u")#
+ testet, ob kein Korn/Werkstück in den Backentaschen/im
+ Behälter ist.
+
+ Darüberhinaus können Sie bei der Installation des
+Systems noch festlegen, ob die folgenden #on("u")#Zusatztests#off("u")# zur
+Verfügung stehen sollen oder nicht:
+
+#on("u")#links frei#off("u")#
+ testet, ob die Kachel links neben ihm frei ist.
+
+#on("u")#rechts frei#off("u")#
+ testet, ob die Kachel rechts neben ihm frei ist.
+
+#on("u")#hinten frei#off("u")#
+ testet, ob die Kachel hinter ihm frei ist.
+
+#on("u")#korn vorn / werkstueck vorn#off("u")#
+ testet, ob auf der Kachel vor ihm mindestens ein Korn/
+ Werkstück liegt.
+
+#on("u")#korn links / werkstueck links#off("u")#
+ testet, ob auf der Kachel links neben ihm mindestens
+ ein Korn/ Werkstück liegt.
+
+#on("u")#korn rechts / werkstueck rechts#off("u")#
+ testet, ob auf der Kachel rechts neben ihm mindestens
+ ein Korn/Werkstück liegt
+
+#on("u")#korn hinten / werkstueck hinten#off("u")#
+ testet, ob auf der Kachel hinter ihm mindestens ein
+ Korn/Werkstück liegt.
+
+ Es gibt #on("u")#keinen#off("u")# Testbefehl, mit dem überprüft werden
+kann, ob der Rand der Ebene erreicht ist.
+
+
+2.2.2 Landschaftsgestaltung/Arbeitsfeldgestaltung
+
+ Der Benutzer kann selber Landschaften/Arbeitsfelder
+erstellen, auf denen Herbert bzw. Robbi bewegt werden
+kann. Es können aber auch fertige Ebenen verändert wer­
+den.
+ Eine Landschaft/ein Arbeitsfeld ist eine Ebene aus
+23 x 40 Kacheln. Eine Kachel kann auf dem Bildschirm so
+aussehen:
+
+ Leere Kachel : Blank und Punkt (" .")
+ Kornkachel : Blank und kleines o (" o")
+ Hindernis : zwei Nummernzeichen ("\#\#")
+
+ In dieser Landschaft steht auf einer der Kacheln Her­
+bert bzw. Robbi:
+
+ "A" mit Blickrichtung nach oben
+ ">" mit Blickrichtung nach rechts
+ "V" mit Blickrichtung nach unten
+ "<" mit Blickrichtung nach links
+
+
+#on("u")#Beispiel:#off("u")# Ausschnitt aus einer Landschaft:
+
+#on("b")#
+ . . . . . . . . . . . . . . . . . . . .
+ . . o o o o o o o o o o . . . . . . . .
+ . . o . . . . . . . . o . . . . . . . .
+ . . o . . . . . . . . o . . . . . . . .
+ . o o .\#\#\#\#\#\#\#\#\#\#\#\# . o . . . . . . . .
+ . o . .\#\# .V. . .\#\# . o o o o o o o . .
+ . o . .\#\# . o . .\#\# . . . . . . . o . .
+ . o o o o o o . .\#\# . . . o o o o o . .
+ . . . .\#\# . . . .\#\# . . . o . . . . . .
+ . . . .\#\# . . . .\#\# . . . o o o o . . .
+ . . . .\#\#\#\#\#\#\#\#\#\#\#\# . . . . . . o o . .
+ . . . . . . . . . . . . . . . . . . . .
+
+Während der Landschaftsgestaltung wirken folgende
+Tasten:
+
+<h> halt, beende die Landschafts-/Arbeitsfeld­
+ gestaltung
+<\#> setze ein Hindernis und gehe ein Feld
+ weiter
+<LEERTASTE> leere das Feld und gehe ein Feld weiter
+<g> lege hier ein Korn/Werkstück ab
+<n> nimm ein Korn/Werkstück auf (falls hier
+ welche liegen)
+<z> zeige, wie viele Körner/Werkstücke hier
+ liegen
+<k> ersetze diese Landschaft/diese Arbeitsfeld
+ durch die Kopie einer bereits vorhandenen
+ anderen Landschaft/eines bereits vorhan­
+ denen anderen Arbeitsfeldes
+
+- Durch Drücken der Fragezeichentaste (<?>) während der
+ Landschafts-/Arbeitsfeldgestaltung, können Sie sich
+ diese Hinweise auch auf dem Bildschirm einblenden
+ lassen.
+
+- Mit den Pfeiltasten kann Herbert/Robbi bewegt und
+ seine Richtung verändert werden.
+
+- Die Landschaftsgestaltung wird durch Tippen der
+ Taste <h> abgeschlossen. Die Position und die Blick­
+ richtung, die Herbert bzw. Robbi zu diesem Zeitpunkt
+ innehat, wird als Startposition vermerkt.
+
+- Auf dem Bildschirm wird dann noch die Zahl der Kör­
+ ner/Werkstücke erfragt, die Herbert bzw.Robbi zu Be­
+ ginn des Laufes in seinen Backentaschen/in seinem
+ Behälter haben soll. Hier muß eine Zahl zwischen 0 und
+ 32767 eingegeben werden.
+
+
+2.3 Einsatzbereich
+
+ Das Hamster-/Roboter-Modell soll dazu dienen, die
+Grundelemente des algorithmischen Problemlösens (Folge,
+Auswahl, Wiederholung etc.) #on("u")#einfach#off("u")# und #on("u")#spielerisch#off("u")# zu
+erlernen und sie in der Programmiersprache ELAN zu co­
+dieren. In der Bildschirmdarstellung erinnert das Ham­
+ster-/Roboter-Modell zunächst an ein einfaches Tele­
+spiel, eine Anwendung des Computers, die sicher bekannt
+ist. Darüberhinaus lassen sich leicht Bezüge zur Steue­
+rung von Industrierobotern herstellen.
+ Durch die komfortable Benutzerschnittstelle wird dem
+Anwender in der Anfangsphase eine Auseinandersetzung
+mit dem Betriebssystem "erspart". Die Arbeit mit dem Mo­
+dell setzt #on("u")#keine Vorerfahrungen und Kenntnisse#off("u")# voraus.
+Das Modell ist schon nach weniger als einer halben Stun­
+de für den Anfänger überschaubar. Er kann dann schon
+Aufgaben lösen, sich selbst Aufgaben stellen bzw. die
+gegebene Aufgabenstellung erweitern.
+ Das Modell zielt auf die Aktivierung des Lernenden
+und die Mitarbeit in allen Punkten: Aufgabenstellung,
+Lösungsgestaltung, Lösungstest und -verifizierung. Der
+Lernfortschritt kann in stärkerem Maße als im "herkömm­
+lichen Programmierunterricht" von den Lernenden selbst
+bestimmt werden. Der spielerische Anfang, die Veran­
+schaulichung der Programmausführung auf dem Bild­
+schirm, die Möglichkeit Fehler direkt und eigenständig
+zu erkennen, fördern die Motivation, die Kreativität und
+die Fehler- und Frustrationstoleranz.
+
+
+2.4 Hinweise für den Einsatz in der Ausbildung
+
+ Das Hamster-/Roboter-Modell ist angelegt für "Pro­
+grammieren" mit Bleistift und (kariertem) Papier. Für die
+Überlegungen, die anzustellen sind, ist der Computer
+selbst in der Anfangsphase #on("u")#nicht notwendig#off("u")#. Man kann
+Kachel-Landschaften / Kachel-Arbeitsfelder aufzeich­
+nen und vorgegebene oder sich selbst gestellte Aufgaben
+lösen. Die erstellten Programme werden ausgeführt, indem
+man z.B. eine kleine Büroklammer als Hamster/Roboter auf
+dem Papier oder der Folie dem Programm entsprechend ver­
+schiebt. Heftzwecken oder Pfennigstücke können als Kör­
+ner/ Werkstücke und Streichholzstücke als Hindernisse
+dienen.
+ #on("b")#gs-Herbert und Robbi#off("b")# verfügt auch über die Möglich­
+keit, den Hamster/Roboter interaktiv zu steuern. Auch
+hierüber ist ein Einstieg in den Umgang mit dem Modell
+möglich. Bei der interaktiven Steuerung kann der Ham­
+ster/Roboter von Hand durch Tastendruck auf dem Bild­
+schirm bewegt werden. Dabei können nur die vier Basisbe­
+fehle ('vor', 'links um', 'nimm' und 'gib') verwendet werden.
+Während der Steuerung von Hand wird ein "Protokoll" der
+ausgeführten Befehle angelegt - und zwar gleich in Form
+eines ablauffähigen ELAN-Programms. Dadurch hat der
+Benutzer einerseits die Möglichkeit, die Anweisungen, die
+durch Tastendruck gegeben wurden, zu kontrollieren,
+andererseits kann anschließend die Folge der eingegebe­
+nen Anweisungen auch als Programm vom Computer ausge­
+führt werden ('Teach in').
+
+ Nach diesem "ersten Kennenlernen des Modells" sollte
+man dann aber bei Problemstellungen, die ein systemati­
+sches Vorgehen erfordern, die Arbeit mit dem Computer
+unterbrechen und die Algorithmen jeweils auf dem Papier
+entwerfen. Auf die Ausführung der erstellten Anwei­
+sungsfolgen von Hand auf Papier/Folie sollte man #on("u")#auf
+keinen Fall gänzlich verzichten#off("u")# - auch, um den Lernen­
+den zu verdeutlichen, daß die Befehlsfolgen sowohl vom
+"Prozessor Mensch" als auch vom "Prozessor Computer"
+ausgeführt werden können; der Computer also nur ein
+Hilfswerkzeug ist.
+ Erst wenn das Bilden eigener benannter Anweisungen
+(Refinements/Prozeduren) den Lernenden hinreichend ver­
+traut ist, ist es sinnvoll, umfangreichere Problemstel­
+lungen anzugehen. Da dann auch die Programmausführung
+von Hand mühsam wird und ihren Reiz verliert, sollte man
+(wieder) zum Computermodell übergehen, um mit dessen Hil­
+fe die Programme auszuführen und zu überprüfen.
+ Nachdem die Lernenden die Basisbefehle sicher beherr­
+schen und eigene benannte Anweisungen unter Verwendung
+der Basisbefehle konstruieren können, können dann nach
+und nach die vorgegebenen Tests und damit auch die ande­
+ren Elemente der Algorithmenentwicklung (Auswahl, Wie­
+derholung etc.) in den Unterricht eingebracht werden.
+ Als notwendig hat es sich erwiesen, von Anfang an auf
+eine saubere Strukturierung und Modularisierung der
+Algorithmen zu achten. Gerade Lernende mit "Program­
+miererfahrung" neigen dazu, möglichst "kurze" Program­
+me schreiben zu wollen. Besonderen Wert sollten Sie auf
+eine treffende Namensgebung der einzelnen Module legen,
+selbst wenn die Lernenden das oft als "lästige Schreibar­
+beit" empfinden. Aufgaben können ein Einzel-, Partner-
+und Gruppenarbeit bearbeitet werden. Dabei hat sich die
+Arbeit in kleinen Gruppen als besonders effektiv erwie­
+sen. Die Lernenden sind untereinander zumeist sehr kri­
+tisch und fordern sich gegenseitig auf, "lesbare" Pro­
+gramme zu schreiben. Ein Austausch der Programme unter
+den Gruppen kann diesen Anspruch noch zusätzlich för­
+dern.
+
+
+2.5 Aufgabenmaterial
+
+ Zum Hamster-Roboter-Modell sind inzwischen eine Rei­
+he von Aufgaben / Aufgabensystemen enstanden. An dieser
+Stelle soll auf zwei Veröffentlichungen hingewiesen
+werden, in denen Sie solche Aufgaben / Aufgabensysteme
+finden können:
+
+Weber, Wolfgang et al., Das Hamster-/Roboter-Modell,
+ in: Landesinstitut für Schule und Weiterbildung
+ (Hrsg.), Materialien zur Lehrerfortbildung in
+ Nordrhein-Westfalen, Heft 1, Neue Technologien
+ - Informations- und Kommunikationstechnologi­
+ sche Inhalte im Wahlpflichtunterricht der Klas­
+ sen 9/10, Soest, 1986
+
+Ambros, Wolfgang, Der Hamster, Programmieren lernen in
+ einer Modellwelt, J.B. Metzlersche Verlagsbuch­
+ handlung, Stuttgart, 1987
+
+
+2.6 Erfahrungen mit dem Hamster-/Roboter-Modell
+
+ Seit 1982 wird das Hamster - Modell in der GMD zur
+Programmierausbildung eingesetzt. Die Ergebnisse sind
+hervorragend: Die Teilnehmer bewältigen in derselben
+Zeit erheblich mehr Inhalte als früher ohne Modell. Moti­
+vation, Selbständigkeit und Initiative prägen sich er­
+heblich früher und merklich stärker aus. Außerdem sind
+die am Modell erworbenen Kenntnisse tiefer und sicherer.
+ Seit 1983 wird das Hamster - Modell auch in mehreren
+Schulen mit sehr gutem Erfolg eingesetzt. Der Erfolg ist
+am größten im Blockunterricht (3 - 5 Tage z.B. in Projekt­
+wochen, Schullandheimaufenthalten etc.). Aber auch im
+stundenweisen Unterricht wird das Hamster-/Roboter-
+Modell mit gutem Erfolg eingesetzt.
+ Beide Zugänge, der Einstieg über das Arbeiten mit
+Bleistift und Papier und der Einstieg über die interakti­
+ve Steuerung des Hamsters/Roboters, haben sich als prak­
+tikabel erwiesen. Der Zugang über die interaktive Steue­
+rung bietet den Vorteil, die zumeist sehr hohe Motivation
+der Lernenden, "endlich mit dem Computer arbeiten zu
+können", auszunutzen. Sie lernen dabei das Computermo­
+dell auf einfache Weise kennen und haben einen ersten
+Umgang mit Bildschirm und Tastatur. Kleine, einfache
+Problemstellungen können von ihnen durch die interak­
+tive Steuerung schnell und sicher bearbeitet werden.
+"Nebenbei" lernen sie, neben der Wirkung der Basisbefeh­
+le, durch das mitgeführte Protokoll auch die Codierung
+in der Programmiersprache kennen. Allerdings verliert
+die interaktive Steuerung relativ schnell ihren Reiz,
+wenn die Lernenden erkennen, daß nur sehr einfache Pro­
+blemstellungen damit bearbeitet werden können. Dann
+sollte aber zur Arbeit mit Papier und Bleistift überge­
+gangen werden.
+ Die Entscheidung, ganz auf das Arbeiten mit Papier
+und Bleistift zu verzichten, hat sich als sehr nachteilig
+erwiesen. Die Lernenden "hacken" die Programme in die
+Maschine und handeln eher nach dem "Prinzip von Versuch
+und Irrtum" als nach sorgfältigen Überlegungen. Bei
+komplexeren Problemstellungen scheitern diese Teilneh­
+mer zumeist.
+ Erfahrungsgemäß nimmt nach einiger Zeit der Wunsch
+stark zu, eigene Ausgaben auf dem Bildschirm zu erzeugen
+und andere Problembereiche zu bearbeiten (zum "richtigen
+Programmieren" überzugehen). Sie sollten diesen Schritt
+dann auch nicht zu lange hinauszögern und das Modell
+auf keinen Fall überstrapazieren. Da das Modell selbst
+und auch der Umgang damit sehr einfach ist, besteht auch
+später die Möglichkeit, zum Modell zurückzukehren, um
+hieran weitere Elemente der Algorithmenentwicklung in
+einfacher und anschaulicher Form einzuführen.
+
+
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3
new file mode 100644
index 0000000..c34b752
--- /dev/null
+++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3
@@ -0,0 +1,199 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (17)#
+#headodd#
+#center#gs-Herbert und Robbi#right#%
+
+#end#
+#headeven#
+%#center#gs-Herbert und Robbi
+
+#end#
+#center#3
+
+#center#Installation
+#center#von
+#center#gs-Herbert und Robbi
+
+
+ Bevor Sie #on("b")#gs-Herbert und Robbi#off("b")# auf Ihrem Computer
+benutzen können, müssen Sie das Programm zunächst in­
+stallieren. Wenn #on("b")#gs-Herbert und Robbi#off("b")# auf Ihrem System
+schon zur Verfügung steht, können Sie dieses Kapitel
+ruhig überspringen.
+
+
+3.1 Voraussetzungen
+
+ Um #on("b")#gs-Herbert und Robbi#off("b")# auf Ihrem Computer betreiben
+zu können, muß das EUMEL-Betriebssystem installiert
+sein. #on("b")#gs-Herbert und Robbi#off("b")# setzt die Multi-User-Version
+voraus und ist lauffähig ab Version 1.7.5. #on("b")#gs-Herbert und
+Robbi#off("b")# setzt weiterhin voraus, daß auf Ihrem Computer
+bereits das Programm #on("b")#gs-DIALOG#off("b")# installiert ist.
+
+
+3.2 Lieferumfang
+
+ #on("b")#gs-Herbert und Robbi#off("b")# wird auf einer Diskette gelie­
+fert, die alle notwendigen Programme enthält (die Instal­
+lation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den
+Inhalt der Diskette feststellen zu können, starten Sie
+Ihr System und bringen es dazu, daß 'gib kommando:' er­
+scheint. Dann legen Sie die Diskette ein und geben das
+Kommando:
+
+archive("gs-Herbert und Robbi");list(archive);
+release(archive) <RETURN>
+
+ Anschließend erscheint eine Übersicht der auf dem
+Archiv vorhandenen Programme. Folgende Programme soll­
+ten sich in der Übersicht befinden:
+
+ "gs-Herbert und Robbi 1"
+ "gs-Herbert und Robbi 2"
+ "gs-Herbert und Robbi 3"
+ "gs-MENUKARTE:Herbert und Robbi"
+ "gs-Herbert und Robbi/gen"
+
+ Eventuell können noch weitere Namen auf der Diskette
+vorhanden sein. Wenn Sie den Inhalt der Diskette kon­
+trolliert haben und diese Programme auf der Diskette
+vorhanden sind, können Sie #on("b")#gs-Herbert und Robbi#off("b")# instal­
+lieren.
+ Sollten Sie statt der Übersicht eine Fehlermeldung
+erhalten, überprüfen Sie bitte, ob die Diskette das rich­
+tige Format besitzt oder ob Ihr Diskettenlaufwerk Pro­
+bleme macht. Sollten dagegen Programme fehlen, so rekla­
+mieren Sie die Diskette.
+
+
+3.3 Installation
+
+ #on("b")#gs-Herbert und Robbi#off("b")# muß in einer Task installiert
+werden, in der bereits das Programm #on("b")#gs-DIALOG#off("b")# zur Ver­
+fügung steht. Alle Söhne und Enkel der neuen Task kön­
+nen anschließend das Hamster-/ Roboter-Modell aufrufen.
+Richten Sie also eine Task als Sohn der Task ein, in der
+auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir
+nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' instal­
+liert ist und die neue Task den Namen 'HAMSTER' erhalten
+soll. (Sie können für die Task auch einen beliebigen an­
+deren Namen wählen):
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+
+#off("b")#
+ --> gib supervisor kommando:
+#on("b")#
+ begin ("HAMSTER","MENU") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+
+ (Arbeiten mehrere Personen mit dem Computer, dann ist
+es sinnvoll, diese Task vor unbefugtem Zugriff durch ein
+Passwort zu schützen. Wie das gemacht wird, können Sie in
+Ihrem EUMEL-Benutzerhandbuch erfahren.)
+
+ Legen Sie dann die Archivdiskette ein, auf der sich
+#on("b")#gs-Herbert und Robbi#off("b")# befindet, und geben Sie das folgen­
+de Kommando:
+
+#on("b")#
+ archive("gs-Herbert und Robbi") <RETURN>
+
+ fetch("gs-Herbert und Robbi/gen",archive) <RETURN>
+
+ run <RETURN>
+#off("b")#
+
+ Sie haben damit das Generatorprogramm gestartet.
+Zunächst werden Sie gefragt, ob Sie den erweiterten Be­
+fehlssatz (mit Zusatztests) für den Hamster und Roboter
+zur Verfügung gestellt haben möchten. Beantworten Sie
+diese Frage je nach Wunsch mit 'ja' oder 'nein' durch Tip­
+pen der Taste <j> bzw. <n>.
+ Daraufhin wird die Installation automatisch durchge­
+führt. Lassen Sie während des gesamten Vorgangs die Ar­
+chivdiskette eingelegt. Die Generierung ist beendet, wenn
+der EUMEL-Eingangsbildschirm erscheint. Die Task, in der
+die Generierung stattfindet, wird automatisch zur Mana­
+gertask, das heißt, daß Söhne von ihr eingerichtet werden
+können.
+ Richten Sie sich gleich eine Sohntask (z.B mit dem Na­
+men 'hamster1') ein, dann können Sie das System sofort
+ausprobieren. Gehen Sie dazu folgendermaßen vor:
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+
+#off("b")#
+ --> gib supervisor kommando:
+#on("b")#
+ begin ("hamster1","HAMSTER") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+
+
+Mit dem Kommando
+
+#center##on("b")#hamster <RETURN> bzw. roboter <RETURN>#off("b")#
+
+rufen Sie nun das
+
+#center#Hamster-Modell bzw. Roboter-Modell
+
+auf.
+
+
+3.4 Direktstart des Modells
+ (Steht erst ab gs-DIALOG Version 1.1 zur Verfügung)
+
+ In Kapitel 3.3 haben wir Ihnen gezeigt, wie sie eine
+Sohntask einrichten und hier durch das Kommando 'ham­
+ster' bzw. 'roboter' das System aufrufen können. Wenn Sie
+immer nur mit einer Modellvariante arbeiten oder vor dem
+Benutzer die 'gib kommando:'-Ebene verbergen wollen,
+können Sie das System auch so einrichten, daß sich sofort
+nach Einrichten des Arbeitsbereichs das Menusystem mel­
+det. Für den Anfänger kann das die Arbeit durchaus er­
+leichtern.
+ Gehen Sie dazu in die Task, unterhalb der die Sohntasks
+eingerichtet werden sollen:
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+
+#off("b")#
+ --> gib supervisor kommando:
+#on("b")#
+ continue ("HAMSTER") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+#on("b")#
+ direktstart ("hamster", TRUE) <RETURN>
+#off("b")#
+
+ Durch das Kommando haben Sie festgelegt, daß sich
+alle Sohntasks direkt mit dem Hamstermenu melden. Möch­
+ten Sie lieber mit dem Roboter-Modell arbeiten, ist nur
+'hamster' durch 'roboter' zu ersetzen.
+ Durch den zweiten Parameter 'TRUE' legen Sie fest, daß
+in den Sohntasks nach Verlassen des Menus die jeweilige
+Task automatisch gelöscht wird. Statt 'TRUE' können Sie
+hier auch den Wert 'FALSE' eintragen. Dann wird nach Ver­
+lassen des Menus angefragt, ob die Task gelöscht werden
+soll. Wird die Frage bejaht, wird gelöscht - sonst wird die
+Task abgekoppelt (break) und kann durch 'continue' wieder
+angekoppelt werden.
+ Anmerkung: In der Task, in der Sie das Kommando
+'direktbefehl' gegeben haben, sollte nicht das Kommando
+'monitor' gegeben werden, da Sie durch dieses Kommando
+auch diese Task zu einer Task machen, die sich direkt mit
+dem Menu meldet und ggf. bei Verlassen des Menus automa­
+tisch gelöscht wird!
+
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4
new file mode 100644
index 0000000..4f2d79a
--- /dev/null
+++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4
@@ -0,0 +1,1312 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (22)#
+#headodd#
+#center#gs-Herbert und Robbi#right#%
+
+#end#
+#headeven#
+%#center#gs-Herbert und Robbi
+
+#end#
+#center#4
+
+#center#Beschreibung
+#center#der
+#center#Menufunktionen
+
+
+ Nach Aufruf meldet sich #on("b")#gs-Herbert und Robbi mit
+#on("u")#einem#off("u")# der folgenden Menus:
+
+
+#on("b")#
+HAMSTER: Info Landschaft Programm Lauf Archiv
++---------------------------+--------------------------------------------
+| l Landschaftsgestaltung |
+| b Befehlsvorrat |
+| s Steuerung des Laufs |
++---------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+-------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+#on("u")#oder#off("u")#
+
+#on("b")#
+ROBOTER: Info Arbeitsfeld Programm Lauf Archiv
++----------------------------+--------------------------------------------
+| a Arbeitsfeldgestaltung |
+| b Befehlsvorrat |
+| s Steuerung des Laufs |
++----------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+ Beide Varianten sind, wie schon gesagt, analog auf­
+gebaut. Aus diesem Grunde werden wir uns in den folgen­
+den Ausführungen auf die Beschreibung der Hamster -
+Variante beschränken.
+
+
+4.1 Kurzhinweise zur Bedienung des Menus
+
+ Die Bedienung des Menus ist sehr einfach. Eine aus­
+führliche Beschreibung dazu finden Sie in den Unterla­
+gen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle sol­
+len nur die wesentlichen Bedienungsvorgänge beschrieben
+werden.
+
+- Mit der Tastenfolge <ESC><?> können Sie sich Informa­
+ tionen zur Bedienung des Menusystems in das Menu
+ einblenden lassen
+
+- Mit den Pfeiltasten <rechts> und <links> können Sie
+ zwischen den "Oberbegriffen" in der Kopfzeile wählen.
+ Der aktuelle Oberbegriff ist jeweils invers darge­
+ stellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich
+ auf diesen invers dargestellten Oberbegriff.
+
+- Mit den Pfeiltasten <hoch> und <runter> können Sie
+ zwischen den Menufunktionen wählen, die Ihnen im
+ aktuellen Pull-Down-Menu zur Auswahl angeboten
+ werden. Die aktuell angewählte Menufunktion wird
+ jeweils invers dargestellt. Die Trennlinien, die in
+ einigen Pull-Down-Menus sichtbar sind, dienen nur
+ der optischen Untergliederung; sie können nicht an­
+ gewählt werden und werden deshalb automatisch über­
+ sprungen. Die einzelnen Menupunkte sind "zyklisch
+ miteinander verknüpft", das heißt, man gelangt vom
+ untersten Menupunkt wieder zum obersten und umge­
+ kehrt. Menupunkte, vor denen ein Minuszeichen steht
+ ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können
+ nicht angewählt werden und werden einfach über­
+ sprungen.
+
+- Durch Tippen der Fragezeichentaste (<?>) können Sie
+ sich jeweils zur aktuellen Menufunktion (invers im
+ Pull-Down-Menu) Informationen in das Menu einblen­
+ den lassen.
+
+- Um eine Menufunktion ausführen zu lassen, bewegen
+ Sie sich mit den Pfeiltasten auf die gewünschte Menu­
+ funktion im aktuellen Pull-Down-Menu und tippen
+ dann die <RETURN>-Taste. Steht vor dem gewünschten
+ Menupunkt ein einzelner Buchstabe oder eine Ziffer,
+ so kann durch Tippen der entsprechenden Taste diese
+ Menufunktion dadurch direkt aufgerufen werden. So­
+ bald eine Menufunktion aufgerufen worden ist, er­
+ scheint davor ein Stern ('*'). Daraus können Sie ent­
+ nehmen, daß das System bereits den Auftrag ausführt.
+
+- An verschiedenen Stellen werden Fragen an Sie ge­
+ richtet, die Sie mit 'ja' oder 'nein' beantworten müssen.
+ Tippen Sie dazu entsprechend der Entscheidung die
+ Taste <j> (für 'ja') bzw. <n> (für 'nein').
+
+- Werden Ihnen vom Menu aus Dateinamen zur Auswahl
+ angeboten, so können Sie den auf dem Bildschirm
+ sichtbaren Pfeil vor den gewünschten Namen positio­
+ nieren. Mit den Tasten <x> oder <RETURN> können Sie
+ den Namen ankreuzen. Ist die Auswahl mehrerer Datein­
+ amen möglich, so können Sie den Vorgang wiederholen.
+ Mit den Tasten <o> oder <RUBOUT> können Sie auch ein
+ Kreuz vor einem Namen wieder löschen. Daneben gibt es
+ noch einige Tastenfunktionen, die für die Bedienung
+ recht hilfreich sein können. Tippen Sie während der
+ Auswahl die Fragezeichentaste (<?>), so werden Ihnen
+ alle Bedienungsmöglichkeiten auf dem Bildschirm an­
+ gezeigt. Eine Auswahl, in der mehrere Dateien ange­
+ kreuzt werden dürfen, wird durch die Tastenfolge
+ <ESC><q> verlassen. Anschließend wird die eingestellte
+ Operation mit den angekreuzten Dateien ausgeführt.
+ Sind Sie versehentlich in eine solche Auswahl ge­
+ langt, so können Sie den Vorgang durch die Tasten­
+ kombination <ESC><h> abbrechen.
+
+- An einigen Stellen werden Sie aufgefordert, eine Ein­
+ gabe zu machen (z.B. einen Dateinamen einzugeben). Wird
+ Ihnen hier ein Vorschlag gemacht, den Sie akzeptieren,
+ so brauchen Sie zur Bestätigung nur die <RETURN>-
+ Taste zu tippen. Gefällt Ihnen der Vorschlag nicht
+ oder wird Ihnen kein Vorschlag gemacht, so machen Sie
+ bitte die gewünschte Eingabe. Zum Schreiben stehen
+ Ihnen alle aus dem Editor bekannten Funktionen zur
+ Verfügung. Mit der Taste <RUBOUT> können Sie Buch­
+ staben löschen, mit <RUBIN> einfügen. Die Eingabe wird
+ durch Tippen der <RETURN>-Taste abgeschlossen. Ist
+ der von Ihnen gewünschte Name schon in Ihrer Task
+ vorhanden und steht in der Fußzeile der Hinweis 'Zei­
+ gen: <ESC><z>', dann können Sie sich auch alle vorhan­
+ denen Namen zur Auswahl anbieten lassen und durch
+ Ankreuzen den beabsichtigten Namen auswählen.
+
+- Ihnen können auch mehrere Alternativen angeboten
+ werden, zwischen denen Sie wählen müssen. In der un­
+ tersten Zeile eines solchen Kastens, in denen Ihnen die
+ Alternativen auf dem Bildschirm eingeblendet werden,
+ sind die Möglichkeiten aufgeführt, die darüber be­
+ schrieben sind. Mit den Pfeiltasten können sie die
+ Markierung auf die gewünschte Alternative positio­
+ nieren und dann durch die <RETURN>-Taste zur Aus­
+ führung bringen. (Manchmal ist das auch durch Tippen
+ der den Alternativen vorangestellten Buchstaben oder
+ Ziffern möglich).
+
+- Durch die Tastenfolge <ESC><q> kann das Menu insge­
+ samt verlassen werden. Damit das nicht versehentlich
+ geschieht, wird jeweils die Frage gestellt, ob Sie das
+ Menu tatsächlich verlassen wollen. Diese Frage beant­
+ worten Sie bitte je nach Wunsch mit 'ja' oder 'nein'
+ durch Tippen der Tasten <j> bzw. <n>.
+
+#page#
+4.2 Menufunktionen zum Oberbegriff 'Info'
+
+ Das auf dem Bildschirm sichtbare Pull-Down-Menu ist
+oben abgebildet.
+
+#on("u")##on("b")#l Landschaftsgestaltung (a Arbeitsfeldgestaltung)#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich alle Tasten,
+ die bei der Landschafts-/Arbeitsfeldgestaltung
+ wirksam sind, anzeigen lassen.
+ In der Anzeige wird die jeweilige Tastenfunktion
+ erläutert. Während der Landschafts-/Arbeitsfeld­
+ gestaltung können Sie sich diese Informationen
+ durch Tippen der Fragezeichentaste (<?>) ebenfalls
+ einblenden lassen.
+
+#on("u")##on("b")#b Befehlsvorrat#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich die Befehle,
+ die Ihnen vom jeweiligen Modell zur Verfügung ge­
+ stellt werden, auf dem Bildschirm anzeigen lassen.
+ Anhand dieser Informationen können Sie auch
+ feststellen, ob in dem System, das Ihnen zur Verfü­
+ gung steht, der "eingeschränkte" oder "erweiterte"
+ Befehlssatz hinsichtlich der Tests realisiert ist.
+
+#on("u")##on("b")#s Steuerung des Laufs#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich die Möglich­
+ keiten anzeigen lassen, wie Sie auf einen Hamster-
+ /Roboterlauf durch Tastendruck Einfluß nehmen
+ können:
+
+ <ESC> : beende den Lauf (Programmabbruch
+ durch Tastendruck)
+ <?> : zeige diese Information (während des
+ Programmablaufs!)
+
+ 0 : Einzelschritt (dazu beliebige Taste
+ drücken)
+ 1 : geringste Geschwindigkeit
+ 9 : höchste Geschwindigkeit
+ 2 ... 8 : dazwischenliegende Geschwindigkeiten
+
+ <+> : laufe schneller
+ <-> : laufe langsamer
+
+ Zu Beginn eines Laufes ist die Geschwindigkeit '5'
+ eingestellt.
+#page#
+4.3 Menufunktionen zum Oberbegriff 'Landschaft'(Ar­
+ beitsfeld)
+
+#on("b")#
+HAMSTER: Info Landschaft Programm Lauf Archiv
+----------+--------------------+------------------------------------------
+ | n Neu erstellen |
+ | a Ansehen/Ändern |
+ | ---------------- |
+ | v Verzeichnis |
+ | ---------------- |
+ | l Löschen |
+ | d Drucken |
+ | ---------------- |
+ | k Kopieren |
+ | u Umbenennen |
+ +--------------------+
+
+
+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+#on("u")##on("b")#n Neu erstellen#off("b")##off("u")#
+ Mit dieser Funktion können Sie eine neue Land­
+ schaft/ein neues Arbeitsfeld unter einem neuen
+ Namen anlegen und gestalten.
+ Sie werden zunächst nach einem Namen für die
+ #on("u")#neue#off("u")# Landschaft/das #on("u")#neue#off("u")# Arbeitsfeld gefragt. Ge­
+ ben Sie einen beliebigen Namen (#on("u")#ohne Anführungs­
+ zeichen (!)#off("u")# und #on("u")#ohne das Präfix 'Flaeche:' (!)#off("u")#) ein und
+ schließen Sie die Eingabe durch <RETURN> ab. Dar­
+ aufhin wird Ihnen auf dem Bildschirm eine leere
+ Landschaft/ein leeres Arbeitsfeld angeboten.
+ Sollte schon eine Landschaft/ein Arbeitsfeld
+ mit diesem Namen in der Task vorhanden sein, so
+ werden Sie darauf aufmerksam gemacht. Sie können
+ sich während der Landschaftsgestaltung auch je­
+ derzeit eine Aufstellung der wirksamen Tasten mit
+ Beschreibung der Funktionen auf den Bildschirm
+ ausgeben lassen. Drücken Sie dazu die Fragezeichen­
+ taste (<?>).
+
+ Fehlerfälle:
+ - Eine Landschaft/ein Arbeitsfeld mit dem vorge­
+ schlagenen Namen existiert schon.
+
+#on("u")##on("b")#a Ansehen/Ändern#off("b")##off("u")#
+ Mit dieser Funktion können Sie schon in Ihrer
+ Task existierende Landschaften/Arbeitsfelder zur
+ Ansicht oder zur Überarbeitung anfordern.
+ Sie werden zunächst gefragt, ob Sie #on("u")#die zuletzt
+ bearbeitete Landschaft#off("u")#/#on("u")#das zuletzt bearbeitete Ar­
+ beitsfeld#off("u")# ansehen bzw. verändern möchten (sofern
+ Sie schon vorher mit dem Modell in der Task gear­
+ beitet haben).
+ Bejahen Sie diese Frage, dann wird Ihnen diese
+ Landschaft/dieses Arbeitsfeld zur Bearbeitung
+ angeboten. Verneinen Sie die Frage dagegen, so ge­
+ langen Sie in die 'Auswahl' (d.h es werden Ihnen alle
+ Landschaften/Arbeitsfelder in der Task zur Auswahl
+ angeboten). Nachdem Sie einen der Namen angekreuzt
+ haben, wird Ihnen die ausgewählte Landschaft/das
+ ausgewählte Arbeitsfeld zur Bearbeitung auf dem
+ Bildschirm angeboten. Ihnen stehen die Tastenfunk­
+ tionen wie bei der Neuerstellung zur Verfügung.
+
+ Fehlerfälle:
+ - In der Task existiert noch keine Landschaft/kein
+ Arbeitsfeld.
+
+#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich einen Über­
+ blick über die in Ihrer Task vorhandenen Land­
+ schaften/Arbeitsfelder verschaffen.
+ Nach Aufruf dieser Funktion wird eine Liste der
+ Landschaften/Arbeitsfelder auf dem Bildschirm
+ ausgegeben, die sich in Ihrer Task befinden. Da die
+ Liste selbst eine Datei ist, kann Sie mit der Tasten­
+ kombination <ESC><q> verlassen werden - hierauf
+ wird auch in der Kopfzeile der Datei hingewiesen.
+ Falls nicht alle Namen auf den Bildschirm passen,
+ können Sie das Fenster mit <HOP><runter> und
+ <HOP><hoch> verschieben.
+
+#on("u")##on("b")#l Löschen#off("b")##off("u")#
+ Mit dieser Funktion können Sie Landschaften/
+ Arbeitsfelder, die Sie nicht mehr benötigen, die
+ unnötig Platz belegen, löschen. Aber Vorsicht! Die
+ Landschaften/Arbeitsfelder verschwinden durch
+ diese Funktion unwiederbringlich!
+ Nach Aufruf dieser Funktion werden Ihnen alle
+ Landschaften/Arbeitsfelder, die sich in Ihrer Task
+ befinden, zur Auswahl angeboten. Hier können Sie
+ die gewünschten Namen ankreuzen. Die Auswahl wird
+ dann durch die Tastenfolge <ESC><q> verlassen.
+ Für jede einzelne Landschaft/jedes einzelne Ar­
+ beitsfeld wird noch einmal zur Sicherheit gefragt,
+ ob sie/es auch tatsächlich gelöscht werden soll. Zur
+ Bestätigung tippen Sie bitte die Taste <j> ('ja') - zur
+ Verhinderung <n> ('nein').
+
+ Fehlerfälle:
+ - In der Task exsitiert noch keine Landschaft/
+ kein Arbeitsfeld.
+
+#on("u")##on("b")#d Drucken#off("b")##off("u")#
+ Mit dieser Funktion können Sie Landschaften/
+ Arbeitsfelder über einen angeschlossenen Drucker
+ ausgeben lassen.
+ Nach Aufruf dieser Funktion werden Ihnen alle
+ Landschaften/Arbeitsfelder, die sich in Ihrer Task
+ befinden, zur Auswahl angeboten. Hier können Sie
+ die gewünschten Namen ankreuzen. Die Auswahl wird
+ dann durch die Tastenfolge <ESC><q> verlassen.
+ Die angekreuzten Landschaften/Arbeitsfelder
+ werden anschließend zum Drucker geschickt. Der
+ Vorgang wird auf dem Bildschirm protokolliert.
+
+ Fehlerfälle:
+ - In der Task existiert noch keine Landschaft/
+ kein Arbeitsfeld.
+ - Der Drucker ist nicht funktionsbereit.
+ - Der Drucker wird nicht über die Task 'PRINTER'
+ betrieben.
+ - Auf Ihrem System werden die Druckkosten abge­
+ rechnet. Sie müssen sich mit einer Codenummer
+ identifizieren.
+
+#on("u")##on("b")#k Kopieren#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich eine Kopie
+ einer/eines bereits in der Task vorhandenen Land­
+ schaft/Arbeitsfeldes anlegen. Das ist z.B. dann
+ sinnvoll, wenn Sie sich einen bestimmten 'Stand'
+ aufbewahren wollen oder wenn Sie eine Land­
+ schaft/ein Arbeitsfeld gestalten wollen, das einem
+ bereits vorhandenen ähnelt.
+ Nach Aufruf dieser Funktion werden Ihnen alle
+ Landschaften/Arbeitsfelder, die sich in Ihrer Task
+ befinden, zur Auswahl angeboten. Nach Ankreuzen
+ eines Namens wird die Auswahl automatisch verlas­
+ sen.
+ Anschließend wird der angekreuzte Name ange­
+ zeigt und der Name für die Kopie erfragt. Es muß ein
+ Name eingetragen werden, der in dieser Task noch
+ nicht für eine Landschaft/ein Arbeitsfeld verge­
+ ben wurde - ansonsten erfolgt ein Hinweis darauf
+ und es wird nicht kopiert!
+ Da man aber oft für die Kopie einen ähnlichen
+ Namen wie für das Original wählt, wird der 'alte'
+ Name vorgeschlagen. Aus genannten Gründen muß er
+ aber verändert werden. Sie können diesen Namen mit
+ den üblichen Editierfunktionen verändern oder mit
+ <HOP><RUBOUT> löschen und ganz neu eingeben. Sie
+ sparen aber eine Menge Tipparbeit, wenn Sie einen
+ langen Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Landschaft/ein Arbeitsfeld mit dem ge­
+ wünschten Namen existiert bereits in der Task.
+
+#on("u")##on("b")#u Umbenennen#off("b")##off("u")#
+ Mit dieser Funktion können Sie einer bereits
+ vorhandenen Landschaft/einem bereits vorhandenen
+ Arbeitsfeld einen neuen Namen geben.
+ Nach Aufruf dieser Funktion werden Ihnen alle
+ Landschaften/Arbeitsfelder, die sich in Ihrer Task
+ befinden, zur Auswahl angeboten. Nach Ankreuzen
+ eines Namens wird die Auswahl automatisch verlas­
+ sen.
+ Anschließend wird dieser Name angezeigt und der
+ zukünftige Name für die Landschaft/das Arbeitsfeld
+ erfragt. Es muß ein Name eingetragen werden, der in
+ dieser Task noch nicht für eine Landschaft/ein Ar­
+ beitsfeld vergeben wurde - ansonsten erfolgt ein
+ Hinweis darauf und die Landschaft/das Arbeitsfeld
+ wird nicht umbenannt!
+ Da man aber oft den 'neuen' Namen in Anlehnung
+ an den 'alten' Namen wählt, wird der 'alte' Name vor­
+ geschlagen. Aus genannten Gründen muß er aber
+ verändert werden. Sie können diesen Namen mit den
+ üblichen Editierfunktionen verändern oder mit
+ <HOP><RUBOUT> löschen und ganz neu eingeben. Sie
+ sparen aber eine Menge Tipparbeit, wenn Sie einen
+ langen Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Datei mit dem gewünschten Namen existiert
+ bereits in der Task.
+#page#
+4.4 Menufunktionen zum Oberbegriff 'Programm'
+
+#on("b")#
+HAMSTER: Info Landschaft Programm Lauf Archiv
+---------------------+--------------------+-------------------------------
+ | n Neu erstellen |
+ | a Ansehen/Ändern |
+ | ---------------- |
+ | v Verzeichnis |
+ | ---------------- |
+ | l Löschen |
+ | d Drucken |
+ | ---------------- |
+ | k Kopieren |
+ | u Umbenennen |
+ +--------------------+
+
+
+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+#on("u")##on("b")#n Neu erstellen#off("b")##off("u")#
+ Mit dieser Funktion können Sie eine neue Pro­
+ grammdatei anlegen und beschreiben.
+ Sie werden zunächst nach einem Namen für die
+ #on("u")#neue#off("u")# Programmdatei gefragt. Geben Sie einen belie­
+ bigen Namen (#on("u")#ohne Anführungszeichen (!)#off("u")#) ein und
+ schließen Sie die Eingabe durch <RETURN> ab. Dar­
+ aufhin wird Ihnen auf dem Bildschirm eine neue Da­
+ tei zum Beschreiben angeboten.
+ Sollte schon eine Programmdatei mit diesem Na­
+ men in der Task vorhanden sein, so werden Sie dar­
+ auf aufmerksam gemacht.
+ Sie können sich während des Schreibens die
+ wichtigsten Tastenfunktionen des Editers einblen­
+ den lassen. Tippen Sie dazu die Tastenfolge <ESC><?>.
+ Es erscheint dann das folgende Angebot aus dem Sie
+ auswählen können:
+
+ #on("b")#
+ +--------------------------------------------------+
+ | Der EUMEL - Editor |
+ | |
+ | b ... Beschreibung des Editors |
+ | w ... Wichtige Tasten |
+ | p ... Positionieren der Schreibmarke |
+ | k ... Korrigieren im Text (Einfügen/Löschen) |
+ | m ... Markierte Textpassagen bearbeiten |
+ | l ... Lernen im Editor |
+ | a ... Anweisungen im Editor (Kommandodialog) |
+ | |
+ | z ... Zurück in den Schreibmodus |
+ | |
+ | b w p k m l a z |
+ +--------------------------------------------------+
+#off("b")#
+
+ Fehlerfälle:
+ - Eine Datei mit dem vorgeschlagenen Namen exi­
+ stiert schon.
+
+#on("u")##on("b")#a Ansehen/Ändern#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich Dateien, die
+ schon in Ihrer Task existieren, ansehen oder auch
+ verändern.
+ Sie werden zunächst gefragt, ob Sie #on("u")#die zuletzt
+ bearbeitete Programmdatei#off("u")# ansehen bzw. verändern
+ möchten (sofern Sie schon vorher mit dem Modell in
+ der Task gearbeitet haben).
+ Bejahen Sie diese Frage, dann wird Ihnen diese
+ Programmdatei zur Bearbeitung angeboten. Vernei­
+ nen Sie die Frage dagegen, so gelangen Sie in die
+ 'Auswahl' (d.h es werden Ihnen alle Programmdateien
+ in der Task zur Auswahl angeboten). Nachdem Sie
+ einen der Namen angekreuzt haben, wird Ihnen die
+ ausgewählte Programmdatei zur Bearbeitung auf dem
+ Bildschirm angeboten.
+
+ Fehlerfälle:
+ - In der Task existiert noch keine Programmdatei.
+
+#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich einen Über­
+ blick über die in Ihrer Task vorhandenen Programm­
+ dateien verschaffen.
+ Nach Aufruf dieser Funktion wird eine Liste der
+ Programmdateien auf dem Bildschirm ausgegeben, die
+ sich in Ihrer Task befinden. Da die Liste selbst eine
+ Datei ist, kann Sie mit der Tastenkombination
+ <ESC><q> verlassen werden - hierauf wird auch in
+ der Kopfzeile der Datei hingewiesen. Falls nicht
+ alle Namen auf den Bildschirm passen, können Sie
+ das Fenster mit <HOP><runter> und <HOP><hoch> ver­
+ schieben.
+
+#on("u")##on("b")#l Löschen#off("b")##off("u")#
+ Mit dieser Funktion können Sie Programmdateien,
+ die Sie nicht mehr benötigen, die unnötig Platz be­
+ legen, löschen. Aber Vorsicht! Die Programmdateien
+ verschwinden durch diese Funktion unwieder­
+ bringlich!
+ Nach Aufruf dieser Funktion werden Ihnen alle
+ Programmdateien, die sich in Ihrer Task befinden,
+ zur Auswahl angeboten. Hier können Sie die ge­
+ wünschten Namen ankreuzen. Die Auswahl wird dann
+ durch die Tastenfolge <ESC><q> verlassen.
+ Für jede einzelne Programmdatei wird noch ein­
+ mal zur Sicherheit gefragt, ob sie auch tatsächlich
+ gelöscht werden soll. Zur Bestätigung tippen Sie
+ bitte die Taste <j> ('ja') - zur Verhinderung <n>
+ ('nein').
+
+ Fehlerfälle:
+ - In der Task exsitiert noch keine Programmdatei
+
+#on("u")##on("b")#d Drucken#off("b")##off("u")#
+ Mit dieser Funktion können Sie Programmdateien
+ über einen angeschlossenen Drucker ausgeben las­
+ sen.
+ Nach Aufruf dieser Funktion werden Ihnen alle
+ Programmdateien, die sich in Ihrer Task befinden,
+ zur Auswahl angeboten. Hier können Sie die ge­
+ wünschten Namen ankreuzen. Die Auswahl wird dann
+ durch die Tastenfolge <ESC><q> verlassen.
+ Die angekreuzten Programmdateien werden an­
+ schließend zum Drucker geschickt. Der Vorgang wird
+ auf dem Bildschirm protokolliert.
+
+ Fehlerfälle:
+ - In der Task existiert noch keine Programmdatei.
+ - Der Drucker ist nicht funktionsbereit.
+ - Der Drucker wird nicht über die Task 'PRINTER'
+ betrieben.
+ - Auf Ihrem System werden die Druckkosten abge­
+ rechnet. Sie müssen sich mit einer Codenummer
+ identifizieren.
+
+#on("u")##on("b")#k Kopieren#off("b")##off("u")#
+ Mit dieser Funktion können Sie sich eine Kopie
+ einer bereits in der Task vorhandenen Programmda­
+ tei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich
+ einen bestimmten 'Stand' aufbewahren wollen oder
+ wenn Sie ein Programm schreiben wollen, das einem
+ bereits vorhandenen ähnelt.
+ Nach Aufruf dieser Funktion werden Ihnen alle
+ Programmdateien, die sich in Ihrer Task befinden,
+ zur Auswahl angeboten. Nach Ankreuzen eines Na­
+ mens wird die Auswahl automatisch verlassen.
+ Anschließend wird der angekreuzte Name ange­
+ zeigt und der Name für die Kopie erfragt. Es muß ein
+ Name eingetragen werden, der in dieser Task noch
+ nicht für eine Programmdatei vergeben wurde; an­
+ sonsten erfolgt ein Hinweis darauf und es wird
+ nicht kopiert!
+ Da man aber oft für die Kopie einen ähnlichen
+ Namen wie für das Original wählt, wird der 'alte'
+ Name vorgeschlagen. Aus genannten Gründen muß er
+ aber verändert werden. Sie können diesen Namen mit
+ den üblichen Editierfunktionen verändern oder mit
+ <HOP><RUBOUT> löschen und ganz neu eingeben. Sie
+ sparen aber eine Menge Tipparbeit, wenn Sie einen
+ langen Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Programmdatei mit dem gewünschten Namen
+ existiert bereits in der Task.
+
+#on("u")##on("b")#u Umbenennen#off("b")##off("u")#
+ Mit dieser Funktion können Sie einer bereits
+ vorhandenen Programmdatei einen neuen Namen ge­
+ ben.
+ Nach Aufruf dieser Funktion werden Ihnen alle
+ Programmdateien, die sich in Ihrer Task befinden,
+ zur Auswahl angeboten. Nach Ankreuzen eines Na­
+ mens wird die Auswahl automatisch verlassen.
+ Anschließend wird dieser Name angezeigt und der
+ zukünftige Name für die Programmdatei erfragt. Es
+ muß ein Name eingetragen werden, der in dieser Task
+ noch nicht für eine Programmdatei vergeben wurde -
+ ansonsten erfolgt ein Hinweis darauf und die Pro­
+ grammdatei wird nicht umbenannt!
+ Da man aber oft den 'neuen' Namen in Anlehnung
+ an den 'alten' Namen wählt, wird der 'alte' Name vor­
+ geschlagen. Aus genannten Gründen muß er aber
+ verändert werden. Sie können diesen Namen mit den
+ üblichen Editierfunktionen verändern oder mit
+ <HOP><RUBOUT> löschen und ganz neu eingeben. Sie
+ sparen aber eine Menge Tipparbeit, wenn Sie einen
+ langen Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Programmdatei mit dem gewünschten Namen
+ existiert bereits in der Task.
+#page#
+4.5 Menufunktionen zum Oberbegriff 'Lauf'
+
+#on("b")#
+HAMSTER: Info Landschaft Programm Lauf Archiv
+---------------------------+------------------------+---------------------
+ | l Lauf nach Programm |
+ | h Handsteuerung |
+ +------------------------+
+
+
+
+
+
+
+
+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+#on("u")##on("b")#l Lauf nach Programm#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie den Ham­
+ ster/Roboter nach einem Programm in einer Land­
+ schaft/einem Arbeitsfeld laufen lassen. Sowohl das
+ Programm als auch die Landschaft/das Arbeitsfeld
+ müssen bereits existieren.
+ Sie werden zunächst gefragt, ob der Hamster/
+ Roboter #on("u")#das zuletzt bearbeitete Programm#off("u")# ausführen
+ soll. Bejahen Sie die Frage, so wird dieses Programm
+ ausgeführt; verneinen Sie die Frage dagegen, so
+ gelangen Sie in die 'Auswahl'. Nach Ankreuzen des
+ gewünschten Programmnamens wird das ausgewählte
+ Programm ausgeführt.
+ Nach der Abfrage bezüglich des Programmnamens
+ erfolgt dann eine weitere Abfrage nach dem Namen
+ der Landschaft/ des Arbeitsfeldes, in der/dem der
+ Hamster/Roboter nach dem zuvor ausgewählten Pro­
+ gramm laufen soll. Auch hier werden Sie zunächst
+ gefragt, ob Sie #on("u")#die zuletzt benutzte Landschaft/das
+ zuletzt benutzte Arbeitsfeld#off("u")# verwenden möchten.
+ Bejahen Sie die Frage, so wird das Programm in
+ dieser Landschaft/in diesem Arbeitsfeld ausge­
+ führt; verneinen Sie dagegen die Frage, so werden
+ Ihnen alle in der Task vorhandenen Landschaften/
+ Arbeitsfelder zur Auswahl angeboten. Durch An­
+ kreuzen eines Landschafts-/Arbeitsfeldnamens wird
+ die betreffende Landschaft/das betreffende Ar­
+ beitsfeld ausgewählt und das Programm in dieser
+ Landschaft/in diesem Arbeitsfeld ausgeführt.
+ Daneben haben Sie auch die Möglichkeit, im Pro­
+ gramm selbst als erste Anweisung den Befehl 'lands­
+ chaft ("Name");' oder 'arbeitsfeld ("Name");' anzuge­
+ ben. Für 'Name' muß dann natürlich der gewünschte
+ Landschafts-/Arbeitsfeldname eingetragen sein. Ist
+ eine solche Anweisung #on("u")#am Programmanfang#off("u")# vorhan­
+ den, so wird an Sie #on("u")#keine#off("u")# Abfrage bezüglich des
+ Landschafts-/Arbeitsfeldnamens gestellt; das Pro­
+ gramm wird in der #on("u")#angegebenen#off("u")# Landschaft/im #on("u")#ange­
+ gebenen#off("u")# Arbeitsfeld ausgeführt.
+ Sind im Programm noch Fehler enthalten, so wer­
+ den das Programm und die Fehlermeldungen gleich­
+ zeitig auf dem Bildschirm dargestellt (Paralleledi­
+ tor) und zur Korrektur angeboten. Für die Pro­
+ grammkorrektur stehen ebenfalls alle Editorfunk­
+ tionen zur Verfügung.
+ Während des Hamster-/Roboterlaufs können Sie
+ durch Tastendruck Einfluß nehmen (Geschwindigkeit
+ verändern, Programm abbrechen etc). Sehen Sie dazu
+ auch die Menufunktion 's Steuerung des Laufs' unter
+ dem Oberbegriff 'Info'. Standardmäßig beginnt ein
+ solcher Lauf immer mit einer mittleren Geschwin­
+ digkeit.
+ Ist der Hamster-/Roboterlauf ohne Fehler been­
+ det worden, werden Sie gefragt, ob Sie die Land­
+ schaft/das Arbeitsfeld in dem zuletzt angezeigten
+ Zustand aufbewahren wollen. Bejahen Sie diese Fra­
+ ge, so wird die Landschaft/das Arbeitsfeld in eine
+ Datei geschrieben. Die neue Landschaft/das neue
+ Arbeitsfeld erhält den Namen der alten Land­
+ schaft/des alten Arbeitsfeldes und das Zusatzkenn­
+ zeichen '.x'.
+ Sollte Ihnen beim Programmieren ein Fehler un­
+ terlaufen sein (z.B. eine Endlosschleife, so kann mit
+ der Taste <ESC> der Hamster-/Roboterlauf abgebro­
+ chen werden ("Notbremse").
+
+#on("u")##on("b")#h Handsteuerung#off("b")##off("u")#
+ Mit dieser Funktion können Sie den Hamster/
+ Roboter in einer/einem vorbereiteten Landschaft/
+ Arbeitsfeld durch Tasten steuern. Alle gültigen
+ Tastenbefehle werden in einem Protokoll festgehal­
+ ten. Da das entstehende Protokoll ein ELAN-
+ Programm ist, kann der Hamster/Roboter anschlie­
+ ßend die gleichen Aktionen anhand des Programms
+ wiederholt ausführen ('Teach In').
+ Sie werden zunächst gefragt, ob die Land­
+ schaft/das Arbeitsfeld, in dem der Hamster/Roboter
+ gesteuert werden soll, schon existiert. Beantworten
+ Sie die Frage mit 'nein', so werden Sie aufgefordert,
+ zunächst die Landschaft/das Arbeitsfeld zu gestal­
+ ten. Bejahen Sie die Frage, werden Ihnen alle in Ih­
+ rer Task vorhandenen Landschaften/Arbeitsfelder
+ zur Auswahl angeboten. Sie brauchen nur die ge­
+ wünschte Landschaft/das gewünschte Arbeitsfeld
+ anzukreuzen. Die/das angekreuzte Landschaft/Ar­
+ beitsfeld erscheint dann in folgender Darstellung
+ auf dem Bildschirm:
+
+#on("b")#
+#on("u")#Beispiel#off("u")#:
+
+ <v>or <l>inks um <n>imm <g>ib <p>rotokoll <e>nde
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . V . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . o\#\# o . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . .\#\# . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . o\#\# . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . .\#\# o . . . o . . . . . . . . . . . . . . .
+. . . . . . . . . . . . o\#\#\#\#\#\#\#\#\#\#\#\# o . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . o . o .\#\# . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . o\#\# . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . .\#\# . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . o\#\#o. . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+Gib Hamster-Befehl: letzter Befehl:
+
+#off("b")#
+ Durch Tastendruck können Sie nun den Hamster/
+ Roboter steuern (<v> - vor, <l> - links um, <n> -
+ nimm, <g> - gib). Sofern die Aktion ausführbar ist,
+ wird sie auf dem Bildschirm auch ausgeführt. Wird
+ dagegen eine Aktion verlangt, die nicht ausgeführt
+ werden kann (z.B. <v>, wenn der Hamster/Roboter
+ direkt vor einem Hindernis steht), so erscheint eine
+ entsprechende Fehlermeldung in der untersten Zeile
+ des Bildschirms. Nach einer kurzen Pause können
+ dann weitere Eingaben gemacht werden. Eine Fehlbe­
+ dienung führt also #on("u")#nicht#off("u")# zu einem Programmabbruch!
+ In der untersten Bildschirmzeile wird auch jeweils
+ der letzte Befehl zur Kontrolle angezeigt.
+ Alle korrekten Eingaben werden protokolliert.
+ Durch Drücken der Taste <p> (- protokoll) können Sie
+ sich jederzeit das während der Ausführung angeleg­
+ te Protokoll zeigen lassen. Es entsteht nämlich
+ automatisch im Hintergrund ein ablauffähiges
+ ELAN-Programm. Im Anschluß an eine solche Hand­
+ steuerung können Sie den Hamster/Roboter dann in
+ der gleichen Landschaft/im gleichen Arbeitsfeld
+ nach diesem Protokoll (Dateiname: PROTOKOLL) vom
+ Programm aus gesteuert laufen lassen.
+#page#
+4.6 Menufunktionen zum Oberbegriff 'Archiv'
+
+#on("b")#
+HAMSTER: Info Landschaft Programm Lauf Archiv
+---------------------------------+-------------------------+--------------
+ | r Reservieren |
+ | - Neue Diskette |
+ | --------------------- |
+ | - Schreiben |
+ | - Checken |
+ | - Kombination |
+ | - Holen/Lesen |
+ | - Löschen |
+ | --------------------- |
+ | - Verzeichnis |
+ | - Drucken |
+ | --------------------- |
+ | i Initialisieren |
+ | z Zieltask einstellen |
+ +---------------------+ +-------------------------+
+ | Dateiaustausch mit: |
+ | Archiv |
+ | Archivname: |
+ | --- |
+ +---------------------+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+ In diesem Kapitel werden alle die Menufunktionen be­
+schrieben, die Ihnen unter dem Oberbegriff 'Archiv' im
+Menu angeboten werden. Mit den Funktionen in diesem
+Menu können Sie aber nicht nur Dateien auf dem Archiv
+behandeln, sondern auch in anderen Tasks im Multi-
+User-System oder über das EUMEL-Netz sogar auf anderen
+Rechnern!
+ Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen
+haben, sind nicht alle Funktionen aktivierbar! Um weitere
+Funktionen zu aktivieren, muß erst einer der aktivierba­
+ren Menupunkte gewählt werden.
+ Bei der Archivbehandlung werden Ihnen jeweils alle in
+der Task vorhandenen Dateien zur Auswahl angeboten. Das
+System unterscheidet nicht von sich aus - wie unter den
+Oberbegriffen 'Landschaft'/'Arbeitsfeld' und 'Programm' -
+zwischen Landschaften/Arbeitsfeldern und Programmda­
+teien. In den hier gezeigten Listen können Sie aber Land­
+schaften/Arbeitsfelder daran erkennen, daß ihnen das
+Präfix 'Flaeche:' vorangestellt ist.
+
+#on("u")##on("b")#r Reservieren#off("b")##off("u")# (des Archivlaufwerks)
+ Im EUMEL-Multi-User-System haben normalerwei­
+ se mehrere Personen das Zugriffsrecht auf das Ar­
+ chivlaufwerk. Allerdings muß der Zugriff so gere­
+ gelt werden, daß sich die Beteiligten dabei nicht
+ gegenseitig "in die Quere kommen". Ein Zugriff auf
+ das Archivlaufwerk erfordert zunächst eine Anmel­
+ dung. Ist diese Anmeldung erfolgt, kann von den an­
+ deren Beteiligten so lange nicht mehr auf das Lauf­
+ werk zugegriffen werden - bis es wieder freigege­
+ ben worden ist.
+ Diese Anmeldung des Archivlaufwerkes erfolgt
+ über die Menufunktion 'r Reservieren'. Greift be­
+ reits eine andere Task auf das Laufwerk zu, so er­
+ halten Sie darüber einen Hinweis auf dem Bild­
+ schirm. Ansonsten wird an Sie die Frage gestellt, ob
+ die Diskette eingelegt und das Laufwerk geschlos­
+ sen ist.
+ Erst zu diesem Zeitpunkt ist sichergestellt, daß
+ Sie den alleinigen Zugriff auf das Laufwerk haben.
+ Deshalb sollten Sie, wenn Sie mit mehreren Personen
+ am Computer arbeiten, erst zum Zeitpunkt der Frage­
+ stellung die Diskette ins Laufwerk einlegen.
+ Nachdem Sie die Diskette eingelegt und die Frage
+ bejaht haben, ermittelt das System selbständig den
+ Namen der eingelegten Diskette, zeigt den Namen auf
+ dem Bildschirm (im kleinen Kasten links unten) an
+ und aktiviert die anderen Menupunkte des Pull-
+ Down-Menus.
+ Beim Verlassen des Pull-Down-Menus, wenn eine
+ andere Zieltask eingestellt wird oder wenn das Menu
+ gänzlich verlassen wird, wird die Reservierung au­
+ tomatisch aufgehoben!
+
+ Fehlerfälle:
+ - Das Laufwerk ist von einer anderen Task belegt.
+ - Die Diskette ist falsch eingelegt oder das Lauf­
+ werk ist nicht richtig geschlossen.
+ - Die Diskette ist nicht formatiert bzw. initiali­
+ siert.
+ - Die Diskette kann nicht gelesen werden (keine
+ EUMEL-Diskette, Diskette hat ein falsches For­
+ mat, Diskette ist verschmutzt...).
+
+#on("u")##on("b")#n Neue Diskette#off("b")##off("u")# (anmelden)
+ Der Dateiaustausch mit einer Diskette ist nur
+ dann möglich, wenn der im System eingestellte Dis­
+ kettenname (auf dem Bildschirm im kleinen Kasten
+ unten links sichtbar) mit dem tatsächlichen Namen
+ der Diskette übereinstimmt. Nach einem Disketten­
+ wechsel ist das aber in der Regel nicht mehr der
+ Fall. Greift man dann auf die neu eingelegte Dis­
+ kette zu, so erscheint die Fehlermeldung: 'Falscher
+ Archivname! Bitte neue Diskette anmelden!'.
+ Das Anmelden einer neuen Diskette - ohne einen
+ neuen Reserviervorgang - wird durch diese Menu­
+ funktion ermöglicht. Nach Aktivieren dieses Menu­
+ punktes wird der Name der eingelegten Diskette er­
+ mittelt, im System eingestellt und auf dem Bild­
+ schirm angezeigt.
+ Im Gegensatz zur Menufunktion 'r Reservieren'
+ greift das System ohne Anfrage an den Benutzer auf
+ das Archivlaufwerk zu (die Reservierung bleibt ja
+ bestehen). Ist das Archivlaufwerk reserviert, so ist
+ die Neuanmeldung einer Diskette über diese Menu­
+ funktion weniger zeitaufwendig.
+
+ Fehlerfälle:
+ - wie unter 'r Reservieren'.
+
+#on("u")##on("b")#s Schreiben#off("b")##off("u")# (Kopieren)
+ Alle Dateien der eigenen Task werden zur Aus­
+ wahl angeboten. Wenn Sie die Auswahl durch die
+ Tastenfolge <ESC><q> verlassen, überprüft das Sy­
+ stem zunächst, ob die Dateien in der eingestellten
+ Zieltask schon vorhanden sind. Ist das der Fall,
+ wird erfragt, ob die dort vorhandenen Dateien über­
+ schrieben, d.h. gelöscht werden dürfen (s.u.). An­
+ schließend werden alle angekreuzten Dateien in der
+ Reihenfolge, in der Sie sie angekreuzt haben, in die
+ eingestellte Zieltask kopiert. Der Vorgang wird auf
+ dem Bildschirm protokolliert. Die Originaldateien
+ in der eigenen Task bleiben dabei erhalten.
+ Wenn in der Zieltask schon eine Datei existiert,
+ die den gleichen Namen hat wie eine Datei, die Sie
+ dorthin kopieren möchten, so wird angefragt, ob die
+ vorher schon existierende Datei überschrieben (ge­
+ löscht!) werden soll. Bejahen Sie diese Frage, so wird
+ die bereits in der Zieltask existierende Datei (un­
+ wiederbringlich) gelöscht und die gewünschte Datei
+ dorthin transportiert. Ein Überschreiben aus Ver­
+ sehen ist nicht möglich, wenn Sie die an Sie gestell­
+ te Frage sorgfältig beantworten.
+ Verneinen Sie die Frage, so wird die Datei auch
+ nicht hinübertransportiert! Sie können die Datei
+ aber umbenennen (Menufunktion 'u Umbenennen' un­
+ ter den Oberbegriffen 'Landschaft'/Arbeitsfeld' bzw.
+ 'Programm') und anschließend mit anderem Namen
+ hinüberschreiben.
+ Beachten Sie, daß beim Überschreiben einer Datei
+ auf einer Archivdiskette der Speicherplatz der al­
+ ten (überschriebenen) Version im allgemeinen nicht
+ wiederverwendet werden kann. In einem solchen Fall
+ könnte die Diskette voll geschrieben werden, obwohl
+ eigentlich genügend Platz vorhanden wäre. Zur Op­
+ timierung wird deshalb zuerst überprüft, ob die
+ angekreuzten Dateien schon in der Zieltask vorhan­
+ den sind und löscht diese, wenn Sie Ihr Einver­
+ ständnis geben. Erst anschließend werden die Datei­
+ en insgesamt kopiert.
+ Normalerweise ist als Zieltask das Archivlauf­
+ werk der eigenen Station eingestellt. Mit der Menu­
+ funktion 'z Zieltask einstellen' kann diese Einstel­
+ lung aber verändert werden.
+
+ Fehlerfälle:
+ - Die Diskette ist falsch eingelegt oder beschä­
+ digt.
+ - Die Diskette kann nicht beschrieben werden
+ (Schreibfehler).
+ - Die Diskette ist voll.
+ - Sehen Sie auch unter 'r Reservieren'
+ 'z Zieltask einstellen'.
+
+#on("u")##on("b")#c Checken#off("b")##off("u")#
+ Diese Menufunktion kann nur ausgeführt werden,
+ wenn der Dateiaustausch mit einem Archiv(manager)
+ erfolgt - ansonsten ist diese Menufunktion auch
+ nicht aktivierbar. Die Menufunktion dient dazu, auf
+ Diskette geschriebene Dateien auf Lesefehler hin zu
+ prüfen. Es empfiehlt sich, diese Prüfroutine auf
+ neu auf die Diskette geschriebene Dateien anzuwen­
+ den. Sehen Sie dazu auch 'k Kombination'.
+ Alle Dateien der eingestellten Zieltask (Archiv)
+ werden zur Auswahl angeboten. Wenn Sie die Auswahl
+ durch die Tastenfolge <ESC><q> verlassen, werden
+ alle angekreuzten Dateien in der Reihenfolge, in
+ der Sie sie angekreuzt haben, "gecheckt", d.h. auf
+ Lesefehler hin überprüft. Der Vorgang wird auf dem
+ Bildschirm protokolliert.
+
+ Fehlerfälle:
+ - Lesefehler auf dem Archiv.
+ - Sehen Sie auch unter 'r Reservieren'.
+
+#on("u")##on("b")#k Kombination#off("b")##off("u")#
+ Diese Menufunktion ist eine Kombination aus den
+ beiden Menufunktionen 's Schreiben' und 'c Checken'
+ (Sehen Sie weitere Informationen auch dort!).
+ Alle Dateien der eigenen Task werden zur Aus­
+ wahl angeboten. Wenn Sie die Auswahl durch die Ta­
+ stenfolge <ESC><q> verlassen, werden alle ange­
+ kreuzten Dateien in der Reihenfolge, in der Sie sie
+ angekreuzt haben, in die eingestellte Zieltask ko­
+ piert (gegebenenfalls müssen bereits vorhandene
+ Dateien gleichen Namens in der Zieltask gelöscht
+ werden). Anschließend werden alle Dateien, die gera­
+ de geschrieben wurden, gecheckt, d.h. auf Lesefehler
+ hin untersucht. Beide Vorgänge werden auf dem
+ Bildschirm protokolliert.
+ Da die 'Check' - Operation nur bei Archivmana­
+ gern zulässig ist, ist diese Menufunktionen eben­
+ falls nur bei Archivmanagern aktivierbar. Zur Er­
+ läuterung sehen Sie bitte auch unter 'z Zieltask
+ einstellen'.
+
+#on("u")##on("b")#h Holen/Lesen#off("b")##off("u")#
+ Die Menufunktion dient dazu, Dateien, die bereits
+ auf einer Archivdiskette oder in einer anderen Task
+ existieren, in die eigene Task zu kopieren.
+ Alle Dateien der eingestellten Zieltask werden
+ zur Auswahl angeboten. Anschließend werden Kopien
+ der angekreuzten Dateien in der Reihenfolge des
+ Ankreuzens in die eigene Task geholt. Das Original
+ in der Zieltask bleibt dabei unverändert! Der Vor­
+ gang wird auf dem Bildschirm protokolliert.
+ Sind in der eigenen Task schon Dateien mit glei­
+ chem Namen vorhanden, so wird gefragt, ob die 'al­
+ ten' Dateien überschrieben (gelöscht) werden dürfen.
+ Nur wenn Sie zustimmen, werden die in Ihrer Task
+ existierenden Dateien (unwiederbringlich!) gelöscht
+ und Kopien der gleichnamigen Dateien aus der Ziel­
+ task angefertigt.
+ Stimmen Sie dem Löschvorgang nicht zu, dann
+ bleiben die bisherigen Dateien in Ihrer Task erhal­
+ ten - die Dateien aus der Zieltask werden dann aber
+ auch nicht in Ihre Task kopiert! Um dennoch die Ko­
+ pien zu erhalten, können Sie die namensgleichen
+ Dateien in Ihrer Task umbenennen und dann erst die
+ Dateien aus der anderen Task anfordern.
+ Normalerweise werden die Dateien vom Archiv der
+ eigenen Station geholt. Mit dem Menupunkt 'z Ziel­
+ task einstellen' kann diese Einstellung verändert
+ werden.
+
+ Fehlerfälle:
+ - Lesefehler auf dem Archiv.
+ - Sehen Sie auch unter 'r Reservieren'
+ 's Schreiben'
+ 'z Zieltask einstellen'.
+
+#on("u")##on("b")#l Löschen#off("b")##off("u")#
+ Die Menufunktion dient dazu, Dateien in der
+ Zieltask (unwiederbringlich!) zu löschen. Dazu wer­
+ den alle Dateien der eingestellten Zieltask zur Aus­
+ wahl angeboten. Anschließend werden die angekreuz­
+ ten Dateien in der Reihenfolge ihres Ankreuzens
+ gelöscht. Zur Sicherheit muß noch einmal für jede
+ einzelne Datei bestätigt werden, daß sie auch tat­
+ sächlich gelöscht werden soll.
+ Beachten Sie, daß beim Löschen einer Datei auf
+ einer Archivdiskette der Speicherplatz im allgemei­
+ nen nicht wieder verwendet werden kann. In einem
+ solchen Fall könnte die Diskette voll geschrieben
+ werden, obwohl eigentlich genügend Platz vorhan­
+ den wäre. Diese Probleme treten bei anderen Tasks,
+ die keine Archivmanager sind, nicht auf, da deren
+ Speicherplatz intelligenter verwaltet wird.
+ Normalerweise ist als Zieltask das Archiv der
+ eigenen Station eingestellt. Mit dem Menupunkt 'z
+ Zieltask einstellen' kann diese Einstellung verän­
+ dert werden.
+
+ Fehlerfälle:
+ - Sehen Sie auch unter 'r Reservieren'
+ 's Schreiben'
+ 'z Zieltask einstellen'.
+
+#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie sich einen
+ Überblick über die in der Zieltask (z.B. auf dem Ar­
+ chiv) vorhandenen Dateien verschaffen.
+ Nach Aufruf der Funktion wird eine Liste der
+ Dateien auf dem Bildschirm ausgegeben, die sich in
+ der Zieltask (z.B. auf dem Archiv) befinden. Ist die
+ Zieltask ein Archiv(manager), so wird auch ange­
+ zeigt, wieviel Platz auf der Diskette belegt ist. Da
+ die Liste selbst eine Datei ist, kann sie mit der Ta­
+ stenkombination <ESC><q> verlassen werden. Falls
+ nicht alle Dateinamen auf den Bildschirm passen,
+ können Sie das Fenster mit <HOP><hoch> und
+ <HOP><runter> verschieben.
+
+ Fehlerfälle:
+ - Sehen Sie unter 'z Zieltask einstellen'.
+
+#on("u")##on("b")#d Drucken#off("b")##off("u")#
+ Das Verzeichnis der Dateien in der Zieltask, das
+ man mit der Menufunktion 'v Verzeichnis' auf dem
+ Bildschirm angezeigt bekommt, kann mit dieser Me­
+ nufunktion ausgedruckt werden.
+ Zur Sicherheit wird angefragt, ob wirklich ein
+ solches Dateiverzeichnis der Zieltask gedruckt wer­
+ den soll. Bejaht man die Frage, so wird ein Dateiver­
+ zeichnis erstellt und zum Drucker geschickt.
+
+ Fehlerfälle:
+ - Der Drucker ist nicht funktionsbereit.
+ - Der Drucker wird nicht über die Task 'PRINTER'
+ betrieben.
+ - Auf Ihrem System werden die Druckkosten abge­
+ rechnet. Sie müssen sich mit einer Codenummer
+ identifizieren.
+
+#on("u")##on("b")#i Initialisieren#off("b")##off("u")#
+ Diese Menufunktion gestattet es, frische Disket­
+ ten zu formatieren, zu initialisieren bzw. be­
+ schriebene Disketten vollständig zu löschen und
+ ggf. dabei umzubenennen. Bei Aufruf dieser Menu­
+ funktion wird - sofern noch nicht geschehen - das
+ Archivlaufwerk automatisch reserviert.
+ Wenn Sie eine fabrikneue Diskette aus der Ver­
+ packung nehmen, müssen Sie diese zunächst #on("u")#forma­
+ tieren#off("u")#. Dabei wird die Diskette auf ein festgelegtes
+ physikalisches Format eingestellt. Ohne daß diese
+ Operation vorausgegangen ist, kann eine Diskette
+ weder beschrieben noch gelesen werden.
+ Prinzipiell braucht eine Diskette nur ein einzi­
+ ges Mal formatiert zu werden. Sie können Sie jedoch
+ jederzeit wieder formatieren - z.B. wenn Sie Disket­
+ ten haben, von denen Sie nicht genau wissen, für
+ welche Zwecke sie zuvor verwendet wurden.
+ Wenn Sie diese Menufunktion aktivieren, werden
+ Sie so zunächst gefragt, ob Sie die Diskette auch
+ formatieren wollen. Bejahen Sie die Frage, so werden
+ Ihnen mehrere Formate zur Auswahl angeboten:
+
+#on ("b")#
+ +------------------------------------+
+ | Formatieren einer Diskette |
+ | |
+ | Dies sind die möglichen Formate: |
+ | |
+ | 1 ..... 40 Spur - 360 KB |
+ | 2 ..... 80 Spur - 720 KB |
+ | 3 ..... 5 1/4" - 1,2 MB |
+ | 4 ..... 3 1/2" - 1,4 MB |
+ | s ..... Standard - Format |
+ | |
+ | 1 2 3 4 s |
+ +------------------------------------+
+#off("b")#
+
+ Erkundigen Sie sich bei Ihrem Händler, welches
+ Format Sie bei Ihrem Rechner und den von Ihnen
+ verwendeten Disketten einstellen müssen. Manche
+ Rechner unterstützen diese Operation innerhalb des
+ EUMEL-Systems auch gar nicht, das Formatieren muß
+ dann irgendwie anders außerhalb des EUMEL-Systems
+ geschehen.
+ Wenn Sie die Formatierung abgeschlossen oder
+ auch übersprungen haben, beginnt die eigentliche
+ Initialisierung der Diskette. Dabei wird als erstes
+ der Archivname auf die Diskette geschrieben. Alle
+ alten Daten, die sich ggf. auf der Diskette befinden,
+ werden bei diesem Vorgang unwiederbringlich (!)
+ gelöscht.
+ Zur Sicherheit überprüft das System in jedem
+ Falle, ob es sich um eine EUMEL - Diskette handelt,
+ und erfragt Ihr Einverständnis, ob die Diskette
+ wirklich initialisiert werden soll. Geben Sie hierzu
+ Ihr Einverständnis, dann wird noch der (neue) Ar­
+ chivname erfragt. Hatte die Diskette schon einen
+ Namen, dann wird dieser zum Überschreiben angebo­
+ ten. Wollen Sie den alten Archivnamen beibehalten,
+ so brauchen Sie nur die <RETURN>-Taste zu tippen,
+ ansonsten können Sie den Namen auch zuvor verän­
+ dern oder einen ganz neuen Namen hinschreiben.
+ Anhand des ausgegebenen Namens können Sie auch
+ überprüfen, ob Sie die richtige Diskette eingelegt
+ haben.
+ Das Initialisieren funktioniert natürlich nur,
+ wenn Sie als Zieltask einen Archivmanager einge­
+ stellt haben - ansonsten ist diese Menufunktion
+ gesperrt (nicht aktivierbar!).
+
+ Fehlerfälle:
+ - Formatieren ist nicht auf dem System möglich.
+ - Sehen Sie auch unter 'r Reservieren'
+ 'z Zieltask einstellen'.
+
+#on("u")##on("b")#z Zieltask einstellen#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie festlegen,
+ mit welcher Zieltask Sie kommunizieren, d.h. z.B. Da­
+ teien austauschen möchten. Normalerweise ist hier
+ das Archiv am eigenen Rechner eingestellt. Das wird
+ auch nach Aufklappen des Pull-Down-Menus im Ka­
+ sten links unten angezeigt.
+ Diese Menufunktion kann im Unterricht z.B. dazu
+ genutzt werden, um fertiggestellte Hausaufgaben in
+ eine bestimmte Task zu schicken (Vatertask) oder um
+ von dort z.B. vorgefertigte Landschaften oder/und
+ Programme abzuholen.
+ Sie können aber auch eine andere Task einstellen
+ (z.B. die Vatertask oder die Task 'PUBLIC'), um mit die­
+ sen Dateien auszutauschen oder um sich auch nur ei­
+ nen Überblick über die dort vorhandenen Dateien zu
+ verschaffen. Wenn Sie mit Ihrem Rechner in ein
+ EUMEL-Netz integriert sind, können Sie auch auf
+ Tasks anderer Rechner zugreifen oder auch Disketten
+ von Laufwerken anderer Rechner einlesen (z.B. wenn
+ Sie Disketten anderer Formate haben, die von Ihrem
+ Rechner nicht gelesen werden können).
+ Dabei werden zwei Anforderungen an die Zieltask
+ gestellt: Sie muß existieren und bereit für den Da­
+ teiaustausch sein, d.h es muß eine Managertask sein,
+ auf die Sie Zugriff haben. Versuchen Sie auf andere
+ Tasks zuzugreifen, so erhalten Sie entsprechende
+ (Fehler-)Meldungen.
+ Zu beachten ist noch, daß es im EUMEL-System ver­
+ schiedene Arten von Managertasks gibt - Archivma­
+ nager und normale Dateimanager. Der Unterschied
+ besteht darin, daß ein Archivmanager vom Benutzer
+ vor dem Zugriff reserviert werden muß - anschlie­
+ ßend hat nur dieser Benutzer (bis zur Aufgabe der
+ Reservierung) ein Zugriffsrecht auf den Manager.
+ Normale Dateimanager können dagegen von mehreren
+ Benutzern in beliebiger Reihenfolge angesprochen
+ werden.
+ Ein Archivmanager kann auch auf bestimmte Dis­
+ kettenformate spezialisert sein (z.B. auf das Lesen
+ von DOS-Disketten). Manche Rechner haben auch meh­
+ rere Archivmanager für verschiedene Laufwerke etc.
+ Durch Einstellen unterschiedlicher Archivmanager
+ können Sie dann auf verschiedenen Laufwerken ar­
+ chivieren.
+ Nach Aktivieren dieses Menupunktes werden Ihnen
+ die folgenden Alternativen angeboten:
+
+#on ("b")#
+ +-------------------------------------------+
+ | Dateiaustausch gewünscht mit: |
+ | |
+ | a ... Archiv (Eigene Station) |
+ | |
+ | v ... Vatertask |
+ | |
+ | p ... 'PUBLIC' (Eigene Station) |
+ | |
+ | s ... Sonstige Task |
+ | |
+ | |
+ | Archiv Vatertask PUBLIC Sonstige |
+ +-------------------------------------------+
+
+ Da der Dateiaustausch mit dem Standardarchiv
+ der eigenen Station (Task: 'ARCHIVE'), mit der Vater­
+ task und der Task 'PUBLIC' recht häufig in Anspruch
+ genommen wird, sind diese drei Optionen unter den
+ Alternativen direkt angegeben. Entscheiden Sie sich
+ für eine dieser drei Tasks, so nimmt das System alle
+ notwendigen Einstellungen vor. Möchten Sie dage­
+ gen in Kontakt mit einer anderen Task treten, so
+ wählen Sie die Alternative 's ... Sonstige Task'.
+ In diesem Falle haben Sie noch 3 Angaben zu machen:
+
+ - Zunächst werden Sie nach dem Namen der Zieltask
+ gefragt. Geben Sie den Namen der Zieltask - ohne
+ Anführungsstriche (!) - ein und schließen Sie die
+ Eingabe mit der <RETURN>-Taste ab. (Den ausge­
+ gebenen Namen der z.Z. eingestellten Task können
+ Sie dabei verändern bzw. überschreiben.)
+
+ - Dann wird die Nummer der Station im EUMEL-Netz
+ erfragt, auf der sich die Zieltask befindet. Die
+ Nummer Ihrer Station wird als Vorschlag ausge­
+ geben. Wollen Sie mit einer Task auf Ihrem Rech­
+ ner kommunizieren, so brauchen Sie diesen Vor­
+ schlag nur durch Drücken der <RETURN>-Taste
+ bestätigen - ansonsten tragen Sie zuvor die ent­
+ sprechende Stationsnummer ein. Ist Ihr Rechner
+ nicht in ein EUMEL-Netz integriert, so wird die
+ Stationsnummer 0 (Null) ausgegeben. Bitte bestä­
+ tigen Sie diese Stationsnummer durch Tippen der
+ <RETURN>-Taste.
+
+ - Zum Abschluß müssen Sie noch angeben, ob die
+ eingestellte Zieltask ein Archivmanager ist oder
+ nicht.
+
+ Das System versucht dann den Kontakt herzu­
+ stellen. Je nachdem, welche Einstellung Sie vorge­
+ nommen haben, sind bestimmte Funktionen innerhalb
+ des Menus nicht aktivierbar. Das System läßt nur
+ die Funktionen zu, die aufgrund Ihrer Einstellun­
+ gen zulässig sind.
+ Im Kasten links unten auf dem Bildschirm wird
+ jeweils angezeigt, welche Zieltask eingestellt ist.
+ Erscheint in diesem Kasten auch ein Hinweis auf den
+ Archivnamen, so haben Sie einen Archivmanager ein­
+ gestellt. Ist dagegen vor dem Namen der Zieltask
+ noch eine Zahl und ein Schrägstrich angegeben, so
+ haben Sie eine Zieltask auf einem anderen Rechner
+ eingestellt.
+ Bedenken Sie, daß Operationen mit Tasks auf an­
+ deren Stationen länger andauern können - werden
+ Sie nicht ungeduldig!
+ Sie können die Einstellung der Zieltask jeder­
+ zeit wieder verändern!
+
+ Fehlerfälle:
+ - Die eingestellte Zieltask existiert nicht.
+ - Die eingestellte Zieltask existiert zwar, ist aber
+ nicht empfangsbereit, d.h. ein Zugriff von Ihrer
+ Task aus ist nicht möglich!
+ - Das Netz ist nicht funktionsbereit (Collector-
+ Task fehlt).
+ - Die Kommunikation war nicht erfolgreich.
+ - Die gewünschte Operation kann mit der einge­
+ stellten Zieltask nicht ausgeführt werden (Ziel­
+ task ist z.B. gar kein Archivmanager - Sie aber
+ versuchen, das Laufwerk zu reservieren).
+
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5
new file mode 100644
index 0000000..bb4a67b
--- /dev/null
+++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5
@@ -0,0 +1,167 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (61)#
+#headodd#
+#center#gs-Herbert und Robbi#right#%
+
+#end#
+#headeven#
+%#center#gs-Herbert und Robbi
+
+#end#
+#center#5
+
+#center#Detailbeschreibung
+#center#der
+#center#Basisbefehle
+
+
+#on("u")#'vor' bewirkt:#off("u")#
+ - ein Eingabezeichen wird von der Tastatur gelesen
+ und ausgewertet.
+ - es wird je nach Verzögerungsfaktor (eine vorgege­
+ bene Wartezeit, die auch während des Programmlaufs
+ verändert werden kann) gewartet.
+ - falls die Kachel vor dem Hamster/Roboter noch frei
+ ist und zur Landschaft/zum Arbeitsfeld gehört,
+ geht der Hamster/ Roboter um eine Kachel in der
+ augenblicklichen Richtung vorwärts.
+ - falls vor dem Hamster/Roboter ein Hindernis liegt,
+ oder wenn er im Begriff ist, aus der Landschaft/aus
+ dem Arbeitsfeld herauszulaufen, wird das Programm
+ mit entsprechender Fehlermeldung abgebrochen.
+
+#on("u")#'links um' bewirkt:#off("u")#
+ - wie bei 'vor': Annahme eines Tastendruckes und
+ Warten.
+ - eine Drehung des Hamsters/Roboters um 90 Grad ge­
+ gen den Uhrzeigersinn.
+
+#on("u")#'nimm' bewirkt:#off("u")#
+ - wie bei 'vor': Annahme eines Tastendruckes und
+ Warten.
+ - falls auf der Kachel, auf der der Hamster/Roboter
+ steht, kein Korn/Werkstück liegt, wird das Programm
+ mit entsprechender Fehlermeldung abgebrochen.
+ - falls dort genau ein Korn/ein Werkstück liegt, wird
+ dieses auf dem Bildschirm entfernt. Es wird zu denen
+ in den Backentaschen/im Behälter addiert. Auf dem
+ Bildschirm erscheint an der Stelle (" .").
+ - falls mehrere Körner/Werkstücke dort liegen, wird
+ eines zu denen in den Backentaschen/im Behälter
+ addiert und von denen auf der Kachel subtrahiert.
+ Auf dem Bildschirm erscheint weiterhin an der Stel­
+ le (" o").
+
+#on("u")#'gib' bewirkt:#off("u")#
+ - wie bei 'vor': Annahme eines Tastendruckes und
+ Warten.
+ - falls die Backentaschen/der Behälter leer sind/ist,
+ wird das Programm mit entsprechender Fehlermel­
+ dung abgebrochen.
+ - falls auf der Kachel schon ein Korn/Werkstück oder
+ mehrere Körner/Werkstücke liegen, wird zu ihnen
+ eines addiert und von denen in den Backentaschen/
+ im Behälter subtrahiert. Der Bildschirm ändert sich
+ nicht.
+ - falls noch kein Korn/Werkstück auf dieser Kachel
+ liegt, wird auf dem Bildschirm ein (" o") ausgegeben
+ und von den Körnern/Werkstücken in den Backenta­
+ schen/im Behälter ein Korn/Werkstück subtrahiert.
+
+#on("u")#'vorn frei'#off("u")#
+ - liefert den Wahrheitswert TRUE, wenn vor dem Ham­
+ ster/ Roboter keine Hinderniskachel liegt, #on("u")#also
+ auch dann, wenn der Hamster/Roboter im Begriff ist,
+ über die Landschafts-/Arbeitsfeldgrenze (den
+ Bildschirmrand) hinauszulaufen!#off("u")# Wenn vor dem Ham­
+ ster/Roboter eine Hinderniskachel liegt, wird der
+ Wahrheitswert FALSE geliefert.
+
+#on("u")#'links frei'#off("u")#
+ - liefert den Wahrheitswert TRUE, wenn in Laufrich­
+ tung links vom Hamster/ Roboter keine Hindernis­
+ kachel liegt, #on("u")#also auch dann, wenn links vom Ham­
+ ster/Roboter die Landschafts-/Arbeitsfeldgrenze
+ (der Bildschirmrand) ist!#off("u")# Wenn links vom Hamster/
+ Roboter eine Hinderniskachel liegt, wird der Wahr­
+ heitswert FALSE geliefert.
+
+#on("u")#'rechts frei'#off("u")#
+ - liefert den Wahrheitswert TRUE, wenn in Laufrich­
+ tung rechts vom Hamster/Roboter keine Hindernis­
+ kachel liegt, #on("u")#also auch dann, wenn rechts vom Ham­
+ ster/Roboter die Landschafts-/Arbeitsfeldgrenze
+ (der Bildschirmrand) ist!#off("u")# Wenn rechts vom Hamster/
+ Roboter eine Hinderniskachel liegt, wird der Wahr­
+ heitswert FALSE geliefert.
+
+#on("u")#'hinten frei'#off("u")#
+ - liefert den Wahrheitswert TRUE, wenn in Laufrich­
+ tung hinter dem Hamster/Roboter keine Hindernis­
+ kachel liegt, #on("u")#also auch dann, wenn hinter dem Ham­
+ ster/Roboter die Landschafts-/Arbeitsfeldgrenze
+ (der Bildschirmrand) ist!#off("u")# Wenn hinter dem Hamster/
+ Roboter eine Hinderniskachel liegt, wird der Wahr­
+ heitswert FALSE geliefert.
+
+#on("u")#'korn da' und 'werkstueck da'#off("u")#
+ - liefern den Wahrheitswert TRUE, wenn auf der
+ Kachel, auf der der Hamster/Roboter steht, minde­
+ stens ein Korn/Werkstück liegt. Ansonsten wird der
+ Wahrheitswert FALSE geliefert.
+
+#on("u")#'korn vorn' und 'werkstueck vorn'#off("u")#
+ - liefern den Wahrheitswert TRUE, wenn auf der
+ Kachel, die in Laufrichtung vor dem Hamster/Robo­
+ ter liegt, mindestens ein Korn/Werkstück liegt. An­
+ sonsten wird der Wahrheitswert FALSE geliefert.
+ - Zur "Untersuchung" wird die vor ihm liegende
+ Kachel - sofern dort kein Hindernis ist - von ihm
+ betreten. Wenn er im Begriff ist, aus der Land­
+ schaft/dem Arbeitsfeld herauszulaufen, wird das
+ Programm mit entsprechender Fehlermeldung abge­
+ brochen.
+
+#on("u")#'korn links' und 'werkstueck links'#off("u")#
+ - liefern den Wahrheitswert TRUE, wenn auf der
+ Kachel, die in Laufrichtung links vom Hamster/
+ Roboter liegt, mindestens ein Korn/Werkstück liegt.
+ Ansonsten wird der Wahrheitswert FALSE geliefert.
+ - Zur "Untersuchung" wird die links neben ihm lie­
+ gende Kachel - sofern dort kein Hindernis ist - von
+ ihm betreten. Wenn er im Begriff ist, aus der Land­
+ schaft/dem Arbeitsfeld herauszulaufen, wird das
+ Programm mit entsprechender Fehlermeldung abge­
+ brochen.
+
+#on("u")#'korn rechts' und 'werkstueck rechts'#off("u")#
+ - liefern den Wahrheitswert TRUE, wenn auf der
+ Kachel, die in Laufrichtung rechts vom Hamster/
+ Roboter liegt, mindestens ein Korn/Werkstück liegt.
+ Ansonsten wird der Wahrheitswert FALSE geliefert.
+ - Zur "Untersuchung" wird die rechts neben ihm lie­
+ gende Kachel - sofern dort kein Hindernis ist - von
+ ihm betreten. Wenn er im Begriff ist, aus der Land­
+ schaft/dem Arbeitsfeld herauszulaufen, wird das
+ Programm mit entsprechender Fehlermeldung abge­
+ brochen.
+
+#on("u")#'korn hinten' und 'werkstueck hinten'#off("u")#
+ - liefern den Wahrheitswert TRUE, wenn auf der
+ Kachel, die in Laufrichtung hinter dem Hamster/
+ Roboter liegt, mindestens ein Korn/Werkstück liegt.
+ Ansonsten wird der Wahrheitswert FALSE geliefert.
+ - Zur "Untersuchung" wird die hinter ihm liegende
+ Kachel - sofern dort kein Hindernis ist - von ihm
+ betreten. Wenn er im Begriff ist, aus der Land­
+ schaft/dem Arbeitsfeld herauszulaufen, wird das
+ Programm mit entsprechender Fehlermeldung abge­
+ brochen.
+
+#on("u")#'backen leer' und 'behaelter leer'#off("u")#
+ - liefern den Wahrheitswert TRUE, wenn kein Korn/
+ kein Werkstück in den Backentaschen/im Behälter
+ notiert ist. Ansonsten wird der Wahrheitswert FALSE
+ geliefert.
+
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6
new file mode 100644
index 0000000..0aeeff0
--- /dev/null
+++ b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6
@@ -0,0 +1,73 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (66)#
+#headodd#
+#center#gs-Herbert und Robbi#right#%
+
+#end#
+#headeven#
+%#center#gs-Herbert und Robbi
+
+#end#
+#center#6
+
+#center#Zusätzliche Kommandos
+
+
+PROC landschaft (TEXT CONST landschaftsname)
+PROC arbeitsfeld (TEXT CONST arbeitsfeldname)
+ Steht einer dieser Prozeduraufrufe innerhalb eines
+ Hamster-/ Roboterprogramms vor dem ersten Befehl (am
+ Anfang der Datei), so wird die Anfrage nach einem Land­
+ schafts-/Arbeitsfeldnamen zu Beginn des Laufs über­
+ gangen. Außerdem ist es möglich, den Hamster/Roboter
+ in einem Programm durch meherere Landschaften/Ar­
+ beitsfelder laufen zu lassen. Beachten Sie bitte, daß
+ der Landschaftsname / Arbeitsfeldname hier in Anfüh­
+ rungszeichen, aber #on("u")#ohne#off("u")# das Präfix 'Flaeche:' angegeben
+ werden muß!
+
+PROC geschwindigkeit (INT CONST wert)
+ Möchte man von einem Programm aus eine bestimmte
+ Geschwindigkeit des Hamsters/Roboters bei der Pro­
+ grammausführung festlegen oder die Geschwindigkeit
+ vom Programm aus verändern, so kann man diese Proze­
+ dur verwenden. Zulässig sind für 'wert' nur Werte zwi­
+ schen 0 und 9. Dabei bedeuten:
+ 0: Einzelschrittmodus - Ausführung des nächsten
+ Schritts auf Tastendruck
+ 1: geringste Geschwindigkeit (Wartezeit : ca.
+ 50 Zehntelsekunden )
+ 9: höchste Geschwindigkeit (Wartezeit :
+ keine)
+ 2 - 8 sind dazwischenliegende Geschwindigkeiten
+
+TEXT PROC taste
+ Diese Prozedur liefert jeweils ein eingetipptes
+ Zeichen. Die Taste <ESC>, welche zum Programmabbruch
+ dient, wirkt sich schon aus, bevor hier ein Zeichen ge­
+ liefert werden könnte.
+
+PROC druckereinstellung fuer flaechenausdruck
+ Für den Landschafts-/Arbeitsfeldausdruck ist der
+ Standardschrifttyp des Druckers voreingestellt. Dabei
+ müssen 80 Druckpositionen in einer Zeile Platz haben.
+ Außerdem sind voreingestellt : \#limit (20.5)\#, \#on("b")\#
+ (Fettdruck) und \#start (0.0,0.0)\#. Zur Darstellung der
+ Hinderniskacheln wird das Zeichen '\#\#' (Code 222) ver­
+ wendet. Kann Ihr Drucker dieses Zeichen nicht darstel­
+ len (z.B. Typenraddrucker mit deutschem Zeichenzatz), so
+ können Sie hier ein #on("u")#anderes Zeichen#off("u")# auswählen. Weiter­
+ hin können Sie mit dieser Prozedur einen #on("u")#anderen
+ Schrifttyp#off("u")# und eine #on("u")#andere Startposition#off("u")# (linker obe­
+ rer Eckpunkt des Druckfeldes) einstellen. Nachdem Sie
+ das Kommando gegeben haben, wird zunächst der ge­
+ wünschte Schrifttyp erfragt. Geben Sie hier einen in
+ Ihrer Installation vorhandenen Schrifttyp an (nur den
+ Namen - ohne Anführungszeichen!). Anschließend werden
+ Sie nacheinander nach den beiden Startwerten (erst die
+ x-Richtung und dann die y-Richtung) gefragt. Geben
+ Sie hier jeweils einen Wert (als REAL) ein. Bedenken Sie
+ dabei, daß die 80 Druckpositionen nebeneinander Platz
+ haben müssen!
+
diff --git a/doc/hamster/gs-Herbert und Robbi handbuch.impressum b/doc/hamster/gs-Herbert und Robbi handbuch.impressum
new file mode 100644
index 0000000..4c8e79d
--- /dev/null
+++ b/doc/hamster/gs-Herbert und Robbi handbuch.impressum
@@ -0,0 +1,87 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#gs-Herbert und Robbi
+
+
+
+
+#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#
+
+#free (4.0)##on("b")#
+#center#gs-Herbert und Robbi
+
+
+#center#Benutzerhandbuch
+
+
+#center#Version 1.0
+
+
+#off("b")##center#copyright
+#center#Eva Latta-Weber
+#center#Software- und Hardware-Systeme, 1988
+#center#ERGOS GmbH, 1990
+#page#
+#block#
+#center#____________________________________________________________________________
+
+
+Copyright:  ERGOS GmbH   März 1990
+
+ Alle Rechte vorbehalten. Insbesondere ist die Überführung in
+ maschinenlesbare Form sowie das Speichern in Informations­
+ systemen, auch auszugsweise, nur mit schriftlicher Einwilliging
+ Einwilligung der ERGOS GmbH gestattet.
+
+#center#____________________________________________________________________________
+
+Es kann keine Gewähr übernommen werden, daß das Programm für eine
+bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
+Anwender.
+
+Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
+Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
+Handbuch kann jederzeit ohne Ankündigung geändert werden.
+
+Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
+ erstellt und aufbereitet und auf einem Kyocera Laser­
+ drucker gedruckt.
+
+
+
+
+#center#___________________________________________________________________________
+
+
+
+Ergonomic Office Software GmbH
+
+Bergstr. 7 Telefon: (02241) 63075
+5200 Siegburg Teletex: 2627-2241413=ERGOS
+ Telefax: (02241) 63078
+
+
+#center#____________________________________________________________________________
+
diff --git a/doc/lisp/lisp handbuch b/doc/lisp/lisp handbuch
new file mode 100644
index 0000000..022c561
--- /dev/null
+++ b/doc/lisp/lisp handbuch
@@ -0,0 +1,2260 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#Lisp
+
+
+
+
+#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#
+#free(7.0)#
+#center#LISP - Handbuch
+#free(2.0)#
+Stand: 08.08.86
+
+Installation von LISP
+
+begin ("LISP")
+reserve ("sprachen",archive)
+fetch all(archive)
+insert ("lisp.1")
+insert ("lisp.2")
+insert ("lisp.3")
+insert ("lisp.4")
+global manager
+begin ("lisp","LISP")
+fetch ("lisp.bootstrap")
+lisp
+#page#
+#start(2.5,1.5)#
+#block#
+#pageblock#
+#head#
+#center#LISP-Handbuch
+#center#%
+
+
+#end#
+
+
+#center#L I S P H a n d b u c h
+
+
+#center#Autor: John Mc.Carthy (M.I.T.1962)
+#center#übersetzt und angepaßt von J.Durchholz, P.Heyderhoff
+#center#Gesellschaft für Mathematik und Datenverarbeitung Sankt Augustin
+
+
+
+Inhaltsverzeichnis
+
+
+
+1. Die Sprache LISP #right##topage("p1")#
+
+1.1 Symbolische Ausdrücke #right##topage("p1.1")#
+1.2 Elementare Funktionen #right##topage("p1.2")#
+1.3 Listen Notation #right##topage("p1.3")#
+1.4 Syntax und Semantik der Sprache #right##topage("p1.4")#
+
+2. Das LISP-Interpreter-System #right##topage("p2")#
+
+2.1 Die universelle LISP-Funktion "evalquote" #right##topage("p2.1")#
+2.2 Anwendungsregeln und Beispiele #right##topage("p2.2")#
+2.3 Variablen #right##topage("p2.3")#
+2.4 Konstanten #right##topage("p2.4")#
+2.5 Funktionen #right##topage("p2.5")#
+
+3. Erweitertes LISP #right##topage("p3")#
+
+3.1 Gequotete Parameter #right##topage("p3.1")#
+3.2 Funktionen mit beliebig vielen Parametern #right##topage("p3.2")#
+3.3 Funktionale Parameter #right##topage("p3.3")#
+3.4 Prädikate und boolesche Konstanten #right##topage("p3.4")#
+3.5 Unbenannte Atome #right##topage("p3.5")#
+3.6 Aufruf von EUMEL aus #right##topage("p3.6")#
+
+4. Detailbeschreibungen #right##topage("p4")#
+
+4.1 Grundfunktionen #right##topage("p4.1")#
+4.2 Weitere Funktionen sowie Eingabe und Ausgabe #right##topage("p4.2")#
+4.3 Interpreter #right##topage("p4.3")#
+4.4 Kommandoprozeduren #right##topage("p4.4")#
+#page#
+
+1. Die Sprache LISP#goalpage("p1")#
+
+
+
+Die Sprache LISP ist primär für die Symbolmanipulation entworfen. Sie wurde für
+symbolische Berechnungen in verschiedenen Gebieten der künstlichen Intelligenz
+eingesetzt, u.a. für Differential- und Integralrechnung, Schaltkreistheorie, Mathemati­
+sche Logik, Spiele, etc..
+
+LISP ist eine formale mathematische Sprache. Daher ist es möglich, eine genaue und
+vollständige Beschreibung zu geben. Das ist der Sinn des ersten Abschnitts dieses
+Handbuchs. Andere Abschnitte werden Möglichkeiten zum vorteilhaften Einsatz von
+LISP und die Erweiterungen, die die Benutzung erleichtern, beschreiben.
+
+LISP unterscheidet sich von den meisten Programmiersprachen in drei Punkten.
+
+Der erste Punkt liegt in der Natur der Daten. In der Sprache LISP haben alle Daten
+die Form symbolischer Ausdrücke, die wir verkürzend LISP-Ausdrücke nennen wer­
+den. LISP-Ausdrücke haben keine Längenbegrenzung und eine verzweigte Baum­
+struktur, so daß Unterausdrücke leicht isoliert werden können. In LISP wird der meiste
+Speicherplatz für das Abspeichern der LISP-Ausdrücke in Form von Listenstruktu­
+ren gebraucht.
+
+Der zweite wichtige Teil der Sprache LISP ist die Quellsprache, die festlegt, wie die
+LISP-Ausdrücke verarbeitet werden sollen.
+
+Drittens kann LISP als LISP-Ausdrücke geschriebene Programme interpretieren und
+ausführen. Deshalb kann man die Sprache analog zu Assemblersprachen und im
+Gegensatz zu den meisten anderen höheren Programmiersprachen einsetzen, um
+Programme zu generieren, die gleich ausgeführt werden sollen.
+
+
+#page#
+
+1.1 Symbolische Ausdrücke #goalpage("p1.1")#
+
+
+
+Ein elementarer Ausdruck ist ein Atom.
+
+Definition: Ein Atom ist eine Zeichenkette bestehend aus Großbuchstaben und
+ Ziffern.
+
+
+Beispiele: A
+ APFEL
+ TEIL2
+ EXTRALANGEZEICHENKETTEAUSBUCHSTABEN
+ A4B66XYZ2
+
+
+Diese Symbole werden atomar genannt, weil sie als Ganzes aufgefaßt werden, das
+durch die LISP-Funktionen nicht weiter geteilt werden kann. A, B, und AB haben
+keinerlei Beziehung zueinander, außer der, daß sie alle verschiedene Atome sind.
+
+Alle LISP-Ausdrücke werden aus Atomen und den Satzzeichen "(", ")" und "."
+aufgebaut. Die grundlegende Operation zum Aufbau von LISP-Ausdrücken ist die,
+zwei LISP-Ausdrücke zusammenzufassen, um einen größeren herzustellen. Aus den
+zwei Atomen A und B kann man so den LISP-Ausdruck (A.B) bilden.
+
+Definition: Ein LISP-Ausdruck ist entweder ein Atom, oder aus folgenden Elemen­
+ ten in dieser Reihenfolge aufgebaut: Eine öffnende Klammer, ein
+ LISP-Ausdruck, ein Punkt, ein LISP-Ausdruck, eine schließende
+ Klammer. Zwischen den Bestandteilen eines nichtatomaren LISP-Aus­
+ druck können beliebig viele Leerzeichen eingestreut sein.
+
+Diese Definition ist rekursiv.
+
+
+Beispiele: ATOM
+ (A . B)
+ (A . (B . C))
+ ((A1 . A2) . B)
+ ((U . V) . (X . Y))
+ ((U . V) . (X . (Y . Z)))
+
+
+Um die Struktur solcher Ausdrücke zu verdeutlichen, wird in diesem Handbuch oft
+eine graphische Darstellung gewählt. In dieser Darstellung sind die Atome weiterhin
+Zeichenketten, statt der Paare steht jetzt aber ein Kasten
+
+
+ +-----+-----+
+ | o | o |
+ +-----+-----+
+
+
+von dem zwei Zeiger ausgehen, die auf die graphische Darstellung des ersten bzw.
+zweiten Elements des Paars zeigen.
+
+
+
+Beispiele: (A . B) +-----+-----+
+ | o | o |
+ +--+--+--+--+
+ | |
+ V V
+ A B
+
+ (A . (B . C)) +-----+-----+
+ | o | o |
+ +--+--+--+--+
+ | |
+ V V
+ A +-----+-----+
+ | o | o |
+ +--+--+--+--+
+ | |
+ V V
+ B C
+
+ ((U . V) . (X . (Y . Z))) +-----+-----+
+ | o | o |
+ +--+--+--+--+
+ | |
+ V V
+ +-----+-----+ +-----+-----+
+ | o | o | | o | o |
+ +--+--+--+--+ +--+--+--+--+
+ | | | |
+ V V V V
+ U V X +-----+-----+
+ | o | o |
+ +--+--+--+--+
+ | |
+ V V
+ Y Z
+
+
+
+
+
+
+#page#
+
+1.2 Elementare Funktionen #goalpage("p1.2")#
+
+
+Wir werden einige elementare Funktionen auf LISP-Ausdrücken einführen. Um die
+Funktionen von den LISP-Ausdrücken zu unterscheiden, werden wir Funktionsnamen
+mit Klein- statt Großbuchstaben schreiben. Außerdem steht der Funktionsname
+gefolgt von den Argumenten, auf die die Funktion angewendet werden soll, in Klam­
+mern eingeschlossen in einer Liste. Dabei sind die Argumente durch Blanks vonein­
+ander getrennt.
+
+Die erste Funktion, die wir einführen, heißt "cons". Sie hat zwei Argumente und wird
+dafür benutzt, LISP-Ausdrücke aus kleineren LISP-Ausdrücken aufzubauen.
+
+
+ Funktionsaufruf: Ergebnis:
+
+Beispiele: (cons A B) = (A . B)
+ (cons (A . B) C) = ((A . B) . C)
+ (cons (cons A B) C) = ((A . B) . C)
+
+
+Die Beispiele zeigen Funktionsaufrufe. Ein Funktionsaufruf ist eine Liste beginnend
+mit einem Funktionsnamen, gefolgt von Argumenten. Alle Funktionsaufrufe haben ein
+Ergebnis, das im Fall von LISP-Funktionen immer ein LISP-Ausdruck ist.
+
+In diesen Beispielen kommt nur die Funktion "cons" vor. Das letzte Beispiel ist ein
+Fall von Funktionsverkettung, das heißt, als Argument steht ein Funktionsaufruf. Um
+das Ergebnis eines Funktionsaufrufs zu berechnen, das Funktionsaufrufe als Argu­
+mente enthält, muß man statt dieser Argumente die Ergebnisse dieser Funktionsaufru­
+fe einsetzen, so daß man den äußeren Funktionsaufruf in einen Aufruf ohne Funk­
+tionsaufrufe als Argumente umwandelt.
+
+
+Beispiel: (cons (cons A B) C) = (cons (A . B) C) = ((A . B) . C)
+
+
+Es ist möglich, durch Verkettung der Funktion "cons" jeden LISP-Ausdruck aus
+seinen atomaren Komponenten aufzubauen.
+
+Die folgenden beiden Funktionen tun das genaue Gegenteil von "cons": sie liefern
+die Unterausdrücke eines gegebenen LISP-Ausdrucks.
+
+Die Funktion "head" hat ein Argument. Ihr Wert ist der erste Unterausdruck des
+zusammengesetzen Arguments. Der "head" eines Atoms ist nicht definiert.
+
+
+Beispiele: (head (A . B)) = A
+ (head (A . (B1 . B2))) = A
+ (head ((A1 . A2) . B)) = (A1 . A2)
+ (head A) ist nicht definiert
+
+
+Die Funktion "tail" hat ebenfalls ein Argument, und sie liefert das Argument bis auf
+dessen "head".
+
+
+Beispiele: (tail (A . B)) = B
+ (tail (A . (B1 . B2))) = (B1 . B2)
+ (tail ((A1 . A2) . B)) = B
+ (tail A) ist nicht definiert
+ (head (tail (A . (B1 . B2)))) = B1
+ (head (tail (A . B))) ist nicht definiert
+ (head (cons A B)) = A
+
+
+Es ist bei jedem LISP-Ausdruck möglich, durch eine geeignete Verkettung von
+"head" und "tail" zu jedem Atom im Ausdruck zu gelangen.
+
+Wenn "x" und "y" irgendwelche LISP-Ausdrücke repräsentieren, gelten die folgen­
+den Gleichungen immer:
+
+
+ (head (cons x y)) = x
+ (tail (cons x y)) = y
+
+
+Außerdem gilt die folgende Gleichung für jeden nichtatomaren LISP-Ausdruck "z":
+
+
+ (cons (head z) (tail z)) = z
+9
+
+Die Symbole "x", "y" und "z", die wir in diesen Gleichungen benutzt haben, nennt
+man Variablen. In LISP werden Variable benutzt, um LISP-Ausdrücke zu repräsentie­
+ren, und zwar repräsentiert eine Variable in einer Gleichung immer denselben
+LISP-Ausdruck. Variablennamen werden wie Funktionsnamen gebildet, d.h. sie
+können Kleinbuchstaben und Ziffern enthalten.
+
+Eine Funktion, deren Wert "wahr" oder "falsch" sein kann, wird Prädikat genannt. In
+LISP werden die Werte "wahr" und "falsch" durch die Atome "T" (true) und "F"
+(false) vertreten. Ein LISP-Prädikat ist also eine Funktion, deren Wert entweder "T"
+oder "F" ist.
+
+Das Prädikat "eq" ist ein Gleichheitstest für Atome. Es ist bei nicht atomaren Argu­
+menten nicht definiert.
+
+
+Beispiele: (eq A A) = T
+ (eq A B) = F
+ (eq A (A . B)) ist nicht definiert
+ (eq (A . B) B) ist nicht definiert
+ (eq (A . B) (A . B)) ist nicht definiert
+
+
+Das Prädikat "atom" hat das Ergebnis ("liefert") "T", wenn sein Argument atomar ist,
+und "F", wenn sein Argument zusammengesetzt ist.
+
+
+Beispiele: (atom EXTRALANGEZEICHENKETTE) = T
+ (atom (U . V)) = F
+ (atom (head (U . V))) = T
+
+#page#
+
+1.3 Listen-Notation #goalpage("p1.3")#
+
+
+
+Alle LISP-Ausdrücke, die wir bisher gesehen haben, waren in Punkt-Notation
+geschrieben. Normalerweise ist es allerdings einfacher, statt der vielen Punkte und
+Klammern Listen von LISP-Ausdrücken zu schreiben, etwa in der Art (A B C XYZ).
+
+LISP bietet eine solche Alternative zur Punkt-Notation an:
+
+Definition: Die Liste (a1 a2 ... an) ist äquivalent zum LISP-Ausdruck
+ (a1 . (a2 . (... . (an . NIL) ... ))).
+
+Graphisch ausgedrückt heißt das:
+
+
+ +-----+-----+
+ | o | o |
+ +--+--+--+--+
+ | |
+ V V
+ a1 +-----+-----+
+ | o | o |
+ +--+--+--+--+
+ | |
+ V V
+ a2
+ .
+ .
+ .
+
+ +-----+-----+
+ | o | o |
+ +--+--+--+--+
+ | |
+ V V
+ an NIL
+
+
+
+Oft werden wir für Listen auch die graphische Form
+
+
+ +-----+-----+ +-----+-----+ +-----+-----+
+ | o | o--+-->| o | o--+--> . . . | o | o--+--> NIL
+ +--+--+-----+ +--+--+-----+ +--+--+-----+
+ | | |
+ V V V
+ a1 a2 an
+
+
+benutzen.
+
+Aus der Graphik wird deutlich, daß NIL als eine Art Abschlußmarkierung für Listen
+dient.
+
+Eine leere Liste wird durch das Atom NIL dargestellt. Das Prädikat "null" liefert "T",
+wenn sein Argument eine leere Liste ist, sonst "F".
+
+
+Beispiele: (null NIL) = T
+ (null () ) = T
+ (null (A B)) = F
+
+
+Die Listenelemente können selbst wieder Listen oder Paare in Punkt-Notation sein,
+so daß Listen- und Punkt-Notation beliebig kombinierbar sind.
+
+
+ Beispiele: (A B C) = (A . (B . (C . NIL)))
+
+ +-----+-----+ +-----+-----+ +-----+-----+
+ | o | o--+-->| o | o--+-->| o | o--+--> NIL
+ +--+--+-----+ +--+--+-----+ +--+--+-----+
+ | | |
+ V V V
+ A B C
+
+ ((A . B) C) = ((A . B) . (C . NIL))
+
+ +-----+-----+ +-----+-----+
+ | o | o--+-->| o | o--+--> NIL
+ +--+--+-----+ +--+--+-----+
+ | |
+ V V
+ +-----+-----+ C
+ | o | o |
+ +--+--+--+--+
+ | |
+ V V
+ A B
+
+ ((A B) C) = ((A . (B . NIL)) . (C . NIL))
+
+ +-----+-----+ +-----+-----+
+ | o | o--+--------------->| o | o--+--> NIL
+ +--+--+-----+ +--+--+-----+
+ | |
+ | V
+ V C
+ +-----+-----+ +-----+-----+
+ | o | o--+-->| o | o--+--> NIL
+ +--+--+-----+ +--+--+-----+
+ | |
+ V V
+ A B
+
+ (A) = (A . NIL)
+
+ +-----+-----+
+ | o | o--+--> NIL
+ +--+--+-----+
+ |
+ V
+ A
+
+ ((A)) = ((A . NIL) . NIL)
+
+ +-----+-----+
+ | o | o--+--> NIL
+ +--+--+-----+
+ |
+ V
+ +-----+-----+
+ | o | o--+--> NIL
+ +--+--+-----+
+ |
+ V
+ A
+
+
+
+
+
+Es ist sehr hilfreich, mit den Ergebnissen der elementaren Funktionen vertraut zu
+sein, wenn diese Listen als Argumente erhalten. Zwar können die Ergebnisse notfalls
+immer durch Übersetzung in Punkt-Notation bestimmt werden, aber ein direktes
+Verständnis ist einfacher.
+
+
+Beispiele: (head (A B C)) = A
+ (tail (A B C)) = (B C)
+
+
+ (Daher auch die Namen "head" und "tail"! Frei übersetzt heißen die
+ beiden Funktionen "anfang" und "rest".)
+
+
+ (cons A (B C)) = (A B C)
+
+#page#
+
+1.4 Syntax und Semantik der Sprache #goalpage("p1.4")#
+
+
+
+Wir haben bisher einen Datentyp (LISP-Ausdrücke) und fünf elementare Funktionen
+eingeführt. Außerdem haben wir die folgenden Eigenschaften der Sprache beschrie­
+ben:
+
+1. Funktions- und Variablennamen werden wie die Namen von Atomen geschrie­
+ ben, außer, daß dafür Klein- statt Großbuchstaben verwendet werden.
+2. Die Argumente einer Funktion folgen dieser in der Liste. Eine solche Liste von
+ Funktion und folgenden Argumenten heißt Funktionsaufruf und hat einen LISP-
+ Ausdruck als Ergebnis.
+3. Funktionen können dadurch verkettet werden, daß ein Argument aus einem Funk­
+ tionsaufruf selbst wieder ein Funktionsaufruf ist, dessen Argumente selbst wieder
+ Funktionsaufrufe sein können, usw.
+
+Diese Regeln erlauben es, Funktionsdefinitionen wie
+
+
+ (third x) = (head (tail (tail x)))
+
+
+zu schreiben. "third" holt das dritte Element aus einer Liste.
+
+Die Klasse der Funktionen, die man auf diese Weise bilden kann, ist ziemlich be­
+schränkt und nicht sehr interessant. Eine viel größere Funktionenklasse kann man mit
+Hilfe des bedingten Ausdrucks schreiben; es handelt sich dabei um eine Möglichkeit,
+Verzweigungen in Funktionsdefinitionen einzubauen.
+
+Ein bedingter Ausdruck hat die Form
+
+
+ (cond (p1 a1) (p2 a2) ... (pn an) )
+
+
+Jedes pi ist ein Ausdruck, dessen Wert "T" oder "F" ist, also ein Prädikat. Die ai
+sind beliebige LISP-Ausdrücke.
+
+Die Bedeutung eines bedingten Ausdrucks ist folgende: Wenn p1 wahr ist, ist a1 der
+Wert des ganzen Ausdrucks. Wenn p1 falsch ist, wird getestet, ob p2 wahr ist; wenn
+das der Fall ist, ist a2 der Wert des Ausdrucks. Die pi werden also von links nach
+rechts durchgegangen, bis ein wahrer Ausdruck gefunden ist; das zugehörige ai ist
+dann der Wert des bedingten Ausdrucks. Wenn kein wahres pi gefunden ist, ist der
+bedingte Ausdruck nicht definiert.
+Jedes pi oder ai kann selbst wieder ein LISP-Ausdruck, ein Funktionsaufruf oder ein
+bedingter Ausdruck sein.
+
+
+Beispiel: (cond ((eq (head x) A) (cons B (tail x))) (T x) )
+
+
+Das Prädikat "T" ist immer wahr. Man liest es am besten als "SONST". Den Wert
+dieses Ausdruck erhält man, wenn man "head" von x durch B ersetzt, wenn der
+gerade gleich mit A ist, und sonst erhält man x.
+
+Der Hauptzweck von bedingten Ausdrücken ist die rekursive Definition von Funktio­
+nen.
+
+
+Beispiel: (firstatom x) = (cond ((atom x) x)
+ ( T (firstatom (head x)))
+ )
+
+
+Dies Beispiel definiert die Funktion "firstatom", die das erste Atom jedes LISP-Aus­
+drucks bestimmt. Diesen Ausdruck kann man so lesen: wenn "x" ein Atom ist, ist "x"
+selbst die Antwort; sonst muß "firstatom" auf "head" von "x" angewandt werden.
+
+Wenn also "x" ein Atom ist, wird der erste Zweig gewählt, der "x" liefert; sonst wird
+der zweite Zweig "firstatom (head x)" gewählt, weil "T" immer wahr ist.
+
+Die Definition von "firstatom" ist rekursiv, d.h. "firstatom" ist mit durch sich selbst
+definiert. Allerdings, wenn man immerzu den "head" von irgendeinem LISP-Aus­
+druck nimmt, errreicht man irgendwann ein Atom, so daß der Prozeß immer wohlde­
+finiert ist.
+
+Es gibt rekursive Funktionen, die nur für bestimmte Argumente wohldefiniert sind, für
+bestimmte andere dagegen unendlich rekursiv. Wenn das EUMEL-LISP-System
+einen Funktionsionsaufruf mit einer solchen Funktion und "kritischen" Argumenten
+interpretiert, gerät es in unendliche Rekursion, bis entweder der zur Verfügung ste­
+hende Platz im LISP-Heap ausgeschöpft ist (im Heap werden die LISP-Ausdrücke
+gespeichert) oder bis der Laufzeitstack überläuft (der Laufzeitstack ist ein normaler­
+weise unsichtbarer Bestandteil des ELAN-Systems).
+Wir werden jetzt die Berechnung von "(firstatom ((A . B) . C))" durchführen. Zunächst
+ersetzen wir die Variable x in der Funktionsdefinition durch ((A . B) . C) und erhalten
+
+
+ (firstatom ((A . B) . C)) =
+ (cond ( (atom ((A . B) . C)) ((A . B) . C) )
+ ( T (firstatom (head ((A . B) . C))) )
+ )
+
+((A . B) . C) ist kein Atom, deshalb wird daraus
+
+ = (cond ( T (firstatom (head ((A . B) . C)))) )
+ = (firstatom (head ((A . B) . C)) )
+ = (firstatom (A . B))
+
+
+
+An diesem Punkt müssen wir wieder die Definition von "firstatom" benutzen, diesmal
+aber für "x" überall "(A . B)" einsetzen.
+
+
+ (firstatom (A . B)) = (cond ( (atom (A . B)) (A . B) )
+ (T (firstatom (head (A . B))) )
+ )
+ = (cond (T (firstatom (head (A . B))) ) )
+ = (firstatom (head (A . B)) )
+ = (firstatom A)
+ = (cond ((atom A) A)
+ (T (firstatom (head A)) )
+ )
+ = A
+
+
+Wenn in den bedingten Ausdrücken statt der LISP-Ausdrücke arithmetische Aus­
+drücke verwendet würden, könnte man damit auch numerische Rechenvorschriften
+definieren, wie z.B. den Betrag einer Zahl durch
+
+
+ (abs x) = (cond ((x < 0) -x) (T x) )
+
+
+oder die Fakultät durch
+
+
+ (fak n) = (cond ((n = 0) 1)
+ (T (x * (fak (n - 1))))
+ )
+
+
+Die Fakultät terminiert bei negativen Argumenten nicht.
+
+Es ist bei den meisten Mathematikern (außer den Logikern) üblich, das Wort "Funk­
+tion" nicht präzise zu verwenden und auf Ausdrücke wie "2x+y" anzuwenden. Da wir
+Ausdrücke benutzen werden, die Funktionen repräsentieren, benötigen wir eine
+Notation, die Funktionen und Ausdrücke unterscheidet. Dafür ist die Lambda-Nota­
+tion von Alonzo Church geeignet.
+"f" soll ein Ausdruck sein, der für eine Funktion zweier ganzzahliger Variablen steht.
+
+Dann sollte es sinnvoll sein, den Funktionsaufruf
+
+
+ (f 3 4)
+
+
+zu schreiben, so daß man dadurch den Wert dieses Funktionsaufrufs berechnen kann;
+z.B. könnte "(summe 3 4) = 7" gelten.
+
+Wenn man "2x + y" als Funktion ansieht, kann man den Funktionsaufruf
+
+
+ ((2x + y) 3 4)
+
+
+schreiben. Der Wert dieses Ausdrucks ist aber nicht eindeutig bestimmt, denn es ist
+überhaupt nicht klar, ob nun "2*3+4" oder 2*4+3" gemeint ist. Eine Zeichenfolge
+wie "2x + y" werden wir deshalb Ausdruck und nicht Funktion nennen. Ein Ausdruck
+kann in eine Funktion umgewandelt werden, indem man die Zuordnung von Argumen­
+ten und Variablen festlegt. Bei "2x + y" könnte man beispielsweise festlegen, daß
+"x" immer das erste und "y" immer das zweite Argument sein soll.
+Wenn "a" ein Ausdruck in den Variablen x1, ... xn ist, dann ist
+
+
+ (lambda (x1 ... xn) a)
+
+
+eine Funktion mit n Argumenten. Den Wert der Funktionsaufrufe mit dieser Funktion
+(also der Ausdrücke der Form
+
+
+ ((lambda (x1 ... xn) a) (b1 ... bn))
+ erhält man, indem man die Variablen x1 ... xn durch die n Argumente des Aufrufs
+ersetzt. Beispielsweise ist
+
+
+ ((lambda (x y) (2*x + y)) (3 4)) = 2*3 + 4 = 10 ,
+
+
+während
+
+
+ ((lambda (y x) (2*x + y)) (3 4)) = 2*4 + 3 = 11
+
+
+ist.
+
+Die Variablen in einem Lambdaausdruck sind sogenannte Parameter (oder gebundene
+Variable). Interessant ist, daß eine Funktion sich nicht ändert, wenn man eine Variable
+systematisch durch eine andere Variable ersetzt, die nicht bereits im Lambdaausdruck
+vorkommt.
+
+
+ (lambda (x y) (2*y + x))
+
+
+ist also dasselbe wie
+
+
+ (lambda (u v) (2*v + u)) .
+
+
+Manchmal werden wir Ausdrücke benutzen, in denen eine Variable nicht durch das
+Lambda gebunden ist. Beispielsweise ist das n in
+
+
+ (lambda (x y) (x*n + y*n))
+
+
+nicht gebunden. Eine solche nicht gebundene Variable nennt man frei.
+Wenn für eine freie Variable vor der Benutzung kein Wert vereinbart wurde, ist der
+Wert des Funktionsaufrufs nicht definiert, falls der Wert der Variablen auf das Ergeb­
+nis einen Einfluß hat.
+
+Die Lambdanotation reicht allein für die Definition rekursiver Funktionen nicht aus.
+Neben den Variablen muß auch der Name der Funktion gebunden werden, weil er
+innerhalb der Funktion für eine Zeichenfolge steht.
+
+Wir hatten die Funktion "firstatom" durch die Gleichung
+
+
+ (firstatom x) = (cond ((atom x) x)
+ (T (firstatom (head x)))
+ )
+
+
+definiert. Mit der Lambda-Notation können wir schreiben:
+
+
+ firstatom = (lambda (x) (cond ((atom x) x)
+ (T (firstatom (head x)))
+ ) )
+
+
+
+Das Gleichheitszeichen ist in Wirklichkeit nicht Teil der LISP-Sprache, sondern eine
+Krücke, die wir nicht mehr brauchen, wenn wir die richtige Schreibweise eingeführt
+haben.
+
+Die rechte Seite der obigen Gleichung ist als Funktion nicht vollständig, da dort nichts
+darauf hinweist, daß das "firstatom" im einem bedingten Ausdruck für eben die rechte
+Seite steht. Deshalb ist die rechte Seite als Definition für die linke Seite ("firstatom")
+noch nicht geeignet.
+
+Damit wir Definitionen schreiben können, in denen der Name der gerade definierten
+Funktion auftaucht, führen wir die Label-Notation ein (engl. label = Marke, (Preis-)
+Schildchen). Wenn "a" eine Funktion ist, und "n" ihr Name, schreiben wir "(label n
+a)".
+
+Nun können wir die Funktion "firstatom" ohne Gleichheitszeichen schreiben:
+
+
+ (label firstatom (lambda (x) (cond ((atom x) x)
+ (T (firstatom (head x)))
+ ) ) )
+
+
+In dieser Definition ist "x" eine gebundene Variable und "firstatom" ein gebundener
+Funktionsname.
+#page#
+
+2. Das LISP-Interpreter-System#goalpage("p2")#
+
+
+
+2.1 Die universelle LISP-Funktion
+ "evalquote" #goalpage("p2.1")#
+
+
+
+Ein Interpreter oder eine allgemeine Funktion ist eine Funktion, die den Wert jedes
+gegebenen Ausdrucks berechnen kann, wenn der Ausdruck in einer geeigneten Form
+vorliegt. (Wenn der zu interpretierende Ausdruck einen Aufruf einer unendlich rekur­
+siven Funktion enthält, wird der Interpreter natürlich ebenfalls unendlich rekursiv.)
+Wir sind jetzt in der Lage, eine allgemeine LISP-Funktion
+
+
+ (evalquote function arguments)
+
+
+zu definieren. "evalquote" muß als erstes Argument ein LISP-Ausdruck übergeben
+werden. Dieser wird als Funktion aufgefasst und auf die folgenden Argumente ange­
+wendet.
+
+Im Folgenden sind einige nützliche Funktionen zur Manipulation von LISP-Aus­
+drücken angegeben. Einige von ihnen werden als Hilfsfunktionen für die Definition von
+"evalquote" gebraucht, die wir uns vorgenommen haben.
+
+
+ (equal x y)
+
+
+ist ein Prädikat, das wahr ist, wenn seine Argumente gleiche LISP-Ausdrücke sind.
+(Das elementare Prädikat "eq" ist ja nur für Atome definiert.)
+
+Die Definition von "equal" ist ein Beispiel für einen bedingten Ausdruck innerhalb
+eines bedingten Ausdrucks.
+
+
+(label equal
+ (lambda (x y)
+ (cond
+ ((atom x) (cond
+ ((atom y) (eq x y))
+ (T F)
+ )
+ )
+ ((equal (head x) (head y)) (equal (tail x) (tail y)))
+ (T F)
+ )
+ )
+)
+
+
+
+Folgende Funktion liefert einen LISP-Ausdruck, der gleich mit "destination" ist,
+außer daß darin überall statt "old" "new" steht.
+
+
+(changeall (destination old new))
+
+= (cond ((equal destination old) new)
+ ((atom destination) destination)
+ (T (cons (changeall (head destination) old new)
+ (changeall (tail destination) old new)
+ )
+ )
+ )
+
+
+Beispielsweise gilt
+
+
+(changeall ((A . B) . C) B (X . A)) = ((A . (X . A)) . C)
+
+
+Die folgenden Funktionen sind nützlich, wenn Listen verarbeitet werden sollen.
+
+1. (append x y)
+ hängt an die Liste "x" den LISP-Ausdruck "y".
+
+
+ (append x y) =
+ (cond ((null x) y)
+ (T (cons (head x) (append (tail x) y) ))
+ )
+
+
+2. (member list pattern)
+ Dies Prädikat testet, ob der LISP-Ausdruck "pattern" in der Liste "list" vor­
+ kommt.
+
+
+ (member list pattern) =
+ (cond ((null list) F)
+ ((equal (head list) pattern) T)
+ (T (member (tail list) pattern))
+ )
+
+
+3. (pairlist list1 list2 oldpairlist)
+ Diese Funktion liefert eine Liste von Paaren, die die sich entsprechenden Elemen­
+ te der Listen "list1" und "list2" enthalten, und an der noch die Liste "oldpairlist"
+ hängt.
+
+
+
+ (pairlist list1 list2 oldpairlist) =
+ (cond ((null list1) oldpairlist)
+ (T (cons (cons (head list1) (head list2))
+ (pairlist (tail list1) (tail list2) oldpairlist)
+ )
+ )
+ )
+
+
+Beispiel:
+ (pairlist (A B C) (U V W) ((D . X) (E . Y)) ) =
+ ((A . U) (B . V) (C . W) (D . X) (E . Y))
+
+
+Eine solche Liste von Paaren wird auch Assoziationsliste genannt, wenn das erste
+Element jedes Paars ein Atom ist, das über diese Liste mit dem zweiten Element
+assoziiert ist.
+
+5. (association pattern associationlist)
+ Wenn "association list" eine Assoziationsliste wie oben beschrieben ist, liefert
+ "association" das Paar der Liste, dessen erstes Element "pattern" ist. Es ist also
+ eine Funktion zum Durchsuchen von Tabellen.
+
+
+ (association pattern alist) =
+ (cond ((eq (head (head alist)) pattern) (head alist))
+ (T (association pattern (tail alist)))
+ )
+
+Beispiel:
+
+(association B ( (A . (M N))
+ (B . (HEAD X))
+ (C . (QUOTE M))
+ (B . (TAIL X))
+ ) ) = (B . (HEAD X))
+
+
+(replace expr alist)
+ "alist" muß eine Assoziationsliste sein. "replace" produziert einen Ausdruck, der
+ "expr" sehr ähnlich ist, nur sind alle Atome darin durch den LISP-Ausdruck
+ ersetzt, mit dem sie in "alist" assoziiert sind.
+
+
+ (replace expr alist) =
+ (cond ((atom expr) (association expr alist))
+ (T (cons (replace (head expr) alist)
+ (replace (tail expr) alist)
+ )
+ )
+ )
+
+Beispiel:
+
+ (replace (X SCHRIEB Y)
+ ((Y . (GOETZ VON BERLICHINGEN)) (X . GOETHE))
+ )
+
+ = (GOETHE SCHRIEB (GOETZ VON BERLICHINGEN))
+
+
+
+Die allgemeine Funktion "evalquote", die wir jetzt definieren wollen, gehorcht der
+folgendem Beispiel zugrundeliegenden Regel:
+
+
+Beispiel:
+ (evalquote
+Funktion: (LAMBDA (X Y) (CONS (HEAD X) Y) )
+Argumente: (A B) (C D)
+ )
+=
+ (apply
+Funktion: (LAMBDA (X Y) (CONS (HEAD X) Y))
+Argumentliste: ((QUOTE (A B)) (QUOTE (C D)))
+Bindung: NIL
+ )
+
+
+Die Argumente von "evalquote" werden also zu einer gequoteten Argumentliste von
+"apply". Die QUOTE-Funktion bewirkt, daß das Argument der QUOTE-Funktion
+wörtlich genommen, also nicht weiter evaluiert wird. Das dritte Argument von "apply",
+das NIL ist eine leere Bindeliste zur Bindung von Parametern und Argumenten im
+nächsten Schritt:
+
+
+=
+ (eval
+Argumente: (CONS (HEAD X) Y)
+Bindung: ((X.(A B)) (Y . (C D)))
+ )
+=
+ (cons (head (A B)) (C D))
+=
+ (A C D) = Ergebnis von "evalquote" .
+
+
+"evalquote" wird hauptsächlich durch die Hilfsfunktion "apply" definiert. "apply"
+berechnet Funktionsaufrufe, indem es die Argumente und die Parameter der Funktion
+bindet und den Funktionsrumpf berechnet. Die Bindungen werden in einer Assozia­
+tionsliste, der Bindeliste, gespeichert. Da bedingte Ausdrücke und Konstanten formal
+wie Funktionsaufrufe von Funktionen "cond" und "quote" aussehen, werden sie auch
+so behandelt.
+
+Wir definieren also:
+
+
+ (evalquote fkt expr) = (apply fkt (quote expr) NIL) .
+
+
+sowie :
+
+
+ (eval expr binding) =
+ (cond ((atom expr) (tail (association expr binding)))
+ (T (apply (head expr) (tail expr) binding))
+ )
+
+
+"eval" stellt also erst fest, ob es sich um ein Atom oder um einen Funktionsaufruf
+handelt. Da es nur diese beiden Möglichkeiten gibt, ist diese Einteilung vollständig.
+
+Atome sind immer Übersetzungen von Variablen, für die eine Bindung existieren muß,
+so daß ihr Wert aus der Bindeliste geholt wird.
+
+Funktionsaufrufe sind immer Listen; im zweiten Zweig werden die Funktion und die
+Parameterliste getrennt und an "apply" übergeben.
+
+Um sich die Aktionen in diesem zweiten Zweig von "eval" genauer vorstellen zu
+können, ist vielleicht die in Abschnitt 1.1 beschriebene graphische Darstellungsmetho­
+de hilfreich; beispielsweise würde sich ein Lambda-Ausdruck so ausnehmen:
+
+
+ +-----+-----+ +-----+-----+ +-----+-----+
+ | o | o--+-->| o | o--+-->| o | o--+-->NIL
+ +--+--+-----+ +--+--+-----+ +--+--+-----+
+ | | |
+ V V V
+ LAMBDA Parameterliste Ausdruck
+
+
+"apply" bekommt nun von "eval" eine Funktion und eine Parameterliste sowie die
+Bindeliste übergeben. Mit diesen beiden macht es folgendes:
+
+
+ (apply fn args binding) =
+(cond
+ ((atom fn)
+ (cond ((eq fn HEAD) (head (eval (head args) binding)))
+ ((eq fn TAIL) (tail (eval (head args) binding)))
+ ((eq fn CONS) (cons (eval (head args) binding)
+ (eval (head (tail args)) binding)
+ ) )
+ ((eq fn ATOM) (atom (eval (head args) binding)))
+ ((eq fn EQ) (eq (eval (head args) binding)
+ (eval (head (tail args)) binding)
+ ) )
+ ((eq fn QUOTE) (head args))
+ ((eq fn COND) (evalcond args binding))
+ (T (apply (tail (association fn binding)) args binding))
+ )
+ ((eq (head fn) LABEL)
+ (apply (head (tail (tail fn)))
+ args (cons (cons (head (tail fn))
+ (head (tail (tail fn)))
+ )
+ binding)
+ ) )
+ ((eq (head fn) LAMBDA) (eval (head (tail (tail fn)))
+ (pairlist (head (tail fn))
+ args binding)
+ ) )
+)
+
+
+
+
+
+
+Das erste Argument von "apply" ist eine Funktion (unter der Voraussetzung, daß
+"quote" und "cond" als Funktionen anerkannt werden).
+
+Wenn es eine der elementaren Funktionen "head", "tail", "cons", "atom" oder "eq"
+ist, wird die jweilige Funktion auf die Argumente angewandt, die vorher berechnet
+werden. Diese Berechnung erfolgt mit "eval", das ja für Variablen Werte aus der
+Bindeliste liefert und für Funktionsaufrufe das, was "apply" mit ihnen machen kann.
+
+Wenn es sich um "quote" handelt, wird das erste Argument unverändert geliefert
+"quote" heißt ja "dies ist eine Konstante, die so, wie sie da steht, übernommen wer­
+den soll".
+
+Wenn es sich um "cond" handelt, wird die Funktion "eval cond" aufgerufen, doch
+auch ihre Argumente werden nicht berechnet, außerdem gehört die Assoziationsliste
+zu den Argumenten:
+
+
+ eval (cond condlist, binding) =
+ (cond ((eval (head (head condlist)) binding)
+ (eval (head (tail (head condlist))) binding)
+ )
+ (T (cond (tail condlist) binding))
+ )
+
+
+
+Hier empfiehlt es sich, einen bedingten Ausdruck in graphischer Form hinzuschreiben
+und die Auswertung anhand der Zeichnung nachzuvollziehen.
+
+Wenn die Funktion nichts von alledem ist, wird in der Bindeliste nachgesehen, ob
+dies Atom nicht an eine Funktion gebunden ist; falls ja, wird eine Auswertung dieser
+Funktion mit den gleichen Argumenten versucht.
+
+Wenn das erste Argument von "apply" kein Atom ist, muß es ein LABEL- oder ein
+LAMBDA-Ausdruck sein.
+
+Ein LABEL-Ausdruck hat die Form
+
+
+ +-----+-----+ +-----+-----+ +-----+-----+
+ | o | o--+-->| o | o--+-->| o | o--+--> NIL
+ +--+--+-----+ +--+--+-----+ +--+--+-----+
+ | | |
+ V V V
+ LABEL Name Funktion
+
+
+Funktionsname und Definition werden in einem funktionalen Eintrag in die Bindeliste
+eingefügt, so daß der Name an die Funktion gebunden ist.
+
+Ein LAMBDA-Ausdruck hat die Form
+
+
+ +-----+-----+ +-----+-----+ +-----+-----+
+ | o | o--+-->| o | o--+-->| o | o--+--> NIL
+ +--+--+-----+ +--+--+-----+ +--+--+-----+
+ | | |
+ V V V
+ LAMBDA Parameterliste Ausdruck
+
+
+Dabei ist die Parameterliste eine Liste von Atomen, den Parametern. Die Auswertung
+läuft so ab, daß die Parameter durch "pairlist" an die Argumente gebunden werden
+und mit dieser neuen Bindeliste der Ausdruck berechnet wird.
+
+Das EUMEL-LISP bietet eine Reihe weiterer Möglichkeiten, die erst später beschrie­
+ben werden. Hier können wir allerdings schon die folgenden Punkte abhandeln:
+
+1. Jede LISP-Eingabe ist ein LISP-Ausdruck. Der "head" dieses Ausdrucks wird
+ als Funktion aufgefaßt und auf den gequoteten "tail" des Ausdrucks, nämlich die
+ nicht zu evaluierenden Argumente angewandt. Die Übersetzung von Kleinbuchsta­
+ ben in Großbuchstaben wird vom LISP-System übernommen.
+
+2. In der Theorie des reinen LISP müssen alle Funktionen außer den fünf Basisfunk­
+ tionen an allen Stellen wieder definiert werden, an denen sie aufgerufen werden.
+ Das ist eine für die Praxis äußerst unhandliche Regelung; das EUMEL-LISP-
+ System kennt weitere vordefinierte Funktionen und bietet die Möglichkeit, beliebig
+ viele weitere Standardfunktionen einzuführen, auch solche Funktionen, deren
+ Argumente nicht berechnet werden (wie "quote") oder solche, die beliebig viele
+ Argumente haben dürfen (wie "cond").
+
+3. Die Basisfunktion "eq" hat immer einen wohldefinierten Wert, dessen Bedeutung
+ im Fall, daß Nicht-Atome verglichen werden, im Kapitel über Listenstrukturen
+ erklärt wird.
+
+4. Außer in sehr seltenen Fällen schreibt man nicht (quote T), (quote F) oder (quote
+ NIL), sondern T, F und NIL.
+
+5. Es besteht die Möglichkeit, mit Ganzzahlen zu rechen, die als weiterer Typ von
+ Atomen gelten. Außerdem können TEXTe und Einzelzeichen (CHARACTERs)
+ gespeichert werden.
+
+6. Es besteht die Möglichkeit der Ein- und Ausgabe von LISP-Ausdrücken, Ganz­
+ zahlen, TEXTen und CHARACTERs.
+
+WARNUNG: Die oben angegebenen Definitionen von "eval" und "apply" dienen nur
+ pädagogischen Zwecken und sind nicht das, was wirklich im Interpreter
+ abläuft.
+ Um zu entscheiden, was wirklich vor sich geht, wenn der Interpreter
+ aufgerufen wird, sollte man sich an die ELAN-Quellprogramme halten.
+#page#
+
+2.2 Anwendungsregeln und Beispiele #goalpage("p2.2")#
+
+
+
+Die Funktionsweise des LISP-Interpreteres kann bequem unter Verwendung der
+Funktion "trace" verfolgt werden. Der Aufruf:
+
+
+ (trace)
+
+
+schaltet den Trace-Protokollmodus des Interpreters ein bzw. aus.
+
+Das folgende Beispiel ist ein LISP-Programm, das die drei Funktionen "union",
+"intersection" und "member" als Standardfunktionen einführt Die Funktionen lauten
+folgendermaßen:
+
+
+ (member pattern list) = (cond ((null list) F)
+ ((eq (head list) pattern) T)
+ (T (member pattern (tail list)))
+ )
+
+ (union x y) = (cond ((null x) y)
+ ((member (head x) y) (union (tail x) y))
+ (T (cons (head x) (union (tail x) y)))
+ )
+
+ (intersection x y) = (cond ((null x) NIL)
+ ((member (head x) y)
+ (cons (head x) (intersection
+ (tail x) y))
+ )
+ (T (intersection (tail x) y))
+ )
+
+
+Um die Funktionen als neue Standardfunktionen einzuführen, benutzen wir die Pseu­
+dofunktion "define":
+
+
+ (DEFINE
+ (MEMBER . (LAMBDA (PATTERN LIST)
+ (COND ((NULL LIST) F)
+ ((EQ (HEAD LIST) PATTERN) T)
+ (T (MEMBER PATTERN (TAIL LIST)))
+ ) ) )
+ (UNION . (LAMBDA (X Y)
+ (COND ((NULL X) Y)
+ ((MEMBER (HEAD X) Y) (UNION (TAIL X) Y))
+ (T (CONS (HEAD X) (UNION (TAIL X) Y)))
+ ) ) )
+ (INTERSECTION . (LAMBDA (X Y)
+ (COND ((NULL X) NIL)
+ ((MEMBER (HEAD X) Y)
+ (CONS (HEAD X) (INTERSECTION (TAIL
+ X) Y))
+ )
+ (T (INTERSECTION (TAIL X) Y))
+ ) ) )
+ )
+
+
+Die Funktion DEFINE, liefert als Pseudofunktion nicht nur einen LISP-Ausdruck als
+Ergebnis, sondern hat auch einen bleibenden Effekt, nämlich eine Veränderung im
+LISP-Heap.
+
+DEFINE hat beliebig viele Parameter der Form (Name . Funktion) und bewirkt, daß die
+Funktionen unter dem jeweiligen Namen im System verfügbar werden, also für die
+weitere Programmausführung definiert werden. Das Ergebnis von DEFINE ist eine
+Liste der neuen Funktionsnamen, also hier
+
+
+ (MEMBER UNION INTERSECTION)
+
+
+Der Wert den der LISP-Interpreter bei Eingabe von
+
+
+ (intersection (a1 a2 a3) (a1 a3 a5))
+
+
+liefert ist (A1 A3) ,
+
+
+Die Funktion
+
+
+ (union (x y z) (u v w x))
+
+
+liefert (Y Z U V W X) .
+
+
+
+Es folgen einige elementare Regeln für LISP-Programme:
+
+1. Ein LISP-Programm besteht aus einem Funktionsaufruf. Im Beispiel ist das die
+ Funktion DEFINE, die ihre Parameter (beliebig viele) berechnet und ausgibt. Die
+ Berechnung der Parameter erfolgt dabei in der Reihenfolge der Parameter (norma­
+ le LISP-Funktionen mit mehreren Parametern berechnen standardmäßig alle
+ Parameter, allerdings in irgendeiner Reihenfolge).
+
+2. LISP ist formatfrei, d.h. jedes Symbol kann in jeder Spalte stehen. Für die Bedeu­
+ tung des Programms ist nur die Reihenfolge der Symbole maßgeblich. Zeilen­
+ wechsel wird als Leerzeichen aufgefaßt.
+
+3. Atome müssen mit einem Buchstaben anfangen, damit sie nicht mit Zahlen ver­
+ wechselt werden.
+
+4. Ein LISP-Ausdruck der Form (A B C . D) ist eine Abkürzung für (A.(B.(C.D))).
+ Jede andere Plazierung des Punkts ist ein Fehler (falsch wäre z.B. (A . B C) ).
+
+5. Eine Anzahl von Basisfuntionen existiert von Anfang an, ohne daß sie durch
+ DEFINE eingeführt wurden. Der Programmierer kann weitere Funktionen bleibend
+ oder für die Dauer eines Programmlaufs einführen; dabei ist die Reihenfolge der
+ neuen Funktionen gleichgültig.
+#page#
+
+2.3 Variablen#goalpage("p2.3")#
+
+
+
+Eine Variable ist ein Symbol, das ein Argument einer Funktion repräsentiert. Man
+kann also schreiben: "a + b, wobei a = 3 und b = 4". In dieser Situation ist keine
+Verwechslung möglich, so daß klar ist, daß das Ergebnis 7 ist. Um zu diesem Ergeb­
+nis zu kommen, muß man die Zahlen anstelle der Variablen einsetzen und die Opera­
+tion ausführen, d.h. die Zahlen addieren.
+
+Ein Grund, weshalb das eindeutig ist, liegt darin, daß "a" und "b" nicht "direkt"
+addiert werden können, so daß etwa "ab" entsteht. In LISP kann die Situation viel
+komplizierter sein. Ein Atom kann eine Variable oder ein Atom sein.
+
+Sollte der zukünftige LISP-Benutzer an dieser Stelle entmutigt sein, sei ihm gesagt,
+daß hier nichts Neues eingeführt wird. Dieser Abschnitt ist nur eine Wiederholung der
+Überlegungen aus Abschnitt 1.4. Alles, was wir in diesem Abschnitt sagen, kann man
+aus den Regeln für LISP-Ausdrücke oder aus der allgemeinen Funktion "evalquote"
+ableiten.
+
+Der Formalismus, der in LISP die Variablen kennzeichnet, ist die Lambdanotation von
+Church. Der Teil des Interpreters, der die Variablen an Werte bindet, heißt "apply".
+Wenn "apply" auf eine Funktion stößt, die mit LAMBDA anfängt, wird die Variablenli­
+ste (Argumentliste) mit der Parameterliste gepaart und am Anfang der Bindeliste
+eingefügt.
+
+Während der Berechnung des Funktionsrumpfs müssen manchmal Variablen durch
+ihre Werte ersetzt werden. Das geschieht dadurch, daß ihr Wert in der Bindeliste
+nachgesehen wird. Wenn eine Variable mehrmals gebunden wurde, wird die zuletzt
+etablierte Bindung verwendet. Der Teil des Interpreters, der diese "Berechnungen"
+und die Berechnung von Funktionsaufrufen durchführt, heißt "eval".
+
+
+
+#page#
+
+2.4 Konstanten#goalpage("p2.4")#
+
+
+
+Manchmal heißt es, eine Konstante stehe für sich selbst, im Gegensatz zu einer
+Variablen, die für etwas anderes, nämlich ihren Wert, steht.
+Dies Konzept funktioniert in LISP nicht so ohne weiteres; es ist hier sinnvoller, zu
+sagen, eine Variable ist konstanter als die andere, wenn sie in einer höheren Ebene
+gebunden ist und ihren Wert seltener ändert.
+In LISP bleibt eine Variable im Bereich des LAMBDA konstant, von dem sie gebunden
+ist. Wenn eine Variable einen festen Wert hat, unabhängig davon, was in der Bindeli­
+ste steht, wird sie (echte) Konstante genannt. Dies wird mit Hilfe der Eigenschaftsliste
+(E-Liste) des Atoms erreicht.
+Jedes Atom hat eine E-Liste, in der Paare von Atomen und beliebigen Strukturen
+gespeichert sind. Ein Atom hat die Eigenschaft A, wenn in seiner E-Liste ein Paar
+mit dem Atom A enthält; die dazugehörige "beliebige Struktur" heißt Wert dieser
+Eigenschaft.
+Wenn ein Atom die Eigenschaft APVAL besitzt, ist es eine Konstante, deren Wert der
+Wert der Eigenschaft ist.
+Konstanten können durch die Pseudofunktion
+
+
+ (set atom wert)
+
+
+gesetzt werden; nach der Auswertung eines solchen Aufrufs hat das Atom "atom"
+immer den Wert "wert" - bis zum nächsten "set". Eine interessante Klasse von
+Konstanten sind solche Konstanten, die sich selbst als Wert haben. Ein Beispiel dafür
+ist NIL. Der Wert dieser Konstanten ist wieder NIL. Daher kann NIL nicht als Variable
+benutzt werden, da es ja eine Konstante ist. (T und F gehören ebenfalls zu dieser
+Klasse).
+
+#page#
+
+2.5 Funktionen#goalpage("p2.5")#
+
+
+
+Wenn ein LISP-Ausdruck für eine Funktion steht, ist die Situation ähnlich der, in der
+ein Atom für einen Wert steht. Wenn die Funktion rekursiv ist, muß sie einen Namen
+bekommen. Das geht mit einem LABEL-Ausdruck, der den Namen mit der Funk­
+tionsdefinition in der Bindeliste paart. Dadurch wird der Name an die Funktionsdefini­
+tion gebunden, so wie eine Variable an ihren Wert gebunden wird. In der Praxis setzt
+man LABEL selten ein. Normalerweise ist es einfacher, Name und Definition wie bei
+den Konstanten zu verknüpfen. Dies geschieht mit der Pseudofunktion DEFINE, die
+wir am Anfang des Kapitels benutzt haben.
+Diese Funktion kann beliebig viele Parameter der Form
+
+
+ (atom . funktion)
+
+
+haben, wobei "atom" der Name der zu definierenden Funktion "funktion" werden soll.
+Sie bewirkt, daß die Definition unter der Eigenschaft FUNCTION in der E-Liste des
+Atoms abgelegt wird.
+#page#
+
+3. Erweitertes LISP#goalpage("p3")#
+
+
+In diesem Kapitel werden wir einige Erweiterungen zum reinen LISP einführen. Zu
+diesen Erweiterungen gehören Möglichkeiten für Arithmetik, Zeichenkettenverarbei­
+tung, Funktionen, die spezielle Argumente erwarten, und Ein- und Ausgabe.
+
+In allen Fällen handelt es sich bei den Erweiterungen um zusätzliche Funktionen. So
+heißt das Kommando für die Ausgabe eines LISP-Ausdrucks PUT. Syntaktisch ist
+PUT nichts anderes als eine Funktion mit einem Argument. Sie kann mit anderen
+Funktionen verkettet werden, und diese Verkettung wird ganz auf die übliche Art
+behandelt, zuerst Berechnung der innern, dann der äußeren Funktionsaufrufe. Ein
+Ergebnis ist nur in dem trivialen Sinn vorhanden, daß PUT sein Argument wieder
+liefert, also die Identität ist.
+
+Funktionen, die eine Aktion wie Ein- oder Ausgabe bewirken, oder die Langzeitwir­
+kung (gesehen auf die Ausführungsdauer des Programms) haben, wie DEFINE und
+SET, heißen Pseudofunktionen. Es ist eine Besonderheit von LISP, daß alle Funktio­
+nen einschließlich den Pseudofunktionen ein Ergebnis haben müssen. In einigen
+Fällen ist das Ergebnis trivial und kann ignoriert werden.
+
+In diesem Kapitel beschreiben wir verschiedene Erweiterungen der Sprache LISP, die
+im System fest enthalten sind.
+
+
+#page#
+
+3.1 Gequotete Parameter #goalpage("p3.1")#
+
+
+
+Bevor ein Argument an eine Funktion übergeben wird, wird erst sein Wert in der
+Bindeliste nachgesehen, d.h. es wird nicht der Name der Variablen übergeben, son­
+dern ihr Wert. Wenn das Argument als Konstante behandelt werden soll, muß es
+ge"quotet" werden, d.h. statt "argument" steht (quote argument). Wenn ein Argument
+einer Funktion immer als Konstante behandelt werden soll, ist es bequemer, das
+Argument nicht jedesmal zu quoten. Das EUMEL-LISP-System erlaubt, in diesem
+Fall den formalen Parameter in der Funktionsdefinition bereits zu quoten.
+
+Dieser Mechanismus wurde auch benutzt, um QUOTE zu implementieren; die Funk­
+tion lautet
+
+
+ quote = (lambda ((QUOTE x)) x)
+
+
+
+
+#page#
+
+3.2 Funktionen mit beliebig vielen
+ Argumenten #goalpage("p3.2")#
+
+
+
+Ein Beispiel ist "list", das beliebig viele Argumente haben kann, die zu einer Liste
+zusammengefaßt werden. Da eine Funktion nur eine feste Anzahl von Parametern
+haben kann, eine Funktion mit beliebig vielen Argumenten aber gewiß keine feste
+Anzahl von Argumenten hat, werden die beliebig vielen Argumente zu einer Liste
+zusammengefaßt und ein einziger Parameter wird an diese Liste gebunden. Da "list"
+genau diese Liste liefern soll, wird diese Funktion ebenfalls zu einer "Identität":
+
+
+ list = (lambda ((INDEFINITE x)) x)
+
+
+Solche Parameter werden durch INDEFINITE gekennzeichnet. Sie können auch ge­
+quotet werden, indem man (INDEFINITE QUOTE parameter) schreibt; das wirkt so, als
+wären alle Argumente, die diesem Parameter zugeordnet werden, einzeln gequotet
+worden.
+
+
+ evalquote = (lambda (fkt (INDEFINITE QUOTE expr))
+ (apply fkt expr NIL) )
+
+
+
+#page#
+
+3.3 Funktionale Parameter #goalpage("p3.3")#
+
+
+
+In der Mathematik gibt es Funktionen, die andere Funktionen als Argument haben. In
+der Algebra könnte man die Funktion "(operation operator a b)" definieren, wobei
+"operator" ein funktionales Argument ist, das die Operation festlegt, die auf "a" und
+"b" ausgeführt werden soll. Beispielsweise gilt
+
+
+ operation (+ 3 4) = 7
+ operation (* 3 4) = 12
+
+
+In LISP sind funktionale Argumente sehr nützlich. Eine wichtige Funktion mit einem
+Argument ist MAPLIST. Ihre Definition ist
+
+
+ (LAMBDA (LIST (FUNCTION FN))
+ (COND ((NULL LIST) NIL)
+ (T (CONS (FN (HEAD LIST)) (MAPLIST (TAIL LIST) FN)))
+ ) )
+
+
+Diese Funktion nimmt eine Liste und eine Funktion als Argument und wendet die
+Funktion auf die Listenelemente an.
+
+
+#page#
+
+3.4 Prädikate und boolesche Konstanten #goalpage("p3.4")#
+
+
+
+Die booleschen Werte sind, wie in Kapitel 1 gesagt, T und F. Bei LISP-Ausdrücken
+müßte daraus (quote T) und (quote F) werden, aber da die APVALs dieser Atome
+wieder den Wert T und F haben, ist das quoten nicht nötig.
+
+Prädikate sind Funktionen, die T oder F als Ergebnis haben; es gibt also keine forma­
+len Unterschiede zwischen anderen Funktionen und Prädikaten.
+
+Daher ist es durchaus möglich, daß eine Funktion einen Wert liefert, der weder T
+noch F ist, daß aber durch einen bedingten Ausdruck an dieser Stelle ein boolescher
+Ausdruck verlangt wird. In diesem Fall ist die Wirkung des Ausdrucks nicht definiert.
+
+Das Prädikat EQ hat folgendes Verhalten:
+1. Wenn seine Argumente verschieden sind, ist das Ergebnis F.
+2. Wenn die Argumente dasselbe Atom sind, ist das Ergebnis T.
+3. Wenn die Argumente gleich, aber nicht atomar sind, ist das Ergebnis T oder F, je
+ nachdem, ob sie ein und dasselbe Objekt im Heap sind oder nicht.
+
+#page#
+
+3.5 Unbenannte Atome #goalpage("p3.5")#
+
+
+
+Die meisten Atome im EUMEL-LISP haben einen Namen, der sie bei Ein- und
+Ausgabeoperationen identifiziert.
+Es gibt aber auch Atome, die keinen Namen haben und stattdessen durch ihre Werte
+repräsentiert werden. Momentan sind das Ganzzahlen und Zeichenketten (TEXTe);
+auch die booleschen Werte kann man in einem weiteren Sinn dazurechnen.
+
+
+
+
+3.5.1 Ganzzahlen
+
+
+
+Im EUMEL-LISP gibt es Funktionen, die Basisoperationen und Tests durchführen.
+
+Ganzzahlen haben folgende Eigenschaften:
+
+1. Eine Ganzzahl besteht aus einem optionalen Vorzeichen und einer Folge von
+ Ziffern; zwischen Vorzeichen und Ziffern können Leerzeichen stehen.
+2. Der Wert einer Ganzzahl liegt zwischen -32768 und 32767 (minint und maxint).
+3. Eine Ganzzahl kann überall dort stehen, wo ein Atom stehen kann, außer als
+ Parameter.
+4. Ganzzahlen sind Konstanten; sie brauchen also nicht gequotet werden.
+#page#
+
+3.5.2 Arithmetische Funktionen und Prädikate
+
+
+
+Es folgt eine Liste aller arithmetischen Funktionen.
+Wenn ein Argument einer dieser Zahlen keine Ganzzahl ist, erfolgt eine Fehlermel­
+dung.
+
+ (sum x1 ... xn) liefert die Summe der xi; wenn keine Argumente gege­
+ ben werden, wird 0 geliefert.
+ (difference x y) liefert die Differenz von x und y.
+ (product x1 ... xn) liefert das Produkt seiner Argumente; wenn
+ keine Argumente gegeben werden, wird 1
+ geliefert.
+ (quotient x y) liefert den Quotienten von x und y, ohne den
+ Rest zu berücksichtigen.
+ (remainder x y) liefert den Rest der Division von x und y.
+ (getint) liest eine Zahl vom Bildschirm ein und
+ liefert sie.
+ (putint x) gibt x auf den Bildschirm aus. Identitäts funktion.
+
+
+
+
+
+3.5.3 Zeichenkettenverarbeitung
+
+
+
+Im Moment ist nur Zeichenketten-Ein- und Ausgabe implementiert.
+Die Ausgabe löst bei Argumenten, die keine Zeichenketten sind, eine Fehlermeldung
+aus.
+
+ (gettext) liest eine Zeichenkette ein und liefert sie.
+ (puttext x) gibt eine Zeichenkette aus.
+
+
+
+
+3.5.4 Test auf Gleichheit
+
+
+
+ (equal x y) testet, ob x und y vom gleichen Typ sind, und wenn ja, ob sie gleich
+ sind.
+#page#
+
+3.6 Aufruf von EUMEL aus #goalpage("p3.6")#
+
+
+Bevor man den LISP-Interpreter benutzen kann, muß er folgendermaßen implemen­
+tiert werden:
+
+archive ("lisp")
+fetch all (archive)
+release (archive)
+check off
+insert ("lisp.1")
+insert ("lisp.2")
+insert ("lisp.3")
+insert ("lisp.4")
+check on
+
+
+Das LISP-System verfügt über einen Heap, in dem alle LISP-Ausdrücke gespei­
+chert sind. Standardmäßig enthält der Heap eine Reihe von Funktionen, die nicht in
+den LISP-Programmen definiert werden müssen (Übersichten über die Standardfunk­
+tionen siehe Kapitel 3.5).
+
+Mit
+ lisp
+
+wird das LISP-System im EUMEL-Dialog gestartet. In einem Eingabefenster wird
+mit Hilfe des Paralleleditors eine LISP-EINGABE-Möglichkeit angeboten. Die Aus­
+gabe erfolgt in dem LISP-AUSGABE-Fenster.
+Das LISP-System kann folgendermaßen verlassen werden:
+<ESC> <ESC> break lisp <RETURN>.
+
+Statt dieser direkten Art der Benutzung der LISP-Maschine ist auch eine an ELAN
+angelehnte Art mit den Prozeduren "run lisp", insert lisp" usw. vorgesehen:
+
+Mit
+
+ run lisp (TEXT CONST dateiname)
+
+wird eine Kopie des Heaps angelegt, das Programm aus der Datei "dateiname" in die
+Kopie eingelesen und gestartet. Durch diesen Kopiermechanismus wird der Original­
+heap vor Zusammenbrüchen des LISP-Systems geschützt.
+
+ insert lisp (TEXT CONST dateiname)
+
+bewirkt dasselbe wie "run lisp"; allerdings wird jetzt direkt auf dem Originalheap
+gearbeitet. Dadurch sind alle Änderungen im Heap, die das Programm verursacht
+(meist Definition von Funktionen durch DEFINE) bleibend, aber auch ein Zusammen­
+bruch ist insoweit endgültig, als das LISP-System jetzt neu gestartet werden muß.
+Das geschieht mit
+
+ start lisp system (DATASPACE CONST dsname)
+
+"dsname" gibt dabei den Datenraum an, der die zum Hochfahren notwendigen Daten
+enthält. Solche Daten im richtigen Format enthält der Datenraum "lisp.bootstrap".
+Wenn der zuletzt benutzte Heap mit nicht mehr durch LISP-Programme erreich­
+bare Strukturen vollgestopft ist, schafft die Prozedur
+
+ collect lisp heap garbage
+
+Abhilfe; mit
+
+ lisp storage info
+
+kann man den Erfolg kontrollieren.
+#page#
+
+4. Detailbeschreibungen#goalpage("p4")#
+
+
+
+
+
+4.1 Grundfunktionen #goalpage("p4.1")#
+
+
+
+Die Datei "lisp.1" enthält ein Paket, das die Grundlage des LISP-Systems bildet. Es
+implementiert
+
+ - die primitiven LISP-Funktionen wie "cons", "null", etc.,
+ - die Verwaltung des Heaps, in dem die LISP-Strukturen und die Objektliste
+ (Oblist) gespeichert sind,
+ - einen Datentyp SYM, dessen Wertevorrat aus Zeigern auf die im Heap gespei­
+ cherten Strukturen besteht,
+ - Funktionen zur Konversion allgemeiner Daten in LISP-Strukturen (bisher reali­
+ siert: TEXT <--> SYM und INT <--> SYM).
+
+Durch die Implementation der Basisoperationen als exportierte und damit allgemein
+verfügbare ELAN-Prozeduren ist es möglich, LISP-Strukturen durch ELAN-Prog­
+ramme zu manipulieren; insbesonders können ELAN- und LISP-Programme über
+diese Strukturen miteinander kommunizieren.
+
+Anmerkung:
+Wenn Eigenschaften von "SYM"-Objekten beschrieben werden, sind immer die
+Eigenschaften der Strukturen gemeint, auf die die Objekte zeigen, wenn nichts ande­
+res angegeben wird.
+
+
+Es werden folgende Prozeduren exportiert:
+
+ PROC initialize lisp system (DATASPACE CONST new heap):
+ "new heap" ist der neue Datenraum, in dem der LISP-Heap ab sofort geführt
+ wird.
+ Vorsicht: Beim Wechsel zu einem neuen Datenraum sind die Werte der
+ SYM-Variablen, die auf Strukturen im alten Heap zeigen, natürlich wertlos!
+
+ PROC dump lisp heap (FILE VAR f):
+ In "f" wird ein Dump des Heaps erstellt. Dieser Dump ist nur mit Kenntnis des
+ Programmtextes aus "lisp 1" verständlich; er wird hier nicht beschrieben.
+
+ PROC lisp storage (INT VAR size, used):
+ Nach dem Aufruf gibt "size" die maximal verfügbare Anzahl von Knoten an,
+ während "used" die Anzahl der tatsächlich von LISP-Strukturen belegten
+ Knoten enthält. Zu diesen Strukturen können auch solche zählen, die nicht mehr
+ durch "head" oder "tail" etc. erreichbar sind.
+
+ PROC collect lisp heap garbage:
+ Löscht die im LISP-Heap nicht mehr durch "atom (TEXT CONST)", "proper­
+ ty", "head" und "tail" erreichbaren Strukturen. Es werden auch alle nur von
+ ELAN-Programmen aus über SYM-Variable erreichbare Strukturen gelöscht, so
+ daß die Werte dieser Variablen undefiniert werden.
+ Die Müllabfuhr wird von keiner Prozedur dieses Pakets aufgerufen, d.h. der
+ Benutzer, der ELAN-Programme einsetzt, braucht nicht alle Strukturen in den
+ Eigenschaftslisten von Atomen aufzubauen, um sie vor einer versehentlichen
+ Löschung durch die Müllabfuhr zu schützen, vorausgesetzt, er ruft sie nicht
+ selbst auf. Er muß allerdings darauf achten, daß im Heap noch genug Platz
+ bleibt.
+
+ OP := (SYM VAR left, SYM CONST right):
+ Nach der Zuweisung zeigt "left" auf die gleiche Struktur wie vorher "right".
+
+ SYM CONST nil, pname;
+ Zwei Konstanten, die dem LISP-System ständig zur Verfügung stehen müs­
+ sen. Ihre Drucknamen sind "NIL" bzw. "PNAME" (vgl. Schlußbemerkungen)
+
+ SYM PROC head (SYM CONST sym):
+ Entspricht der im Handbuch beschriebenen Funktion "head".
+
+ SYM PROC tail (SYM CONST sym):
+ Entspricht der im Handbuch beschriebenen Funktion "tail".
+
+ SYM PROC cons (SYM CONST head, tail):
+ Liefert einen SYM-Wert "zeiger" auf eine neue Struktur. Es gilt:
+ head ("zeiger") = "head" und tail ("zeiger") = "tail".
+
+ BOOL PROC eq (SYM CONST sym 1, sym 2):
+ Prüft, ob "sym 1" und "sym 2" auf dieselbe Struktur zeigen. Das ist genau dann
+ der Fall, wenn sie durch Zuweisung auseinander hervorgegangen sind oder wenn
+ sie auf das gleiche benannte Atom zeigen.
+
+ BOOL PROC equal (SYM CONST sym 1, sym 2):
+ Prüft, ob "sym 1" und "sym 2" dieselbe Struktur haben; "dieselbe Struktur"
+ braucht aber nicht "Identität" zu bedeuten, wie "eq" das verlangt.
+ Umgewandelte TEXTe und INTs werden richtig verglichen (siehe "sym (INT
+ CONST)" und "sym (TEXT CONST)").
+
+ BOOL PROC null (SYM CONST sym):
+ Prüft, ob "sym" gleich der Konstanten "NIL" ist (entspricht
+ eq ("sym", "NIL"), ist aber schneller).
+
+ BOOL PROC atom (SYM CONST sym):
+ Prüft, ob "sym" ein ( benanntes oder unbenanntes) Atom ist.
+
+ BOOL PROC is named atom (SYM CONST sym):
+ Prüft, ob "sym" ein benanntes Atom ist.
+
+ PROC begin oblist dump:
+ Vorbereitung für "next atom".
+
+ SYM PROC next atom:
+ Liefert das nächste Atom aus der Objektliste. In der Objektliste sind alle benann­
+ ten Atome, die der Heap enthält, aufgeführt (bis auf Ausnahmen; s."delete
+ atom"). "NIL" wird immer als letzte Atom geliefert.
+
+ SYM PROC atom (TEXT CONST name):
+ Liefert einen Zeiger auf das Atom mit dem Namen "name". Wenn kein solches
+ Atom in der Objektliste vorhanden ist, wird "NIL" geliefert.
+
+ SYM PROC new atom (TEXT CONST name):
+ Liefert einen Zeiger auf das Atom mit dem Namen "name". Wenn kein solches
+ Atom in der Objektliste vorhanden ist, wird ein neues mit diesem Namen in sie
+ eingefügt.
+
+ PROC create atom (TEXT CONST name):
+ Fügt ein Atom mit dem Namen "name" in die Objektliste ein. Wenn ein solches
+ Atom bereits existiert, wird stattdessen eine Fehlermeldung ausgegeben.
+
+ PROC delete atom (SYM CONST atom):
+ Streicht das Atom "atom" aus der Objektliste.
+
+ PROC begin property list dump (SYM CONST atom):
+ Vorbereitung für "next property".
+
+ PROC next property (SYM VAR property id, property):
+ Liefert die nächste Eigenschaft aus der Eigenschaftsliste des zuletzt durch
+ "begin property list dump" vorbereiteten Atoms. Wenn es sich bei der Eigen­
+ schaft um eine Flagge handelt, wird "property" auf "NIL" gesetzt; wenn es keine
+ nächste Eigenschaft mehr gibt, werden "property" und "property id" auf "NIL"
+ gesetzt.
+ Der Dump der Eigenschaftsliste beeinträchtigt die "Verwendbarkeit" des Atoms in
+ keiner Weise; es ist während des Dumps sogar möglich, Eigenschaften und
+ Flaggen zu lesen. Wenn während des Dumps Eigenschaften oder Flaggen geän­
+ dert oder geschrieben werden, ist mit fehlerhaften Dumpergebnissen zu rechnen.
+
+ PROC add property (SYM CONST atom, property id, property):
+ "property id" muß ein benanntes Atom sein. Führt eine neue Eigenschaft mit der
+ Bezeichnung "property id" und dem Wert "property" ein. Wenn bereits eine
+ Eigenschaft mit der gleichen Bezeichnung existiert, wird die alte Version über­
+ deckt, ist aber weiter vorhanden.
+
+ PROC alter property (SYM CONST atom, property id, property):
+ Bringt die Eigenschaft mit der Bezeichnung "property id" auf den neuen Wert
+ "property". Wenn eine Eigenschaft mit dieser Bezeichnung noch nicht existiert,
+ wird eine Fehlermeldung ausgegeben.
+
+ BOOL PROC property exists (SYM CONST atom, property id):
+ Prüft, ob das Atom eine Eigenschaft mit der Bezeichnung "property id" besitzt.
+
+ SYM PROC property (SYM CONST atom, property id):
+ Liefert den Wert der gerade sichtbaren Eigenschaft des Atoms, die die Bezeich­
+ nung "property id" hat. Falls die Eigenschaft nicht existiert, wird "NIL" geliefert.
+
+ PROC delete property (SYM CONST atom, property id):
+ Löscht den gerade sichtbaren Wert der Eigenschaft des Atoms, die die Bezeich­
+ nung "property id" hat. Wenn eine ältere Version dieser Eigenschaft durch "add
+ property" überdeckt wurde, wird diese jetzt wieder sichtbar. Jede Eigenschaft
+ bildet also für jedes Atom einen Stapel (Stack).
+
+ PROC add flag (SYM CONST atom, flag id):
+ Das Atom "atom" erhält die Flagge "flag id". Ein Atom kann dieselbe Flagge
+ durchaus mehrmals haben.
+
+ BOOL PROC flag (SYM CONST atom, flag id):
+ Prüft, ob "atom" mindestens eine Flagge "flag id" hat.
+
+ PROC delete flag (SYM CONST atom, flag id):
+ Löscht eine Flagge "flag id" von "atom". Wenn keine Flagge existiert, wird
+ nichts getan.
+
+ SYM PROC sym (TEXT CONST text):
+ Konvertiert "text" in ein unbenanntes Atom und liefert einen Zeiger auf dies
+ Atom.
+
+ TEXT PROC text (SYM CONST sym):
+ Konvertiert "sym" in einen TEXT zurück, wenn es sich um einen konvertierten
+ TEXT handelt; wenn nicht, wird eine Fehlermeldung ausgegeben.
+
+ BOOL PROC is text (SYM CONST sym):
+ Prüft, ob "sym" ein konvertierter TEXT ist.
+
+ SYM PROC sym character (TEXT CONST text):
+ "text" muß genau ein Zeichen enthalten. Das Zeichen wird in ein
+ CHARACTER-Objekt im Heap konvertiert und ein Zeiger auf dies Objekt gelie­
+ fert.
+
+ INT PROC character (SYM CONST sym):
+ "sym" muß auf ein CHARACTER-Objekt zeigen. Geliefert wird der Code des
+ dort gespeicherten Zeichens.
+
+ SYM PROC sym (INT CONST i 1, i 2):
+ Konvertiert "i 1" und "i 2" in ein unbenanntes Atom und liefert einen Zeiger
+ darauf.
+
+ INT PROC int 1 (SYM CONST sym):
+ INT PROC int 2 (SYM CONST sym):
+ Holt die Werte der ersten bzw. zweiten Ganzzahl aus "sym", wenn es sich um
+ ein konvertiertes INT-Paar handelt; wenn nicht, wird eine Fehlermeldung ausge­
+ geben.
+
+ BOOL PROC is int pair (SYM CONST sym):
+ Prüft, ob "sym" ein konvertiertes INT-Paar ist.
+
+
+Prozedurübergreifende Aussagen über das Paket "lisp.1":
+
+ - Es gibt benannte und unbenannte Atome.
+
+ - Die unbenannten Atome sind Konversionsprodukte.
+
+ - Vor dem ersten Aufruf von "delete atom" sind alle benannten Atome in der Ob­
+ jektliste enthalten; d.h. sie können alle durch "begin oblist dump" und wiederhol­
+ ten Aufruf von "next atom" erreicht werden.
+
+ - Jedes benannte Atom hat genau einen Namen, der immer gleich bleibt. Der
+ Name ist als Eigenschaft mit der Bezeichnung "pname" in der Eigenschaftsliste
+ gespeichert. "add property", "alter property" und "delete property" geben des­
+ halb eine Fehlermeldung aus, statt ihre normalen Aktionen durchzuführen, wenn
+ ihnen als Eigenschaftsbezeichnung "pname" übergeben wird.
+
+ - Es gibt keine zwei Atome, die denselben Namen haben; dadurch reduziert sich
+ die bei "eq" angegebene Fallunterscheidung auf einen Fall.
+
+ - Es kann durchaus zwei unbenannte Atome mit gleichen Werten geben, die von
+ "eq" nicht als gleich anerkannt werden, weil sie in verschiedenen Strukturen
+ gespeichert sind. "equal" achtet nicht auf die Position, sondern auf die Werte
+ der zu vergleichenden Strukturen.
+
+ - Mehrfache Zugriffe auf die gleiche Eigenschaft desselben Atoms werden so opti­
+ miert, daß die Eigenschaftsliste nur beim ersten Zugriff (meist durch "property
+ exists") durchsucht werden muß.
+
+
+
+#page#
+
+4.2 Weitere Funktionen sowie Eingabe und
+ Ausgabe #goalpage("p4.2")#
+
+
+
+Die Datei "lisp.2" enthält diverse Pakete, die die Verbindung vom LISP-System zur
+normalen EUMEL-Umgebung bilden. Momentan sind das Ein- und Ausgabe und
+(exemplarisch) die fünf Grundrechenarten für Ganzzahlen.
+
+Die Ein- und Ausgabe von LISP-Strukturen wird durch das Paket namens "lisp io"
+mit den folgenden Prozeduren ermöglicht:
+
+ PROC get (FILE VAR f, SYM VAR sym):
+ Nach dem Aufruf zeigt "sym" auf eine neue aus "f" eingelesene Struktur.
+ In der ersten und hinter der letzten Zeile des S-Ausdrucks dürfen keine weiteren
+ Daten stehen.
+
+ PROC get all (FILE VAR f, SYM VAR sym):
+ Wie "get (FILE V, SYM V)", nur daß die Datei nichts als den S-Ausdruck ent­
+ halten darf.
+
+ PROC get (SYM VAR sym):
+ Es wird mit "get all" ein S-Audruck von einer Scratch-Datei eingelesen, die
+ dem Benutzer vorher zum Editieren angeboten wird. Bei Einlesefehlern wird die
+ Datei zu Korrigieren angeboten, bis keine Fehler mehr auftreten.
+
+ PROC put (FILE VAR f, SYM CONST sym):
+ Wenn "sym" ein Ganzzahlpaar ist, wird die erste Zahl ausgegeben; wenn es ein
+ konvertierter TEXT ist, wird der ursprüngliche TEXT wieder ausgegeben; bei
+ einem benannten Atom oder einer allgemeinen LISP-Struktur wird ein S-Aus­
+ druck ausgegeben.
+
+ PROC put (SYM CONST sym):
+ Wie "put (FILE V, SYM CONST), außer daß die Augabe direkt auf den Bildschirm
+ erfolgt.
+
+
+Das Paket "lisp int" enthält die Prozeduren
+
+ SYM PROC sum (SYM CONST summandenliste);
+ Erwartet eine Liste von "int pair"-Summanden und liefert deren Summe.
+
+ SYM PROC difference (SYM CONST minuend, subtrahend):
+ Liefert die Differenz der Parameter.
+
+ SYM PROC product (SYM CONST faktorenliste):
+ Liefert das Produkt der Listenelemente.
+
+ SYM PROC quotient (SYM CONST dividend, divisor):
+ Liefert den Quotienten der Parameter.
+
+ SYM PROC remainder (SYM CONST dividend, divisor):
+ Liefert den Rest.
+
+#page#
+
+4.3 Interpreter #goalpage("p4.3")#
+
+
+Die Datei "lisp.3" enthält das Paket "lisp interpreter", das die Prozedur
+
+ SYM PROC evalquote (SYM CONST expression)
+
+exportiert. Es handelt sich dabei um den im EUMEL-LISP-Handbuch beschriebe­
+nen Interpreter.
+
+Wenn "expression" ein LISP-Ausdruck ist, liefert die Prozedur den Wert des Aus­
+drucks (vorausgesetzt, der LISP-Heap ist vorbereitet, siehe lisp.1).
+
+Wirkungsweise:
+"evalquote" ruft im Wesentlichen die Prozedur "eval" auf.
+"eval" erwartet als Argumente einen solchen LISP-Ausdruck wie "evalquote", benö­
+tigt aber zusätzlich eine sog. Bindeliste. In einer Bindeliste sind durch LAMBDA- und
+LABEL-Ausdrücke bereits gebundene Variable und ihre Werte gespeichert. Die
+Manipulation der Bindeliste ist durch eine Reihe von Refinements, die am Schluß des
+Pakets stehen, realisiert.
+
+Da bisher noch keine LAMBDA- oder LABEL-Ausdrücke verarbeitet wurden, über­
+gibt "evalquote" die leere Bindeliste.
+
+Wirkungsweise von
+
+ SYM PROC eval (SYM CONST expression, association list):
+
+"eval" kann als erstes Argument ein Atom oder eine zusammengesetzte Struktur
+erhalten.
+
+Atome werden als Variable aufgefaßt, deren Wert in der Bindeliste aufzusuchen ist.
+Vor der Konsultation der Bindeliste wird allerdings noch nach der Eigenschaft APVAL
+des Atoms gesehen; wenn sie vorhanden ist, handelt es sich um eine Konstante wie
+NIL, T oder F, die einen festen Wert hat, nämlich den Wert dieser Eigenschaft. Da
+diese Konstanten sich selbst als Wert haben, gilt "eval (NIL, Bindeliste) = NIL"
+(entsprechend für "T" und "F").
+
+Wenn das erste Arugment von "eval" zusammengesetzt ist, wird angenommen, daß
+es sich um einen Funktionsaufruf der Form
+
+
+ +-----+-----+
+ | o | o--+--> Argumentliste
+ +--+--+-----+
+ |
+ V
+ Funktion
+
+
+handelt. Die Bestandteile "Funktion" und "Argumentliste" werden mit der Bindeliste
+übergeben an:
+
+ SYM PROC apply (SYM CONST function, arguments, association list):
+
+"apply" hat die Aufgabe, die Argumente durch "eval" berechnen zu lassen (das
+unterbleibt allerdings unter bestimmten Umständen) und die Berechnungergebnisse an
+die Parameter der Funktion zu binden; zum Schluß muß der Wert des Funktions­
+rumpfs in Abhängigkeit von diesen neuen Bindungen als Ergebnis der gesamten
+Prozedur "apply" berechnet werden; diese Berechnung geschieht wieder durch
+"eval".
+
+Nur in einem LAMBDA-Ausdruck ist direkt bekannt, wo die Parameterliste steht.So­
+lange das nicht der Fall ist, muß entweder ein LABEL-Ausdruck oder ein Atom
+vorliegen.
+Ein LABEL-Ausdruck hat die Form
+
+
+ +-----+-----+ +-----+-----+ +-----+-----+
+ | o | o--+--->| o | o--+--->| o | NIL |
+ +--+--+-----+ +--+--+-----+ +--+--+-----+
+ | | |
+ V V V
+ LABEL Name Funktion
+
+
+Da der Name für die Dauer der Auswertung des Funktionsrumpfs an die Funktion
+gebunden sein muß, wird dis Paar als funktionaler Bindelisteneintrag gespeichert.
+Funktionale und nichtfunktionale Bindelisteneinträge sind eindeutig unterschieden.
+
+Nach dem Abspeichern wird wieder getestet, ob die Funktion diesmal ein
+LAMBDA-Ausdruck ist; wenn nicht, wird ein weiterer Schritt zum "Ablättern" von
+LABELs und Atomen versucht, usw.
+
+Wenn die Funktion ein Atom ist, werden analog zu den Vorgängen in "eval" erst die
+Eigenschaftsliste und dann die Bindeliste durchsucht.
+
+Ist die Eigenschaft FUNCTION in der Eigenschaftsliste vorhanden, ist der Wert der
+Eigenschaft die (evtl. weiter "abzublätternde") Funktion; ist die Eigenschaft nicht
+vorhanden, muß das Atom an eine Funktion gebunden sein, die dann aus der Binde­
+liste geholt werden kann.
+
+Da alle Funktionen (auch die Standardfunktionen) letztendlich als LAMBDA-Aus­
+drücke definiert sind, kommt "apply" auf diese Weise zuletzt zu einem LAMBDA-
+Ausdruck.
+
+Ein LAMBDA-Ausdruck hat die Form
+
+
+ +-----+-----+ +-----+-----+ +-----+-----+
+ | o | o--+--->| o | o--+--->| | |
+ +--+--+-----+ +--+--+-----+ +-----+-----+
+ | |
+ V V
+ LAMBDA Parameterliste
+
+
+Als nächster Schritt werden die Argumente für die zu berechnende Funktion an die
+Parameter der Parameterliste gebunden, d.h. es werden Parameter-Argument-Paare
+in die Bindeliste eingetragen.
+
+Die Methode des Eintrags ist je nach Art des Parameters unterschiedlich. Es gibt die
+folgenden Arten von Parametern:
+
+
+ 1. |
+ |
+ V
+ Name
+
+
+ "Name" ist hier - wie bei den restlichen Fällen - der Name des Parame­
+ ters. Diese Art von Parametern ist der Normalfall; die Argumente, die einem
+ solchen Parameter entsprechen, werden durch "eval" berechnet und zusammen
+ mit dem Parameter in einem Bindelisteneintrag gespeichert.
+
+
+ 2. |
+ |
+ V
+ +-----+-----+ +-----+-----+
+ | o | o--+--->| o | NIL +
+ +--+--+-----+ +--+--+-----+
+ | |
+ V V
+ QUOTE Name
+
+
+ In diesem Fall wird das Argument ohne weitere Verarbeitung in die Bindeliste
+ übernommen. Die Wirkung ist die gleiche, als wäre das Argument durch
+ "(QUOTE ... )" eingeschlossen.
+
+
+ 3. |
+ |
+ V
+ +-----+-----+ +-----+-----+
+ | o | o--+--->| o | NIL |
+ +--+--+-----+ +--+--+-----+
+ | |
+ V V
+ FUNCTION Name
+
+
+ Hier wird ein funktionaler Bindelisteneintrag erzeugt, so daß "Name" im Funk­
+ tionsrumpf als Name einer Funktion auftreten kann.
+
+
+ 4. |
+ |
+ V
+ +-----+-----+ +-----+-----+
+ | o | o--+--->| o | NIL |
+ +--+--+-----+ +--+--+-----+
+ | |
+ V V
+ INDEFINITE Name
+
+
+ Dies ist ein Parameter, der beliebig viele berechnete Argumente aufnehmen
+ kann. Der Einfachheit halber werden die Ergebnisse zu einer Liste zusammen­
+ gefaßt und mit "Name" in einen Bindelisteneintrag gesteckt.
+
+
+ 5. |
+ |
+ V
+ +-----+-----+ +-----+-----+ +-----+-----+
+ | o | o--+--->| o | o--+--->| o | NIL |
+ +--+--+-----+ +--+--+-----+ +--+--+-----+
+ | | |
+ V V V
+ INDEFINITE QUOTE Name
+
+
+ Dieser Parameter kann wie der in Fall 4. aufgeführte beliebig viele Argumente
+ aufnehmen, die zu einer Liste zusammengefaßt werden. Im Gegensatz zu 4.
+ wird aber wie bei 2. nichts durch "eval" berechnet, sondern die Argumente so
+ wie sie vorkommen übernommen.
+
+Auf einen Parameter der Form 4. oder 5. darf kein weiterer Parameter folgen, weil
+solch ein Parameter alle restlichen Argumente verbraucht. Solchen Parametern darf -
+als Ausnahme - auch kein Argument entsprechen; dann werden sie an die leere
+Liste (d.h. NIL) gebunden.
+
+Der letzte Kasten in der Beschreibung des LAMBDA-Ausdrucks ist mit Absicht leer
+geblieben; er kann eine der Formen
+
+
+ +-----+-----+ +----------+----------+
+ | o | NIL | oder | Ganzzahl | XXXXXXXX |
+ +--+--+-----+ +----------+----------+
+ |
+ V
+ Funktionsrumpf
+
+
+annehmen.
+
+Die erste Form heißt, daß die Funktion durch Berechnung des Funktionsrumpfs mittels
+"eval" berechnet werden soll; die zweite Form bewirkt den Aufruf einer der Standard­
+funktionen, je nachdem, welche Funktionsnummer bei "Ganzzahl" steht. In diesem
+zweiten Fall werden die Argumente aber nicht durch den Namen des Parameters
+identifiziert, sondern durch die Position des Eintrags in der Bindeliste. Dieser Pro­
+grammteil hängt also wesentlich von der Reihenfolge ab, in der die Bindelisteneinträ­
+ge, die bei der Parameter-Argument-Zuordnung entstehen, in die Bindeliste einge­
+fügt werden. Zur Zeit ist das die Umkehrung der Reihenfolge der Parameter.
+
+Die Namen der Refinements "arg 1", "arg 2", "arg 3" beziehen sich auch nicht auf
+die Position des Arguments in der Argumentsliste, sondern auf die Position des
+Eintrags in der Bindeliste.
+
+#page#
+
+4.4 Kommandoprozeduren #goalpage("p4.4")#
+
+
+
+Die Datei "lisp.4" enthält eine Reihe von Prozeduren, mit denen der LISP-Interpre­
+ter ähnlich wie der ELAN-Compiler aufgerufen werden kann.
+
+Die Prozedur
+
+ start lisp system
+
+ermöglicht das erneute Starten des LISP-Systems, oder wenn "übersetzte" Pro­
+gramme, die in einem Heap einer anderen Task liegen, in dieser Task verarbeitet
+werden sollen.
+
+Die Prozedur
+
+ lisp
+
+stellt die LISP-Maschine in einem Doppelfenster im Bildschirmdialog zur Verfügung.
+Bei der erstmaligen Benutzung muß die Datei "lisp.bootstrap" vorhanden sein.
+
+Die Prozedur
+
+ break lisp
+
+koppelt die LISP-Task vom Benutzer-Terminal ab und baut das Doppelfenster für
+den Bildschirmdialog neu auf.
+
+
+Die Prozedur
+
+ run lisp
+
+bewirkt, daß ein LISP-Programm eingelesen und ausgeführt wird; nach der Ausfüh­
+rung wird das Ergebnis der Berechnung ausgegeben. Diese Operationen werden auf
+einer Kopie des Heaps ausgeführt, so daß Änderungen keine Dauerwirkung haben.
+Mit
+
+ run lisp again
+
+wird das zuletzt eingelesene Programm noch einmal gestartet; da dafür die gleiche
+Kopie des Heaps wie bei "run" benutzt wird, kann das Ergebnis diesmal anders sein.
+
+ insert lisp
+
+wirkt wie "run lisp", außer daß diesmal alle Änderungen, die durch das Einlesen und
+Ausführen im Heap entstehen, dauerhaft sind.
+
+
+ PROC start lisp system (DATASPACE CONST heap):
+ Eine Kopie von "heap" wird der neue LISP-Heap. Wenn es sich um "nilspa­
+ ce" handelt, werden einige organisatorische Strukturen im Heap aufgebaut und
+ die Atome "NIL" und "PNAME" erzeugt.
+
+ PROC start lisp system (DATASPACE CONST heap, FILE VAR f):
+ Zunächst wird "start lisp system (heap)" gegeben.
+ Danach werden die Eigenschaftsbeschreibungen aus "f" in Strukturen im Heap
+ umgesetzt.
+
+ Jede Beschreibung in "f" muß mit dem Zeilenanfang beginnen und kann sich
+ über mehrere Zeilen erstrecken. Jede Beschreibung besteht aus den Elementen
+ <Atom> <Eigenschaft> <Wert>
+ wobei <Eigenschaft> der Name einer Eigenschaft (i.a. APVAL oder FUNCTION)
+ und <Wert> ein beliebiger S-Ausdruck sein müssen. Die drei Elemente müs­
+ sen jeweils durch mindestens ein Leerzeichen getrennt sein.
+
+ Wenn das Atom <Atom> nicht existiert, wird es erzeugt; danach wird <Wert>
+ unter <Eigenschaft> in der Eigenschaftsliste eingetragen.
+
+ Wenn <Eigenschaft> NIL ist, muß <Wert> wegfallen; dann wird nichts in die
+ Eigenschaftsliste eingetragen.
+
+ DATASPACE PROC lisp heap:
+ Liefert den LISP-Heap. Das ist manchmal für Sicherheitskopien etc. nützlich.
+ Die durch "run lisp" erzeugten Kopien sind nicht zugänglich.
+
+ PROC run lisp:
+ Ruft "run lisp (last param)" auf.
+
+ PROC run lisp (TEXT CONST file name):
+ Das in der Datei "file name" stehende LISP-Programm (d.h. der dort stehende
+ in einen S-Ausdruck übersetzte M-Ausdruck) wird in eine neue Kopie des
+ LISP-Heaps eingelesen und ausgeführt. Evtl. vorher durch "run lisp" erzeugte
+ Kopien des Heaps werden vorher gelöscht.
+
+ Wenn das Programm syntaktisch nicht korrekt ist, wird es im Paralleleditor zur
+ Korrektur angeboten.
+
+ PROC run lisp again:
+ Führt das zuletzt eingelesene Programm noch einmal im gleichen Heap aus.
+
+ PROC insert lisp:
+ Ruft "insert lisp (last param)" auf.
+
+ PROC insert lisp (TEXT CONST file name):
+ Wirkt wie "run lisp (file name)", nur daß alle Operationen auf dem Originalheap
+ ausgeführt werden. Auch "run lisp again" wirkt nun nicht mehr auf der Kopie.
+
diff --git a/doc/menugenerator/menu-generator handbuch.1 b/doc/menugenerator/menu-generator handbuch.1
new file mode 100644
index 0000000..c190c0a
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.1
@@ -0,0 +1,100 @@
+#type ("prop.lq")##limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (3)#
+#headodd#
+#center#ls-Menu-Generator#right#%
+
+#end#
+#headeven#
+%#center#ls-Menu-Generator
+
+#end#
+#type ("prop.breit.lq")#
+#center#1
+
+#center#Was
+#center#kann
+#center#ls-Menu-Generator
+#type ("prop.lq")#
+
+
+ In diesem Kapitel wollen wir Ihnen erläutern, was Sie
+mit #on("b")#ls-Menu-Generator#off("b")# anfangen können. Wir gehen davon
+aus, daß Ihnen die Benutzerschnittstelle #on("b")#ls-DIALOG#off("b")# be­
+kannt ist und daß Sie bereits mit einigen Anwendungen
+unter #on("b")#ls-DIALOG#off("b")# gearbeitet haben. Weiterhin setzen wir
+voraus, daß Sie Programmierkenntnisse (EUMEL/ELAN) be­
+sitzen.
+ Bisher war es Ihnen nur möglich, von uns fertigge­
+stellte Programme unter der komfortablen Benutzer­
+schnittstelle #on("b")#ls-DIALOG#off("b")# laufen zu lassen. Sie haben aber
+sicher erkannt, welche Vorteile es bietet, Programme un­
+ter einer einheitlichen Benutzeroberfläche zu realisie­
+ren:
+ Zunächst profitiert natürlich der Anwender von der
+einfachen und immer einheitlichen Bedienung solcher
+Programme. Der Aufwand, sich in neue Programmsysteme
+einzuarbeiten, wird erheblich reduziert. #on("b")#ls-DIALOG#off("b")# wurde
+ja auch speziell für den Unterricht konzipiert und ent­
+wickelt: Ziel war es, Computerlaien einen Zugang zum
+Computer zu verschaffen und den Umgang mit dem Compu­
+ter zu vereinfachen.
+
+ #on("b")#ls-Menu-Generator#off("b")#ist nun aber kein weiteres Anwen­
+dungsprogramm! #on("b")#ls-Menu-Generator#off("b")# ist stattdessen für
+den Programmierer gedacht, der selbst unter #on("b")#ls-DIALOG#off("b")#
+Anwendungssysteme entwickeln möchte. #on("u")#Wir erhoffen uns
+durch die Bereitstellung dieses Werkzeuges, daß sich auch
+andere engagierte Personen daran beteiligen, qualitativ
+hochwertige Software insbesondere für den Schulbereich
+unter #on("b")#ls-DIALOG#off("b")# zu entwickeln.#off("u")#
+
+ Mit #on("b")#ls-Menu-Generator#off("b")# haben Sie zwei Komponenten
+erworben: Das Generator-Programm zur Erzeugung von
+Menukarten und eine umfangreichen Dokumentation. Dabei
+enthält die Dokumentation nicht nur Informationen dar­
+über, wie Sie mit dem Generator-Programm arbeiten kön­
+nen - das natürlich auch. Darüberhinaus werden Ihnen
+alle Möglichkeiten, die #on("b")#ls-DIALOG#off("b")# zur Programmgestal­
+tung bietet, ausführlich erläutert - das macht den we­
+sentlichen Teil der Dokumentation aus!
+
+ #on("b")#ls-DIALOG#off("b")# ist eigentlich ein "Baukastensystem", auf
+das andere Programme zugreifen können. Sie wissen si­
+cherlich, wieviel Arbeit bei jedem Programm aufzuwen­
+den ist, um die Benutzerschnittstelle zu realisieren. Die
+Gestaltung und Pflege der Benutzerschnittstelle kann
+bis zu 50% der Gesamtarbeit an einem Programm ausmachen.
+#on("b")#ls-Menu-Generator#off("b")# soll Ihnen helfen, diese Arbeit zu
+verringern.
+
+ Alle Informationen, die ein Menu betreffen, sind in
+der sogenannten 'Menukarte' abgelegt. Wird nun ein Pro­
+gramm unter #on("b")#ls-DIALOG#off("b")# aufgerufen, so wird die entspre­
+chende Menukarte aus der "Menukarten - Sammeltask" ('ls-
+MENUKARTEN') geholt und an das System angekoppelt. An­
+schließend wird dem Anwender das Menu auf dem Bildschirm
+angeboten.
+ Das Erstellen solcher Menukarten ist mit dem Genera­
+torprogramm sehr einfach - es wird in Kapitel 4 beschrie­
+ben. Allerdings sollten Sie nicht die Arbeit unterschät­
+zen, die Sie für eine sorgfältig erstellte, mit allen In­
+formationtexten gefüllte Menukarte aufwenden müssen!
+
+ Bei den meisten Programmmen reicht aber ein einfaches
+Menu nicht aus. Bei vielen Verarbeitungsfunktionen ist
+es notwendig, mit dem Anwender einen Dialog zu führen:
+z.B. muß ein Dateiname erfragt, eine Information ausgege­
+ben und bestätigt, eine Auswahl oder eine Entscheidung
+getroffen werden. Alle Möglichkeiten, die #on("b")#ls-DIALOG#off("b")# dazu
+bereitstellt, sind in Kapitel 5 dokumentiert.
+
+ Einige Reihe von Verarbeitungsfunktionen treten in
+nahezu jeder Anwendung auf (Datei- und Archivhandling).
+Hier stellt #on("b")#ls-DIALOG#off("b")# schon vorgefertigte Module zur
+Verfügung. In Kapitel 6 zeigen wir Ihnen, wie Sie auf die­
+se Module zugreifen und sie in Ihr Programmsystem ein­
+binden können. In Kapitel 7 zeigen wir Ihnen außerdem,
+wie Sie eigene Fenster definieren können und welche Ope­
+rationen auf diesen Fenstern zur Verfügung stehen.
+
diff --git a/doc/menugenerator/menu-generator handbuch.2 b/doc/menugenerator/menu-generator handbuch.2
new file mode 100644
index 0000000..696ed28
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.2
@@ -0,0 +1,87 @@
+#type ("prop.lq")##limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (6)#
+#headodd#
+#center#ls-Menu-Generator#right#%
+
+#end#
+#headeven#
+%#center#ls-Menu-Generator
+
+#end#
+#type ("prop.breit.lq")#
+#center#2
+
+#center#Installation
+#center#von
+#center#ls-Menu-Generator
+#type ("prop.lq")#
+
+
+ Bevor Sie #on("b")#ls-Menu-Generator#off("b")# auf Ihrem System benut­
+zen können, müssen Sie das Programm zunächst installie­
+ren. Wenn #on("b")#ls-Menu-Generator#off("b")# auf Ihrem System schon zur
+Verfügung steht, können Sie dieses Kapitel ruhig über­
+springen.
+
+
+2.1 Voraussetzungen
+
+ Um #on("b")#ls-Menu-Generator#off("b")# auf Ihrem Computer betreiben
+zu können, muß das EUMEL-Betriebssystem (Multi-User-
+Version) installiert und das Programmpaket #on("b")#ls-DIALOG#off("b")#
+(Version 1.1) bereits insertiert sein.
+
+
+2.2 Lieferumfang
+
+ #on("b")#ls-Menu-Generator#off("b")# wird auf einer Diskette geliefert,
+die alle notwendigen Programme enthält. Folgende Dateien
+sollten sich auf der Diskette befinden:
+
+ "fonttab.ls-Menu-Generator"
+ "ls-MENUBASISTEXTE"
+ "Generatordatei: Archivmenu"
+ "ls-Menu-Generator 1"
+ "ls-Menu-Generator 2"
+ "ls-Menu-Generator/gen"
+
+ Eventuell können noch weitere Namen auf der Diskette
+vorhanden sein.
+
+
+2.3 Installation
+
+Die Installation erfolgt in #on("u")#zwei Schritten#off("u")#:
+
+ #on("u")#Zunächst#off("u")# muß die mitgelieferte Fonttabelle
+('fonttab.ls-Menu-Generator') in die Task 'configurator'
+geholt werden. Da Sie aus dem 'UR-Zweig' des EUMEL-
+Systems keinen schreibenden Zugriff auf die Task
+'configurator' haben, müssen Sie die Task 'configurator'
+an Ihr Terminal koppeln und die Datei 'fonttab.ls-Menu-
+Generator' von der Diskette in die Task kopieren.
+ #on("u")#Anschließend#off("u")# kann #on("b")#ls-Menu-Generator#off("b")# in einer Task
+installiert werden, in der bereits das Programm #on("b")#ls-DIALOG#off("b")#
+zur Verfügung steht. Richten Sie also eine Task als Sohn
+der Task ein, in der auf Ihrem Computer bereits #on("b")#ls-DIALOG#off("b")#
+installiert ist. Legen Sie dann die Archivdiskette ein,
+auf der sich #on("b")#ls-Menu-Generator#off("b")# befindet und geben Sie
+die folgenden Kommandos:
+
+ archive("ls-Menu-Generator") <RETURN>
+
+ fetch("ls-Menu-Generator/gen",archive) <RETURN>
+
+ run <RETURN>
+
+ Sie haben damit das Generatorprogramm gestartet; die
+Installation wird automatisch durchgeführt. Lassen Sie
+während des gesamten Vorgangs die Archivdiskette einge­
+legt. Die Generierung ist beendet, wenn der EUMEL-Ein­
+gangsbildschirm erscheint. Die Task, in der die Generie­
+rung stattfindet, wird automatisch zur Managertask, das
+heißt, daß Söhne von ihr eingerichtet werden können.
+
+
+
diff --git a/doc/menugenerator/menu-generator handbuch.3 b/doc/menugenerator/menu-generator handbuch.3
new file mode 100644
index 0000000..e982988
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.3
@@ -0,0 +1,155 @@
+#block##pageblock#
+#pagenr("%",1)##setcount(1)##count per page#
+#headeven#
+gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#right#gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+3 - % #right#ERGOS
+#end#
+#bottomodd#
+#center#____________________________________________________________
+ERGOS #right# 3 - %
+#end#
+#ib#3 Die Arbeitsweise von gs-DIALOG#ie#
+
+
+In diesem Kapitel soll die grundsätzliche Arbeitsweise von gs-DIALOG erläutert
+werden. Sie erfahren, wie das Menusystem aufgebaut ist, wie man Menukarten an­
+koppelt und Menus zur Ausführung bringt. Ebenso wird erläutert, wie eine Menukarte
+aufgebaut ist.
+Wenn Sie die hier beschriebenen Vorgänge auf ihrem System nachvollziehen wollen,
+so muß in Ihrer Task das Programm 'gs-DIALOG' zur Verfügung stehen!
+
+
+#ib#3.1 Ankoppeln einer Menukarte - Ausführen eines Menus#ie#
+
+Vereinfacht gesagt ist eine Menukarte ein Datenraum, in dem alle Informationen, die
+zum Menu (zu den Menus) gehören, abgelegt sind. Der genaue Aufbau einer solchen
+Menukarte wird in Kapitel 3.2 beschrieben.
+Alle Menukarten, die auf einem System zur Verfügung stehen, werden in einer zentra­
+len Task ('gs-MENUKARTEN') bereitgehalten. Die Menukarten können von hier
+angefordert werden.
+Lassen Sie sich in Ihrem System eine Übersicht der vorhandenen Menukarten geben
+(list (/"gs-MENUKARTEN") <RETURN> ). Darauf wird Ihnen gegebenenfalls folgen­
+de Übersicht angeboten:
+
+ 01.09.87 "gs-MENUKARTE:Archiv"
+ 01.09.87 "gs-MENUKARTE:Herbert und Robbi"
+ 01.09.87 "gs-MENUKARTE:MP-BAP"
+ ...
+
+Zumindest die erste Menukarte müßte - sofern die gs-DIALOG-Basissoftware instal­
+liert ist - auf Ihrem System vorhanden sein. Die beiden anderen Menukarten sind
+natürlich nur dann vorhanden, wenn Sie die Programme 'gs-Herbert und Robbi'
+und 'gs-MP BAP' installiert haben.
+
+In einer weiteren Task (z.B. 'DIALOG') sind die Programme installiert, die es ermög­
+lichen, diese Menukarten zu handhaben. Alle Sohntasks dieser Task "erben" natür­
+lich diese Fähigkeiten. Von einer solchen Task aus kann nun eine Menukarte ange­
+fordert und ein darin enthaltenes Menu zur Ausführung gebracht werden. Das haben
+Sie sicher schon oft gemacht, z.B. wenn Sie den Befehl 'archiv' gegeben haben. Was
+hinter diesem Befehl steckt, sollen Sie sich jetzt klar machen:
+
+Wenn Sie den Befehl 'archiv' geben, wird zunächst die Menukarte
+'gs-MENUKARTE:Archiv' aus der Task 'gs-MENUKARTEN' angefordert und in Ihre
+Task kopiert. Davon merken Sie normalerweise nichts, denn nachdem die Ankopp­
+lung des Datenraumes (als unbenannter Datenraum) erfolgt ist, wird die Daten­
+raumkopie gelöscht; daher taucht der Name auch nie in Ihrer Dateiliste auf. Intern
+vermerkt das System, welche Menukarte aktuell angekoppelt ist. Soll wiederholt
+dieselbe Menukarte angekoppelt werden, so erübrigt sich das Kopieren aus der zen­
+tralen Bereitstellungstask.
+
+Nach dem Ankoppeln der Menukarte können Sie auf die in der Menukarte enthalte­
+nen Informationen zugreifen. Da in einer Menukarte mehrere Menus enthalten sein
+können, müssen Sie dem System noch mitteilen, welches Menu aktiviert werden soll.
+In der Menukarte 'gs-MENUKARTE:Archiv' ist nur ein Menu enthalten, das den
+Namen 'ARCHIV' hat (der Name des Menus erscheint übrigens bei der Präsentation
+immer oben links in der Kopfzeile).
+
+Sie sollen jetzt, ohne den Befehl 'archiv' zu verwenden, das Menu zur Ausführung
+bringen. Geben Sie dazu die folgenden Kommandos in der 'gib kommando:'- Ebene:
+
+ #ib#install menu#ie# ("gs-MENUKARTE:Archiv");
+ #ib#handle menu#ie# ("ARCHIV")
+
+Mit dem ersten Befehl koppeln Sie die genannte Menukarte an, mit dem zweiten
+Befehl bringen Sie das darin enthaltene Menu 'ARCHIV' zur Ausführung.
+Allerdings stellen Sie sicher auch einen Unterschied zur Ausführung des Befehls
+'archiv' fest, denn dort erscheint nicht erst unser "Software - Emblem" auf dem
+Bildschirm, sondern direkt das Menu.
+
+Wenn Ihnen eines der Programme 'gs-Herbert und Robbi' oder 'gs-MP BAP'
+bekannt ist, haben Sie unser Emblem aber sicher schon gesehen - wir verwenden es
+immer, um unsere Softwareprodukte kenntlich zu machen. Da man aber das Archiv­
+programm sehr häufig benötigt und es dann nur störend wirkt kann die Ausgabe
+unterdrückt werden. Daher gibt es den Befehl 'install menu' in zwei Versionen.
+Versuchen Sie es gleich einmal:
+
+ install menu ("gs-MENUKARTE:Archiv", FALSE);
+ handle menu ("ARCHIV")
+
+Die Präsentation des Menus erfolgt gleich aus zwei Gründen schneller als beim ersten
+Mal: einerseits wurde auf die Ausgabe unseres Software - Emblems verzichtet, ande­
+rerseits brauchte die Menukarte nicht erneut aus der Task 'gs-MENUKARTEN' kopiert
+zu werden, da sie ja schon angekoppelt war.
+Damit sind Sie nun in der Lage, Menukarten anzukoppeln und Menus zur Ausfüh­
+rung zu bringen.
+
+
+#ib#3.2 Aufbau/Inhalt einer Menukarte#ie#
+
+Eine Menukarte ist eine komplexe Datenstruktur, die bis zu 6 vollständige Menus
+aufnehmen kann. Weiterhin sind eine Reihe von Texten in jeder Menukarte abgelegt,
+auf die gs-DIALOG zurückgreift. Darüberhinaus kann der Anwendungsprogram­
+mierer bis zu 2000 Texte in die Menukarte auslagern, um so beim Insertieren seiner
+Programme den Umfang an Paketdaten geringer zu halten.
+Auf den ersten Blick scheint es wenig Sinn zu machen, mehrere Menus in einer
+Menukarte zu verwalten. Nehmen wir aber als Beispiel das Programmsystem
+gs-Herbert und Robbi. Hier ist ein Programm in zwei unterschiedlichen Ausprä­
+gungen zu behandeln. Sowohl das Hamster- als auch das Robotermenu befinden sich
+in einer Menukarte. Bei einem Wechsel zwischen den Modellen braucht also keine
+neue Menukarte angefordert, sondern nur ein neues Menu aus der aktuellen Menu­
+karte aktiviert zu werden.
+Zum anderen ist gs-DIALOG schon auf umfangreichere Programmsysteme vorberei­
+tet: Es ist nämlich möglich, von einem Menu aus ein weiteres Menu aus der aktuellen
+Menukarte zu aktivieren. Auf dem Bildschirm werden die beiden Menus dann ge­
+schachtelt (das zuletzt aktivierte vor dem aufrufenden Menu) angezeigt. Nach Verlas­
+sen der zweiten Menuebene gelangt der Benutzer automatisch in das Ausgangsmenu
+zurück.
+Zwar ist es nicht möglich, mehr als zwei Menus gleichzeitig zu aktivieren (geschach­
+telt auf dem Bildschirm darzustellen), doch können an verschiedenen Stellen des
+Ausgangsmenus ja unterschiedliche Menus aus der aktuellen Menukarte aktiviert
+werden.
+
+Jedes Menu in der Menukarte wird durch einen Namen gekennzeichnet. Dieser Name
+erscheint in der Kopfzeile oben links. Über diesen Namen kann das Menu aktiviert
+werden.
+Ein Menu besteht aus den sogenannten 'Oberbegriffen', die in der Kopfzeile angezeigt
+werden. In einer Kopfzeile können bis zu 10 Oberbegriffe verwaltet werden. Da zu
+jedem Oberbegriff bis zu 15 Verarbeitungsfunktionen (in den Pull-Down-Menus)
+verwaltet werden können, ist es möglich, in einem Menu bis zu 150 Verarbeitungs­
+funktionen abzulegen. Nutzt man alle 6 Menus einer Menukarte, so können maximal
+bis zu 900 Verarbeitungsfunktionen in einer Menukarte verwaltet werden.
+
+Eine Verarbeitungsfunktion besteht aus der/dem
+
+ - 'Ein-Zeichen-Kennung' - die angibt, durch welche Taste die Verarbei­
+ tungsfunktion ggf. aktiviert werden kann;
+ - 'Menupunktbezeichnung' - die im Pull-Down-Menu als Name für die
+ Verarbeitungsfunktion erscheint;
+ - 'Funktionsaufruf' - dem Namen der Prozedur, die bei der Aktivie­
+ rung des Menupunktes zur Ausführung ge­
+ bracht wird;
+ - 'Informationstext' - der zur aktuellen Verarbeitungsfunktion durch
+ Tippen der <?>-Taste abgerufen werden
+ kann.
+
+
diff --git a/doc/menugenerator/menu-generator handbuch.4 b/doc/menugenerator/menu-generator handbuch.4
new file mode 100644
index 0000000..97e7491
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.4
@@ -0,0 +1,424 @@
+#block##pageblock#
+#pagenr("%",1)##setcount(1)##count per page#
+#headeven#
+gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#right#gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+4 - % #right#ERGOS
+#end#
+#bottomodd#
+#center#____________________________________________________________
+ERGOS #right# 4 - %
+#end#
+#ib#4 Erstellen einer neuen Menukarte#ie#
+
+
+Aus Kapitel 3 wissen Sie, wie man eine fertige Menukarte ankoppelt und wie man ein
+darin enthaltenes Menu zur Ausführung bringen kann. Außerdem wissen Sie bereits,
+welche Informationen in einer Menukarte untergebracht werden können. In diesem
+Kapitel nun wollen wir Ihnen zeigen, wie Sie eine eigene Menukarte entwickeln
+können.
+Damit Sie sich die Abläufe besser vorstellen können, werden wir die Vorgänge an
+einem Beispiel aufzeigen: Wir wollen eine 'kleine Textverarbeitung' schaffen, deren
+Verarbeitungsfunktionen über ein Menu angeboten werden.
+Es sei aber darauf hingewiesen, daß es nicht darum geht, eine voll funktionsfähige
+Textverarbeitung auszuarbeiten - vielmehr sollen die Erstellung der Menukarte und
+das Nutzen der durch gs-DIALOG bereitgestellten Werkzeuge exemplarisch auf
+gezeigt werden.
+
+
+#ib#4.1  Eintragen der Menupunkte#ie#
+
+Unsere Menukarte soll den Namen 'Kleine Textverarbeitung' erhalten, das darin
+enthaltene Menu den Namen 'SCRIPT'. Unter dem Oberbegriff 'Bearbeiten' sollen 5
+Verarbeitungsfunktionen angeboten werden. Insgesamt soll unser neues Menu fol
+genden Aufbau haben:
+
+SCRIPT: Bearbeiten
+
+ n Neu erstellen
+ a Ansehen/Ändern
+ ----------------
+ v Verzeichnis
+ ----------------
+ z Zeilenformtierung
+ s Seitenformatierung
+
+
+
+Zur Erzeugung der zugehörigen Menukarte schreiben Sie folgendes Pro­
+gramm in eine Datei:
+
+
+oeffne menukarte ("Kleine Textverarbeitung");
+oeffne menu ("SCRIPT");
+
+oberbegriff ("Bearbeiten");
+
+menufunktion ("n", "Neu erstellen", "neue datei editieren","");
+menufunktion ("a", "Ansehen/Ändern", "alte datei editieren","");
+trennlinie;
+menufunktion ("v", "Verzeichnis", "verzeichnis ausgeben","");
+trennlinie;
+menufunktion ("z", "Zeilenformatierung", "zeilen formatieren","");
+menufunktion ("s", "Seitenformatierung", "seiten formatieren","");
+
+schliesse menu;
+schliesse menukarte;
+
+
+Bevor wir Ihnen die Einzelheiten erklären, sollten Sie zuerst einmal Ihr neu erstelltes
+Menu ausprobieren. Verlassen Sie dazu die Datei und geben Sie das Kommando 'run'.
+Nachdem das von Ihnen geschriebene Programm übersetzt worden ist, meldet sich
+der Menu-Generator.
+Die an Sie gestellte Frage 'Sollen auch Anwendungs texte in die Menukarte aufge­
+nommen werden (j/n)?' beantworten Sie einfach mit n(ein). Auf dem Bildschirm
+wird angezeigt, wie die Menukarte erstellt wird. Auf das Ende der Menukartengenerie­
+rung wird hingewiesen. Wenn Sie sich jetzt die Dateiliste Ihrer Task anzeigen lassen,
+taucht dort eine Datei mit Namen 'gs-MENUKARTE:Kleine Textverarbeitung' auf - das
+ist die neue Menukarte.
+Sie möchten sicher gleich ausprobieren, ob das Menu Ihren Vorstellungen entspricht.
+Geben Sie dazu das Kommando 'testinstallation ("gs-MENUKARTE:Kleine Textver­
+arbeitung")'. Bitte geben Sie den Text genauso ein wie hier angegeben!
+Nach kurzer Zeit erscheint der Hinweis 'Installation abgeschlossen!'. Geben Sie nun
+den Befehl 'handle menu ("SCRIPT")'; hierdurch aktivieren Sie das von Ihnen neu
+erstellte Menu - es erscheint auf dem Bildschirm.
+
+Über den Befehl '#ib#testinstallation#ie#' haben Sie sich sicher gewundert. Ihnen ist ja
+schon der Befehl '#ib#install menu#ie#' bekannt. Dieser Befehl aber kann hier nicht ein­
+fach angewendet werden - er ist für den (späteren) "regulären Betrieb" vorgesehen.
+Bedenken Sie bitte zweierlei: Die Menukarte befindet sich nur in Ihrer Task, 'install
+menu' fordert die Menukarte aber aus der Task 'gs-MENU KARTEN' an. Ist eine
+Menukarte schon angekoppelt gewesen, so wird nicht erneut angekoppelt, sondern
+auf die angekoppelte Menukarte zurückgegriffen. Dies alles können wir bei der
+Menukartenerstellung nicht gebrauchen!
+Der Befehl 'testinstallation' sendet automatisch die Menukarte zur Task
+'gs-MENUKARTEN' und kennzeichnet Sie noch durch den eigenen Tasknamen (da
+durch können sich beim Multiuserbetrieb unterschiedliche Anwender mit gleichem
+Menukartennamen nicht gegenseitig stören). Die Menukarte wird anschließend in
+jedem Falle 'frisch' angekoppelt, so daß Sie nach dem Befehl immer die aktuelle
+Menukarte angekoppelt haben. Außerdem bleibt die Menukarte in Ihrer Task erhal­
+ten!
+
+Doch nun zur Erläuterung des oben notierten Programms:
+
+Ein Programm zur Erstellung einer Menukarte muß immer mit dem Befehl '#ib#oeffne
+menukarte#ie#' beginnen und mit dem Befehl '#ib#schliesse menukarte#ie#' abgeschlos­
+sen werden. Der Befehl 'oeffne menukarte' hat einen Parameter (TEXT CONST) -
+hierdurch wird festgelegt, welchen Namen die Menukarte haben soll. Durch das
+Kommando 'oeffne menu karte ("Menu 1")' entsteht also die Menukarte 'gs-MENU
+KARTE:Menu 1".
+In die Menukarte können jetzt bis zu 6 Menus eingetragen werden. Jeder Eintrag
+eines Menus beginnt mit dem Befehl '#ib#oeffne menu#ie#' und endet mit dem Befehl
+'#ib#schliesse menu#ie#'. Der Befehl 'oeffne menu' hat hier einen Parameter (TEXT
+CONST) - hierdurch wird festgelegt, welchen Namen das Menu erhalten soll. Unter
+diesem Namen kann später das Menu angesprochen werden (z.B. 'handle menu
+("SCRIPT")'.
+
+Den Befehl 'oeffne menu' gibt es noch in zwei weiteren Ausführungen:
+Mit drei Textparametern - neben dem Namen des Menus können hier noch zwei
+Prozedurnamen angegeben werden. Diese Prozeduren werden beim Einstieg in das
+Menu bzw. beim Verlassen des Menus aufgerufen. Hiervon wird z.B. Gebrauch ge­
+macht, wenn das Archiv-Menu in eine Menukarte integriert ist: Wenn das Menu
+verlassen wird, soll sichergestellt sein, daß das Archiv automatisch freigege ben wird.
+Mehr hierüber erfahren Sie im Kapitel 6.1, in dem aufgezeigt wird, wie das Archiv-
+Menu in andere Menus eingebunden wird.
+Mit sechs Textparametern - neben den eben genannten drei Parametern können noch
+drei Texte übergeben werden. Diese Texte werden beim Aufruf des Menus unten
+rechts auf dem Bildschirm ausgegeben. Bei unseren Software-Produkten (z.B.
+'gs-Herbert und Robbi') machen wir davon Gebrauch, um Hinweise auf das
+Produkt, die Versionsnummer etc. zu geben. Die Hinweise bleiben nur kurz auf dem
+Bildschirm und verschwinden nach kurzer Zeit automatisch, oder wenn Sie irgen
+deine Taste tippen. Bei der Notation der Texte müssen Sie sich allerdings an einige
+Regeln halten (sehen Sie dazu Kapitel 5.12).
+
+Zwischen den Befehlen 'oeffne menu' und 'schliesse menu' werden nun die Oberbe­
+griffe (Kopfzeile) und die zugehörigen Verarbeitungsfunktionen eingetragen. Dabei
+müssen Sie sich genau an folgende Abfolge halten:
+Zuerst wird jeweils der Oberbegriff genannt, der in der Kopfzeile auftauchen soll.
+Direkt unter dem jeweiligen Oberbegriff werden die Menufunktionen eingetragen, die
+im zugehörigen 'Pull-Down-Menu' als Verarbeitungsfunktionen angeboten werden
+sollen. Die einzelnen Oberbegriffe mit Ihren zugehörigen Verarbeitungsfunktionen
+werden blockweise hintereinander notiert. Dadurch ergibt sich die folgende Struktur:
+
+
+oeffne menu ("Menuname");
+
+oberbegriff ("Oberbegriff 1");
+
+menufunktion ("1", "Verarbeitungsfunktion 1", "", "");
+menufunktion ("2", "Verarbeitungsfunktion 2", "", "");
+...
+
+oberbegriff ("Oberbegriff 2");
+
+menufunktion ("1", "Verarbeitungsfunktion 1", "", "");
+menufunktion ("2", "Verarbeitungsfunktion 2", "", "");
+...
+
+oberbegriff ("Oberbegriff 3");
+
+menufunktion ("1", "Verarbeitungsfunktion 1", "", "");
+menufunktion ("2", "Verarbeitungsfunktion 2", "", "");
+...
+
+... schliesse menu;
+
+
+Die Oberbegriffe werden in die Kopfzeile von links nach rechts eingetragen. Maximal
+können 10 Oberbegriffe eingetragen werden. Wählen Sie die Bezeichnungen nicht zu
+lang, denn sie müssen alle neben dem Namen des Menus in der Kopfzeile Platz
+finden (Ansonsten erhalten Sie hierauf bei der Menukartengenerierung einen Hin­
+weis, die Generierung wird abgebrochen!)!
+
+Den Befehl '#ib#oberbegriff#ie#' gibt es in zwei Versionen:
+In der hier aufgezeigten Version mit einem (TEXT-) Parameter: Hierdurch wird der
+Oberbegriff in der Kopfzeile festgelegt. In der zweiten Version hat der Befehl drei
+(TEXT-)Parameter: Durch den ersten wird - wie eben - die Kopfzeilenbezeichnung
+festgelegt. Daneben können noch zwei Prozedurnamen angegeben werden. Die
+Prozedur mit dem erstgenannten Namen wird beim Einstieg (vor dem "Ausklappen"
+des Pull-Down-Menus) ausgeführt, die Prozedur mit dem zweitgenannten Namen vor
+dem Ausstieg ("Einklappen"). Beim 'Archiv-Pull-Down-Menu' machen wir hiervon
+Gebrauch. Beim Einstieg wird dafür gesorgt, daß nur bestimmte Verarbeitungsfunk­
+tionen aktivierbar sind; beim Ausstieg wird sichergestellt, daß das Archivlaufwerk
+automatisch freigegeben wird.
+
+Unter einem Oberbegriff können Sie bis zu 15 Verarbeitungsfunktionen in ein Pull-
+Down-Menu eintragen. Die Verarbeitungsfunktionen können Sie optisch vonein ander
+trennen. Dafür steht der Befehl '#ib#trennlinie#ie#' zur Verfügung. Aber beachten Sie, er
+belegt den gleichen Platz wie eine Verarbeitungsfunktion.
+
+Zum Eintragen einer Verarbeitungsfunktion steht der Befehl '#ib#menufunktion#ie#' zur
+Verfügung. Der Befehl besitzt vier (TEXT-)Parameter. Die ersten beiden Parameter
+werden auch auf dem Bildschirm ausgegeben.
+Der erste Parameter legt fest, über welche Taste diese Verarbeitungsfunktion direkt
+zur Ausführung gebracht werden kann. Wenn eine Eintragung erfolgt, muß diese aus
+genau einem Zeichen bestehen. Innerhalb eines Pull-Down-Menus muß dieses
+Zeichen eindeutig sein, d.h. es darf nur einmal verwendet werden. Ansonsten er­
+scheint bei der Menugenerierung eine Fehlermeldung.
+Der zweite Parameter ist die Bezeichnung der Verarbeitungsfunktion, die dem Be­
+nutzer im Pull-Down-Menu angeboten wird. Wählen Sie die Bezeichnung bitte immer
+prägnant und möglichst mit dem Buchstaben beginnend, den Sie auch als ersten
+Parameter angegeben haben! Der Länge dieser Bezeichnung ist nur durch die Bild­
+schirmbreite (nicht mehr als 60 Zeichen) begrenzt, allerdings wählt gs-DIALOG die
+Breite des Pull-Down-Menus nach der längsten Bezeichnung, die im jeweiligen Pull-
+Down-Menu auftritt. Wenn die Bezeichnungen ganz unterschiedlich lang sind, sieht
+das nicht sonderlich gut aus, aber probieren Sie es ruhig einmal aus und entscheiden
+Sie selbst.
+
+Der dritte Parameter ist der Name der Prozedur, die bei der Aktivierung der Verarbei­
+tungsfunktion ausgewählt werden soll. Zum Zeitpunkt der Erstellung und des Testens
+des Menusystems braucht diese Prozedur noch nicht zu existieren. Damit ist es
+möglich, die Menuentwicklung völlig unabhängig von der Entwicklung der Verarbei­
+tungsfunktionen zu betreiben; Sie brauchen nur die späteren Namen der aufzurufen­
+den Prozeduren festzulegen! Aktivieren Sie eine solche Verarbeitungsfunktion im
+Pull-Down-Menu, die noch nicht fertiggestellt ist, so erscheint der Hinweis 'unbe­
+kanntes Kommando' - das kann aber auch geschehen, wenn die Verarbeitungsfunk­
+tion schon existiert, Sie aber bei der Eintragung einen (Schreib-)Fehler gemacht
+haben!
+
+Der vierte Parameter ist der Text, der als sogenannter Infotext ausgegeben wird wenn
+Sie auf die entsprechende Verarbeitungsfunktion positioniert haben und hier die
+<?>-Taste tippen. In unserem Beispiel haben wir keinen Infotext eingetragen.
+Versuchen Sie im Menu jetzt die <?>-Taste zu tippen, so erscheint der Hinweis
+'Leider ist zu diesem Menupunkt kein Info-Text eingetragen!'. Für die Handhabung
+des Menus sind diese Informationstexte nicht wichtig, sie dienen ausschließlich der
+Information des Benutzers.
+Die Arbeit zur Formulierung/Abfassung dieser Texte sollten Sie nicht unterschätzen.
+Sie sollten sich bei einer ernsthaften Anwendung aber diese Arbeit machen. Gerade
+der Anfänger, der mit Ihrem Menusystem arbeitet, wird Ihnen diese Arbeit danken.
+Wie Sie diese Texte komfortabel erstellen und in die Menutafel einbinden können,
+erklären wir Ihnen im nächsten Kapitel.
+
+
+#ib#4.2 Erstellung und Einbinden von Informationstexten#ie#
+
+Bisher haben wir noch keine Informationstexte zu den Menupunkten in die Menu­
+karte eingetragen. Diese Eintragung erfolgt über den vierten Parameter des Befehls
+'menufunktion'. Möchten Sie dort nur einige wenige Worte eintragen, so kann das
+direkt geschehen. Meist aber sind die Informationen zu einem Menupunkt doch
+länger, sie erstrecken sich über mehrere Zeilen.
+Zur Übergabe des Informationstextes steht aber nur ein Textparameter zur Verfügung.
+Würde man längere Texte direkt eintragen, wäre das bei der Menukartenerstellung
+sicher sehr unübersichtlich. Zum anderen benötigt gs-DIALOG den Text schon in
+aufbereiteter Form, d.h. es müssen z.B. Zeilenenden etc. kenntlich gemacht wer den.
+Damit Sie sich nun nicht alle Regeln der Texterstellung für gs-DIALOG merken
+müssen, bietet Ihnen gs-Menu-Generator eine komfortable Möglichkeit, diese
+Informationstexte zu entwickeln. Wir wollen das an einem Beispiel verdeutlichen:
+
+Erzeugen Sie sich eine Datei mit dem Namen 'Textprobe' und schreiben Sie z.B.
+folgenden Text, der ein Informationstext zum Menupunkt 'Neu erstellen' sein könnte,
+hinein:
+
+Text neu erstellen
+
+Das System erfragt zunächst den Namen für die Datei, in die
+der neue Text geschrieben werden soll. Anschließend wird eine
+leere Datei mit dem gewünschten Namen zum Beschreiben
+angeboten.
+Das Schreiben in eine solche Datei wird durch viele Hilfen
+erleichtert. Deshalb ist es ratsam, sich nach und nach mit
+den Möglichkeiten, die der Editor bietet, vertraut zu machen.
+Die Möglichkeiten sind im EUMEL-Benutzerhandbuch ausführlich
+beschrieben.
+
+Verlassen Sie nun die Datei und geben Sie in der 'gib kommando:'-Ebene folgendes
+Kommando:
+
+ #ib#textprozedur#ie# ("Textprobe", "mein erster infotext")
+
+Auf dem Bildschirm erscheint zunächst der Hinweis 'Bitte warten ...', anschließend
+werden Sie - wie aus der Textverarbeitung (lineform) bekannt - aufgefordert, entspre­
+chende Trennungen vorzunehmen.
+Das eben eingegebene Kommando bewirkt nämlich, daß der in der Datei 'Textprobe'
+enthaltene Text für gs-DIALOG so aufbereitet wird, daß er in einer Box innerhalb des
+Menus eingeblendet werden kann. Die Zeilen werden auf die entsprechende Länge
+zugeschnitten und der Text in den Zeilen wird geblockt, soweit Sie keine Absatzmarke
+(<RETURN>) gesetzt haben.
+Der so den Regeln von gs-DIALOG entsprechend aufbereitete Text wird automatisch
+in eine Textprozedur "verpackt", die den von Ihnen als zweiten Parameter übergebe­
+nen Namen erhält. Beachten Sie deshalb bei der Festlegung des Namens, daß er mit
+einem Kleinbuchstaben beginnt und weiterhin nur Kleinbuchstaben, Ziffern und
+Leerzeichen enthält!
+Diese Textprozedur finden Sie anschließend in der Datei 'Textprobe.a'. An der En­
+dung '.a' können Sie erkennen, daß in dieser Datei ein "aufbereiteter" Text enthalten
+ist.
+Wenn Sie sich, nachdem auf dem Bildschirm der Hinweis 'Textprozedur ist erstellt!'
+erschienen ist, die Datei 'Textprobe.a' ansehen, so hat diese folgenden Inhalt:
+
+
+TEXT PROC mein erster infotext:
+" Text neu erstellen "13"" +
+" "13"" +
+" Das System erfragt zunächst den Namen für die Datei, in die der "13""+
+" neue Text geschrieben werden soll. Anschließend wird eine leere "13""+
+" Datei mit dem gewünschten Namen zum Beschreiben angeboten. "13""+
+" Das Schreiben in eine solche Datei wird durch viele Hilfen er-"13""+
+" leichtert. Deshalb ist es ratsam, sich nach und nach mit den Mög-"13""+
+" lichkeiten, die der Editor bietet, vertraut zu machen. "13"" +
+" Die Möglichkeiten sind im EUMEL-Benutzerhandbuch ausführlich be-"13""+
+" schrieben. "
+END PROC mein erster infotext;
+
+
+Kopieren Sie nun den Inhalt der Datei 'Textprobe.a' in die Datei, in die Sie das Pro­
+gramm zur Generierung Ihrer Menukarte geschrieben haben und ergänzen Sie die
+Ein tragung beim ersten Menupunkt in folgender Weise:
+
+
+TEXT PROC mein erster infotext:
+" Text neu erstellen "13"" +
+" "13"" +
+" Das System erfragt zunächst den Namen für die Datei, in die der"13""+
+" neue Text geschrieben werden soll. Anschließend wird eine leere"13""+
+" Datei mit dem gewünschten Namen zum Beschreiben angeboten. "13""+
+" Das Schreiben in eine solche Datei wird durch viele Hilfen er-"13""+
+" leichtert. Deshalb ist es ratsam, sich nach und nach mit den Mög-"13""+
+" lichkeiten, die der Editor bietet, vertraut zu machen. "13""+
+" Die Möglichkeiten sind im EUMEL-Benutzerhandbuch ausführlich be-"13""+
+" schrieben. "
+END PROC mein erster infotext;
+
+oeffne menukarte ("Kleine Textverarbeitung");
+oeffne menu ("SCRIPT");
+
+oberbegriff ("Bearbeiten");
+
+menufunktion ("n", "Neu erstellen", "neue datei editieren",
+ mein erster infotext);
+menufunktion ("a", "Ansehen/Ändern","alte datei editieren", "");
+trennlinie;
+menufunktion ("v", "Verzeichnis", "verzeichnis ausgeben", "");
+trennlinie;
+menufunktion ("z", "Zeilenformatierung", "zeilen formatieren", "");
+menufunktion ("s", "Seitenformatierung", "seiten formatieren", "");
+
+schliesse menu;
+schliesse menukarte;
+
+
+Starten Sie erneut das Programm mit 'run' und erstellen Sie dadurch eine neue
+Menukarte. Installieren Sie anschließend die neue Menukarte mit dem Kommando
+'test installation ("gs-MENUKARTE:Kleine Textverarbeitung")' und bringen Sie das
+Menu mit dem Kommando 'handle menu ("SCRIPT")' zur Ausführung. Wenn Sie jetzt
+auf dem Menu punkt 'n Neu erstellen' die <?>-Taste tippen, erscheint der von
+Ihnen eingegebene Infotext in einer Box innerhalb des Menus. Die Größe der Box
+wird automatisch durch den Text bestimmt. Die Box ist maximal 65 Zeichen breit
+und 14 Zeilen hoch.
+
+Nachdem Sie nun in der Lage sind, solche Informationstexte zu erstellen und sie in
+die Menukarte einzubinden, möchten wir Ihnen noch einige Möglichkeiten der
+"Kosmetik solcher Informationstexte" aufzeigen.
+Häufig möchte man die Überschrift eines solchen Informationstextes zentriert über
+dem Text dargestellt haben. Das läßt sich auch hier einfach bewerkstelligen: Schrei­
+ben Sie dazu als erstes Zeichen der Zeile, die zentriert werden soll, das Zeichen '%'
+und schließen Sie die Zeile mit einer Absatzmarke (<RETURN>) ab.
+Möchten Sie innerhalb des Textes eine Textpassage invers dargestellt haben, so kenn­
+zeichnen Sie den Anfang der Inversdarstellung durch das Zeichen '$' und das Ende
+der Inversdarstellung durch das Zeichen '&'. Der Text wird anschließend entspre­
+chend aufbereitet. Allerdings sollte die Textpassage nicht über Zeilengrenzen hinaus­
+gehen!
+Möchten Sie in unserem Beispiel die Überschrift zentriert und invers dargestellt
+haben, so ersetzen Sie die erste Zeile der Datei 'Textprobe' durch die Zeile: %$Text
+neu erstellen&. Wenn Sie anschließend den gesamten oben beschriebenen Vorgang
+wiederholen, erscheint die Überschift zentriert und invers dargestellt innerhalb der
+Box im Menu.
+
+
+#ib#4.3 Auslagerung von anwendungsbezogenen Texten in die
+Menukarte#ie#
+
+Wie schon in Kapitel 3.2 erwähnt, kann der Anwendungsprogrammierer bis zu 2000
+Texte aus seinen Programmen in die Menukarte auslagern, um so den Umfang an
+Paketdaten geringer zu halten, allerdings darf die Gesamtkapazität einer Menukarte
+(eines Datenraumes) dabei nicht überschritten werden.
+
+Die Texte müssen in einer Datei zeilenweise notiert sein. Sie müssen (wie TEXT-Deno­
+ter) in Anführungsstriche eingefaßt sein, allerdings dürfen die Texte länger als
+(normale) TEXT-Denoter (255 Zeichen) sein. Innerhalb der Textzeile dürfen auch die
+Ausgabecodes "4", "5", "7", "10", "13", "14", und "15" verwendet werden. Innerhalb
+der Textzeile darzustellende Anführungszeichen unterliegen den gleichen Besonder­
+heiten wie sonst auch bei TEXT-Denotern.
+Machen wir ein Beispiel! Schreiben Sie in eine Datei mit Namen 'Neue Texte' die
+folgenden Zeilen:
+
+"Dieses ist der erste eingetragene Text!"
+"Hier ist eine "15"Markierung"14" im Text!"
+"Dieses ist die letzte Zeile!"
+
+Um diese Texte in die Menukarte einzubinden, starten Sie jetzt noch einmal Ihr
+Generierungprogramm für die Menukarte. Auf die Frage 'Sollen auch Anwendungstex­
+te in die Menukarte aufgenommen werden (j/n) ?' antworten Sie jetzt allerdings mit
+j(a). Daraufhin werden Ihnen die in Ihrer Task vorhandenen Dateien zur Auswahl
+angeboten. Kreuzen Sie die Datei 'Neue Texte' an, in der ja die eben genannten Texte
+eingetragen sind.
+Bei der Menukartengenerierung werden die Texte aus der Datei in die Menukarte
+eingebunden. Sollten Sie bei Notierung der Texte in der Datei formale Fehler gemacht
+haben, so werden Sie darauf hingewiesen.
+Um nun auf die eingelagerten Texte zurückgreifen zu können, muß erst einmal die
+neue Menukarte angekoppelt werden. Wie das geht, wissen Sie ja schon ('testin stalla­
+tion').
+Mit dem Befehl '#ib#anwendungstext#ie# (INT CONST zeilennummer)' (1 <= zeilen­
+nummer <= 2000) wird Ihnen nun der Text, der in der angegebenen Zeile steht,
+geliefert. Probieren Sie es doch gleich an Ihrer Menukarte aus: 'put (anwendungs­
+text (1))', 'put (anwendungstext (2))' usw.. Die eingelagerten Texte müßten jetzt auf
+dem Bildschirm erscheinen. Geben Sie eine Zeilennummer an, die nicht belegt ist, so
+wird der Text 'Kein Text vorhanden!' geliefert.
+
+Es können natürlich auch Texte abgelegt werden, die von gs-DIALOG aus aufgegrif­
+fen werden. Zur Konvertierung von Informationstexten steht die Prozedur '#ib#text zeile#ie#
+(TEXT CONST dateiname)' zur Verfügung. Diese Prozedur arbeitet genauso wie die
+Prozedur 'textprozedur', nur wird in der Ausgabedatei ('dateiname.a') der formatierte
+Text nicht als Textprozedur, sondern als einzeiliger Text geliefert. Sie können aber
+auch für gs-DIALOG Texte "von Hand" gestalten. Dazu müssen Sie sich an die
+Regeln für die Texte für gs-DIALOG halten, die in Kapitel 5.12 erläutert sind.
+
+
diff --git a/doc/menugenerator/menu-generator handbuch.5 b/doc/menugenerator/menu-generator handbuch.5
new file mode 100644
index 0000000..c002f1a
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.5
@@ -0,0 +1,975 @@
+#block##pageblock#
+#pagenr("%",1)##setcount(1)##count per page#
+#headeven#
+gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#right#gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+5 - % #right#ERGOS
+#end#
+#bottomodd#
+#center#____________________________________________________________
+ERGOS #right# 5 - %
+#end#
+#ib#5  Dialoge innerhalb des Menus#ie#
+
+
+In Kapitel 4 haben Sie erfahren, wie Sie eine eigene Menukarte entwickeln können;
+sicher haben Sie das schon ausprobiert und sich Ihr selbstgestaltetes Menu auf dem
+Bildschirm angesehen. Bislang erscheint aber noch der Hinweis 'unbekanntes Kom­
+mando', wenn Sie eine Menufunktion aktivieren - denn die Prozeduren, die Sie bei
+der Aktivierung der Menufunktion aufrufen, sind ja noch nicht fertiggestellt!
+Bei vielen Menufunktionen ist es notwendig, mit dem Benutzer noch einen Dialog zu
+führen: z.B. muß ein Dateiname erfragt, eine Information ausgegeben und bestätigt,
+eine Auswahl oder eine Entscheidung getroffen werden. In diesem Kapitel sollen
+Ihnen nun die Möglichkeiten vorgestellt werden, die Ihnen zur Verfügung stehen, um
+einen solchen Dialog mit dem Benutzer zu führen. Dieser Dialog wird innerhalb des
+Menus geführt. Alle Prozeduren, die sich auf diesen Menu-Dialog beziehen, enthalten
+deshalb den Wortbestandteil 'menu'.
+
+Hier noch einige Tips! Damit Sie Ihre Menu-Dialoge testen können, empfiehlt
+sich folgendes Vorgehen: Sie erstellen zuerst Ihre Menukarte und tragen schon die
+Namen für die jeweils aufzurufenden Prozeduren ein - wie wir es in Kapitel 4 ge­
+macht haben. Mit 'testinstallation' installieren Sie dann in Ihrer Task die neue Menu­
+karte.
+Nun schreiben Sie Ihre Prozeduren, die Sie unter das Menu legen wollen. Ist eine
+Prozedur "testreif", so müssen Sie sie zunächst insertieren, denn das Menusystem gs-
+DIALOG kann nur auf insertierte Prozeduren zugreifen. Anschließend rufen Sie das
+Menu (z.B. 'SCRIPT') aus der Menukarte mit dem Befehl 'handle menu ("SCRIPT")'
+(Hier ist der jeweilige Menuname einzusetzen!) auf. Wenn Sie den entsprechenden
+Menupunkt aktivieren, müßte Ihr Programm ablaufen.
+Es ist günstig, eine eigene Task zum Testen der Prozeduren anzulegen, damit diese
+hin und wieder gelöscht werden kann.
+
+
+#ib#5.1 Eingabe eines Textes/Namens#ie# ('#ib#menuanswer#ie#')
+
+Wenn der Benutzer in unserem Beispiel die Menufunktion 'Neu erstellen' aktiviert
+hat, muß der Name der Datei erfragt werden, die neu erstellt werden soll. Dafür steht
+die Prozedur 'menuanswer' zur Verfügung. Die in die Menukarte eingetragene Proze­
+dur 'neue datei editieren' (Siehe Kapitel 4.1) könnte dann folgendermaßen aussehen:
+
+
+PROC neue datei editieren:
+ TEXT VAR dateiname := menuanswer ("Bitte den gewünschten Dateinamen:",
+ "", 5);
+ IF dateiname <> "" AND NOT exists (dateiname)
+ THEN command dialogue (FALSE); #ib#cursor on#ie#;
+ edit (dateiname);
+ #ib#cursor off#ie#; command dialogue (TRUE);
+ regenerate menuscreen (* sehen Sie dazu Kapitel 5.10 *)
+ FI
+END PROC neue datei editieren;
+
+
+Schauen wir uns zuerst die Prozedur 'menuanswer' an. Die Prozedur hat drei Para­
+meter. Mit dem ersten Parameter legen Sie den Text fest, der innerhalb der Box
+ausgegeben wird, die auf dem Bildschirm erscheint. Der Text dient ausschließlich der
+Information des Anwenders.
+Mit dem zweiten Parameter können Sie dem Benutzer einen Vorschlag für die Einga­
+be machen, der zum Editieren ausgegeben wird. Da eine solche Vorgabe aber in die­
+ser Situation sinnlos wäre, verzichten wir darauf ("").
+
+Die auf dem Bildschirm erscheinende Box hat folgendes Aussehen:
+
+ +-------------------------------------+
+ I Bitte den gewünschten Dateinamen: I
+ I I
+ I I
+ I Eingabe: I
+ +-------------------------------------+
+
+
+Die Boxbreite und -höhe wird vom System automatisch anhand des von Ihnen als
+ersten Parameter übergebenen Textes festgelegt. Sie haben noch verschiedene Mög­
+lichkeiten, diesen Text zu gestalten (mehrere Zeilen, Inversdarstellung etc.) - auf
+diese Möglichkeiten gehen wir in Kapitel 5.13 detailliert ein.
+In unserem Beispiel erscheint die Box in der Mitte des Menubildschirms. Diese
+Festlegung treffen wir durch die Angabe der Position '5' als dritten Parameter. Sie
+können hier zwischen 5 verschiedenen Positionen wählen: 1 - oben links, 2 - oben
+rechts, 3 - unten links, 4 - unten rechts, 5 - zentral im Menubildschirm - mehr dazu
+in Kapitel 5.12.
+
+Mit dem Erscheinen der obigen Box auf dem Bildschirm ändert sich automatisch
+auch die Fußzeile im Menu, über die der Benutzer Informationen zur Bedienung
+erhält. Hier erscheint der Hinweis: 'Fertig: <RETURN>  Abbruch: <ESC><h>'.
+Um diese Hinweise brauchen Sie sich aber nicht zu kümmern , da sie alle automa­
+tisch gesetzt werden.
+Die Prozedur 'menuanswer' hat noch folgende Besonderheit: Es ist nicht möglich,
+den Namen 'break' einzugeben! Diese Eingabe wird automatisch abgefangen. Es hat
+sich gezeigt, daß Anwender manchmal versuchen, über <ESC><q> die Eingabe
+zu verlassen. In diesem Falle entstünde hier eine Datei mit Namen 'break' - was aber
+nicht sinnvoll wäre.
+Nach der Eingabe liefert die Prozedur 'menuanswer' als Wert den vom Benutzer
+eingegebenen Text - dabei sind führende und folgende Leerzeichen schon abgeschnit­
+ten ('compress'). Wurde die Prozedur mit <ESC><h> verlassen, so wird niltext
+geliefert.
+
+Wird in obiger Prozedur die Eingabe mit <ESC><h> abgebrochen oder existiert
+bereits eine Datei mit dem eingegebenen Namen, so verschwindet die Box, und der
+Menubildschirm wird automatisch in den alten Zustand gebracht.
+Wenn schon eine Datei mit dem Namen existiert, dann wäre es sinnvoll, den Benutzer
+darauf aufmerksam zu machen. Wie ein solcher Hinweis in das Menu eingeblendet
+werden kann, erklären wir im Kapitel 5.2.
+
+gs-DIALOG ist so geschrieben, daß der Cursor möglichst wenig störend wirkt. Aus
+diesem Grunde wird der Cursor immer an einer Stelle "geparkt". Sofern Ihr System es
+zuläßt und eine entsprechende Anpassung vorliegt, wird der Cursor ganz ausgeschal­
+tet. Denken Sie bitte daran, auch wenn er auf Ihrem Bildschirm ständig sichtbar ist!
+Wenn also jetzt eine Eingabe erfolgen soll, ist es notwendig, den Cursor anzuschalten.
+Wenn Sie wieder in das Menu zurückkehren, sollte der Cursor wieder ausgeschal­
+tet werden, damit er dort nicht stört.
+Wenn Sie die Prozedur 'edit' mit einem neuen Namen als Parameter aufrufen, erfragt
+das System, ob die Datei neu eingerichtet werden soll. Diese Anfrage muß hier unter­
+drückt werden, damit nicht irgendwelche Texte in den Menubildschirm geschrieben
+werden. Das Unterdrücken der Abfrage erreichen Sie durch Ausschalten des Kom­
+mandodialoges. Nach Einrichten der Datei muß der Kommandodialog aber wieder
+eingeschaltet werden, da gs-DIALOG das Eingeschaltetsein für eine fehlerfreie Funk­
+tion voraussetzt!
+
+Mit dem Befehl '#ib#regenerate menuscreen#ie#' (sehen Sie dazu auch Kapitel 5.10) wird der
+aktuelle Menubildschirm erneut vollständig auf den Bildschirm geschrieben (repro­
+duziert). Das ist notwendig, weil die Prozedur 'edit' den Bildschirm benutzt hat.
+Durch diesen Befehl wird der Menubildschirm exakt in der Form hergestellt, wie er
+zuletzt ausgesehen hat. Auch wenn Sie geschachtelte Menubildschirme haben, wer­
+den diese durch den einen Befehl reproduziert. So können Sie in Ihren Verarbei­
+tungsfunktionen mit dem Bildschirm "machen was Sie wollen" - Sie kehren mit dem
+letztgenannten Befehl immer wieder so in das Menu zurück, wie Sie es verlassen
+haben.
+
+
+#ib#5.2 Ausgabe einer Information#ie# ('#ib#menuinfo#ie#')
+
+In der Prozedur 'neue datei editieren' (Kapitel 5.1) wäre es sinnvoll, den Benutzer zu
+informieren, wenn bereits eine Datei mit dem eingegebenen Namen existiert. Hierfür
+steht die Prozedur 'menuinfo' zur Verfügung.
+
+Beispiel:
+
+menuinfo (" Eine Datei mit dem Namen "13" existiert schon!");
+
+Dadurch wird folgende Box ins Menu geschrieben:
+
+ +----------------------------+
+ I I
+ I Eine Datei mit dem Namen I
+ I existiert schon I
+ I I
+ +----------------------------+
+
+Die Box erscheint in der Mitte des Menus (Position 5); in der Fußzeile wird der Hin­
+weis ausgegeben 'Zum Weitermachen bitte irgendeine Taste tippen!'. Dann wartet das
+System so lange, bis eine Taste gedrückt wird. Anschließend wird der aktuelle Menu­
+schirm wiederhergestellt.
+Die Prozedur 'menuinfo' gibt es noch in zwei weiteren Versionen, nämlich mit zwei
+bzw. drei Parametern. Im ersten Fall kann über den zweiten Parameter noch die
+Position (1, 2, 3, 4, 5) innerhalb des Menubildschirmes festgelegt werden (sehen Sie
+dazu Kapitel 5.12). Mit dem dritten Parameter kann ggf. noch die Wartezeit festgelegt
+werden, die das System maximal verstreichen läßt, bevor es von sich aus das Pro­
+gramm fortsetzt.
+
+'menuinfo (" Eine Datei mit dem Namen "13" existiert schon!", 3, 40)'
+
+gibt die oben gezeigte Box aus, aber links unten in der Ecke des Menubildschirms
+(Position 3). Das System wartet (maximal) 4 Sekunden (40 Zehntel) und setzt dann -
+auch ohne Tastendruck - das Programm fort. Diese Prozedur mit gesondert angege­
+bener Wartezeit verwendet man dann, wenn man nicht unbedingt die Kenntnisnahme
+der Information durch den Benutzer bestätigt haben möchte.
+
+
+#ib#5.3 Auswahl eines Namen durch Ankreuzen#ie# ('#ib#menuone#ie#')
+
+Während bei der Neuerstellung einer Datei ein Name neu erfragt werden muß, kann
+man beim Menupunkt 'Ansehen/Ändern' auf schon vorhandene Dateien zugreifen.
+Sie können dem Benutzer z.B. alle Dateien in der Task zur Auswahl anbieten. Sobald
+der Benutzer einen Namen angekreuzt hat, soll die entsprechende Datei geöffnet wer­
+den. Dafür steht der Befehl 'menuone' zur Verfügung:
+
+
+PROC alte datei editieren:
+ TEXT CONST kopf :: "Textdatei ansehen/ändern",
+ hinweis :: "Bitte gewünschte Datei ankreuzen";
+ TEXT VAR dateiname := menuone (ALL myself, kopf, hinweis, FALSE);
+ IF dateiname <> ""
+ THEN #ib#cursor on#ie#;
+ edit (dateiname);
+ #ib#cursor off#ie#;
+ FI;
+ regenerate menuscreen
+END PROC alte datei editieren;
+
+
+Die Prozedur 'menuone' hat 4 Parameter: Als erster Parameter ist ein Thesaurus zu
+übergeben, in dem die zur Auswahl stehenden Namen enthalten sind. Zum Thesau­
+rushandling werden noch einige zusätzliche Funktionen zur Verfügung gestellt (z.B.
+daß nur Dateien eines bestimmten Typs zur Auswahl angeboten werden können) -
+diese Funktionen werden in Kapitel 5.14 erläutert. In unserem Beispiel werden alle
+Dateien zur Auswahl angeboten, die in der Task zur Verfügung stehen.
+Die beiden Texte, die als 2. und 3. Parameter übergeben werden, erscheinen zur
+Kennzeichnung im Kopf der Auswahlliste. Der als zweiter Parameter übergebene Text
+erscheint zentriert und invers dargestellt auf dem Bildschirm, der als dritter Parame­
+ter übergebene Text nur zentriert. Es ist sinnvoll, mit dem ersten Text (2.Parame­
+ter) die zur Zeit aktivierte Menufunktion anzuzeigen, denn der Menubildschirm wird
+ja durch die Auswahlliste überschrieben. So kann sich der Benutzer besser im Menu­
+system orientieren.
+Mit dem 4. Parameter wird festgelegt, ob der Bildschirm nach der Auswahl "ge­
+reinigt", d.h. der alte Menubildschirm wiederhergestellt werden soll. Da in unserem
+Falle normalerweise im Anschluß an die Auswahl eine Datei auf dem Bildschirm
+editiert wird, verzichten wir auf die "automatische Regenerierung" des Menubild­
+schirms. Dieses besorgen wir nach dem Editieren durch das Kommando 'regenerate
+menuscreen' "von Hand".
+Auf das Fenster, das für die Auswahl auf dem Bildschirm angezeigt wird, können Sie
+keinen Einfluß nehmen - es wird vom System selbständig festgelegt. Dadurch können
+Sie die Auswahl, wie auch die anderen Dialogkomponenten ebenso in geschachteleten
+Menus aufrufen, ohne daß es zu Problemen kommt.
+
+
+#ib#5.4 Auswahl mehrerer Namen durch Ankreuzen#ie# ('#ib#menusome#ie#')
+
+Es ist nicht immer sinnvoll, daß der Benutzer nur einen Namen auswählen, d.h.
+ankreuzen kann. Bei der Zeilenformatierung könnte man z.B. zulassen, daß gleich
+mehrere Dateinamen angekreuzt werden können. Im Anschluß an die Auswahl sollen
+dann alle angekreuzten Dateien mit 'lineform' bearbeitet werden. Für diesen Zweck
+steht die Prozedur 'menusome' zur Verfügung. Sie hat die gleichen Parameter wie die
+in 5.3 erläuterte Prozedur 'menuone' - nur daß hier die Auswahl mehrerer Namen
+möglich ist. Verläßt der Benutzer die Auswahl durch <ESC><q>, so wird ein
+Thesaurus mit allen angekreuzten Namen geliefert; bei Verlassen mit <ESC><h>
+ein leerer Thesaurus. Beispiel:
+
+
+PROC zeilen formatieren:
+ TEXT CONST kopf :: "Textdateien zeilenweise formatieren",
+ hinweis :: "Bitte gewünschte Dateien ankreuzen";
+ THESAURUS VAR dateinamen := menusome (ALL myself, kopf, hinweis,
+ FALSE);
+ cursor on;
+ formatiere dateien;
+ cursor off;
+ regenerate menuscreen.
+
+ formatiere dateien:
+ INT VAR zaehler;
+ FOR zaehler FROM 1 UPTO highest entry (dateinamen) REP
+ IF name (dateinamen, zaehler) <> ""
+ THEN lineform (name (dateinamen, zaehler))
+ FI
+ PER
+END PROC zeilen formatieren;
+
+
+
+#ib#5.5 Eingabe eines Textes/Namens - alternativ: Auswahl
+ durch Ankreuzen#ie# ('#ib#menuanswerone#ie#','#ib#menuanswersome#ie#')
+
+Sehr häufig kommt es vor, daß der Benutzer auf die zuletzt bearbeitete Datei zurück­
+greifen will. In Kapitel 5.3 haben wir dem Benutzer bei der Menufunktion 'Anse­
+hen/Ändern' gleich alle Dateien zur Auswahl angeboten. Hier wäre es vielleicht gün­
+stiger gewesen, ihm die zuletzt bearbeitete Datei anzubieten und erst auf Wunsch die
+Liste aller Dateien zum Ankreuzen. Das läßt sich auf verschiedene Weise realisieren -
+wir werden Ihnen in diesem und in den folgenden Kapiteln verschiedene Möglich­
+keiten aufzeigen:
+
+Sie können z.B. mit der Prozedur 'menuanswerone' arbeiten. Wie Sie schon aus dem
+Namen entnehmen können, handelt es sich dabei um eine Prozedur, die eigentlich
+aus zwei Prozeduren, nämlich 'menuanswer' und 'menuone' zusammengesetzt ist.
+Stellen Sie sich vor, sie führen den Namen der zuletzt bearbeiteten Datei in Ihrem
+Programm unter der Variablen 'letzte datei'. Dann könnte die Prozedur 'alte datei
+editieren' aus Kapitel 5.3 auch folgendermaßen geschrieben werden:
+
+
+TEXT VAR letzte datei;
+...
+
+
+PROC alte datei editieren:
+ TEXT CONST hinweis letzte :: "Zuletzt bearbeitete Datei:",
+ kopf :: "Textdatei ansehen/ändern",
+ hinweis :: "Bitte gewünschte Datei ankreuzen";
+ TEXT VAR dateiname := menuanswerone (hinweis letzte,
+ letzte datei,
+ ALL myself, kopf,
+ hinweis, FALSE);
+ IF dateiname <> ""
+ THEN cursor on;
+ edit (dateiname);
+ letzte datei := dateiname;
+ cursor off;
+ FI;
+ regenerate menuscreen
+END PROC alte datei editieren;
+
+
+Insgesamt hat die Prozedur 6 Parameter: Die ersten beiden Parameter beziehen sich
+auf die Eingabe ('menuanswer'). Wie dort kann auch hier der Text festgelegt werden,
+der in der Box auf dem Bildschirm erscheint.
+Der zweite Parameter ist der Text, der dem Benutzer zum Editieren angeboten wird -
+hier der zuletzt benutzte Dateiname. Möchte der Benutzer auf die Datei mit dem an­
+gebotenen Namen zugreifen, braucht er nur mit <RETURN> zu bestätigen.
+Möchte er die Auswahl zum Ankreuzen angeboten bekommen, so braucht er nur die
+Tastenfolge <ESC><z> (für 'Zeigen') zu tippen. Auf diese Auswahl beziehen sich
+die letzten 4 Parameter, die die gleiche Bedeutung haben wie bei der Prozedur
+'menuone'. Auf die Möglichkeit, durch <ESC><z> eine Auswahl angeboten zu
+bekommen, wird in der Fußzeile des Menus hingewiesen.
+
+Aber Achtung! Sie sollten sich einer "Gefahr" bei diesem Vorgehen bewußt sein. Der
+Benutzer hat natürlich so die Möglichkeit, auch einen anderen Namen als den vorge­
+schlagenen anzugeben - einen Namen, der noch nicht in der Dateiliste enthalten ist.
+In einem solchen Falle würde Ihnen bei obiger Prozedur der Menubildschirm "ka­
+puttgeschrieben", denn das System fragt (bei eingeschaltetem Kommandodialog) an,
+ob eine Datei mit dem Namen eingerichtet werden soll. Für diesen Fall sollten Sie also
+unbedingt eine Vorsorge treffen (z.B. indem Sie den Benutzer darauf hinweisen, daß
+der eingegebene Name nicht akzeptiert wird)!
+
+Sie vermuten sicher schon ganz richtig, daß es entsprechend auch die Prozedur
+'menuanswersome' gibt, die zunächst einen Dateinamen erfragt und auf Wunsch
+eine Auswahl anbietet, in der mehrere Dateinamen angekreuzt werden können. Die
+Prozedur hat ebenfalls 6 Parameter, die identisch zur Prozedur 'menuanswerone'
+sind. Allerdings liefert die Prozedur 'menuanswersome' in jedem Fall einen Thesau­
+rus; wurde die Auswahl mit <ESC><h> abgebrochen, so liefert sie einen leeren
+Thesaurus.
+
+
+#ib# 5.6 Die Ja/Nein - Entscheidung#ie# ('#ib#menuyes#ie#','#ib#menuno#ie#')
+
+In Kapitel 5.5 trat das Problem auf, daß der Benutzer einen "unzulässigen" Namen
+eingeben konnte. Dieses Problem können wir umgehen: Wir fragen den Benutzer ein­
+fach, ob er mit der zuletzt bearbeiteten Datei arbeiten will und lassen Ihm nur die
+Chance, mit 'Ja' oder 'Nein' zu antworten. Im ersten Fall bieten wir ihm eben diese
+Datei an - ansonsten die Auswahl zum Ankreuzen.
+
+Hierfür stehen die Prozeduren 'menuyes' und 'menuno' zur Verfügung, die von Ihrer
+Funktion her den Ihnen bekannten Prozeduren 'yes' und 'no' gleichen. Die beiden
+Menu-Prozeduren haben jeweils zwei Parameter:
+
+
+TEXT VAR letzte datei;
+...
+
+PROC alte datei editieren:
+ TEXT CONST kopf :: "Textdatei ansehen/ändern",
+ hinweis :: "Bitte gewünschte Datei ankreuzen";
+ TEXT VAR dateiname;
+ IF menuyes (" Wollen Sie mit der Datei "13"" +
+ " '" +letzte datei+ "'"13" arbeiten", 5)
+ THEN editiere letzte datei
+ ELSE dateiname := menuone (ALL myself, kopf, hinweis, FALSE);
+ editiere ausgewaehlte datei
+ FI;
+ regenerate menuscreen.
+
+ editiere letzte datei:
+ cursor on; edit (letzte datei); cursor off.
+
+ editiere ausgewaehlte datei:
+ IF dateiname <> ""
+ THEN cursor on; edit (dateiname); cursor off;
+ letzte datei := dateiname
+ FI
+END PROC alte datei editieren;
+
+
+Über den zweiten Parameter legen Sie die Position auf dem Bildschirm innerhalb des
+Menus fest (1, 2, 3, 4, 5; sehen Sie auch Kapitel 5.12). Der erste Parameter ist ein
+Text, welcher der gs-DIALOG-Syntax gehorchen muß (die Codes "13" bewirken
+einen Zeilenvorschub; sehen Sie auch Kapitel 5.13). Er wird in einer Box auf den
+Bildschirm geschrieben und durch 'Ja  Nein' ergänzt:
+
+
+ +-----------------------------+
+ I I
+ I Wollen Sie mit der Datei I
+ I 'Dateiname' I
+ I arbeiten? I
+ I I
+ I Ja    Nein I
+ I I
+ +-----------------------------+
+
+Für 'Dateiname' ist auf Ihrem Bildschirm dann natürlich der aktuelle Inhalt von
+'letzte datei' eingetragen.
+Die Prozedur 'menuyes' liefert TRUE, wenn mit 'Ja' geantwortet wurde und FALSE,
+wenn mit 'Nein' geantwortet wurde. Die Prozedur 'menuno' wirkt wie 'NOT menuyes'.
+Nach Eingabe von 'Ja', 'Nein' (durch Tippen der Anfangsbuchstaben oder Positionie­
+rung auf die Antwort und anschließendem <RETURN>) wird der Menubildschirm
+automatisch regeneriert. Auch die entsprechenden Hinweise in der Fußzeile werden
+natürlich automatisch gesetzt.
+
+
+#ib#5.7 Die Alternativentscheidung#ie# ('#ib#menualternative#ie#')
+
+Im letzten Kapitel haben wir Ihnen die Prozeduren 'menuyes' und 'menuno' in Ihrer
+Wirkungsweise erläutert. Eigentlich sind die beiden Prozeduren nur ein (häufig
+benötigter) Spezialfall der Prozedur 'menualternative'. Die Funktionsweise der Proze­
+dur 'menualternative' dürfte Ihnen schon aus dem 'Archivmenu' bekannt sein: Wenn
+Sie eine neue Zieltask einstellen, werden Ihnen nämlich vier Alternativen zur Auswahl
+angeboten (Archiv, Vatertask, PUBLIC, Sonstige Task).
+Auf unsere Textverarbeitung bezogen könnten wir z.B. vor der Zeilenformatierung
+(lineform) über die Alternativentscheidung den gewünschten Schrifttyp abfragen. Wir
+wollen dem Benutzer in diesem Beispiel fünf Schrifttypen (schmal, elite, pica, letter,
+groß) zur Auswahl anbieten:
+
+
+
+TEXT VAR schrifttyp;
+...
+
+PROC schrifttyp waehlen:
+ TEXT CONST info :: " Auswahl der Schrifttypen: "13""13""
+ + " s ... schmal (17 Zeichen pro Zoll) "13""
+ + " e ... elite (12 Zeichen pro Zoll) "13""
+ + " p ... pica (10 Zeichen pro Zoll) "13""
+ + " l ... letter (Proportionalschrift) "13""
+ + " g ... groß ( 5 Zeichen pro Zoll) ",
+
+ liste :: "schmal"13"elite"13"pica"13"letter"13"groß",
+ tasten :: "seplgSEPLG";
+
+ INT VAR auswahl := menualternative (info, liste, tasten, 5, TRUE);
+ SELECT auswahl OF
+ CASE 1, 101, 106: schrifttyp := "17"
+ CASE 2, 102, 107: schrifttyp := "12"
+ CASE 3, 103, 108: schrifttyp := "10"
+ CASE 4, 104, 109: schrifttyp := "prop"
+ CASE 5, 105, 110: schrifttyp := "5"
+ OTHERWISE (* behalte alten Schrifttyp bei *)
+ END SELECT
+END PROC schrifttyp waehlen;
+
+
+Hätten wir diese Prozedur in unsere Prozedur 'zeilen formatieren' eingebunden, so
+zeigte sich bei Aktivierung folgende Einblendung in den Menubildschirm:
+
+
+
+ +---------------------------------------+
+ I I
+ I Auswahl der Schrifttypen: I
+ I I
+ I s ... schmal (17 Zeichen pro Zoll) I
+ I e ... elite (12 Zeichen pro Zoll) I
+ I p ... pica (10 Zeichen pro Zoll) I
+ I l ... letter (Proportionalschrift) I
+ I g ... groß ( 5 Zeichen pro Zoll) I
+ I I
+ I schmal elite pica letter groß I
+ I I
+ +---------------------------------------+
+
+Die Prozedur 'menualternative' besitzt insgesamt 5 Parameter. Wie Ihnen schon von
+von anderen Prozeduren bekannt ist, wird mit dem vorletzten (4.) Parameter die
+Position innerhalb des Menubildschirms bestimmt - hier also die Plazierung in die
+Mitte des Menubildschirms.
+Mit dem 5. Parameter können Sie noch festlegen, ob der Benutzer die Möglichkeit
+haben soll, die Alternativauswahl mit <ESC><h> abzubrechen (bei TRUE, wie im
+Beispiel) oder eben nicht.
+
+Mit dem 1. Parameter wird der Informationstext festgelegt, der auf dem Bildschirm
+innerhalb der Box erscheinen soll. Für die Funktion der Alternativauswahl ist die­
+ser Inhalt völlig belanglos - er dient ausschließlich der Information des Benutzers.
+Der Text kann - wie hier - z.B. durch eine Einteilung in Zeilen gestaltet werden
+(durch den Code "13").
+Der Text in den Zeilen sollte nicht zu breit sein, da er noch in eine Box innerhalb des
+Menubildschirms hineinpassen muß! Damit es auch bei geschachtelten Menus zu
+keinen Problemen kommt, sollte eine Zeile nicht breiter als 64 Zeichen sein. Aber
+keine Angst: Sie können gs-DIALOG durch zu lange Texte nicht durcheinanderbrin­
+gen - wenn Ihr Text zu breit ist, wird er rigoros abgeschnitten und einfach nicht
+angezeigt.
+
+Mit dem 2. Parameter übergeben Sie die Auswahlliste, die in der letzten Zeile der Box
+dargestellt wird. Hier dürfen insgesamt bis zu 10 Alternativen angegeben werden -
+bedenken Sie dabei aber unbedingt, daß diese Liste ebenfalls nicht zu lang werden
+darf (ebenfalls höchstens 64 Zeichen).
+Zwischen jeder von Ihnen notierten Alternative muß zur Kennung der Code "13"
+eingetragen werden - wie oben im Beispiel gezeigt. Da nachher in der Box zwischen
+den einzelnen Alternativen je drei Leerzeichen eingefügt werden, können Sie sich
+immer an der von Ihnen übergebenen Zeichenkette orientieren. Hat Ihre Auswahlliste
+nicht mehr als 64 Zeichen, dann ist sie in jedem Falle auf dem Bildschirm darstell­
+bar.
+Über diese Auswahlliste erfolgt normalerweise die Auswahl. Mit den Cursortasten links
+und rechts kann der Benutzer auf die gewünschte Alternative positionieren (auf dem
+Bildschirm invers dargestellt) und dann die <RETURN>-Taste tippen.
+Die Prozedur 'menualternative liefert dann einen Zahlenwert, nämlich die Position
+der gewählten Alternative in der als 2. Parameter übergebenen Liste (wird in unse­
+rem Beispiel die Alternative 'letter' gewählt, so liefert die Prozedur den Wert 4).
+Haben Sie den Abbruch durch <ESC><h> zugelassen (5. Parameter), so wird im
+Falle eines solchen Abbruchs der Wert '0' geliefert.
+
+Mit dem 3. Parameter können Sie noch festlegen, über welche Tasten eine Auswahl
+erfolgen soll. Wenn Sie hier niltext ("") angeben, ist eine Auswahl über die Tasten
+nicht möglich. Im Beispiel haben wir hier die Anfangsbuchstaben der im Text ge­
+nannten Schrifttypen gewählt und als Eingabe sowohl Klein- als auch Großbuchsta­
+ben gestattet. Erfolgt nun die Auswahl über das Tippen einer zugelassenen Taste,
+dann wird Ihre Position in der im 3. Parameter übergebenen Zeichenkette ermittelt
+und der Wert '100' dazuaddiert. Tippt in unserem Falle der Benutzer die Taste
+<L>, wird der Wert '109' geliefert.
+
+Es erfolgt übrigens kein Hinweis in der Fußzeile, ob eine Auswahl über das Tippen
+einer Taste möglich ist! Wenn Sie von der Möglichkeit Gebrauch machen, sollten Sie
+dieses durch die Gestaltung Ihres Informationstextes andeuten - wie wir es im Bei­
+spiel auch getan haben.
+
+
+#ib#5.8 Die Menunotiz#ie# ('#ib#write menunotice#ie#', '#ib#erasemenunotice#ie#')
+
+Innerhalb des Menus können Sie für den Benutzer auch eine Notiz ablegen. Wir
+machen z.B. bei der Archivverwaltung Gebrauch davon. Dort wird nämlich ständig
+angezeigt, mit welcher Task kommuniziert wird und - sofern es sich um einen Ar­
+chivmanager handelt - wie die (angemeldete) Diskette heißt. Wenn Sie z.B. dem
+Benutzer das aktuelle Datum im Menu anzeigen wollen, insertieren Sie die folgende
+Prozedur:
+
+
+PROC datum anzeigen:
+ write menunotice ("Datum: " + date, 4)
+END PROC datum anzeigen;
+
+
+Die Prozedur 'write menunotice' besitzt zwei Parameter. Mit dem ersten Parameter
+wird der Text übergeben, der in der Box ausgegeben werden soll. Er unterliegt eben­
+falls der gs-DIALOG-Syntax für Texte. Durch den zweiten Parameter wird wieder die
+Position innerhalb des Menus festgelegt (hier rechts unten: Position 4).
+
+Wenn Sie jetzt in Ihrer Menukarte die Prozedur 'oberbegriff  ("Bearbeiten")' in fol­
+gender Weise abändern:
+
+
+ oberbegriff ("Bearbeiten", "datum anzeigen", "erase menunotice")
+
+
+dann wird jedesmal, wenn das Pull-Down-Menu unter dem Oberbegriff 'Bearbeiten'
+aufgefaltet wird, unten rechts (Position 4) das aktuelle Datum in einer Box ange­
+zeigt. Diese Notiz verschwindet, wenn in ein anderes Pull-Down-Menu gewechselt
+wird.
+
+Auf den ersten Eindruck scheinen die Prozeduren 'write menunotice' und 'menuinfo'
+gleich zu sein - das ist aber nicht der Fall: Bei 'menuinfo' wird der Text in einer Box
+ausgegeben und so lange gewartet, bis der Benutzer eine Taste getippt hat (oder die
+angegebene Zeit verstrichen ist). Bei 'write menunotice' wird ebenfalls ein Text in
+einer Box auf den Menubildschirm geschrieben. Diese Box bleibt aber über längere
+Zeit bestehen (auf Erscheinen und Verschwinden kann der Benutzer selbst keinen
+Einfluß nehmen!) - und zwar solange, bis die Notiz gelöscht wird (mit 'erase menu­
+notice'; in unserem Beispiel, wenn das Pull-Down-Menu gewechselt wird) oder durch
+ein neues 'write menunotice' überschrieben wird. In einem Menu kann nämlich zu
+einem Zeitpunkt nur eine Menunotiz abgelegt werden.
+Wenn der Bildschirm durch gs-DIALOG-Prozeduren überschrieben wird, wird die
+Menunotiz ebenfalls ständig mitaufgefrischt, und auch, wenn Sie den Befehl 'regene­
+rate menuscreen' oder 'refresh submenu' geben.
+
+
+#ib#5.9 Fußzeilen im Menu#ie# ('#ib#menufootnote#ie#', '#ib#oldmenufootnote#ie#')
+
+In den Fußzeilen innerhalb des Menus werden dem Benutzer Bedienhinweise ange­
+zeigt. Die Fußzeile wird aber auch dazu benutzt, den Benutzer über Prozesse zu
+informieren, die im Hintergrund ablaufen - erst recht dann, wenn Sie einige Zeit in
+Anspruch nehmen. Sie zeigen dem Benutzer an, daß er nicht "unruhig" zu werden
+braucht, sondern das System "mit sich" beschäftigt ist.
+Im allgemeinen braucht sich der Programmierer um diese Fußnoten nicht zu küm­
+mern, denn sie werden von den einzelnen Komponenten des Systems automatisch
+gesetzt. Wir können aber z.B. dem Benutzer einen Hinweis geben, wenn unter dem
+Menupunkt 'Verzeichnis' eine Liste erstellt wird. Die Prozedur könnte dann folgen­
+dermaßen notiert werden:
+
+
+PROC verzeichnis ausgeben:
+ menufootnote ("Bitte warten... Ich erstelle eine Dateiliste");
+ FILE VAR f :: sequential file (output, "Dateiliste");
+ list (f); modify (f);
+ old menufootnote;
+ entferne eigenen namen;
+ zeige liste an;
+ forget ("Dateiliste", quiet).
+
+ entferne eigenen namen:
+ TEXT VAR zeile :: ""; INT VAR i;
+ FOR i FROM lines (f) DOWNTO 1 REP
+ to line (f, i);
+ read record (f, zeile);
+ UNTIL pos (zeile, "Dateiliste") > 0 PER;
+ delete record (f).
+
+ zeige liste an:
+ to line (f, 1);
+ menuwindowshow (f) (* Sehen Sie Kapitel 5.11.1*)
+END PROC verzeichnis ausgeben;
+
+
+Beachten Sie, daß der Text nicht länger als 64 Zeichen ist, damit er auch bei ge­
+schachtelten Menus vollständig ausgegeben werden kann. Sollte der Text dennoch zu
+lang sein, wird er vom System auf die entsprechende Länge gestutzt.
+Haben Sie mit 'menufootnote' eine eigene Fußzeile gesetzt, so können Sie die da­
+durch gelöschte Zeile durch den Befehl 'old menufootnote' wieder hinschreiben.
+Ansonsten wird Ihre Fußzeile von der nächsten automatisch (d.h. vom System) ge­
+setzten Fußnote überschrieben. In dem obigen Beispiel hätten Sie also gut auf den
+Befehl 'old menufootnote' verzichten können.
+
+Durch 'old menufootnote' wird die letzte Fußnote, die automatisch vom System ge­
+setzt wurde, reproduziert. Der in der obigen Prozedur verwendete Befehl 'menuwin­
+dowshow' ist bisher noch nicht erläutert. Sehen Sie dazu bitte das Kapitel 5.11.1.
+
+
+#ib#5.10 Wiederherstellung des Menubildschirms#ie# ('#ib#regenerate
+ menuscreen#ie#','#ib#refresh submenu#ie#')
+
+Der Befehl 'regenerate menuscreen' ist Ihnen schon aus diversen Beispielprogram­
+men dieses Handbuches bekannt. Ist der Menubildschirm "kaputtgeschrieben" oder
+der Bildschirm für andere Zwecke benutzt worden, so läßt sich durch diesen Befehl
+der Menubildschirm in seinem letzten Zustand reproduzieren (auch bei geschachtel­
+ten Menus!). Durch den Befehl wird der Bildschirm gelöscht und komplett neu
+aufgebaut.
+
+Ein vollständiger Bildschirmaufbau ist aber gar nicht immer nötig. Wenn Sie sicher
+sind, daß durch Ihre Operationen nur der Bereich zwischen den beiden durchgezo­
+genen Linien, die die Kopf- und Fußzeile abtrennen, betroffen ist, brauchen Sie nur
+den Befehl 'refresh submenu' zu geben. Hierdurch wird das aktuelle Pull-Down-
+Menu neu aufgebaut und - sofern gesetzt - die Menunotiz. Wenn möglich, ist er dem
+Befehl 'regenerate menuscreen vorzuziehen, da hierfür weniger Zeit benötigt wird
+und weniger "Unruhe" auf dem Bildschirm entsteht.
+Sorgen Sie aber unbedingt dafür, daß der von Ihnen benutzte Bildschirmbereich
+zuvor "gereinigt" wird, denn das besorgt 'refresh subnmenu' nicht!
+
+
+#ib#5.11 Arbeiten im Menufenster#ie#
+
+Neben den vorab aufgezeigten Möglichkeiten können Sie innerhalb des Menus auch
+noch ein Fenster öffnen. Innerhalb dieses Fensters stehen Ihnen alle Möglichkei­
+ten zur Verfügung, die Sie auch sonst zum Beschreiben des gesamten Bildschirms
+haben - und noch einiges mehr.
+Wir machen z.B. intensiv beim Archivhandling Gebrauch davon. So werden Ihnen
+Verzeichnisse angezeigt, Sie können verfolgen, wie die einzelnen Dateien vom Archiv
+geholt werden oder dorthin geschrieben werden und einiges mehr. In diesem Kapitel
+wollen wir Ihnen die Möglichkeiten aufzeigen, die Sie innerhalb des Menufensters
+haben.
+
+Auf die Größe des Menufensters haben Sie keinen Einfluß, sie wird vom System ge­
+setzt ("normales" Menu: 77 Zeichen breit und 20 Zeichen hoch; geschachteltes
+Menu: 71 Zeichen breit und 16 Zeichen hoch). Hierdurch ist sichergestellt, daß alle
+Operationen auch in geschachtelten Menus ohne Probleme ausführbar sind. Alle
+Prozeduren, die sich auf Aktionen im Menufenster beziehen, enthalten die Silbe
+'menuwindow'.
+Sie können mit den hier beschriebenen Prozeduren ähnlich arbeiten, wie mit den
+entsprechenden Prozeduren ohne den Wortbestandteil 'menuwindow' auf dem
+ganzen Bildschirm. Allerdings gibt es einige Unterschiede, auf die Sie achten sollten!
+
+
+5.11.1 Datei anzeigen/editieren
+ ('#ib#menuwindowshow#ie#', '#ib#menuwindowedit#ie#')
+
+Von der Prozedur 'menuwindowshow (FILE VAR f)' haben wir im letzten Kapitel
+schon Gebrauch gemacht, um das Verzeichnis der Dateien in der Task innerhalb des
+Menus anzuzeigen. Die Prozedur gibt es in zwei Versionen mit je einem Parameter.
+Einmal kann, wie im vorigen Kapitel, ein FILE angegeben werden, andererseits kann
+auch der Name der anzuzeigenden Datei als Text übergeben werden ('menuwindow­
+show (TEXT CONST dateiliste)'). Durch den Befehl wird innerhalb des Menus ein
+umrandetes Fenster geöffnet, in der das angegebene File/die Datei angezeigt wird. Bei
+'menuwindowshow' kann die Datei nur eingesehen, nicht aber schreibend verändert
+werden.
+Die Prozedur 'menuwindowedit' gibt es ebenfalls in den zwei Ausprägungen. Sie
+verhält sich zur vorgenannten identisch - nur kann hier auch die Datei schreibend
+verändert werden.
+
+
+5.11.2 Menufenster öffnen/anzeigen ('#ib#show menuwindow#ie#')
+
+Wenn Sie eigene Operationen in einem Fenster im Menu ausführen lassen wollen,
+muß dieses Fenster zunächst auf dem Bildschirm angezeigt werden. Durch den
+Befehl 'show menuwindow' wird ein entsprechender Rahmen innerhalb des Menus
+ausgegeben und der Bereich innerhalb dieses Rahmens (das Fenster) gelöscht.
+Auf die Größe des Fensters innerhalb des aktuellen Menus können Sie - wie bereits
+eingangs gesagt - keinen Einfluß nehmen.
+Zu einem Zeitpunkt kann immer nur ein Menufenster geöffnet sein, da das Fenster
+schon den größtmöglichen sinnvollen Bereich des aktuellen Menus belegt. Ein er­
+neutes 'show menuwindow' hätte die gleiche Wirkung wie das nachfolgend beschrie­
+bene 'menuwindowpage' - nur wird hier zusätzlich noch der Rahmen des Fensters
+mitausgegeben.
+
+
+5.11.3 Menufenster löschen (putzen) ('#ib#menuwindowpage#ie#')
+
+Durch den Befehl 'menuwindowpage' wird das Fenster innerhalb des aktuellen
+Menus gelöscht; der Rahmen des Fensters bleibt bestehen, da er nicht mit zum ei­
+gentlichen Fenster gehört. Durch den Befehl wird der Menubildschirm nicht(!)
+rekonstruiert!
+
+
+5.11.4 Positionierungen im Menufenster
+ ('#ib#menuwindowline#ie#', '#ib#menuwindowcursor#ie#')
+
+Mit 'menuwindowline' wird, wie auch sonst auf dem Bildschirm, an den Anfang der
+nächsten Zeile positioniert. Diesen Befehl gibt es, ebenso wie den Befehl 'line' (der
+auf dem Gesamtbildschirm operiert) ohne und mit einem Parameter. Durch 'menu­
+windowline (3)' wird an den Anfang der "drittnächsten" Zeile innerhalb des Menu­
+fensters positioniert.
+
+Aber Achtung! Der Befehl 'menuwindowline' weist einen deutlichen Unterschied zum
+Ihnen bekannten Befehl 'line' auf. Wird nämlich die untere Fenstergrenze überschrit­
+ten, so rollt (scrollt) der Bildschirm nicht um die entsprechenden Zeilen nach oben,
+wie Sie es von 'line' gewohnt sind - statt dessen wird der Fensterinhalt gelöscht und
+wieder oben im Fenster zu schreiben begonnen. Es erscheint, als ob auf ein neues
+Fenster positioniert würde.
+Innerhalb des Fensters können Sie auch den Cursor positionieren, wie Sie es vom
+Bildschirm gewohnt sind - allerdings nur innerhalb der aktuell gültigen Grenzen. In
+einem Menu ist das Fenster 77 Zeichen breit und 20 Zeichen hoch; in einem ge­
+schachtelten Menu 71 Zeichen breit und 16 Zeichen hoch.
+Wird außerhalb des aktuellen Menufensters positioniert, wird das Fenster gelöscht
+und die Fensterposition (1, 1) angenommen.
+
+
+5.11.5 Informationen über die aktuelle Menu-Fenster position ('#ib#get
+menuwindowcursor#ie#', '#ib#remaining menuwindowlines#ie#')
+
+Mit der Prozedur 'get menuwindowcursor (INT VAR spalte, zeile)' kann die aktuelle
+Position des Cursors innerhalb des Menufensters erfragt werden. Die Prozedur hat
+zwei Parameter, die als 'INT VAR' deklariert sein müssen. Der erste Parameter enthält
+anschließend die aktuelle Spalte, der zweite die aktuelle Zeile.
+
+Mit der werteliefernden Prozedur 'remaining menuwindowlines' kann die Anzahl der
+noch verbleibenden Zeilen innerhalb des aktuellen Menufensters erfragt werden. Die
+Prozedur wurde deshalb zur Verfügung gestellt, weil der Fensterinhalt - im Gegensatz
+zum normalen Bildschirm - nicht gescrollt werden kann. So können Sie sich vorab
+informieren, ob der Text, der von Ihnen ausgegeben werden soll, noch Platz findet, so
+daß während der Ausgabe nicht plötzlich der Fensterinhalt gelöscht wird.
+
+
+5.11.6 Ausgabe/Eingabe innerhalb des Menufensters
+ ('#ib#menuwindowout#ie#', '#ib#menuwindowget#ie#',
+ '#ib#menuwindoweditget#ie#', '#ib#menuwindowyes#ie#',
+ '#ib#menuwindowno#ie#')
+
+Innerhalb des Menufensters können mit der Prozedur 'menuwindowout' Texte ausge­
+geben werden - die Prozedur hat einen TEXT-Parameter. Sollen INTEGER- oder REAL-
+Werte ausgegeben werden, so müssen diese Werte zuerst in Texte konvertiert werden.
+Bitte beachten Sie unbedingt, daß innerhalb des Fensters nicht gescrollt wird und
+auch kein Zeilenumbruch stattfindet! Ist ein Text länger als die verbleibende Restzei­
+le, so wird der Text bis zum Fensterende ausgegeben und die Ausgabe am Anfang der
+nächsten Zeile fortgesetzt. So ist sichergestellt, daß in keinem Falle die Fenstergren­
+zen überschritten werden.
+Sobald die letzte Position des aktuellen Menufensters beschrieben ist (unten rechts in
+der Fensterecke), wird der Fensterinhalt komplett gelöscht und die Ausgabe in der
+ersten Zeile des "neuen" Fensters fortgesetzt. Auf Zeilenumbruch und Scrolling wurde
+verzichtet, da der Realisierungsaufwand dafür zu hoch gewesen wäre.
+
+Mit der Prozedur 'menuwindowget (TEXT VAR text)' können Sie auch Texte innerhalb
+des Menufensters einlesen - INTEGER-/ REAL-Werte müssen ggf. von Hand konvertiert
+werde. Die Eingabe wird durch <RETURN> abgeschlossen. Es muß mindestens ein
+Zeichen (ungleich Leerzeichen) eingegeben werden. Von der Eingabe werden die
+führenden Leerzeichen abgeschnitten.
+Ist der einzugebende Text länger als die noch verbleibende Restzeile, so wird der Text
+in der Restzeile gescrollt. Sind in der aktuellen Zeile weniger als 7 Zeichen für die
+Eingabe vorhanden, so wird automatisch für die Eingabe an den Anfang der nächsten
+Zeile positioniert.
+
+Ab gs-DIALOG-Version 1.1 steht auch die Prozedur 'menuwindoweditget (TEXT VAR
+text)' zur Verfügung, durch die ein Text zum Editieren vorgegeben werden kann. Es
+ist allerdings darauf zu achten, daß der Text in jedem Falle initialisiert wird!
+
+Die beiden Prozeduren 'menuwindowyes' und 'menuwindowno' ähneln den Ihnen
+bekannten Prozeduren 'yes' und 'no'. Sie operieren nur auf dem Menufenster. Be­
+denken Sie aber bitte, daß, wenn bei der Ausgabe des Textes die Fenstergrenze über­
+schritten wird, der Resttext in der nächsten Zeile ausgegeben wird. Wird dabei sogar
+die untere Fenstergrenze überschritten, so wird der komplette Fensterinhalt gelöscht
+und die Ausgabe in der linken oberen Ecke des "neuen Fensters" fortgesetzt!
+
+
+5.11.7 Weiter Prozeduren ('#ib#menuwindowcenter#ie#',
+ '#ib#menuwindowstop#ie#')
+
+Es werden noch zwei weitere Prozeduren für das Menufenster zur Verfügung gestellt,
+die bei der Programmentwicklung ganz nützlich sein können.
+Mit 'menuwindowcenter (TEXT CONST text)' werden vor und hinter dem übergebe­
+nen Text so viele Leerzeichen angefügt, daß der Text zentriert in der Menufenster-Zei­
+le ausgegeben wird. Bevor Sie den Text mit 'menuwindowout' ausgeben, müssen Sie
+an den Anfang einer Zeile positionieren, denn die Anzahl der vorangestellten Blanks
+wird unter Annahme dieser Zeilenposition ermittelt! Innerhalb der Zeile werden ggf.
+vorhandene Texte überschrieben.
+
+Durch die Prozedur 'menuwindowstop' wird an den Anfang der übernächsten Zeile
+positionert und der Text 'Zum Weitermachen bitte irgendeine Taste tippen!' ausgege­
+ben. Danach wird so lange gewartet, bis eine Taste getippt wird. Mit 'menuwindow­
+stop (INT CONST zeilenzahl) kann auch noch die Anzahl der Zeilen bestimmt wer­
+den, die vorwärtspositioniert werden soll (Standard: 2 Zeilen).
+
+
+#ib#5.12 Festlegung der Boxpositionen innerhalb des Menus#ie#
+
+In vielen Fällen kann der Programmierer noch entscheiden, an welcher Position
+innerhalb des Menus die Box erscheinen soll (z. B. bei 'menuanswer', 'menuinfo',
+'menuyes', 'menuno', 'menunotice' etc.). Die Positionen sind von 1 bis 5 durchnu­
+meriert und haben folgende Bedeutung:
+
++----------------------------------------+
+I I
++----------------------------------------+
+I I
+I +-----+ +-----+ I
+I I 1 I I 2 I I
+I +-----+ +-----+ I
+I I
+I +-----+ I
+I I 5 I I
+I +-----+ I
+I I
+I +-----+ +-----+ I
+I I 3 I I 4 I I
+I +-----+ +-----+ I
+I I
++----------------------------------------+
+I I
++----------------------------------------+
+#page#
+#ib#5.13 gs-DIALOG-Syntax (Regeln zur Erstellung von Texten)#ie#
+
+Werden Texte als Parameter übergeben, die in einer Box ausgegeben werden sollen,
+so kann dieser Text durch Einfügen von Steuerzeichen noch gestaltet werden, z.B.
+kann der Programmierer so den Zeilenaufbau bestimmen.
+Das System analysiert den eingegebenen Text. Jedesmal, wenn innerhalb des Textes
+der Code "13" erscheint, wird innerhalb der Box auf den nächsten Zeilenanfang
+positioniert. So ist eine Einteilung eines Textes in Zeilen leicht möglich. Soll eine
+Leerzeile eingefügt werden, so geben Sie einfach zweimal den Code "13" ("13""13").
+Bei der Textanalyse wird die jeweilige Zeilenlänge vermerkt. Die Box wird vom System
+gerade so breit gewählt, daß die längste vorkommende "Zeile" im Text gerade noch in
+die Box paßt.
+Aber Vorsicht! Die jeweilige Box kann innerhalb des Menus nur eine Maximalgröße
+annehmen (64 Zeichen breit und 14 Zeilen hoch). Wird von einer "Zeile" diese
+Maximalgröße überschritten, so wird die Zeile abgeschnitten und nur bis zur Maxi­
+malbreite der Box ausgegeben.
+
+Ein Text für eine solche Box könnte z.B. so aussehen:
+
+
+menuinfo (" Informationstexte "13" sind meist"13" zu
+lang!")
+
+
+das ergibt folgende Ausgabe in der Box:
+
+
+ +-----------------------+
+ I I
+ I Informationstexte I
+ I sind meist I
+ I zu lang I
+ I I
+ +-----------------------+
+
+Es ist auch möglich, in solchen Texten Textpassagen invers darzustellen. Dazu wer­
+den in den Text die Codes zum Ein- ("15") und Ausschalten ("14") der Markierung
+eingefügt. Solche markierten Textpassagen dürfen aber nicht über interne Zeilen­
+grenzen (Code "13") hinausgehen. Sie müßten dann am Zeilenende aus- und am
+nächsten Zeilenanfang wiedereingeschaltet werden.
+Soll in der obigen Box das Wort 'Informationstexte' invers dargestellt werden, so wäre
+z.B. folgendes Kommando zu geben:
+
+
+menuinfo (" "15"Informationstexte"14" "13"" +
+ " sind meist"13" zu lang!")
+
+
+#ib#5.14 Thesaurushandling#ie#
+
+Neben den allgemein zur Verfügung gestellten Thesaurusoperationen stellt
+gs-DIALOG einige weitere bereit. Mit der Prozedur 'THESAURUS PROC #ib#infix namen#ie#
+(THESAURUS CONST thes, TEXT CONST infix)' werden aus allen Dateinamen des
+angegebenen Thesaurus die herausgefiltert, die den Wortbestandteil 'infix' enthalten -
+und zwar gleichgültig, an welcher Position! Die herausgefilterten Dateinamen werden
+in einem Thesaurus geliefert. Im Programmsystem 'gs-Herbert und Robbi' mach­
+en wir z.B. Gebrauch davon, wenn wir nur die Landschaften der eigenen Task zur
+Auswahl anbieten wollen:
+
+
+THESAURUS VAR thes :: infix namen (ALL myself, "Flaeche:")
+
+
+Daneben gibt es eine ähnliche Prozedur, mit der man die Dateien eines bestimmten
+Dateityps herausfiltern kann. Mit
+
+
+THESAURUS VAR thes :: infix namen (ALL myself, 1003)
+
+
+werden alle Dateien mit dem Typ '1003' (normale Textfiles) herausgefiltert. Neben
+den beiden gibt es auch noch eine Prozedur, die beide Fälle miteinander koppelt:
+
+
+THESAURUS VAR thes :: infix namen (ALL myself, "gs-MENUKARTE:", 1954)
+
+
+Mit der folgenden Prozedur:
+
+
+THESAURUS VAR thes :: #ib#ohne praefix#ie# (ALL myself, "Flaeche:")
+
+
+wird aus den Dateinamen im angegebenen Thesaurus jeweils der führende Wortbe­
+standteil entfernt. Wir machen z.B. in gs-Herbert und Robbi davon Gebrauch, um
+die Landschaften/Arbeitsfelder anbieten zu können, ohne jeweils den Wortbestandteil
+'Flaeche:' miterscheinen zu lassen.
+
+Ganz nützlich ist auch noch die folgende Informationsprozedur '#ib#not empty#ie#
+(THESAURUS CONST thes)', mit der man z.B. feststellen kann, ob eine Auswahl ohne
+Ankreuzen oder mit <ESC><h> abgebrochen wurde:
+
+
+
+PROC zeilen formatieren:
+ TEXT CONST kopf :: "Textdateien zeilenweise formatieren",
+ hinweis :: "Bitte gewünschte Dateien ankreuzen";
+ THESAURUS VAR dateinamen := menusome (ALL myself, kopf, hinweis,
+ FALSE);
+
+ IF not empty (dateinamen)
+ THEN cursor on;
+ formatiere dateien;
+ cursor off;
+ FI;
+ regenerate menuscreen.
+
+ formatiere dateien:
+ INT VAR zaehler;
+ FOR zaehler FROM 1 UPTO highest entry (dateinamen) REP
+ IF name (dateinamen, zaehler) <> ""
+ THEN lineform (name (dateinamen, zaehler))
+ FI
+ PER
+END PROC zeilen formatieren;
+
+
+
+#ib#5.15 Aktivieren und Deaktivieren von Menupunkten#ie#
+
+Daß Verarbeitungsfunktionen aktiviert und deaktiviert werden können, haben Sie
+schon in unserem Archiv-Pull-Down-Menu gesehen. Deaktivierte Menupunkte sind
+durch ein vorgestelltes '-'-Zeichen gekennzeichnet; diese Menufunktionen werden
+übersprungen, wenn Sie versuchen, darauf zu positionieren.
+
+Zur Aktivierung und Deaktivierung von Menupunkten stehen die Prozeduren '#ib#activate#ie#
+(TEXT CONST menupunktname)' und '#ib#deactivate#ie# (TEXT CONST menupunktname)'
+zur Verfügung. Zu beachten ist, daß diese Prozeduren nicht ständig aufrufbar sind -
+der jeweils angegebene 'menupunktname' muß sich nämlich auf das aktuelle Pull-
+Down-Menu beziehen! Als Menupunktname muß jeweils der Name angegeben wer­
+den, der bei der entsprechenden Menufunktion als 2. Parameter übergeben wurde.
+Ist der angegebene 'menupunktname' im aktuellen Pull-Down-Menu nicht enthalten,
+so wird die Anweisung ignoriert!
+
+Auch bei den Prozeduren' activate (INT CONST punktnummer)' und 'deactivate (INT
+CONST punktnummer)' gilt diese Einschränkung. Die beiden Prozeduren arbeiten
+schneller als die eben aufgezeigten, denn es muß im aktuellen Pull-Down-menu
+nicht mehr nach der jeweiligen Position gesucht werden. Die Positionen werden von
+oben nach unten durchgezählt. Beachten Sie aber unbedingt, daß die Trennlinien
+mitgezählt werden müssen!
+Die Prozeduren "zeigen nur dann Wirkung", wenn sie von einer Verarbeitungsfunk­
+tion des aktuell entfalteten Pull-Down-Menus aus aufgerufen werden (das geschieht
+im Archivmenu z.B. aus den beiden Menufunktionen 'Reservieren' und 'Initialisieren'
+heraus) oder wenn Sie beim Einstieg in ein Pull-Down-Menu bzw. beim Ausstieg
+daraus aufgerufen werden; d.h. aus einer Prozedur heraus, die bei 'oberbegriff' als
+2./3. Parameter in das Menukarten-Generierungsprogramm eingetragen ist. Beim
+Archiv-Pull-Down-Menu besorgt das die Prozedur 'menu archiv grundeinstellung'
+(sehen Sie dazu auch Kapitel 6.1).
+
+
diff --git a/doc/menugenerator/menu-generator handbuch.6 b/doc/menugenerator/menu-generator handbuch.6
new file mode 100644
index 0000000..a0dd3b5
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.6
@@ -0,0 +1,235 @@
+#block##pageblock#
+#pagenr("%",1)##setcount(1)##count per page#
+#headeven#
+gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#right#gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+6 - % #right#ERGOS
+#end#
+#bottomodd#
+#center#____________________________________________________________
+ERGOS #right# 6 - %
+#end#
+#ib#6  Einbinden der Datei- und Archivoperationen#ie#
+
+
+Sie haben bereits erfahren, wie Sie eine Menukarte generieren und ankoppeln kön­
+nen. Im letzten Kapitel haben wir Ihnen die Möglichkeiten aufgezeigt, innerhalb des
+Menus einen Dialog mit dem Benutzer zu führen. Sie sind somit in der Lage, Ihre
+eigenen Anwendungen unter der Benutzeroberfläche gs-DIALOG zu erstellen.
+Wie sich gezeigt hat, treten eine Reihe von Verarbeitungsfunktionen in nahezu jeder
+Anwendung auf. Im EUMEL-System benötigt man bei fast allen Anwendungspro­
+grammen auch die Möglichkeiten, Dateien auf dem Archiv zu sichern oder von dort
+zu holen; auch Umbenennen, Kopieren, Drucken, Reorganisieren ... von Dateien
+zählen sicher zu den häufig benötigten Verarbeitungsfunktionen. Wünschenswert ist
+es natürlich, daß in allen Programmen unter einer Benutzeroberfläche die "Stan­
+dard-Verarbeitungsfunktionen" in immer gleicher Weise zur Verfügung stehen!
+
+Dieser Vorteil liegt sogar nicht nur auf der Seite des Anwenders - auch der Anwen­
+dungsprogrammierer profitiert davon: Dann nämlich, wenn er diese Standard-Verar­
+beitungsfunktionen nicht immer neu schreiben muß, sondern auf vorgefertigte
+Prozeduren und natürlich auch auf die zugehörigen Informationstexte zurückgreift.
+
+Wir haben uns deshalb entschlossen, diese Standard-Verarbeitungsfunktionen zum
+Datei- und Archivhandling bereits in das Basissystem gs-DIALOG zu integrieren und
+Ihnen mit gs-Menu-Generator Dateien zur Verfügung zu stellen, in denen die
+Programme zur Einbindung dieser Prozeduren in Ihre eigenen Programmsysteme
+ebenso enthalten sind wie alle dazugehörigen Informationstexte.
+In diesem Kapitel soll nun beschrieben werden, wie Sie diese vorgefertigten Module in
+Ihre Menukarten/Programme einbinden können und was Sie dabei beachten müs­
+sen.
+
+
+#ib#6.1 Einbinden der Archivoperationen#ie#
+
+Auf der von uns gelieferten Diskette 'gs-Menu-Generator', befindet sich auch die
+Datei 'Generatordatei: Archivmenu'. Darin ist das vollständige Menukarten-Generie­
+rungs-Programm zur Generierung der Menukarte 'gs-MENUKARTE: Archiv' inclusive
+aller Informationstexte enthalten. U.a. befindet sich darin eben das folgende Pro­
+gramm:
+
+
+oeffne menukarte ("Archiv");
+oeffne menu ("ARCHIV", "", "menu archiv reservierung aufgeben");
+
+
+oberbegriff ("Dateien");
+
+menufunktion ("v", "Verzeichnis", "menu dateien verzeichnis",
+ dateiverzeichnistext);
+trennlinie;
+menufunktion ("l", "Löschen", "menu dateien loeschen",
+ dateiloeschentext);
+menufunktion ("d", "Drucken", "menu dateien drucken",
+ dateidruckentext);
+trennlinie;
+menufunktion ("k", "Kopieren", "menu dateien kopieren",
+ dateikopierentext);
+menufunktion ("u", "Umbenennen", "menu dateien umbenen­
+ nen",
+ dateiumbenennentext);
+trennlinie;
+menufunktion ("s", "Speicherplatz", "menu dateien speicherplatz",
+ dateispeicherplatztext);
+menufunktion ("a", "Aufräumen", "menu dateien aufraeumen",
+ dateiaufraeumtext);
+
+
+oberbegriff ("Archiv", "menu archiv grundeinstellung (4)",
+ "menu archiv reservierung aufgeben");
+
+menufunktion ("r", "Reservieren", "menu archiv reservieren",
+ archivreserviertext);
+menufunktion ("n", "Neue Diskette", "menu archiv neue diskette",
+ neuediskettetext);
+trennlinie;
+menufunktion ("s", "Schreiben", "menu archiv schreiben",
+ archivschreibtext);
+menufunktion ("c", "Checken", "menu archiv checken",
+ archivchecktext);
+menufunktion ("k", "Kombination", "menu archiv schreibcheck",
+ archivkombinationstext);
+menufunktion ("h", "Holen/Lesen", "menu archiv holen",
+ archivholtext);
+menufunktion ("l", "Löschen", "menu archiv loeschen",
+ archivloeschtext);
+trennlinie;
+menufunktion ("v", "Verzeichnis", "menu archiv verzeichnis",
+ archivverzeichnistext);
+menufunktion ("d", "Drucken", "menu archiv verzeichnis
+ drucken",
+ archivdruckentext);
+trennlinie;
+menufunktion ("i", "Initialisieren", "menu archivinitialisieren",
+ archivinitialisiertext);
+menufunktion ("z", "Zieltask einstellen", "menu archiv zieltask
+ einstellen",
+ archivzieltasktext);
+schliesse menu;
+schliesse menukarte;
+
+
+Wie schon oben erwähnt, sind auch alle Informationstexte in der Datei enthalten, die
+jeweils über den 4. Parameter der Prozeduren 'menufunktion' in die Menukarte
+eingebunden werden. Wir haben Sie hier nicht extra abgedruckt; Sie können ja die
+entsprechende Datei auf der Diskette einsehen!
+
+Zu dem Programm möchten wir jedoch noch einige wichtige Anmerkungen machen,
+damit Sie die entsprechenden Verarbeitungsfunktionen in Ihre Menukarte einbinden
+können.
+
+Wenden wir uns zunächst den Archivoperationen zu. gs-DIALOG stellt die folgenden
+Verarbeitungsfunktionen bereit:
+
+
+ PROC #ib#menu archiv reservieren#ie#,
+ PROC #ib#menu archiv neue diskette#ie#,
+ PROC #ib#menu archiv schreiben#ie#,
+ PROC #ib#menu archiv checken#ie#,
+ PROC #ib#menu archiv schreibcheck#ie#,
+ PROC #ib#menu archiv holen#ie#,
+ PROC #ib#menu archiv loeschen#ie#,
+ PROC #ib#menu archiv verzeichnis#ie#,
+ PROC #ib#menu archiv verzeichnis drucken#ie#,
+ PROC #ib#menu archiv initialisieren#ie#,
+ PROC #ib#menu archiv zieltask einstellen#ie#,
+
+
+Durch diese elf Prozeduren werden die entsprechenden Menufunktionen ausgeführt.
+
+Außerdem werden noch folgende Prozeduren bereitgestellt:
+
+
+ PROC #ib#menu archiv grundeinstellung#ie# (INT CONST ort)
+ PROC #ib#menu archiv reservierung aufgeben#ie#
+
+
+Diesen beiden Prozeduren sollten Sie bei der Einbindung der Archivfunktionen in
+Ihre Menukarten besondere Beachtung schenken. Wie Sie im Programm auf der Seite
+zuvor sehen, taucht die Prozedur 'menu archiv reservierung aufgeben' gleich zweimal
+auf: einmal als 3.Parameter der Prozedur 'oberbegriff' und einmal als 3.Parameter
+der Prozedur 'oeffne menu' - und das aus folgendem Grund:
+
+Wenn der Benutzer die Archivoperationen verläßt, dann sollte automatisch das Archiv
+freigegeben werden, um so - auch bei Multi-User-Betrieb - ein einwandfreies Archiv­
+handling zu gewährleisten. Nun kann der Benutzer das Pull-Down-Menu 'Archiv' aber
+eben auf zweierlei Weise verlassen: Einmal durch den Wechsel in ein anderes Pull-
+Down-Menu der gleichen Menukarte - oder aber er verläßt insgesamt das Menu. Im
+ersten Falle wird das Archiv abgemeldet, weil ja die als 3.Parameter bei 'oberbegriff'
+eingetragene Prozedur ausgeführt wird - im zweiten Falle, weil die als 3.Parameter
+bei 'oeffne menu' eingetragene Prozedur ausgeführt wird. Diese Eintragungen sollten
+Sie auf keinen Fall bei der Einbindung der Archivoperationen vergessen.
+
+Die Prozedur 'menu archiv grundeinstellung (INT CONST ort)' sollte bei den Archiv­
+operationen immer als 2. Parameter in der Prozedur 'oberbegriff' übergeben wer­
+den. Nur wenn diese Prozedur beim Entfallten des Archiv-Pull-Down-Menus ausge­
+führt wird, ist die einwandfreie Funktion des Archivsystems sichergestellt. Dadurch
+geschieht nämlich folgendes:
+
+ 1) Als Zieltask wird das Archiv der eigenen Station eingestellt - unabhängig
+ davon, mit welcher Einstellung das Menu zuvor verlassen wurde.
+
+ 2) Es wird die Zieltask auf dem Bildschirm angezeigt.
+
+ 3) Die entsprechenden Menupunkte werden aktiviert bzw. deaktiviert.
+
+ 4) Es wird festgelegt, an welcher Stelle innerhalb des Menus die Menunotiz zur
+ Anzeige der Zieltask (und ggf. des Archivnamens) ausgegeben wird.
+
+Im Programm oben ist hierfür die Position 4 (rechts unten in der Ecke) gewählt. Wir
+haben diese Festlegung deswegen so getroffen, weil das Archiv-Pull-Down-Menu
+ziemlich weit links auf dem Bildschirm erscheint (es sind nur zwei Oberbegriffe
+eingetragen!). So stören sich Archiv-Pull-Down-Menu und die Menunotiz nicht gegen­
+seitig. In unseren Anwendungssystemen 'gs-Herbert und Robbi' und
+'gs-MP-BAP' haben wir dagegen die Position '3' eingetragen, damit die Menunotiz
+unten links in der Ecke erscheint, weil das Archiv-Pull-Down-Menu ganz rechts auf
+dem Bildschirm entfaltet wird.
+
+Achtung! Uns ist es sehr, sehr wichtig, daß zumindest die Archivfunktionen in allen
+Anwendungen unter gs-DIALOG in gleicher Weise zur Verfügung gestellt werden. Um
+das sicherzustellen, sind die Funktionen so in gs-DIALOG integriert, daß das System
+nur dann reibungslos funktioniert, wenn Sie sich an die eben aufgezeigten Regeln für
+die Einbindung in Ihr Anwendungssystem halten! Für die korrekte Funktionsweise
+muß im Archiv-Pull-Down-Menu auch immer exakt die Reihenfolge (der Aufbau) der
+Verarbeitungsfunktionen eingehalten werden. Auch die Namen sollten immer gleich
+gewählt werden!
+
+Wir hoffen, daß Sie als Programmierer für diese doch etwas rigorose Maßnahme
+Verständnis haben - dafür versichern wir Ihnen, daß wir sehr viel Gedanken und
+Arbeit in die Konstruktion des Archivsystems investiert haben!
+
+Auf eine Einschränkung muß allerdings noch hingewiesen werden:Das Archiv-
+Pull-Down-Menu kann aus technischen Gründen nicht das erste, ganz links in einem
+Menu stehende sein; es kann frühestens unter dem zweiten Oberbegriff in das Menu
+aufgenommen werden! Es ist z.Z. nicht möglich, im ganz links stehenden Pull-
+Down-Menu deaktivierte Menupunkte zu behandeln.
+
+
+#ib#6.2 Einbinden der Dateiopertionen#ie#
+
+gs-DIALOG stellt neben den Archivoperationen standardmäßig auch einige Dateiope­
+rationen bereit. Folgende Prozeduren stehen zur Verfügung:
+
+
+ PROC #ib#menu dateien verzeichnis#ie#,
+ PROC #ib#menu dateien loeschen#ie#,
+ PROC #ib#menu dateien drucken#ie#,
+ PROC #ib#menu dateien kopieren#ie#,
+ PROC #ib#menu dateien umbenennen#ie#,
+ PROC #ib#menu dateien speicherplatz#ie#,
+ PROC #ib#menu dateien aufraeumen#ie#.
+
+
+Die Prozeduren bedürfen in Ihrer Wirkung sicher kaum einer Erklärung. Die Wir­
+kungsweise können Sie einfach ausprobieren, indem Sie die entsprechenden Ver­
+arbeitungsfunktionen im Archiv-Menu einfach einmal aktivieren.
+
+
diff --git a/doc/menugenerator/menu-generator handbuch.7 b/doc/menugenerator/menu-generator handbuch.7
new file mode 100644
index 0000000..2e6f0ba
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.7
@@ -0,0 +1,367 @@
+#block##pageblock#
+#pagenr("%",1)##setcount(1)##count per page#
+#headeven#
+gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#right#gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+7 - % #right#ERGOS
+#end#
+#bottomodd#
+#center#____________________________________________________________
+ERGOS #right# 7 - %
+#end#
+#ib#7  Eigene Fenster und Fensteroperationen #ie#
+
+
+In Kapitel 5.11 haben wir Ihnen gezeigt, wie Sie innerhalb des Menus ein Fenster
+(das Menufenster) öffnen können. Innerhalb dieses Bereichs stehen Ihnen die
+wesentlichen Ein- und Ausgabeoperationen zur Verfügung, die Sie auch sonst vom
+Bildschirm her kennen. Auf die Größe des Menufensters können Sie allerdings keinen
+Einfluß nehmen, da die Fenstergröße automatisch vom System (gs-DIALOG) festge­
+legt wird - je nachdem, ob Sie mit einem Menu oder mit geschachtelten Menus
+arbeiten.
+Auf die Einschränkungen bzw. Abweichungen gegenüber den Möglichkeiten, die Sie
+bei Benutzung des ganzen Bildschirms haben, haben wir Sie ausdrücklich hingewie­
+sen: So ist es nicht möglich, den Text innerhalb eines Fensters zu rollen (scrolling);
+statt dessen wird bei Überschreiten der unteren Fenstergrenze der Fensterinhalt
+gelöscht und die Ausgabe oben im "neuen" Fenster fortgesetzt.
+Als wir gs-DIALOG konzipierten und die ersten Anwendungen unter dieser Benutzer­
+schnittstelle entwarfen, fiel uns auf, daß es sehr günstig für die Strukturierung des
+Bildschirms innerhalb der Anwendungsprogramme ist, wenn man den Bildschirm in
+Bereiche (Fenster) einteilen und den Fenstern entsprechende Funktionen zuweisen
+kann (z.B. Eingabe-, Informations-, Kontroll-Fenster etc.). Sinnvoll ist es dann, auch
+die entsprechenden Ein-/Ausgaberoutinen zur Verfügung zu haben, die sich auf die
+einzelnen Fenster beziehen.
+
+In diesem Kapitel werden wir Ihnen zeigen, wie Sie eigene Fenster definieren und
+darin Ein- und Ausgaben realisieren können. Für die Fenster gelten die gleichen
+Einschränkungen wie für das Menufenster - d.h. ein Rollen des Textes (scrolling) ist
+nicht möglich. Die Fensterposition und -größe innerhalb des Bildschirms können Sie
+aber festlegen.
+
+
+#ib#7.1 Definition von Fenstern ('window')#ie#
+
+Das Fensterkonzept in gs-DIALOG ist sehr einfach gehalten: Durch die Definition
+des Fenters werden nur Bereiche auf dem Bildschirm festgelegt, auf die sich
+bestimmte Ein-/Ausgabeprozeduren beziehen.
+
+Wir wollen Ihnen die Verwendung von Fenstern wieder an einem kleinen Beispiel
+verdeutlichen - bleiben wir dazu bei unserer Textverarbeitung: Für die Seitenforma­
+tierung müßte der Benutzer den oberen und linken Rand, die Schreibfeldbreite und
+die Schreibfeldlänge festlegen. Dazu wollen wir dem Benutzer die aktuellen Werte
+anzeigen und ggf. eine Neueinstellung vornehmen lassen. Ein Programm dazu könnte
+so aussehen:
+
+
+WINDOW VAR info :: window ( 2, 2, 32, 9),
+ frage :: window (36, 2, 40, 3),
+ daten :: window (36, 7, 40, 4);
+
+TEXT VAR oberer rand :: " 2.54",
+ linker rand :: " 2.54",
+ feldbreite :: "16.00",
+ feldlaenge :: "24.50";
+
+
+zeige aktuelle werte an;
+frage nach neueinstellung.
+
+zeige aktuelle werte an:
+ page; show (info);
+ out (info, center (info, invers ("Aktuell eingestellte Werte:")));
+ cursor (info, 2, 4);
+ out (info, "Oberer Rand : " + oberer rand + " cm");
+ cursor (info, 2, 5);
+ out (info, "Linker Rand : " + linker rand + " cm");
+ cursor (info, 2, 7);
+ out (info, "Schreibfeldbreite : " + feldbreite + " cm");
+ cursor (info, 2, 8);
+ out (info, "Schreibfeldlänge : " + feldlaenge + " cm").
+
+frage nach neueinstellung:
+ show (frage);
+ cursor (frage, 1, 1);
+ out (frage, center (frage, invers ("Papierformat einstellen:")));
+ cursor (frage, 2, 3);
+ IF yes ("Neueinstellung vornehmen")
+ THEN neue werte erfragen
+ FI.
+
+neue werte erfragen:
+ show (daten);
+ erfrage oberen rand;
+ erfrage linken rand;
+ erfrage feldbreite;
+ erfrage feldlaenge.
+
+erfrage oberen rand:
+ REAL VAR neuer oberer rand;
+ cursor (daten, 1, 1);
+ out (daten, center (daten, invers ("Oberen Rand einstellen:")));
+ cursor (daten, 2, 3);
+ out (daten, "Bitte den neuen Wert: ");
+ get (daten, neuer oberer rand);
+ oberer rand := text (neuer oberer rand, 5, 2);
+ cursor (info, 23, 4);
+ out (info, oberer rand).
+
+erfrage linken rand:
+ (* analog zu 'erfrage oberen rand *).
+
+erfrage feldbreite:
+ (* analog zu 'erfrage oberen rand *).
+
+erfrage feldlaenge:
+ (* analog zu 'erfrage oberen rand *).
+
+
+
+Am Anfang des Programms werden drei Fenster definiert. Das "Infofenster" erscheint
+links oben auf dem Bildschirm, in ihm werden die aktuell eingestellten Werte ange­
+zeigt. Das "Fragefenster" erscheint neben dem ersten Fenster oben rechts auf dem
+Bildschirm.
+Beantwortet der Benutzer die dort ausgegebene Frage 'Neueinstellung vornehmen
+(j/n)?' mit 'ja', dann erscheint unter dem zweiten Fenster ein drittes
+("Datenfenster"). Innerhalb dieses Fensters können nacheinander die neuen Werte
+eingelesen werden (nicht alle Prozeduren sind hier ausgeführt!).
+
+Die Definition eines Fensters erfolgt in folgender Weise:
+
+ #ib#WINDOW#ie# VAR fenstername :: #ib#window#ie# ( x, y, xsize, ysize);
+
+Der Fenstervariablen wird durch 'window' eine Größe zugeordnet. Mit den ersten
+beiden Werten legen Sie die linke obere Ecke des Fensters ('x' bezeichnet die Spalten,
+'y' die Zeilen) auf dem Gesamtbildschirm fest. Mit 'xsize' bestimmen Sie die Fenster­
+breite (Spaltenzahl), mit 'ysize' die Höhe des Fensters (Zeilenzahl). Der Fenster­
+cursor hat die Position (1,1).
+Die linke obere Ecke des ersten Fensters im Programm hat also die Position ( 2, 2).
+Das Fenster ist 32 Spalten breit und 9 Zeilen hoch; es kann unter dem Namen 'info'
+angesprochen werden.
+Bei der Festlegung der Fenstermaße ist der Rahmen des Fensters nicht berücksich­
+tigt - er gehört nicht zum Fenster dazu! Haben Sie die Absicht, das Fenster mit
+Rahmen auszugeben, dann sollten Sie das bei der Fensterdefinition berücksichtigen.
+Wir haben es im Beispielprogramm auch gemacht: Die linke obere Ecke hat gerade
+die Position (2,2) erhalten, damit noch der Rahmen Platz hat. Mit Rahmen ist unser
+Fenster also 34 Spalten breit und 11 Zeilen hoch. Die linke obere Ecke des zweiten
+Fensters ('frage') legen wir deshalb in die 36. Spalte und 2. Zeile, damit auch hier
+Platz für den Rahmen bleibt.
+Eine wichtige Einschränkung sollten Sie unbedingt berücksichtigen: Da manche
+Terminals mit Beschreiben der Position (80,24) automatisch den Bildschirm
+löschen, haben wir die maximale Ausdehnung eines umrandeten Fensters auf (2, 2,
+77, 22) festgelegt. Überschreiten Sie irgendwo diese Grenzen, dann wird kein Rah­
+men mehr erzeugt. Der Rahmen wird auch dann nicht erzeugt, wenn er in der 0.
+Zeile, 0.Spalte, 25 Zeile oder 80 Spalte zu liegen käme - erst recht natürlich nicht,
+wenn diese Werte noch unter- bzw. überschritten werden.
+
+
+#ib#7.2 Anzeigen/Löschen von Fenstern#ie#
+ ('#ib#show#ie#', '#ib#page#ie#', '#ib#erase#ie#', '#ib#out frame#ie#')
+
+Mit dem Befehl 'show (WINDOW VAR w)' wird das Fenster 'w' angezeigt. Der Fenster­
+variablen müssen natürlich zuvor die Maße des Fensters zugewiesen sein. Durch den
+Befehl wird um den angegebenen Fensterbereich ein Rahmen gezogen und der
+"Innenbereich" des Fensters gelöscht. Möchten Sie das Fenster ohne Rahmen ange­
+zeigt haben, so verwenden Sie nur den Befehl 'page (WINDOW VAR w)'. Durch die­
+sen Befehl wird nur der "Innenbereich" des Fensters gelöscht.
+Haben Sie das Fenster einmal mit 'show' ausgegeben und wollen den Fensterinhalt
+löschen, so verwenden Sie auch hier den Befehl 'page (WINDOW VAR w)', denn der
+Rahmen braucht ja nicht erneut ausgegeben zu werden.
+Möchten Sie ein Fenster und den zugehörigen Rahmen löschen, dann steht Ihnen der
+Befehl 'erase (WINDOW VAR w) zur Verfügung: Durch den Befehl wird sowohl der
+"Innenbereich" des Fensters als auch der Rahmen gelöscht.
+Sie können natürlich auch selbst einen Rahmen um ein Fenster setzen. Dafür steht
+der Befehl 'out frame (WINDOW VAR w)' zur Verfügung. Der Rahmen wird ebenfalls
+um den durch 'w' bestimmten Fensterbereich gezogen - der "Innenbereich" bleibt
+unberührt!
+
+Sollten Sie ein Fenster mit dem Befehl 'show' ausgeben (oder mit 'out frame' einen
+Rahmen erzeugen) wollen, aber kein Rahmen auf dem Bildschirm erscheint, so
+haben Sie die zulässigen Fenstergrenzen überschritten. Sehen Sie dazu auch Kapitel
+7.1.
+
+
+#ib#7.3 Operationen innerhalb des Fensters#ie#
+
+Innerhalb des selbstdefinierten Fensters stehen Ihnen die gleichen Operationen zur
+Verfügung wie innerhalb des Menufensters. Bezieht sich eine Operation auf ein
+Fenster, so wird der interne Fensterbezeichner als erster Parameter übergeben.
+
+
+#ib#7.3.1 Datei anzeigen/editieren #ie#('#ib#edit#ie#', '#ib#show#ie#')
+
+Zum Anzeigen einer Datei steht die Prozedur 'show' zur Verfügung. Dabei kann
+einmal ein FILE angegeben werden ('show (WINDOW VAR w, FILE VAR f)') oder aber
+der Name der anzuzeigenden Datei ('show (WINDOW VAR w, TEXT VAR dateiname)').
+Die Datei kann nur eingesehen, nicht aber schreibend verändert werden.
+Die Prozedur 'edit' gibt es ebenfalls in den zwei Ausprägungen. Hier kann die Datei
+im Gegensatz zu 'show' auch schreibend verändert werden.
+Durch diesen Befehl wird jeweils innerhalb des angegebenen Fensters die Datei
+ausgegeben. Sofern die Lage des Fensters es zuläßt, wird automatisch ein Rahmen
+um das Dateifenster gezogen.
+
+
+#ib#7.3.2 Positionierungen im Fenster#ie#
+ ('#ib#cursor#ie#', '#ib#get cursor#ie#', '#ib#line#ie#', '#ib#remaining lines#ie#')
+
+Mit 'cursor (WINDOW VAR w, INT CONST spalte, zeile)' können Sie den Cursor inner­
+halb des angegebenen Fensters positionieren. Werden dabei die Fenstergrenzen über-
+oder unterschritten, so wird der Fensterinhalt gelöscht und auf die Position (1, 1)
+innerhalb des Fensters positioniert.
+Mit der Prozedur 'get cursor (WINDOW VAR w, INT VAR spalte, zeile)' können Sie die
+aktuelle Cursorposition innerhalb des angegebenen Fensters erfragen.
+Wollen Sie an den Anfang der nächsten Zeile positionieren, dann verwenden Sie den
+Befehl 'line (WINDOW VAR w)' - wollen Sie gleich mehrere Zeilen vorwärtspositionie­
+ren, dann benutzen Sie den Befehl 'line (WINDOW VAR w, INT VAR anzahl zeilen)'.
+Wird allerdings bei einem der beiden letzten Befehle die untere Fenstergrenze über­
+schritten, so wird der Fensterinhalt gelöscht und die Operation in der ersten Zeile des
+neuen Fensters fortgesetzt.
+Die Informations-Prozedur 'remaining lines (WINDOW VAR w)' liefert Ihnen die
+Anzahl der unterhalb der aktuellen Zeile noch im Fenster vorhanden Zeilen.
+
+
+#ib#7.3.3 Ein- und Ausgaben innerhalb des Fensters#ie#
+ ('#ib#out#ie#', '#ib#put#ie#', '#ib#putline#ie#', '#ib#get#ie#', '#ib#getline#ie#', '#ib#yes#ie#', '#ib#no#ie#')
+
+Mit der Prozedur 'out (WINDOW VAR w, TEXT CONST text)' können Sie einen Text
+innerhalb des angegebenen Fensters ausgeben. Paßt der Text nicht mehr in die
+aktuelle Zeile, so wird er in der nächsten Zeile fortgesetzt.
+Bedenken Sie, daß innerhalb der Fenster kein Wortumbruch realisiert ist. Ebenso­
+wenig ist das Rollen (scrolling) des Fensterinhalts möglich: Erfolgt die Ausgabe eines
+Textes über die untere Fenstergrenze hinaus, so wird der Fensterinhalt gelöscht und
+die Ausgabe an der Position (1, 1) des Fensters fortgesetzt.
+Zur Ausgabe von Texten stehen noch die beiden Prozeduren 'put (WINDOW VAR w,
+TEXT CONST text)' und 'putline (WINDOW VAR w, TEXT CONST text)' zur Verfügung.
+Bei erstgenannter Prozedur wird gegenüber 'out' an die Ausgabe noch ein Leerzei­
+chen angehängt, bei der zweiten wird zusätzlich an den Anfang der nächsten Zeile
+positioniert.
+Zahlenwerte können mit den Prozeduren 'put (WINDOW VAR w, INT CONST intwert)'
+und 'put (WINDOW VAR w, REAL CONST realwert)' ausgegeben werden. An die
+Zahlenwerte wird jeweils ein Leerzeichen angehängt.
+
+Für das Einlesen von Werten steht die Prozedur 'get' in mehreren Varianten zur
+Verfügung. Mit 'get (WINDOW VAR w, TEXT VAR text)' kann ein Text an der aktuellen
+Position des Fensters eingelesen werden. Stehen in der aktuellen Zeile des Fensters
+weniger als 5 Zeichenpositionen für die Eingabe zur Verfügung, so wird automatisch
+auf den Anfang der nächsten Zeile innerhalb des Fensters positioniert.
+Über einen dritten Parameter können noch zusätzliche Festlegungen getroffen wer­
+den: Soll die Eingabe noch durch weitere Zeichen (außer Positionierungszeichen)
+abgeschlossen werden können, so werden die Zeichen als TEXT übergeben( 'get
+(WINDOW VAR w, TEXT VAR text, TEXT CONST separator)'), soll die Maximallänge des
+einzugebenden Textes festgelegt sein, so wird diese als INT übergeben ('get (WINDOW
+VAR w, TEXT VAR text, INT CONST laenge)').
+
+Mit den Prozeduren 'get (WINDOW VAR w, INT VAR intwert)' und 'get (WINDOW VAR
+w, INT VAR realwert)' können auch Zahlenwerte innerhalb des Fensters eingelesen
+werden.
+
+Damit dem Anwender auch Vorschläge für der Eingabe gemacht werden können,
+steht die Prozedur 'editget' in zwei Variationen zur Verfügung. Bei 'editget' (WINDOW
+VAR w, TEXT VAR ausgabe) wird 'ausgabe zum Editieren ausgegeben. Daneben
+existiert noch ein 'editget' mit 7 Parametern, der detailliert bei der Zusammenstel­
+lung der Befehle erläutert ist.
+
+Ebenso wie auf dem Gesamtbildschirm und innerhalb des Menufensters stehen auch
+hier die beiden Prozeduren 'yes (WINDOW VAR w, TEXT CONST frage)' und 'no
+(WINDOW VAR w, TEXT CONST frage)' zur Verfügung.
+
+
+#ib#7.3.4 Weitere Prozeduren #ie#('#ib#center#ie#', '#ib#stop#ie#')
+
+Mit 'center (WINDOW VAR w, TEXT CONST text)' werden vor dem angegebenen Text
+so viele Leerzeichen angehängt, daß der Text zentriert in der aktuellen Fensterzeile
+ausgegeben wird - wenn der Cursur bei der Ausgabe auf der ersten Position der Zeile
+steht. Dabei werden aber bereits vorhandene Zeileninhalte überschrieben.
+
+Durch die Prozedur 'stop (WINDOW VAR w)' wird innerhalb des angegebenen Fen­
+sters an den Anfang der übernächsten Zeile positioniert und der Text " Zum Weiter­
+machen bitte irgendeine Taste tippen!" ausgegeben. Möchten Sie nicht an den Anfang
+der übernächsten Zeile positionieren, so können Sie die Anzahl der Zeilen auch
+explizit festlegen durch 'stop (WINDOW VAR w, INT CONST zeilenzahl).
+
+
+#ib#7.4 Boxoperationen#ie#
+
+Innerhalb des Menufensters (sehen Sie Kapitel 5) stehen Ihnen die Prozeduren
+'menuanswer', 'menuinfo', 'menuone', 'menusome', 'menuanswerone',
+'menuanswersome', 'menuyes', 'menuno', 'menualternative', 'write menunotice' und
+'menufootnote' zur Verfügung. Alle diese Prozeduren bezogen sich auf das von
+gs-DIALOG automatisch gesetzte Menufenster.
+Auch innerhalb der von Ihnen selbst definierten Fenster können Sie auf ähnliche
+Prozeduren zurückgreifen. Da wir die eben genannten Prozeduren in Kapitel 5 sehr
+detailliert beschrieben haben, werden wir hier nur auf die entsprechenden
+Beschreibungen verweisen und ggf. die Besonderheiten/Abweichnungen erwähnen.
+Zu beachten ist, daß innerhalb des Fensters weder die oberen noch die unteren zwei
+Zeilen von der "Box" beschrieben werden. Die oberen bleiben ständig frei - die unter­
+en werden zur Ausgabe der zugehörigen Benutzerinformation (Fußnote) benutzt -
+das sollten Sie bei der Festlegung der Fenstergröße bzw. bei der Länge der zu über­
+gebenden Texte berücksichtigen. Bei der Übergabe der Texte müssen Sie sich an die
+gs-DIALOG Syntax-Regeln halten, die in Kapitel 5.12 beschrieben sind.
+
+Die Prozedur '#ib#boxanswer#ie# (WINDOW VAR w, TEXT CONST ausgabetext, antwortvorgabe,
+INT CONST position)' arbeitet wie die Prozedur 'menuanswer (TEXT CONST ausgabe­
+text, antwortvorgabe, INT CONST position)' nur innerhalb des Fensters 'w' (sehen Sie
+auch Kapitel 5.1).
+
+Die Prozedur '#ib#boxinfo#ie#' gibt es in zwei Ausführungen: 'boxinfo (WINDOW VAR w, TEXT
+CONST text)' arbeitet wie 'menuinfo (TEXT CONST text)', allerdings auf dem angege­
+benen Fenster. Bei 'boxinfo (WINDOW VAR w, TEXT CONST text, INT CONST position,
+timelimit)' kann über den dritten Parameter noch die relative Position im angegebe­
+nen Fenster (sehen Sie dazu Kapitel 5.12) und über den vierten Parameter die Zeit­
+spanne festgelegt werden, für die die Information erscheint (sehen Sie auch Kap.
+5.2).
+
+Die Prozedur '#ib#boxone#ie# (WINDOW VAR w, THESAURUS CONST thesaurus, TEXT CONST
+text1, text2, BOOL CONST mit reinigung)' arbeitet wie die Prozedur 'menuone
+(THESAURUS CONST thesaurus, TEXT CONST text1, text2, BOOL CONST mit reini­
+gung)'. Zu bedenken ist hier, daß die Auswahl innerhalb des Fensters Platz finden
+muß. Der Aufruf dieser Prozedur ist daher nur möglich, wenn das angegebene Fen­
+ster mindestens 60 Spalten breit und 17 Zeilen hoch ist. Ansonsten kommt es zu
+einer Fehlermeldung (sehen Sie auch Kap. 5.3).
+
+Die Prozedur '#ib#boxsome#ie# (WINDOW VAR w, THESAURUS CONST thesaurus, TEXT
+CONST text1, text2, BOOL CONST mit reinigung)' arbeitet wie die Prozedur
+'menusome (THESAURUS CONST thesaurus, TEXT CONST text1, text2, BOOL CONST
+mit reinigung)'. Hinsichtlich der Fenstergröße gelten die gleichen Einschränkungen
+wie bei 'boxone' (sehen Sie auch Kap. 5.4).
+
+Die Prozeduren '#ib#boxanswerone#ie#' und '#ib#boxanswersome#ie#' entsprechen den Prozeduren
+'menuanswerone' und 'menuanswersome'; es wird nur zusätzlich jeweils als erster
+Parameter das aktuelle Fenster übergeben. Hinsichtlich der Fenstergröße gelten die
+gleichen Einschränkungen wie bei 'boxone' (sehen Sie auch Kap. 5.5).
+
+Die Prozeduren '#ib#boxyes#ie#', '#ib#boxno#ie#' und '#ib#boxalternative#ie#' entsprechen den Prozeduren
+'menuyes', 'menuno' und 'menualternative'; es wird nur zusätzlich jeweils als erster
+Parameter das aktuelle Fenster übergeben (sehen Sie auch Kap. 5.6 und 5.7).
+
+Die Prozedur '#ib#boxnotice#ie#' unterscheidet sich von der Prozedur 'write menunotice'
+erheblich: Letztgenannte Prozedur hat zwei Parameter. Durch den ersten wird der
+Ausgabetext übergeben, mit dem zweiten wird die relative Position innerhalb des
+Menubildschirms festgelegt. Sowohl Text als auch Position werden vom System ge­
+speichert. Bei jedem Neuaufbau eines Pull-Down-Menus oder des Menubildschirms
+wird die Notiz neu mitaufgebaut.
+Die Prozedur 'boxnotice (WINDOW VAR w, TEXT CONST text, INT CONST position, INT
+VAR x, y, xsize, ysize) dagegen hat sieben Parameter. Über den ersten wird das aktuel­
+le Fenster festgelegt. Die beiden nächsten Parameter entsprechen den beiden Para­
+metern von 'write menunotice'. Über die letzten vier Parameter werden die Posi­
+tion/Maße der Box geliefert, die ja erst durch das Aussehen der übergebenen Texte
+festgelegt werden. Weder Text noch Position der Boxnotiz werden vermerkt. Wollen Sie
+die Notiz löschen, so verwenden Sie eine der Prozeduren '#ib#page#ie# (INT CONST x, y, xsize,
+ysize)' oder '#ib#page up#ie# (INT CONST x, y, xsize, ysize)'. Im ersten Falle erscheint es dem
+Betrachter, als ob die Box von oben nach unten "aufgerollt" würde, im zweiten Falle
+von unten nach oben.
+
+Mit den Prozeduren '#ib#out footnote#ie# (WINDOW VAR w, TEXT CONST text)' wird in der
+untersten Zeile des Fensters 'w' der angegebene Text ausgegeben. In der vorletzten
+Zeile des Fensters wird eine Trennlinie ausgegeben. Die Fußnote incl. der Trennline
+kann durch den Befehl '#ib#erase footnote#ie#' gelöscht werden.
+
+
diff --git a/doc/menugenerator/menu-generator handbuch.8 b/doc/menugenerator/menu-generator handbuch.8
new file mode 100644
index 0000000..66eb6cf
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.8
@@ -0,0 +1,1676 @@
+#block##pageblock#
+#pagenr("%",1)##setcount(1)##count per page#
+#headeven#
+gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#right#gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+8 - % #right#ERGOS
+#end#
+#bottomodd#
+#center#____________________________________________________________
+ERGOS #right# 8 - %
+#end#
+#ib#8  Kurzbeschreibung der Befehle #ie#
+
+
+Durch #u#(*)#e# gekennzeichnete Prozeduren stehen (zumindest in der hier dokumentier­
+ten Form) erst ab gs-DIALOG Version 1.1 zur Verfügung!
+
+
+#ib#activate#ie#
+PROC activate (TEXT CONST punktname):
+
+Zweck: Mit der Prozedur kann ein (deaktivierter) Menupunkt im aktuellen
+ Pull-Down-Menu aktiviert, d.h. zur Ausführung freigegeben werden. Das
+ '-'-Zeichen vor der Punktbezeichnung verschwindet auf dem Bildschirm,
+ statt dessen erscheint das Zeichen, über den die Menufunktion direkt
+ aktivierbar ist. 'punktname' muß eine Punktbezeichnung sein, die genau
+ in der angegebenen Schreibweise im aktuellen Pull-Down-Menu vorhan­
+ den ist (über den 2. Parameter der Prozedur 'menufunktion' in die
+ Menukarte eingetragen wurde) - ansonsten wird diese Anweisung igno­
+ riert. Die Prozedur "zeigt nur dann Wirkung", wenn sie aus einer Verar­
+ beitungsfunktion des aktuell entfalteten Pull-Down-Menus heraus oder
+ durch die "Startprozedur"/"Leaveprozedur" des aktuellen Pull-Down-
+ Menus (sehen Sie auch 'oberbegriff') aufgerufen wird.
+ Die Veränderung wird nicht sofort auf dem Bildschirm angezeigt, sondern
+ erst, wenn das Pull-Down-Menu das nächste Mal vom System regeneriert
+ wird; ansonsten muß das Kommando 'refresh submenu' gegeben werden.
+
+
+PROC activate (INT CONST punktposition):#u#(*)#e#
+Zweck: arbeitet wie obiges 'activate', allerdings werden die Menupunkte nicht
+ über ihre Bezeichnung, sondern über ihre Position im (aktuellen) Pull-
+ Down-Menu identifiziert. Die Positionen sind von oben nach unten durch­
+ numeriert. Beachten Sie, daß Trennlinien eine Position belegen und
+ mitgezählt werden. Die Prozedur arbeitet schneller als obige!
+
+
+#ib#anwendungstext#ie#
+TEXT PROC anwendungstext (INT CONST zeilennummer):
+
+Zweck: Mit diesem Befehl können Texte angesprochen (geholt) werden, die in die
+ Menukarte ausgelagert wurden. Es wird der Text aus der angekoppelten
+ Menukarte geliefert, der bei der "Einlagerung" in der Zeile 'zeilen­
+ nummer' stand.
+Fehler: Kein Text vorhanden! (In der angekoppelten Menukarte ist unter der
+ 'zeilennummer' kein Anwendungstext eingetragen.)
+ Bitte achten Sie auf folgendes: Wenn Sie eine neue Menukarte generiert
+ haben, muß diese erst an die aktuelle Task gekoppelt werden, bevor Sie
+ auf die dort eingetragenen (Anwendungs-)Texte zugreifen können (z.B.
+ mit 'testinstallation').
+
+
+#ib#areax#ie#
+INT PROC areax (WINDOW VAR w)
+Zweck: Liefert den Wert 'x' des Fensters w.
+
+
+#ib#areaxsize#ie#
+INT PROC areaxsize (WINDOW VAR w)
+Zweck: Liefert den den Wert 'xsize' des Fensters w.
+
+
+#ib#areay#ie#
+INT PROC areay (WINDOW VAR w)
+Zweck: Liefert den den Wert 'y' des Fensters w.
+
+
+#ib#areaysize#ie#
+INT PROC areaysize (WINDOW VAR w)
+Zweck: Liefert den den Wert 'ysize' des Fensters w.
+
+
+#ib#balken links#ie#
+TEXT PROC balken links:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "linker
+ Balken" (̄) ausgegeben wird.
+
+
+PROC balken links (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" als "linker Balken" ausgegeben werden soll.
+
+
+#ib#balken oben#ie#
+TEXT PROC balken oben:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "oberer
+ Balken" (�) ausgegeben wird.
+
+
+PROC balken oben (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" als "oberer Balken" ausgegeben werden soll.
+
+
+#ib#balken rechts#ie#
+TEXT PROC balken rechts:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "rechter
+ Balken" (̃) ausgegeben wird.
+
+
+PROC balken rechts (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" als "rechter Balken" ausgegeben werden soll.
+
+
+#ib#balken unten#ie#
+TEXT PROC balken unten:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "unterer
+ Balken" (̂) ausgegeben wird.
+
+
+PROC balken unten (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" als "unterer Balken" ausgegeben werden soll.
+
+
+#ib#boxalternative#ie#
+INT PROC boxalternative (WINDOW VAR w,
+ TEXT CONST infotext,
+ auswahlliste,
+ zusatztasten,
+ INT CONST position,
+ BOOL CONST mit abbruch):
+
+Zweck: Vergl. 'menualternative'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menualternative' automatisch gesetzt wird. Der 'infotext' muß
+ den gs-DIALOG-Syntax-Regel gehorchen! Die 'auswahlliste' muß nach
+ festen Regeln erstellt werden (sehen Sie Kap. 5.7)
+
+
+#ib#boxanswer#ie#
+TEXT PROC boxanswer (WINDOW VAR w,
+ TEXT CONST infotext,
+ vorgabe,
+ INT CONST  position):
+
+Zweck: Vergl. 'menuanswer'. Hier wird nur zusätzlich das Fenster festgelegt, das
+ bei 'menuanswer' automatisch gesetzt wird. Der 'infotext' muß den
+ gs-DIALOG-Syntax-Regel gehorchen!
+
+
+#ib#boxanswerone#ie#
+TEXT PROC boxanswerone (WINDOW VAR w,
+ TEXT CONST infotext,
+ vorgabe,
+ THESAURUS CONST thes,
+ TEXT CONST ueberschrift,
+ hinweis,
+ BOOL CONST mit reinigung):
+
+Zweck: Vergl. 'menuanswerone'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuanswerone' automatisch gesetzt wird.
+Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
+
+
+#ib#boxanswersome#ie#
+THESAURUS PROC boxanswersome (WINDOW VAR w,
+ TEXT CONST infotext,
+ vorgabe,
+ THESAURUS CONST thes,
+ TEXT CONST ueberschrift,
+ hinweis,
+ BOOL CONST mit reinigung):
+
+Zweck: Vergl. 'menuanswersome'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuanswersome' automatisch gesetzt wird.
+Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
+
+
+#ib#boxinfo#ie#
+PROC boxinfo (WINDOW VAR w, TEXT CONST infotext,
+ INT CONST position, timelimit):
+
+Zweck: Vergl. 'menuinfo'. Hier wird nur zusätzlich das Fenster festgelegt, das bei
+ 'menuinfo' automatisch gesetzt wird. Der 'infotext' muß den gs-DIALOG-
+ Syntax-Regel gehorchen!
+
+
+PROC boxinfo (WINDOW VAR w, TEXT CONST infotext):
+
+ wirkt wie: boxinfo (w, infotext, 5, maxint)
+
+
+#ib#boxno#ie#
+BOOL PROC boxno (WINDOW VAR w,
+ TEXT CONST frage,
+ INT CONST  position):
+
+ wirkt wie: NOT boxyes (w, frage, position)
+
+
+#ib#boxnotice#ie#
+PROC boxnotice (WINDOW VAR w,
+ TEXT CONST infotext,
+ INT CONST  position
+ INT VAR x, y, xsize, ysize):
+
+Zweck: Mit 'w' wird das aktuelle Fenster festgelegt. In 'infotext' wird der Text
+ übergeben, der als Notiz ausgegeben werden soll, der Text muß den
+ gs-DIALOG-Syntax-Regeln entsprechen. Mit 'position' wird die relative
+ Lage innerhalb des Fensters 'w' bestimmt. Über die letzten vier Parameter
+ werden die Position/Maße der Box geliefert. Weder Text noch Position
+ werden vermerkt.
+
+
+#ib#boxone#ie#
+TEXT PROC boxone (WINDOW VAR w,
+ THESAURUS CONST thes,
+ TEXT CONST ueberschrift,
+ hinweis,
+ BOOL CONST mit reinigung):
+
+Zweck: Vergl. 'menuone'. Hier wird nur zusätzlich das Fenster festgelegt, das bei
+ 'menuone' automatisch gesetzt wird.
+Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
+
+
+#ib#boxsome#ie#
+THESAURUS PROC boxsome (WINDOW VAR w,
+ THESAURUS CONST thes,
+ TEXT CONST ueberschrift,
+ hinweis,
+ BOOL CONST mit reinigung):
+
+Zweck: Vergl. 'menusome'. Hier wird nur zusätzlich das Fenster festgelegt, das
+ bei 'menusome' automatisch gesetzt wird.
+Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
+
+
+#ib#boxyes#ie#
+BOOL PROC boxyes (WINDOW VAR w,
+ TEXT CONST frage,
+ INT CONST  position):
+
+Zweck: Vergl. 'menuyes'. Hier wird nur zusätzlich das Fenster festgelegt, das bei
+ 'menuyes' automatisch gesetzt wird. Die 'frage' muß den gs-DIALOG-
+ Syntax-Regel gehorchen!
+
+
+#ib#center#ie#
+TEXT PROC center (WINDOW VAR w, TEXT CONST text):
+
+Zweck: Vergl. 'menuwindowcenter'. Hier wird nur zusätzlich das Fenster festge­
+ legt, das bei 'menuwindowcenter' automatisch gesetzt wird.
+
+
+TEXT PROC center (INT CONST laenge,
+ TEXT CONST text):
+
+Zweck: "Ummantelt" 'text' mit Leerzeichen, so daß 'text' etwa in der Mitte zu
+ stehen kommt. Der gelieferte Text hat die Länge 'laenge'.
+
+
+TEXT PROC center (TEXT CONST text):
+
+ wirkt wie: center (79, text)
+
+
+#ib#clear buffer#ie#
+PROC clear buffer
+
+Zweck: Leert den Zeichenpuffer
+
+
+#ib#clear buffer and count#ie#
+INT PROC clear buffer and count (TEXT CONST
+ zeichen):
+
+Zweck: Leert den Zeichenpuffer und liefert die Häufigkeit des Vorkommens von
+ 'zeichen' im Zeichenpuffer.
+
+
+#ib#current menuwindow#ie#
+WINDOW PROC current menuwindow:
+
+Zweck: liefert das aktuelle Menufenster (die Einzelwerte können dann mit
+ 'areax', 'areay', 'areaxsize' und 'areaysize' erfragt werden).
+
+
+#ib#cursor#ie#
+PROC cursor (WINDOW VAR w, INT CONST spalte,
+ zeile):
+
+Zweck: Vergl. 'menuwindowcursor'. Hier wird nur zusätzlich das Fenster festge­
+ legt, das bei 'menuwindowcursor' automatisch gesetzt wird.
+
+
+#ib#cursor off#ie#
+PROC cursor off:
+
+Zweck: Sofern die EUMEL-Installation die Möglichkeit bietet, wird der Cursor aus
+ dem Bildschirm ausgeblendet.
+ Wenn neue Verarbeitungsfunktionen entwickelt werden, sollte zu Beginn
+ der Cursor eingeschaltet und nach Abschluß der Cursor wieder ausge­
+ schaltet werden (sehen Sie auch Kap. 5.1).
+
+
+PROC cursor off (TEXT CONST zeichenkette):
+
+Zweck: Neufestlegung der 'zeichenkette', die ausgegeben werden soll, um bei der
+ aktuellen EUMEL-Installation den Cursor auf den Befehl 'cursor off' hin
+ auszuschalten.
+
+
+#ib#cursor on#ie#
+PROC cursor on:
+
+Zweck: Sofern die EUMEL-Installation die Möglichkeit bietet, wird der Cursor auf
+ dem Bildschirm angezeigt. Wenn neue Verarbeitungsfunktionen entwik­
+ kelt werden, sollte zu Beginn der Cursor eingeschaltet und nach Abschluß
+ der Cursor wieder ausgeschaltet werden (sehen Sie auch Kap. 5.1).
+
+
+PROC cursor on (TEXT CONST zeichenkette):
+
+Zweck: Neufestlegung der 'zeichenkette', die ausgegeben werden soll, um bei der
+ aktuellen EUMEL-Installation den Cursor auf den Befehl 'cursor on' hin
+ anzuschalten.
+
+
+#ib#deactivate#ie#
+PROC deactivate (TEXT CONST punktname):
+
+Zweck: Vergl. 'activate (TEXT CONST punktname)'.
+ Im Gegensatz zu der Prozedur wird hier 'punktname' deaktiviert und
+ beim (nächsten) Erscheinen der Menupunktbezeichnung ein '-'Zeichen
+ vorangestellt. Es gelten die gleichen Einschränkungen wie bei 'activate'!
+
+
+PROC deactivate (INT CONST punktposition):#u#(*)#e#
+Zweck: arbeitet wie obiges 'deactivate', allerdings werden die Menupunkte nicht
+ über ihre Bezeichnung, sondern über ihre Position im (aktuellen) Pull-
+ Down-Menu identifiziert. Die Positionen sind von oben nach unten durch­
+ numeriert. Beachten Sie, daß Trennlinien eine Position belegen und
+ mitgezählt werden. Die Prozedur arbeitet schneller als obige!
+
+
+#ib#direktstart#ie#
+PROC direktstart (TEXT CONST prozedurname,
+ BOOL CONST mit loeschen):#u#(*)#e#
+Zweck: Macht aus der aktuellen Task eine Manager-Task ('global manager').
+ Werden neue Sohntasks eingerichtet, so melden sich diese nicht - wie
+ gewohnt - mit der 'gib kommando:'-Ebene. Statt dessen wird die Prozedur
+ 'prozedurname' ausgeführt. Das Kommando ist dann sinnvoll, wenn sich
+ die Sohntask gleich mit einem Menu melden soll. In der Prozedur
+ 'prozedurname' muß dann die entsprechende Menukarte angekoppelt
+ und das gewünschte Menu zur Ausführung gebracht werden. Hat 'mit
+ loeschen den Wert 'TRUE', so wird nach Verlassen der Menuebene die
+ Task automatisch gelöscht; bei 'FALSE' wird noch angefragt, ob die Task
+ gelöscht werden soll. Wird die Frage bejaht, wird gelöscht; sonst wird die
+ Task abgekoppelt (break) und kann durch 'continue' wieder angekoppelt
+ werden.
+ In der Task, in der das Kommando 'direktbefehl' gegeben wurde, sollte
+ nicht das Kommando 'monitor' gegeben werden, da dadurch auch die­
+ se Task zu einer Task gemacht würde, die sich direkt mit dem Menu
+ meldet und ggf. bei Verlassen des Menus automatisch gelöscht wird! Die
+ 'gib kommando:'-Ebene ist dadurch unzugänglich!
+
+
+#ib#ecke oben links#ie#
+TEXT PROC ecke oben links:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" links oben in der
+ Ecke (ω) ausgegeben wird.
+
+
+PROC ecke oben links (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" links oben in der Ecke ausgegeben werden soll.
+
+
+#ib#ecke oben rechts#ie#
+TEXT PROC ecke oben rechts:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" rechts oben in
+ der Ecke (�) ausgegeben wird.
+
+
+PROC ecke oben rechts (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" rechts oben in der Ecke ausgegeben werden soll.
+
+
+#ib#ecke unten links#ie#
+TEXT PROC ecke unten links:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" links unten in
+ der Ecke (�) ausgegeben wird.
+
+
+PROC ecke unten links (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" links unten in der Ecke ausgegeben werden soll.
+
+
+#ib#ecke unten rechts#ie#
+TEXT PROC ecke unten rechts:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" rechts unten in
+ der Ecke (�) ausgegeben wird.
+
+
+PROC ecke unten rechts (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" rechts unten in der Ecke ausgegeben werden soll.
+
+
+#ib#edit#ie#
+PROC edit (WINDOW VAR w, TEXT CONST dateiname):
+
+Zweck: Vergl. 'menuwindowedit'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuwindowedit' automatisch gesetzt wird.
+
+
+PROC edit (WINDOW VAR w, FILE VAR f):
+
+Zweck: Vergl. 'menuwindowedit'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuwindowedit' automatisch gesetzt wird.
+
+
+#ib#editget#ie#
+PROC editget (WINDOW VAR w, TEXT VAR text):#u#(*)#e#
+Zweck: Eingabe mit Editiermöglichkeit von 'text'. 'text' wird ausgegeben. Die
+ Eingabe wird mit RETURN beendet. 'text' darf höchstens 79 Zeichen
+ lang sein! Fehler: Text nicht initialisiert.
+
+
+PROC editget (WINDOW VAR w, TEXT VAR text,
+ INT CONST max laenge, scroll,
+ TEXT CONST sep, res,
+ TEXT VAR exit char):#u#(*)#e#
+Zweck: Wie oben. Über 'max laenge' kann festgelegt werden , wie lang der einzu­
+ gebende Text ('text') maximal sein darf. Über 'scroll' wird die Breite des
+ Zeilenfensters festgelegt, bevor gerollt wird (jedoch nicht über die rech­
+ te Fenstergrenze hinaus). Über 'sep' können Zeichen bestimmt werden,
+ bei denen die Eingabe (zusätzlich zu RETURN) beendet werden soll. Über
+ 'res' können reservierte Tasten angegeben werden. Wird eine 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.
+Fehler: Text nicht initialisiert.
+
+
+#ib#erase#ie#
+PROC erase (WINDOW VAR fenster):
+
+Zweck: Der durch 'fenster' beschrieben Bildschirmbereich wird gelöscht - ein­
+ schließlich des Rahmens, der den Fensterbereich umgibt (vergl. Sie auch
+ 'page')!
+
+
+#ib#erase footnote#ie#
+PROC erase footnote (WINDOW VAR fenster):
+
+Zweck: Die letzten beiden Zeilen in 'fenster' (in der die Fußnote nebst Trennlinie
+ eingetragen sind) werden gelöscht (vergl. Sie auch 'out footnote')!
+
+
+#ib#erase menunotice#ie#
+PROC erase menunotice:
+
+Zweck: Sofern zuvor mit 'write menunotice' (sehen Sie auch dort) eine Menunotiz
+ gesetzt wurde, wird diese gelöscht, ansonsten hat die Prozedur keine
+ Wirkung.
+
+
+#ib#get#ie#
+PROC get (WINDOW VAR w, TEXT CONST eingabe):
+
+Zweck: Vergl. 'menuwindowget'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuwindowget' automatisch gesetzt wird.
+
+
+PROC get (WINDOW VAR w, INT CONST wert):
+
+Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Der eingelesene Wert
+ wird anschließend entsprechend konvertiert.
+
+
+
+PROC get (WINDOW VAR w, REAL CONST wert):
+
+Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Der eingelesene Wert
+ wird anschließend entsprechend konvertiert.
+
+
+PROC get (WINDOW VAR w, TEXT CONST eingabe,
+ INT CONST laenge):
+
+Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Zusätzlich wird die
+ Eingabe beendet, wenn der eingegebene Text die Länge 'laenge' erreicht
+ hat.
+
+
+PROC get (WINDOW VAR w, TEXT CONST eingabe,
+ TEXT CONST separator):
+
+Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Zusätzlich werden
+ über 'separtor' die Zeichen festgelegt, die zusätzlich zu den Positionie­
+ rungszeichen die Eingabe beenden.
+
+
+#ib#get cursor#ie#
+PROC get cursor (WINDOW VAR w, INT VAR spalte,
+ zeile):
+
+Zweck: Vergl. 'get menuwindowcursor'. Hier wird nur zusätzlich das Fenster
+ festgelegt, das bei 'get menuwindowcursor' automatisch gesetzt wird.
+
+
+#ib#getline#ie#
+PROC getline (WINDOW VAR w, TEXT CONST eingabe):
+
+Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe). Nur wird hier die
+ Eingabe ausschließlich über die Positionierungstasten - nicht aber über
+ das Leerzeichen beendet.
+
+
+#ib#get menuwindowcursor#ie#
+PROC get menuwindowcursor (INT VAR spalte, zeile):
+
+Zweck: Mit der Prozedur wird die aktuelle Cursorposition innerhalb des Menu­
+ fensters erfragt.
+
+
+#ib#handle menu#ie#
+PROC handle menu (TEXT CONST menuname):
+
+Zweck: Bringt das in der angekoppelten Menukarte enthaltene Menu mit dem
+ Namen 'menuname' zur Ausführung, d.h. das entsprechende Menu wird
+ auf dem Bildschirm präsentiert und kann mit den üblichen Tastenfunk­
+ tionen gehandhabt werden.
+ (Anmerkung: Die Menufunktionen können natürlich nur dann ausge­
+ führt werden, wenn die zugehörigen Programme in der aktuellen Task
+ zuvor insertiert wurden - ansonsten erscheint auf dem Bildschirm jeweils
+ der Hinweis 'unbekanntes Kommando'!)
+Fehler: Das Menu 'menuname' ist nicht in der angekoppelten Menukarte!
+
+
+#ib#infix namen#ie#
+THESAURUS PROC infix namen (THESAURUS CONST thes,
+ TEXT CONST infix):
+
+Zweck: Die Prozedur liefert einen Thesaurus, in dem alle Namen enthalten sind,
+ die in 'thes' übergeben wurden und die den Wortbestandteil 'infix' enthal­
+ ten (gleichgültig an welcher Position).
+
+
+THESAURUS PROC infix namen (THESAURUS CONST thes,
+ INT CONST dateityp):
+
+Zweck: Die Prozedur liefert einen Thesaurus, in dem alle Dateinamen enthalten
+ sind, die in 'thes' übergeben wurden und die den Dateityp 'dateityp'
+ haben.
+
+
+THESAURUS PROC infix namen (THESAURUS CONST thes,
+ TEXT CONST infix,
+ INT CONST dateityp):
+
+ wirkt wie: infix namen (infix namen (thes, infix), dateityp)
+
+
+#ib#install menu#ie#
+PROC install menu (TEXT CONST menukartenname,
+ BOOL CONST mit emblem):
+
+Zweck: Mit diesem Befehl wird die Menukarte mit dem Namen 'menukarten­
+ name' aus der Task 'gs-MENUKARTEN' in die aktuelle Task kopiert. Die
+ Menukarte wird als unbenannter Datenraum an die Task gekoppelt. Der
+ benannte Datenraum wird gelöscht. Der Name der angekoppelten Menu­
+ karte wird vermerkt.
+ Stimmt der Name der angekoppelten Menukarte mit dem Namen der
+ angeforderten Menukarte überein, dann wird nicht erneut eine Kopie
+ angefordert, sondern auf der bereits angekoppelten Menukarte gearbeitet.
+ Hat 'mit emblem' den Wert 'TRUE', dann wird unser 'Software-Emblem'
+ während des Ankoppelvorgangs auf dem Bildschirm ausgegeben, bei
+ 'FALSE' nicht.
+Fehler: Die Menukarte 'menukartenname' existiert nicht in der Task
+ 'gs-MENUKARTEN'.
+
+
+PROC install menu (TEXT CONST menukartenname):
+
+ wirkt wie: install menu (TEXT CONST menukartenname, TRUE)
+
+
+#ib#invers#ie#
+TEXT PROC invers (TEXT CONST text):
+
+Zweck: Liefert den Text 'text' invers dargestellt. An den Text wird zuvor ein Leer­
+ zeichen angehängt.
+
+
+#ib#kreuz#ie#
+TEXT PROC kreuz:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "Kreuz" (̗)
+ ausgegeben wird.
+
+
+PROC kreuz (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" als "Kreuz" ausgegeben werden soll.
+
+
+#ib#line#ie#
+PROC line (WINDOW VAR w, INT CONST anzahl):
+
+Zweck: Vergl. 'menuwindowline'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuwindowline' automatisch gesetzt wird.
+
+
+PROC line (WINDOW VAR w):
+
+ wirkt wie: line (w, 1)
+
+
+#ib#menualternative#ie#
+INT PROC menualternative (TEXT CONST infotext,
+ auswahlliste,
+ zusatztasten,
+ INT CONST position,
+ BOOL CONST mit abbruch):
+
+Zweck: Mit der Prozedur können dem Benutzer innerhalb des Menubildschirms
+ mehrere Alternativen zur Entscheidung angeboten werden, von denen er
+ sich für eine entscheiden kann.
+ Auf dem Bildschirm wird innerhalb des Menus eine Box ausgegeben.
+ Boxbreite und -höhe werden vom System automatisch anhand des über­
+ gebenen 'infotext'es (bzw. der 'auswahlliste') festgelegt. Der in 'infotext'
+ übergebene Text wird innerhalb der Box angezeigt. Der Text muß den
+ gs-DIALOG-Syntax-Regeln (sehen Sie Kap. 5.13) entsprechen - er dient
+ ausschließlich der Information des Benutzers.
+ In der letzten Zeile der Box wird die 'auswahlliste' angeboten. Zwischen
+ jeder notierten Alternative muß in 'auswahlliste' der code "13" eingetra­
+ gen sein. In der Box werden zwischen den Alternativen je drei Leerzei­
+ chen eingefügt. Es können maximal 10 Alternativen angegeben werden,
+ die aber incl. der eingefügten Leerzeichen eine Gesamtbreite von 64
+ Zeichen nicht überschreiten dürfen. Über diese Liste erfolgt durch Posi­
+ tionierung und anschließendem <RETURN> die Entscheidung für eine
+ Alternative. Die Prozedur liefert dann als Zahlenwert die Position der
+ gewählten Alternative in der übergebenen Auswahlliste.
+ Über 'mit abbruch' wird festgelegt, ob die Alternativentscheidung durch
+ die Tastenfolge <ESC><h> abgebrochen werden kann oder nicht. Ist
+ das zulässig und geschehen, dann wird der Wert 0 geliefert.
+ Über 'zusatztasten' kann noch festgelegt werden, ob die Entscheidung
+ auch durch Tippen bestimmter Tasten angegeben werden kann. Sind hier
+ Zeichen angegeben und erfolgt die Entscheidung über das Tippen einer
+ zugelassenen Taste, dann wird die Position der getippten Taste in der
+ unter 'zusatztasten' übergebenen Zeichenkette ermittelt und der Wert 100
+ hinzuaddiert (sehen Sie dazu auch Kap. 5.7).
+ Nach der Entscheidung wird der Menubildschirm automatisch in den
+ Ausgangszustand versetzt.
+
+
+#ib#menuanswer#ie#
+TEXT PROC menuanswer (TEXT CONST infotext,
+ vorgabe,
+ INT CONST position):
+
+Zweck: Die Prozedur ermöglicht den Dialog mit dem Benutzer innerhalb des
+ Menus. Sie liefert einen vom Benutzer eingegebenen (bzw. modifizierten)
+ Text/Namen.
+ Auf dem Bildschirm wird innerhalb des Menus eine Box ausgegeben.
+ Boxbreite und -höhe werden vom System automatisch anhand des über­
+ gebenen 'infotext'es festgelegt. Der in 'infotext' übergebene Text wird
+ innerhalb der Box angezeigt. Der Text muß den gs-DIALOG-Syntax-Regeln
+ (sehen Sie Kap. 5.13) entsprechen.
+ In der letzten Zeile der ausgegebenen Box erscheint der Text "Eingabe:".
+ Über 'vorgabe' kann dem Benutzer ein Text zum Editieren angeboten
+ werden. Mit 'position' wird die relative Lage der Box innerhalb des Menu­
+ bildschirms festgelegt (1, 2, 3, 4, 5: sehen Sie dazu Kap. 5.12).
+ Die Eingabe kann durch <RETURN> abgeschlossen oder durch
+ <ESC><h> abgebrochen werden, in letzterem Falle wird niltext ("")
+ geliefert.
+ Der gelieferte Wert ist von führenden und folgenden Leerzeichen befreit
+ (compress). Es ist nicht möglich, den Namen 'break' einzugeben (sehen
+ Sie dazu Kap.5.1).
+
+
+#ib#menuanswerone#ie#
+TEXT PROC menuanswerone (TEXT CONST infotext,
+ vorgabe, THESAURUS CONST thesaurus,
+ TEXT CONST ueberschrift, hinweis,
+ BOOL CONST mit reinigung):
+
+Zweck: Die Prozedur ist aus den zwei Prozeduren 'menuanswer' und 'menuone'
+ zusammengesetzt (sehen Sie auch dort). In einer Box innerhalb des
+ Menus wird der 'infotext' ausgegeben und eine Eingabe erwartet; ggf.
+ kann ein Text in 'vorgabe' zum Editieren ausgegeben werden. Wird die
+ Eingabe mit <RETURN> abgeschlossen, wird der eingegebene Text
+ geliefert. Statt der Eingabe kann der Benutzer sich durch die Tastenfolge
+ <ESC><z> auch die in 'thesaurus' übergebenen Namen zur Auswahl
+ anbieten lassen. Wird ein Name angekreuzt, wird dieser geliefert; wird die
+ Auswahl durch <ESC><h> abgebrochen, wird niltext ("") geliefert.
+Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
+
+
+#ib#menuanswersome#ie#
+THESAURUS PROC menuanswersome (TEXT CONST
+ infotext, vorgabe,
+ THESAURUS CONST thesaurus,
+ TEXT CONST ueberschrift, hinweis,
+ BOOL CONST mit reinigung):
+
+Zweck: Die Prozedur ist aus den zwei Prozeduren 'menuanswer' und 'menusome'
+ zusammengesetzt (sehen Sie auch dort). In einer Box innerhalb des
+ Menus wird der 'infotext' ausgegeben und eine Eingabe erwartet; ggf.
+ kann ein Text in 'vorgabe' zum Editieren ausgegeben werden. Wird die
+ Eingabe mit <RETURN> abgeschlossen, wird der eingegebene Text in
+ einem Thesaurus geliefert. Statt der Eingabe kann der Benutzer sich
+ durch die Tastenfolge <ESC><z> auch die in 'thesaurus' übergebenen
+ Namen zur Auswahl anbieten lassen. Werden Namen angekreuzt, werden
+ diese in einem Thesaurus geliefert; wird die Auswahl durch
+ <ESC><h> abgebrochen, wird ein leerer Thesaurus geliefert.
+Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
+
+
+#ib#menu archiv checken#ie#
+PROC menu archiv checken:
+
+Zweck: Über diese Prozedur kann das "Checken" von Dateien auf dem Archiv in
+ das Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbe­
+ dingt Kap. 6.1!
+
+
+#ib#menu archiv grundeinstellung#ie#
+PROC menu archiv grundeinstellung (INT CONST ort):
+
+Zweck: Hierüber wird die Grundeinstellung des Archivpakets vorgenommen: Dazu
+ wird als Zieltask das Archiv der eigenen Station eingestellt. Dieses wird
+ auch über eine Menunotiz im Menu angezeigt. Die entsprechenden Menu­
+ punkte werden aktiviert bzw. deaktiviert. Sehen Sie dazu unbedingt Kap.
+ 6.1!
+ Über 'ort' wird festgelegt, an welcher Stelle innerhalb des Menus die
+ Menunotiz zur Anzeige der Zieltask (und ggf. des Archivnamens) ausge­
+ geben wird (sehen Sie dazu Kap. 5.12).
+
+
+#ib#menu archiv holen#ie#
+PROC menu archiv holen:
+
+Zweck: Über diese Prozedur kann das Holen von Dateien vom Archiv in das
+ Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbedingt
+ Kap. 6.1!
+
+
+#ib#menu archiv initialisieren#ie#
+PROC menu archiv initialisieren:
+
+Zweck: Über diese Prozedur kann das Formatieren/ Initialisieren eines Archivs in
+ das Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbe­
+ dingt Kap. 6.1!
+
+
+#ib#menu archiv loeschen#ie#
+PROC menu archiv loeschen:
+
+Zweck: Über diese Prozedur kann das Löschen von Dateien auf dem Archiv in das
+ Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbedingt
+ Kap. 6.1!
+
+
+#ib#menu archiv neue diskette#ie#
+PROC menu archiv neue diskette:
+
+Zweck: Über diese Prozedur kann das Anmelden einer neuen Diskette bei schon
+ reserviertem Archiv in das Archiv-Pull-Down-Menu eingebunden werden.
+ Sehen Sie dazu unbedingt Kap. 6.1!
+
+
+#ib#menu archiv reservieren#ie#
+PROC menu archiv reservieren:
+
+Zweck: Über diese Prozedur kann die Archivreservierung in das Archiv-Pull-
+ Down-Menu eingebunden werden. Sehen Sie dazu unbedingt Kap. 6.1!
+
+
+#ib#menu archiv reservierung aufgeben#ie#
+PROC menu archiv reservierung aufgeben:
+
+Zweck: Über diese Prozedur kann eine bestehende Archivreservierung aus dem
+ Menu heraus aufgegeben werden. Sehen Sie dazu unbedingt Kap. 6.1!
+
+
+#ib#menu archiv schreibcheck#ie#
+PROC menu archiv schreibcheck:
+
+Zweck: Über diese Prozedur kann das Schreiben von Dateien auf das Archiv und
+ das sich automatisch daran anschließende "Checken" der zuvor geschrie­
+ benen Dateien in das Archiv-Pull-Down-Menu eingebunden werden.
+ Sehen Sie dazu unbedingt Kap. 6.1!
+
+
+#ib#menu archiv schreiben#ie#
+PROC menu archiv schreiben:
+
+Zweck: Über diese Prozedur kann das Schreiben von Dateien auf das Archiv in
+ das Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbe­
+ dingt Kap. 6.1!
+
+
+#ib#menu archiv verzeichnis#ie#
+PROC menu archiv verzeichnis:
+
+Zweck: Über diese Prozedur kann die Ausgabe eines Inhaltsverzeichnisses des
+ Archivs auf dem Bildschirm in das Archiv-Pull-Down-Menu eingebunden
+ werden. Sehen Sie dazu unbedingt Kap. 6.1!
+
+
+#ib#menu archiv verzeichnis drucken#ie#
+PROC menu archiv verzeichnis drucken:
+
+Zweck: Über diese Prozedur kann die Ausgabe eines Inhaltsverzeichnisses des
+ Archivs über den Drucker in das Archiv-Pull-Down-Menu eingebunden
+ werden. Sehen Sie dazu unbedingt Kap. 6.1!
+
+
+#ib#menu archiv zieltask einstellen#ie#
+PROC menu archiv zieltask einstellen:
+
+Zweck: Über diese Prozedur kann die Festlegung der Zieltask, mit der die Inter­
+ taskkommunikation abgewickelt werden soll, in das Archiv-Pull-Down-
+ Menu eingebunden werden. Sehen Sie dazu unbedingt Kap. 6.1!
+
+
+#ib#menu dateien aufraeumen#ie#
+PROC menu dateien aufraeumen:
+
+Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
+ Datei erfragt, die aufgeräumt, d.h. reorganisiert werden soll. Existiert
+ keine Datei mit dem angegebenen Namen, so erfolgt ein Hinweis darauf.
+ Statt der Eingabe des Dateinamens kann auch die Tastenfolge
+ <ESC><z> getippt werden. Daraufhin werden alle Dateinamen der
+ Task zur Auswahl angeboten. Hier können die gewünschten Dateinamen
+ angekreuzt werden. Anschließend werden die angekreuzten Dateien
+ reorganisiert. Der Vorgang wird auf dem Bildschirm protokolliert. Am
+ Ende des Vorgangs wird der Menubildschirm automatisch regeneriert. Es
+ können natürlich nur Dateien des Typs 1003 (Textfiles) reorganisiert
+ werden; sofern andere Dateien ausgewählt werden, erfolgt ein Hinweis
+ darauf.
+
+
+#ib#menu dateien drucken#ie#
+PROC menu dateien drucken:
+
+Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus (auch bei
+ geschachtelten(!)) der Name der Datei erfragt, die gedruckt werden soll.
+ Anschließend wird die Datei mit dem angegebenen Namen gedruckt.
+ Existiert keine Datei mit dem angegebenen Namen, so erfolgt ein Hinweis
+ darauf.
+ Statt der Eingabe des Dateinamens kann auch die Tastenfolge
+ <ESC><z> getippt werden. Daraufhin werden alle Dateinamen der
+ Task zur Auswahl angeboten. Alle angekreuzten Dateien werden an­
+ schließend gedruckt. Der Vorgang wird auf dem Bildschirm protokolliert.
+ Am Ende wird der Menubildschirm automatisch regeneriert.
+
+
+#ib#menu dateien kopieren#ie#
+PROC menu dateien kopieren:
+
+Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
+ Datei erfragt, die kopiert werden soll. Existiert keine Datei mit dem
+ angegebenen Namen, so erfolgt ein Hinweis darauf. Statt der Eingabe des
+ Dateinamens kann auch die Tastenfolge <ESC><z> getippt werden.
+ Daraufhin werden alle Dateinamen der Task zur Auswahl angeboten. Hier
+ kann ein Dateiname angekreuzt werden. Nun wird der Name erfragt, den
+ die Kopie erhalten soll. Existiert der Name bereits, erfolgt ein Hinweis
+ darauf, sonst wird die Datei kopiert. Der Menubildschirm wird automa­
+ tisch regeneriert.
+
+
+#ib#menu dateien loeschen#ie#
+PROC menu dateien loeschen:
+
+Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
+ Datei erfragt, die gelöscht werden soll. Anschließend wird die Datei mit
+ dem angegebenen Namen gelöscht, sofern die Sicherheitsabfrage zum
+ Löschen mit 'Ja' beantwortet wurde. Existiert keine Datei mit dem ange­
+ gebenen Namen, so erfolgt ein Hinweis darauf. Statt der Eingabe des
+ Dateinamens kann auch die Tastenfolge <ESC><z> getippt werden.
+ Daraufhin werden alle Dateinamen der Task zur Auswahl angeboten. Alle
+ angekreuzten Dateien werden anschließend (nach jeweiliger Sicherheits­
+ anfrage) gelöscht. Der Vorgang wird auf dem Bildschirm protokolliert. Am
+ Ende wird der Menubildschirm automatisch regeneriert.
+
+
+#ib#menu dateien speicherplatz#ie#
+PROC menu dateien speicherplatz:
+
+Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
+ Datei erfragt, deren Speicherplatz ermittelt werden soll. Existiert keine
+ Datei mit dem angegebenen Namen, so erfolgt ein Hinweis darauf. Statt
+ der Eingabe des Dateinamens kann auch die Tastenfolge <ESC><z>
+ getippt werden. Daraufhin werden alle Dateinamen der Task zur Aus­
+ wahl angeboten. Hier können die gewünschten Dateinamen angekreuzt
+ werden. Anschließend wird der Speicherplatz der angekreuzten Datei(en)
+ ermittelt und im Menufenster ausgegeben. Im Anschluß an die Anzeige
+ wird der Menubildschirm automatisch regeneriert.
+
+
+#ib#menu dateien umbenennen#ie#
+PROC menu dateien umbenennen:
+
+Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
+ Datei erfragt, die umbenannt werden soll. Existiert keine Datei mit dem
+ angegebenen Namen, so erfolgt ein Hinweis darauf. Statt der Eingabe des
+ Dateinamens kann auch die Tastenfolge <ESC><z> getippt werden.
+ Daraufhin werden alle Dateinamen der Task zur Auswahl angeboten. Hier
+ kann ein Dateiname angekreuzt werden. Nun wird der Name erfragt, den
+ die Datei anschließend erhalten soll. Existiert der Name bereits, erfolgt ein
+ Hinweis darauf, sonst wird die Datei umbenannt. Der Menubildschirm
+ wird automatisch regeneriert.
+
+
+#ib#menu dateien verzeichnis#ie#
+PROC menu dateien verzeichnis
+
+Zweck: Mit der Prozedur kann innerhalb des aktuellen Menus ein Verzeichnis der
+ Dateien der eigenen Task ausgegeben werden. Nach Verlassen des Ver­
+ zeichnisses durch <ESC><q> wird der Menubildschirm automatisch
+ regeneriert.
+
+
+#ib#menufootnote#ie#
+PROC menufootnote (TEXT CONST fussnotentext):
+
+Zweck: Mit der Prozedur kann der Text in der "Fußzeile" des aktuellen Menubild­
+ schirms (zumeist Hinweise an den Benutzer) ersetzt werden. Der vorhan­
+ dene Text wird gelöscht und stattdessen 'fussnotentext' notiert. Der Text
+ bleibt so lange erhalten, bis er durch eine andere selbstgesetzte Fußnote
+ ('menufootnote') oder durch die alte vom System gesetzte Fußnote ('old
+ menufootnote'; sehen Sie auch dort) überschrieben wird. Sofern
+ gs-DIALOG-Prozeduren aufgerufen werden, die selbst Ausgaben in der
+ Fußzeile machen, wird die durch 'menufootnote' gesetzte Fußnote eben­
+ falls überschrieben. Wenn der Text länger als die aktuelle Menubild­
+ schirmbreite ist,wird der Text abgeschnitten. Damit der Text auch in
+ geschachtelten Menus vollständig ausgegeben werden kann, sollte er nicht
+ länger als 69 Zeichen sein.
+
+
+#ib#menufunktion#ie#
+PROC menufunktion (TEXT CONST kuerzel,
+ punktbezeichnung,
+ prozedurname,
+ infotext):
+
+Zweck: Der Befehl wird für die Generierung von Menukarten benötigt. Mit diesem
+ Befehl wird in das aktuell geöffnete Menu unter dem aktuellen Oberbe­
+ griff eine Verarbeitungsfunktion eingetragen. Mit 'kuerzel' wird die Taste
+ bestimmt, über die die Verarbeitungsfunktion direkt aktiviert werden
+ kann. 'kuerzel' muß innerhalb eines Pull-Down-Menus eindeutig gewählt
+ sein! Unter 'punktbezeichnung' wird der Text eingetragen, der im Pull-
+ Down-Menu ausgegeben werden soll. In 'prozedurname' steht der Name
+ der Prozedur (als Text(!)), die bei Aktivierung des Menupunktes ausge­
+ führt werden soll. In 'infotext' steht der Text, der als Information zu
+ diesem Menupunkt bei Tippen der <?>-Taste angezeigt werden soll.
+Fehler: Menupunkt-Kürzel ist länger als ein Zeichen.
+ Menupunktkürzel kommt mehrfach vor.
+ Menupunktbezeichnung ist zu lang (> 60 Zeichen).
+ Zu viele Menupunkte in einem Pull-Down-Menu (> 15).
+
+
+#ib#menuinfo#ie#
+PROC menuinfo (TEXT CONST infotext, INT CONST
+ position, timelimit):
+
+Zweck: Die Prozedur ermöglicht es, innerhalb des Menus einen Hinweis (Infor­
+ mationstext) auszugeben. Im Menubildschirm erscheint der 'infotext' in
+ einer Box. Boxbreite und -höhe werden vom System automatisch anhand
+ des übergebenen 'infotext'es festgelegt. 'infotext' muß den gs-DIALOG-
+ Syntax-Regeln (sehen Sie Kap. 5.13) entsprechen. Mit 'position' wird die
+ relative Lage der Box innerhalb des Menubildschirms festgelegt (1, 2, 3,
+ 4, 5: sehen Sie dazu Kap. 5.12). Mit 'timelimit' kann die Zeitdauer (in
+ Zehntelsekunden) festgelegt werden, für die der Hinweis höchstens er­
+ scheint. Die Anzeige kann vom Benutzer durch Tippen einer beliebigen
+ Taste abgebrochen werden.
+
+
+PROC menuinfo (TEXT CONST infotext,
+ INT CONST position):
+
+ wirkt wie: menuinfo (infotext, position, maxint)
+
+
+PROC menuinfo (TEXT CONST infotext):
+
+ wirkt wie: menuinfo (infotext, 5)
+
+
+#ib#menukartenname#ie#
+TEXT PROC menukartenname:#u#(*)#e#
+Zweck: Liefert den Namen der zur zeit angekoppelten Menukarte. Ist keine
+ Menukarte angekoppelt, wird niltext ("") geliefert.
+
+
+#ib#menuno#ie#
+BOOL PROC menuno (TEXT CONST frage,
+ INT CONST position):
+
+ wirkt wie: NOT menuyes (frage, position)
+
+
+#ib#menuone#ie#
+TEXT PROC menuone (THESAURUS CONST thesaurus,
+ TEXT CONST ueberschrift,
+ hinweis,
+ BOOL CONST mit reinigung):
+
+Zweck: Durch die Prozedur werden dem Benutzer innerhalb des Menubild­
+ schirms Namen zur Auswahl angeboten. Nach Ankreuzen eines Namens
+ wird die Auswahl automatisch verlassen. Der angekreuzte Name wird
+ geliefert. Wird die Auswahl durch <ESC><h> abgebrochen, so wird
+ niltext ("") geliefert. In 'thesaurus' wird ein THESAURUS mit den Namen
+ übergeben, die zur Auswahl angeboten werden sollen (sehen Sie dazu
+ auch Kap. 5.14). Die beiden Texte 'ueberschrift' und 'hinweis' erscheinen
+ zur Kennzeichnung im Kopf der Auswahlliste: 'ueberschrift' zentriert und
+ invers dargestellt, 'hinweis' nur zentriert. Hat 'mit reinigung' den Wert
+ TRUE, so wird nach der Auswahl der Menubildschirm automatisch wie­
+ deraufgebaut, bei FALSE wird darauf verzichtet.
+Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
+
+
+#ib#menusome#ie#
+THESAURUS PROC menusome (THESAURUS CONST
+ thesaurus,
+ TEXT CONST ueberschrift,
+ hinweis,
+ BOOL CONST mit reinigung):
+
+Zweck: Durch die Prozedur werden dem Benutzer innerhalb des Menubild­
+ schirms Namen zur Auswahl angeboten. Die Auswahl kann durch die
+ Tastenfolge <ESC><q> verlassen werden. Der/ die angekreuzte(n)
+ Name(n) wird/werden in einem Thesaurus geliefert. Wird die Auswahl
+ durch die Tastenfolge <ESC><h> abgebrochen oder wurde kein Name
+ angekreuzt, dann wird ein leerer Thesaurus geliefert. In 'thesaurus' wird
+ ein Thesaurus mit den Namen übergeben, die zur Auswahl angeboten
+ werden sollen (sehen Sie dazu auch Kap. 5.14). Die beiden Texte
+ 'ueberschrift' und 'hinweis' erscheinen zur Kennzeichnung im Kopf der
+ Auswahlliste: 'ueberschrift' zentriert und invers dargestellt, 'hinweis' nur
+ zentriert. Hat 'mit reinigung' den Wert TRUE, so wird nach der Auswahl
+ der Menubildschirm automatisch wiederaufgebaut, bei FALSE wird darauf
+ verzichtet.
+Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
+
+
+#ib#menuwindowcenter#ie#
+TEXT PROC menuwindowcenter (TEXT CONST text):
+
+Zweck: Die Prozedur liefert einen Text, der so lang ist, wie das aktuelle Menufen­
+ ster breit ist. Dazu wird 'text' so mit Leerzeichen "ummantelt" daß 'text'
+ etwa in der Mitte zu stehen kommt. Steht der Cursor bei Ausgabe dieses
+ Textes am Anfang der Zeile, erscheint der Text zentriert in der Zeile
+ (vorhandene Zeileninhalte werden dadurch überschrieben (der Cursor
+ steht dann auf dem rechten Fensterrand!).
+
+
+#ib#menuwindowcursor#ie#
+PROC menuwindowcursor (INT CONST spalte, zeile):
+
+Zweck: Mit diesem Befehl kann der Cursor innerhalb des aktuellen Menufensters
+ positioniert werden. Ein "normales" Menufenster ist 77 Zeichen breit und
+ 20 Zeichen hoch; ein Menufenster in einem geschachtelten Menu ist 71
+ Zeichen breit und 16 Zeichen hoch). (Sehen Sie auch die Informations­
+ prozeduren 'get menuwindowcursor' und 'remaining menuwindowlines').
+Fehler: Wird außerhalb des aktuellen Menufensters positioniert, wird der Fenster­
+ inhalt gelöscht und die Fensterposition (1,1) angenommen.
+
+
+#ib#menuwindowedit#ie#
+PROC menuwindowedit (TEXT CONST dateiname):
+
+Zweck: Durch den Befehl wird innerhalb des Menus ein umrandetes Fenster
+ geöffnet und die Datei mit dem Namen 'dateiname' zum Editieren ausge­
+ geben. Auf die Größe des Menufensters kann kein Einfluß genommen
+ werden - sie wird selbständig vom System gesetzt ("normales" Menu: 77
+ Zeichen breit und 20 Zeichen hoch; geschachteltes Menu 71 Zeichen
+ breit und 16 Zeichen hoch).
+Fehler: Die Datei mit dem Namen 'dateiname' existiert nicht.
+
+
+PROC menuwindowedit (FILE VAR f):
+
+Zweck: Vergl. obige 'menuwindowedit'-Prozedur. Die Datei 'f' muß mit der Verar­
+ beitungsart 'modify' assoziiert worden sein.
+
+
+#ib#menuwindoweditget#ie#
+PROC menuwindoweditget (TEXT VAR text):#u#(*)#e#
+Zweck: Vergl. 'menuwindowget (TEXT VAR text)' Zusätzlich kann hier in 'text' ein
+ Text zum Editieren vorgegeben werden.
+Fehler: Text nicht initialisiert.
+
+
+#ib#menuwindowget#ie#
+PROC menuwindowget (TEXT VAR text):
+
+Zweck: Mit der Prozedur können Texte innerhalb des Menufensters eingelesen
+ werden (INTEGER- und REAL-Werte müssen ggf. "von Hand" konvertiert
+ werden). Die Eingabe wird durch <RETURN> abgeschlossen. Es muß
+ mindestens ein Zeichen (ungleich Leerzeichen) eingegeben werden. Von
+ der Eingabe werden die führenden Leerzeichen abgeschnitten. Ist der
+ einzugebende Text länger als die noch verbleibende Restzeile, so wird der
+ Text in der Restzeile gescrollt. Sind in der aktuellen Zeile weniger als 7
+ Zeichenpositionen für die Eingabe vorhanden, so wird automatisch für die
+ Eingabe an den Anfang der nächsten Zeile positioniert.
+
+
+#ib#menuwindowline#ie#
+PROC menuwindowline (INT CONST anzahl):
+
+Zweck: Die Prozedur 'menuwindowline' hat innerhalb des Menubildschirms eine
+ ähnliche Wirkung wie die Prozedur 'line' auf dem Gesamtbildschirm. Es
+ werden 'anzahl' Zeilenwechsel vorgenommen. Wird allerdings die untere
+ Grenze des Menubildschirms überschritten, dann rollt (scrollt) der Bild­
+ schirm nicht die entsprechende Anzahl Zeilen nach oben, statt dessen
+ wird der Fensterinhalt gelöscht und die Operation oben im Fenster fort­
+ gesetzt.
+
+
+PROC menuwindowline:
+
+ wirkt wie: menuwindowline (1)
+
+
+#ib#menuwindowout#ie#
+PROC menuwindowout (TEXT CONST text):
+
+Zweck: Mit der Prozedur können innerhalb des aktuellen Menufensters Texte
+ ausgegeben werden. Sollen INTEGER- oder REAL-Werte ausgegeben wer­
+ den, müssen diese zunächst in Texte konvertiert werden. Ist der Text
+ länger als die verbleibende Restzeile innerhalb des aktuellen Menufen­
+ sters, so wird der Text bis zum Fensterende (rechts) ausgegeben und die
+ Ausgabe am Anfang der nächsten Zeile fortgesetzt. Sobald die letzte Posi­
+ tion des aktuellen Menufensters (unten rechts in der Fensterecke) be­
+ schrieben wurde, wird der Fensterinhalt gelöscht und die Ausgabe an der
+ Position (1,1) des Fensters fortgesetzt.
+
+
+#ib#menuwindowpage#ie#
+PROC menuwindowpage:
+
+Zweck: Durch den Befehl 'menuwindowpage' wird der Inhalt des Fensters inner­
+ halb des aktuellen Menus gelöscht (das "Menufenster") (vergleichen Sie
+ auch 'show menuwindow'). Der Rahmen des Fensters (der bei 'show
+ menuwindow' ausgegeben wurde), bleibt bestehen, da er nicht mit zum
+ eigentlichen Fenster gehört. Durch den Befehl wird der Menubildschirm
+ nicht rekonstruiert! Soll das Fenster geschlossen werden, ist der Befehl
+ 'regenerate menuscreen' zu geben.
+
+
+#ib#menuwindowshow#ie#
+PROC menuwindowshow (TEXT CONST dateiname):
+
+Zweck: Vergl. 'menuwindowedit'-Prozedur. Die Datei 'dateiname' kann nicht
+ schreibend verändert werden.
+
+
+PROC menuwindowshow (FILE VAR f):
+
+Zweck: Vergl. obige 'menuwindowshow'-Prozedur. Die Datei 'f' muß mit der
+ Verarbeitungsart 'modify' assoziiert worden sein.
+
+
+#ib#menuwindowstop#ie#
+PROC menuwindowstop (INT CONST zeilenzahl):
+
+Zweck: Innerhalb des Menufensters werden 'zeilenzahl' Zeilenwechsel vorge­
+ nommen und der Text " Zum Weitermachen bitte irgendeine Taste tip­
+ pen!" ausgegeben. Danach wird so lange gewartet, bis eine Taste getippt
+ wird.
+
+
+PROC menuwindowstop:
+
+ wirkt wie: menuwindowstop (2)
+
+
+#ib#menuyes#ie#
+BOOL PROC menuyes (TEXT CONST frage,
+ INT CONST position):
+
+Zweck: Die Prozedur dient dazu, innerhalb des Menus eine Ja/Nein-Entscheidung
+ des Benutzers einzuholen. Im Gegensatz zur Standardprozedur 'yes'
+ arbeitet diese Prozedur unabhängig davon, ob der Kommandodialog ein-
+ oder ausgeschaltet ist. Auf dem Bildschirm wird innerhalb des Menus eine
+ Box ausgegeben. Boxbreite und -höhe werden vom System automatisch
+ anhand der übergebenen 'frage' festgelegt. Der in 'frage' übergebene Text
+ wird um ein Fragezeichen (?) ergänzt und innerhalb der Box angezeigt.
+ Der Text muß den gs-DIALOG-Syntax-Regeln (sehen Sie Kap. 5.13)
+ entsprechen. In der letzten Zeile der ausgegebenen Box erscheint der Text
+ "Ja    Nein". Die Prozedur 'menuyes' liefert TRUE, wenn mit 'Ja' geantwor­
+ tet wurde und FALSE, wenn mit 'Nein' geantwortet wurde (durch Tippen
+ der Anfangsbuchstaben oder Positionierung auf die Antwort und ab­
+ schließendes <RETURN>). Der Menubildschirm wird automatisch
+ regeneriert. Mit 'position' wird die relative Lage der Box innerhalb des
+ Menubildschirms festgelegt (1, 2, 3, 4, 5: sehen Sie dazu Kap. 5.12).
+
+
+#ib#no#ie#
+BOOL PROC no (WINDOW VAR w, TEXT CONST frage):
+
+ wirkt wie: NOT yes (w, frage).
+
+
+#ib#not empty#ie#
+BOOL PROC not empty (THESAURUS CONST thes):
+
+Zweck: Dient der Prüfung, ob ein Thesaurus Namen enthält oder nicht. Die
+ Prozedur liefert TRUE, wenn Namen in 'thes' enthalten sind, sonst FALSE.
+
+
+#ib#oberbegriff#ie#
+PROC oberbegriff (TEXT CONST punktname,
+ startprocname,
+ leaveprocname):
+
+Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Mit diesem
+ Befehl wird die Bezeichnung 'punktname' in die Kopfzeile des aktuell
+ geöffneten Menus eingetragen. Die in 'startprocname' übergebene Proze­
+ dur wird ausgeführt, bevor das zugehörige Pull-Down-Menu auf dem
+ Bildschirm "ausgeklappt" wird; die in 'leaveprocname' übergebene Pro­
+ zedur, wenn in ein anderes Pull-Down-Menu gewechselt wird (beachten
+ Sie, daß die Prozedurnamen als Texte(!) übergeben werden).
+Fehler: Menukarte noch nicht geöffnet ('oeffne menukarte' fehlt).
+ Menu noch nicht geöffnet ('oeffne menu' fehlt).
+ Zu viele Oberbegriffe im Menu (> 10).
+ Die Kopfzeile ist zu lang (> 70 Zeichen).
+
+
+PROC oberbegriff (TEXT CONST punktname):
+
+ wirkt wie: oberbegriff (punktname, "", "")
+
+
+#ib#oeffne menu#ie#
+PROC oeffne menu (TEXT CONST menuname,
+ einstiegsproc,
+ ausstiegsproc, infotext1,
+ infotext2, infotext3):
+
+Zweck: Der Befehl wird für die Generierung von Menukarten benötigt. Durch den
+ Befehl wird innerhalb der Menukarte ein Menu mit dem Namen
+ 'menuname' angelegt. Über diesen Namen kann das Menu auch später
+ angesprochen werden (mit 'handle menu'). Die unter 'einstiegsproc'
+ übergebene Prozedur wird bei der Aktivierung des Menus ausgeführt, die
+ unter 'ausstiegsproc' übergebene Prozedur, wenn das Menu (mit
+ <ESC><q>) verlassen wird (beachten Sie, daß die Prozedurnamen als
+ Texte(!) übergeben werden!). In 'infotext1', 'infotext2' und 'infotext3'
+ können Hinweise eingetragen werden, die bei Erscheinen des Menus auf
+ dem Bildschirm für kurze Zeit in einer Box rechts unten angezeigt wer­
+ den. Die Erstellung der Boxtexte ist an genaue Regeln gebunden (sehen
+ Sie dazu Kap. 5.13). Sehen Sie auch bei 'schliesse menu'.
+
+
+PROC oeffne menu (TEXT CONST menuname,
+ einstiegsproc,
+ ausstiegsproc):
+
+ wirkt wie: oeffne menu (menuname, einstiegsproc,
+ ausstiegsproc, "", "", "")
+
+
+PROC oeffne menu (TEXT CONST menuname):
+
+ wirkt wie: oeffne menu (menuname, "", "")
+
+
+#ib#oeffne menukarte#ie#
+PROC oeffne menukarte (TEXT CONST menukartenname):
+
+Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Ein Pro­
+ gramm zur Erstellung einer Menukarte muß immer mit diesem Befehl
+ beginnen. Durch den Befehl wird ein Datenraum mit dem Namen
+ 'gs-MENUKARTE:menukartenname' eingerichtet; der Wortbestandteil
+ 'gs-MENUKARTE:' wird dabei automatisch vor den angegebenen Namen
+ gesetzt (sehen Sie auch 'schliesse menukarte').
+Fehler: Eine Menukarte mit dem angegebenen Namen existiert bereits in der
+ Task. Bei der Generierung wird dann angefragt, ob die alte Menukarte
+ gelöscht werden darf.
+
+
+#ib#ohne praefix#ie#
+THESAURUS PROC ohne praefix (THESAURUS CONST thes,
+ TEXT CONST praefix):
+
+Zweck: Liefert in einem Thesaurus alle Namen aus dem übergebenen Thesaurus
+ 'thes', die mit dem Wortbestandteil 'praefix' beginnen. Bei den gelie­
+ ferten Namen ist dieser führende Wortbestandteil entfernt.
+
+
+#ib#old menufootnote#ie#
+PROC old menufootnote:
+
+Zweck: Der aktuelle Text in der Fußzeile des aktuellen Menubildschirms wird
+ durch den hier zuletzt vom System gesetzten Text überschrieben. Die
+ Prozedur wird benutzt, um eine selbstgesetzte Fußnote (sehen Sie auch
+ 'write menunotice') zu löschen.
+
+
+#ib#out#ie#
+PROC out (WINDOW VAR w, TEXT CONST text):
+
+Zweck: Vergl. 'menuwindowout'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuwindowout' automatisch gesetzt wird.
+
+
+#ib#out frame#ie#
+PROC out frame (WINDOW VAR fenster):
+
+Zweck: Um den durch 'fenster' angegebenen Bildschirmbereich wird ein Rahmen
+ gezogen.
+
+
+#ib#out footnote#ie#
+PROC out footnote (WINDOW VAR fenster,
+ TEXT CONST textzeile):
+
+Zweck: In der untersten Zeile des Fensters 'fenster' wird 'textzeile' ausgegeben, in
+ der vorletzten Zeile eine Trennzeile. Sehen Sie auch 'erase footnote'.
+
+
+#ib#page#ie#
+PROC page (WINDOW VAR fenster,
+ BOOL CONST mit rahmen):
+
+Zweck: Der durch 'fenster' beschriebene Fensterbereich wird gelöscht. Hat 'mit
+ rahmen' den Wert TRUE, wird der Rahmenbereich ebenfalls gelöscht.
+
+
+PROC page (WINDOW VAR fenster):
+
+ wirkt wie: page (fenster, FALSE).
+
+
+#ib#put#ie#
+PROC put (WINDOW VAR w, TEXT CONST text):
+
+ wirkt wie: out (w, text + " ")
+
+
+PROC put (WINDOW VAR w, INT CONST zahl):
+
+ wirkt wie: put (w, text (zahl))
+
+
+PROC put (WINDOW VAR w, REAL CONST zahl):
+
+ wirkt wie: put (w, text (zahl))
+
+
+#ib#putline#ie#
+PROC putline (WINDOW VAR w, TEXT CONST text):
+
+ wirkt wie: put (w, text); line (w)
+
+
+#ib#regenerate menuscreen#ie#
+PROC regenerate menuscreen:
+
+Zweck: Der Befehl wird verwendet, um den Menubildschirm (z.B. nach der
+ Nutzung für anwendungsbezogene Ausgaben) in seinem letzten Zustand
+ zu reproduzieren. Der Bildschirm wird gelöscht. Anschließend wird der
+ aktuelle Menubildschirm vollständig neu aufgebaut - auch bei geschach­
+ telten Menus. (sehen Sie auch 'refresh submenu')
+
+
+#ib#refresh submenu#ie#
+PROC refresh submenu:
+
+Zweck: Der Befehl dient dazu, das aktuelle Pull-Down-Menu (z.B. nach Über­
+ schreiben) und ggf. eine gesetzte Menunotiz erneut auf den Bildschirm zu
+ schreiben. Betroffen ist nur der Bereich zwischen den Trennlinien der
+ Kopf- und Fußzeile. Für das vorausgehende Löschen verwendeter Bild­
+ schirmbereich ist der Programmierer verantwortlich. Im Gegensatz zu
+ 'regenerate menuscreen' findet hier kein kompletter Bildschirmaufbau
+ statt. Wenn möglich, dann ist dieser Befehl dem Befehl 'regenerate
+ menuscreen' wegen des geringeren Zeitaufwandes vorzuziehen.
+
+
+#ib#remaining lines#ie#
+INT PROC remaining lines (WINDOW VAR w):
+
+Zweck: Die Prozedur liefert die Anzahl der Zeilen im Fenster 'w', die noch
+ zwischen Cursor und unterer Fenstergrenze vorhanden sind.
+
+
+#ib#remaining menuwindowlines#ie#
+INT PROC remaining menuwindowlines
+
+Zweck: Die Prozedur liefert die Anzahl der Zeilen im aktuellen Menufenster, die
+ noch zwischen Cursor und unterer Fenstergrenze vorhanden sind.
+
+
+#ib#reset dialog#ie#
+PROC reset dialog:
+
+Zweck: Das Menusystem wird in den Anfangszustand versetzt. (Keine Menukarte
+ angekoppelt; Anzahl der geöffneten Menus: 0)
+
+
+#ib#schliesse menu#ie#
+PROC schliesse menu:
+
+Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Durch den
+ Befehl wird ein Menu in einer Menukarte abgeschlossen (sehen Sie auch
+ 'oeffne menu')
+
+
+#ib#schliesse menukarte#ie#
+PROC schliesse menukarte
+
+Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Durch den
+ Befehl wird eine Menukarte abgeschlossen (sehen Sie auch 'oeffne
+ menukarte')
+
+
+#ib#senkrecht#ie#
+TEXT PROC senkrecht:
+
+ Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als senkrechter
+ Strich (�) ausgegeben wird.
+
+
+PROC senkrecht (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" als senkrechter Strich ausgegeben werden soll.
+
+
+#ib#show#ie#
+PROC show (WINDOW VAR fenster):
+
+Zweck: Das Fenster 'fenster' wird auf dem Bildschirm angezeigt (das Fenster
+ muß zuvor durch 'window' initialisiert worden sein). Um den angegebe­
+ nen Fensterbereich wird automatisch ein Rahmen gezogen. Der Rahmen
+ gehört nicht zum Fenster dazu! (Soll das Fenster ohne Rahmen ausgege­
+ ben werden, dann muß der Befehl 'page' verwendet werden.) Der Bereich
+ innerhalb des Rahmens (Fensterbereich) wird gelöscht.
+
+
+#ib#show#ie#
+PROC show (WINDOW VAR w, TEXT CONST dateiname):
+
+Zweck: Vergl. 'menuwindowshow'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuwindowshow' automatisch gesetzt wird.
+
+
+PROC show (WINDOW VAR w, FILE VAR f):
+
+Zweck: Vergl. 'menuwindowshow'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuwindowshow' automatisch gesetzt wird.
+
+
+#ib#show menuwindow#ie#
+PROC show menuwindow:
+
+Zweck: Durch den Befehl 'show menuwindow' wird ein entsprechender Rahmen
+ innerhalb des Menubildschirms ausgegeben und der Bereich innerhalb
+ dieses Rahmens (das Fenster) gelöscht (sehen Sie auch 'menuwindow­
+ page'). Innerhalb des Fensters können anschließend verschiedene Opera­
+ tionen ausgeführt werden. Auf die Größe des Menufensters kann kein
+ Einfluß genommen werden - sie wird selbständig vom System gesetzt
+ ("normales" Menu: 77 Zeichen breit und 20 Zeichen hoch; geschachteltes
+ Menu 71 Zeichen breit und 16 Zeichen hoch).
+
+
+#ib#stdinfoedit#ie#
+PROC stdinfoedit (TEXT CONST dateiname):#u#(*)#e#
+Zweck: Löscht den Bildschirm und bietet die Datei 'dateiname' in einem festge­
+ legten zum Editieren an. In der Fußzeile wird die Information "Info:
+ <ESC><?>  Verlassen: <ESC><q>" angezeigt. Nach Tippen von
+ <ESC><?> werden Editorinformationen in den Bildschirm einge­
+ blendet.
+
+
+PROC stdinfoedit (FILE VAR f):#u#(*)#e#
+Zweck: Wie obige 'stdinfoedit'-Prozedur'. Die Datei 'f' muß mit der Verarbei­
+ tungsart 'modify' assoziiert worden sein.
+
+
+PROC stdinfoedit (TEXT CONST dateiname,
+ INT CONST oberste zeile):#u#(*)#e#
+Zweck: Wie obige Prozedur (die wie 'stdwinfoedit (w, 1)' wirkt). Allerdings kön­
+ nen bis zu zwei Zeilen oben auf dem Bildschirm unbenutzt bleiben (z.B.
+ um die Kopfzeile des Menus weiterhin anzuzeigen). 'oberste zeile' gibt an,
+ welche Bildschirmzeile die erste von dieser Prozedur benutzte ist
+ (1<= oberste zeile<=3).
+
+
+PROC stdinfoedit (FILE VAR f,
+ INT CONST oberste zeile):#u#(*)#e#
+Zweck: Wie obige 'stdinfoedit'-Prozedur'. Die Datei 'f' muß mit der Verarbei­
+ tungsart 'modify' assoziiert worden sein.
+
+
+#ib#stop#ie#
+PROC stop (WINDOW VAR w, INT CONST zeilenzahl):
+
+Zweck: Vergl. 'menuwindowstop'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuwindowstop' automatisch gesetzt wird.
+
+
+PROC stop (WINDOW VAR w):
+
+ wirkt wie: stop (w, 1).
+
+
+#ib#testinstallation#ie#
+PROC testinstallation (TEXT CONST menutafelname):
+
+Zweck: Die Menutafel mit dem Namen 'menutafelname' (muß mit dem
+ 'gs-MENUKARTE:' beginnen!) wird als aktuelle Menutafel an gs-DIALOG
+ gekoppelt. Durch den Befehl wird die angegebene Menutafel zur Task
+ 'gs-MENUAKRTEN' geschickt. Dem Namen wird zur Kennzeichnung noch
+ der Taskname der Sendertask angehängt (dadurch können sich bei
+ Multi-User-Betrieb verschiedene Anwender mit gleichen Menukarten­
+ namen nicht stören). Die Menukarte wird anschließend in jedem Fall
+ "frisch" angekoppelt. Außerdem bleibt die Menukarte (als benannter
+ Datenraum) in der Task erhalten!
+ (Mit dem Befehl 'handle menu' kann nun ein Menu aus der Menukarte
+ zur Ausführung gebracht werden oder mit 'anwendungstext' auf in die
+ Menukarte ausgelagerte Texte zugegriffen werden.)
+ Hinweis: Von Zeit zu Zeit muß der Systembetreuer die überflüssigen
+ Menukarten aus der Task 'gs-MENUKARTEN' entfernen, da die Anwender
+ aus Ihrer Task die Karten nicht löschen können!
+Fehler: 'menutafelname' gibt es nicht!
+ 'menutafelname' hat falsche(n) Typ/Bezeichnung (keine
+ gs-MENUKARTE)!
+
+
+#ib#trennlinie#ie#
+PROC trennlinie:
+
+Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Durch den
+ Befehl wird unter dem aktuellen Oberbegriff eine Trennlinie zur opti­
+ schen Trennung einzelner Menupunkte eingetragen. Die Trennlinie belegt
+ den gleichen Platz wie eine Verarbeitungsfunktion.
+Fehler: Zu viele Menupunkte in einem Pull-Down-Menu (maximal 15 incl. der
+ Trennlinien!).
+
+
+#ib#textprozedur#ie#
+PROC textprozedur (TEXT CONST dateiname,
+ prozedurname):
+
+Zweck: Der Befehl wird benötigt, um Texte entsprechend der gs-DIALOG-Syntax
+ aufzuarbeiten. Der in die Datei 'dateiname' geschrieben Text wird bear­
+ beitet. Die Prozedur eignet sich insbesondere dafür, Informationstexte
+ aufzuarbeiten, die zu den einzelnen Menufunktionen ausgegeben werden,
+ wenn der Benutzer die Tastenfolge <ESC><?> tippt (sehen Sie auch
+ 'textzeile'). Der aufbereitete Text steht anschließend in der Datei 'datei­
+ name.a'. Der Text ist in eine Textprozedur "verpackt", die den Namen hat,
+ der als zweiter Parameter übergeben wird.
+ Die Zeilen werden dabei so zugeschnitten, daß Sie in einer Box in das
+ aktuelle Menu eingeblendet werden können. Boxbreite und -höhe werden
+ automatisch gesetzt (max. 65 Zeichen breit und 14 Zeichen hoch)); die
+ Zeilen werden geblockt, sofern in der Datei keine Absatzmarkierung
+ (<RETURN>) am Ende der Zeile vorhanden ist. Soll eine Zeile zentriert
+ werden, so muß als erstes Zeichen der Zeile das Zeichen '%' notiert sein -
+ die Zeile muß durch eine Absatzmarke abgeschlossen sein. Textpassagen,
+ die invers (markiert) dargestellt werden sollen, müssen duch das Zeichen
+ '$' eingeleitet und durch das Zeichen '&' abgeschlossen werden. Markier­
+ te Textpassagen dürfen (nach dem Zuschnitt!) nicht über Zeilengrenzen
+ hinausgehen!
+Fehler: Datei 'dateiname' existiert nicht!
+ Fonttabelle 'fonttab.gs-Menu-Generator' existiert nicht! (Fonttabelle von
+ gs-Menu-Generator-Diskette in die Task 'configurator' laden!)
+ Text ist zu lang - bitte kürzen! (Text darf in aufbereiteter Form maximal
+ 14 Zeilen umfassen!)
+ Zeilenformatierung mit <ESC> abgebrochen!
+
+
+
+#ib#textzeile#ie#
+PROC textzeile (TEXT CONST dateiname):
+
+Zweck: Der Befehl wird benötigt, um Texte entsprechend der gs-DIALOG-Syntax
+ aufzuarbeiten. Der in die Datei 'dateiname' geschrieben Text wird bear­
+ beitet. Die Prozedur eignet sich insbesondere dafür, anwendungsbezogene
+ Texte aufzuarbeiten, die in die Menukarte ausgelagert werden sollen
+ (sehen Sie auch 'textprozedur'). Der aufbereitete Text steht anschließend
+ in der Datei 'dateiname.a' in einer Zeile notiert.
+
+
+#ib#waagerecht#ie#
+TEXT PROC waagerecht:
+
+Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als waagerechter
+ Strich (̇) ausgegeben wird.
+
+
+PROC waagerecht (TEXT CONST zeichen):
+
+Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
+ stellung der "Kästen" als waagerechter Strich ausgegeben werden soll.
+
+
+#ib#window#ie#
+WINDOW PROC window (INT CONST x, y, xsize, ysize):
+
+Zweck: Einer Fenstervariablen (WINDOW VAR name) wird die Lage und Größe
+ zugeordnet (über den Zuweisungsoperator ':='). Gleichzeitig wird das
+ Fenster initialisiert.
+ Mit den ersten beiden Parametern wird die Lage der linken oberen Ecke
+ des Fensters bestimmt (x: Spalte; y: Zeile). Mit 'xsize' wird die Fenster­
+ breite, mit 'ysize' die Fensterhöhe festgelegt.
+ Das Fenster wird noch nicht(!) angezeigt (sehen Sie dazu 'show' und
+ 'page'). Ein Rahmen wird nicht zum Fenster gezählt; er kann aber mit
+ der Prozedur 'show' ausgegeben werden. Ein Fenster darf nicht breiter als
+ 80 und höher als 24 Zeichen sein. Umrahmte Fenster unterliegen weite­
+ ren Einschränkungen (sehen Sie auch 'show'). Ein Fenster muß min­
+ destens 6 Zeichen breit und 3 Zeichen hoch sein.
+Fehler: 'Window' ungültig
+
+
+#ib#write menunotice#ie#
+PROC write menunotice (TEXT CONST notiztext,
+ INT CONST position):
+
+Zweck: Die Prozedur dient dazu, innerhalb des Menus in einer Box einen "dauer­
+ haften Informationstext" auszugeben. Die Box bleibt nämlich so lange
+ bestehen, bis sie explizit gelöscht (sehen Sie auch 'erase menunotice')
+ oder durch einen neuen Notiztext überschrieben wird. Wenn der Bild­
+ schirm durch gs-DIALOG-Prozeduren überschrieben wird, wird die
+ Menunotiz ebenfalls ständig mitaufgefrischt und auch, wenn der Befehl
+ 'regenerate menuscreen' oder 'refresh submenu' gegeben wird (Sehen Sie
+ im Gegensatz dazu auch 'menuinfo' ("kurzzeitiger Informationstext").
+ Im Menubildschirm erscheint der 'infotext' in einer Box. Boxbreite und
+ -höhe werden vom System automatisch anhand des übergebenen 'notiz­
+ text'es festgelegt. 'notiztext' muß den gs-DIALOG-Syntax-Regeln (sehen Sie
+ Kap. 5.13) entsprechen. Mit 'position' wird die relative Lage der Box
+ innerhalb des Menubildschirms festgelegt (1, 2, 3, 4, 5: sehen Sie dazu
+ Kap. 5.12). In einem Menu kann zu einem Zeitpunkt nur eine Menunotiz
+ abgelegt werden. Durch ein erneutes 'write menunotice' wir eine beste­
+ hende Menunotiz überschrieben.
+
+
+#ib#yes#ie#
+BOOL PROC yes (WINDOW VAR w, TEXT CONST frage):
+
+Zweck: Vergl. 'menuwindowyes'. Hier wird nur zusätzlich das Fenster festgelegt,
+ das bei 'menuwindowyes' automatisch gesetzt wird.
+
+
diff --git a/doc/menugenerator/menu-generator handbuch.impressum b/doc/menugenerator/menu-generator handbuch.impressum
new file mode 100644
index 0000000..404826d
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.impressum
@@ -0,0 +1,88 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#ls Menü-Generator
+
+
+
+
+#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#
+
+#free (4.0)##on("b")#
+#center#gs-Menu-Generator
+
+
+#center#Benutzerhandbuch
+
+
+#center#Version 1.0
+
+
+#off("b")##center#copyright
+#center#Eva Latta-Weber
+#center#Software- und Hardware-Systeme, 1988
+#center#ERGOS GmbH, 1990
+#page#
+#block#
+#center#____________________________________________________________________________
+
+
+Copyright:  ERGOS GmbH   März 1990
+
+ Alle Rechte vorbehalten. Insbesondere ist die Überführung in
+ maschinenlesbare Form sowie das Speichern in Informations­
+ systemen, auch auszugsweise, nur mit schriftlicher Einwilligung
+ der ERGOS GmbH gestattet.
+
+
+#center#____________________________________________________________________________
+
+Es kann keine Gewähr übernommen werden, daß das Programm für eine
+bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
+Anwender.
+
+Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
+Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
+Handbuch kann jederzeit ohne Ankündigung geändert werden.
+
+Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
+ erstellt und aufbereitet und auf einem Kyocera Laser­
+ drucker gedruckt.
+
+
+
+
+#center#___________________________________________________________________________
+
+
+
+Ergonomic Office Software GmbH
+
+Bergstr. 7 Telefon: (02241) 63075
+5200 Siegburg Teletex: 2627-2241413=ERGOS
+ Telefax: (02241) 63078
+
+
+#center#____________________________________________________________________________
+
diff --git a/doc/menugenerator/menu-generator handbuch.index b/doc/menugenerator/menu-generator handbuch.index
new file mode 100644
index 0000000..0aacd97
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.index
@@ -0,0 +1,258 @@
+#block##pageblock#
+#pagenr("%",1)##setcount(1)##count per page#
+#headeven#
+gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#right#gs-Menu-Generator
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+I - % #right#ERGOS
+#end#
+#bottomodd#
+#center#____________________________________________________________
+ERGOS #right# I - %
+#end#
+Index
+
+
+activate 5 - 28
+activate 8 - 1
+anwendungstext 4 - 13
+anwendungstext 8 - 2
+areax 8 - 2
+areaxsize 8 - 2
+areay 8 - 2
+areaysize 8 - 2
+balken links 8 - 2
+balken oben 8 - 3
+balken rechts 8 - 3
+balken unten 8 - 3
+boxalternative 8 - 4
+boxalternative 7 - 10
+boxanswer 8 - 4
+boxanswer 7 - 9
+boxanswerone 8 - 4
+boxanswerone 7 - 10
+boxanswersome 8 - 5
+boxanswersome 7 - 10
+boxinfo 8 - 5
+boxinfo 7 - 9
+boxno 8 - 5
+boxno 7 - 10
+boxnotice 8 - 6
+boxnotice 7 - 10
+boxone 8 - 6
+boxone 7 - 10
+boxsome 8 - 6
+boxsome 7 - 10
+boxyes 8 - 7
+boxyes 7 - 10
+center 8 - 7
+center 7 - 8
+clear buffer 8 - 7
+clear buffer and count 8 - 7
+current menuwindow 8 - 8
+cursor 8 - 8
+cursor 7 - 6
+cursor off 8 - 8
+cursor off 5 - 6
+cursor off 5 - 2
+cursor on 8 - 8
+cursor on 5 - 6
+cursor on 5 - 2
+deactivate 8 - 9
+deactivate 5 - 28
+direktstart 8 - 9
+ecke oben links 8 - 10
+ecke oben rechts 8 - 10
+ecke unten links 8 - 10
+ecke unten rechts 8 - 10
+edit 8 - 11
+edit 7 - 6
+editget 8 - 11
+erase 7 - 5
+erase 8 - 11
+erase footnote 8 - 12
+erase footnote 7 - 11
+erase menunotice 8 - 12
+erasemenunotice 5 - 15
+get 8 - 12
+get 7 - 7
+get cursor 8 - 13
+get cursor 7 - 6
+getline 7 - 7
+getline 8 - 13
+get menuwindowcursor 5 - 21
+get menuwindowcursor 8 - 13
+handle menu 3 - 2
+handle menu 8 - 13
+infix namen 8 - 14
+infix namen 5 - 26
+install menu 3 - 2
+install menu 4 - 3
+install menu 8 - 14
+invers 8 - 15
+kreuz 8 - 15
+line 8 - 15
+line 7 - 6
+menualternative 8 - 15
+menualternative 5 - 12
+menuanswer 8 - 17
+menuanswer 5 - 2
+menuanswerone 8 - 17
+menuanswerone 5 - 8
+menuanswersome 5 - 8
+menuanswersome 8 - 18
+menu archiv checken 8 - 18
+menu archiv checken 6 - 4
+menu archiv grundeinstellung 6 - 4
+menu archiv grundeinstellung 8 - 18
+menu archiv holen 8 - 19
+menu archiv holen 6 - 4
+menu archiv initialisieren 8 - 19
+menu archiv initialisieren 6 - 4
+menu archiv loeschen 8 - 19
+menu archiv loeschen 6 - 4
+menu archiv neue diskette 8 - 19
+menu archiv neue diskette 6 - 4
+menu archiv reservieren 6 - 4
+menu archiv reservieren 8 - 19
+menu archiv reservierung aufgeben 6 - 4
+menu archiv reservierung aufgeben 8 - 19
+menu archiv schreibcheck 8 - 20
+menu archiv schreibcheck 6 - 4
+menu archiv schreiben 6 - 4
+menu archiv schreiben 8 - 20
+menu archiv verzeichnis 8 - 20
+menu archiv verzeichnis 6 - 4
+menu archiv verzeichnis drucken 6 - 4
+menu archiv verzeichnis drucken 8 - 20
+menu archiv zieltask einstellen 6 - 4
+menu archiv zieltask einstellen 8 - 20
+menu dateien aufraeumen 8 - 21
+menu dateien aufraeumen 6 - 6
+menu dateien drucken 6 - 6
+menu dateien drucken 8 - 21
+menu dateien kopieren 6 - 6
+menu dateien kopieren 8 - 22
+menu dateien loeschen 8 - 22
+menu dateien loeschen 6 - 6
+menu dateien speicherplatz 6 - 6
+menu dateien speicherplatz 8 - 22
+menu dateien umbenennen 8 - 23
+menu dateien umbenennen 6 - 6
+menu dateien verzeichnis 6 - 6
+menu dateien verzeichnis 8 - 23
+menufootnote 5 - 17
+menufootnote 8 - 23
+menufunktion 4 - 6
+menufunktion 8 - 24
+menuinfo 5 - 4
+menuinfo 8 - 24
+menukartenname 8 - 25
+menuno 8 - 25
+menuno 5 - 10
+menuone 5 - 6
+menuone 8 - 25
+menusome 5 - 7
+menusome 8 - 26
+menuwindowcenter 8 - 26
+menuwindowcenter 5 - 23
+menuwindowcursor 5 - 21
+menuwindowcursor 8 - 27
+menuwindowedit 8 - 27
+menuwindowedit 5 - 19
+menuwindoweditget 8 - 27
+menuwindoweditget 5 - 22
+menuwindowget 8 - 28
+menuwindowget 5 - 22
+menuwindowline 8 - 28
+menuwindowline 5 - 21
+menuwindowno 5 - 22
+menuwindowout 5 - 22
+menuwindowout 8 - 28
+menuwindowpage 8 - 29
+menuwindowpage 5 - 20
+menuwindowshow 5 - 19
+menuwindowshow 8 - 29
+menuwindowstop 5 - 23
+menuwindowstop 8 - 29
+menuwindowyes 5 - 22
+menuyes 5 - 10
+menuyes 8 - 30
+no 8 - 30
+no 7 - 7
+not empty 5 - 27
+not empty 8 - 30
+oberbegriff 8 - 31
+oberbegriff 4 - 5
+oeffne menu 8 - 31
+oeffne menu 4 - 3
+oeffne menukarte 8 - 32
+oeffne menukarte 4 - 3
+ohne praefix 5 - 26
+ohne praefix 8 - 32
+oldmenufootnote 5 - 17
+old menufootnote 8 - 32
+out 7 - 7
+out 8 - 33
+out footnote 7 - 11
+out footnote 8 - 33
+out frame 8 - 33
+out frame 7 - 5
+page 8 - 33
+page 7 - 11
+page 7 - 5
+page up 7 - 11
+put 8 - 33
+put 7 - 7
+putline 8 - 34
+putline 7 - 7
+refresh submenu 5 - 18
+refresh submenu 8 - 34
+regenerate menuscreen 8 - 34
+regenerate menuscreen 5 - 18
+regenerate menuscreen 5 - 4
+remaining lines 8 - 34
+remaining lines 7 - 6
+remaining menuwindowlines 5 - 21
+remaining menuwindowlines 8 - 34
+reset dialog 8 - 35
+schliesse menu 4 - 3
+schliesse menu 8 - 35
+schliesse menukarte 8 - 35
+schliesse menukarte 4 - 3
+senkrecht 8 - 35
+show 8 - 35
+show 7 - 5
+show 8 - 36
+show 7 - 6
+show menuwindow 8 - 36
+show menuwindow 5 - 20
+stdinfoedit 8 - 36
+stop 7 - 8
+stop 8 - 37
+testinstallation 8 - 37
+testinstallation 4 - 3
+textprozedur 4 - 8
+textprozedur 8 - 38
+text zeile 4 - 13
+textzeile 8 - 39
+trennlinie 4 - 6
+trennlinie 8 - 38
+waagerecht 8 - 39
+WINDOW 7 - 2
+window 7 - 4
+window 8 - 40
+write menunotice 8 - 40
+write menunotice 5 - 15
+yes 7 - 7
+yes 8 - 41
+
+
diff --git a/doc/menugenerator/menu-generator handbuch.inhalt b/doc/menugenerator/menu-generator handbuch.inhalt
new file mode 100644
index 0000000..8b1aef4
--- /dev/null
+++ b/doc/menugenerator/menu-generator handbuch.inhalt
@@ -0,0 +1,72 @@
+#type ("elite.lq")##limit (11.5)##pagelength (16.5)##pageblock#
+#start (1.8,0.0)#
+#type ("prop.breit.lq")#
+Inhaltsverzeichnis
+#type ("elite.lq")#
+
+
+1 Was kann ls-Menu-Generator 3
+
+2 Installation von ls-Menu-Generator 6
+2. 1 Voraussetzungen 6
+2. 2 Lieferumfang 6
+2. 3 Installation 7
+
+3 Die Arbeitsweise von ls-DIALOG 8
+3. 1 Ankoppeln einer Menukarte/ 8
+ Ausführen eines Menus
+3. 2 Aufbau/Inhalt einer Menukarte 11
+
+4. Erstellen einer neuen Menukarte 13
+4. 1 Eintragen der Menupunkte 13
+4. 2 Erstellung und Einbinden von 20
+ Informationstexten
+4. 3 Auslagerung von anwendungsbezogenen 24
+ Texten in die Menukarte
+
+5. Dialoge innerhalb des Menus 27
+5. 1 Eingabe eines Textes/Namens 28
+5. 2 Ausgabe einer Information 31
+5. 3 Auswahl eines Namen durch Ankreuzen 32
+5. 4 Auswahl mehrerer Namen durch Ankreuzen 34
+5. 5 Eingabe eines Textes/Namens - alternativ: 35
+ Auswahl durch Ankreuzen
+5. 6 Die Ja/Nein - Entscheidung 37
+5. 7 Die Alternativentscheidung 39
+5. 8 Die Menunotiz 43
+5. 9 Fußzeilen im Menu 44
+5.10 Wiederherstellung des Menubildschirms 46
+5.11 Arbeiten im Menufenster 47
+5.11.1 Datei anzeigen/editieren 48
+5.11.2 Menufenster öffnen/anzeigen 48
+5.11.3 Menufenster löschen(putzen) 49
+5.11.4 Positionierungen im Menufenster 49
+5.11.5 Informationen über die aktuelle 50
+ Menu-Fensterposition
+5.11.6 Aus-/Eingabe innerhalb des Menufensters 51
+5.11.7 Weitere Prozeduren 52
+5.12 Festlegung der Boxpositionen innerhalb 53
+ des Menus
+5.13 ls-DIALOG-Syntax 54
+ (Regeln zur Erstellung von Texten)
+5.14 Thesaurushandling 55
+5.15 Aktivieren/Deaktivieren von Menupunkten 57
+
+6. Einbinden der Datei- und Archivoperationen 59
+6. 1 Einbinden der Archivoperationen 60
+6. 2 Einbinden der Dateioperationen 65
+
+7. Eigene Fenster und Fensteroperationen 66
+7. 1 Definition von Fenstern 67
+7. 2 Anzeigen/Löschen von Fenstern 70
+7. 3 Operationen innerhalb des Fensters 71
+7. 3.1 Datei anzeigen/editieren 71
+7. 3.2 Positionierungen im Fenster 72
+7. 3.3 Ein- und Ausgaben innerhalb des Fensters 73
+7. 3.4 Weitere Prozeduren 74
+7. 4 Boxoperationen 75
+
+8. Kurzbeschreibung der Befehle 78
+
+9. Register 125
+
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis b/doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis
new file mode 100644
index 0000000..9507802
--- /dev/null
+++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis
@@ -0,0 +1,50 @@
+#limit (11.5)##pagelength (16.5)##pageblock#
+#start (1.8,0.0)#
+Inhaltsverzeichnis
+
+
+1 Was kann gs-MP BAP 3
+
+2 Allgemeines zum Simulationsprogramm 6
+2.1 Entstehung 6
+2.2 Beschreibung des Programmkerns 7
+ - ein Simulationslauf
+2.3 Das Teilprogramm 'Materialprüfung' 9
+2.4 Das Teilprogramm 'Bildschirmarbeitsplatz' 10
+2.5 Hinweise zum Einsatz des Programmsystems 12
+2.6 Erfahrungen mit dem Programmsystem 13
+2.7 Hinweise auf Arbeitsmaterial 14
+
+3 Installation von gs-MP BAP 16
+3.1 Voraussetzungen 16
+3.2 Lieferumfang 16
+3.3 Installation 17
+3.4 Organisation des Task - Systems 19
+3.5 Direktstart des Systems 20
+
+4 Eine kleine Beispielsitzung 22
+4.1 Aufruf von 'Bildschirmarbeitsplatz' (BAP) 22
+4.2 Einstellung von Simulationsparametern 23
+4.3 Ein Simulationslauf 26
+4.4 Die Simulationsauswertung/das Protokoll 28
+4.5 Hinweise zur Protokollauswertung 36
+4.5.1 Der Bewertungsfaktor 36
+4.5 2 Fehlerzeichenhäufigkeit in den Werkstücken 38
+4.5 3 Fehlerhafte Auswertungen 38
+
+5 Beschreibung der Menufunktionen 40
+5.1 Kurzhinweise zur Bedienung der Menus 40
+5.2 Menufunktionen z. Oberbegriff 'Simulation' 44
+5.3 Menufunktionen z. Oberbegriff 'Parameter' 48
+5.4 Menufunktionen z. Oberbegriff 'Konfiguration' 56
+5.5 Menufunktionen z. Oberbegriff 'Dateien' 58
+5.6 Menufunktionen z. Oberbegriff 'Archiv' 60
+
+6 Hinweise für den Systembetreuer 61
+
+
+
+
+
+
+
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1
new file mode 100644
index 0000000..e418764
--- /dev/null
+++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1
@@ -0,0 +1,119 @@
+#type ("12.lq")##limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (3)#
+#headodd#
+#center#gs-MP BAP#right#%
+
+#end#
+#headeven#
+%#center#gs-MP BAP
+
+#end#
+#center#1
+
+#center#Was
+#center#kann
+#center#gs-MP BAP
+
+
+ #on("b")#gs-MP BAP#off("b")# ist ein Programm, mit dem die Arbeit
+an einem Bildschirmarbeitsplatz unter ganz unter­
+schiedlichen Aspekten simuliert werden kann. Vom
+Benutzer wird dabei verlangt, eine Art "Kontrolltä­
+tigkeit am Bildschirm" auszuüben. Während dieser
+Arbeit werden Daten über den Arbeitsverlauf erfaßt,
+die (später) ausgewertet werden können.
+ #on("b")#gs-MP BAP#off("b")# ist so gestaltet, daß es für ganz un­
+terschiedliche Zwecke eingesetzt werden kann. Es
+ist möglich, sämtliche Simulationsparameter den
+eigenen Wünschen und der jeweiligen Situation an­
+zupassen. Daneben besteht die Möglichkeit, die Si­
+mulationsprotokolle offensichtlich oder "heimlich"
+zu erfassen.
+ #on("b")#gs-MP BAP#off("b")# kann dazu benutzt werden, um Anwendern
+lediglich die Belastungen eines Bildschirmarbeits­
+platzes an einem Beispiel darzulegen; es ist aber
+genauso möglich, ihm eindrucksvoll aufzuzeigen, wie
+eine Kontrolle am Bildschirmarbeitsplatz - ohne
+sein Wissen - erfolgen kann. Auf der Basis dieser
+Erfahrungen lassen sich dann ganz neue Fragestel­
+lungen thematisieren (Möglichkeiten/Befugnis der/
+zur Kontrolle am (Bildschirm-) Arbeitsplatz; Daten­
+schutz; Betriebsvereinbarungen zu Computerarbeits­
+plätzen und vieles mehr).
+ Durch die Möglichkeit, die Simulationsparameter
+vielfältig zu variieren, können verschiedenste Un­
+tersuchungen mit dem Programm durchgeführt werden:
+Angefangen von Untersuchungen zur Konzentrations­
+fähigkeit bei unterschiedlichen Umgebungsbedingun­
+gen (z.B. Lichtverhältnisse, Musik am Arbeitsplatz,
+etc.), über Untersuchungen zum optimalen Arbeits­
+phasen - Pausen - Rhythmus (z.B. zur Fragestellung,
+ob lange Arbeitsphasen mit langen Pausen günstiger
+sind als kurze Arbeitsphasen mit immer wieder ein­
+gestreuten kleineren Pausen oder umgekehrt - wenn
+die Gesamtzeit konstant ist), bis hin zu Untersu­
+chungen zur Ergonomie von Computerarbeitsplätzen
+(z.B. hinsichtlich der Tastaturbelegung, Nützlich­
+keit eines eigenen Cursorblockes, etc.).
+ Anhand der aufgezeigten Möglichkeiten wird
+sicher deutlich, daß der Einsatz des Programms
+nicht auf den Informatikunterricht beschränkt ist.
+Ebensogut ist, bei entsprechender Fragestellung,
+ein Einsatz im gesellschafts- / sozialwissenschaft­
+lichen Unterricht, im Biologieunterricht, in den
+kaufmännischen Lernbereichen oder im Technikunter­
+richt denkbar. Das Programm ist auch für die Aufar­
+beitung verschiedener Fragestellungen bei der Vor-
+und Nachbereitung von Betriebspraktika geeignet.
+ Um all diese Möglichkeiten auch den Ausbildern
+offenzuhalten, die keinerlei Vorerfahrungen mit
+Computern haben, aber dieses Programm einsetzen
+möchten, ist die Simulationsumgebung so komforta­
+bel, daß jeder Benutzer innerhalb weniger Minuten
+das gesamte Programmsystem überblicken und bedienen
+kann.
+
+- Durch die Einbettung in die komfortable Benut­
+ zerschnittstelle #on("b")#gs-DIALOG#off("b")#, sind nur noch wenige
+ Betriebssystemkommandos zur Bedienung des Sy­
+ stems notwendig.
+
+- Der Benutzer kann jederzeit Informationen über
+ die Bedienung des Menusystems und die Wirkung
+ der einzelnen Menufunktionen anfordern, die ihm
+ daraufhin in den aktuellen Bildschirm eingeblen­
+ det werden.
+
+- Dem Benutzer wird ständig angezeigt, welche Mög­
+ lichkeiten der Bedienung bestehen, welche Tasten
+ wirksam sind und welche Wirkung deren Betätigung
+ hat. Menufunktionen, deren Wirkungen zu bestimm­
+ ten Zeitpunkten sinnlos oder fehlerhaft wären,
+ werden "inaktiviert", d.h. sind dem Benutzer gar
+ nicht erst zugänglich.
+
+- Die Auswertung der Simulationsprotokolle erfolgt
+ vom Menu aus durch einfaches Ankreuzen der ge­
+ wünschten Protokolldateien. Es besteht sowohl
+ die Möglichkeit, die Auswertungen auf dem Bild­
+ schirm anzeigen als auch über den Drucker ausge­
+ ben zu lassen.
+
+- Die Festlegung der Simulationsparameter ist kin­
+ derleicht. Die aktuell eingestellten Werte kön­
+ nen jederzeit eingesehen werden. Zur Einstellung
+ werden umfangreiche Informationen und Hilfen
+ ausgegeben. Eine Fehlbedienung ist ausgeschlos­
+ sen.
+
+- In das System ist eine komfortable Archivbehand­
+ lung integriert, so daß auch für den Computer­
+ laien die Konservierung der Simulationsergebnis­
+ se auf einfachste Weise möglich ist.
+
+- Bei auftretenden Fehlern erhält der Benutzer
+ konkrete, verständliche Fehlermeldungen, die
+ zumeist mit einem Zusatz versehen sind, wie die
+ "Situation bereinigt werden kann".
+
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2
new file mode 100644
index 0000000..b063ea3
--- /dev/null
+++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2
@@ -0,0 +1,302 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (6)#
+#headodd#
+#center#gs-MP BAP#right#%
+
+#end#
+#headeven#
+%#center#gs-MP BAP
+
+#end#
+#center#2
+
+#center#Allgemeines
+#center#zum
+#center#Simulationsprogramm
+
+
+2.1 Entstehung
+
+ Das Simulationsprogramm #on("b")#gs-MP BAP#off("b")# basiert auf
+einer Idee von Hartmut Spenn und Mene Wolf, die
+eine Unterrichtsreihe mit dem Titel "Der gläserne
+Arbeiter" im Rahmen der Materialien zur Lehrerfort­
+bildung in Nordrhein Westfalen (Neue Technologien,
+informations- und kommunikationstechnologische In­
+halte im Wahlpflichtunterricht der Klassen 9/10)
+beschrieben und dazu ein Grundprogramm für den C64
+in COMAL geschrieben haben.
+ Dieses Grundprogramm diente einmal als Ausgangs­
+punkt für #on("b")#gs-MP BAP#off("b")#. Allerdings wuchsen die An­
+sprüche an das System immer mehr, so daß eine Reihe
+weiterer Funktionen hinzugefügt wurden. Ein wesent­
+liches Ziel war es, ein Simulationsprogramm zur
+Verfügung zu stellen, daß umfangreiche Variations­
+möglichkeiten - ohne jegliche Programmierkenntnisse
+- bietet; ein Programm, das selbst von einem völli­
+gen Computerlaien innerhalb weniger Minuten über­
+blickt und sicher bedient werden kann.
+
+ Erst als die komfortable Benutzerschnittstelle
+#on("b")#gs-DIALOG#off("b")# zur Verfügung stand, konnte dieses Ziel
+erreicht werden. Heute präsentiert sich Ihnen ein
+Programmsystem, in dem Sie jede Programmfunktion
+von einem Menu aus wählen können. Durch Informa­
+tionstexte, die Sie jederzeit abrufen können, und
+durch die Bedienungshinweise werden Sie sicher
+durch das Programmsystem geführt. Sie haben komfor­
+table Möglichkeiten, die Simulationsparameter zu
+variieren. Das Programmsystem ist gegen Fehlbedie­
+nungen mehrfach abgesichert.
+
+
+2.2 Beschreibung des Programmkerns
+ - ein Simulationslauf
+
+ Mit #on("b")#gs-MP BAP#off("b")# kann die Arbeit an einem Bild­
+schirmarbeitsplatz simuliert werden. Der Benutzer
+übt am Bildschirm eine Art "Kontrolltätigkeit" aus.
+Die Interpretation dieser Tätigkeit ist offen: So
+kann man sich vorstellen, daß "Werkstücke" auf dem
+Bildschirm angezeigt werden, die auf Fehler hin
+untersucht werden sollen; dabei muß jeder gefundene
+Fehler markiert werden. Der Benutzer kann sich auch
+vorstellen, er sei bei einer Tageszeitung beschäf­
+tigt und habe die aus der Redaktion eingehenden
+Artikel auf Tippfehler hin zu untersuchen - natür­
+lich müssen die Tippfehler "verbessert" werden.
+Andere Interpretationen sind denkbar.
+ Das Grundprinzip des Simulationslaufes ist recht
+einfach - ein typischer Bildschirm könnte so ausse­
+hen:
+#free (9.5)#
+ Im oberen Bereich des Bildschirms werden alle
+Daten angezeigt, die der Benutzer während des Simu­
+lationslaufes benötigt. Links oben sind alle Tasten
+angegeben, die für die Handhabung des Programms
+notwendig sind. Rechts oben wird der Benutzer über
+die Simulationszeiten und das festgelegte 'Fehler­
+zeichen' informiert.
+ Im unteren Bereich des Bildschirms wird ein
+rechteckiger Block ausgegeben, der sich aus ver­
+schiedenen Zeichen (z.B. Buchstaben, Ziffern, Son­
+derzeichen) zusammensetzt. Der Benutzer hat jetzt
+die Aufgabe, die Blöcke daraufhin zu untersuchen,
+ob in ihnen das angegebene Fehlerzeichen auftaucht.
+ Entdeckt er solche Zeichen im Block auf dem
+Bildschirm, so ist es seine Aufgabe, den Cursor
+(Lichtfleck) auf dem Bildschirm mit Hilfe festge­
+legter Tasten an die entsprechende Position zu
+steuern und eine 'Ausbesserung' (Kennzeichnung/
+Korrektur) vorzunehmen. Ist der Benutzer der Mei­
+nung, alle Fehlerzeichen bearbeitet zu haben, so
+kann er den nächsten Block (das nächste Werkstück/
+den nächsten Artikel) durch Tippen einer festgeleg­
+ten Taste anfordern.
+ Die Arbeit ist dabei streng in 'Arbeitsphasen'
+und 'Pausen' eingeteilt - der Rhythmus wird aber
+vom Programm und nicht vom Benutzer bestimmt. Wäh­
+rend des Simulationslaufes werden alle wesentlichen
+Kenndaten protokolliert. Diese können später ausge­
+wertet werden.
+ In unserem konkreten Beispiel hat der Benutzer
+nach dem Fehlerzeichen 'F' zu suchen. Er hat insge­
+samt 34 Minuten zu arbeiten; dabei ist seine Ar­
+beitszeit eingeteilt in 3 Arbeitsphasen zu je 10
+Minuten mit zwei dazwischenliegenden Pausen von je
+2 Minuten.
+ Zur Bedienung des Systems kann er die (Cursor-)
+Pfeiltasten <rechts>, <links>, <hoch> und <runter>
+benutzen; damit kann er den Lichtfleck innerhalb
+des Zeichen-Blocks bewegen. Zur Ausbesserung dient
+die <HOP>-Taste. Mit der <ESC>-Taste kann er je­
+weils die neuen Werkstücke (Artikel) zur Bearbei­
+tung anfordern.
+
+
+2.3 Das Teilprogramm 'Materialprüfung' (MP)
+
+ Gemeinsamer Bestandteil beider Programmteile ist
+der sogenannte "Simulationslauf" - ein eben ge­
+schilderter Arbeitsprozeß am Bildschirm. Diesem
+Simulationslauf gehen im Teilprogramm 'Materialprü­
+fung' (MP) jedoch noch umfangreiche Informationen
+voraus, die dem Benutzer die anschließend zu ver­
+richtende Tätigkeit detailliert erläutern. Gleich
+nach Aufruf des Programmteils wird der Benutzer
+noch nach einer "Identifikation" gefragt und aufge­
+fordert, z.B. den Vor- und Nachnamen einzugeben.
+Die hier eingegebene Kennung ist auch Bestandteil
+des Namens des Protokolls, das über den dann fol­
+genden Simulationslauf angelegt wird.
+ Am Ende des Simulationslaufes wird dem Benutzer,
+sofern das System entsprechend konfiguriert ist,
+eine 'Kurzauswertung' seiner Arbeit auf dem Bild­
+schirm präsentiert. Zusätzlich wird - ohne daß der
+Benutzer es merkt - das angelegte Protokoll in die
+Vatertask geschickt und in der eigenen Task ge­
+löscht.
+
+
+2.4 Das Teilprogramm 'Bildschirmarbeitsplatz'
+ (BAP)
+
+ Nach Aufruf des Teilprogramms erscheint auf dem
+Bildschirm ein Menu, von dem aus eine Vielzahl von
+Funktionen gewählt werden kann. Natürlich ist es
+auch von hier aus möglich, einen oben beschriebenen
+Simulationslauf zu starten. Im Gegensatz zum Pro­
+grammteil 'Materialprüfung' wird hier aber auf die
+umfangreichen Informationen zur Handhabung des
+Systems verzichtet und zum Abschluß auch keine Pro­
+tokolldatei zur Vatertask geschickt - die Proto­
+kolldatei verbleibt in der eigenen Task.
+ Daneben können vom Menu aus auch Protokolldatei­
+en ausgewertet werden. Sie können dabei noch ent­
+scheiden, ob Sie die Auswertungen auf dem Bild­
+schirm angezeigt oder aber auf dem angeschlossenen
+Drucker ausgegeben haben möchten.
+ Weiterhin können Sie sämtliche Simulationspara­
+meter vom Menu aus Ihren Wünschen gemäß einstellen.
+So ist es möglich, die Breite und Höhe des Werk­
+stücks zu variieren und zu entscheiden, ob die
+Werkstücke "normal" oder "invers" dargestellt wer­
+den sollen. Sie können das 'Fehlerzeichen' festle­
+gen und überhaupt die Zeichen bestimmen, aus denen
+die Werkstücke aufgebaut werden. Daneben haben Sie
+noch die Möglichkeit, zu bestimmen, welche Tasten
+auf der Tastatur welche Funktion beim Simulations­
+lauf haben sollen.
+ Sie legen von hier aus auch fest, in wie viele
+Arbeitsphasen die Arbeitszeit unterteilt wird und
+wie lange eine einzelne Arbeitsphase und die zwi­
+schen den Arbeitsphasen liegende Pause dauern sol­
+len. Auch hinsichtlich der Bewertung können Sie
+Festlegungen treffen - nach dem von Ihnen hier ein­
+gestellten Wertungsschlüssel werden nämlich die
+Protokolldateien ausgewertet.
+ Ihnen obliegt es auch, zu bestimmen, ob mit je­
+der Protokollauswertung die umfangreichen Erläute­
+rungen ausgegeben werden sollen und ob der Benutzer
+am Ende eines Simulationslaufes eine 'Kurzauswer­
+tung' über seine Arbeit auf dem Bildschirm erhalten
+soll oder nicht.
+ Zusätzlich werden Ihnen noch eine Reihe von Mög­
+lichkeiten zur Datei- und Archivbehandlung angebo­
+ten. So können Sie komfortabel Dateien löschen,
+kopieren, umbenennen, etc., Dateien auf Diskette
+konservieren oder gespeicherte Dateien von dort
+holen und vieles mehr.
+
+
+2.5 Hinweise zum Einsatz des Programmsystems
+
+ Aus den Beschreibungen in 2.3 und 2.4 ist Ihnen
+sicher schon die unterschiedliche Absicht, die hin­
+ter den beiden Programmteilen steckt, klar gewor­
+den. Die beiden Programmteile richten sich nämlich
+auch an ganz unterschiedliche Nutzergruppen.
+ Das Teilprogramm 'Materialprüfung' (MP) ist vor­
+nehmlich für den 'unerfahrenen'/'unbefangenen' Be­
+nutzer gedacht. Ihm werden nämlich umfangreiche
+Informationen ausgegeben. Mit diesem Programmteil
+ist eben auch die "heimliche" Erfassung der Simula­
+tionsdaten möglich. Dieser Teil des Programms wird
+sicherlich dann Anwendung finden, wenn die Fragen
+um die Möglichkeiten und Gefahren der Kontrolle am
+(Bildschirm-) Arbeitsplatz im Vordergrund der Be­
+trachtungen stehen.
+ Das Teilprogramm 'Bildschirmarbeitsplatz' (BAP)
+hat zumindest zwei ganz unterschiedliche Einsatz­
+aspekte:
+
+ Einerseits dient es dem Lehrer/Ausbilder dazu,
+die gewünschten Simulationsparameter für das Teil­
+programm 'Materialprüfung' einzustellen. Die aktu­
+elle Einstellung, die mit dem Teilprogramm 'Bild­
+schirmarbeitsplatz' getroffen wurde, ist in der
+jeweilgen Task gültig, in der die Einstellung vor­
+genommen wurde. Die Einstellung wird aber auch von
+allen Sohntasks übernommen, die sich nach der je­
+weiligen Einstellung neu anmelden. Darüber hinaus
+dient dieses Teilprogramm dem Lehrer/Ausbilder
+dazu, die (ihm zugestellten) Simulationsprotokolle
+auszuwerten.
+ Andererseits hat das Teilprogramm 'Bildschirm­
+arbeitsplatz' auch einen "eigenen Charakter":
+Gerade bei den schon oben angesprochenen Untersu­
+chungen (zur Konzentrationsfähigkeit in Abhängikeit
+von verschiedenen Faktoren, zur Bedeutung der Ar­
+beitsphasen-Pausen-Rhythmen, zur 'Ergonomie am Ar­
+beitsplatz', etc.) bietet sich hier ein schneller,
+komfortabler Wechsel zwischen Parametereinstellung
+und Simulationsläufen - ohne unnötigen Zeitverlust;
+erst recht, wenn mehrere Simulationsläufe aufeinan­
+der folgen.
+
+
+2.6 Erfahrungen mit dem Programmsystem
+
+ Das Programmsystem wurde bereits in verschiede­
+nen Klassen/ Kursen ab der Jahrgangsstufe 8 einge­
+setzt, und zwar in verschiedenen Fachbereichen und
+Schulformen. Die Akzeptanz ist sehr hoch; die Hand­
+habung des Programmsystems bereitete selbst Kolle­
+gen, die noch nie zuvor an einem Computer gesessen
+hatten, keinerlei Schwierigkeiten. Von der Hand­
+habung des Programms her ist deshalb sicher auch
+keine Alteruntergrenze hinsichtlich der "Eignung"
+anzugeben.
+ Jedoch scheint eine Bearbeitung mit den oben
+angegebenen Zielsetzungen erst auf dem Erfahrungs­
+horizont der Jahrgangsstufe 8 sinnvoll zu sein.
+Eine Bearbeitung der Fragestellungen in der von
+Hartmut Spenn und Mene Wolf (siehe Kapitel 2.7)
+vorgeschlagenen Tiefe scheint allerdings erst am
+Ende der Jahrgangsstufe 9 bzw. in der Jahrgangsstu­
+fe 10 erreichbar.
+ Besonders interessant scheint der Einsatz bei
+der Vor- bzw. Nachbereitung von Betriebspraktika zu
+sein. Durch die unmittelbare Berührung mit den
+"neuen Technologien am Arbeitsplatz" ist das Inter­
+esse an der Bearbeitung entsprechender Fragestel­
+lungen sehr hoch und eine Sensibilisierung für die
+angesprochenen Problematiken zu erreichen.
+ Die angegebenen Fragestellungen im Zusammenhang
+mit diesem Programmsystem können auch Thema einer
+Projektwoche/von Projekttagen sein. Besonders be­
+währt hat sich hier die Zusammenarbeit mit Kollegen
+aus dem gesellschafts-/sozialwissenschaftlichen
+Bereich. Ein Unterrichtsgang, z.B. in einen Super­
+markt mit modernen Scannerkassen, bei einer Tages­
+zeitung (Kleinanzeigenaufnahme am Freitag-Vormit­
+tag) o.ä., bei dem die "im Hintergrund (möglicher­
+weise) ablaufenden Prozesse" bewußt gemacht werden,
+kann das Vorhaben noch abrunden.
+ Zum Einsatz in der Sekundarstufe II liegen erst
+wenige Erfahrungen vor. Mit Sicherheit bietet das
+Programm einen "anderen", interessanten Einstieg in
+den Informatikunterricht der Jahrgangsstufe 11 und
+kann auch bei der Aufarbeitung entsprechender Fra­
+gestellungen zu späteren Zeitpunkten herangezogen
+werden. Erfahrungen aus anderen Fachbereichen lie­
+gen (noch) nicht vor.
+
+
+2.7 Hinweise auf Arbeitsmaterial
+
+ Ausdrücklich sei an dieser Stelle auf die Ausar­
+beitung von Hartmut Spenn und Mene Wolf hingewie­
+sen:
+
+Spenn, Hartmut; Wolf, Mene; Der gläserne Arbeiter,
+ Elektronische Leistungs- und Verhaltenskon­
+ trolle am Arbeitsplatz
+ in: Landesinstitut für Schule und Weiterbildung
+ (Hrsg.), Materialien zur Lehrerfortbildung
+ in Nordrhein-Westfalen, Heft 4, Neue Tech­
+ nologien - Informations- und Kommunuika­
+ tionstechnologische Inhalte im Wahlpflicht­
+ unterricht der Klassen 9/10, Soest, 1986.
+
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3
new file mode 100644
index 0000000..f589a93
--- /dev/null
+++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3
@@ -0,0 +1,237 @@
+#limit (11.0)##pagelength (16.5)##block##pageblock#
+#start (2.0,0.0)#
+#page (16)#
+#headodd#
+#center#gs-MP BAP#right#%
+
+#end#
+#headeven#
+%#center#gs-MP BAP
+
+#end#
+#center#3
+
+#center#Installation
+#center#von
+#center#gs-MP BAP
+
+
+ Bevor Sie #on("b")#gs-MP BAP#off("b")# auf Ihrem Computer benutzen
+können, müssen Sie das Programm zunächst installie­
+ren. Wenn #on("b")#gs-MP BAP#off("b")# auf Ihrem System schon zur Ver­
+fügung steht, können Sie dieses Kapitel ruhig über­
+springen.
+
+
+3.1 Voraussetzungen
+
+ Um #on("b")#gs-MP BAP#off("b")# auf Ihrem Computer betreiben zu
+können, muß das EUMEL-Betriebssystem installiert
+sein. #on("b")#gs-MP BAP#off("b")# setzt die Multi-User-Version voraus
+und ist lauffähig ab Version 1.7.5. #on("b")#gs-MP BAP#off("b")# setzt
+weiterhin voraus, daß auf Ihrem Computer bereits
+das Programm #on("b")#gs-DIALOG#off("b")# installiert ist.
+
+
+3.2 Lieferumfang
+
+ #on("b")#gs-MP BAP#off("b")# wird auf einer Diskette geliefert, die
+alle notwendigen Programme enthält (die Installa­
+tion von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um
+den Inhalt der Diskette feststellen zu können,
+starten Sie Ihr System und bringen es dazu, daß
+'gib kommando:' erscheint. Dann legen Sie die Dis­
+kette ein und geben das Kommando:
+
+ archive("gs-MP BAP");list(archive);
+ release(archive) <RETURN>
+
+ Anschließend erscheint eine Übersicht der auf
+dem Archiv vorhandenen Programme. Folgende Program­
+me sollten sich in der Übersicht befinden:
+
+ "gs-MP BAP 1"
+ "gs-MP BAP 2"
+ "gs-MENUKARTE:MP-BAP"
+ "gs-MP BAP/gen"
+
+ Eventuell können noch weitere Namen auf der Dis­
+kette vorhanden sein. Wenn Sie den Inhalt der Dis­
+kette kontrolliert haben und diese Programme auf
+der Diskette vorhanden sind, können Sie #on("b")#gs-MP BAP#off("b")#
+installieren.
+ Sollten Sie statt der Übersicht eine Fehlermel­
+dung erhalten, überprüfen Sie bitte, ob die Disket­
+te das richtige Format besitzt oder ob Ihr Disket­
+tenlaufwerk Probleme macht. Sollten dagegen Pro­
+gramme fehlen, so reklamieren Sie die Diskette.
+
+
+3.3 Installation
+
+ #on("b")#gs-MP BAP#off("b")# muß in einer Task installiert werden,
+in der bereits das Programm #on("b")#gs-DIALOG#off("b")# zur Verfügung
+steht. Alle Söhne und Enkel der neuen Task können
+anschließend auf die Programme (Materialprüfung /
+Bildschirmarbeitsplatz) zugreifen. Richten Sie also
+eine Task als Sohn der Task ein, in der auf Ihrem
+Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir
+nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU'
+installiert ist und die neue Task den Namen 'MP
+BAP' erhalten soll. (Sie können für die Task auch
+einen beliebigen anderen Namen wählen):
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+#off("b")#
+
+ --> gib supervisor kommando:
+#on("b")#
+ begin ("MP BAP","MENU") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+
+ (Arbeiten mehrere Personen mit dem Computer,
+dann ist es sinnvoll, diese Task vor unbefugtem
+Zugriff durch ein Passwort zu schützen. Wie das
+gemacht wird, können Sie in Ihrem EUMEL-Benutzer­
+handbuch erfahren.)
+
+ Legen Sie dann die Archivdiskette ein, auf der
+sich #on("b")#gs-MP BAP#off("b")# befindet, und geben Sie das folgende
+Kommando:
+
+#on("b")#
+ archive("gs-MP BAP") <RETURN>
+
+ fetch("gs-MP BAP/gen",archive) <RETURN>
+
+ run <RETURN>
+#off("b")#
+
+ Sie haben damit das Generatorprogramm gestartet.
+Beantworten Sie die Frage, ob Sie das Archiv ange­
+meldet und die Diskette eingelegt haben, mit 'ja'
+durch Tippen der Taste <j>.
+ Daraufhin wird die Installation automatisch
+durchgeführt. Lassen Sie während des gesamten Vor­
+gangs die Archivdiskette eingelegt. Sie erhalten
+einen Hinweis, wenn die Diskette entnommen werden
+kann! Die Generierung ist beendet, wenn der EUMEL-
+Eingangsbildschirm erscheint. Die Task, in der die
+Generierung stattfindet, wird automatisch zur Mana­
+gertask, das heißt, daß Söhne von ihr eingerichtet
+werden können.
+ Richten Sie sich gleich eine Sohntask (z.B mit
+dem Namen 'mp bap') ein, dann können Sie das System
+sofort ausprobieren. Gehen Sie dazu folgendermaßen
+vor:
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+#off("b")#
+
+ --> gib supervisor kommando:
+#on("b")#
+ begin ("mp bap","MP BAP") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+
+Mit dem Kommando
+
+#center##on("b")#mp <RETURN> bzw. bap <RETURN>#off("b")#
+
+können Sie nun das Programm
+
+#center#'Materialprüfung' bzw. 'Bildschirmarbeitsplatz'
+
+aufrufen.
+
+
+3.4 Organisation des Task - Systems
+
+ Wollen Sie unter anderem das Teilprogramm 'Ma­
+terialprüfung' (MP) nutzen, so sollten Sie beden­
+ken, daß die dabei entstehenden Simulationsproto­
+kolle in die Vatertask geschickt werden. Die Vater­
+task sollte sich daher ständig im Wartezustand be­
+finden, um die Protokolle auch aufnehmen zu können.
+So kann es sinnvoll sein, eine 'Zwischentask' ein­
+zurichten, damit auch andere ungestört mit dem Si­
+mulationsprogramm arbeiten können. Gehen Sie dazu
+etwa folgendermaßen vor:
+ In der Task 'mp bap', in der Sie bisher gearbei­
+tet haben, geben Sie bei 'gib kommando:' den Be­
+fehl:
+
+ #on("b")#global manager <RETURN>#off("b")#
+
+ Sie gestatten dadurch, daß Söhne dieser Task
+eingerichtet werden können. Auf dem Bildschirm er­
+scheint der EUMEL-Eingangsbildschirm.
+ Alle Anwender (Schüler) melden sich dann als
+Sohn der Task 'mp bap' an:
+
+ #on("b")#begin ("Anwender1", "mp bap") <RETURN>#off("b")#
+ #on("b")#begin ("Anwender2", "mp bap") <RETURN>#off("b")#
+ #on("b")#begin ("Anwender3", "mp bap") <RETURN>#off("b")#
+ ...
+
+ Die Simulationsprotokolle finden Sie dann an­
+schließend in der Task 'mp bap'.
+
+
+3.5 Direktstart des Systems
+ (Steht erst ab gs-DIALOG Version 1.1 zur Ver­
+ fügung)
+
+ In den Kapitel 3.3/3.4 haben wir Ihnen gezeigt,
+wie sie Sohntasks einrichten und hier durch das
+Kommando 'mp' bzw. 'bap' das System aufrufen kön­
+nen. Wenn Sie immer nur mit einer Modellvariante
+arbeiten oder vor dem Benutzer die 'gib komman­
+do:'-Ebene verbergen wollen, können Sie das System
+auch so einrichten, daß sich sofort nach Einrichten
+des Arbeitsbereichs das Menusystem meldet. Für den
+Anfänger kann das die Arbeit durchaus erleichtern.
+ Gehen Sie dazu in die Task, unterhalb der die
+Sohntasks eingerichtet werden sollen:
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+
+#off("b")#
+ --> gib supervisor kommando:
+#on("b")#
+ continue ("mp bap") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+#on("b")#
+ direktstart ("mp", TRUE) <RETURN>
+#off("b")#
+
+ Durch das Kommando haben Sie festgelegt, daß
+sich alle Sohntasks direkt mit dem Programm 'Mate­
+rialprüfung' melden. Möchten Sie lieber mit 'Bild­
+schirmarbeitsplatz' arbeiten, ist nur 'mp' durch
+'bap' zu ersetzen. In diesem Falle meldet sich das
+System gleich mit dem BAP-Menu.
+ Durch den zweiten Parameter 'TRUE' legen Sie
+fest, daß in den Sohntasks nach Verlassen des Menus
+die jeweilige Task automatisch gelöscht wird. Statt
+'TRUE' können Sie hier auch den Wert 'FALSE' ein­
+tragen. Dann wird nach Verlassen des Menus ange­
+fragt, ob die Task gelöscht werden soll. Wird die
+Frage bejaht, wird gelöscht - sonst wird die Task
+abgekoppelt (break) und kann durch 'continue' wie­
+der angekoppelt werden.
+ Anmerkung: In der Task, in der Sie das Kommando
+'direktbefehl' gegeben haben, sollte nicht das Kom­
+mando 'monitor' gegeben werden, da Sie durch dieses
+Kommando auch diese Task zu einer Task machen, die
+sich direkt mit dem Menu meldet und ggf. bei Ver­
+lassen des Menus automatisch gelöscht wird!
+
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4
new file mode 100644
index 0000000..6236d91
--- /dev/null
+++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4
@@ -0,0 +1,638 @@
+#limit (11.0)##pagelength (16.5)##block##pageblock#
+#start (2.0,0.0)#
+#page (22)#
+#headodd#
+#center#gs-MP BAP#right#%
+
+#end#
+#headeven#
+%#center#gs-MP BAP
+
+#end#
+#center#4
+
+#center#Eine
+#center#kleine
+#center#Beispielsitzung
+
+
+4.1 Aufruf von 'Bildschirmarbeitsplatz' (BAP)
+
+ Wenn Sie, wie in Kapitel 3 beschrieben, eine
+Sohntask der Task eingerichtet haben, in der #on("b")#gs-MP
+BAP#off("b")# installiert ist, und dort bei 'gib kommando:'
+den Befehl:
+
+ #on("b")#bap <RETURN>#off("b")#
+
+geben, erscheint - nach dem #on("b")#gs-DIALOG#off("b")#-Eingangsbild­
+schirm - das folgende Menu:
+
+#on("b")#
+BAP: Simulation Parameter Konfiguration Dateien Archiv
++-------------------------------+-----------------------------------------
+| s Simulation ausführen |
+| --------------------------- |
+| a Auswertung auf Bildschirm |
+| d Drucken von Auswertungen |
++-------------------------------+
+
+
+
+
+
+
+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+4.2 Einstellung von Simulationsparametern
+
+ Bevor Sie eine Neueinstellung von Simulations­
+parametern vornehmen, sollten Sie sich einen Über­
+blick über die zur Zeit eingestellten Werte ver­
+schaffen. Zwar wäre es möglich, gleich einen Simu­
+lationslauf zu starten, doch müßten Sie dann gleich
+34 Minuten arbeiten - denn standardmäßig ist das
+Simulationssystem auf 3 Arbeitsphasen von je 10
+Minuten Dauer und zwei dazwischenliegende Pausen
+von je 2 Minuten eingestellt.
+ Wenn Sie sich die Einstellung anzeigen lassen
+wollen, müssen Sie das Pull-Down-Menu wechseln.
+Gehen Sie als durch Tippen der Pfeiltaste <rechts>
+zum Oberbegriff 'Parameter'. Dadurch wird das fol­
+gende Pull-Down-Menu aufgeschlagen:
+
+#on("b")#
+BAP: Simulation Parameter Konfiguration Dateien Archiv
+-------+---------------------------+--------------------------------------
+ | e Einstellung anzeigen |
+ | s Standardwerte |
+ | ----------------------- |
+ | b Breite des Werkstücks |
+ | h Höhe des Werkstücks |
+ | i Invers-/Normal |
+ | z Zeichensatz |
+ | f Fehlerzeichen |
+ | t Tastenbelegung |
+ | ----------------------- |
+ | a Anzahl Arbeitsphasen |
+ | d Dauer Arbeitsphase |
+ | p Pausendauer |
+ | ----------------------- |
+ | w Wertungsschlüssel |
+ +---------------------------+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+Nach Tippen der Taste <e> (für 'Einstellung anzei­
+gen') erscheint der folgende Bildschirm:
+
+#on("b")#
++-----------------------------------++-----------------------------------+
+| || Wertungsschlüssel |
+| Breite : 15 Zeichen || Bewertungs- |
+| Höhe : 12 Zeichen || faktor |
+| Darstellung : normal || |
+| Zeichensatz : A...Z (26 Zeichen)||1.0| + |
+| Fehlerzeichen: F || | + |
+| || | + |
+| Nach rechts : <rechts> || | + |
+| Nach links : <links> || | + |
+| Nach oben : <hoch> ||0.5| + |
+| Nach unten : <runter> || | + |
+| Ausbesserung : <HOP> || | + |
+| Nächstes : <ESC> || | + |
+| || | + |
+| Anzahl der Arbeitsphasen: 3 ||0.0+--|--|--|--|--|--|--|--|--|--| |
+| Dauer einer Arbeitsphase: 10 min || 0.0 0.5 1.0|
+| Dauer einer Pause : 2 min || |
+| || Ausbesserungsrate|
+| Simulationsgesamtdauer : 34 min || |
++-----------------------------------++-----------------------------------+
+--------------------------------------------------------------------------
+Zum Weitermachen irgendeine Taste tippen!
+#off("b")#
+
+ Oben links wird das "Aussehen" der Werkstücke
+auf dem Bildschirm beschrieben. Nach diesen Angaben
+sind die Werkstücke 15 Zeichen breit und 12 Zeichen
+hoch. Sie werden auf dem Bildschirm normal (nicht
+invers) dargestellt. Die Werkstücke werden aus den
+Großbuchstaben 'A ... Z' zusammengesetzt, wobei 'F'
+das Fehlerzeichen ist, nach dem gesucht werden
+soll.
+ Der Cursor kann mit den Pfeiltasten (<rechts>,
+<links>, <hoch> und <runter>) innerhalb des Werk­
+stücks bewegt werden. Steht der Cursor auf einem
+Fehlerzeichen, so verschwindet es, wenn die <HOP>-
+Taste getippt wird. Nach Tippen der <ESC>-Taste
+erscheint das nächste Werkstück auf dem Bildschirm.
+ Darunter sind die Informationen angegeben, die
+uns eigentlich interessieren: Die Anzahl/Zeiten für
+Arbeitsphasen und Pausen. Sie sollen die Simula­
+tionszeiten jetzt so verändern, daß die Gesamtsimu­
+lationszeit 3 Minuten beträgt. Wählen Sie dazu zu­
+erst die Menufunktion 'Anzahl Arbeitsphasen' durch
+Tippen der Taste <a>. Dann erscheint auf dem Bild­
+schirm folgendes Bild:
+
+#on("b")#
++-------------------------++-------------------------------------------+
+| Informationen || Anzahl Arbeitsphasen festlegen: |
+| || |
+| Kleinster Wert: 2 || Anzahl Arbeitsphasen neu festlegen (j/n)? |
+| Größter Wert: 20 || |
+| || |
+| Eingestellter Wert: 3 || |
++-------------------------++-------------------------------------------+
+
+
+
+ +-------------------------------------+
+ | Simulationszeiten: |
+ | |
+ | Anzahl der Arbeitsphasen: 3 |
+ | Dauer einer Arbeitsphase: 10 min |
+ | Dauer einer Pause : 2 min |
+ | |
+ | Simulationsgesamtdauer : 34 min |
+ +-------------------------------------+
+
+
+ Wenn Sie die im Fenster oben rechts gestellte
+Frage bejahen (Taste <j> tippen), ändert sich der
+Fensterinhalt:
+
+#on("b")#
++-------------------------++---------------------------------------------+
+| Informationen || Anzahl Arbeitsphasen festlegen: |
+| || |
+| Kleinster Wert: 2 ||Mit den Pfeilen <hoch> und <runter> den Wert|
+| Größter Wert: 20 ||einstellen. Eingabe mit <RETURN> abschließen.|
+| || |
+| Eingestellter Wert: 3 ||Bitte die Anzahl der Arbeitsphasen: 3 |
++-------------------------++---------------------------------------------+
+
+ Bestimmt ist Ihnen schon klar, was zu tun ist:
+Mit der Pfeiltaste <runter> stellen Sie den
+kleinstmöglichen Wert (2) ein - anschließend tippen
+Sie die <RETURN>-Taste. Schauen Sie auf das Fenster
+ganz unten - jetzt hätten Sie nur noch 24 Minuten
+zu arbeiten. Bevor Sie die anderen Parameter ein­
+stellen, bestätigen Sie bitte, daß Sie mit der An­
+zahl der Arbeitsphasen einverstanden sind.
+ Gehen Sie jetzt ebenso vor, um die 'Dauer (ei­
+ner) Arbeitsphase' und die 'Pausendauer' einzustel­
+len - eine Beschreibung dazu ist sicher überflüs­
+sig.
+ Rechts im Fenster ist noch der 'Wertungsschlüs­
+sel' angegeben - seine Bedeutung erläutern wir aber
+erst in Zusammenhang mit der Auswertung der Simula­
+tionsprotokolle.
+
+
+4.3 Ein Simulationslauf
+
+ So, jetzt können Sie zum Ausprobieren einen kur­
+zen Simulationslauf starten. Gehen Sie dazu zurück
+zum Pull-Down-Menu ganz links und wählen Sie hier
+die Menufunktion 'Simulation ausführen'. Zunächst
+werden Sie nach einer "Identifikation" gefragt.
+Geben Sie z.B. Ihren Namen ein und tippen Sie an­
+schließend die <RETURN>-Taste. Auf dem Bildschirm
+erscheinen oben alle Informationen, die Sie während
+der Simulation benötigen; darunter erscheint der
+Hinweis, daß mit dem nächsten Tastendruck die erste
+Arbeitsphase beginnt. Wenn das erste Werkstück auf
+dem Bildschirm erscheint, sieht das z.B. so aus:
+
+#on("b")#
++-------------------------------+ +-------------------------------------+
+| Nach rechts : <rechts> | | Anzahl der Arbeitsphasen: 3 |
+| Nach links : <links> | | Dauer einer Arbeitsphase: 10 min |
+| Nach oben : <hoch> | | Dauer einer Pause : 2 min |
+| Nach unten : <runter> | | Simulationsgesamtdauer : 34 min |
+| Ausbesserung : <HOP> | | |
+| Nächstes : <ESC> | | Fehlerzeichen : F |
++-------------------------------+ +-------------------------------------+
+
+ GFMKLPDRFGTZQAL
+ RTWOJLMNVWQHTRS
+ PZBFVDDSWWAFGBD
+ EWWQAKGHHJINMPA
+ WSSDEKLJNHHGTFD
+ GGTEWLVCXFFRPTR
+ TREKGLMNTREFGTW
+ TRWFGLMBVCCDSAQ
+ HGFRWZTCXYAASWW
+ MNNBHGTREWQKJLO
+ CCXSDRFGHKLPOZR
+ RWPPKHJUUZTFDSE
+
+
+ Nun dürfen Sie einmal zeigen, was Sie können.
+Bitte achten Sie darauf, daß Sie in jeder Arbeits­
+phase mindestens ein Werkstück bearbeiten - sonst
+könnte es später zu Fehlern bei der Auswertung kom­
+men. Sie sollen sich ja auch nicht ausruhen, son­
+dern arbeiten!
+ Pausen werden Ihnen auf dem Bildschirm ange­
+zeigt. Auch wenn Sie weiterarbeiten wollen - um die
+Pausen kommen Sie nicht herum! Am Ende einer Pause
+wird ein Hinweis auf das Pausenende ausgegeben.
+ Nach der letzten Arbeitsphase erhalten Sie eine
+Kurzauswertung des aktuellen Simualtionslaufes auf
+den Bildschirm (wenn Ihnen das nicht gefällt, kön­
+nen Sie das später auch abschalten). Zur Erläute­
+rung der angegebenen Daten in der 'Kurzauswertung'
+sehen Sie bitte das folgende Kapitel.
+
+
+4.4 Die Simulationsauswertung/das Simulations­
+ protokoll
+
+ Wenn Sie wollen, können Sie das Protokoll, das
+über Ihre Arbeit angefertigt wurde, gleich auswer­
+ten lassen. Wählen Sie dazu die Menufunktion 'Aus­
+wertung auf Bildschirm' (im gleichen Pull-Down-
+Menu). Ihnen werden jetzt alle Protokolle, die sich
+in Ihrer Task befinden, zur Auswahl angeboten.
+Wahrscheinlich ist es zur Zeit nur eine Protokoll­
+datei.
+ Jetzt sehen Sie auch, warum von Ihnen vor Simu­
+lationsbeginn eine "Identifikation" erbeten wurde.
+Sie ist Bestandteil des Protokollnamens - danach
+können Sie nämlich die Protokolle zuordnen. Verwen­
+den Sie mehrfach die gleiche Identifikation, so
+werden die Protokolle in der Reihenfolge ihrer An­
+lage durchnumeriert.
+ Wenn Sie den/die Dateinamen angekreuzt haben
+(z.B. mit <RETURN>) und die Auswahl durch <ESC><q>
+verlassen, werden die angekreuzten Protokolldateien
+ausgewertet und anschließend auf dem Bildschirm
+angezeigt.
+ Das Protokoll ist jeweils nach folgendem Schema
+aufgebaut: Zunächst werden Datum und Uhrzeit des
+Simulationslaufs ausgegeben; anschließend alle
+Kenndaten der Simulation, so daß daraus die gesamte
+Konfiguration des Simulationssystems rekonstruier­
+bar ist. Es folgt die "Gesamtauswertung" des Simu­
+lationslaufes, die identisch ist mit der auf dem
+Bildschirm angezeigten 'Kurzauswertung'. Die Ge­
+samtauswertung erfolgt nach den gleichen Grundsät­
+zen wie die sich anschließenden Auswertungen der
+einzelnen Werkstücke (es werden hier nur die ggf.
+angefallenen Pausenüberschreitung(en) mit in die
+Beurteilung einbezogen).
+ Das Protokoll ist durch die angehängten Bemer­
+kungen nahezu selbsterklärend. Damit Sie sich einen
+Eindruck verschaffen können, haben wir auf den
+nächsten Seiten ein ausgewertetes Protokoll abge­
+druckt. Bitte studieren Sie es eingehend - insbe­
+sondere die Anmerkungen am Ende des Protokolls:
+
+
+
+
+
+
+#on("b")#
+ gs-Protokoll: TEST - Auswertung
+ ===============================
+Datum : 03.09.87 Uhrzeit (zu Beginn): 10:21
+
+ Kenndaten der Werkstückbearbeitung:
+ ===================================
+Nach rechts : <rechts> Anzahl der Arbeitsphasen: 3
+Nach links : <links> Dauer einer Arbeitsphase: 10 min
+Nach oben : <hoch> Dauer einer Pause : 2 min
+Nach unten : <runter> Simulationsgesamtdauer : 34 min
+Ausbesserung : <HOP>
+Nächstes : <ESC> Fehlerzeichen : F
+
+Werkstückbreite : 15 Zeichen
+Werkstückhöhe : 12 Zeichen
+Anzahl Zeichen pro Werkstück : 180 Zeichen
+Umfang des Zeichensatzes : A ... Z ( 26 Zeichen)
+
+ Beispielwerkstück:
+ ------------------
+ QQSEUZSTABQBZWI
+ UKZVNYPHCPLQMGH
+ NDJZPCMOOPQQICL
+ ARELRDKUOOZWOIE
+ NASIPRLRQUKJHGN
+ YJJVKIGWCJOLRTL
+ FXSZBOBIBKQPYXN
+ JJFKFMEVALZNDPU
+ VTWWIHKWRMPMHZP
+ CSSFZBOSACLARKQ
+ WAAIMHJELLFKIWA
+ XLNHUCZRVXOXHRL
+
+
+
+ G e s a m t a u s w e r t u n g:
+ ================================
+Anzahl der vollständig bearbeiteten Werkstücke : 51
+Anzahl der Zeichen pro Werkstück : 180
+Anzahl der insgesamt untersuchten Zeichen : 9180
+
+Anzahl der Bedienfehler : 3
+
+Anzahl der vorgegebenen Fehler : 363
+Anzahl der Fehlerkorrekturen : 304
+Arbeitszeit (incl. Pausenüberschreitungen) : 1792.5 sec
+Anzahl bearbeiteter Zeichen pro Sekunde : 5.1
+
+Ausbesserungsrate : 0.8
+Bewertungsfaktor : 0.8
+
+Gesamtbewertung (incl. Pausenüberschreitungen) : 4.3
+================================================ ========
+Arbeitszeit (ohne Pausenüberschreitungen) : 1788.5 sec
+Anzahl bearbeiteter Zeichen pro Sekunde : 5.1
+Gesamtbewertung (ohne Pausenüberschreitungen) : 4.3
+================================================ ========
+
+
+ Einzelauswertung der Werkstücke:
+ ================================
+
+Werk- | Anzahl | Vorge- | Anzahl | Benö- | Zei- | Aus- |Bewer- | Bewer-
+stück- | Be- | gebene | Kor- | tigte | chen | bes- |tungs- | tungs-
+nummer | dien- | Feh- | rek- | Zeit | pro | se- |faktor | zahl
+ | feh- | ler- | turen | [sec] | Se- | rungs-| |
+ | ler | zahl | | | kunde | rate | |
+--------------------------------------------------------------------------
+ | | | | | | | |
+ 1 | 0 | 5 | 3 | 45.6 | 3.9 | 0.6 | 0.6 | 2.4
+ 2 | 0 | 10 | 6 | 33.5 | 5.4 | 0.6 | 0.6 | 3.2
+ 3 | 0 | 5 | 4 | 35.7 | 5.0 | 0.8 | 0.8 | 4.0
+ 4 | 0 | 3 | 3 | 33.9 | 5.3 | 1.0 | 1.0 | 5.3
+ 5 | 0 | 10 | 7 | 38.0 | 4.7 | 0.7 | 0.7 | 3.3
+ 6 | 0 | 5 | 4 | 37.2 | 4.8 | 0.8 | 0.8 | 3.9
+ 7 | 0 | 9 | 8 | 36.9 | 4.9 | 0.9 | 0.9 | 4.3
+ 8 | 0 | 5 | 4 | 31.7 | 5.7 | 0.8 | 0.8 | 4.5
+ 9 | 0 | 4 | 3 | 27.3 | 6.6 | 0.8 | 0.8 | 4.9
+ 10 | 0 | 6 | 6 | 33.3 | 5.4 | 1.0 | 1.0 | 5.4
+ 11 | 0 | 3 | 3 | 25.0 | 7.2 | 1.0 | 1.0 | 7.2
+ 12 | 0 | 6 | 3 | 28.6 | 6.3 | 0.5 | 0.5 | 3.1
+ 13 | 0 | 11 | 10 | 37.9 | 4.7 | 0.9 | 0.9 | 4.3
+ 14 | 0 | 4 | 4 | 38.3 | 4.7 | 1.0 | 1.0 | 4.7
+ 15 | 0 | 11 | 8 | 39.3 | 4.6 | 0.7 | 0.7 | 3.3
+ 16 | 0 | 5 | 4 | 28.4 | 6.3 | 0.8 | 0.8 | 5.1
+ 17 | 0 | 4 | 4 | 36.4 | 4.9 | 1.0 | 1.0 | 4.9
+ 18 | 0 | 15 | 14 | 44.9 | 4.0 | 0.9 | 0.9 | 3.7
+
+ PAUSE ---> Überzogen um 2.2 sec
+
+ 19 | 0 | 3 | 3 | 38.9 | 4.6 | 1.0 | 1.0 | 4.6
+ 20 | 0 | 11 | 10 | 40.2 | 4.5 | 0.9 | 0.9 | 4.1
+ 21 | 0 | 8 | 7 | 34.7 | 5.2 | 0.9 | 0.9 | 4.5
+ 22 | 0 | 7 | 5 | 30.3 | 5.9 | 0.7 | 0.7 | 4.2
+ 23 | 0 | 4 | 4 | 33.9 | 5.3 | 1.0 | 1.0 | 5.3
+ 24 | 0 | 7 | 7 | 39.5 | 4.6 | 1.0 | 1.0 | 4.6
+ 25 | 0 | 6 | 4 | 28.1 | 6.4 | 0.7 | 0.7 | 4.3
+ 26 | 0 | 11 | 10 | 34.8 | 5.2 | 0.9 | 0.9 | 4.7
+ 27 | 0 | 11 | 9 | 34.2 | 5.3 | 0.8 | 0.8 | 4.3
+ 28 | 0 | 10 | 8 | 35.0 | 5.1 | 0.8 | 0.8 | 4.1
+ 29 | 0 | 9 | 8 | 36.4 | 4.9 | 0.9 | 0.9 | 4.4
+ 30 | 0 | 8 | 7 | 34.8 | 5.2 | 0.9 | 0.9 | 4.5
+ 31 | 0 | 10 | 8 | 36.2 | 5.0 | 0.8 | 0.8 | 4.0
+ 32 | 0 | 10 | 10 | 44.0 | 4.1 | 1.0 | 1.0 | 4.1
+ 33 | 0 | 8 | 8 | 44.4 | 4.1 | 1.0 | 1.0 | 4.1
+ 34 | 0 | 4 | 3 | 35.6 | 5.1 | 0.8 | 0.8 | 3.8
+
+ PAUSE ---> Überzogen um 1.8 sec
+
+ 35 | 0 | 8 | 8 | 42.7 | 4.2 | 1.0 | 1.0 | 4.2
+ 36 | 1 | 8 | 8 | 45.3 | 4.0 | 1.0 | 1.0 | 4.0
+ 37 | 0 | 5 | 5 | 34.3 | 5.2 | 1.0 | 1.0 | 5.2
+ 38 | 0 | 5 | 4 | 27.9 | 6.5 | 0.8 | 0.8 | 5.2
+ 39 | 0 | 10 | 8 | 39.5 | 4.6 | 0.8 | 0.8 | 3.6
+ 40 | 1 | 7 | 6 | 35.5 | 5.1 | 0.9 | 0.9 | 4.3
+ 41 | 0 | 3 | 3 | 29.5 | 6.1 | 1.0 | 1.0 | 6.1
+ 42 | 0 | 5 | 5 | 30.2 | 6.0 | 1.0 | 1.0 | 6.0
+ 43 | 0 | 6 | 3 | 28.0 | 6.4 | 0.5 | 0.5 | 3.2
+ 44 | 0 | 5 | 4 | 30.2 | 6.0 | 0.8 | 0.8 | 4.8
+ 45 | 0 | 5 | 4 | 33.1 | 5.4 | 0.8 | 0.8 | 4.4
+ 46 | 0 | 8 | 7 | 33.7 | 5.3 | 0.9 | 0.9 | 4.7
+ 47 | 0 | 9 | 7 | 32.2 | 5.6 | 0.8 | 0.8 | 4.3
+ 48 | 0 | 9 | 8 | 37.5 | 4.8 | 0.9 | 0.9 | 4.3
+ 49 | 0 | 4 | 4 | 32.0 | 5.6 | 1.0 | 1.0 | 5.6
+ 50 | 0 | 9 | 7 | 34.8 | 5.2 | 0.8 | 0.8 | 4.0
+ 51 | 1 | 9 | 4 | 29.2 | 6.2 | 0.4 | 0.4 | 2.7
+ | | | | | | | |
+==========================================================================
+
+( 52 | 0 | 7 | 7 | 35.9 | 5.0 | 1.0 | 1.0 | 5.0)
+
+ Anmerkungen:
+ =============
+
+ - Das zuletzt bearbeitete Werkstück (in der obigen Tabelle unterhalb
+ der letzten Trennlinie in Klammern angegeben) wurde nicht vollstän-
+ dig innerhalb der zur Verfügung stehenden Zeit bearbeitet.
+ Aus diesem Grunde wird es bei der Auswertung (Gesamtwertung) nicht
+ berücksichtigt!
+
+ - Bei der Auflistung der Daten der einzelnen Werkstücke sind auch die
+ Pausen eingetragen, so daß sich die einzelnen Arbeitsphasen erken-
+ nen und miteinander vergleichen lassen. Die dabei notierten Zeiten
+ geben die Pausenüberschreitungen an. Diese Zeiten bleiben bei der
+ Betrachtung der einzelnen Werkstücke unberücksichtigt, fließen aber
+ in die Gesamtauswertung ein!
+
+ - Die Anzahl der Bedienfehler ist ein Maß für die Sicherheit im Um-
+ gang mit dem System. Bei den weiteren Auswertungen bleibt die Be-
+ dienfehlerzahl allerdings unberücksichtigt!
+
+ - Die 'Vorgegebene Fehlerzahl', die 'Anzahl Korrekturen' und die 'Be-
+ nötigte Zeit [sec]' wurden bei der Bearbeitung des Werkstücks er-
+ faßt. Auf diesen Daten beruhen die folgenden Auswertungen!
+
+ - Da die Werkstücke ganz unterschiedliche Größen haben können, eignet
+ sich die 'Benötigte Zeit [sec]', die für die Bearbeitung eines je-
+ den Werkstücks ermittelt wird, als Maß für die "Arbeitsgeschwindig-
+ keit" nicht! Stattdessen wird ermittelt, wie viele Zeichen pro Se-
+ kunde "bearbeitet" wurden:
+
+ Anzahl Zeichen pro Werkstück
+ Zeichen pro Sekunde = ----------------------------
+ Benötigte Zeit [sec]
+
+ Die 'Anzahl Zeichen pro Werkstück' kann aus der Werkstückbreite und
+ Werkstückhöhe ermittelt werden:
+
+ Anzahl Zeichen pro Werkstück = Werkstückbreite * Werkstückhöhe
+
+ - Aus der (zufällig) 'Vorgegebenen Fehlerzahl' und der 'Anzahl Kor-
+ rekturen' wird die 'Ausbesserungsrate' ermittelt:
+
+ Anzahl Korrekturen
+ Ausbesserungsrate = ----------------------
+ Vorgegebene Fehlerzahl
+
+ Die Ausbesserungsrate gibt an, welcher Anteil der vorhandenen Feh-
+ ler ausgebessert wurde. Sie ist ein Maß für die Güte der verrichte-
+ ten Arbeit.
+
+ - Der 'Bewertungsfaktor' ist abhängig von der 'Ausbesserungsrate'. Er
+ läßt sich aus dem folgenden Diagramm entnehmen:
+
+ Bewertungs-
+ faktor
+
+ 1.0| +
+ | +
+ | +
+ | +
+ | +
+ 0.5| +
+ | +
+ | +
+ | +
+ | +
+ 0.0+--|--|--|--|--|--|--|--|--|--|
+ 0.0 0.5 1.0
+ Ausbesserungsrate
+
+
+ In diesem Diagramm ist festgelegt, wie die einzelnen 'Ausbesse-
+ rungsraten' bewertet werden.
+
+ - Am Ende wird die 'Bewertungszahl' folgendermaßen ermittelt:
+
+ Bewertungszahl = Zeichen pro Sekunde * Bewertungsfaktor
+
+ Da der 'Bewertungsfaktor' nur Werte zwischen 0 und 1 annehmen kann,
+ ist die 'Bewertungszahl' ein Wert zwischen 0 und der 'Zeichen pro
+ Sekunde'. Die "Arbeitsleistung" war um so größer, je höher die 'Be-
+ wertungszahl ist.
+
+Eine weitere Kommentierung des Protokolls dürfte
+sich wohl erübrigen, wenn Sie die Anmerkungen in­
+tensiv studiert haben.
+
+
+4.5 Hinweise zur Protokollauswertung
+
+4.5.1 Der Bewertungsfaktor
+
+ Sie haben sich sicher über den sogenannten 'Be­
+wertungsfaktor' gewundert, der an verschiedenen
+Stellen genannt wird - aber bisher unberücksichtigt
+blieb. In den bisher aufgezeigten Situationen war
+der Bewertungsfaktor identisch mit der 'Ausbesse­
+rungsrate'. Warum dieser Faktor gesondert einge­
+führt wurde, möchten wir an einem kleinen Beispiel
+erläutern:
+ Wenn Ihnen der Auswertalgorithmus vor dem Simu­
+lationslauf bekannt gewesen wäre und Sie die Ab­
+sicht gehabt hätten, eine möglichst hohe Bewer­
+tungszahl zu erzielen, wäre folgende "Arbeitsstra­
+tegie" erfolgversprechend gewesen:
+ Sobald ein Werkstück auf dem Bildschirm er­
+scheint, bewegen Sie den Cursor schnellstens zum
+ersten Fehlerzeichen, das Sie entdecken können und
+löschen es mit der Ausbesserungstaste. Sollten zu­
+fällig noch weiterer Fehlerzeichen in unmittelbarer
+Nähe zu sehen sein, so können Sie sie ja auch "aus­
+merzen" - aber dann schnell das nächste Werkstück
+anfordern usw.
+ Machen wir uns klar, was das bedeutet: Da sie
+das Werkstück in sehr kurzer Zeit bearbeitet haben,
+wird der eigentlich entscheidende Faktor hinsicht­
+lich der Auswertung "enorm in die Höhe getrieben"
+(die Anzahl der Zeichen pro Sekunde). Da Sie bei
+dieser Strategie zumeist nur 2 - 4 Sekunden zur
+Bearbeitung eines Werkstücks brauchen, erhalten Sie
+- auf das obige Beispielprotokoll bezogen - Werte
+zwischen 90.0 und 45.0 (bearbeitete Zeichen pro
+Sekunde).
+ Im Schnitt treten pro Werkstück etwa 7 Fehler­
+zeichen auf (sehen Sie dazu auch unter 'Aufbau der
+Werkstücke'), von denen Sie dann eines korrigiert
+haben. Sie kommen also auf eine durchschnittliche
+Ausbesserungsrate von 0.14. Wäre - wie im obigen
+Beispielprotokoll - der Bewertungsfaktor mit der
+Ausbesserungsrate identisch, so erhielten Sie Be­
+wertungszahlen zwischen 12.9 und 6.4. Ein deut­
+licher Unterschied zur "Leistung" die im Protokoll
+dokumentiert ist - oder?
+ Das aber ist nicht Sinn der dem Benutzer ge­
+stellten Aufgabe! Es würde auch nicht einer sinn­
+vollen 'Kontrolltätigkeit' entsprechen, wenn derart
+viele Fehler unentdeckt blieben. Um hier "regulie­
+rend" einschreiten zu können, ist der 'Bewertungs­
+faktor' eingeführt worden. So können Sie festlegen,
+daß Werkstücke, in denen weniger als 80% der Fehler
+entdeckt wurden, bei der Auswertung unberücksich­
+tigt bleiben. Sie brauchen dazu nur den Bewertungs­
+schlüssel entsprechend einzustellen. ("Ziehen Sie
+dazu bei der Einstellung des Bewertungsschlüssels
+die ersten 8 Kreuzchen auf die Grundlinie").
+ Anders ausgedrückt: Durch die Manipulation des
+Bewertungsschlüssels können Sie die Anforderungen,
+die an die Werkstückbearbeitung gestellt werden,
+festlegen. Hierdurch entscheiden Sie über die Wer­
+tigkeit von Schnelligkeit und Genauigkeit.
+ Übrigens wird der zur Simulationszeit einge­
+stellte Wertungsschlüssel mit im Protokoll notiert.
+Eine Auswertung des Protokolls mit verschiedenen
+Wertungsschlüsseln ist so nicht möglich - und auch
+nicht sinnvoll. Denn sonst könnte es ja vorkommen,
+daß der Anwender ein ganz anderes Ergebnis in der
+Kurzauswertung auf dem Bildschirm gezeigt bekommt
+als er nachher im Protokoll nachlesen kann. Wenn
+Sie also mit einem veränderten Wertungsschlüssel
+arbeiten wollen, müssen Sie ihn #on("u")#vor dem Simula­
+tionslauf#off("u")# eingestellt haben!
+
+
+4.5.2 Fehlerzeichenhäufigkeit in den Werkstücken
+
+ Die Häufigkeit des Auftretens der Fehlerzeichen
+in den einzelnen Werkstücken kann deutlich schwan­
+ken. Die Werkstücke werden nämlich mit Hilfe des
+Zufallszahlengenerators aufgebaut. Je nach Anzahl
+der verschiedenen Zeichen, die in einem Werkstück
+auftreten können, ändert sich auch der Anteil der
+auftretenden Fehlerzeichen.
+ In unserem bisher betrachteten Beispiel können
+26 verschiedene Buchstaben im Werkstück auftreten.
+Ein Werkstück besteht aus 180 Zeichen. In 1/26 al­
+ler Fälle müßte also das Fehlerzeichen auftreten,
+d.h. also etwa 7 Fehlerzeichen pro Werkstück - al­
+lerdings auf eine große Anzahl von produzierten
+Werkstücken bezogen. Da die Werkstücke zufällig
+zusammengesetzt werden, gilt dieser Wert natürlich
+nicht für das einzelne Werkstück!
+
+
+4.5.3 Fehlerhafte Auswertungen
+
+ In zwei Situationen kann es zu Fehlern bei der
+Auswertung von Protokollen kommen:
+
+ Wurde der Simulationslauf mit der <SV>-Taste
+rigoros abgebrochen, so ist ggf. eine sinnvolle
+Auswertung des Protokolls nicht möglich, da nur
+unvollständige Daten vorhanden sind.
+
+ In der letzten Arbeitsphase eines Simulations­
+laufes muß zumindest ein Werkstück angefordert wor­
+den sein. Dehnt ein Anwender die letzte Pause so
+lange aus, daß das Pausenende über das Ende der
+letzten Arbeitsphase hinausreicht, so erscheinen im
+Protokoll keine Werte für die einzelnen Werkstücke
+- in der Gesamtauswertung sind (fast) alle Werte
+auf '0' gesetzt.
+
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5
new file mode 100644
index 0000000..d08e4a7
--- /dev/null
+++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5
@@ -0,0 +1,699 @@
+#limit (11.0)##pagelength (16.5)##block##pageblock#
+#start (2.0,0.0)#
+#page (40)#
+#headodd#
+#center#gs-MP BAP#right#%
+
+#end#
+#headeven#
+%#center#gs-MP BAP
+
+#end#
+#center#5
+
+#center#Beschreibung
+#center#der
+#center#Menufunktionen
+
+#center#(Programmteil 'Bildschirmarbeitsplatz' (BAP))
+
+
+5.1 Kurzhinweise zur Bedienung des Menus
+
+ Die Bedienung des Menus ist sehr einfach. Eine
+ausführliche Beschreibung dazu finden Sie in den
+Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser
+Stelle sollen nur die wesentlichen Bedienungsvor­
+gänge beschrieben werden.
+
+- Mit der Tastenfolge <ESC><?> können Sie sich
+ Informationen zur Bedienung des Menusystems in
+ das Menu einblenden lassen.
+
+- Mit den Pfeiltasten <rechts> und <links> können
+ Sie zwischen den "Oberbegriffen" in der Kopfzei­
+ le wählen. Der aktuelle Oberbegriff ist jeweils
+ invers dargestellt. Das ausgeklappte 'Pull-
+ Down-Menu' bezieht sich auf diesen invers darge­
+ stellten Oberbegriff.
+
+- Mit den Pfeiltasten <hoch> und <runter> können
+ Sie zwischen den Menufunktionen wählen, die
+ Ihnen im aktuellen Pull-Down-Menu zur Auswahl
+ angeboten werden. Die aktuell angewählte Menu­
+ funktion wird jeweils invers dargestellt. Die
+ Trennlinien, die in einigen Pull-Down-Menus
+ sichtbar sind, dienen nur der optischen Unter­
+ gliederung; sie können nicht angewählt werden
+ und werden deshalb automatisch übersprungen. Die
+ einzelnen Menupunkte sind "zyklisch miteinander
+ verknüpft", das heißt, man gelangt vom untersten
+ Menupunkt wieder zum obersten und umgekehrt.
+ Menupunkte, vor denen ein Minuszeichen steht
+ ('-'), sind (zur Zeit) nicht aktivierbar; auch
+ sie können nicht angewählt werden und werden
+ einfach übersprungen.
+
+- Durch Tippen der Fragezeichentaste (<?>) können
+ Sie sich jeweils zur aktuellen Menufunktion (in­
+ vers im Pull-Down-Menu) Informationen in das
+ Menu einblenden lassen.
+
+- Um eine Menufunktion ausführen zu lassen, bewe­
+ gen Sie sich mit den Pfeiltasten auf die ge­
+ wünschte Menufunktion im aktuellen Pull-Down-
+ Menu und tippen dann die <RETURN>-Taste. Steht
+ vor dem gewünschten Menupunkt ein einzelner
+ Buchstabe oder eine Ziffer, so kann durch Tippen
+ der entsprechenden Taste diese Menufunktion da­
+ durch direkt aufgerufen werden. Sobald eine Me­
+ nufunktion aufgerufen worden ist, erscheint da­
+ vor ein Stern ('*'). Daraus können Sie entneh­
+ men, daß das System bereits den Auftrag aus­
+ führt.
+
+- An verschiedenen Stellen werden Fragen an Sie
+ gerichtet, die Sie mit 'ja' oder 'nein' beant­
+ worten müssen. Tippen Sie dazu entsprechend der
+ Entscheidung die Taste <j> (für 'ja') bzw. <n>
+ (für 'nein').
+
+- Werden Ihnen vom Menu aus Dateinamen zur Auswahl
+ angeboten, so können Sie den auf dem Bildschirm
+ sichtbaren Pfeil vor den gewünschten Namen posi­
+ tionieren. Mit den Tasten <x> oder <RETURN> kön­
+ nen Sie den Namen ankreuzen. Ist die Auswahl
+ mehrerer Dateinamen möglich, so können Sie den
+ Vorgang wiederholen. Mit den Tasten <o> oder
+ <RUBOUT> können Sie auch ein Kreuz vor einem
+ Namen wieder löschen. Daneben gibt es noch eini­
+ ge Tastenfunktionen, die für die Bedienung recht
+ hilfreich sein können. Tippen Sie während der
+ Auswahl die Fragezeichentaste (<?>), so werden
+ Ihnen alle Bedienungsmöglichkeiten auf dem Bild­
+ schirm angezeigt. Eine Auswahl, in der mehrere
+ Dateien angekreuzt werden dürfen, wird durch die
+ Tastenfolge <ESC><q> verlassen. Anschließend
+ wird die eingestellte Operation mit den ange­
+ kreuzten Dateien ausgeführt. Sind Sie versehent­
+ lich in eine solche Auswahl gelangt, so können
+ Sie den Vorgang durch die Tastenkombination
+ <ESC><h> abbrechen.
+
+- An einigen Stellen werden Sie aufgefordert, eine
+ Eingabe zu machen (z.B. einen Dateinamen einzu­
+ geben). Wird Ihnen hier ein Vorschlag gemacht,
+ den Sie akzeptieren, so brauchen Sie zur Bestä­
+ tigung nur die <RETURN>-Taste zu tippen. Ge­
+ fällt Ihnen der Vorschlag nicht oder wird Ihnen
+ kein Vorschlag gemacht, so machen Sie bitte die
+ gewünschte Eingabe. Zum Schreiben stehen Ihnen
+ alle aus dem Editor bekannten Funktionen zur
+ Verfügung. Mit der Taste <RUBOUT> können Sie
+ Buchstaben löschen, mit <RUBIN> einfügen. Die
+ Eingabe wird durch Tippen der <RETURN>-Taste
+ abgeschlossen. Ist der von Ihnen gewünschte Name
+ schon in Ihrer Task vorhanden und steht in der
+ Fußzeile der Hinweis 'Zeigen: <ESC><z>', dann
+ können Sie sich auch alle vorhandenen Namen zur
+ Auswahl anbieten lassen und durch Ankreuzen den
+ beabsichtigten Namen auswählen.
+
+- Ihnen können auch mehrere Alternativen angeboten
+ werden, zwischen denen Sie wählen müssen. In der
+ untersten Zeile eines solchen Kastens, in denen
+ Ihnen die Alternativen auf dem Bildschirm einge­
+ blendet werden, sind die Möglichkeiten aufge­
+ führt, die darüber beschrieben sind. Mit den
+ Pfeiltasten können sie die Markierung auf die
+ gewünschte Alternative positionieren und dann
+ durch die <RETURN>-Taste zur Ausführung bringen.
+ (Manchmal ist das auch durch Tippen der den Al­
+ ternativen vorangestellten Buchstaben oder Zif­
+ fern möglich).
+
+- Durch die Tastenfolge <ESC><q> kann das Menu
+ insgesamt verlassen werden. Damit das nicht ver­
+ sehentlich geschieht, wird jeweils die Frage
+ gestellt, ob Sie das Menu tatsächlich verlassen
+ wollen. Diese Frage beantworten Sie bitte je
+ nach Wunsch mit 'ja' oder 'nein' durch Tippen
+ der Tasten <j> bzw. <n>.
+
+#page#
+5.2 Menufunktionen zum Oberbegriff 'Simulation'
+
+#on("b")#
+BAP: Simulation Parameter Konfiguration Dateien Archiv
++-------------------------------+-----------------------------------------
+| s Simulation ausführen |
+| --------------------------- |
+| a Auswertung auf Bildschirm |
+| d Drucken von Auswertungen |
++-------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+#on("u")##on("b")#s Simulation ausführen#off("b")##off("u")#
+ Mit dieser Menufunktion starten Sie einen
+ Simulationslauf. Bevor Sie aber mit der Arbeit
+ am Bildschirmarbeitsplatz beginnen können,
+ wird eine "Identifikation" (Vor- und Nachname)
+ von Ihnen verlangt. Das Protokoll, das bei der
+ Simulation entsteht, erhält dann die hier ein­
+ gegebene Kennung. Geben Sie für mehrere Proto­
+ kolle den gleichen Namen an, so werden die
+ Protokolle in der Reihenfolge ihrer Anlage
+ durchnumeriert.
+ Nach Eingabe der Kennung werden oben auf
+ dem Bildschirm die zur Zeit eingestellten Si­
+ mulationsdaten angezeigt - alle Daten, die Sie
+ zur Bedienung während der Simulation benöti­
+ gen. Die eigentliche Simulation beginnt erst
+ mit dem nächsten Tastendruck; dazu erfolgt ein
+ Hinweis auf dem Bildschirm.
+ Nach Abschluß der Simulation wird Ihnen
+ gegebenenfalls (sehen Sie dazu auch die Menu­
+ funktion 'k Kurzauswertung' unter dem Oberbe­
+ griff 'Konfiguration') eine Kurzauswertung auf
+ dem Bildschirm ausgegeben. Anschließend gelan­
+ gen Sie zurück in das Menu.
+ Diese Menufunktion hat eine ähnliche Wir­
+ kung wie der Aufruf des Programms 'Material­
+ prüfung' (MP). Im Gegensatz zum Aufruf des
+ Programms 'Materialprüfung' (MP - mit dem Be­
+ fehl: mp <RETURN>) werden hier allerdings kei­
+ ne ausführlichen Informationen vor dem eigent­
+ lichen Simulationslauf ausgegeben, sondern es
+ wird nur nach einer Identifikation (Vorname
+ und Nachname) gefragt. Nach Abschluß der Si­
+ mulation verbleibt das Protokoll in der Task -
+ es wird nicht, wie im Programmteil 'Material­
+ prüfung', in die Vatertask geschickt.
+
+#on("u")##on("b")#a Auswertung auf Bildschirm#off("b")##off("u")#
+ Alle Simulationsprotokolle, die sich in
+ Ihrer Task befinden, werden Ihnen zur Auswahl
+ angeboten. Wenn Sie den/die gewünschten Proto­
+ kollnamen angekreuzt und die Auswahl mit der
+ Tastenfolge <ESC><q> verlassen haben, werden
+ die Protokolle nacheinander in der Ankreuzrei­
+ henfolge ausgewertet und die Auswertungen auf
+ dem Bildschirm angezeigt.
+ Die gesamte Auswertung kann zwar nicht auf
+ einmal auf dem Bildschirm angezeigt werden -
+ Sie können aber das Fenster mit <HOP><hoch>
+ und <HOP><runter> rollen und so in die gesamte
+ Datei Einsicht nehmen. Gegebenenfalls (sehen
+ Sie dazu auch die Menufunktion 'u Umfang der
+ Auswertung' unter dem Oberbegriff 'Konfigura­
+ tion') werden an das Ende der eigentlichen
+ Ergebnisse noch Erläuterungen zum Protokoll
+ ausgegeben. (Zur Protokollauswertung selbst
+ sehen Sie bitte Kapitel 4.4). Da die Auswer­
+ tung jeweils in eine Datei geschrieben wird,
+ können Sie sie mit der Tastenkombination
+ <ESC><q> verlassen.
+
+ Fehlerfälle: - Sehen Sie dazu bitte Kapitel
+ 4.5.3
+
+#on("u")##on("b")#d Drucken von Auswertungen#off("b")##off("u")#
+ Alle Simulationsprotokolle, die sich in
+ Ihrer Task befinden, werden Ihnen zur Auswahl
+ angeboten. Wenn Sie den/die gewünschten Proto­
+ kollnamen angekreuzt und die Auswahl mit der
+ Tastenfolge <ESC><q> verlassen haben, werden
+ die Protokolle nacheinander in der Ankreuzrei­
+ henfolge ausgewertet und die Auswertdateien
+ zum Drucker geschickt.
+ #on("b")#ACHTUNG!#off("b")# Zum Ausdruck von Simulationsproto­
+ kollen muß unbedingt diese Menufunktion ge­
+ wählt werden! Zwar können normale Textdateien
+ auch mit dem Menupunkt 'Drucken' unter dem
+ Oberbegriff 'Dateien' ausgedruckt werden - das
+ gilt aber nicht für die bei den Simulationen
+ erzeugten Protokolldateien, die Sie am Präfix
+ 'gs-Protokoll:' erkennen können.
+ Der Ausdruck der Protokollauswertungen er­
+ folgt normalerweise im Standardschrifttyp Ih­
+ res Druckers. Es besteht allerdings die Mög­
+ lichkeit, einen anderen Schrifttyp für den
+ Ausdruck der Protokolldateien einzustellen.
+ Sehen Sie dazu bitte im Kapitel 6 'Hinweise
+ für den Systembetreuer'.
+
+#page#
+5.3 Menufunktionen zum Oberbegriff 'Parameter'
+
+#on("b")#
+BAP: Simulation Parameter Konfiguration Dateien Archiv
+-------+---------------------------+--------------------------------------
+ | e Einstellung anzeigen |
+ | s Standardwerte |
+ | ----------------------- |
+ | b Breite des Werkstücks |
+ | h Höhe des Werkstücks |
+ | i Invers-/Normal |
+ | z Zeichensatz |
+ | f Fehlerzeichen |
+ | t Tastenbelegung |
+ | ----------------------- |
+ | a Anzahl Arbeitsphasen |
+ | d Dauer Arbeitsphase |
+ | p Pausendauer |
+ | ----------------------- |
+ | w Wertungsschlüssel |
+ +---------------------------+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+#on("u")##on("b")#e Einstellung anzeigen#off("b")##off("u")#
+ Auf dem Bildschirm erscheinen zwei Fenster.
+ Im Fenster links werden alle Werte angezeigt,
+ die die Parameter zur Zeit annehmen. Oben kön­
+ nen Sie ablesen, welches Aussehen ein Werk­
+ stück nach der augenblicklichen Einstellung
+ auf dem Bildschirm hätte. Darunter ist angege­
+ ben, welche Tasten bei der Bearbeitung der
+ Werkstücke während des Simulationslauf benutzt
+ werden können. Unten ist noch aufgeführt, wie
+ viele Arbeitsphasen vorgesehen sind und wie
+ lange die Arbeitsphasen, Pausen und die Ge­
+ samtsimulation dauern.
+ Im Fenster rechts wird ein Diagramm ausge­
+ geben. Hier ist der Bewertungsfaktors in Ab­
+ hängigkeit von der Ausbesserungsrate darge­
+ stellt. Hinsichtlich der Bedeutung des Bewer­
+ tungsfaktors sehen Sie bitte in Kapitel 4.5.1.
+ Die Anzeige kann durch Tippen einer belie­
+ bigen Taste verlassen werden.
+
+#on("u")##on("b")#s Standardwerte#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie mit ei­
+ nem Tastendruck die sogenannten "Standardwer­
+ te" einstellen - die Werte, die die Parameter
+ haben, wenn das System "frisch installiert"
+ ist.
+ Zur Sicherheit zeigt das System die aktuel­
+ len Werte an und erfragt, ob Sie die Standard­
+ werte tatsächlich einstellen wollen. Bejahen
+ Sie diese Frage, so werden alle aktuellen Wer­
+ te durch die Standardwerte überschrieben und
+ auf dem Bildschirm angezeigt. Von dieser Ein­
+ stellung ist auch der Wertungsschlüssel be­
+ troffen - der aber nicht angezeigt wird. Die
+ Einstellung wird derart vorgenommen, daß Be­
+ wertungsfaktor und Ausbesserungsrate identisch
+ sind.
+
+#on("u")##on("b")#b Breite des Werkstücks#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie die An­
+ zahl der Zeichen je Werkstückzeile festlegen.
+ Im Fenster links oben werden der kleinstmög­
+ liche Wert (1), der größtmögliche Wert (70)
+ und der aktuell eingestellte Wert angezeigt.
+ Unten erscheint zur Kontrolle ein Werkstück,
+ das den aktuellen Parameterwerten entspricht.
+ Im Fenster rechts oben wird an Sie die Fra­
+ ge gerichtet, ob Sie tatsächlich eine Verände­
+ rung vornehmen möchten. Haben Sie versehent­
+ lich diesen Menupunkt gewählt, verneinen Sie
+ einfach diese Frage (Taste <n>) und gelangen
+ so - unter Beibehaltung des z.Z. eingestellten
+ Wertes - zurück in das Menu.
+ Bejahen Sie die Frage, so erhalten Sie die
+ Möglichkeit, den bisher eingestellten Wert mit
+ der Pfeiltaste <hoch> zu erhöhen, mit der
+ Pfeiltaste <runter> zu erniedrigen - aller­
+ dings nur innerhalb der angezeigten Grenzen.
+ Wenn Sie die gewünschte Einstellung vorgenom­
+ men und die Eingabe durch <RETURN> abgeschlos­
+ sen haben, erscheint ein Werkstück in der neu
+ eingestellten Breite unten auf dem Bildschirm.
+ Bejahen Sie die Frage, ob Sie mit der Werk­
+ stückbreite einverstanden sind, dann gelangen
+ Sie ins Menu zurück; ansonsten können Sie die
+ Werkstückbreite nach gleichem Verfahren erneut
+ einstellen.
+
+#on("u")##on("b")#h Höhe des Werkstücks#off("b")##off("u")#
+ Die Einstellung der Werkstückhöhe (Anzahl
+ Zeichen pro Werkstückspalte) erfolgt analog
+ zur Einstellung der Werkstückbreite - sehen
+ Sie bitte dort.
+
+#on("u")##on("b")#i Invers-/Normal#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie festle­
+ gen, ob das zu bearbeitende Werkstück 'normal'
+ oder 'invers' dargestellt wird. Diese Darstel­
+ lung ist aber immer in Abhängigkeit von der
+ Grundeinstellung Ihres Bildschirms zu sehen.
+ Wenn Ihr Bildschirm normalerweise helle Zei­
+ chen auf dunklem Grund darstellt, so bedeutet
+ 'normal' eben diese Einstellung; 'invers' be­
+ deutet dann, daß die Zeichen des Werkstücks
+ dunkel auf hellem Grund dargestellt werden -
+ bei anderer Bildschirmgrundeinstellung eben
+ umgekehrt.
+ Unten auf dem Bildschirm wird Ihnen zur
+ Kontrolle ein Werkstück in aktueller Darstel­
+ lung gezeigt. Im Fenster oben rechts erscheint
+ die Frage, ob Sie eine Veränderung der augen­
+ blicklichen Einstellung wünschen. Je nachdem,
+ ob Sie die Frage bejahen oder verneinen, wird
+ eine Veränderung vorgenommen oder nicht.
+
+#on("u")##on("b")#z Zeichensatz#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie das Feh­
+ lerzeichen festlegen und bestimmen, aus wel­
+ chen Zeichen die Werkstücke zusammengesetzt
+ werden sollen. Bejahen Sie die Frage nach der
+ Neufestlegung des Zeichensatzes, so werden
+ Ihnen im Fenster links alle möglichen Zeichen
+ angezeigt. Die Zeichen werden hier in der Rei­
+ henfolge ihres internen Codes ausgegeben. Sie
+ können nun - indem Sie einfach die entspre­
+ chende Taste tippen - eines der angegebenen
+ Zeichen als 'Fehlerzeichen' bestimmen. Es wird
+ daraufhin invers dargestellt.
+ Anschließend können Sie die Zeichen bestim­
+ men, die sonst noch im Werkstück vorkommen
+ sollen. Allerdings sind Sie bei dieser Wahl
+ nicht so frei wie bei der Wahl des Fehlerzei­
+ chens. Es muß sich um einen zusammenhängenden
+ Bereich von Zeichen handeln, die um das Feh­
+ lerzeichen gruppiert sind - 'zusammenhängend'
+ bezieht sich dabei auf die Reihenfolge der
+ Zeichen im Fenster links.
+ Die Festlegung selbst erfolgt in zwei Etap­
+ pen. Zuerst können Sie den Bereich der Zeichen
+ bestimmen, die in der Reihenfolge vor dem Feh­
+ lerzeichen stehen. Mit der Pfeiltaste <hoch>
+ markieren Sie den Bereich, der vor dem Fehler­
+ zeichen liegt; mit der Pfeiltaste <runter>
+ können Sie ggf. die Markierung wieder rückgän­
+ gig machen. Wenn Sie so den gewünschten Be­
+ reich markiert haben, tippen Sie die
+ <RETURN>-Taste.
+ Anschließend bestimmen Sie den Bereich hin­
+ ter dem Fehlerzeichen auf vergleichbare Weise
+ und schließen auch hier die Einstellung mit
+ der <RETURN>-Taste ab. Daraufhin wird Ihnen
+ der eingestellte Zeichensatz mit markiertem
+ Fehlerzeichen noch einmal zur Kontrolle im
+ Fenster links ausgegeben. Sind Sie mit der
+ Einstellung einverstanden, so bejahen Sie die
+ an Sie gerichtete Frage und gelangen ins Menu
+ zurück; ansonsten können Sie nach gleichem
+ Verfahren die Einstellung korrigieren.
+
+#on("u")##on("b")#f Fehlerzeichen#off("b")##off("u")#
+ Diese Menufunktion ist dann sinnvoll zu
+ wählen, wenn Sie den eingestellten Zeichensatz
+ beibehalten und nur das Fehlerzeichen verän­
+ dern wollen. Wenn Sie die Frage bejaht haben,
+ eine Veränderung vornehmen zu wollen, haben
+ Sie die Möglichkeit, durch Verschiebung der
+ Markierung im Fenster links (durch die Tasten
+ <hoch> und <runter>) das neue Fehlerzeichen
+ einzustellen. Die Einstellung wird durch
+ <RETURN> abgeschlossen. Sind Sie mit dem ein­
+ gestellten Fehlerzeichen einverstanden, gelan­
+ gen Sie zurück ins Menu; ansonsten können Sie
+ Ihre Einstellung korrigieren.
+
+#on("u")##on("b")#t Tastenbelegung#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie die Ta­
+ sten bestimmen, die bei einem Simulationslauf
+ zur Bedienung des Systems benutzt werden kön­
+ nen. Ihnen wird im Fenster links oben die ak­
+ tuelle Einstellung angezeigt. Haben Sie sich
+ entschlossen, eine Neueinstellung vorzunehmen,
+ werden nacheinander die entsprechenden Tasten
+ erfragt. Sie brauchen dabei jeweils nur die
+ Taste zu tippen, die Sie für die entsprechende
+ Funktion vorgesehen haben.
+ Sie können die Tasten nahezu frei wählen.
+ Es ist allerdings nicht erlaubt, die <SV>-
+ Taste zu wählen. Ebensowenig wird die Einstel­
+ lung akzeptiert, wenn Sie Mehrfachbelegungen
+ vornehmen, d.h, eine Taste für mehrere Funk­
+ tionen vorschlagen. Achten Sie deshalb immer
+ auf den Kommentar zur Einstellung im Fenster
+ unten links. Ist die Neueinstellung fehler­
+ haft, so erfolgt ein Hinweis darauf - in einem
+ solchen Falle bleibt die alte Tastenbelegung
+ erhalten.
+
+#on("u")##on("b")#a Anzahl Arbeitsphasen#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie festle­
+ gen, in wie viele Arbeitsphasen ein Simula­
+ tionslauf jeweils eingeteilt werden soll. Im
+ Fenster links oben werden der kleinstmögliche
+ Wert (2), der größtmögliche Wert (20) und der
+ aktuell eingestellte Wert angezeigt. Im Fen­
+ ster unten wird die aktuelle Simulationsdauer
+ angezeigt.
+ Im Fenster rechts oben wird an Sie die Fra­
+ ge gerichtet, ob Sie tatsächlich eine Verände­
+ rung vornehmen möchten. Bejahen Sie die Frage,
+ so erhalten Sie die Möglichkeit, den bisher
+ eingestellten Wert mit der Pfeiltaste <hoch>
+ zu erhöhen, mit der Pfeiltaste <runter> zu
+ erniedrigen - allerdings nur innerhalb der
+ angezeigten Grenzen.
+ Wenn Sie die gewünschte Einstellung vorge­
+ nommen und die Eingabe durch <RETURN> abge­
+ schlossen haben, erscheinen die neuen Simula­
+ tionszeiten im Fenster unten. Bejahen Sie die
+ Frage, ob Sie mit der Arbeitsphasenanzahl ein­
+ verstanden sind, dann gelangen Sie ins Menu
+ zurück; ansonsten können Sie nach gleichem
+ Verfahren die getroffene Einstellung korrigie­
+ ren.
+
+#on("u")##on("b")#d Dauer Arbeitsphase#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie festle­
+ gen, wie lange eine Arbeitsphase dauern soll.
+ Es kann ein Wert zwischen 1 min und 60 min
+ eingestellt werden. Das Einstellverfahren ver­
+ läuft analog zur Festlegung der Anzahl der
+ Arbeitsphasen - sehen Sie bitte dort.
+
+#on("u")##on("b")#p Pausendauer#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie festle­
+ gen, wie lange die Pause zwischen je zwei Ar­
+ beitsphasen dauern soll. Es kann ein Wert zwi­
+ schen 1 min und 30 min eingestellt werden. Das
+ Einstellverfahren verläuft analog zur Festle­
+ gung der Anzahl der Arbeitsphasen - sehen Sie
+ bitte dort.
+
+#on("u")##on("b")#w Wertungsschlüssel#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie den Wer­
+ tungsschlüssel festlegen. Zur genauen Erläu­
+ terung der Bedeutung des Bewertungsfaktors
+ sehen Sie bitte Kapitel 4.5.1.
+ Im Fenster links wird der aktuell einge­
+ stellte Wertungsschlüssel angezeigt. Stellen
+ Sie sich die ins Koordinatensystem eingetrage­
+ nen Kreuzchen durch einen Streckenzug verbun­
+ den vor. Entscheiden Sie sich für eine Neu­
+ festlegung, dann können Sie mit den Pfeil­
+ tasten <hoch> und <runter> nacheinander die
+ einzelnen Kreuzchen im Koordinatensystem nach
+ oben bzw. nach unten verschieben.
+ Haben Sie ein Kreuzchen an die gewünschte
+ Stelle positioniert, so tippen Sie als Kenn­
+ zeichen dafür die <RETURN>-Taste. So gelangen
+ Sie zum nächsten Kreuzchen bzw. nach dem letz­
+ ten Kreuzchen zurück in das Fenster oben
+ rechts. Wenn Sie mit dem eingestellten Wer­
+ tungsschlüssel einverstanden sind, gelangen
+ Sie zurück ins Menu; ansonsten können Sie die
+ vorgenommene Einstellung korrigieren.
+
+#page#
+5.4 Menufunktionen zum Oberbegriff 'Konfigu­
+ ration'
+
+#on("b")#
+BAP: Simulation Parameter Konfiguration Dateien Archiv
+--------------------+---------------------------+-------------------------
+ | u Umfang der Auswertung |
+ | k Kurzauswertung |
+ +---------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+#on("u")##on("b")#u Umfang der Auswertung#off("b")##off("u")#
+ Mit dieser Menufunktion können Sie festle­
+ gen, ob am Ende einer Protokollauswertung die
+ sogenannten 'Anmerkungen', die die Zusammen­
+ hänge im Protokoll erläutern, jeweils mit aus­
+ gegeben werden sollen oder nicht. Die hier
+ getroffene Festlegung gilt sowohl für die Aus­
+ wertung auf dem Bildschirm als auch für den
+ Ausdruck über einen angeschlossenen Drucker.
+ Zum Verständnis der Auswertungen sind die
+ Anmerkungen sehr hilfreich. Hat man aber meh­
+ rere Simulationsläufe absolviert, bei denen
+ der Wertungsschlüssel identisch ist, so wäre
+ es überflüssig, jeweils die Anmerkungen mit
+ ausgeben zu lassen.
+ Die aktuelle Einstellung (mit/ohne Anmer­
+ kungen) wird im Fenster links oben angezeigt.
+ Im Fenster rechts oben wird die Frage ge­
+ stellt, ob Sie eine Veränderung der Einstel­
+ lung wünschen. Nur wenn Sie diese Frage beja­
+ hen, wird die Einstellung verändert; ansonsten
+ gelangen Sie unter Beibehaltung der alten Ein­
+ stellung ins Menu zurück.
+
+#on("u")##on("b")#k Kurzsauswertung#off("b")##off("u")#
+ Standardmäßig wird am Ende eines Simula­
+ tionslaufes eine Kurzauswertung auf dem Bild­
+ schirm ausgegeben. Wenn Sie diese überflüssig
+ finden oder wenn Sie es aus didaktischen Grün­
+ den vorziehen, auf eine solche Kurzauswertung
+ zu verzichten, können Sie diese Kurzauswertung
+ durch diese Menufunktion ab- bzw. wieder ein­
+ schalten.
+ Die hier getroffene Einstellung ist auch
+ gültig für anschließend eingerichtete Sohn­
+ tasks - und zwar sowohl für das Teilprogramm
+ 'Bildschirmarbeitsplatz' als auch für das
+ Teilprogramm 'Materialprüfung'.
+ Die aktuelle Einstellung (mit/ohne Kurzaus­
+ wertung) wird im Fenster links oben angezeigt.
+ Im Fenster rechts oben wird die Frage ge­
+ stellt, ob Sie eine Veränderung der Einstel­
+ lung wünschen. Nur wenn Sie diese Frage beja­
+ hen, wird die Einstellung verändert; ansonsten
+ gelangen Sie unter Beibehaltung der alten Ein­
+ stellung ins Menu zurück
+
+#page#
+5.5 Menufunktionen zum Oberbegriff 'Dateien'
+
+#on("b")#
+BAP: Simulation Parameter Konfiguration Dateien Archiv
+------------------------------------+-------------------+-----------------
+ | v Verzeichnis |
+ | --------------- |
+ | l Löschen |
+ | d Drucken |
+ | --------------- |
+ | k Kopieren |
+ | u Umbenennen |
+ | --------------- |
+ | s Speicherplatz |
+ | a Aufräumen |
+ +-------------------+
+
+
+
+
+
+
+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+ Die einzelnen Menufunktionen zu diesem Oberbe­
+griff sind detailliert im Handbuch zum Programm
+#on("b")#gs-DIALOG#off("b")# beschrieben und können dort nachgeschla­
+gen werden. An dieser Stelle seien nur einige Be­
+sonderheiten genannt, die hinsichtlich des Pro­
+grammsystems #on("b")#gs-MP BAP#off("b")# zutreffen:
+ Protokolldateien, die während eines Simulations­
+laufs angelegt werden, können Sie am Präfix 'gs-
+Protokoll:' erkennen. Diese Protokolldateien können
+#on("u")#nicht#off("u")# mit der in diesem Pull-Down-Menu angegebenen
+Menufunktion 'd Drucken' über den Drucker ausge­
+druckt werden. Die Simulationsdaten sind in den
+Protokolldateien nämlich in einem gesonderten For­
+mat aufgezeichnet, das vom Drucker nicht ausgewer­
+tet werden kann.
+ Für die Auswertung und den anschließenden Aus­
+druck dieser Protokolldateien ist die Menufunktion
+'d Drucken von Auswertungen' unter dem Oberbegriff
+'Simulation' bereitgestellt!
+ Sie können den Protokolldateien mit der Menu­
+funktion 'u Umbenennen' einen neuen Namen geben.
+Achten Sie aber #on("u")#unbedingt(!)#off("u")# darauf, daß das Präfix
+'gs-Protokoll:' bei der Umbenennung erhalten bleibt
+- sonst wird die Datei nicht mehr als Protokollda­
+tei vom Auswertsystem erkannt!
+ Die eben angesprochenen Protokolldateien können
+auch nicht mit der Menufunktion 'a Aufräumen' bear­
+beitet werden, da hier nur "normale" Textdateien
+akzeptiert werden - im übrigen sind die Protokoll­
+dateien immer optimal organisiert.
+
+#page#
+5.6 Menufunktionen zum Oberbegriff 'Archiv'
+
+#on("b")#
+BAP: Simulation Parameter Konfiguration Dateien Archiv
+------------------------------------------+-------------------------+-----
+ | r Reservieren |
+ | n Neue Diskette |
+ | --------------------- |
+ | s Schreiben |
+ | c Checken |
+ | k Kombination |
+ | h Holen/Lesen |
+ | l Löschen |
+ | --------------------- |
+ | v Verzeichnis |
+ | d Drucken |
+ | --------------------- |
+ | i Initialisieren |
+ | z Zieltask einstellen |
+ +---------------------+ +-------------------------+
+ | Dateiaustausch mit: |
+ | Archiv |
+ | Archivname: |
+ | gs-MP BAP |
+ +---------------------+
+--------------------------------------------------------------------------
+Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
+#off("b")#
+
+ Die einzelnen Menufunktionen zu diesem Oberbe­
+griff sind detailliert im Handbuch zum Programm
+#on("b")#gs-DIALOG#off("b")# beschrieben und können dort nachgeschla­
+gen werden.
+
+
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6
new file mode 100644
index 0000000..7d485d7
--- /dev/null
+++ b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6
@@ -0,0 +1,53 @@
+#limit (11.0)##pagelength (16.5)##block##pageblock#
+#start (2.0,0.0)#
+#page (61)#
+#headodd#
+#center#gs-MP BAP#right#%
+
+#end#
+#headeven#
+%#center#gs-MP BAP
+
+#end#
+#center#6
+
+#center#Hinweise
+#center#für den
+#center#Systembetreuer
+
+
+ Für den Ausdruck von Protokollauswertungen ist
+der Standardschrifttyp des Druckers voreingestellt.
+Sie haben aber die Möglichkeit, einen anderen
+Schrifttyp für den Protokollausdruck einzustellen.
+Dafür sind die beiden folgenden Prozeduren vorbe­
+reitet:
+
+PROC druckereinstellung fuer protokolldatei
+ (TEXT CONST schrifttyp, REAL CONST linker
+ rand, oberer rand, schreibfeldbreite,
+ schreibfeldlaenge)
+
+ Geben Sie einen in Ihrer Installation vorhan­
+ denen Schrifttyp an. Beachten Sie bei der
+ Festlegung der anderen Maße (wie gewohnt in
+ cm), daß auf dem Schreibfeld 80 Druckpositio­
+ nen nebeneinander Platz haben müssen!
+
+
+PROC std druckereinstellung fuer protokolldatei
+
+ Sie können mit diesem Befehl wieder die Ein­
+ stellung vornehmen, die sonst standardmäßig
+ von #on("b")#gs-MP BAP#off("b")# vorgegeben wird:
+
+ schrifttyp : "" (Standard-
+ schrifttyp)
+ linker rand : 0.0 (cm)
+ oberer rand : 0.0 (cm)
+ schreibfeldbreite : 21.0 (cm)
+ schreibfeldlaenge : 29.5 (cm)
+
+
+
+
diff --git a/doc/mp-bap/gs-MP BAP handbuch.impressum b/doc/mp-bap/gs-MP BAP handbuch.impressum
new file mode 100644
index 0000000..91c6ce0
--- /dev/null
+++ b/doc/mp-bap/gs-MP BAP handbuch.impressum
@@ -0,0 +1,104 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#gs-MP BAP
+
+
+
+
+#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#
+
+#free (4.0)##on("b")#
+#center#gs-MP BAP
+
+
+#center#Benutzerhandbuch
+
+
+#center#Version 1.0
+
+
+#off("b")##center#copyright
+#center#Eva Latta-Weber
+#center#Software- und Hardware-Systeme, 1988
+#center#ERGOS GmbH, 1990
+#page#
+#block#
+#center#____________________________________________________________________________
+
+
+Copyright:  ERGOS GmbH   März 1990
+
+ Alle Rechte vorbehalten. Insbesondere ist die Überführung in
+ maschinenlesbare Form sowie das Speichern in Informations­
+ systemen, auch auszugsweise, nur mit schriftlicher Einwilligung
+ der ERGOS GmbH gestattet.
+
+
+#center#____________________________________________________________________________
+
+Es kann keine Gewähr übernommen werden, daß das Programm für eine
+bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
+Anwender.
+
+Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
+Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
+Handbuch kann jederzeit ohne Ankündigung geändert werden.
+
+Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
+ erstellt und aufbereitet und auf einem Kyocera Laser­
+ drucker gedruckt.
+
+
+
+
+#center#___________________________________________________________________________
+
+
+
+Ergonomic Office Software GmbH
+
+Bergstr. 7 Telefon: (02241) 63075
+5200 Siegburg Teletex: 2627-2241413=ERGOS
+ Telefax: (02241) 63078
+
+
+#center#____________________________________________________________________________
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/programming/programmierhandbuch.1 b/doc/programming/programmierhandbuch.1
new file mode 100644
index 0000000..24f2b03
--- /dev/null
+++ b/doc/programming/programmierhandbuch.1
@@ -0,0 +1,650 @@
+#headandbottom("1","EUMEL-Benutzerhandbuch","TEIL 1 : Einleitung","1")#
+#pagenr("%",1)##setcount(1)##block##pageblock#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#TEIL 1 : Einleitung
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+1 - % #right#GMD
+#end#
+#bottomodd#
+#center#____________________________________________________________
+GMD #rigth#1 - %
+#end#
+
+TEIL 1 : Einleitung
+
+
+1.1 Allgemeines über EUMEL
+
+Dieses Buch bietet eine Übersicht über die Standardprozeduren des Betriebssystem
+EUMEL. Es bietet damit sowohl Hilfestellung für die Benutzung der standardmäßig
+vorhandenen Kommandos als auch für die Programmierung, also die Erweiterung
+dieses Kommandovorrats. Es ist jedoch kein Lehrbuch der Programmierung!
+
+In den ersten drei Kapiteln dieses Programmierhandbuches werden einige Grund­
+begriffe des Systems, die grundlegende Programmiersprache (ELAN) und der
+EUMEL-Editor erläutert.
+
+Das vierte Kapitel bietet eine Übersicht über diejenigen Prozeduren und Operatoren,
+die eher der 'Job-Control-Language' zugerechnet werden können, also häufig im
+Kommandodialog benutzt werden.
+
+Im fünften Teil sind diejenigen Operationen beschrieben, die meistenteils für die
+Programmierung benutzt werden. (Compiler, Operationen auf den elementaren Daten­
+typen, Dateien, Ein- und Ausgabe usw.).
+
+Diese Trennung ist jedoch recht willkürlich, es ist ja gerade eine der wichtigen Eigen­
+schaften dieses Betriebssystems, daß es keine Trennung zwischen der Kommando­
+sprache des Betriebssystems und Programmmiersprache für das System gibt. Jedes
+Systemkommando ist Aufruf einer ELAN Prozedur, jede neue Prozedur stellt eine
+Erweiterung des Kommandovorrats des Systems dar.
+
+Aus Gründen der Übersichtlichkeit der Zusammenstellung ist dieses Buch nicht frei
+von Vorwärtsverweisen!
+
+#page#
+
+1.2 Struktur des Betriebssystems EUMEL
+
+Grundlegend für das Verständnis des Betriebssystems EUMEL ist der Begriff der
+#on("b")#Task#off("b")#. Eine Task kann als theoretisch unendliche Wiederholung eines Systempro­
+gramms der Form:
+
+ 'nimm Kommando entgegen'
+ 'verarbeite Kommando'
+
+aufgefaßt werden. Einige Tasks existieren bereits als Grundstock des Systems,
+weitere werden von Benutzern des Systems erschaffen und dienen als persönliche
+Arbeitsumgebung für den 'Eigentümer'. Eine Task kann als benutzereigener, unab­
+hängiger Computer im Computer betrachtet werden, denn sie kann Kommandos
+entgegennehmen und ausführen und Daten verwalten und aufbewahren.
+
+Eine Task kann neu erzeugt werden, an einen Bildschirm gekoppelt werden und
+beendet werden.
+
+Das Tasksystem ist in einer baumartigen Struktur angeordnet. Außer der Wurzel 'UR'
+hat jede Task einen Vorgänger ('Vater-Task') und möglicherweise Nachfolger
+('Sohn-Tasks').
+
+#on("u")##ib#Task-Organisation#ie##off("u")#
+
+
+ SUPERVISOR
+ -
+ SYSUR
+ ARCHIVE
+ configurator
+ OPERATOR
+ shutup
+
+ UR
+ PUBLIC
+ Benutzertask1
+ Benutzertask2
+ Benutzertask3
+ .....
+
+
+
+Jeder Benutzer arbeitet innerhalb eines EUMEL-Systems, indem er eine Task an
+sein Terminal koppelt und dort Programme aufruft.
+
+Dateien sind grundsätzlich Eigentum einer Task. Es ist grundlegend für das Verständ­
+nis des Betriebssystems EUMEL, die Beziehung zwischen Tasks und Dateien zu
+erkennen.
+
+Eine Task ist ein Prozeß, der gegebenenfalls Dateien besitzt. Dateien können nur in
+einer Task existieren. Um eine Datei einer anderen Task zur Verfügung zu stellen,
+wird eine Kopie der Datei an die andere Task geschickt, die sendende Task ist da­
+nach Eigentümer des 'Originals', die empfangende Task Eigentümer der 'Kopie'.
+
+Soll eine Hierarchie von Dateien aufgebaut werden, so ist sie über eine Hierarchie
+von Tasks zu realisieren, da in einer Task alle Dateien gleichberechtigt sind.
+
+Bis zu dieser Stelle war stets von Dateien die Rede. Dateien sind jedoch ein Spezial­
+fall der grundlegenderen Struktur des Datenraumes.
+
+Ein #ib#Datenraum#ie# ist ein allgemeiner Datenbehälter. Ein Datenraum kann beliebige
+Daten aufnehmen und erlaubt direkten Zugriff auf diese Daten. Die Struktur der Daten
+im Datenraum unterscheidet sich nicht von der Struktur der Programmdaten. Der
+'innere Datentyp' eines Datenraums wird vom Programmierer festgelegt.
+
+Vorgeprägt vom System gibt es Textdateien, jeder andere Datentyp muß vom Pro­
+grammierer geprägt werden, um so Dateien erzeugen zu können, die Objekte eben
+dieses neuen Typs enthalten.
+#page#
+
+
+1.3 Eigenschaften des Betriebssystems
+
+Der erste Entwurf des Mikroprozessor-Betriebssystems EUMEL (#on("b")#E#off("b")#xtendable multi
+#on("b")#U#off("b")#ser #on("b")#M#off("b")#icroprozessor #on("b")#EL#off("b")#AN system) entstand 1979 mit dem Anspruch, auf Mikrocom­
+putern den Anwendern Hilfsmittel und Unterstützungen zu bieten, wie sie sonst nur
+auf Großrechnern zur Verfügung gestellt werden.
+
+Aspekte, die EUMEL von anderen Betriebssystemen für Mikrocomputer unterscheiden,
+sind:
+
+- Hardwareunabhängigkeit
+- Multitaskingkonzept
+- Multiuserbetrieb
+- Erweiterbarkeit
+- virtuelle Speicherverwaltung
+- Datensicherheit
+
+
+
+#on("u")##on("b")#Das EUMEL-Schichtenmodell#off("b")##off("u")#
+
+Die Hardwareunabhängigkeit des Betriebssystems EUMEL begründet sich in seinem
+Aufbau aus Schichten (sogenannten virtuellen Maschinen), die einen klar definierten
+Leistungsumfang haben.
+
+#center#beliebige Anwendungen
+#center#Textverarbeitung, Datenbanken etc.
+
+#center#Systemdienste: Monitor, Dateiverwaltung, Editor
+#center#Task-System
+#center#Standardpakete (BOOL, INT, REAL, TEXT)
+#center#ELAN-Compiler
+
+#center#EUMEL0
+#center#(virtueller Prozessor mit eigenem Befehlssatz)
+
+#center#SHard (Gerätetreiber)
+
+#center#Hardware
+
+
+Jede Schicht erwartet und erhält von ihren Nachbarn wohldefinierte Eingaben und gibt
+wohldefinierte Ausgaben weiter. Änderungen in einer Schicht müssen also in den
+angrenzenden Schichten beachtet werden, aber nicht in allen Teilen des Systems.
+
+Um EUMEL auf Rechner mit einem neuen Prozessortyp zu portieren, wird zunächst
+eine auf die Eigenheiten des Prozessors abgestimmte EUMEL0-Maschine entworfen
+und eine Hardwareanpassung (#ib#SHard#ie# : Software/Hardware-Interface) für einen
+Rechner mit diesem Prozessor hergestellt. Alle höheren Schichten des Systems
+bleiben unberührt. Weitere mit diesem Prozessortyp ausgestattete Rechner können mit
+EUMEL betrieben werden, indem ein SHard für dieses Rechnermodell geschrieben
+wird.
+
+Aus Benutzersicht ist wichtig, daß dadurch jegliche Software, die auf irgendeinem
+Rechner unter EUMEL verfügbar ist, auf jedem anderen Rechner, für den eine
+EUMEL Portierung existiert, lauffähig ist und gleiches Verhalten zeigt. Eine Vernet­
+zung beliebiger Rechner, auf die EUMEL portiert ist, ist problemlos möglich.
+
+Desweiteren ist für den Benutzer des Systems von Bedeutung, daß er von der hard­
+warenahen Schicht entfernt ist. Weder die Programmiersprache noch irgendwelche
+speziellen Systemfunktionen gewähren direkten Zugriff auf den Speicher oder Regi­
+sterinhalte. Diese Tatsache hat weitreichende Folgen in Hinsicht auf Datenschutz und
+Systemsicherheit.
+
+
+
+
+Multi-Tasking-/Multi-User-Betrieb
+Wie einleitend dargestellt, besteht ein EUMEL-System aus diversen Tasks. Durch
+eine Aufteilung der Prozessorzeit in Zeitscheiben ist eine (quasi) parallele Bedienung
+mehrerer Tasks möglich.
+
+Die multi-user-Fähigkeit des Betriebssystems wird durch den Anschluß mehrerer
+Bildschirmarbeitsplätze (Terminals) an V.24 Schnittstellen des Rechners erreicht.
+Dabei wird jeder Schnittstelle eine sogenannte Kanalnummer zugeordnet. Jeder
+Benutzer kann seine Task dann an einen Kanal (=Terminal) koppeln und an diesem
+Terminal gleichzeitig mit anderen Benutzern arbeiten.
+
+
+
+
+Prozeßkommunikation und Netzwerkfähigkeit
+Grundlage der Kommunikation ist die 'Manager-Eigenschaft' von Tasks. Eine Task
+ist 'Manager', wenn sie Aufträge anderer Tasks annehmen und ausführen kann.
+Insbesondere kann ein Manager veranlaßt werden, eine an ihn geschickte Datei anzu­
+nehmen, bzw. eine ihm gehörende Datei an die fordernde Task zu schicken.
+
+Derartige Kommunikationslinien verlaufen normalerweise in der Baumstruktur des
+Systems: z.B. ist die Task 'PUBLIC' (vergl. Seite 2) grundsätzlich Manager-Task.
+Eine unterhalb von PUBLIC liegende Task kann eine Datei an PUBLIC senden, bzw.
+von PUBLIC holen.
+
+Es ist auch möglich, eine Task für den Zugriff beliebiger anderer Tasks zu öffnen und
+somit beliebige Kommunikationspfade aufzubauen. Prinzipiell ist damit auch schon der
+Aufbau eines Netzwerkes beschrieben, denn sendende und empfangende Tasks
+können sich auf verschiedenen Rechnern befinden.
+
+Durch selbst erstellte Programme kann der Eigentümer einer 'Manager-Task' die
+Reaktion dieser Task auf einen Auftrag von außen bestimmen. Beispielsweise kann
+ein Manager derart programmiert werden, daß er nur Dateien empfängt und ausdruckt,
+aber niemals Dateien verschickt (Spool-Task).
+
+
+
+Erweiterbarkeit
+Die Programmiersprache ELAN ist im EUMEL-System gleichzeitig Programmier-
+und System-Kommandosprache (JCL), denn jedes Kommando ist Aufruf einer
+ELAN-Prozedur und jede vom Benutzer geschriebene ELAN-Prozedur erweitert
+den Kommandovorrat des Systems.
+
+Da alle EUMEL-Werkzeuge (einschließlich Editor) selbst ELAN-Programme sind,
+kann das System vom Benutzer selbst durch Hinzufügen eigener ELAN-Programme
+oder Programmpakete beliebig erweitert werden. Dabei können die bereits implemen­
+tierten Systemteile (z.B. die Fenstertechnik des Editors) genutzt werden.
+
+Ein Benutzer muß, um alle Möglichkeiten vom EUMEL zu nutzen, nur eine Sprache
+lernen und nicht - wie bei anderen Betriebssystemen - zwei unterschiedliche, eine
+Kommando- und eine Programmiersprache.
+
+ELAN selbst ist eine PASCAL-ähnliche Programmiersprache, die mit Hilfe der
+schrittweisen Verfeinerung (Refinement-Konzept) die Top-Down-Programmierung
+unterstützt. Das Paketkonzept, das der Modularisierung dient, und die freie Wahl von
+Bezeichnernamen sind Voraussetzung für übersichtliche und effiziente Programmie­
+rung.
+
+
+
+
+Virtuelle Speicherverwaltung
+Im EUMEL-System wird der Hauptspeicherplatz nach dem #on("b")#Demand-Paging-Prinzip#off("b")#
+verwaltet. Daten und Programme werden dazu in Seiten von 512 Byte aufgeteilt. Nur
+diejenigen Seiten, die wirklich benötigt werden, werden vom Hintergrundspeicher
+(Platte) in den Hauptspeicher geholt. Damit ist für den Benutzer bezüglich seiner
+Programm- bzw. Dateigrößen nicht mehr der Hauptspeicher, sondern die Hinter­
+grundkapazität von Bedeutung. Die Durchsatzgeschwindigkeit (Performance) ist
+abhängig von der Größe des RAM-Speichers und der Zugriffsgeschwindigkeit des
+Hintergrundmediums. Das Demand-Paging-Verfahren ist Grundlage für den
+Multi-User-Betrieb, wobei der Hauptspeicherplatz möglichst effizient zu nutzen und
+kein Benutzer zu benachteiligen ist.
+
+Beim Duplizieren eines Datenraumes wird im EUMEL-System lediglich eine logische,
+keine physische Kopie erzeugt. Zwei Seiten (zweier Datenräume) heißen dann gekop­
+pelt (geshared), wenn beide Seiten physisch demselben Block zugeordnet sind. Erst
+bei einem Schreibzugriff werden die Seiten entkoppelt (entshared) und tatsächlich
+physisch kopiert. Daher der Name "#on("b")#copy-on-write#off("b")#".
+
+Dieses Prinzip wird natürlich auch systemintern angewandt. Beispielsweise erbt eine
+Sohn-Task den Kommandovorrat der Vater-Task, indem der Standard-Datenraum,
+der die vorübersetzten ELAN-Prozeduren enthält, in der beschriebenen Weise kopiert
+wird. Prozeduren, die später hinzugefügt werden, werden natürlich nicht vererbt, da
+die Standard-Datenräume dann entkoppelt werden.
+
+
+
+
+Datensicherheit
+Störungen (inklusive Stromausfall) werden systemseitig durch eine automatische
+#on("b")#Fixpoint-Rerun-Logik#off("b")# aufgefangen, indem zum Zeitpunkt eines Fixpunkts der Inhalt
+des RAM Speichers, der seit dem letzten #ib#Fixpunkt#ie# verändert wurde auf den
+permanenten Speicher (Festplatte) geschrieben wird. Somit kann nach einer Störung
+immer auf den Systemzustand des letzten Fixpunktes aufgesetzt werden und die
+Datenverluste halten sich in erträglichen Grenzen.
+
+Der Zeitraum zwischen zwei Fixpunkten beträgt standardmäßig 15 Minuten, kann aber
+vom Benutzer anders eingestellt werden.
+
+Auch bei dieser Sicherung wird das Copy-on-write-Prinzip angewendet, so daß
+Platz- und Zeitaufwand gering sind und den normalen Ablauf nicht stören.
+
+#page#
+
+1.4 Wichtige Begriffe
+
+- #on("b")##ib#archive#ie##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")##ib#configurator#ie##off("b")#. Besondere Task im Systemzweig des EUMEL-Systems. In
+ dieser Task ist die #ib#Konfiguration#ie# von Kanälen möglich, d.h. Kanal und
+ angeschlossenenes Gerät werden aufeinander abgestimmt.
+
+- #on("b")##ib#editor#ie##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 normalerweise 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.
+
+- #on("b")##ib#manager task#ie##off("b")#. Task, die Aufträge von anderen Tasks entgegennehmen und
+ ausführen #on("u")#kann#off("u")#. Beispielsweise ist die Verwaltung von Dateien, die mehreren
+ Benutzern (= anderen Tasks) zugänglich sein sollen, eine typische Aufgabe für
+ einen Manager.
+
+- #on("b")##ib#Monitor#ie##off("b")#. Der Empfänger von Kommandos innerhalb einer Task ist der Monitor. Der
+ Monitor ist sichtbar durch eine Zeile, in der 'gib kommando' steht. In diese Zeile
+ werden #ib#Kommando#ie#s und erforderliche Parameter eingegeben.
+
+- #on("b")##ib#Supervisor#ie##off("b")#. Spezielle Task zur Überwachung eines EUMEL-Systems. Ein
+ Benutzer kann durch die Supervisor-Kommandos Leistungen von dieser Task
+ fordern: neue Task einrichten, Task wiederaufnehmen und diverse Informationen.
+
+- #on("b")##ib#Task#ie##off("b")#. Beliebig langlebiger Prozeß im EUMEL-System, der die Arbeits­
+ umgebung für Benutzer bildet. Jede Task besitzt einen #ib#Standard-Datenraum#ie#, der
+ Code und Compilertabellen der Task enthält und kann weitere Datenräume
+ (Dateien) besitzen.
+
+#page#
+
+1.5 Die Notation in diesem Buch
+
+Beachten Sie bitte folgende Regeln der Aufschreibung:
+
+- Funktionstasten werden ebenso wie besondere Tastenkombinationen explizit als
+ Tasten dargestellt:
+
+ <SV> <ESC> <e>
+
+
+- Alles, was Sie am Bildschirm Ihres Rechners schreiben oder lesen sollen, ist in
+ Textbereiche, die einen Bildschirm darstellen, eingefaßt.
+
+ Beispiel:
+
+____________________________________________________________________________
+ gib kommando:
+ edit ("mein programm")
+
+____________________________________________________________________________
+
+
+- Innerhalb des Handbuchs sind in der Aufschreibung die Konventionen der Pro­
+ grammiersprache ELAN berücksichtigt. Dabei sind folgende Besonderheiten zu
+ beachten:
+
+ 1) Kommandos werden grundsätzlich klein geschrieben.
+
+ 2) Dateinamen u.ä. sind Textdenoter und werden somit in Klammern und Anfüh­
+ rungsstriche 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.
+
+
+#page#
+
+1.6 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#
+
+<SHIFT> Umschalttaste
+
+<CR> Eingabe-/ Absatztaste
+
+<ESC> Kommandotaste
+
+<SV> Supervisortaste
+
+<HOP> Verstärkertaste
+
+<RUBOUT> Löschtaste
+
+<RUBIN> Einfügetaste
+
+<TAB> Tabulatortaste
+
+<MARK> Markiertaste
+
+<STOP> Stoptaste
+
+<WEITER> Weitertaste
+#tableend##clear pos#
+
+Weitere Informationen hierzu finden Sie in der Installationsanleitung zu dem von Ihnen
+benutzten Rechner oder Terminal.
+#page#
+
+1.7 Eine Beispielsitzung
+
+Im Folgenden wird eine Beispielsitzung skizziert, in der ein ELAN-Programm erstellt
+und getestet wird.
+
+ <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 ("mein erstes Programm")
+
+____________________________________________________________________________
+
+
+In der Task eröffnen Sie eine Datei mit dem Kommando 'edit ("dateiname")'.
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ edit ("mein erstes Programm")
+ "mein erstes Programm" neu einrichten (j/n) ? j
+
+____________________________________________________________________________
+
+
+Falls diese Datei neu ist, erfolgt eine Kontrollfrage (zur Kontrolle der gewünschten
+Schreibweise des Dateinamens), die Sie durch <j> bejahen.
+
+
+____________________________________________________________________________
+ ............ mein erstes Programm ............... Zeile 1 #markon#
+_
+____________________________________________________________________________
+
+
+
+
+
+
+In die noch leere Datei tippen Sie nun den Programmtext ein.
+
+
+____________________________________________________________________________
+ ............ mein erstes Programm ............... Zeile 1
+ _INT PROC ggt (INT CONST a, b):
+ INT VAR b kopie :: abs (b), a kopie :: abs (a);
+ WHILE b kopie <> 0 REPEAT
+ INT VAR rest := a kopie MOD b kopie;
+ a kopie := b kopie;
+ b kopie := rest
+ END REPEAT;
+ a kopie
+ END PROC gt;
+
+ REP
+ lies 2 zahlen ein;
+ gib groessten gemeinsamen teiler aus
+ UNTIL no ("weitertesten") PER.
+
+ lies 2 zahlen ein:
+ line; put ("2 Zahlen eingeben:");
+ INT VAR a, b;
+ get (a); get (b).
+
+ gib groessten gemeinsamen teiler aus:
+ put ("der größte gemeinsame Teiler von");
+ put (a); put ("und"); put (b); put ("ist"); put (ggt (a,b));
+ line.
+
+____________________________________________________________________________
+
+
+In dem Programmbeispiel wird ein Prozedur 'ggt' definiert, die den größten gemein­
+samen Teiler zweier Zahlen bestimmt. Die Prozedur soll für verschiedene Beispiele
+getestet werden; dies geschieht in dem Hauptprogramm, das solange Zahlen einliest
+und den größten gemeinsamen Teiler ausgibt, bis der Benutzer auf die Frage 'weiter­
+testen (j/n) ?' mit <n> antwortet.
+
+Haben Sie das Programm eingegeben, so können Sie die Bearbeitung dieser Pro­
+grammdatei durch Drücken der Tasten <ESC> <q> (nacheinander!) beenden.
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ run ("mein erstes Programm")
+
+____________________________________________________________________________
+
+
+Um Ihr Programm zu übersetzen und auszuführen, geben Sie das Kommando
+'run ("dateiname")'.
+
+Der Verlauf der Übersetzung, die zwei Läufe über das Programm erfordert, ist am
+Zähler, der an der linken Seite des Bildschirms ausgegeben wird, zu erkennen.
+
+Werden beim Übersetzen des Programms Fehler entdeckt, so werden diese im 'note­
+book' parallel zur Programmdatei gezeigt. In dem Beispielprogramm wurde ein
+Schreibfehler in Zeile 9 gemacht.
+
+
+____________________________________________________________________________
+ ............ mein erstes Programm ............... Zeile 1
+ _INT PROC ggt (INT CONST a, b):
+ INT VAR b kopie :: abs (b), a kopie :: abs (a);
+ WHILE b kopie <> 0 REPEAT
+ INT VAR rest := a kopie MOD b kopie;
+ a kopie := b kopie;
+ b kopie := rest
+ END REPEAT;
+ a kopie
+ END PROC gt;
+
+ REP
+ .................. notebook ..................... Zeile 1 #markon#
+ Zeile 9 FEHLER bei >> gt <<
+ ist nicht der PROC Name
+
+
+____________________________________________________________________________
+
+
+
+Diesen Fehler müssen Sie nun verbessern.
+
+____________________________________________________________________________
+ ............ mein erstes Programm ............... Zeile 9
+ INT PROC ggt (INT CONST a, b):
+ INT VAR b kopie :: abs (b), a kopie :: abs (a);
+ WHILE b kopie <> 0 REPEAT
+ INT VAR rest := a kopie MOD b kopie;
+ a kopie := b kopie;
+ b kopie := rest
+ END REPEAT;
+ a kopie
+ END PROC ggt;_
+
+ REP
+ .................. notebook ..................... Zeile 1
+ Zeile 9 FEHLER bei >> gt <<
+ ist nicht der PROC Name
+
+____________________________________________________________________________
+
+
+
+
+Haben Sie das Programm korrigiert, so können Sie die Datei durch Drücken der
+Tasten <ESC> <q> (nacheinander!) wieder verlassen.
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ run ("mein erstes Programm")
+
+____________________________________________________________________________
+
+
+Nach Eingabe von <R> wird das Programm erneut übersetzt.
+
+
+____________________________________________________________________________
+
+ Keine Fehler gefunden, 136 B Code, 82 B Paketdaten generiert
+
+
+ ******* ENDE DER UEBERSETZUNG *******
+
+
+ 2 Zahlen eingeben: _
+
+____________________________________________________________________________
+
+
+Das Programm war jetzt fehlerfrei. Nach der Übersetzung wurde die Ausführung
+gestartet. Nun können Beispiele getestet werden.
+
+____________________________________________________________________________
+
+ 2 Zahlen eingeben: 125 250
+ der größte gemeinsame Teiler von 125 und 225 ist 25
+ weitertesten (j/n) ?
+
+____________________________________________________________________________
+
+
+Beantwortet man die Frage mit <n>, so wird die Ausführung des Programms beendet.
+
+
+____________________________________________________________________________
+
+ gib kommando :
+
+____________________________________________________________________________
+
+
+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 vor
+dem #ib#Ausschalten des Geräts#ie# muß nach <SV> eine Task des priviliegierten System­
+zweigs (oft: '#ib#shutup#ie#') mit <ESC> <c> an das Terminal gekoppelt werden, in der das
+Kommando 'shutup' gegeben wird.
+
diff --git a/doc/programming/programmierhandbuch.2a b/doc/programming/programmierhandbuch.2a
new file mode 100644
index 0000000..a204091
--- /dev/null
+++ b/doc/programming/programmierhandbuch.2a
@@ -0,0 +1,1845 @@
+#headandbottom("1","EUMEL-Benutzerhandbuch","TEIL 2 : ELAN","2")#
+#pagenr("%",1)##setcount(1)##block##pageblock#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#TEIL 2 : ELAN
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+2 - % #right#GMD
+#end#
+#bottomodd#
+#center#____________________________________________________________
+GMD #right# 2 - %
+#end#
+
+TEIL 2: ELAN
+
+2.1 Besondere Eigenschaften von ELAN
+
+Kerneigenschaften von ELAN sind das #ib#Paketkonzept#ie# und die Methode des
+#ib#Refinements#ie#.
+
+#on("b")#Paketkonzept:#off("b")#
+ELAN bietet die Möglichkeit, neue Datentypen sowie Prozeduren und Operatoren auf
+diesen Datentypen zu definieren. Eine solche Definition von Algorithmen und Daten­
+typen kann zu einer logischen Einheit, einem Paket, zusammengefaßt werden. Pakete
+können in einer Task vorübersetzt werden und erweitern damit automatisch den
+Sprachumfang.
+
+#on("b")#Methode des Refinements:#off("b")#
+Die Methode des Refinements erlaubt das schrittweise Herleiten von Problemlösungen
+von der jeweils geeigneten Terminologie herunter zu den von ELAN standardmäßig
+angebotenen Sprachelementen. Durch diese Vorgehensweise wird in äußerst starkem
+Maße ein strukturierter Programmentwurf gemäß dem Top-Down-Prinzip gefördert.
+
+Die Programmiersprache ELAN wird im EUMEL-System zu folgenden Zwecken
+eingesetzt:
+
+- Systemimplementationssprache
+- Kommandosprache
+- Anwenderprogrammiersprache
+#page#
+
+2.2 Lexikalische Elemente
+
+Unter lexikalischen Elementen einer Programmiersprache versteht man die Elemente,
+in denen ein Programm notiert wird.
+
+In ELAN sind dies:
+
+- Schlüsselwörter
+- Bezeichner
+- Sonderzeichen
+- Kommentare
+
+
+
+
+2.2.1 Schlüsselwörter
+
+Einige Wörter haben in ELAN eine feste Bedeutung und können somit nicht frei
+gewählt werden. Solche Wörter werden im EUMEL-System in Großbuchstaben
+geschrieben, Leerzeichen dürfen nicht enthalten sein.
+
+Beispiele:
+
+
+VAR
+INT
+WHILE
+
+
+Wie später beschrieben wird, gibt es in ELAN auch die Möglichkeit, neue Schlüssel­
+wörter einzuführen.
+
+
+#page#
+
+2.2.2 Bezeichner
+
+Bezeichner oder Namen werden benutzt, um Objekte in einem Programmtext zu
+benennen und zu identifizieren (z.B: Variablennamen, Prozedurnamen).
+
+Namen werden in ELAN folgendermaßen formuliert:
+
+Das erste Zeichen eines Namens muß immer ein Kleinbuchstabe sein. Danach dürfen
+bis zu 254 Kleinbuchstaben, aber auch Ziffern folgen. Zur besseren Lesbarkeit können
+Leerzeichen in einem Namen erscheinen, die aber nicht zum Namen zählen. Sonder­
+zeichen sind in Namen nicht erlaubt.
+
+Beispiele für #on("b")#korrekte#off("b")# Bezeichner:
+
+
+das ist ein langer name
+x koordinate
+nr 1
+
+
+
+Beispiele für #on("b")#falsche#off("b")# Bezeichner:
+
+
+x*1
+1 exemplar
+Nr 1
+#page#
+
+2.2.3 Sonderzeichen
+
+Sonderzeichen sind Zeichen, die weder Klein- oder Großbuchstaben, noch Ziffern
+sind. Sie werden in ELAN als Trennzeichen oder als Operatoren benutzt.
+
+In ELAN gibt es folgende Trennungszeichen:
+
+- das Semikolon (';') trennt Anweisungen
+- der Doppelpunkt (':') trennt Definiertes und Definition
+- der Punkt ('.') wird als Endezeichen für bestimmte Programmabschnitte, als Dezi­
+ malpunkt und als Selektor-Zeichen für Datenstrukturen benutzt
+- das Komma (',') trennt Parameter
+- Klammernpaare ('(', ')') werden zum Einklammern von Parameterlisten oder Teil­
+ ausdrücken benutzt
+- mit Anführungszeichen ('"') werden Text-Denoter umrahmt
+- eckige Klammernpaare ('[', ']') werden zur Subskription benutzt.
+
+
+Als Operatornamen sind folgende Sonderzeichen erlaubt:
+
+- ein Sonderzeichen, sofern es nicht als Trennzeichen benutzt wird:
+ ! $ % & ' * + - / < = > ? § ^ ' ~
+- eine Kombination von zwei Sonderzeichen. Diese Kombination muß jedoch bereits
+ in ELAN existieren:
+ := <= >= <> **
+
+#page#
+
+2.2.4 Kommentare
+
+Kommentare dienen ausschließlich der Dokumentation eines Programms. Sie werden
+vom Compiler überlesen und haben somit keinen Einfluß auf die Ausführung eines
+Programms. Sie dürfen an beliebigen Stellen eines Programmtextes geschrieben
+werden, jedoch nicht innerhalb von Schlüsselwörtern und Namen. Ein Kommentar darf
+über mehrere Zeilen gehen. In ELAN sind Kommentare nur in wenigen Fällen notwen­
+dig, da Programme durch andere Mittel gut lesbar geschrieben werden können.
+
+Ein Kommentar in ELAN wird durch Kommentarklammern eingeschlossen. Es gibt
+folgende Formen von Kommentarklammern:
+
+(* Kommentar *)
+{ Kommentar }
+\#( Kommentar )#
+
+Die letzte Version '\#( Kommentar )\#' wird im EUMEL-System nicht
+unterstützt; statt dessen gibt es noch folgende Möglichkeit:
+
+\# Kommentar \#
+
+Da bei der Kommentarkennzeichnung mit \# für Kommentaranfang und -ende das
+gleiche Zeichen benutzt wird, ist eine Schachtelung hier nicht möglich.
+#page#
+
+2.3 Datenobjekte
+
+Eine Klasse von Objekten mit gleichen Eigenschaften wird in Programmiersprachen
+Datentyp genannt. Dabei hat ein Datentyp immer einen Namen, der die Klasse von
+Objekten sinnvoll kennzeichnet. Als ein Datenobjekt wird ein Exemplar eines Daten­
+typs (also ein spezielles 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 Datentypen
+auch als Eigenschaften von Datenobjekten ansehen. Für jeden Datentyp sind nur
+spezielle Operationen sinnvoll. Man kann nun Compilern die Aufgabe überlassen zu
+überprüfen, ob stets die richtige Operation auf einen Datentyp angewandt wird.
+
+
+
+2.3.1 Elementare Datentypen
+
+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 (INT)
+- reelle Zahlen (REAL)
+- Zeichen und Zeichenfolgen (TEXT)
+- Wahrheitswerte (BOOL).
+
+Diese Datentypen sind von der Sprache ELAN vorgegeben und werden elementare
+Datentypen genannt. Für effiziente Rechnungen mit elementaren Datentypen gibt es
+in den meisten Rechnern spezielle Schaltungen, so daß die Hervorhebung und be­
+sondere Rolle, die sie in Programmiersprachen spielen, gerechtfertigt ist. Zudem hat
+man Werte-Darstellungen (Denoter) innerhalb von Programmen für die elementaren
+Datentypen vorgesehen.
+
+
+
+2.3.1.1 Denoter für elementare Datentypen
+
+Die Darstellung eines Werts in einem Rechner zur Laufzeit eines Programms wird
+Repräsentation genannt. Wenn es eindeutig ist, daß es sich nur um die Repräsenta­
+tion im Rechner handelt, spricht man kurz von Werten. Um mit Objekten elementarer
+Datentypen arbeiten zu können, muß es in einem Programm die Möglichkeit geben,
+Werte eines Datentyps zu bezeichnen (denotieren). Die Werte-Darstellungen, 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
+Compiler feststellbaren - Datentyp. Aus der Form eines Denoters ist also der Daten­
+typ erkennbar:
+
+
+
+INT-Denoter:
+Sie 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. Negative Werte
+werden durch eine Aufeinanderfolge des monadischen Operators '-' (siehe 2.4.1.1)
+und eines INT- Denoters realisiert.
+
+
+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 wie ein Komma in der deutschen Schreibweise benutzt. Nega­
+tive REAL-Denoter gibt es wiederum nicht.
+
+Die zweite Form wird als "wissenschaftliche Notation" bezeichnet. Sie findet dann
+Verwendung, wenn sehr große Zahlen oder Zahlen, die nahe bei Null liegen, darge­
+stellt werden müssen.
+
+Beispiele:
+
+
+3.0 e5
+3.0e-5
+
+
+Der INT-Denoter hinter dem Buchstaben #on("b")#e#off("b")# gibt an, wie viele Stellen der Dezimal­
+punkt nach rechts (positive Werte) bzw. nach links (negative Werte) zu verschieben
+ist. Dieser Wert wird Exponent und der Teil vor dem Buchstaben #on("b")#e#off("b")# Mantisse genannt.
+
+
+TEXT-Denoter:
+Sie werden in Anführungszeichen eingeschlossen.
+
+Beispiele:
+
+
+"Das ist ein TEXT-Denoter"
+"Jetzt ein TEXT-Denoter ohne ein Zeichen: ein leerer Text"
+""
+
+
+Zu beachten ist, daß das Leerzeichen ebenfalls ein Zeichen ist. Soll ein Anführungs­
+zeichen in einem TEXT erscheinen (also gerade das Zeichen, welches einen Denoter
+beendet), so muß es doppelt geschrieben werden.
+
+Beispiele:
+
+
+"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.
+
+Beispiel:
+
+
+"da"251""
+
+
+ist gleichbedeutend mit "daß". Der Code-Wert eines Zeichens ergibt sich aus der
+EUMEL-Code-Tabelle (siehe 5.2.4.1), in der jedem Zeichen eine ganze Zahl zuge­
+ordnet ist.
+
+
+BOOL-Denoter:
+Es gibt nur zwei BOOL-Denoter:
+TRUE für "wahr" und FALSE für "falsch".
+
+
+
+2.3.1.2 LET-Konstrukt für Denoter
+
+Neben der Funktion der Abkürzung von Datentypen (siehe 2.6.3) kann das LET-
+Konstrukt auch für die Namensgebung für Denoter verwandt werden.
+
+Die LET-Vereinbarung sieht folgendermaßen aus:
+
+
+#on("i")##on("b")#LET#off("i")##off("b")# Name #on("i")##on("b")#=#off("i")##off("b")# Denoter
+
+
+Mehrere Namensgebungen können durch Komma getrennt werden.
+
+
+____________________________________________________________________________
+ .......................... Beispiele: .........................
+ LET anzahl = 27;
+ LET pi = 3.14159,
+ blank = " ";
+____________________________________________________________________________
+
+
+Der Einsatz von LET-Namen für Denoter hat zwei Vorteile:
+
+- feste Werte im Programm sind leicht zu ändern, da nur an einer Stelle des Pro­
+ gramms der Denoter geändert werden muß
+ (z.B.: In Vereinbarungen von Reihungen (siehe 2.6.1) können LET-Denoter, im
+ Gegensatz zu Konstanten, als Obergrenze angegeben werden. Dieser
+ Wert kann dann auch an anderen Stellen des Programms, z.B. in Schlei­
+ fen (siehe 2.4.2.5), benutzt werden. Bei Änderung der Reihungsgröße
+ braucht dann nur an einer Stelle des Programms der Wert geändert zu
+ werden.)
+- der Name gibt zusätzliche Information über die Bedeutung des Denoters.
+
+
+
+2.3.2 Zugriffsrecht
+
+Von manchen Datenobjekten weiß man, daß sie nur einmal einen Wert erhalten
+sollen. Sie sollen also nicht verändert werden. Oder man weiß, daß in einem Pro­
+grammbereich ein Datenobjekt nicht verändert werden soll. Um ein unbeabsichtigtes
+Verändern zu verhindern, wird in ELAN dem Datenobjekt ein zusätzlicher Schutz
+mitgegeben: das Zugriffsrecht oder Accessrecht.
+
+In der Deklaration eines Datenobjekts können folgende Accessattribute angegeben
+werden:
+
+- #on("i")##on("b")#VAR #off("i")##off("b")# für lesenden und schreibenden (verändernden) Zugriff
+
+- #on("i")##on("b")#CONST#off("i")##off("b")# für nur lesenden Zugriff.
+
+
+
+2.3.3 Deklaration
+
+Damit man Datenobjekte in einem Programm ansprechen kann, gibt man einem
+Datenobjekt einen Namen (wie z.B. einen Personennamen, unter der sich eine wirk­
+liche Person "verbirgt"). Will man ein Datenobjekt in einem Programm verwenden, so
+muß man dem Compiler mitteilen, welchen Datentyp und welches Accessrecht das
+Objekt haben soll. Das dient u.a. dazu, nicht vereinbarte Namen (z.B. verschriebene)
+vom Compiler entdecken zu lassen. Weiterhin ist aus dem bei der Deklaration ange­
+gebenen Datentyp zu entnehmen, wieviel Speicherplatz für das Objekt zur Laufzeit zu
+reservieren ist.
+
+Eine Deklaration oder Vereinbarung besteht aus der Angabe von
+
+- Datentyp
+- Zugriffsrecht ( #on("i")##on("b")#VAR#off("i")##off("b")# oder #on("i")##on("b")#CONST#off("i")##off("b")#)
+- Name des Datenobjekts.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT VAR mein datenobjekt;
+
+____________________________________________________________________________
+
+
+Verschiedene Datenobjekte mit gleichem Datentyp und Accessrecht dürfen in einer
+Deklaration angegeben werden; sie werden durch Kommata getrennt. Mehrere Dekla­
+rationen werden - genauso wie Anweisungen - durch das Trennzeichen Semikolon
+voneinander getrennt.
+
+____________________________________________________________________________
+ .......................... Beispiele: .........................
+ INT VAR mein wert, dein wert, unser wert;
+ BOOL VAR listen ende;
+ TEXT VAR zeile, wort;
+
+____________________________________________________________________________
+
+
+2.3.4 Initialisierung
+
+Um mit den vereinbarten Datenobjekten arbeiten zu können, muß man ihnen einen
+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 Fehler­
+kuelle zu vermeiden. Eine Wertgebung an ein Datenobjekt kann (muß aber nicht)
+bereits bei der Deklaration erfolgen. In ELAN wird dies Initialisierung genannt. Für mit
+CONST vereinbarte Datenobjekte ist die Initialisierung die einzige Möglichkeit, ihnen
+einen Wert zu geben. Die Initialisierung von Konstanten ist zwingend vorgeschrieben
+und wird vom Compiler überprüft.
+
+Die Initialisierung besteht aus der Angabe von
+
+- Datentyp
+- Zugriffsrecht ( #on("i")##on("b")#VAR#off("i")##off("b")# oder #on("i")##on("b")#CONST#off("i")##off("b")#)
+- Name des Datenobjekts
+- Operator #on("i")##on("b")#::#off("i")##off("b")# oder #on("i")##on("b")#:=#off("i")##off("b")#
+- Wert, den das Datenobjekt erhalten soll (Denoter, Ausdruck).
+
+____________________________________________________________________________
+ .......................... Beispiele: .........................
+ INT CONST gewuenschtes gehalt :: 12 000;
+ TEXT VAR zeile :: "";
+ REAL CONST pi :: 3.14159, zwei pi := 2.0 * pi;
+ BOOL VAR bereits sortiert :: TRUE;
+____________________________________________________________________________
+#page#
+
+2.4 Programmeinheiten
+
+Neben Deklarationen (Vereinbarungen) sind Programmeinheiten die Grundbestandteile
+von ELAN.
+
+
+Programmeinheiten können sein:
+
+#on("b")#- elementare Programmeinheiten #off("b")#
+ - Ausdruck
+ - Zuweisung
+ - Refinementanwendung
+ - Prozeduraufruf
+
+#on("b")#- zusammengesetzte Programmeinheiten #off("b")#
+ - Folge
+ - Abfrage
+ - Auswahl
+ - Wiederholung
+
+#on("b")#- abstrahierende Programmeinheiten #off("b")#
+ - Refinementbvereinbarung
+ - Prozedurvereinbarung
+ - Operatorvereinbarung
+ - Paketvereinbarung.
+#page#
+
+2.4.1 Elementare Programmeinheiten
+
+
+2.4.1.1 Ausdruck
+
+Ausdrücke sind eine Zusammenstellung von Datenobjekten (Denoter, VAR- oder
+CONST-Objekte) und Operatoren. Jeder korrekte Ausdruck liefert einen Wert. Der
+Typ des Ausdrucks wird bestimmt durch den Typ des Wertes, den der Ausdruck
+liefert.
+
+
+Operatoren
+
+Operatoren werden in ELAN durch ein oder zwei Sonderzeichen oder durch Groß­
+buchstaben als Schlüsselwort dargestellt (siehe 2.4.3.3).
+
+Als Operanden (also die Datenobjekte, auf die ein Operator "wirken" soll) dürfen
+VAR- und CONST-Datenobjekte, Denoter oder Ausdrücke verwendet werden. Typ
+der Operanden und des Resultats eines Operators werden in der Operatorvereinba­
+rung festgelegt (siehe 2.4.3.3).
+
+Man unterscheidet zwei Arten von Operatoren:
+
+#on("b")#- monadische Operatoren #off("b")#
+ Monadischen Operatoren haben nur einen Operanden, der rechts vom Operator­
+ zeichen geschrieben werden muß.
+
+ Beispiel:
+
+
+ - a
+ NOT x
+
+
+ Der '-' - Operator liefert den Wert von a mit umgekehrten Vorzeichen. a muß
+ dabei vom Datentyp INT oder REAL sein.
+ Der Operator 'NOT' realisiert die logische Negation. y muß vom Datentyp BOOL
+ sein.
+
+
+#on("b")#- dyadische Operatoren #off("b")#
+ Dyadische Operatoren haben zwei Operanden. Das Operatorzeichen steht zwi­
+ schen den beiden Operanden.
+
+ Beispiele:
+
+
+ a + b
+ a - b
+ a * b
+ a DIV b
+ a ** b
+ x < y
+ x <> y
+ x AND y
+ x OR y
+
+
+ In den ersten fünf Beispielen werden jeweils die Werte von zwei INT-Objekten a
+ und b addiert (Operatorzeichen: '+'), subtrahiert ('-'), multipliziert ('*'), dividiert
+ (ganzzahlige Division ohne Rest: 'DIV') und potenziert ('**').
+ Im sechsten und siebten Beispiel werden zwei BOOL-Werte x und y verglichen
+ und im achten und neunten Beispiel die logische Operation 'und' (Operator 'AND')
+ bzw. 'oder' (Operator 'OR') durchgeführt.
+
+
+Priorität von Operatoren
+
+Es ist erlaubt, einen Ausdruck wiederum als Operanden zu verwenden. Praktisch
+bedeutet dies, daß mehrere Operatoren und Datenobjekte zusammen in einem Aus­
+druck geschrieben werden dürfen.
+
+Beispiele:
+
+
+a + 3 - b * c
+- a * b
+
+
+Die Reihenfolge der Auswertung kann man durch Angabe von Klammern steuern.
+
+Beispiel:
+
+
+(a + b) * (a + b)
+
+
+Es wird jeweils erst 'a + b' ausgewertet und dann erst die Multiplikation durchge­
+führt. In ELAN ist es erlaubt, beliebig viel Klammernpaare zu verwenden (Regel: die
+innerste Klammer wird zuerst ausgeführt). Es ist sogar zulässig, Klammern zu ver­
+wenden, wo keine notwendig sind, denn überflüssige Klammernpaare werden überle­
+sen. Man muß jedoch beachten, daß Ausdrücke, und damit auch z.B. #on("b")#(a)#off("b")#, immer
+Accessrecht CONST haben.
+
+Beispiel:
+
+
+((a - b)) * 3 * ((c + d) * (c - d))
+
+
+Somit können beliebig komplizierte Ausdrücke formuliert werden.
+
+Um solche Ausdrücke einfacher zu behandeln und sie so ähnlich schreiben zu kön­
+nen, wie man es in der Mathematik gewohnt ist, wird in Programmiersprachen die
+Reihenfolge der Auswertung von Operatoren festgelegt. In ELAN wurden neun Ebe­
+nen, Prioritäten genannt, festgelegt:
+
+
+#on("bold")#Priorität Operatoren
+#off("bold")#
+
+ 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 erwähnten Operatoren in der Tabelle werden in der Beschreibung der Standard­
+prozeduren und -Operatoren besprochen).
+
+Operatoren mit der höchsten Priorität werden zuerst ausgeführt, dann die mit der
+nächst niedrigeren Priorität usw.. Operatoren mit gleicher Priorität werden von links
+nach rechts ausgeführt. Dadurch ergibt sich die gewohnte Abarbeitungsfolge 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 verwen­
+den.
+
+
+
+2.4.1.2 Zuweisung
+
+Ein spezieller Operator ist die Zuweisung.
+
+Form:
+
+
+Variable #on("i")##on("b")#:=#off("i")##off("b")# Wert
+
+
+Dieser Operator hat immer die geringste Priorität, wird also immer als letzter einer
+Anweisung ausgeführt. Die Zuweisung wird verwendet, um einer Variablen einen
+neuen Wert zu geben. Der Operator ':=' liefert kein Resultat (man sagt auch, er
+liefert keinen Wert) und verlangt als linken Operanden ein VAR-Datenobjekt, an den
+der Wert des rechten Operanden zugewiesen werden soll). Der Wert des linken Oper­
+anden wird also verändert. Der rechte Operand wird nur gelesen.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ a := b;
+
+____________________________________________________________________________
+
+
+Hier wird der Wert von 'b' der Variablen 'a' zugewiesen. Der vorher vorhandene Wert
+von 'a' geht dabei verloren. Man sagt auch, der Wert wird überschrieben.
+
+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 beachte
+dabei die Prioritäten der Operatoren '+' (Priorität 6) und ':=' (Prioritä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 Operato­
+ren hat.
+
+Oft kommt es vor, daß ein Objekt auf der linken und rechten Seite des Zuweisungs­
+operators erscheint, z.B. wenn ein Wert erhöht werden soll.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ a := a + 1;
+
+____________________________________________________________________________
+
+
+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 Datenobjekt unter­
+schiedliche Werte zu unterschiedlichen Zeitpunkten haben kann.
+
+
+
+2.4.1.3 Refinementanwendung
+
+In ELAN ist es möglich, Namen für Ausdrücke oder eine bzw. mehrere Anweisungen
+zu vergeben. Das Sprachelement, das diese Namensgebung ermöglicht, heißt Refi­
+nement. Die Ausführung eines solchen Namens heißt Refinementanwendung, die
+Namensgebung heißt Refinementvereinbarung (siehe 2.4.3.1). Die Ausdrücke oder
+Anweisungen bilden den Refinementrumpf. Ein Refinement kann man in einem Pro­
+gramm unter dem Refinementnamen ansprechen. Man kann sich die Ausführung so
+vorstellen, als würden der Refinementrumpf immer dort eingesetzt, wo der Name des
+Refinements als Operation benutzt wird.
+
+
+
+2.4.1.4 Prozeduraufruf
+
+Eine Prozedur ist eine Sammlung von Anweisungen und Daten, die zur Lösung einer
+bestimmten Aufgabe benötigt werden. Eine Prozedur wird in einer Prozedurvereinba­
+rung definiert (siehe 2.4.3.2). Eine solche Prozedur kann man in einem Programm
+unter einem Namen (eventuell unter Angabe von Parametern) ansprechen. Man
+spricht dann vom Aufruf einer Prozedur oder einer Prozeduranweisung.
+
+Formen des Prozeduraufrufs:
+
+- #on("b")#Prozeduren ohne Parameter#off("b")# werden durch den Prozedurnamen angesprochen.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ pause;
+
+____________________________________________________________________________
+
+
+ (Die Prozedur 'pause' wartet bis ein Zeichen eingegeben wird)
+
+
+- #on("b")#Prozeduren mit Parameter#off("b")# werden durch
+
+
+ Prozedurnamen #on("i")##on("b")#(#off("i")##off("b")# aktuelle Parameterliste #on("i")##on("b")#)#off("i")##off("b")#
+
+
+ aufgerufen. Eine Parameterliste ist entweder ein Datenobjekt oder mehrere durch
+ Kommata getrennte Datenobjekte.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ pause (10);
+
+____________________________________________________________________________
+
+
+ (Mit der Prozedur 'pause (INT CONST zeitgrenze)' kann für eine Zeitdauer von
+ 'zeitgrenze' in Zehntel-Sekunden gewartet werden. Die Wartezeit wird durch
+ Erreichen der Zeitgrenze oder durch Eingabe eines Zeichens abgebrochen)
+
+
+ Bei den aktuellen Parametern ist folgendes zu beachten:
+
+ a) Wird ein VAR-Parameter in der Definition der Prozedur vorgeschrieben, darf
+ kein Ausdruck als aktueller Parameter "übergeben" werden, weil an einen
+ Ausdruck nichts zugewiesen werden kann. Ausdrücke haben - wie bereits
+ erwähnt - das Accessrecht CONST.
+
+____________________________________________________________________________
+ ........................ Gegenbeispiel: .......................
+ TEXT VAR text1, text2;
+ text1 := "Dieses Beispiel ";
+ text2 := "Fehlermeldung";
+ insert char (text1 + text2, "liefert eine", 17);
+
+____________________________________________________________________________
+
+
+ (Die Prozedur 'insert char (TEXT VAR string, TEXT CONST char, INT CONST
+ pos)' fügt das Zeichen 'char' in den Text 'string' an der Position 'pos' ein)
+
+ 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.
+
+
+ In ELAN sind auch Prozeduren als Parameter erlaubt. Die Prozedur als aktueller
+ Parameter wird in der Parameterliste folgendermaßen angegeben:
+
+
+ Resultattyp #on("i")##on("b")#PROC#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# virtuelle Parameterliste #on("i")##on("b")#)#off("i")##off("b")# Procname
+
+
+ Die Angabe des Resultattyps entfällt, wenn es sich nicht um eine wertliefernde
+ Prozedur handelt. Die virtuelle Parameterliste inklusive der Klammern entfällt, falls
+ die Prozedur keine Parameter hat. Die virtuelle Parameterliste beschreibt die
+ Parameter der Parameterprozedur. Es werden Datentyp und Zugriffsrecht eines
+ jeden Parameters angegeben, jedoch ohne Namen.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ wertetabelle (REAL PROC (REAL CONST) sin,
+ untergrenze, obergrenze, schrittweite);
+
+
+ (Die Prozedur 'sin' wird an die Prozedur 'wertetabelle' übergeben)
+
+____________________________________________________________________________
+
+
+2.4.2 Zusammengesetzte Programmeinheiten
+
+
+2.4.2.1 Folge
+
+Mehrere in einer bestimmten Reihenfolge auszuführende Anweisungen werden als
+Folge bezeichnet. In ELAN kann man eine oder mehrere Anweisungen in eine Pro­
+grammzeile schreiben oder eine Anweisung über mehrere Zeilen. Das setzt jedoch
+voraus, daß die Anweisungen voneinander getrennt werden. Die Trennung von Anwei­
+sungen erfolgt in ELAN durch das Trennsymbol Semikolon. Es bedeutet soviel wie:
+"führe die nächste Anweisung aus".
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ put ("mein");
+ put (1);
+ put (". Programm")
+
+____________________________________________________________________________
+
+
+(Die Prozedur 'put' gibt den als Parameter angegebenen Wert auf dem Ausgabegerät
+aus)
+
+
+
+2.4.2.2 Abfrage
+
+Mit Abfragen steuert man die bedingte Ausführung von Anweisungen. Abhängig von
+einer Bedingung wird in zwei verschiedene Programmabschnitte verzweigt.
+
+Der formale Aufbau einer Abfrage sieht folgendermaßen aus:
+
+
+#on("i")##on("b")#IF#off("i")##off("b")# Bedingung
+ #on("i")##on("b")#THEN#off("i")##off("b")# Abschnitt
+ #on("i")##on("b")#ELSE#off("i")##off("b")# Abschnitt
+#on("i")##on("b")#END IF#off("i")##off("b")#
+
+
+Der ELSE-Teil darf dabei auch fehlen. Anstelle von #on("i")##on("b")#END IF#off("i")##off("b")# darf auch die Abkürzung #on("i")##on("b")#FI#off("i")##off("b")# (IF von hinten gelesen) benutzt werden.
+
+In folgenden Beispielen wird der Absolutbetrag von 'a' ausgegeben:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT VAR a;
+ get (a);
+ IF a < 0
+ THEN a := -a
+ END IF;
+ put (a)
+
+____________________________________________________________________________
+
+
+Die Umkehrung des Vorzeichens von a im THEN-Teil wird nur durchgeführt, wenn
+der BOOLesche Ausdruck ('a < 0') den Wert TRUE liefert. Liefert er den Wert
+FALSE, wird die Anweisung, die der bedingten Anweisung folgt (nach END IF), ausge­
+führt. Das obige Programm kann auch anders geschrieben werden:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT VAR a;
+ get (a);
+ IF a < 0
+ THEN put (-a)
+ ELSE 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 ermöglicht es, 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.
+
+
+Abfragekette
+Bei Abfrageketten kann das ELIF-Konstrukt eingesetzt werden. (ELIF ist eine Zu­
+sammenziehung der Worte ELSE und IF).
+
+Anstatt
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ IF bedingung1
+ THEN aktion1
+ ELSE IF bedingung2
+ THEN aktion2
+ ELSE aktion3
+ END IF
+ END IF;
+
+____________________________________________________________________________
+
+
+kann man besser
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ IF bedingung1
+ THEN aktion1
+ ELIF bedingung2
+ THEN aktion2
+ ELSE aktion3
+ END IF;
+
+____________________________________________________________________________
+
+
+schreiben.
+
+
+
+2.4.2.3 Auswahl
+
+Die Auswahl wird benutzt, wenn alternative Anwendungen in Abhängikeit von Werten
+eines Datenobjekts ausgeführt werden sollen.
+
+Der formale Aufbau der Auswahl sieht folgendermaßen aus:
+
+
+#on("i")##on("b")#SELECT#off("i")##off("b")# INT-Ausdruck #on("i")##on("b")#OF#off("i")##off("b")#
+ #on("i")##on("b")#CASE#off("i")##off("b")# 1. Liste von INT-Denotern #on("i")##on("b")#:#off("i")##off("b")# Abschnitt
+ #on("i")##on("b")#CASE#off("i")##off("b")# 2. Liste von INT-Denotern #on("i")##on("b")#:#off("i")##off("b")# Abschnitt
+ .
+ .
+ .
+ #on("i")##on("b")#CASE#off("i")##off("b")# n. Liste von INT-Denotern #on("i")##on("b")#:#off("i")##off("b")# Abschnitt
+ #on("i")##on("b")#OTHERWISE#off("i")##off("b")# Abschnitt
+#on("i")##on("b")#END SELECT#off("i")##off("b")#
+
+
+Eine Liste von INT-Denotern besteht aus einem oder mehreren durch Kommata ge­
+trennten INT-Denotern. Der OTHERWISE-Teil darf auch fehlen. Man sollte ihn
+jedoch verwenden, um Fehlerfälle abzufangen.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ SELECT monat OF
+ CASE 2: IF schaltjahr
+ THEN tage := 29
+ ELSE tage := 28
+ END IF
+ CASE 4, 6, 9, 11: tage := 30
+ CASE 1, 3, 5, 7, 8, 10 ,12: tage := 31
+ OTHERWISE kein monat
+ END SELECT;
+
+____________________________________________________________________________
+
+
+(In diesem Programmausschnitt werden die Tage eines Monats bestimmt)
+
+
+
+2.4.2.4 Wertliefernde Abfrage und
+ wertliefernde Auswahl
+
+
+Soll eine Abfrage oder eine Auswahl einen Wert liefern, dann darf der ELSE- bzw.
+der OTHERWISE-Teil nicht fehlen und alle Zweige müssen einen Wert liefern.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ SELECT monat OF
+ CASE 2: IF schaltjahr
+ THEN 29
+ ELSE 28
+ END IF
+ CASE 4, 6, 9, 11: 30
+ CASE 1, 3, 5, 7, 8, 10 ,12: 31
+ OTHERWISE kein monat; 0
+ END SELECT;
+
+____________________________________________________________________________
+
+
+2.4.2.5 Wiederholung
+
+Die Wiederholung dient zur mehrfachen Ausführung von Anweisungen, meist in Ab­
+hängigkeit von einer Bedingung. Darum wird die Wiederholungsanweisung oft auch
+Schleife genannt und die in ihr enthaltenen Anweisungen Schleifenrumpf.
+
+Es gibt verschiedene Schleifentypen:
+
+- Endlosschleife
+- abweisende Schleife
+- nicht abweisende Schleife
+- Zählschleife.
+
+
+Endlosschleife
+Bei der Endlosschleife wird nicht spezifiziert, wann die Schleife beendet werden soll.
+
+Form:
+
+
+#on("i")##on("b")#REPEAT#off("i")##off("b")#
+ Abschnitt
+#on("i")##on("b")#END REPEAT#off("i")##off("b")#
+
+
+Anstelle von #on("i")##on("b")#REPEAT#off("i")##off("b")# darf die Abkürzung #on("i")##on("b")#REP#off("i")##off("b")# und anstelle von #on("i")##on("b")#END REPEAT#off("i")##off("b")#
+das Schlüsselwort #on("i")##on("b")#PER#off("i")##off("b")# (REP von hinten gelesen)
+benutzt werden.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ break;
+ REPEAT
+ fixpoint;
+ pause (18000)
+ END REPEAT
+
+____________________________________________________________________________
+
+
+Wird dieses Programm in einer Task im SYSUR-Zweig ausgeführt, so führt diese
+Task Fixpunkte im Abstand von 30 Minuten durch.
+
+
+
+Abweisende Schleife
+Bei der abweisenden Schleife wird die Abbruchbedingung an den Anfang der Schleife
+geschrieben.
+
+Form:
+
+
+#on("i")##on("b")#WHILE#off("i")##off("b")# Bedingung #on("i")##on("b")#REPEAT#off("i")##off("b")#
+ Abschnitt
+#on("i")##on("b")#END REPEAT#off("i")##off("b")#
+
+
+Bei jedem erneuten Durchlauf der Schleife wird überprüft, ob der BOOLesche Aus­
+druck den Wert TRUE liefert. Ist das nicht der Fall, wird die Bearbeitung mit der
+Anweisung fortgesetzt, die auf das Schleifenende folgt. Die Schleife wird abweisende
+Schleife genannt, weil der Schleifenrumpf nicht ausgeführt wird, wenn die Bedingung
+vor Eintritt in die Schleife bereits FALSE liefert.
+
+
+Nicht abweisende Schleife
+Anders verhält es sich bei der nicht abweisenden Schleife. Bei der nicht abweisenden
+Schleife wird die Abbruchbedingung an das Ende der Schleife geschrieben.
+
+Form:
+
+
+#on("i")##on("b")#REPEAT#off("i")##off("b")#
+ Abschnitt
+#on("i")##on("b")#UNTIL#off("i")##off("b")# Bedingung #on("i")##on("b")#END REPEAT#off("i")##off("b")#
+
+
+Hier wird der Schleifenrumpf auf jeden Fall einmal bearbeitet. Am Ende des Rumpfes
+wird die BOOLesche Bedingung abgefragt. Liefert sie 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 den beiden letztgenannten Arten der Wiederholungsanweisung 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.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ TEXT VAR wort, satz :: "";
+ REPEAT
+ get (wort);
+ satz CAT wort;
+ satz CAT " "
+ UNTIL wort = "." PER;
+
+____________________________________________________________________________
+
+
+Dises Programm liest solange Wörter ein und verbindet diese zu einem Satz, bis ein
+Punkt eingegeben wurde.
+
+
+
+Zählschleife
+Zählschleifen werden eingesetzt, wenn die genaue Anzahl der Schleifendurchläufe
+bekannt ist.
+
+Form:
+
+
+#on("i")##on("b")#FOR#off("i")##off("b")# Laufvariable #on("i")##on("b")#FROM#off("i")##off("b")# Anfangswert #on("i")##on("b")#UPTO#off("i")##off("b")# Endwert #on("i")##on("b")#REPEAT#off("i")##off("b")#
+ Abschnitt
+#on("i")##on("b")#END REPEAT#off("i")##off("b")#
+
+
+Bei Zählschleifen wird eine Laufvariable verwendet, die die INT-Werte von 'Anfangs­
+wert' bis 'Endwert' in Schritten von 1 durchläuft. 'Anfangswert' und 'Endwert' können
+beliebige INT-Ausdrücke sein. Diese Schleife zählt "aufwärts". Wird anstatt #on("i")##on("b")#UPTO#off("i")##off("b")#
+das Schlüsselwort #on("i")##on("b")#DOWNTO#off("i")##off("b")# verwendet, wird mit Schritten von 1 "abwärts" gezählt.
+
+Form:
+
+
+#on("i")##on("b")#FOR#off("i")##off("b")# Laufvariable #on("i")##on("b")#FROM#off("i")##off("b")# Endwert #on("i")##on("b")#DOWNTO#off("i")##off("b")# Anfangswert #on("i")##on("b")#REPEAT#off("i")##off("b")#
+ Abschnitt
+#on("i")##on("b")#END REPEAT#off("i")##off("b")#
+
+
+Die Laufvariable darf in der Schleife nicht verändert werden. Nach dem normalen
+Schleifenende ist der Wert der Laufvariablen nicht definiert.
+
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT VAR summe :: 0, i;
+ FOR i FROM 1 UPTO 100 REPEAT
+ summe INCR i
+ END REPEAT
+
+____________________________________________________________________________
+
+
+Dieses Programm berechnet die Summe der natürlichen Zahlen von 1 bis 100.
+
+
+Die verschiedenen Schleifenarten können kombiniert werden:
+
+
+#on("i")##on("b")#FOR#off("i")##off("b")# Laufvariable #on("i")##on("b")#FROM#off("i")##off("b")# Anfangswert #on("i")##on("b")#UPTO#off("i")##off("b")# Endwert
+#on("i")##on("b")#WHILE#off("i")##off("b")# Bedingung #on("i")##on("b")#REPEAT#off("i")##off("b")#
+ Abschnitt
+#on("i")##on("b")#END REPEAT#off("i")##off("b")#
+
+
+
+#on("i")##on("b")#FOR#off("i")##off("b")# Laufvariable #on("i")##on("b")#FROM#off("i")##off("b")# Anfangswert #on("i")##on("b")#UPTO#off("i")##off("b")# Endwert #on("i")##on("b")#REPEAT#off("i")##off("b")#
+ Abschnitt
+#on("i")##on("b")#UNTIL#off("i")##off("b")# Bedingung #on("i")##on("b")#END REPEAT#off("i")##off("b")#
+
+
+
+
+
+#on("i")##on("b")#WHILE#off("i")##off("b")# Bedingung #on("i")##on("b")#REPEAT#off("i")##off("b")#
+ Abschnitt
+#on("i")##on("b")#UNTIL#off("i")##off("b")# Bedingung #on("i")##on("b")#END REPEAT#off("i")##off("b")#
+
+#page#
+
+2.4.3 Abstrahierende Programmeinheiten
+
+
+2.4.3.1 Refinementvereinbarung
+
+In ELAN ist es möglich, Namen für Ausdrücke oder eine bzw. mehrere Anweisungen
+zu vergeben. Das Sprachelement, das diese Namensgebung ermöglicht, heißt Refi­
+nement. Die Ausführung eines solchen Namens heißt Refinementanwendung (siehe
+2.4.1.3), die Namensgebung heißt Refinementvereinbarung. Die Ausdrücke oder
+Anweisungen bilden den Refinementrumpf.
+
+Werden in einem Programm Refinements benutzt, dann wird der Programmteil bis
+zum ersten Refinement durch einen Punkt abgeschlossen. Die Refinementvereinba­
+rung sieht folgendermaßen aus:
+
+
+Name #on("i")##on("b")#:#off("i")##off("b")#
+ Abschnitt #on("i")##on("b")#.#off("i")##off("b")#
+
+
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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).
+
+____________________________________________________________________________
+
+
+Für den Namen 'einlesen von a und b' werden die Anweisungen 'get (a); get (b)' vom
+ELAN-Compiler eingesetzt. Man kann also die ersten vier Zeilen des Programms als
+eigentliches Programm ansehen, wobei die Namen durch die betreffenden Anwei­
+sungen ersetzt werden. Ein Refinement hat also keinen eigenen Datenbereich, d.h.
+Vereinbarungen, die in Refinements gemacht werden, gelten auch außerhalb des
+Refinements.
+
+
+
+Vorteile der Refinementanwendung
+Durch die sinnvolle Verwendung von Refinements wird ein Programm im Programm
+und nicht in einer separaten Beschreibung dokumentiert. Weiterhin kann ein Pro­
+gramm "von oben nach unten" ("top down") entwickelt werden: Das obige - zuge­
+geben einfache - Beispielprogramm wurde in drei Teile zerlegt und diese durch
+Namen beschrieben. Bei der Beschreibung von Aktionen durch Namen wird gesagt
+was gemacht werden soll. Es wird noch nicht beschrieben wie, denn auf dieser Stufe
+der Programmentwicklung braucht man sich um die Realisierung der Refinements
+(noch) keine Sorgen zu machen. Das erfolgt erst, wenn das Refinement programmiert
+werden muß. Dabei können wiederum Refinements verwendet werden usw., bis man
+auf eine Ebene "heruntergestiegen" ist, bei der eine (jetzt: Teil-) Problemlösung sehr
+einfach ist und man sie direkt hinschreiben kann. Man beschäftigt sich 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.
+Refinements ermöglichen:
+
+- "top down" - Programmierung
+- Strukturierung von Programmen und damit effiziente Fehlersuche und gute Wart­
+ barkeit
+- Dokumentation im Programmtext.
+
+
+Wertliefernde Refinements
+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ß die letzte Anwei­
+sung des Refinements einen Wert liefert.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT VAR a :: 1, b :: 2, c :: 3;
+ put (resultat).
+
+ resultat:
+ (a * b + c) ** 3.
+
+____________________________________________________________________________
+
+
+Man kann auch ein wertlieferndes Refinement mit mehreren Anweisungen schrei­
+ben.
+
+Allgemeine Regel:
+Die letzte Anweisung eines Refinements bestimmt, ob es einen Wert liefert - und
+wenn ja, von welchen Datentyp.
+
+
+
+2.4.3.2 Prozedurvereinbarung
+
+Eine Prozedur ist eine Sammlung von Anweisungen und Daten, die zur Lösung einer
+bestimmten Aufgabe benötigt werden.
+
+Der formale Aufbau einer Prozedur sieht folgendermaßen aus:
+
+
+#on("i")##on("b")#PROC#off("i")##off("b")# Prozedurname #on("i")##on("b")#:#off("i")##off("b")#
+ Prozedurrumpf
+#on("i")##on("b")#END PROC#off("i")##off("b")# Prozedurname
+
+
+Der Prozedurrumpf kann Deklarationen, Anweisungen und Refinements enthalten.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ PROC loesche bildschirm ab aktueller cursorposition:
+ out (""4"")
+ END PROC loesche bildschirm ab aktueller cursorposition
+
+____________________________________________________________________________
+
+
+Verwendung von 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)
+- Datenobjekte nur innerhalb eines Programmteils benötigt werden und diese nicht
+ von dem gesamten Programm angesprochen werden sollen.
+
+In den folgenden Programmfragmenten werden zwei Werte vertauscht. In der ersten
+Lösung wird ein Refinement, in der zweiten eine Prozedur verwandt.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ IF a > b
+ THEN vertausche a und b
+ END IF;
+ put (a);
+ put (b);
+ vertausche a und b.
+
+ vertausche a und b:
+ INT CONST x :: a;
+ a := b;
+ b := x.
+
+____________________________________________________________________________
+
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ PROC vertausche a und b:
+ INT CONST x :: a;
+ a := b;
+ b := x
+ END PROC vertausche a und b;
+
+ IF a > b
+ THEN vertausche a und b
+ END IF;
+ put (a);
+ put (b);
+ vertausche a und b;
+
+____________________________________________________________________________
+
+
+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) ein­
+ gesetzt, d.h. der Code ist zweimal vorhanden. Die Prozedur dagegen ist vom Code
+ nur einmal vorhanden, wird aber zweimal - durch das Aufführen des Prozedur­
+ namens - aufgerufen.
+
+2) Die Variable 'x' ist in der ersten Programmversion während des gesamten Ablauf
+ des Programms vorhanden, d.h. ihr Speicherplatz ist während dieser Zeit belegt.
+ 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 vor­
+ handen, sein Speicherplatz wird danach freigegeben. Solche Datenobjekte, die nur
+ kurzfristig Speicher belegen, werden dynamische Datenobjekte genannt.
+
+ Prozeduren sind also ein Mittel, um die Speicherbelegung zu beeinflussen.
+
+3) Da Refinements keinen eigenen Datenbereich haben, kann die Variable 'x' in der
+ ersten 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, es ist also ein lokales
+ Datenobjekt der Prozedur. Innerhalb der Prozedur dürfen globale Datenobjekte
+ (also Objekte, die außerhalb von Prozeduren deklariert wurden) auch angespro­
+ chen werden.
+
+ Eine Prozedur in ELAN bildet im Gegensatz zu Refinements einen eigenen Gültig­
+ keitsbereich hinsichtlich Datenobjekten und Refinements, die innerhalb der Pro­
+ zedur deklariert werden. Prozeduren sind somit ein Mittel, um die in ihr dekla­
+ rierten Datenobjekte hinsichtlich der Ansprechbarkeit nach Außen "abzuschotten".
+
+
+
+Prozeduren mit Parametern
+Prozeduren mit Parametern erlauben es, gleiche Anweisungen mit unterschiedlichen
+Datenobjekten auszuführen.
+
+Form:
+
+
+#on("i")##on("b")#PROC#off("i")##off("b")# Prozedurname #on("i")##on("b")#(#off("i")##off("b")# formale Parameterliste #on("i")##on("b")#)#off("i")##off("b")# #on("i")##on("b")#:#off("i")##off("b")#
+ Prozedurrumpf
+#on("i")##on("b")#END PROC#off("i")##off("b")# Prozedurnamen
+
+
+Die Parameterliste besteht aus einem oder mehreren durch Kommata getrennten Para­
+metern. Ein Parameter wird mit Datentyp, Accessrecht und Namen angegeben.
+Ähnlich wie bei der Datendeklaration braucht man für aufeinanderfolgende Parameter
+mit gleichem Datentyp und gleichem Accessrecht die Attribute nur einmal anzugeben.
+Parameter mit Accessrecht #on("i")##on("b")#CONST#off("i")##off("b")# sind Eingabeparameter, Parameter mit Access­
+recht #on("i")##on("b")#VAR#off("i")##off("b")# realisieren Ein-/Ausgabeparameter.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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 Parameter
+genannt. Sie stehen als Platzhalter für die bei einem Prozeduraufruf einzusetzenden
+aktuellen Parameter (in obigen Beispiel die Datenobjekte 'eins', 'zwei' und 'drei').
+
+
+
+Prozeduren als Parameter
+Es ist auch möglich, Prozeduren als Parameter zu definieren.
+
+Eine Prozedur als Parameter wird folgendermaßen in der Parameterliste spezifiziert:
+
+Resultattyp #on("i")##on("b")#PROC#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# virtuelle Parameterliste #on("i")##on("b")#)#off("i")##off("b")# Prozedurname
+
+
+Die Angabe des Resultattyps entfällt, wenn es sich nicht um eine wertliefernde Proze­
+dur handelt. Die virtuelle Parameterliste inklusive der Klammern entfällt, falls die
+Prozedur keine Parameter hat. Die virtuelle Parameterliste beschreibt die Parame­
+ter der Parameterprozedur. Es werden Datentyp und Zugriffsrecht eines jeden Para­
+meters angegeben, jedoch ohne Namen.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ PROC wertetabelle (REAL PROC (REAL CONST) funktion,
+ REAL CONST untergrenze, obergrenze,
+ schrittweite):
+
+ REAL VAR wert;
+ putline ("W E R T E T A B E L L E");
+ putline ("-----------------------");
+ wert := untergrenze;
+ REPEAT
+ put (text (wert, 10, 5));
+ put (text (funktion (wert), 10, 5));
+ line;
+ wert INCR schrittweite
+ UNTIL wert > obergrenze PER
+
+ END PROC wertetabelle;
+
+ (* Prozeduraufruf: *)
+ wertetabelle (REAL PROC (REAL CONST) sin, 0.0, pi, 0.2)
+
+____________________________________________________________________________
+
+
+Wertliefernde Prozeduren
+Eine wertliefernde Prozedur sieht folgendermaßen aus:
+
+
+Resultattyp #on("i")##on("b")#PROC#off("i")##off("b")# Prozedurname #on("i")##on("b")#(#off("i")##off("b")# formale Parameterliste #on("i")##on("b")#)#off("i")##off("b")# #on("i")##on("b")#:#off("i")##off("b")#
+ wertliefernder Prozedurrumpf
+#on("i")##on("b")#END PROC#off("i")##off("b")# Prozedurnamen
+
+
+
+Die Parameterliste inklusive Klammerung kann fehlen. Der Prozedurrumpf muß einen
+Wert mit dem in Resultattyp angegeben Datentyp liefern.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT PROC max (INT CONST a, b):
+ IF a > b
+ THEN a
+ ELSE b
+ END IF
+ END PROC max;
+
+ put (max (3, 4))
+
+____________________________________________________________________________
+
+
+(In diesem Beispiel wird das Maximum von 'a' und 'b' ermittelt und ausgegeben)
+
+#page#
+
+2.4.3.3 Operatorvereinbarung
+
+Operatoren können in ELAN ähnlich wie Prozeduren definiert werden. Operatoren
+müssen einen und können maximal zwei Operatoren besitzen (monadische und dyadi­
+sche Operatoren).
+
+Form:
+
+
+Resultattyp #on("i")##on("b")#OP#off("i")##off("b")# Opname #on("i")##on("b")#(#off("i")##off("b")# ein oder zwei Parameter #on("i")##on("b")#)#off("i")##off("b")# #on("i")##on("b")#:#off("i")##off("b")#
+ Operatorrumpf
+#on("i")##on("b")#END OP#off("i")##off("b")# Opname
+
+
+Der Resultattyp wird nur bei wertliefernden Operatoren angegeben.
+
+Als Operatornamen sind erlaubt:
+
+- ein Sonderzeichen, sofern es nicht als Trennzeichen benutzt wird:
+ ! $ % & ' * + - / < = > ? § ^ ' ~
+- eine Kombination von zwei Sonderzeichen. Diese Kombination muß jedoch bereits
+ in ELAN existieren:
+ := <= >= <> **
+- ein Schlüsselwort (siehe 2.2.1).
+
+
+
+Vereinbarung eines monadischen Operators
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT OP SIGN (REAL CONST argument):
+ IF argument < 0.0 THEN -1
+ ELIF argument = 0.0 THEN 0
+ ELSE 1
+ FI
+ END OP SIGN
+
+____________________________________________________________________________
+
+
+(Der Operator 'SIGN' liefert abhängig vom Vorzeichen des übergebenen Wertes den
+INT-Wert -1, 0 oder 1)
+
+
+
+Vereinbarung eines dyadischen Operators
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ TEXT OP * (INT CONST anzahl, TEXT CONST t):
+ INT VAR zaehler :: anzahl;
+ TEXT VAR ergebnis :: "";
+ WHILE zaehler > 0 REP
+ ergebnis := ergebnis + t;
+ zaehler := zaehler - 1
+ END REP;
+ ergebnis
+ END OP *;
+
+____________________________________________________________________________
+
+
+(Der Operator '*' verkettet 'anzahl'- mal den Text 't')
+
+
+
+2.4.3.4 Paketvereinbarung
+
+Pakete sind in ELAN eine Zusammenfassung von Datenobjekten, Prozeduren, Opera­
+toren und Datentypen. Diese bilden den Paketrumpf. Elemente eines Pakets (Prozedu­
+ren, Operatoren, Datentypen) können außerhalb des Pakets nur angesprochen werden,
+wenn sie in der Schnittstelle des Pakets, die auch "interface" genannt wird, aufge­
+führt werden. Mit anderen Worten: es können alle Elemente eines Pakets von außen
+nicht angesprochen werden, sofern sie nicht über die Schnittstelle "nach außen ge­
+reicht" werden. Pakete können separat übersetzt werden, so daß der "Zusammen­
+bau" eines umfangreichen Programms aus mehreren Paketen möglich ist.
+
+Der formale Aufbau eines Pakets sieht folgendermaßen aus:
+
+
+#on("i")##on("b")#PACKET#off("i")##off("b")# Paketname #on("i")##on("b")#DEFINES#off("i")##off("b")# Schnittstelle #on("i")##on("b")#:#off("i")##off("b")#
+ Paketrumpf
+#on("i")##on("b")#END PACKET#off("i")##off("b")# Paketname
+
+
+In der Schnittstelle werden Prozeduren und Operatoren nur mit ihrem Namen, durch
+Kommata getrennt, angegeben. Weiterhin können Datentypen und mit CONST verein­
+barte Datenobjekte in der Schnittstelle aufgeführt werden, aber keine VAR-Datenob­
+jekte, weil diese sonst über Paket-Grenzen hinweg verändert werden könnten.
+
+Im Gegensatz zu einer Prozedur kann ein PACKET nicht aufgerufen werden (nur die
+Elemente der Schnittstelle können benutzt werden).
+
+Pakete werden zu folgenden Zwecken eingesetzt:
+
+- Spracherweiterung
+- Schutz vor fehlerhaftem Zugriff auf Datenobjekte
+- Realisierung von abstrakten Datentypen.
+
+
+
+Spracherweiterung
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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 Paket, das eine Tausch-Prozedur für INT-Datenobjekte bereitstellt. Das
+PACKET kann übersetzt und dem ELAN-Compiler bekannt gemacht werden
+(EUMEL: "insertieren"). Ist das geschehen, kann man 'swap' wie alle anderen Proze­
+duren (z.B. 'put', 'get') in einem Programm verwenden. Tatsächlich werden die mei­
+sten 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 Operato­
+ren in jedem ELAN-System vorhanden sein müssen. Solche Pakete werden Stan­
+dard-Pakete genannt. Jeder Installation - aber auch jedem Benutzer - steht es
+jedoch frei, zu den Standard-Paketen zusätzliche Pakete dem Compiler bekannzu­
+geben, und damit den ELAN-Sprachumfang zu erweitern.
+
+
+
+Schutz vor fehlerhaftem Zugriff auf Datenobjekte
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ PACKET stack handling DEFINES push, pop, init stack:
+
+ LET max = 1000;
+ ROW max INT VAR stack; (* siehe Kapitel Reihung, 2.6.1. *)
+ 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;
+
+____________________________________________________________________________
+
+
+Dieses Packet realisiert einen Stack. Den Stack kann man über die Prozeduren 'init
+stack', 'push' und 'pop' benutzen.
+#page#
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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 Verwendung von
+Programmen und Datenobjekten. Wichtig ist weiterhin, daß die Realisierung des
+Stacks ohne weiteres geändert werden kann, ohne daß Benutzerprogramme im 'main
+packet' geändert werden müssen, sofern die Schnittstelle nicht verändert wird. Bei­
+spielsweise kann man sich entschließen, den Stack nicht durch eine Reihung, son­
+dern durch eine Struktur zu realisieren. Davon bleibt ein Benutzerprogramm unbe­
+rührt.
+
+
+
+Realisierung von abstrakten Datentypen
+Der Vollständigkeit halber wird folgendes Beispiel hier gezeigt. Wie neue Datentypen
+definiert werden, wird in Kapitel 2.7.1. erklärt.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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.
+
+
+
+2.4.4 Terminatoren für Refinements,
+ Prozeduren und Operatoren
+
+
+Das LEAVE-Konstrukt wird verwendet, um eine benannte Anweisung (Refinement,
+Prozedur oder Operator) vorzeitig zu verlassen. Es ist auch möglich, geschachtelte
+Refinements zu verlassen.
+
+Form:
+
+#on("i")##on("b")#LEAVE#off("i")##off("b")# Name
+
+
+Durch eine (optionale) WITH-Angabe kann auch eine wertliefernde benannte Anwei­
+sung verlassen werden.
+
+Form:
+
+#on("i")##on("b")#LEAVE#off("i")##off("b")# Name #on("i")##on("b")#WITH#off("i")##off("b")# Ausdruck
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT OP ** (INT CONST basis, exp):
+ IF exp = 0
+ THEN LEAVE ** WITH 1
+ ELIF exp < 0
+ THEN LEAVE ** WITH 0
+ FI;
+
+ INT VAR zaehler, ergebnis;
+ ergebnis := basis;
+ FOR zaehler FROM 2 UPTO exp REP
+ ergebnis := ergebnis * basis
+ PER;
+ ergebnis
+ END OP **
+
+____________________________________________________________________________
+
+
+(Diese Operation realisiert die Exponentiation für INT-Werte)
+
+
+
+2.4.5 Generizität von Prozeduren
+ und Operatoren
+
+
+In ELAN ist es möglich, unterschiedlichen Prozeduren bzw. Operatoren gleiche
+Namen zu geben. Solche Prozeduren (Operatoren) werden generische Prozeduren
+(Operatoren) genannt. Die Identifizierung erfolgt durch Anzahl, Reihenfolge und Daten­
+typ der Parameter (Operanden).
+
+Deshalb werden Prozeduren und Operatoren unter Angabe des Prozedur- bzw. des
+Operatorkopfes dokumentiert.
+
+Beispiele:
+
+
+INT OP MOD (INT CONST l, r)
+REAL OP MOD (REAL CONST l, r)
+
+
+Der MOD-Operator liefert den Rest einer Division. Er ist sowohl für INT- wie auch
+für REAL-Datenobjekte definiert.
+
+
+
+PROC put (INT CONST wert)
+PROC put (REAL CONST wert)
+PROC put (TEXT CONST wert)
+
+
+Die put-Prozedur ist für INT-, REAL- und TEXT-Datenobjekte definiert.
+
+
+
+Priorität von generischen Operatoren
+Bei der Neudefinition von Operatoren kann man bereits benutzte Sonderzeichen oder
+Schlüsselwörter benutzen. In diesem Fall bekommt der neudefinierte Operator die
+gleiche Priorität wie der bereits vorhandene Operator.
+
+
+
+2.4.6 Rekursive Prozeduren
+ und Operatoren
+
+
+Alle Prozeduren und Operatoren dürfen in ELAN rekursiv sein.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT PROC fakultaet (INT CONST n):
+ IF n > 0
+ THEN fakultaet (n-1) * n
+ ELSE 1
+ END IF
+ END PROC fakultaet
+
+____________________________________________________________________________
+
+
+Die Fakultätsfunktion ist kein gutes Beispiel für eine Rekursion, denn das Programm
+kann leicht in eine iterative Version umgewandelt werden:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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 dem Beispiel der Ackermann-Funktion:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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
+
+____________________________________________________________________________
+
+
+Das eigentliche Einsatzgebiet von rekursiven Algorithmen liegt aber bei den 'back­
+track'-Verfahren. Diese werden eingesetzt, wenn eine exakte algorithmische Lösung
+nicht bekannt ist oder nicht gefunden werden kann und man verschiedene Versuche
+machen muß, um zu einem Ziel (oder Lösung) zu gelangen.
+
diff --git a/doc/programming/programmierhandbuch.2b b/doc/programming/programmierhandbuch.2b
new file mode 100644
index 0000000..c2103ba
--- /dev/null
+++ b/doc/programming/programmierhandbuch.2b
@@ -0,0 +1,1395 @@
+#headandbottom("52","EUMEL-Benutzerhandbuch","TEIL 2 : ELAN","2")#
+#pagenr ("%", 52)##setcount(1)##block##pageblock#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#TEIL 2 : ELAN
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+2 - % #right#GMD
+#end#
+#bottomodd#
+#center#____________________________________________________________
+GMD #right#2 - %
+#end#
+
+
+2.5 Programmstruktur
+
+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.
+Dies soll eine Empfehlung sein, in welcher Reihenfolge die Elemente eines PACKETs
+geschrieben werden sollen:
+
+Ein "main packet" kann aus folgenden Elementen bestehen:
+
+a) Deklarationen und Anweisungen. Diese müssen nicht in einer bestimmten Reihen­
+ folge 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 Pro­
+ grammierpraxis, die meisten Deklarationen an den Anfang eines Programms oder
+ Programmteils (Refinement, Prozedur) zu plazieren.
+
+ <Deklarationen> ;
+ <Anweisungen>
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT VAR erste zahl, zweite zahl;
+
+ page;
+ put ("erste Zahl = "); get (erste zahl);
+ put ("zweite Zahl ="); get (zweite zahl)
+
+____________________________________________________________________________
+
+
+b) Deklarationen, Refinements und Anweisungen. In diesem Fall ist es notwendig, die
+ Refinements hintereinander zu plazieren. Refinement-Aufrufe und/oder
+ Anweisungen sollten textuell vorher erscheinen.
+
+ <Deklarationen> ;
+ <Refinement-Aufrufe und/oder Anweisungen> .
+ <Refinements>
+
+ Innerhalb der Refinements sind Anweisungen und/oder Deklarationen möglich.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT VAR erste zahl, zweite zahl;
+
+ loesche bildschirm;
+ lies zwei zahlen ein.
+
+ loesche bildschirm:
+ page.
+
+ lies zwei zahlen ein:
+ put ("erste Zahl = "); get (erste zahl);
+ put ("zweite Zahl ="); get (zweite zahl).
+
+____________________________________________________________________________
+
+
+c) Deklarationen, Prozeduren und Anweisungen. Werden Prozeduren vereinbart,
+ sollte man sie nach den Deklarationen plazieren. Danach sollten die Anweisungen
+ folgen:
+
+ <Deklarationen> ;
+ <Prozeduren> ;
+ <Anweisungen>
+
+ Mehrere 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 wieder­
+ um 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.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT VAR erste zahl, zweite zahl;
+
+ PROC vertausche (INT VAR a, b):
+ INT VAR x;
+
+ x := a;
+ a := b;
+ b := x
+ END PROC vertausche;
+
+ put ("erste Zahl = "); get (erste zahl);
+ put ("zweite Zahl ="); get (zweite zahl);
+ IF erste zahl > zweite zahl
+ THEN vertausche (erste zahl, zweite zahl)
+ FI
+
+____________________________________________________________________________
+
+
+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 Refine­
+ ments). In PACKET-Refinements dürfen natürlich keine Datenobjekte verwandt
+ werden, die lokal zu einer Prozedur sind.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ INT VAR erste zahl, zweite zahl;
+
+ PROC vertausche (INT VAR a, b):
+ INT VAR x;
+
+ x := a;
+ a := b;
+ b := x
+ END PROC vertausche;
+
+ loesche bildschirm;
+ lies zwei zahlen ein;
+ ordne die zahlen.
+
+ loesche bildschirm:
+ page.
+
+ lies zwei zahlen ein:
+ put ("erste Zahl = "); get (erste zahl);
+ put ("zweite Zahl ="); get (zweite zahl).
+
+ ordne die zahlen:
+ IF erste zahl > zweite zahl
+ THEN vertausche (erste zahl, zweite zahl)
+ FI
+
+____________________________________________________________________________
+#page#
+
+2.6 Zusammengesetzte Datentypen
+
+In ELAN gibt es die Möglichkeit, gleichartige oder ungleichartige Datenobjekte zu
+einem Objekt zusammenzufassen.
+
+
+2.6.1 Reihung
+
+Die Zusammenfassung gleichartiger Datenobjekte, wird in ELAN eine Reihung (ROW)
+genannt. Die einzelnen Objekte einer Reihung werden Elemente genannt.
+
+Eine Reihung wird folgendermaßen deklariert:
+
+- Schlüsselwort #on("i")##on("b")#ROW#off("i")##off("b")#
+- Anzahl der zusammengefaßten Elemente
+ (INT-Denoter oder durch LET definierter Name)
+- Datentyp der Elemente
+- Zugriffsrecht ( #on("i")##on("b")#VAR#off("i")##off("b")# oder #on("i")##on("b")#CONST#off("i")##off("b")# )
+- Name der Reihung.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ ROW 10 INT VAR feld
+
+____________________________________________________________________________
+
+
+Im obigen Beispiel wird eine Reihung von 10 INT-Elementen deklariert. ROW 10 INT
+ist ein (neuer, von den elementaren unterschiedlicher) Datentyp, für den keine Opera­
+tionen definiert sind, außer der Zuweisung. Das Accessrecht (VAR im obigen Bei­
+spiel) 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 sehr schnell
+einsichtig, wenn man bedenkt, 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 unter­
+schiedliche Operationen definiert. Man müßte nun für jeden dieser zusammengesetz­
+ten 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 vorgege­
+bene Operationen auf zusammengesetzte Datentypen gibt.
+
+Zugegebenermaßen könnte man mit solchen Datentypen, die nur über eine Operation
+verfügen (Zuweisung), nicht sehr viel anfangen, wenn es nicht eine weitere vorgege­
+bene Operation gäbe, die Subskription. Sie erlaubt es, auf die Elemente einer Reih­
+ung zuzugreifen und den Datentyp der Elemente "aufzudecken".
+
+Form:
+
+Rowname #on("i")##on("b")#[#off("i")##off("b")# Indexwert #on("i")##on("b")#]#off("i")##off("b")#
+
+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
+oder Index (in obigem Beispiel '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 überall da verwendet
+werden, wo ein entsprechender Datentyp benötigt wird (Ausnahme: nicht als Schlei­
+fenvariable).
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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
+
+____________________________________________________________________________
+
+
+In diesen Beispielen werden Reihungen als Parameter benutzt.
+
+Diese beiden Prozeduren werden im folgenden Beispiel benutzt um 10 Werte einzu­
+lesen und die Summe zu berechnen:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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).
+
+____________________________________________________________________________
+
+
+Da es möglich ist, von jedem Datentyp eine Reihung zu bilden, kann man natürlich
+auch von einer Reihung eine Reihung bilden:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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 zuzugreifen:
+
+
+matrix [3]
+
+
+liefert ein Datenobjekt mit dem Datentyp ROW 10 INT.
+
+Subskribiert man jedoch 'matrix' nochmals, so erhält man ein INT:
+
+
+matrix [2] [8]
+
+
+(jede Subskription "schält" von Außen ein ROW vom Datentyp ab).
+#page#
+
+2.6.2 Struktur
+
+Strukturen sind Datenverbunde wie Reihungen, aber die Komponenten können unglei­
+chartige Datentypen haben. Die Komponenten von Strukturen heißen Felder (Reihun­
+gen: 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ß.
+
+Die Deklaration einer Struktur sieht folgendermaßen aus:
+
+- Schlüsselwort #schl ("STRUCT#off("i")##off("b")#
+- unterschiedliche Datenobjekte in Klammern. Die Datenobjekte werden mit Datentyp und Namen angegeben
+- Zugriffsrecht ( #on("i")##on("b")#VAR#off("i")##off("b")# oder #on("i")##on("b")#CONST#off("i")##off("b")# )
+- Name der Struktur.
+
+____________________________________________________________________________
+ ........................... 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.
+
+Die Selektion hat folgende Form:
+
+Objektname #on("i")##on("b")#.#off("i")##off("b")# Feldname
+
+Beispiele:
+
+
+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:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ STRUCT (TEXT produkt name, INT artikel nr) VAR erzeugnis
+
+____________________________________________________________________________
+
+
+Die obige Struktur ist ein anderer Datentyp als im ersten Beispiel dieses Abschnitts,
+da die Namen der Felder zur Unterscheidung hinzugezogen werden. Für Strukturen -
+genauso wie bei Reihungen - kann man sich neue Operationen definieren.
+
+Im folgenden Programm werden eine Struktur, die Personen beschreibt, die Prozedu­
+ren 'put', 'get' und der dyadische Operator HEIRATET definiert. Anschließend werden
+drei Paare verHEIRATET.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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;
+
+____________________________________________________________________________
+
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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 Reihen­
+folge vorzunehmen, wie die Datentypen aufgebaut wurden (von außen nach innen).
+#page#
+
+2.6.3 LET-Konstrukt für zusammengesetzte Datentypen
+
+
+Die Verwendung von Strukturen oder auch Reihungen kann manchmal schreibauf­
+wendig sein. Mit dem LET-Konstrukt darf man Datentypen 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.
+
+Form:
+
+#on("i")##on("b")#LET#off("i")##off("b")# Name #on("i")##on("b")#=#off("i")##off("b")# Datentyp
+
+Der Name darf nur aus Großbuchstaben (ohne Blanks) bestehen.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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 wird, kann stattdessen der Name
+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 später
+erklärt werden, nicht mehr der Fall ist).
+
+Neben der Funktion der Abkürzung von Datentypen kann das LET-Konstrukt auch
+zur Namensgebung für Denoter verwandt werden (siehe 2.3.1.2).
+
+
+
+2.6.4 Denoter für zusammengesetzte
+ Datentypen (Konstruktor)
+
+
+Oft ist es notwendig, Datenverbunden Werte zuzuweisen (z.B.: bei der Initialisierung).
+Dies 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
+
+____________________________________________________________________________
+
+
+Eine andere Möglichkeit für die Wertbesetzung von Datenverbunden ist der Konstruk­
+tor:
+
+Form:
+
+Datentyp #on("i")##on("b")#:#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Wertliste #on("i")##on("b")#)#off("i")##off("b")#
+
+In der Wertliste wird für jede Komponente des Datentyps, durch Kommata getrennt,
+ein Wert aufgeführt. Besteht eine der Komponenten wiederum aus einem Datenver­
+bund, muß innerhalb des Konstruktors wiederum ein Konstruktor eingesetzt werden.
+
+____________________________________________________________________________
+ ........................... 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 Datenverbundes
+in einem Programm zu notieren.
+
+Konstruktoren sind natürlich für Reihungen auch möglich:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ ROW 7 INT VAR feld;
+ feld := ROW 7 INT : ( 1, 2, 3, 4, 5, 6, 7);
+____________________________________________________________________________
+#page#
+
+2.7 Abstrakte Datentypen
+
+
+2.7.1 Definition neuer Datentypen
+
+Im Gegensatz zur LET-Vereinbarung für Datentypen, bei der lediglich ein neuer
+Name für einen bereits vorhandenen Datentyp eingeführt wird 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-Verein­
+barung ein gänzlich neuer Datentyp eingeführt.
+
+Form:
+
+#on("i")##on("b")#TYPE#off("i")##off("b")# Name #on("i")##on("b")#=#off("i")##off("b")# Feinstruktur
+
+Der Name darf nur aus Großbuchstaben (ohne Blanks) bestehen. Die Feinstruktur
+(konkreter Typ, Realisierung des Datentyps) kann jeder bereits definierte Datentyp
+sein.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ TYPE PERSON = STRUCT (TEXT name, vorname, INT alter)
+
+____________________________________________________________________________
+
+
+Der neudefinierte Datentyp wird abstrakter Datentyp genannt. Im Gegensatz zu
+Strukturen und Reihungen stehen für solche Datentypen noch nicht einmal die Zuwei­
+sung zur Verfügung. Ein solcher Datentyp kann genau wie alle anderen Datentypen
+verwendet werden (Deklarationen, Parameter, wertliefernde Prozeduren, als Kompo­
+nenten in Reihungen und Strukturen usw.).
+
+Wird der Datentyp über die Schnittstelle des PACKETs anderen Programmteilen zur
+Verfügung gestellt, so müssen Operatoren und/oder Prozeduren für den Datentyp
+ebenfalls "herausgereicht" werden. Da dann der neudefinierte Datentyp genauso wie
+alle anderen Datentypen verwandt werden kann, aber die Komponenten (Feinstruktur)
+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ßer­
+ halb des definierenden PACKETs zur Verfügung steht)
+
+
+
+2.7.2 Konkretisierung
+
+Um neue Operatoren und/oder Prozeduren für einen abstrakten Datentyp zu schrei­
+ben, 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 ab­
+strakten Typ zum Datentyp der Feinstruktur.
+
+Form:
+
+#on("i")##on("b")#CONCR#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Ausdruck #on("i")##on("b")#)#off("i")##off("b")#
+
+____________________________________________________________________________
+ ........................... 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 Strukturen, dann wird
+durch eine Selektion oder Subskription eine implizite Konkretisierung vorgenommen.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ TYPE LISTE = ROW 100 INT;
+
+ LISTE VAR personal nummer;
+ ...
+ personal nummer [3] := ...
+ (* das gleiche wie *)
+ CONCR (personal nummer) [3] := ...
+
+____________________________________________________________________________
+
+
+2.7.3 Denoter für abstrakte
+ Datentypen (Konstruktor)
+
+
+Denoter für neudefinierte Datentypen werden mit Hilfe des Konstruktors gebildet:
+
+Form:
+
+Datentyp #on("i")##on("b")#:#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Wertliste #on("i")##on("b")#)#off("i")##off("b")#
+
+In der Wertliste wird für jede Komponente des Datentyps, durch Kommata getrennt,
+ein Wert aufgeführt. Besteht eine der Komponenten wiederum aus einem Datenver­
+bund, muß innerhalb des Konstruktors wiederum ein Konstruktor eingesetzt werden.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ TYPE GEHALT = INT;
+
+ GEHALT VAR meins :: GEHALT : (10000);
+
+____________________________________________________________________________
+
+
+Besteht die Feinstruktur aus einem Datenverbund, muß der Konstruktor u.U. mehrfach
+geschachtelt angewandt werden:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ TYPE KOMPLEX = ROW 2 REAL;
+
+ KOMPLEX CONST x :: KOMPLEX : ( ROW 2 REAL : ( 1.0, 2.0));
+
+____________________________________________________________________________
+
+
+Auf die Feinstruktur über den Konkretisierer eines neudefinierten Datentyps darf nur in
+dem PACKET zugegriffen werden, in dem der Datentyp definiert wurde. Der Konstruk­
+tor kann ebenfalls nur in dem typdefinierenden PACKET verwandt werden.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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).
+____________________________________________________________________________
+#page#
+
+2.8 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 Massenspeichern
+aufbewahrt wird. Dateien sind in bestimmten Informationsmengen, den Sätzen ("re­
+cords") organisiert.
+
+
+
+2.8.1 Datentypen FILE und DIRFILE
+
+In ELAN gibt es zwei Arten von Dateien. Sie werden durch die Datentypen FILE
+und DIRFILE realisiert:
+
+
+
+FILE:
+sequentielle Dateien. Die Sätze können nur sequentiell gelesen bzw. geschrieben
+werden. Eine Positionierung ist nur zum nächsten Satz möglich.
+
+
+DIRFILE:
+indexsequentielle Dateien. Die Positionierung erfolgt direkt mit Hilfe eines Schlüssels
+("key") oder Index, kann aber auch sequentiell vorgenommen werden.
+
+#on("b")#Wichtig: #off("b")#
+DIRFILEs sind auf dem EUMEL-System standardmäßig nicht implementiert! Deswe­
+gen wird auf diesen Dateityp hier nicht weiter eingegangen.
+#page#
+
+2.8.2 Deklaration und Assoziierung
+
+Dateien müssen in einem ELAN-Programm - wie alle anderen Objekte auch -
+deklariert werden.
+
+Form:
+
+#on("i")##on("b")#FILE#off("i")##off("b")# #on("i")##on("b")#VAR#off("i")##off("b")# interner Dateibezeichner
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ FILE VAR f
+
+____________________________________________________________________________
+
+
+Dabei ist zu beachten, daß im EUMEL-System alle FILEs als VAR deklariert werden
+müssen, denn jede Lese/Schreib-Operation verändert einen FILE.
+
+Dateien werden normalerweise vom Betriebsystem 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 Betriebssystem notwendig. Dies erfolgt durch die sogenannte Assozi­
+ierungsprozedur. Die Assoziierungsprozedur 'sequential file' hat die Aufgabe, eine in
+einem Programm deklarierte FILE VAR mit einer bereits vorhandenen oder noch
+einzurichtenden Datei des EUMEL-Systems zu koppeln.
+
+Form:
+
+#on("i")##on("b")#sequential file#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Betriebsrichtung, Dateiname #on("i")##on("b")#)#off("i")##off("b")#
+
+Es gibt folgende Betriebsrichtungen (TRANSPUTDIRECTIONs):
+
+
+input:
+Die Datei kann vom Programm nur gelesen werden. Durch 'input' wird bei der Asso­
+ziierung automatisch auf den ersten Satz der Datei positioniert. Ist die zu lesende
+Datei nicht vorhanden, wird ein Fehler gemeldet.
+
+
+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 vor­
+handen, wird sie automatisch eingerichtet.
+
+
+modify:
+Im EUMEL-System gibt es noch die Betriebsrichtung '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.
+
+Nach erfolgter Assoziiierung ist auf den zuletzt bearbeiteten Satz positioniert. Die
+Datei wird automatisch eingerichtet, wenn sie vor der Assoziierung nicht vorhanden
+war.
+
+Der zweite Parameter der Assoziierungsprozedur gibt an, unter welchem Namen die
+Datei in der Task existiert oder eingerichtet werden soll.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ FILE VAR meine datei :: sequential file (output, "xyz");
+
+____________________________________________________________________________
+
+
+Folgendes Beispiel zeigt ein Programm, welches eine Datei liest und auf dem Ausga­
+bemedium ausgibt:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ FILE VAR f :: sequential file (input, "datei1");
+ TEXT VAR satz;
+ WHILE NOT eof (f) REP
+ getline (f, satz);
+ putline (satz);
+ END REP.
+
+____________________________________________________________________________
+
+
+Eine genau Übersicht der für Dateien existierende Operatoren und Prozeduren finden
+Sie im Teil 5.3.
+#page#
+
+2.9 Abstrakte Datentypen
+ im EUMEL-System
+
+
+
+2.9.1 Datentyp TASK
+
+Tasks müssen im Rechnersystem eindeutig identifiziert werden; sogar im EUMEL-
+Rechner-Netz sind Tasks eindeutig identifizierbar. Dazu wird der spezielle Datentyp
+'TASK' benutzt, denn die Identifizierung einer Task über den Namen ist nicht eindeu­
+tig. Der Benutzer kann ja einen Tasknamen ändern, eine Task löschen und eine
+neue Task mit gleichem Namen einrichten, die jedoch nicht gleich reagiert. Somit
+werden Tasks eindeutig über Variablen vom Datentyp TASK identifiziert.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ TASK VAR plotter := task ("PLOTTER 1")
+
+____________________________________________________________________________
+
+
+Die Taskvariable 'plotter' bezeichnet jetzt die Task im System, die augenblicklich den
+Namen "PLOTTER 1" hat. Die Prozedur 'task' liefert den systeminternen Taskbe­
+zeichner.
+
+Nun sind Taskvariablen auch unter Berücksichtigung der Zeit und nicht nur im aktuel­
+len Systemzustand eindeutig. Der Programmierer braucht sich also keine Sorgen
+darüber zu machen, daß seine Taskvariable irgendwann einmal eine "falsche" Task
+(nach Löschen von "PLOTTER 1" neu eingerichtete gleichen oder anderen Namens)
+identifiziert. Wenn die Task "PLOTTER 1" gelöscht worden ist, bezeichnet 'plotter'
+keine gültige Task mehr.
+
+Unbenannte Tasks haben alle den Pseudonamen "-". Sie können nur über Taskvari­
+ablen angesprochen werden.
+
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ PROC generate shutup manager:
+ TASK VAR son;
+ begin ("shutup", PROC shutup manager, son)
+ END PROC generate shutup manager;
+
+ PROC shutup manager:
+ disable stop;
+ command dialogue (TRUE);
+ REP
+ break;
+ line;
+ IF yes ("shutup")
+ THEN clear error;
+ shutup
+ FI
+ PER
+ END PROC shutup manager
+
+____________________________________________________________________________
+
+
+Ein Taskvariable wird zum Beispiel als Parameter für die Prozedur 'begin' benötigt.
+
+begin
+ #on("b")#PROC begin (TEXT CONST son name, PROC start,
+ TASK VAR new task)#off("b")#
+ Die Prozedur richtet eine Sohntask mit Namen 'son name' (im Beispiel: shutup)
+ ein, die mit der Prozedur 'start' (im Beispiel: shutup manager) gestartet wird. 'new
+ task' (im Beispiel: son) identifiziert den Sohn, falls die Sohntask korrekt eingerich­
+ tet wurde.
+#page#
+
+2.9.2 Datentyp THESAURUS
+
+Ein Thesaurus ist ein Namensverzeichnis, das bis zu 200 Namen beinhalten kann.
+Dabei muß jeder Name mindestens ein Zeichen und höchstens 100 Zeichen lang sein.
+Steuerzeichen (code < 32) werden im Namen folgendermaßen umgesetzt:
+
+#on("i")##on("b")#steuerzeichen#off("b")##off("i")# wird umgesetzt in #on("i")##on("b")#"""" + code(steuerzeichen) + """"#off("b")##off("i")#
+
+Ein Thesaurus ordnet jedem eingetragenen Namen einen Index zwischen 1 und 200
+(einschließlich) zu. Diese Indizes bieten dem Anwender die Möglichkeit, Thesauri zur
+Verwaltung benannter Objekte zu verwenden. (Der Zugriff erfolgt dann über den Index
+eines Namens in einem Thesaurus). So werden Thesauri u.a. von der Dateiverwaltung
+benutzt. Sie bilden die Grundlage der ALL- und SOME-Operatoren.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ initialisiere;
+ arbeite thesaurus ab.
+
+ initialisiere:
+ THESAURUS VAR eine auswahl :: SOME (myself);
+ TEXT VAR thesaurus element;
+ INT VAR index :: 0.
+
+ arbeite thesaurus ab:
+ REPEAT
+ get (eine auswahl, thesaurus element, index);
+ IF thesaurus element = ""
+ THEN LEAVE arbeite thesaurus ab
+ FI;
+ fuehre aktionen durch
+ PER.
+
+ fuehre aktionen durch:
+ edit (thesaurus element);
+ lineform (thesaurus element);
+ pageform (thesaurus element);
+ print (thesaurus element).
+
+____________________________________________________________________________
+
+
+Dieses Beispiel führt für eine Auswahl der in der Task befindlichen Dateien nachein­
+ander die Kommandos 'edit', 'lineform', 'pageform' und 'print' aus.
+
+Die benutzten Operatoren und Prozeduren leisten folgendes:
+
+#ix("SOME")#
+ #on("b")#THESAURUS OP SOME (TASK CONST task) #off("b")#
+ Der Operator bietet das Verzeichnis der in der angegeben Task befindlichen
+ Dateien zum Editieren an. Namen, die nicht gewünscht sind, müssen aus dem
+ Verzeichnis gelöscht werden.
+
+
+#ix("get")#
+ #on("b")#PROC get (THESAURUS CONST t, TEXT VAR name, INT VAR index)
+ #off("b")# Die Prozedur liefert den nächsten Eintrag aus dem angegebenen Thesaurus 't'.
+ 'Nächster' heißt hier, der kleinste vorhandene mit einem Index größer als 'index'.
+ Dabei wird in 'name'der Name und in 'index'der Index des Eintrags geliefert.
+#page#
+
+2.9.3 Datenräume
+
+Datenräume sind die Grundlage von Dateien im EUMEL-System. Einen Datenraum
+kann man sich als eine Sammlung von Daten vorstellen (u.U. leer). Man kann einem
+Datenraum durch ein Programm einen Datentyp "aufprägen". Nach einem solchen
+"Aufpräge"-Vorgang kann der Datenraum wie ein "normaler" Datentyp behandelt
+werden.
+
+Standarddateien (FILEs) sind eine besondere Form von Datenräumen. Sie 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. Hier­
+für stehen Standardprozeduren 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. Zu diesem Zweck werden im
+EUMEL-System Datenräume eingesetzt, 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
+dem Datenraum gespeicherten Objektes nicht kennen.
+
+
+
+2.9.3.1 Datentyp DATASPACE
+
+Datenräume können als eigener Datentyp (DATASPACE) in einem Programm behan­
+delt werden. Somit können Datenräume (als Ganzes) ohne Kenntnis eines eventuell
+(vorher oder später) aufgeprägten Typs benutzt werden.
+
+Als Operationen auf DATASPACE-Objekte sind nur Transporte, Löschen und Zuwei­
+sung zugelassen.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ DATASPACE VAR ds
+
+____________________________________________________________________________
+
+
+Für Datenräume ist die Zuweisung definiert. Der Zuweisungsoperator (':=') bewirkt
+eine Kopie des Datenraums vom rechten auf den linken Operanden.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ DATASPACE VAR datenraum :: nilspace;
+
+____________________________________________________________________________
+
+
+Die Prozedur 'nilspace' liefert einen leeren Datenraum. Der Datenraum 'datenraum' ist
+also eine Kopie des leeren Datenraums.
+
+Die Prozeduren und Operatoren für Datenräume werden im Teil 5.4.7 beschrieben.
+#page#
+
+2.9.3.2 BOUND-Objekte
+
+Wie bereits erwähnt, kann man einem Datenraum einen Datentyp aufprägen. Dazu
+werden #ib#BOUND#ie#-Objekte benutzt. Mit dem Schlüsselwort #on("i")##on("b")#BOUND#off("i")##off("b")#, welches in der
+Deklaration vor den Datentyp gestellt wird, teilt man dem ELAN-Compiler mit, daß
+die Werte eines Datentyps in einem Datenraum gespeichert sind bzw. gespeichert
+werden sollen.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ BOUND ROW 1000 REAL VAR liste
+
+____________________________________________________________________________
+
+
+Die Ankopplung des BOUND-Objekts an eine Datei erfolgt mit dem Operator #on("i")##on("b")#:=#off("i")##off("b")#.
+
+Form:
+
+BOUND-Objekt #on("i")##on("b")#:=#off("i")##off("b")# Datenraum
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ BOUND ROW 1000 REAL VAR gehaltsliste := new ("Gehälter")
+
+____________________________________________________________________________
+
+
+Die Prozedur 'new' kreiert dabei einen leeren Datenraum (hier mit dem Namen 'Ge­
+hälter'), der mit Hilfe der Zuweisung (hier: Initialisierung) an die Variable 'gehaltsliste'
+gekoppelt wird.
+
+Nun kann man mit der 'gehaltsliste' arbeiten wie mit allen anderen Feldern auch. Die
+Daten, die in 'gehaltsliste' gespeichert, werden eigentlich im Datenraum 'Gehälter'
+abgelegt.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ gehaltsliste [5] := 10 000.0; (* Traumgehalt *)
+ gehaltsliste [index] INCR 200.0; (* usw. *)
+
+____________________________________________________________________________
+
+
+Man kann auch Prozeduren schreiben, die auf der Gehaltsliste arbeiten.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ PROC sort (ROW 1000 REAL VAR liste):
+ ...
+ END PROC sort;
+ ...
+ sort (CONCR (gehaltsliste));
+ ...
+
+____________________________________________________________________________
+
+
+Man beachte, daß der formale Parameter der Prozedur 'sort' nicht mit BOUND spezi­
+fiziert werden darf (BOUND wird nur bei der Deklaration des Objekts angegeben). Das
+ist übrigens ein weiterer wichtiger Vorteil von BOUND-Objekten: man kann alle
+Prozeduren des EUMEL-Systems auch für BOUND-Objekte verwenden, nur die
+Datentypen müssen natürlich übereinstimmen.
+
+
+Häufige Fehler bei der Benutzung von Datenräumen
+
+- Wenn man an ein DATASPACE-Objekt zuweist (z.B.: DATASPACE VAR ds :=
+ new ("mein datenraum")), so erhält man, wie bereits 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.
+ Für Änderungen in der Quelle, also in der vom Datei-Manager verwalteten Datei,
+ ist stets direkt anzukoppeln.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ BOUND ROW 10 INT VAR reihe;
+ INT VAR i;
+
+ PROC zeige dsinhalt (TEXT CONST datenraum):
+ BOUND ROW 10 INT VAR inhalt := old (datenraum);
+ INT VAR j;
+ line;
+ putline ("Inhalt:" + datenraum);
+ FOR j FROM 1 UPTO 10 REP
+ put (inhalt (j))
+ PER
+ END PROC zeige dsinhalt;
+
+ (* falsch: es wird auf der Kopie gearbeitet: *)
+ DATASPACE VAR ds := new ("Gegenbeispiel: Zahlen 1 bis 10");
+ reihe := ds;
+ besetze reihe;
+ zeige dsinhalt ("Gegenbeispiel: Zahlen 1 bis 10");
+
+ (* richtig: es wird auf dem Datenraum gearbeitet: *)
+ reihe := new ("Beispiel: Zahlen 1 bis 10");
+ besetze reihe;
+ zeige dsinhalt ("Beispiel: Zahlen 1 bis 10").
+
+ besetze reihe:
+ FOR i FROM 1 UPTO 10 REP
+ reihe (i) := i
+ PER.
+
+____________________________________________________________________________
+
+
+ Der Datenraum 'Gegenbeispiel: Zahlen 1 bis 10' wird nicht mit Werten besetzt,
+ sondern die Kopie dieses Datenraums, der unbenannte Datenraum 'ds'. Auf dem
+ direkt angekoppelten Datenraum 'Beispiel: Zahlen 1 bis 10' werden die Werte
+ gespeichert.
+
+
+- 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'. Ein automatisches Löschen von DATASPACE-Objekten erfolgt nicht bei
+ Programmende (sonst könnten sie ihre Funktion als Datei nicht erfüllen). Nur
+ durch 'forget' oder beim Löschen einer Task werden alle ihr gehörenden
+ DATASPACE-Objekte gelöscht und der belegte Speicherplatz freigegeben.
+
+
+- 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) (* Datenraum löschen,
+ damit der Platz wieder verwendet wird *)
+
+____________________________________________________________________________
+
+
+- Will man auf die Feinstruktur eines BOUND-Objekts zugreifen, so muß man
+ strenggenommen den Konkretisierer benutzen:
+
+ Form:
+
+ #on("i")##on("b")#CONCR#off("i")##off("b")# #on("i")##on("b")#(#off("i")##off("b")# Ausdruck #on("i")##on("b")#)#off("i")##off("b")#
+
+ Der Konkretisierer ermöglicht eine typmäßige Umbetrachtung vom BOUND-Objekt
+ zum Datentyp der Feinstruktur. Ist der Zugriff jedoch eindeutig, so wird 'CONCR'
+ automatisch vom Compiler ergänzt.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ BOUND INT VAR i := old ("i-Wert");
+ INT VAR x;
+ x := wert.
+
+ wert:
+ IF x < 0
+ THEN 0
+ ELSE CONCR (i)
+ FI.
+
+____________________________________________________________________________
+
+
+In diesem Beispiel muß der Konkretisierer benutzt werden, da sonst der Resultattyp
+des Refinements nicht eindeutig ist (BOUND oder INT?).
+
+
+
+2.9.3.3 Definition neuer Dateitypen
+
+Durch die Datenräume und die Datentyp-Definition von ELAN ist es für Programmie­
+rer 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 soll an dem Beispiel DIRFILE (welcher zwar im ELAN-Standard
+definiert, aber nicht im EUMEL-System realisiert ist) gezeigt werden, wie ein neuer
+Datei-Datentyp definiert wird:
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ 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 vorhandenen Datenraum oder
+richtet einen neuen ein. Um eine Initialisierung mit der 'dirfile'-Prozedur vorneh­
+men zu können, braucht man auch einen Zuweisungsoperator, 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 benut­
+zen.
+
+____________________________________________________________________________
+ ........................... 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;
+ ...
+
+____________________________________________________________________________
+#page#
+
+2.9.4 Datentyp INITFLAG
+
+Im Multi-User-System ist es oft notwendig, Pakete beim Einrichten einer neuen
+Task in dieser neu zu initialisieren. Das muß z.B. bei der Dateiverwaltung gemacht
+werden, da die neue Task ja nicht die Dateien des Vaters erbt. Mit Hilfe von
+INITFLAG-Objekten kann man zu diesem Zweck feststellen, ob ein Paket in dieser
+Task schon initialisiert wurde.
+
+
+INITFLAG
+ #on("b")#TYPE INITFLAG #off("b")#
+ Erlaubt die Deklaration entsprechender Flaggen.
+
+:=
+ #on("b")#OP := (INITFLAG VAR flag, BOOL CONST flagtrue) #off("b")#
+ Erlaubt die Initialisierung von INITFLAGs
+
+initialized
+ #on("b")#BOOL PROC initialized (INITFLAG VAR flag) #off("b")#
+ Wenn die Flagge in der Task A auf TRUE oder FALSE gesetzt wurde, dann liefert
+ sie beim ersten Aufruf den entsprechenden Wert, danach immer TRUE (in der
+ Task A!).
+
+ Beim Einrichten von Söhnen wird die Flagge in den Sohntasks automatisch auf
+ FALSE gesetzt. So wird erreicht, daß diese Prozedur in den neu eingerichteten
+ Söhnen und Enkeltasks genau beim ersten Aufruf FALSE liefert.
+
+____________________________________________________________________________
+ ........................... Beispiel: .........................
+ PACKET stack DEFINES push, pop:
+
+ INITFLAG VAR in this task := FALSE ;
+ INT VAR stack pointer ;
+ ROW 1000 INT VAR stack ;
+
+ PROC push (INT CONST value) :
+
+ initialize stack if necessary ;
+ ....
+
+ END PROC push ;
+
+ PROC pop (INT VAR value) :
+
+ initialize stack if necessary ;
+ ....
+
+ END PROC pop ;.
+
+ initialize stack if necessary :
+ IF NOT initialized (in this task)
+ THEN stack pointer := 0
+
+ FI .
+
+ END PACKET stack
+____________________________________________________________________________
+
diff --git a/doc/programming/programmierhandbuch.3 b/doc/programming/programmierhandbuch.3
new file mode 100644
index 0000000..eade335
--- /dev/null
+++ b/doc/programming/programmierhandbuch.3
@@ -0,0 +1,728 @@
+#headandbottom("1","EUMEL-Benutzerhandbuch","TEIL 3 : Editor","3")#
+#pagenr("%",1)##setcount##block##pageblock#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#TEIL 3 : Editor
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+3 - % #right#GMD
+#end#
+#bottomodd#
+#center#____________________________________________________________
+GMD #right#3 - %
+#end#
+
+TEIL 3: Der Editor
+
+Mit dem #ib#EUMEL-Editor#ie# steht für den Teil der Programmierung, der aus der Eingabe
+von Programmtext besteht, dasselbe komfortable Werkzeug zur Verfügung, wie für die
+Textverarbeitung. Merkmale des EUMEL-Editors sind die einfache Fenstertechnik
+und die übersichtliche Bedienung durch wenige Funktionstasten.
+
+Eine mit dem Editor erzeugte Textdatei ist maximal 4075 Zeilen lang, die maximale
+Breite einer Zeile beträgt 16000 Zeichen.
+
+
+
+3.1 Ein- und Ausschalten des Editors
+
+Der Editor wird eingeschaltet durch Eingabe von:
+
+____________________________________________________________________________
+ gib kommando :
+ #ib#edit#ie# ("dateiname")
+
+____________________________________________________________________________
+
+
+Falls eine Datei unter dem eingegebenen Namen existiert, wird ein Fenster auf dieser
+Datei an der Stelle geöffnet, an der zuletzt ein Zugriff auf diese Datei stattfand.
+
+Existiert noch keine Datei unter dem angegebenen Namen in der Task, folgt eine
+Anfrage, ob eine Datei unter dem eingegebenen Namen neu eingerichtet werden soll:
+
+____________________________________________________________________________
+ gib kommando :
+ edit("dateiname")
+ "dateiname" neu einrichten (j/n) ?
+
+____________________________________________________________________________
+
+
+Die Abfrage dient der Kontrolle der Schreibweise. Man kann ggf. das Einrichten der
+Datei ablehnen, den Dateinamen verbessern und das Kommando erneut geben.
+
+Bei korrekter Schreibweise bejahen Sie die Kontrollfrage#u# 1)#e#mit
+
+#center#<j> <J> <y> oder <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ütz­
+liche Dinge an: den Namen der Datei, die Nummer der aktuellen Zeile, in der gerade
+geschrieben wird, Tabulatormarken, Einfügemodus, Lernmodus usw.
+
+____________________________________________________________________________
+ #mark on# ............... dateiname ....................#mark off# Zeile 1 #mark on# #mark off#
+ _
+
+____________________________________________________________________________
+
+
+
+Wollen Sie die #ib#Schreibarbeit beenden#ie# und den #ib#Editor ausschalten#ie#, so drücken Sie die
+beiden Tasten
+
+<ESC> <q>
+
+nacheinander. Sie haben damit den #ib#Editor verlassen#ie# und befinden sich wieder auf
+Monitor-Ebene.
+#page#
+
+3.2 Die Funktionstasten
+
+Die Funktionstasten realisieren diejenigen Fähigkeiten des Editor, die über die reine
+Zeicheneingabe hinausgehen. Wo die Tasten auf Ihrem Gerät liegen, hängt von dem
+jeweiligen Gerätetyp ab. Die Wirkung der Tasten ist im Weiteren erläutert.
+
+#l pos (0.0)##l pos(4.0)#
+#table#
+#free(0.5)#
+#taste1(" SHIFT ")# Umschalttaste
+#tableend#
+#free(0.5)#
+<v> <^> <>> <<> Positionierungstasten
+#table#
+#free(0.5)#
+<CR> Eingabe-/ Absatztaste
+#free(0.5)#
+<ESC> Kommandotaste
+#free(0.5)#
+<HOP> Verstärkertaste
+#free(0.5)#
+<TAB> Tabulatortaste
+#free(0.5)#
+<MARK> Markiertaste
+#free(0.5)#
+<RUBOUT> Löschtaste
+#free(0.5)#
+<RUBIN> Einfügetaste
+#free(0.5)#
+<SV> Supervisortaste
+#free(0.5)#
+<STOP> Stoptaste
+#free(0.5)#
+<WEITER> Weitertaste
+#tableend##clear pos#
+#free(0.5)#
+Es kann sein, daß Tasten nicht richtig beschriftet sind. Die Installations-anleitung
+muß dann die Entsprechungen beschreiben. Natürlich können sich weitere Funktions­
+tasten außer den im folgenden beschriebenen auf Ihrer Tastatur befinden. Diese
+haben standardmäßig jedoch keine besondere Bedeutung für den Editor.
+
+#page#
+
+3.3 Die Wirkung der Funktionstasten
+
+<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(0.5)#
+<>> <<>
+
+<v> <^>
+
+Positionierungstasten
+
+#ib#Positionierung des Cursors#ie# um eine Spalten-/Zeilenposition in die jeweilige Richtung.
+#free(0.5)#
+<CR>
+
+#ib#Eingabetaste / Absatztaste#ie#, Carriage Return, kurz: 'CR'
+
+Diese Taste schließt die aktuelle Zeile explizit ab und es wird an den Beginn der
+nächsten Zeile positioniert. Einrückungen werden beibehalten.
+
+Der EUMEL-Editor ist auf automatischen Wortumbruch voreingestellt, d.h. ein Wort,
+das über das 77. Zeichen der aktuellen Zeile herausreichen würde, wird automatisch
+in die nächste Zeile gerückt (siehe 'word wrap' 4.2.5). Die Absatztaste wird also
+benötigt, um explizite Zeilenwechsel und Einrückungen bei der Textformatierung zu
+erhalten. Eine Absatzmarke wird durch ein 'blank' hinter dem letzten Zeichen der
+Zeile erzeugt und ist im Editor an der Inversmarkierung am rechten Bildschirmrand zu
+erkennen.
+
+Im EUMEL-System werden Kommandos auf einer Kommandozeile, auf der alle
+Editorfunktionen zur Verfügung stehen, eingegeben. Auf dieser Ebene beendet die
+Taste also ausdrücklich die Kommandoeingabe, das gegebene Kommando wird an­
+schließend analysiert und ausgeführt.
+
+<HOP>
+
+"#ib#Verstärkertaste#ie#"; wird als Vorschalttaste bedient.
+
+In Kombination mit anderen Funktionstasten wird deren Wirkung verstärkt.
+
+
+<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".
+
+Entsprechend werden auch die Tasten : <^> <>> <<> mit der HOP-Taste verstärkt.
+
+#page#
+<HOP> <RUBIN>
+
+#ib#Einfügen von Textpassagen#ie#. 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. Hierzu wird der
+ Cursor an die Position geführt, an der 
+ ein beliebiger Text eingefügt werden soll.#absatz#
+
+____________________________________________________________________________
+
+
+Nach Betätigen der Taste #on("i")##on("b")#HOP#off("i")##off("b")# und #on("i")##on("b")#RUBIN#off("i")##off("b")#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.
+
+#page#
+<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. Rest löschen....
+ Nach HOP RUBOUT ist der Zeilenrest gelöscht.#absatz#
+
+____________________________________________________________________________
+
+
+
+Nach Betätigen der Tasten #on("i")##on("b")#HOP#off("i")##off("b")# und #on("i")##on("b")#RUBOUT#off("i")##off("b")# 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.#absatz#
+
+____________________________________________________________________________
+
+
+
+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#
+<TAB>
+
+#ib#Tabulatortaste#ie#
+
+Mit der Tabulatortaste werden die eingestellten Tabulatorpositionen angesprungen.
+Jeder Tastendruck läßt den Cursor auf die nächste eingestellte Tabulatorposition
+springen.
+
+#on("i")#Voreingestellte#off("i")# Tabulatorpositionen sind die beiden Schreibgrenzen, Textanfang in der
+Zeile und Ende der Zeile.
+
+Weitere Tabulatorpositionen können durch Positionierung auf die gewünschte Spalte
+und #on("i")##on("b")#HOP#off("i")##off("b")# #on("i")##on("b")#TAB#off("i")##off("b")# gesetzt werden. Sie können gelöscht werden, indem sie mit #on("i")##on("b")#TAB#off("i")##off("b")#
+angesprungen und mit #on("i")##on("b")#HOP#off("i")##off("b")# #on("i")##on("b")#TAB#off("i")##off("b")#
+ausgeschaltet werden.
+
+Die gesamte eingestellte Tabulalation kann durch #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#TAB#off("i")##off("b")# ein-/ und ausge­
+schaltet werden.
+
+Die eingestellten Tabulatorpositionen erkennen Sie an den Tabulatorzeichen (Dachzei­
+chen) in der obersten Bildschirmzeile.
+#page#
+<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.
+
+Durch erneutes Betätigen der MARK-Taste schalten Sie den Markier-Zustand
+wieder aus.
+
+Mit weiteren Kommandos kann der Bereich nun bearbeitet werden:
+
+<ESC> <d> Markierten Abschnitt in 'Scratch'-Datei kopieren.
+
+<ESC> <p> Markierten Abschnitt herauskopieren.
+
+<ESC> <RUBOUT> Markierten Abschnitt löschen.
+
+
+Der mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#p#off("i")##off("b")# oder#on("i")##on("b")#d#off("i")##off("b")# kopierte Bereich kann beliebig oft in derselben oder einer
+anderen Datei ein/angefügt werden.
+
+Der mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#RUBOUT#off("i")##off("b")# gelöschte Abschnitt kann genau einmal durch #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#RUBOUT#off("i")##off("b")#
+an anderer Stelle derselben Datei eingefügt werden.
+
+(vgl. ESC-Taste, Operationen auf Markierungen, 3-#topage("ESC")#)
+#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.
+#free(1.0)#
+<RUBOUT>
+
+#ib#Löschtaste#ie#
+
+Das Zeichen, auf dem der Cursor steht, wird gelöscht. Wenn der Cursor, wie bei
+fortlaufender Eingabe üblich, hinter dem letzten Zeichen einer Zeile steht, wird das
+letzte Zeichen gelöscht.
+
+#page#
+
+3.4 ESC Kommandos
+
+<ESC>
+
+#ib#Kommandotaste#ie#
+
+Mit der ESC-Taste in Kombination mit einer Folgetaste werden vordefinierte Aktionen
+ausgelöst. Es gibt Aktionen, die vorprogrammiert zur Verfügung stehen, und Sie selbst
+können weitere hinzufügen.
+
+Der Kommandodialog wird eingeschaltet durch:
+
+<ESC> <ESC>
+
+
+____________________________________________________________________________
+ ............... Beispiel ..................... Zeile 4
+
+ gib kommando:                                             
+
+____________________________________________________________________________
+
+
+Der Kommandodialog ermöglicht die Eingabe von beliebigen Kommandos ohne den
+Editor verlassen zu müssen. Insbesondere Such- und Kopieroperationen stellen auch
+für den Programmierer nützliches Werkzeug dar (siehe 3.5).
+
+Auf der Kommandozeile kann jedes Kommando gegeben werden. Die Kommandozeile
+kann wie eine normale Textzeile editiert werden. Nach #on("i")##on("b")#CR#off("i")##off("b")# verschwindet die Kom­
+mandozeile und das Kommando wird ausgeführt.
+
+Falls ein Fehler auftritt erfolgt eine entsprechende Fehlermeldung in der Kopfzeile und
+die Kommandozeile erscheint erneut.
+
+Um ein weiteres 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 #on("i")##on("b")#CR#off("i")##off("b")# wird ein Fenster auf 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.
+
+Durch
+
+<ESC>  <p> oder <ESC>  <d>
+
+schreibt man einen markierten Teil in eine 'Scratch'-Datei (nicht editierbarer
+Zwischenspeicher); durch ESC p wird ein markierter Text aus der Ursprungsdatei
+entfernt und in die 'Scratch'-Datei 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 für ESC p, bzw. ESC d benutzte #ib#'Scratch'-Datei#ie#, die nicht editierbar ist, ist nicht
+mit dem sogenannten Notizbuch zu verwechseln. Das Notizbuch ist eine Datei, in der
+alle Editorfunktionen benutzt werden können, auf die jedoch ohne Angabe eines
+Dateinamens durch
+
+<ESC> <n>
+
+ab der aktuellen Cursorposition ein Fenster eröffnet wird. Das Notizbuch nimmt
+insbesondere Fehlermeldungen und Meldungen bei der Übersetzung von Programmen
+auf.
+
+<ESC> <v>
+
+erlaubt vom äußeren Fenster aus alle eingeschachtelten Fenster zu verlassen.
+#page#
+
+Vorbelegte Tasten
+
+#ib#ESC q#ie# Verlassen des Editors bzw. der eingeschachtelten Fenster.
+
+#ib#ESC e#ie# Weiteres Editorfenster einschalten.
+
+#ib#ESC n#ie# Notizbuch 'anzeigen'.
+
+#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#
+
+Operationen auf Markierungen
+
+
+#goalpage("ESC")#
+#ib#ESC RUBOUT#ie# Markiertes "vorsichtig" löschen.
+
+#ib#ESC RUBIN#ie# Mit ESC RUBOUT vorsichtig 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, 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.
+#page#
+
+Zeichen schreiben
+Diese Tasten sind standardmäßig so vorbelegt wie hier aufgeführt, sie können aber
+von Benutzern und in Anwenderprogrammen geändert werden.
+
+#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(0.7)#
+
+Kommando auf Taste legen
+
+#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.
+
+
+Der Lernmodus
+Der Lernmodus ermöglicht beliebige Tastensequenzen zu speichern und auf eine
+Taste 't' zu legen. Durch #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#t#off("i")##off("b")# wird die gesamte Sequenz ausgeführt.
+
+Nicht belegt werden können die vom System vorbelegten Tasten (3-14).
+
+Beispielsweise könnte es für einen Programmierer sinnvoll sein die Tastenfolge
+'THEN' 'CR' '>' '>' '>' '>' auf die Taste #on("i")##on("b")#T#off("i")##off("b")# zu legen. Durch #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#T#off("i")##off("b")# wird 'THEN' in
+die aktuelle Zeile geschrieben und der Cursor mit passender Einrückung in die
+Einrückung in die Folgezeile gesetzt.
+
+
+#ib#ESC HOP#ie# #ib#Lernen einschalten#ie#.
+
+#ib#ESC HOP taste#ie# #ib#Lernen ausschalten#ie# und Lernsequenz auf 'taste'legen.
+
+#ib#ESC HOP HOP#ie# #ib#Gelerntes vergessen#ie#. Bedingung ist, daß man die Lernsequenz in
+ der Task löscht, in der man sie hat lernen lassen.
+
+
+#on("b")#
+#center#A C H T U N G :
+Der Lernmodus bleibt eingeschaltet, auch wenn der Editor beendet wird. Dann werden
+die folgenden Monitor-Kommandos usw. usf. 'gelernt'. Durch unsinniges 'Lernen'
+lassen sich schlimmstenfalls beliebige Verwüstungen anrichten.
+
+Der Lernmodus wird in der Editor-Kopfzeile angezeigt. Falls der Editor beendet wird,
+ohne den Lernmodus auszuschalten, erfolgt eine Warnung auf Monitor-Ebene.
+
+Um den Lernmodus zu beenden drücken Sie:
+
+<ESC> <HOP> <HOP>
+
+Dadurch wird der Lernmodus ausgeschaltet und nichts gelernt, die Gefahr ist gebannt.#off("b")#
+
+#page#
+<SV>
+
+#ib#SUPERVISOR-Taste#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 ("meine task")
+
+____________________________________________________________________________
+
+
+
+(falls Ihre Task, in der Sie arbeiteten, wirklich "meine task" 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!
+
+
+
+#on("b")#
+Für die Programmierung ist die Tastenfolge <SV> <ESC> <h> von Bedeutung, da hier­
+durch der Fehler 'halt vom Terminal' erzeugt wird. Dadurch können unerwünscht
+laufende Programme abgebrochen werden.
+#off("b")#
+#page#
+<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.0)#
+<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. Zei­
+ chen, die während des STOP eingegeben werden, werden gespeichert
+ und nach 'WEITER' ausgegeben!
+
+
+#page#
+
+3.5 Positionieren, Suchen, Ersetzen
+ im Kommandodialog
+
+
+Um das Editorfenster auf eine bestimmte Zeile zu positionieren wird einfach diese
+Zeilennummer angegeben.
+
+____________________________________________________________________________
+ ............... Beispiel ..................... Zeile 4
+
+ gib kommando: 123                                          
+
+____________________________________________________________________________
+
+
+
+Falls die Zeilenzahl der Datei geringer als die angegebene Zeilennummer ist, wird auf
+die letzte Zeile positioniert.
+
+
+Um das Editorfenster auf ein bestimmtes Textstück zu positionieren, wird der gesuch­
+te Text, ggf. mit Suchrichtung angegeben.
+
+____________________________________________________________________________
+ ............... Beispiel ..................... Zeile 4
+
+ gib kommando: "END PROC"                                  
+
+____________________________________________________________________________
+
+
+Die Suchrichtung kann durch 'D' (down) oder 'U' (up) zusätzlich spezifiziert werden.
+
+____________________________________________________________________________
+ ............... Beispiel ..................... Zeile 4
+
+ gib kommando: U "INT VAR schleifenzaehler"                 
+
+____________________________________________________________________________
+
+
+
+Um beliebige Texte durch andere zu ersetzen, dienen die Operatoren 'C' (change)
+bzw. 'CA' (change all).
+
+Bei Ausführung dieses Kommandos wird zunächst nach #on("u")#unten#off("u")# in der editierten Datei
+nach dem zu ersetzenden Text gesucht. Wenn der Text gefunden wird, wird er durch
+den hinter dem Operator stehenden Text ersetzt.
+
+____________________________________________________________________________
+ ............... Beispiel ..................... Zeile 4
+
+ gib kommando: "lb" C "lange bezeichnung"                   
+
+____________________________________________________________________________
+
+
+
+Bei Anwendung von 'CA' wird jedes Auftreten des gesuchten Textes ab der
+Cursorposition durch den Ersatztext ersetzt, bis das Dateiende errreicht ist.
+
+Weitere Erklärungen zum Suchen und Ersetzen in 5.5.
+#page#
+
+Weitere Hilfen
+
+
+Textabschnitt an anderer Stelle der Datei einsetzen:
+
+- Abschnitt markieren und mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#d#off("i")##off("b")# zwischenspeichern.
+
+- Zweites Editorfenster auf die Datei mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#e#off("i")##off("b")# öffnen.
+
+- Nach #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# Zeilennummer oder Suchbegriff angeben und mit #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#g#off("i")##off("b")# Abschnitt an der gewünschte Stelle einsetzen.
+
+
+
+Textabschnitt schnell herauskopieren und sichern:
+
+- Gewünschten Abschnitt markieren
+
+- #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# PUT("dateiname") #on("i")##on("b")#CR#off("i")##off("b")#
+ Der Abschnitt wird in die Datei 'dateiname' geschrieben. Falls die Frage 'dateina­
+ me' löschen (j/n) verneint wird, wird der Abschnitt, an das Ende der Datei angefügt.
+ Dadurch können Textabschnitte schnell gesammelt werden.
+
+
+Komplette Datei in die editierte Datei einfügen:
+
+- #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# GET("dateiname") #on("i")##on("b")#CR#off("i")##off("b")#
+ Der komplette Inhalt von 'dateiname' wird an die aktuelle Position geschrieben.
+
+
+Breitere Zeile erzeugen:
+
+- #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# limit(123) #on("i")##on("b")#CR#off("i")##off("b")#
+ Die Zeilenbreite wird auf 123 Zeichen geändert. Der maximal zulässige Wert ist
+ 16000. Dieser Wert bezieht sich auf den Zeilenumbruch. Bei Zeilenbreite > 77 wird
+ nur die aktuelle Zeile verschoben. Um für den ganzen Bildschirm die rechte Seite
+ der Datei zu sehen, kann die linken Spalte des Bildschirmfenster neu gesetzt wer­
+ den:
+
+ #on("i")##on("b")#ESC#off("i")##off("b")# #on("i")##on("b")#ESC#off("i")##off("b")# margin(60) #on("i")##on("b")#CR#off("i")##off("b")#
+
+ Die Normaleinstellung wird durch 'limit(77)' und 'margin(1)' wiederhergestellt.
+
diff --git a/doc/programming/programmierhandbuch.4 b/doc/programming/programmierhandbuch.4
new file mode 100644
index 0000000..650d945
--- /dev/null
+++ b/doc/programming/programmierhandbuch.4
@@ -0,0 +1,1692 @@
+#headandbottom("1","EUMEL-Benutzerhandbuch","TEIL 4 : Kommandosprache","4")#
+#pagenr("%",1)##setcount(1)##block##pageblock#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#TEIL 4 : Kommandosprache
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+4 - % #right#GMD
+#end#
+#bottomodd#
+#center#____________________________________________________________
+GMD #right#4 - %
+#end#
+TEIL 4: Kommandosprache
+
+In Teil 4 sind diejenigen Kommandos beschrieben, die erfahrungsgemäß eher der
+Handhabung der Arbeitsumgebung zuzurechnen sind. Es ist den Verfassern bewußt,
+daß Auswahl und Zusammenstellung recht willkürlich sind, weil eine klare Abgrenzung
+zum Teil 5, welcher die Kommandos, die dem Thema: 'Programmierung' zugeordnet
+werden, nicht möglich ist.
+
+Der Teil 4 ist in die Themen:
+
+- 4.1. Supervisor-Kommandos
+
+- 4.2.1 Hilfs- und Informationsprozeduren
+
+- 4.2.2 Thesaurus
+
+- 4.2.3 Tasks
+
+- 4.2.4 Handhabung von Dateien
+
+- 4.2.5 Editor
+
+- 4.2.6 Dateitransfer
+
+- 4.2.7 Passwortschutz
+
+- 4.2.8 Archiv
+
+gegliedert. Insbesondere zu 4.2.4 ist anzumerken, daß nur Kommandos, die ganze
+Dateien betreffen hier erläutert sind. Kommandos, die Dateiinhalte betreffen (Suchen,
+Ersetzen etc.) sind in 3.5, bzw. 5.3 beschrieben.
+#page#
+
+4.1 Supervisor
+
+Es gibt genau sieben vom Supervisor akzeptierte Kommandos. Diese Kommandos
+können gegeben werden wenn nach dem Einschalten des Geräts oder dem Abkoppeln
+einer Task die SV-Taste gedrückt wurde und die sogenannte EUMEL-Tapete
+erscheint.
+
+____________________________________________________________________________
+
+ Terminal 2
+
+
+ EUMEL Version 1.8.1/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
+
+____________________________________________________________________________
+
+
+
+
+Desweiteren kann <SV> in einer Task gedrückt werden, um durch <ESC> <h> einen
+Programmabbruch einzuleiten.
+
+Im Gegensatz zu den im weiteren beschriebenen, durch ELAN Prozeduren realisierten
+Kommandos, sind diese Supervisor-Kommandos nicht als Prozeduren im System und
+mithin nicht durch 'help (...)' anzeigbar.
+#page#
+'begin'
+ #on("b")#PROC begin (TEXT CONST taskname) #off("b")#
+ Richtet eine neue Task als Sohn von PUBLIC ein.
+
+
+ #on("b")#PROC begin (TEXT CONST taskname, vatertask) #off("b")#
+ Richtet eine neue Task als Sohn der Task 'vatertask' ein, falls die Vater-Task
+ eine Manager-Task ist. Falls diese Task keinen Managerstatus besitzt, passiert
+ nichts! In diesem Falle muß das Kommando durch <SV> abgebrochen werden.
+
+
+ FEHLER : "taskname" existiert bereits
+ "vatertask" gibt es nicht
+
+
+
+
+'continue'
+ #on("b")#PROC continue (TEXT CONST taskname) #off("b")#
+ Eine existierende Task wird an das Terminal des Benutzers angekoppelt.
+
+ FEHLER : "taskname" gibt es nicht
+
+
+ Falls 'begin' oder 'continue' trotz korrekter Voraussetzungen kein Resultat zeigen,
+ 'hängt' die betroffene Task. Beim 'begin' Kommando kann das der Fall sein, falls
+ die Vater-Task nicht durch 'break' abgekoppelt wurde, sondern mit < SV > verlas­
+ sen wurde. In diesem Fall muß das Kommando durch <SV> abgebrochen werden,
+ die Vater-Task angekoppelt und mit <ESC> <q> korrekt abgekoppelt werden.
+#page#
+'break'
+ #on("b")#PROC break #off("b")#
+ Das Terminal wird vom Rechner abgekoppelt.
+
+
+
+'halt'
+ #on("b")#PROC halt #off("b")#
+ Das laufende Programm der dem Terminal aktuell zugeordneten Task wird abge­
+ brochen.
+
+ Falls in der an das Terminal gekoppelten Task ein laufendes Programm abgebro­
+ chen werden soll, muß zunächst durch <SV> der Supervisor aufgerufen werden.
+ Durch das Supervisor-Kommando 'halt' wird der Fehler 'halt from terminal'
+ induziert. Das Programm wird wie durch jeden anderen Fehler abgebrochen, falls
+ nicht 'disable stop' gesetzt wurde!
+
+
+
+#page#
+'storage info'
+ #on("b")#PROC storage info #off("b")#
+ Informationsprozedur über den belegten und den verfügbaren Hintergrund-Spei­
+ cher des gesamten Systems in KByte#u#1)#e#.
+
+#foot#
+
+ 1) Bei der derzeit aktuellen '+' Version EUMEL 1.8.1/M+ sind die beiden Anga­
+ ben mit 4 zu multiplizieren !
+#end#
+ Das Terminal wird unmittelbar abgekoppelt!
+
+
+
+'task info'
+ #on("b")#PROC task info #off("b")#
+ Informiert über alle Tasknamen im System unter gleichzeitiger Angabe der Vater/
+ Sohn-Beziehungen durch Einrückungen.
+
+
+
+
+'help'
+ #on("b")#PROC help #off("b")#
+ Kurzbeschreibung der SV-Kommandos.
+#page#
+
+4.2 Monitor
+
+Unter dem Stichwort Monitor-Kommandos sind an dieser Stelle Kommandos be­
+schrieben, die ständig zur Handhabung der Arbeitsumgebung benutzt werden.
+Gleichwohl sei sofort darauf hingewiesen, daß jedes ELAN Programm dem Monitor zur
+Ausführung übergeben werden kann. Es gibt also keine speziellen Monitor-
+Kommandos, sondern nur eine Reihe von Prozeduren (=Kommandos), die in dieser
+Umgebung erfahrungsgemäß besonders häufig benutzt werden.
+
+
+#on("u")#4.2.1 Hilfs- und Informationsprozeduren#off("u")#
+
+- Pakete, Prozeduren : packets, bulletin , help
+ Parameter
+
+- Tasksystem zeigen : task info , task status
+
+- Speicherplatz zeigen : storage , storage info
+
+
+#on("u")#4.2.2 Thesaurus #off("u")#
+
+- besondere Thesauri : ALL , all , SOME , remainder
+
+- Verknüpfung : + , - , /
+
+
+#on("u")#4.2.3 Taskoperationen#off("u")#
+
+- besondere Tasknamen : archive , brother , father , myself
+ printer , public , son , supervisor
+- Terminal abkoppeln : break
+- Task löschen : end
+- Manager-Task : global manager , free global manager
+- Umbenennen der Task : rename myself
+
+#page#
+#on("u")#4.2.4 Handhabung von Dateien #off("u")#
+
+ : copy , edit , forget , list , rename , show
+
+
+#on("u")#4.2.5 Editor #off("u")#
+
+- Editieren : edit , editget , show
+- Tastenbelegung : kommando auf taste (legen) ,
+ lernsequenz auf taste (legen) ,
+ std tastenbelegung ,
+ taste enthält kommando ,
+ word wrap
+
+
+#on("u")#4.2.6 Transfer #off("u")#
+
+- Datei holen : fetch , fetchall
+- Datei senden : save , saveall
+- Drucken : print
+- Datei löschen : erase
+
+
+#on("u")#4.2.7 Passwortschutz #off("u")#
+
+- 'begin' absichern : begin password
+- 'continue' absichern : task password
+- Dateien absichern : enter password
+- Systemzweig sichern : family password
+
+
+#on("u")#4.2.8 Das Archiv #off("u")#
+
+- Reservieren/freigeben : archive , release
+- Formatieren : format
+- Löschen : clear
+- Kontrollesen : check
+
+
+#page#
+
+4.2.1 Hilfsprozeduren
+
+Die drei Prozeduren listen ihre Ausgabe jeweils in eine temporäre Datei, die mit
+'show' (s. 4.2.5) gezeigt wird.
+
+
+'packets'
+ #on("b")#PROC packets #off("b")#
+ Auflisten der Namen aller insertierten Pakete in der Task.
+
+
+
+
+
+
+'bulletin'
+ #on("b")#PROC bulletin (TEXT CONST paket name) #off("b")#
+ Listen aller in der DEFINES-Liste des Pakets mit dem Namen "paket name"
+ enthaltenen Prozeduren.
+
+ FEHLER : ... ist kein Paketname
+
+
+ #on("b")#PROC bulletin #off("b")#
+ Es wird eine Liste aller bisher insertierten Objekte erstellt. Diese Liste ist paket­
+ weise sortiert. 'bulletin' zeigt also eine Liste #on("u")#aller#off("u")# Prozeduren an, die in der Task
+ benutzt werden können.
+#page#
+'help'
+ #on("b")#PROC help (TEXT CONST name) #off("b")#
+ Listen aller Prozeduren / Operatoren mit dem Namen "name". Der Name des
+ Packets in dessen Schnittstelle die Prozedur steht wird mit ausgegeben.
+
+ Falls es kein Objekt des erfragten Namens gibt, erfolgt die Ausgabe:
+
+ unbekannt "name".
+
+ Beispiel:
+____________________________________________________________________________
+
+ gib kommando :
+ help("save")
+
+____________________________________________________________________________
+
+
+ liefert:
+
+____________________________________________________________________________
+
+PACKET nameset:
+
+ save........... (THESAURUS CONST, TASK CONST)
+ save........... (THESAURUS CONST)
+
+PACKET globalmanager:
+
+ save........... (DATASPACE CONST, TEXT CONST, TASK CONST)
+ save........... (TEXT CONST, TASK CONST)
+ save........... (TEXT CONST)
+ save...........
+
+____________________________________________________________________________
+
+
+
+ Desweiteren kann auch nach Prozedurnamen gesucht werden, die nur annähernd
+ bekannt sind, indem ein Suchmuster spezifiziert wird. Das Suchmuster besteht aus
+ dem bekannten Teil des Namens und dem Operator '*', der vor und/oder nach
+ dem Suchbegriff gesetzt werden kann. '*' bezeichnet eine beliebige (auch leere)
+ Zeichenkette.
+
+ Beispiel: Gesucht werden die verschiedenen 'info' Prozeduren:
+
+____________________________________________________________________________
+ gib kommando :
+ help("*info*")
+
+____________________________________________________________________________
+
+
+
+____________________________________________________________________________
+
+ taskinfo....... (INT CONST, INT CONST)
+ taskinfo....... (INT CONST, FILE VAR)
+ taskinfo....... (INT CONST)
+ taskinfo.......
+ editinfo....... (FILE VAR, INT CONST)
+ editinfo....... (FILE CONST) --> INT
+ storageinfo....
+
+____________________________________________________________________________
+
+
+
+ Dieser Stern darf nicht mit dem 'joker' des 'Pattern Matching' verwechselt werden.
+ In der 'help' Prozedur darf '*' #on("u")#nicht#off("u")# in den Suchbegriff eingesetzt werden, sondern
+ nur an Wortanfang und -Ende gesetzt werden.
+
+
+#page#
+
+Informationsprozeduren
+
+'storage'
+ #on("b")#INT PROC storage (TASK CONST task) #off("b")#
+ Informationsprozedur über den logisch belegten Hintergrund-Speicher der Task.
+ (Angabe in KByte, bzw. 4KB Einheiten bei der '+'-Version)
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ put(storage(myself))
+ 1234
+
+ gib kommando :
+
+____________________________________________________________________________
+
+
+'storage info'
+ #on("b")#PROC storage info #off("b")#
+ Informationsprozedur über den belegten und den verfügbaren Hintergrund-Spei­
+ cher des gesamten Systems. Die Ausgabe erfolgt in KByte, bei der aktuellen
+ '+'-Version in 4 KByte Einheiten.
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ storage info
+ 1234K von 12000K
+
+ gib kommando :
+____________________________________________________________________________
+#page#
+
+'task info'
+ #on("b")#PROC task info #off("b")#
+ Informiert über alle Tasknamen im System unter gleichzeitiger Angabe der Vater/
+ Sohn-Beziehungen (Angabe durch Einrückungen).
+
+
+ #on("b")#PROC task info (INT CONST art) #off("b")#
+ Informiert über alle Tasks im System. Mit 'art' kann man die Art der Zusatz-
+ Information auswählen.
+
+ 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#u#1)#e#.
+ 5 i/o -blocked Task wartet auf I/O, ist aber blockiert.
+ 6 wait-blocked Task wartet auf Sendung, ist aber blockiert. Ach­
+ tung: Die Task wird beim Eintreffen einer Sendung
+ automatisch entblockiert.
+ > 6 dead
+
+ art=3: wie 2, aber zusätzlich wird der belegte Speicher angezeigt. (Achtung:
+ Prozedur ist zeitaufwendig!).
+
+#foot#
+
+1) Eine Blockierung kann von 'Scheduler' veranlaßt werden
+ (siehe Systemhandbuch)
+#end#
+
+#page#
+____________________________________________________________________________
+
+ gib kommando :
+ task info(2)
+
+____________________________________________________________________________
+
+
+
+ liefert:
+
+____________________________________________________________________________
+
+ ............................ ...............................
+ 15.05.87 10:39 CPU PRIO CHAN STATUS
+ SUPERVISOR.......................... 0000:19:47 0 - wait
+ -................................ 0000:07:54 0 - wait
+ SYSUR............................ 0000:34:02 0 - wait
+ shutup dialog................ 0000:05:26 0 - i/o
+ configurator................. 0000:04:17 0 - wait
+ OPERATOR..................... 0000:00:14 0 - i/o
+ ARCHIVE...................... 0000:10:33 0 31 wait
+ net.......................... 0006:41:56 0 - wait
+ net timer................ 0000:02:48 2 - i/o
+ net port................. 0000:40:23 0 7 wait
+ PRINTER...................... 0000:05:59 0 - wait
+ -........................ 0000:00:11 0 - wait
+ UR.................................. 0000:02:11 0 - wait
+ PUBLIC........................... 0002:02:03 0 - wait
+ task1........................ 0000:41:50 0 - -busy-
+ task2........................ 0000:03:10 0 - i/o
+ task3........................ 0000:57:28 0 1 -busy-
+
+____________________________________________________________________________
+
+
+#page#
+
+
+ #on("b")#PROC task info (INT CONST art, FILE VAR infodatei) #off("b")#
+ Wie oben, die Ausgabe wird jedoch in die Datei 'infodatei' geschrieben.
+
+____________________________________________________________________________
+
+ FILE VAR info := sequential file(output,"infodatei") ;
+ taskinfo(3, info);
+
+____________________________________________________________________________
+
+
+ #on("b")#PROC task info ( INT CONST art, stationsnr) #off("b")#
+ Ermöglicht im Netzbetrieb 'task info' über die Station mit der Nummer 'stationsnr'.
+
+____________________________________________________________________________
+
+ gib kommando :
+ taskinfo(1,12) ;
+
+____________________________________________________________________________
+#page#
+'task status'
+
+ #on("b")#PROC task status #off("b")#
+ Informationsprozedur über den Zustand der eigenen Task. Informiert ü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.
+
+ #on("b")#PROC task status (TASK CONST t) #off("b")#
+ Wie obige Prozedur, aber über die Task mit dem internen Tasknamen 't'.
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ task status (public)
+
+ 15.05.87 10:30 TASK: PUBLIC
+
+ Speicher: 1234K
+ CPU Zeit: 0011.12:23
+ Zustand : wait, (Prio 0), Kanal -
+
+____________________________________________________________________________
+#page#
+
+4.2.2 Thesaurus
+
+Ein #ib#Thesaurus#ie# ist ein #ib#Namensverzeichnis#ie#, das bis zu 200 Namen beinhalten kann.
+Dabei muß jeder Namen mindestens ein Zeichen und darf höchstens 100 Zeichen
+lang sein. Steuerzeichen (code < 32) in Namen werden umgesetzt (siehe 2.9.2).
+
+Thesauri werden unter anderem von der Dateiverwaltung benutzt, um das Dateiver­
+zeichnis einer Task zu führen.
+
+Man kann einen Thesaurus selbst erstellen, indem eine Datei z.B. mit Namen von
+Dateien gefüllt wird. Diese Datei kann dann als Thesaurus für weitere Aktionen die­
+nen.
+
+
+
+- Thesaurus liefern : ALL , all , SOME , remainder
+- Auswählen : LIKE
+- Verknüpfen : + , - , /
+
+
+
+#on("b")#ACHTUNG#off("b")# : Bei der Verwendung von Thesaurus Operationen in Verbindung mit
+'fetch', 'save' etc. ist zu beachten, daß mit 'SOME', 'ALL' und 'all' zunächst nur eine
+Auswahl aus einer Liste getroffen wird. Zusätzlich muß das Ziel oder die Quelle des
+Dateitransfers vereinbart werden.
+
+Ein beliebter Fehler ist z.B.: 'fetch (ALL archive)'.
+
+Hier ist nicht weiter spezifiziert, von wo Dateien geholt werden sollen - also werden
+sie von 'father' geholt! (s. 4.2.5)
+
+Falls die Dateien vom Archiv geholt werden sollen, ist das Archiv als Quelle zu be­
+nennen:
+
+Also : 'fetch (ALL archive, archive)' = Hole alle Dateien, die in dem Thesaurus von
+ 'archive' sind von der Task 'archive'.
+#page#
+'ALL'
+ THESAURUS OP ALL (TASK CONST task)
+ Liefert einen Thesaurus, der alle Dateinamen der angegebenen Task enthält.
+
+
+
+ #on("b")#THESAURUS OP ALL (TEXT CONST dateiname) #off("b")#
+ Liefert einen Thesaurus, der die in der angegebenen Datei vorhandenen Namen
+ (jede Zeile ein Name) enthält.
+
+
+
+
+'all'
+ #on("b")#THESAURUS PROC all #off("b")#
+ Liefert einen Thesaurus, der alle Dateinamen der eigenen Task enthält. Entspricht
+ 'ALL myself'.
+
+
+
+
+'SOME'
+ #on("b")#THESAURUS OP SOME (THESAURUS CONST thesaurus) #off("b")#
+ Bietet den angegebenen Thesaurus zum editieren an. Dort können nicht erwünsch­
+ te Namen gestrichen werden.
+
+
+
+ #on("b")#THESAURUS OP SOME (TASK CONST task) #off("b")#
+ Aufruf von: SOME ALL task.
+
+
+ #on("b")#THESAURUS OP SOME (TEXT CONST dateiname) #off("b")#
+ Aufruf von: SOME ALL dateiname.
+
+#page#
+'remainder'
+ #on("b")#PROC remainder #off("b")#
+ Liefert nach einem 'errorstop' die noch nicht bearbeiteten Dateien.
+
+____________________________________________________________________________
+
+ gib kommando :
+ save all (archive)
+
+ '"....." kann nicht geschrieben werden (Archiv voll)'
+
+____________________________________________________________________________
+
+
+
+ Nachdem man eine neue Floppy ins Archivlaufwerk gelegt hat, kann man mit
+
+
+____________________________________________________________________________
+ gib kommando :
+ save (remainder, archive)
+
+____________________________________________________________________________
+
+ den Rest der Dateien auf die nächste Floppy sichern.
+#page#
+'LIKE'
+ #on("b")#THESAURUS OP LIKE (THESAURUS CONST thesaurus, TEXT CONST muster) #off("b")#
+ Alle im Thesaurus enthaltenen Dateien, die dem 'muster' entsprechen sind im
+ Ergebnisthesaurus enthalten.
+
+ (Die Syntax von 'muster' ist bei der Beschreibung des Pattern-Matching (5.4)
+ beschrieben)
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ print (all LIKE "*.p")
+
+____________________________________________________________________________
+
+
+ Alle Dateien, deren Name mit '.p' endet, werden gedruckt.
+
+#page#
+'+'
+ #on("b")#THESAURUS OP + (THESAURUS CONST links, rechts) #off("b")#
+ Liefert die Vereinigungsmenge von 'links' und 'rechts'.
+ Achtung: Die Vereinigungsmenge enthält keine Namen mehrfach.
+
+ #on("b")#THESAURUS OP + (THESAURUS CONST links, TEXT CONST rechts)#off("b")#
+ Fügt dem Thesaurus 'rechts' zu, wenn 'rechts' noch nicht im Thesaurus enthal­
+ ten ist.
+
+
+
+
+'-'
+ #on("b")#THESAURUS OP - (THESAURUS CONST links, rechts) #off("b")#
+ Liefert die Differenzmenge. Achtung: Die Differenzmenge enthält keine Namen
+ mehrfach.
+
+ #on("b")#THESAURUS OP - (THESAURUS CONST links, TEXT CONST rechts)#off("b")#
+ Nimmt den Namen 'rechts' aus dem Thesaurus.
+
+____________________________________________________________________________
+
+ gib kommando :
+ fetch(ALL father - ALL myself)
+
+____________________________________________________________________________
+
+
+'/'
+ #on("b")#THESAURUS OP / (THESAURUS CONST links, rechts) #off("b")#
+ Liefert die Schnittmenge
+ Achtung: Die Schnittmenge enthält keine Namen mehrfach.
+
+
+#page#
+
+4.2.3 Tasks
+
+Zur Identifizierung von Tasks dienen sogenannte 'interne Taskbezeichner'. Ein solcher
+Taskbezeichner wird beim Einrichten einer neuen Task vergeben. Interne Taskbe­
+zeichner sind auch unter Berücksichtigung der Zeit eindeutig.
+
+Der Zugriff auf interne Taskbezeichner erfolgt über Prozeduren und Operatoren, die
+auf Objekte des Datentyps TASK (siehe 2.9.1) angewandt werden.
+
+Zusätzlich zum internen Tasknamen, der nicht auszugeben ist, haben Tasks meistens
+einen Namen#u#1) #e#.
+#foot#
+
+1) Unbenannte Tasks haben den Pseudonamen "-".
+#end#
+
+Aus Benutzersicht können benannte Tasks innerhalb eines Rechners vollständig und
+eindeutig über ihren Namen identifiziert werden.
+
+
+- Task liefern : / , task , niltask
+
+- Verwandtschaften : brother , father , myself , son
+
+- Ausgezeichnete Tasks : archive , printer , public , supervisor
+
+- Namen liefern : name
+
+- Tasknamen ändern : rename myself
+
+- Reservieren bes. Tasks : reserve
+
+#page#
+'/'
+ #on("b")#TASK OP / (TEXT CONST taskname) #off("b")#
+ Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene Katal­
+ og wird automatisch aktualisiert
+
+ (identisch mit der PROC task (TEXT CONST taskname).
+
+ FEHLER : "taskname" gibt es nicht
+
+
+ #on("b")#TASK OP / (INT CONST station number, TEXT CONST name) #off("b")#
+ Liefert im Netzbetrieb die Task des angegebenen Namen von der Station mit der
+ angegebenen Nummer.
+
+
+
+'niltask'
+ #on("b")#TASK CONST niltask #off("b")#
+ Bezeichner für "keine Task". So liefern die Prozeduren 'son', 'brother' und 'father'
+ als Resultat 'niltask', wenn keine Sohn-, Bruder- oder Vatertask existiert.
+
+
+
+'task'
+ #on("b")#TASK PROC task (TEXT CONST taskname) #off("b")#
+ Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene Katal­
+ og wird automatisch aktualisiert.
+
+ FEHLER : "taskname" gibt es nicht
+
+
+ #on("b")#TASK PROC task (INT CONST channel number) #off("b")#
+ Liefert den Namen der Task, die an dem angegebenen Kanal hängt.
+#page#
+'brother'
+ #on("b")#TASK PROC brother (TASK CONST task) #off("b")#
+ Liefert den nächsten Bruder von 'task'. Falls kein Bruder existiert, wird 'niltask'
+ geliefert. Aktualisiert den eigenen Katalog nicht automatisch!
+
+
+
+'father'
+ #on("b")#TASK PROC father #off("b")#
+ Liefert die eigene Vatertask.
+
+
+ #on("b")#TASK PROC father (TASK CONST task) #off("b")#
+ Liefert den Vater von 'task'. Existiert kein Vater (z.B. bei UR), wird niltask gelie­
+ fert. Aktualisiert den eigenen Katalog nicht automatisch!
+
+
+
+'myself'
+ #on("b")#TASK PROC myself #off("b")#
+ Liefert eigenen Task-Bezeichner.
+
+
+
+'son'
+ #on("b")#TASK PROC son (TASK CONST task) #off("b")#
+ Liefert den ersten Sohn von 'task'. Falls keiner im Katalog vermerkt ist, wird
+ 'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automatisch!
+
+
+#page#
+'archive'
+ #on("b")#TASK PROC archive #off("b")#
+ Liefert den internen Taskbezeichner der aktuellen Task mit Namen ARCHIVE.
+ Diese Prozedur dient zum schnellen und bequemen Ansprechen der Archivtask.
+
+
+
+'printer'
+ #on("b")#TASK PROC printer #off("b")#
+ Liefert den internen Taskbezeichner der aktuellen Task mit Namen #ib#PRINTER#ie#.
+ Diese Prozedur dient zum schnellen und bequemen Ansprechen des Druckspoo­
+ lers.
+
+
+'public'
+ #on("b")#TASK PROC public #off("b")#
+ Liefert den internen Taskbezeichner der Task #ib#PUBLIC#ie#.
+
+
+
+
+'supervisor'
+ #on("b")#TASK PROC supervisor #off("b")#
+ Liefert den internen Taskbezeichner des Supervisors.
+
+
+#page#
+'name'
+ #on("b")#TEXT PROC name (TASK CONST task) #off("b")#
+ Liefert den Namen von 'task'. Die Task muß noch im System existieren, sonst ist
+ der Name nicht mehr bekannt. Falls die 'task' noch nicht im eigenen Katalog
+ enthalten ist, wird er aktualisiert.
+
+
+
+'rename myself'
+ #on("b")#PROC rename myself (TEXT CONST neuer name) #off("b")#
+ Name der eigenen Task wird in 'neuer name' geändert. Wirkt wie Löschung und
+ Wiedereinrichten der Task in Bezug auf alle TASK VAR's die sich auf diese Task
+ beziehen.
+
+ FEHLER : Task existiert bereits
+ Name unzulässig
+ => anderen Namen wählen
+
+
+
+'reserve'
+ #on("b")#PROC reserve (TASK CONST task) #off("b")#
+ Reservieren einer Task für den ausschließlichen Dialog mit der Task, in der das
+ Kommando gegeben wurde.
+
+ #on("b")#PROC reserve (TEXT CONST message, TASK CONST task) #off("b")#
+ Wie 'reserve (TASK CONST task)' mit Übergabe einer 'message'.
+
+
+ Die reservierte Task muß ein spezieller Manager, (z.B. /"DOS" aus dem Werkzeug
+ MS-DOS-DAT) sein !
+#page#
+
+4.2.4 Handhabung von Dateien
+
+'copy'
+ #on("b")#PROC copy (TEXT CONST quelle, ziel) #off("b")#
+ Kopiert die Datei 'quelle' in eine neue Datei mit dem Namen 'ziel' in der Benut­
+ zer-Task.
+
+ FEHLER : "ziel" existiert bereits
+ "quelle" gibt es nicht
+ zu viele Dateien
+
+
+
+'forget'
+ #on("b")#PROC forget (TEXT CONST dateiname) #off("b")#
+ Löschen einer Datei mit dem Namen 'dateiname' in der Benutzer-Task.
+
+ FEHLER : "datei" gibt es nicht
+
+
+ #on("b")#PROC forget (THESAURUS CONST thesaurus) #off("b")#
+ Löscht die im 'thesaurus' enthaltenen Dateien in der Benutzer-Task.
+
+ Im Dialog erfolgt vor dem Löschen einer Datei standardmäßig die Abfrage:
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ forget("einedatei")
+ "einedatei" löschen(j/n) ?
+
+____________________________________________________________________________
+
+#page#
+'list'
+ #on("b")#PROC list #off("b")#
+ Listet alle Dateien der Benutzer-Task mit Namen und Datum des letzten Zugriffs
+ auf dem Terminal auf.
+
+
+ #on("b")#PROC list (TASK CONST task) #off("b")#
+ Listet alle Dateien der angegebenen 'task' mit Namen und Datum der letzten
+ Änderung auf dem Terminal auf. Die Task muß Manager sein.
+
+
+ #on("b")#PROC list (FILE VAR liste) #off("b")#
+ Listet alle Dateinamen in die Datei 'liste', die mit 'output'(s. 5.3.5) assoziiert sein
+ muß.
+
+
+ #on("b")#PROC list (FILE VAR liste, TASK CONST manager) #off("b")#
+ Listet alle Dateien der Task 'manager' mit Namen und Datum der letzten Ände­
+ rung in die Datei 'liste'.
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ FILE VAR f:= sequential file (output,"list");list(f,archive)
+
+____________________________________________________________________________
+
+#page#
+'rename'
+ #on("b")#PROC rename (TEXT CONST altername, neuername) #off("b")#
+ Umbenennen einer Datei von 'altername' in 'neuername'.
+
+
+
+ FEHLER : "neuername" gibt es bereits
+ "altername" gibt es nicht
+#page#
+
+4.2.5 Editor-Prozeduren
+
+'edit'
+ #on("b")#PROC edit (TEXT CONST dateiname) #off("b")#
+ Ruft den Editor mit 'dateiname' auf.
+
+
+ #on("b")#PROC edit #off("b")#
+ 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 Bild­
+ schirm ein. Bei erneutem 'edit'-Aufruf wird ein Fenster nach rechts unten ab der
+ aktuellen Cursor-Position eröffnet.
+
+
+ #on("b")#PROC edit (THESAURUS CONST t) #off("b")#
+ Editieren aller in dem Thesaurus 't' enthaltenen Dateien nacheinander.
+
+
+ Weitere 'edit-Prozeduren', die z.B. Variation der Fenstergröße etc. zulassen, sind
+ in 5.4.6 beschrieben.
+
+#page#
+'editget'
+ #on("b")#PROC editget (TEXT VAR editsatz) #off("b")#
+ Ausgabe einer (Kommando)zeile, in der Editorfunktionen zur Verfügung
+ stehen siehe Teil 5.5.1.4.
+
+
+
+'show'
+ #on("b")#PROC show (TEXT CONST dateiname) #off("b")#
+ Die Datei wird am Bildschirm gezeigt. Positionierung und Suchen funktionieren wie
+ in 'edit', Aktionen die Änderungen in der Datei bewirken würden, werden nicht
+ angenommen.
+
+
+
+ #on("b")#PROC show #off("b")#
+ 'show' auf der zuletzt bearbeiteten Datei.
+
+#page#
+'kommando auf taste legen'
+ #on("b")#PROC kommando auf taste legen (TEXT CONST taste, elan programm)#off("b")#
+ Die Taste 'taste' wird mit dem angegebenen ELAN-Programm belegt. Durch <ESC>
+ <taste> wird das Programm direkt ausgeführt.
+
+____________________________________________________________________________
+
+ gib kommando :
+ kommando auf taste legen ("a","fetch (SOME archive,archive)")
+
+____________________________________________________________________________
+
+
+
+'kommando auf taste'
+ #on("b")#TEXT PROC kommando auf taste (TEXT CONST taste)#off("b")#
+ Falls 'taste' mit einem ELAN-Programm belegt ist, liefert die Prozedur den
+ Programmtext, andernfalls den leeren Text niltext.
+
+____________________________________________________________________________
+
+ gib kommando :
+ put (kommando auf taste("f"))
+
+____________________________________________________________________________
+
+
+
+'taste enthaelt kommando'
+ #on("b")#BOOL PROC taste enthaelt kommando (TEXT CONST taste)#off("b")#
+ Liefert TRUE falls 'taste' mit einem ELAN-Programm belegt ist.
+
+
+'lernsequenz auf taste legen'
+ #on("b")#PROC lernsequenz auf taste legen (TEXT CONST taste, sequenz)#off("b")#
+ 'taste' wird mit der Zeichenfolge 'sequenz' belegt. Durch <ESC> <taste> wird die
+ Zeichenfolge an der aktuellen Position ausgegeben.
+
+ Als Zeichenfolge sind natürlich auch einzelne Zeichen und EUMEL-Codes zuläs­
+ sig.
+
+ Die vom System vorbelegten Tasten sind in 3.4 'Zeichen schreiben' aufgelistet.
+
+____________________________________________________________________________
+
+ gib kommando :
+ lernsequenz auf taste legen ("x","gib kommando :"13""2""2"")
+
+____________________________________________________________________________
+
+
+
+'lernsequenz auf taste'
+ #on("b")#TEXT PROC lernsequenz auf taste (TEXT CONST taste) #off("b")#
+ Liefert die auf 'taste' gelegte Zeichenfolge.
+
+
+'std tastenbelegung'
+ #on("b")#PROC std tastenbelegung #off("b")#
+ Die Standard-Tastenbelegung (s.3.4) wird (wieder) hergestellt.
+
+
+'word wrap'
+ #on("b")#PROC word wrap (BOOL CONST b) #off("b")#
+ Der automatische Zeilenumbruch wird durch 'word wrap (FALSE)' aus- und durch
+ 'word wrap (TRUE)' eingeschaltet. Wird diese Prozedur während des Editierens
+ aufgerufen, gilt die Einstellung für die aktuelle Textdatei. Wird die Prozedur als
+ Monitor-Kommando gegeben, so gilt die Eingabe als Voreinstellung für neue
+ Dateien.
+#page#
+
+4.2.6 Dateitransfer
+
+Unter diesem Abschnitt sind diejenigen Prozeduren beschrieben, die der simplen
+Kommunikation mit Manager-Tasks dienen: Holen oder Senden einer Dateikopie,
+Löschen in der Manager-Task.
+
+#on("b")#ACHTUNG : Für alle Prozeduren gilt: falls die Manager-Task nicht existiert, wird eine
+Fehlermeldung erzeugt, existiert eine Task des angegebenen Namens, die aber nicht
+Managertask ist, so terminieren die Prozeduren nicht!
+#off("b")#
+
+
+'fetch'
+ #on("b")#PROC fetch (TEXT CONST dateiname, TASK CONST manager) #off("b")#
+ Kopiert die Datei 'dateiname' aus der Task 'manager'
+
+
+ #on("b")#PROC fetch (THESAURUS CONST th, TASK CONST manager) #off("b")#
+ Kopiert alle Dateien, deren Namen im Thesaurus th enthalten sind, aus der Task
+ 'manager'.
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ fetch(ALL(12/"PUBLIC"), 12/"PUBLIC")
+
+____________________________________________________________________________
+
+
+
+ Mit diesem Kommando werden (in einem EUMEL Netz) alle Dateien der Task
+ 'PUBLIC' des Rechners mit der Stationsnummer 12 in diesem Netz kopiert.
+
+#page#
+____________________________________________________________________________
+
+ gib kommando :
+ fetch(SOME archive , archive)
+
+____________________________________________________________________________
+
+
+
+ Bietet den Thesaurus von 'ARCHIVE' an, nach Auswahl werden alle Dateien deren
+ Namen nicht gelöscht wurden, von der Diskette kopiert.
+
+
+ #on("b")#PROC fetch (TEXT CONST dateiname) #off("b")#
+ Kopiert die Datei 'dateiname' aus der Task 'father'
+
+
+ #on("b")#PROC fetch (THESAURUS CONST th) #off("b")#
+ Kopiert alle Dateien, deren Namen in 'th' sind aus der Task 'father'.
+
+
+
+'fetchall'
+
+ #on("b")#PROC fetchall #off("b")#
+ entspricht: fetch (ALL father, father)
+
+
+ #on("b")#PROC fetchall (TASK CONST manager)#off("b")#
+ entspricht: fetch(ALL manager, manager)
+
+#page#
+'save'
+ #on("b")#PROC save (TEXT CONST dateiname, TASK CONST manager) #off("b")#
+ Kopiert die Datei 'dateiname' in die Task 'manager'
+
+
+ #on("b")#PROC save (THESAURUS CONST th, TASK CONST manager) #off("b")#
+ Kopiert alle Dateien, deren Namen im Thesaurus th enthalten sind, in die Task
+ 'manager'.
+
+____________________________________________________________________________
+
+ gib kommando :
+ save(all, (12/"PUBLIC"))
+
+____________________________________________________________________________
+
+
+ Mit diesem Kommando werden (in einem EUMEL Netz) alle Dateien der eigenen
+ Task in die Task 'PUBLIC' des Rechners mit der Stationsnummer 12 in diesem
+ Netz kopiert.
+
+____________________________________________________________________________
+
+ gib kommando :
+ save(SOME myself, manager)
+
+____________________________________________________________________________
+
+
+ Bietet den eigenen Thesaurus an, nach Auswahl werden alle Dateien deren
+ Namen nicht gelöscht wurden, zur Task 'manager' kopiert.
+
+
+ #on("b")#PROC save (TEXT CONST dateiname) #off("b")#
+ Kopiert die Datei 'dateiname' in die Task 'father'
+
+
+ #on("b")#PROC save (THESAURUS CONST th) #off("b")#
+ Kopiert alle Dateien, deren Namen in 'th' enthalten sind, in die Task 'father'.
+
+
+ #on("b")#PROC save #off("b")#
+ Kopiert die zuletzt bearbeitete Datei in die Task 'father'
+
+
+
+
+'saveall'
+ #on("b")#PROC saveall #off("b")#
+ entspricht: save (all, father)
+
+
+ #on("b")#PROC saveall (TASK CONST manager) #off("b")#
+ entspricht: save (ALL myself, manager)
+
+#page#
+'erase'
+ #on("b")#PROC erase (TEXT CONST dateiname, TASK CONST manager) #off("b")#
+ Löscht die Datei 'dateiname' aus der Task 'manager'
+
+
+ #on("b")#PROC erase (THESAURUS CONST th, TASK CONST manager) #off("b")#
+ Löscht alle Dateien, deren Namen im Thesaurus th enthalten sind, aus der Task
+ 'manager'.
+
+
+ #on("b")#PROC erase (TEXT CONST dateiname) #off("b")#
+ Löscht die Datei 'dateiname' aus der Task 'father'
+
+
+ #on("b")#PROC erase (THESAURUS CONST th) #off("b")#
+ Löscht alle Dateien, deren Namen in 'th' sind, aus der Task 'father'
+
+
+ #on("b")#PROC erase #off("b")#
+ Löscht die zuletzt bearbeitete Datei aus der Task 'father'
+
+
+#page#
+'print'
+ Das Kommando 'print' beinhaltet den Auftrag an die Task 'PRINTER' die enthal­
+ tene(n) Datei(en) auszudrucken.
+
+ Voraussetzung ist natürlich, daß die Druckersoftware ordnungsgemäß benutzt
+ wurde, um 'PRINTER' einzurichten. Siehe dazu Systemhandbuch Teil 6.
+
+
+ #on("b")#PROC print (TEXT CONST dateiname) #off("b")#
+ Kopiert die Datei 'dateiname' in die Task 'PRINTER'.
+
+
+ #on("b")#PROC print (THESAURUS CONST th) #off("b")#
+ Kopiert alle Dateien, deren Namen im Thesaurus 'th' enthalten sind, in die Task
+ 'PRINTER'.
+
+
+ #on("b")#PROC print #off("b")#
+ Kopiert die zuletzt bearbeitete Datei in die Task 'PRINTER'.
+
+
+#page#
+
+4.2.7 Passwortschutz
+
+Der Passwortschutz im EUMEL-System ist in verschiedener Ausprägung möglich.
+Einfachste Möglichkeit ist der Schutz einer Task durch ein Passwort. Falls diese Task
+nicht Manager ist, können alle Daten und Programme, die nur in dieser Task zur
+Verfügung stehen, auch nur vom Besitzer der Task benutzt werden.
+
+Ähnlich kann auch von einer Manager-Task aus der gesamte Zweig unterhalb dieser
+Task mit einem Passwort geschützt werden: beispielsweise kann es empfehlenswert
+sein, den Systemzweig komplett zu schützen, indem in SYSUR ein entsprechendes
+Passwort vereinbart wird.
+
+Ein Umgehen des Passwortschutzes bei Manager-Tasks (durch Einrichten einer
+Sohn-Task und 'fetchall') wird durch ein 'begin password' verhindert.
+
+Auch einzelne Dateien lassen sich schützen, indem Lese/Schreibpasswörter für den
+Dateitransfer vereinbart werden.
+
+Generell gilt für die Verwendung von Passworten:
+
+- Passworte, die zu naheliegend gewählt sind (Vorname des Lebenspartners o.ä.)
+ sind meistens sinnlos, falls wirklich Datenschutz bezweckt ist.
+
+- Passworte, die so raffiniert sind, daß sogar ihr Schöpfer sie vergißt, führen zu
+ 100%igem Datenverlust, da die betroffene Task oder Datei nur noch gelöscht
+ werden kann.
+
+- Die Vereinbarung von "-" als Passwort bewirkt, daß die entsprechende Aktion
+ nicht mehr durchgeführt werden kann. Wird z.B. '-' als 'task password'
+ eingegeben, so kann die Task nie wieder an ein Terminal gekoppelt werden.
+
+- Passwörter können geändert werden, indem das entsprechende Kommando noch
+ einmal mit dem neuen Passwort gegeben wird.
+
+#page#
+'begin password'
+
+ #on("b")#PROC begin password (TEXT CONST passwort) #off("b")#
+
+ Auf Supervisor-Ebene wird vor Einrichten einer neuen Task als Sohn der Task in
+ der das 'begin password' gegeben wurde, dieses erfragt.
+
+ Das Password vererbt sich auf die hinzukommenden Sohn-Tasks.
+
+____________________________________________________________________________
+
+ #on("b")#SYSUR#off("b")#
+ maintenance :
+ begin password ("alles dicht")
+
+____________________________________________________________________________
+
+
+bewirkt:
+
+____________________________________________________________________________
+
+ Terminal 2
+
+
+ EUMEL Version 1.8.1/M
+
+
+ gib supervisor kommando:
+ begin ("sabotage","SYSUR")
+ Passwort:
+
+
+ ESC ? --> help
+ ESC b --> begin("") ESC h --> halt
+ ESC c --> continue("") ESC s --> storage info
+ ESC q --> break ESC t --> task info
+
+
+____________________________________________________________________________
+
+
+#page#
+'enter password'
+ #on("b")#PROC enter password (TEXT CONST datei, schreibpass, lesepass)
+ #off("b")#
+ Hiermit können ausgewählte Dateien einer Manager-Task geschützt werden. Die
+ angegebene Datei wird mit Schreib- und Lesepassword versehen. Die Pass­
+ wörter werden in der eigenen Task nicht berücksichtigt.
+
+ Bei einem lesenden Zugriff (fetch) von irgendeiner Task aus auf die entsprechende
+ Datei in der Manager-Task muß das Lesepasswort, bei schreibendem Zugriff
+ (save/erase) das Schreibpasswort vereinbart sein.
+
+
+____________________________________________________________________________
+
+ maintenance :
+ enter password ("wichtige datei","sicher","heit")
+
+____________________________________________________________________________
+
+
+
+
+ #on("b")#PROC enter password (TEXT CONST password) #off("b")#
+ Passwort für den Dateitransfer einstellen. Falls zwei verschiedene Passwörter für
+ Lesen und Schreiben vereinbart werden sollen, so sind sie als ein Text durch "/"
+ getrennt einzugeben.
+
+____________________________________________________________________________
+
+ gib kommando :
+ enter password ("sicher/heit")
+
+ gib kommando :
+ save(SOME all)
+
+____________________________________________________________________________
+#page#
+'family password'
+ #on("b")#PROC family password (TEXT CONST geheim) #off("b")#
+ Einstellen eines Passworts für den Zweig des Systems , der unterhalb der (Mana­
+ ger) Task liegt, in der das 'family password' eingegeben wurde. Dabei erhalten
+ alle Tasks, die kein Password oder dasselbe wie diese Manager-Task haben, das
+ 'family password'. Tasks in dem Zweig, die ein eigenes anderes besitzen, behal­
+ ten dieses.
+
+____________________________________________________________________________
+
+ PUBLIC
+
+ Task1 ""
+
+ Task2 family password("fingerweg")
+ Task21 geheim
+ Task22 ""
+
+ Task3 ""
+ Task31 ""
+
+____________________________________________________________________________
+
+
+
+
+bewirkt:
+
+____________________________________________________________________________
+ PUBLIC
+
+ Task1 ""
+
+ Task2 fingerweg
+ Task21 geheim
+ Task22 fingerweg
+
+ Task3 ""
+ Task31 ""
+
+____________________________________________________________________________
+
+
+#page#
+
+'task password'
+
+ #on("b")#PROC task password (TEXT CONST geheim) #off("b")#
+ Einstellen eines Passworts für die Task in der es gegeben wird. Ist eine Task mit
+ einem Passwort geschützt, so wird durch den Supervisor nach dem 'continue'-
+ Kommando das Passwort angefragt (Entsprechend dem 'begin password'). 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 personenbe­
+ zogene Daten zu schützen.
+
+#page#
+
+4.2.8 Das Archiv
+
+Mit dem Terminus 'Archiv' wird beim EUMEL-System ein Diskettenlaufwerk bezeich­
+net, das nur Datensicherungsaufgaben dient. Falls ein Rechner eins von zwei vorhan­
+denen Diskettenlaufwerk als Arbeitsspeicher benutzt, so wird dieses als Hintergrund
+bezeichnet. Falls Sie einen derartigen Rechner benutzen, können Sie der Installa­
+tionsanleitung entnehmen, welches Laufwerk welcher Aufgabe zugeordnet ist.
+
+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.
+
+- reservieren : archive
+
+- freigeben : release
+
+- löschen : clear , format
+
+- prüfen : check
+
+#page#
+'archive'
+ #on("b")#PROC archive (TEXT CONST archivname) #off("b")#
+ Reservierung der Task ARCHIVE für den exklusiven Dialog mit der aufrufenden
+ Task. 'archivname' wird bei allen folgenden Archivoperationen mit dem der Disket­
+ te zugewiesenen (und hoffentlich auf dem Aufkleber vermerkten) Namen abgegli­
+ chen.
+
+
+
+'release'
+ #on("b")#PROC release (TASK CONST archive) #off("b")#
+ Nach diesem Kommando kann die Task 'ARCHIVE' mit ihren Leistungen von einer
+ anderen Task in Anspruch genommen werden. Falls dieses Kommando nicht
+ gegeben wird, aber seit 5 Minuten kein Dialog mit 'archive' stattfand, kann eine
+ andere Task durch die Anforderung 'archive("diskettenname")' das Archiv reser­
+ vieren. Durch diese Maßnahme wird verhindert, daß ein vergeßlicher Benutzer bei
+ einem System mit mehreren Benutzern das Archiv blockiert.
+
+#page#
+
+'clear'
+ #on("b")#PROC clear (TASK CONST archive) #off("b")#
+ Löschen des Disketten-Inhaltsverzeichnisses und Zuweisung des in der Reservie­
+ rung eingegebenen Namens.
+
+____________________________________________________________________________
+
+ gib kommando :
+ archive("name"); #ib#clear#ie# (archive)
+
+____________________________________________________________________________
+
+
+ Durch die Ausführung des Kommandos erhält die eingelegte Diskette den in der
+ Reservierung angegebenen Namen. #on("b")#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#off("b")#. Die Diskette entspricht einer neu
+ formatierten Diskette#u#1)#e#.
+
+ Man kann also eine beschriebene Diskette nicht umbenennen, ohne die darauf
+ befindlichen Daten zu löschen.
+
+ #foot#
+
+ #u#1)#e# Das Kommando 'format' enthält implizit 'clear'.
+#end#
+
+ Eine Neuformatierung ist demnach bei Wiederverwendung der Diskette nicht
+ notwendig.
+
+#page#
+'format'
+ #on("b")#PROC format (TASK CONST archive) #off("b")#
+ Formatieren einer Diskette. Vor der erstmaligen Benutzung einer Archivdiskette
+ muß diese formatiert, d.h. in Spuren und Sektoren für die Positionierung des
+ Schreib-/Lesekopfes des Diskettenlaufwerks eingeteilt werden, um überhaupt ein
+ Beschreiben der Diskette zu ermöglichen. Die Einteilung ist geräteabhängig, häufi­
+ ge 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 Ar­
+ chivs das Kommando:
+
+____________________________________________________________________________
+
+ gib kommando :
+ archive("diskname");
+
+ gib kommando :
+ format (archive);
+
+____________________________________________________________________________
+
+
+Erst nach einer Kontrollabfrage:
+
+____________________________________________________________________________
+
+ gib kommando:
+ format (archive)
+
+ Archiv "diskname" formatieren ? (j/n)
+
+____________________________________________________________________________
+
+
+
+ wird tatsächlich formatiert und die Diskette steht mit dem Namen "diskname" für
+ Archivoperationen zur Verfügung.
+
+#page#
+
+ #on("b")#PROC format (INT CONST code, TASK CONST archive) #off("b")#
+ Bei einigen Rechnern ist es möglich, die Formatierung zu variieren. Falls beim
+ Formatieren auf einem solchen Rechner ein anderes als das Standardformat
+ erzeugt werden soll, so ist die Codierung des gewünschten Formats mitanzuge­
+ ben.
+
+
+ Beispiel: Für ein Gerät mit 5,25 Zoll Disketten wäre z.B. einstellbar:
+ code 0 : Standardformat
+ code 1 : 2D , 40 Spuren , 9 Sektoren
+ code 2 : 2D , 80 Spuren , 9 Sektoren
+ code 3 : HD , 80 Spuren ,15 Sektoren
+
+ 'format (archive)' erzeugt ebenso wie 'format (0,archive)' eine
+ standardformatierte Diskette, 'format (3,archive)' erzeugt eine High
+ Density Formatierung (HD Floppy benutzen!).
+
+#on("b")#
+ ACHTUNG: Wird eine bereits beschriebene Diskette noch einmal formatiert, so
+ sind alle Daten, die auf der Diskette waren, verloren.
+
+ Die Umformatierung einer Diskette (z.B. von 720K auf 360K) auf
+ unterschiedlichen Laufwerken kann zu Problemen führen.
+#off("b")#
+#page#
+'check'
+ #on("b")#PROC check (TEXT CONST dateiname, TASK CONST task) #off("b")#
+ Überprüft, ob die Datei 'dateiname' auf dem Archiv lesbar ist.
+
+
+ #on("b")#PROC check (THESAURUS CONST t, TASK CONST task) #off("b")#
+ Überprüft, ob die in dem Thesaurus 't' enthaltenen Dateien auf dem Archiv lesbar
+ sind.
+
+
+ Mit diesem Kommando kann nach dem Beschreiben einer Diskette überprüft wer­
+ den, ob die Datei(en) lesbar sind. Hierdurch können also verschmutzte oder
+ beschädigte Disketten erkannt werden.
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ save (all , archive)
+
+ gib kommando :
+ check (ALL archive, archive)
+
+____________________________________________________________________________
+
+#page#
+
+Beispiel:
+
+
+____________________________________________________________________________
+
+ gib kommando :
+ archive ("neu")
+
+ gib kommando :
+ format (archive)
+
+____________________________________________________________________________
+
+
+liefert zunächst die Kontollfrage:
+
+____________________________________________________________________________
+
+ gib kommando :
+ format (archive)
+
+ Archiv "neu" formatieren ? (j/n)
+
+____________________________________________________________________________
+
+
+Nach Eingabe 'j'
+
+____________________________________________________________________________
+
+ gib kommando :
+ saveall (archive)
+
+ gib kommando :
+ archive("alt") (* nächste Diskette *)
+
+ gib kommando :
+ fetch(SOME archive ,archive)
+
+____________________________________________________________________________
+
+
+Der Thesaurus des Archivs wird angezeigt:
+#page#
+____________________________________________________________________________
+
+ .................alt (100 K belegt von 720 K)...............
+
+ 01.02.87 25 K "handbuch teil 1"
+ 01.03.87 23 K "handbuch teil 2"
+ 01.04.87 20 K "handbuch teil 3"
+ 01.05.87 32 K "handbuch teil 4"
+
+____________________________________________________________________________
+
+
+
+
+
+Zum Abschluß Archiv freigeben!
+____________________________________________________________________________
+
+ gib kommando :
+ release(archive)
+
+____________________________________________________________________________
+#page#
+
+Fehlermeldungen des Archivs
+Versucht man, eine Datei vom Archiv zu holen, kann es vorkommen, daß das Ar­
+chiv-System
+
+____________________________________________________________________________
+
+ gib kommando :
+ fetch ("datei", archive)
+ #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 ("datei mit Lese-Fehler", archive)
+
+____________________________________________________________________________
+
+
+
+Die Datei wird in diesem Fall trotz Lese-Fehler (Informationsverlust!) vom Archiv
+gelesen.
+#page#
+
+Weitere Fehlermeldungen des Archivs:
+
+
+FEHLER : Lesen unmöglich (Archiv)
+ Die Archiv-Diskette ist nicht eingelegt oder die Tür des Laufwerks ist nicht
+ geschlossen.
+ => Diskette einlegen bzw. Tür schließen.
+
+FEHLER : Schreiben unmöglich (Archiv)
+ Die Diskette ist schreibgeschützt.
+ => falls wirklich gewünscht, Schreibschutz entfernen.
+
+FEHLER : Archiv nicht angemeldet
+ Das Archiv wurde nicht angemeldet
+ => 'archive ("name")' geben.
+
+FEHLER : Lese-Fehler (Archiv)
+ Siehe Lesen unmöglich
+
+FEHLER : Schreibfehler (Archiv)
+ Die Diskette kann nicht (mehr) beschrieben werden.
+ => Andere Diskette verwenden.
+
+FEHLER : Speicherengpass
+ Im System ist nicht mehr genügend Platz, um eine Datei vom Archiv zu
+ laden.
+ => ggf. Dateien löschen.
+
+FEHLER : RERUN bei Archiv-Zugriff Das System wurde bei einer Archiv-Operation
+ durch Ausschalten bzw. Reset unterbrochen.
+
+FEHLER : "dateiname" gibt es nicht
+ Die Datei "dateiname" gibt es nicht auf dem Archiv.
+ => mit 'list(archive)' Archiv prüfen.
+
+FEHLER : Archiv heißt ...
+ Die eingelegte Diskette hat einen anderen als den eingegebenen Archivna­
+ men.
+ => Kommando 'archive' mit korrektem Namen geben.
+
+FEHLER : Archiv wird von Task ... benutzt
+ Das Archiv wurde von einem anderen Benutzer reserviert.
+ => Abwarten.
+
+FEHLER : "dateiname" kann nicht geschrieben werden (Archiv voll)
+ Die Datei ist zu groß für die eingelegte Diskette.
+ => Andere Diskette für diese Datei nehmen.
+
+FEHLER : Archiv inkonsistent
+ Die eingelegte Diskette hat nicht die Struktur einer Archiv-Diskette.
+ => 'format (archive)' vergessen.
+
+FEHLER : save/erase wegen Lese-Fehler verboten
+ Bei Archiven mit Lese-Fehler sind Schreiboperationen verboten, weil ein
+ Erfolg nicht garantiert werden kann.
+
diff --git a/doc/programming/programmierhandbuch.5 b/doc/programming/programmierhandbuch.5
new file mode 100644
index 0000000..a921572
--- /dev/null
+++ b/doc/programming/programmierhandbuch.5
@@ -0,0 +1,1329 @@
+#pagenr("%",1)##setcount(1)##block##pageblock#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#TEIL 5 : Programmierung
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+5 - % #right#GMD
+#end#
+#bottomodd#
+#center#____________________________________________________________
+GMD #right#5 - %
+#end#
+
+TEIL 5: Programmierung
+
+
+5.1 Der ELAN-Compiler
+
+Der ELAN-Compiler des EUMEL-Systems dient zweierlei Aufgaben: zum einen der
+Übersetzung von ELAN-Programmen, zum anderen der Verwaltung der taskeigenen
+Modulbibliothek.
+
+Diese Moduln, in ELAN Pakete (siehe 2.4.3.4ff.) genannt, stellen als vorübersetzte,
+und damit abrufbereite#u#1)#e# Prozeduren den Kommandovorrat einer Task dar.
+
+Der Codebereich einer Task liegt in ihrem Standarddatenraum (ds4). Die Größe dieses
+Codebereiches beträgt 256K. Der Inhalt besteht zunächst aus den von der Vatertask
+ererbten (durch Kopie des ds4 dieser Task) Moduln, im weiteren allen in dieser Task
+neu hinzu insertierten Packeten.
+#on("b")#
+
+
+ACHTUNG: Durch ständiges Neuinsertieren eines Packets kann der
+ Codebereich der betroffenen Task zum Überlaufen
+ gebracht werden!
+
+
+#foot#
+
+1) Die von anderen Systemen her gewohnten Phasen 'Binden' und 'Laden' sind
+ durch das EUMEL-ELAN-Compiler-Konzept unnötig.
+#end#
+Jedes Kommando im EUMEL-System ist der Aufruf einer, in der Schnittstelle eines
+bereits insertierten Packetes stehenden, Prozedur.
+
+Kommandos für den ELAN-Compiler:
+
+- Übersetzen : do , insert , run , runagain
+
+- Protokollieren : check , checkon/off ,
+ prot , protoff , warnings on/off
+
+
+#page#
+'do'
+ #on("b")#PROC do (TEXT CONST program)#off("b")#
+ Übersetzen und Ausführen von 'program' von einem Programm aus. 'program'
+ muß ein ausführbares ELAN Programm sein.
+
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+ PACKET reo DEFINES reorganize all:
+
+ PROC reorganize all(THESAURUS CONST thes):
+ do (PROC (TEXT CONST) reorganize ,thes)
+ (* Die Prozedur 'reorganize' (siehe 5-52), die einen*)
+ (* Dateinamen als Parameter verlangt, wird auf alle *)
+ (* Dateien des Thesaurus 'thes' angewandt. *)
+ END PROC reorganize all;
+ END PACKET reo;
+
+____________________________________________________________________________
+
+
+'insert'
+ #on("b")#PROC insert (TEXT CONST dateiname) #off("b")#
+ Insertieren eines oder mehrerer PACKETs aus der Datei 'dateiname'. Der Pro­
+ grammtext muß sich in #on("u")#einer#off("u")# Datei befinden.
+
+
+ #on("b")#PROC insert #off("b")#
+ Insertieren eines oder mehrerer PACKETs. Der Dateiname ist der zuletzt benutzte
+ Dateiname.
+
+
+ #on("b")#PROC insert (THESAURUS CONST t) #off("b")#
+ Insertieren aller PACKETs, die in den Dateien des Thesaurus 't' enthalten sind.
+
+
+#page#
+'run'
+ #on("b")#PROC run #off("b")#
+ Übersetzen und Ausführen eines ELAN-Programms. Der Programmtext muß sich
+ in einer Datei befinden. Der Dateiname ist der zuletzt benutzte Dateiname.
+
+
+ #on("b")#PROC run (TEXT CONST dateiname) #off("b")#
+ Wie oben. Der Programmtext wird aus der Datei mit dem Namen 'dateiname'
+ geholt.
+
+
+
+'runagain'
+ #on("b")#PROC runagain #off("b")#
+ Nochmaliges Ausführen des zuletzt mit 'run' übersetzten ELAN-Programms.
+ Wurde in der letzten Übersetzung ein Fehler gefunden, erfolgt die Meldung:
+
+ FEHLER : "run again nicht möglich"
+
+#page#
+'check'
+ #on("b")#BOOL PROC check #off("b")#
+ Informationsprozedur, die TRUE liefert, wenn 'check' eingeschaltet ist.
+
+ #on("b")#PROC check on #off("b")#
+ Einschalten der Generierung von Zeilennummern durch den ELAN-Compiler. Der
+ bei der Übersetzung erzeugte Code wird ca. 25% umfangreicher!
+ Voreinstellung im 'PUBLIC'- Zweig: 'check on'.
+
+ #on("b")#PROC check off #off("b")#
+ Ausschalten der Generierung von Zeilennummern durch den ELAN-Compiler.
+ Voreinstellung im 'SYSUR' - Zweig: 'check off.
+
+
+'prot'
+ #on("b")#BOOL PROC prot #off("b")#
+ Informationsprozedur, die TRUE liefert, gdw. 'prot' eingeschaltet ist.
+
+ #on("b")#PROC prot (TEXT CONST dateiname) #off("b")#
+ Einschalten des Compilerlistings auf dem Bildschirm. Das Listing wird gleichzeitig
+ in die Datei 'dateiname' geschrieben.
+
+ #on("b")#PROC prot off #off("b")#
+ Ausschalten des Listings.
+
+
+'warnings'
+ #on("b")#BOOL PROC warnings #off("b")#
+ Informationsprozedur, die TRUE liefert gdw. 'warnings' eingeschaltet ist.
+
+ #on("b")#PROC warnings on #off("b")#
+ Warnungen werden wie Fehlermeldungen ins Notizbuch ausgegeben.
+
+ #on("b")#PROC warnings off#off("b")#
+ Warnungen werden nicht mit in das Notizbuch ausgegeben.
+#page#
+
+5.1.1 Fehlermeldungen des ELAN-Compilers
+erfolgen stets in der Form:
+
+#ib#COMPILER ERROR#ie#: <zahl>
+
+wobei <zahl> folgende Werte annehmen kann:
+
+#on("bold")#<zahl> Bedeutung und eventuelle Abhilfe#off ("bold")#:
+
+ 101 Überlauf der Namenstabelle
+ Die Anzahl der Namen aller sichtbaren Pakete ist zu groß oder es wurden
+ die Anführungstriche eines TEXT-Denoters vergessen.
+ => Keine Abhilfe.
+
+ 102 Überlauf der Symboltabelle
+ Die Anzahl der deklarierten Objekte ist zu groß.
+ => Programm in Pakete unterteilen.
+
+ 103 Überlauf des Zwischencodebereiches
+ => Programm in Pakete unterteilen.
+
+ 104 Überlauf der Permanenttabelle
+ Zu viele Pakete insertiert.
+ => Keine (neue Task beginnen).
+
+ 106 Paketdatenadresse zu groß
+ Im Paket wird zuviel Platz ( > 64K ) von globalen Datenobjekten und
+ Denotern eingenommen.
+ => Keine Abhilfe.
+
+ 107 Lokale Datenadresse zu groß
+ Im Paket wird zuviel Platz ( > 32K ) von lokalen Datenobjekten belegt.
+ => Keine Abhilfe.
+ #page#
+ 204 Überlauf des Compilerstack
+ => Keine Abhilfe.
+
+ 301 Modulnummern-Überlauf
+ Zu viele sichtbare Pakete, Prozeduren und Operatoren ( > 2048 ).
+ => Keine Abhilfe.
+
+ 303
+ siehe 304
+
+ 304 Zu viele Ansprungadressen
+ In dem gerade übersetzten Modul (Prozedur, Operator oder Paketrumpf)
+ werden vom Compiler zu viele Marken benötigt (mehr als 2000). Marken
+ werden z.B. für die Codegenerierung von Auswahl (IF ...) und Wieder­
+ holung (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 ge­
+ spannte SELECT-Anweisungen zurückzuführen.
+ => SELECT-Anweisungen über mehrere Prozeduren verteilen oder
+ Spannweiten verringern.
+
+ 305 Codeüberlauf
+ Der insgesamt erzeugte sichtbare Code ist zu umfangreich ( > 256K ).
+ => Keine Abhilfe.
+
+ 306 Paketdatenadresse zu groß
+ Insgesamt zu viele Datenobjekte in den Paketen ( > 128K ).
+ => Keine Abhilfe.
+
+ 307 Temporäre Datenadresse zu groß
+ Zu viele (lokale) Datenobjekte in einer Prozedur ( > 32K ).
+ => Prozedur in mehrere unterteilen, so daß die Datenobjekte sich über
+ mehrere Prozeduren verteilen.
+
+ 308 Modulcode-Überlauf
+ Ein Modul (Prozedur, Operator oder Paket-Initialisierungsteil) ist zu groß
+ ( > 7.5 KB Code).
+ => In mehrere Prozeduren oder Pakete zerlegen.
+
+ 309 Zuviele Paketdaten
+ (Insgesamt mehr als 128K Paketdaten)
+ => Keine Abhilfe
+
+
+#page#
+
+5.2 Standardtypen
+
+
+5.2.1 Bool
+
+Der Wertebereich für Datenobjekte vom Typ BOOL besteht aus den Werten TRUE
+und FALSE.
+
+'AND'
+ #on("b")#BOOL OP AND (BOOL CONST a, b) #off("b")#
+ Logisches UND, liefert TRUE gdw. a und b TRUE sind.
+
+
+'CAND'
+ #on("b")#BOOL OP CAND #off("b")#
+ Bedingtes logisches UND, entspricht: 'IF a THEN b ELSE false FI'. Der zweite
+ Operand wird nicht ausgewertet, falls er für das Ergebnis nicht relevant ist.
+
+
+'COR'
+ #on("b")#BOOL OP COR #off("b")#
+ Bedingtes logisches ODER, entspricht: 'IF a THEN true ELSE b FI'. Der zweite
+ Operand wird nicht ausgewertet, falls er für das Ergebnis nicht relevant ist.
+
+
+'false'
+ #on("b")#BOOL CONST false #off("b")#
+
+
+'NOT'
+ #on("b")#BOOL OP NOT (BOOL CONST a) #off("b")#
+ Logische Negation.
+
+
+'OR'
+ #on("b")#BOOL OP OR (BOOL CONST a, b) #off("b")#
+ Logisches ODER, liefert TRUE gdw. a und/oder b TRUE ist.
+
+
+'true'
+ #on("b")#BOOL CONST true #off("b")#
+
+
+'XOR'
+ #on("b")#BOOL OP XOR (BOOL CONST a, b) #off("b")#
+ Exklusives ODER, liefert TRUE gdw. entweder a oder b TRUE ist.
+
+#page#
+
+5.2.2 Integer-Arithmetik
+
+Ein Datenobjekt vom Typ INT belegt im Speicher 2 Bytes. Zulässige INT - Werte
+sind die ganzen Zahlen von -32768 bis +32767 einschließlich.
+
+Falls größere ganze Zahlen benötigt werden, muß das Packet 'LONGINT', welches
+sich auf dem Archive 'std.zusatz' befindet, nachinsertiert werden (siehe 6.1.2).
+
+Operationen für Integers:
+
+- Vergleich : = , <> , < , <= , > , >=
+
+- Verknüpfung : + , - , * , ** , DECR , DIV , INCR
+
+- Sonstiges : abs , ABS , initialize random , max , maxint , min ,
+ minint , MOD , random , sign , SIGN , text
+#page#
+':='
+ #on("b")#INT OP := (INT VAR a, INT CONST b) #off("b")#
+ Zuweisung.
+
+
+'='
+ #on("b")#BOOL OP = (INT CONST a, b) #off("b")#
+ Vergleich.
+
+
+'<>'
+ #on("b")#BOOL OP <> (INT CONST a, b) #off("b")#
+ Vergleich auf Ungleichheit.
+
+
+'<'
+ #on("b")#BOOL OP < (INT CONST a, b) #off("b")#
+ Vergleich auf kleiner.
+
+
+'<='
+ #on("b")#BOOL OP <= (INT CONST a, b) #off("b")#
+ Vergleich auf kleiner gleich.
+
+
+'>'
+ #on("b")#BOOL OP > (INT CONST a, b) #off("b")#
+ Vergleich auf größer.
+
+
+'>='
+ #on("b")#BOOL OP >= (INT CONST a, b) #off("b")#
+ Vergleich auf größer gleich.
+
+#page#
+'+'
+ #on("b")#INT OP + (INT CONST a) #off("b")#
+ Monadischer Operator (Vorzeichen, ohne Wirkung).
+
+ #on("b")#INT OP + (INT CONST a, b) #off("b")#
+ Addition.
+
+
+'-'
+ #on("b")#INT OP - (INT CONST a) #off("b")#
+ Vorzeichen-Umkehrung.
+
+
+ #on("b")#INT OP - (INT CONST a, b) #off("b")#
+ Subtraktion.
+
+
+'*'
+ #on("b")#INT OP * (INT CONST a, b) #off("b")#
+ Multiplikation.
+
+
+'**'
+ #on("b")#INT OP ** (INT CONST arg, exp) #off("b")#
+ Exponentiation mit 'exp' >= 0
+
+
+'DECR'
+ #on("b")#OP DECR (INT VAR links, INT CONST rechts) #off("b")#
+ Wirkt wie links := links - rechts
+
+
+'DIV'
+ #on("b")#INT OP DIV (INT CONST a, b) #off("b")#
+ INT-Division.
+
+ FEHLER :
+ - DIV durch 0
+
+
+'INCR'
+ #on("b")#OP INCR (INT VAR links, INT CONST rechts) #off("b")#
+ Wirkt wie links := links + rechts
+
+#page#
+'abs'
+ #on("b")#INT PROC abs (INT CONST argument) #off("b")#
+ Absolutbetrag eines INT-Wertes.
+
+
+ #on("b")#INT OP ABS (INT CONST argument) #off("b")#
+ Absolutbetrag eines INT-Wertes.
+
+
+'initialize random'
+ #on("b")#PROC initialize random (INT CONST wert) #off("b")#
+ Initialisieren der 'random'-Prozedur, um nicht reproduzierbare Zufallszahlen zu
+ bekommen. Diese 'initialize random'-Prozedur gilt für den "INT-Random Gene­
+ rator".
+
+
+'max'
+ #on("b")#INT PROC max (INT CONST links, rechts) #off("b")#
+ Liefert den Größten der beiden INT-Werte.
+
+
+'maxint'
+ #on("b")#INT CONST maxint #off("b")#
+ Größter INT-Wert im EUMEL-System (32 767).
+
+
+'min'
+ #on("b")#INT PROC min (INT CONST links, rechts) #off("b")#
+ Liefert den Kleinsten der beiden INT-Werte.
+
+
+ min ( 3.0, 2.0) ==> 2.0
+ min (-2.0, 3.0) ==> -2.0
+
+
+
+'minint'
+ #on("b")#INT CONST minint #off("b")#
+ Kleinster INT-Wert im EUMEL-System (-32768).
+
+
+'MOD'
+ #on("b")#INT OP MOD (INT CONST links, rechts) #off("b")#
+ Liefert den Rest einer INT-Division.
+
+
+ 3 MOD 2 ==> 1
+ -3 MOD 2 ==> 1
+
+
+ FEHLER :
+ - DIV durch 0
+
+
+'random'
+ #on("b")#INT PROC random (INT CONST lower bound, upper bound) #off("b")#
+ Pseudo-Zufallszahlen-Generator im Intervall 'upper bound' und 'lower bound'
+ einschließlich. Es handelt sich hier um den "INT Random Generator".
+
+
+'real'
+ #on("b")#REAL PROC real (INT CONST a) #off("b")#
+ Konvertierungsprozedur.
+
+#page#
+'sign'
+ #on("b")#INT PROC sign (INT CONST argument) #off("b")#
+ Feststellen des Vorzeichens eines INT-Wertes. Folgende Werte werden geliefert:
+
+
+ argument > 0 ==> 1
+ argument = 0 ==> 0
+ argument < 0 ==> -1
+
+
+
+ #on("b")#INT OP SIGN (INT CONST argument) #off("b")#
+ Feststellen des Vorzeichens eines INT-Wertes.
+
+
+'text'
+ #on("b")#TEXT PROC text (INT CONST zahl) #off("b")#
+ Konvertierung des INT Wertes 'zahl' in den kürzest möglichen Text. Das Vorzei­
+ chen bleibt erhalten.
+
+ #on("b")#TEXT PROC text (INT CONST zahl, länge) #off("b")#
+ Konvertierung des INT Wertes 'zahl' in einen Text der Länge 'länge'. Das
+ Vorzeichen bleibt erhalten. Falls der Text kürzer als 'länge' ist, wird er links
+ (vorne) mit Leerzeichen aufgefüllt, falls er länder ist wird 'länge' mal "*"
+ ausgegeben.
+
+____________________________________________________________________________
+
+ out ("X:"); out(text(12345,7)) ; line;
+ out ("Y:"); out(text(12345,3)) ;
+ (* ergibt *)
+ X: 12345
+ Y:***
+
+____________________________________________________________________________
+#page#
+
+5.2.3 Real-Arithmetik
+
+Für den Datentyp REAL gibt es außer den üblichen Verknüpfungs- und Vergleichs­
+operationen noch eine Anzahl mathematischer Prozeduren und Operationen. Teilweise
+stehen diese in mehr als einer Version zur Verfügung.
+
+Jedes Datenobjekt vom Typ REAL belegt im Speicher 8 Byte.
+
+REALs haben eine 13-stellige #ib#Mantisse#ie#, die im Rechner dezimal geführt wird. (Das
+heißt, bei Konversionen zwischen interner und TEXT-Darstellung treten keine Run­
+dungsfehler auf.) Der Wertebereich wird durch folgende Eckwerte abgegrenzt:
+#dpos(0.5,".")##lpos(4.5)#
+
+#table#
+ 9.999999999999e+126 größter REAL-Wert
+ 0.000000000001 kleinster positiver REAL-Wert mit x + 1.0 > 1.0
+ 9.999999999999e-126 kleinster positiver REAL-Wert > 0.0
+ -9.999999999999e-126 größter negativer REAL-Wert
+ -9.999999999999e+126 kleinster REAL-Wert
+
+#clearpos#
+#tableend#
+
+- Vergleiche : = , <> , < , <= , > , >=
+
+- Verknüpfungen : + , - , * , / , ** , DECR , INCR
+
+- Diverse : abs , arctan , arctand , cos , cosd , decimal
+ exponent , e , exp , floor , frac , initialize
+ random , int , ln , log2 , log10 , max ,
+ maxreal , min , MOD , pi , random , round ,
+ sign , SIGN , sin , sind , smallreal , sqrt ,
+ tan , tand , text
+
+#page#
+':='
+ #on("b")#REAL OP := (REAL VAR a, REAL CONST b) #off("b")#
+ Zuweisung.
+
+
+'='
+ #on("b")#BOOL OP = (REAL CONST a, b) #off("b")#
+ Vergleich.
+
+
+'<>'
+ #on("b")#BOOL OP <> (REAL CONST a, b) #off("b")#
+ Vergleich auf Ungleichheit.
+
+
+'<'
+ #on("b")#BOOL OP < (REAL CONST a, b) #off("b")#
+ Vergleich auf kleiner.
+
+
+'<='
+ #on("b")#BOOL OP <= (REAL CONST a, b) #off("b")#
+ Vergleich auf kleiner gleich.
+
+
+'>'
+ #on("b")#BOOL OP > (REAL CONST a, b) #off("b")#
+ Vergleich auf größer.
+
+
+'>='
+ #on("b")#BOOL OP >= (REAL CONST a, b) #off("b")#
+ Vergleich auf größer gleich.
+
+#page#
+'+'
+ #on("b")#REAL OP + (REAL CONST a) #off("b")#
+ Monadischer Operator (Vorzeichen, ohne Wirkung).
+
+
+ #on("b")#REAL OP + (REAL CONST a, b) #off("b")#
+ Addition.
+
+
+'-'
+ #on("b")#REAL OP - (REAL CONST a) #off("b")#
+ Vorzeichen-Umkehrung.
+
+
+ #on("b")#REAL OP - (REAL CONST a, b) #off("b")#
+ Subtraktion.
+
+
+'*'
+ #on("b")#REAL OP * (REAL CONST a, b) #off("b")#
+ Multiplikation.
+
+
+'/'
+ #on("b")#REAL OP / (REAL CONST a, b) #off("b")#
+ Division.
+
+ FEHLER :
+ - Division durch 0
+
+
+'**'
+ #on("b")#REAL OP ** (REAL CONST arg, exp) #off("b")#
+ Exponentiation.
+
+ #on("b")#REAL OP ** (REAL CONST arg, INT CONST exp) #off("b")#
+ Exponentiation.
+
+
+'DECR'
+ #on("b")#OP DECR (REAL VAR links, REAL CONST rechts) #off("b")#
+ Wirkt wie links := links - rechts
+
+
+'INCR'
+ #on("b")#OP INCR (REAL VAR links, REAL CONST rechts) #off("b")#
+ Wirkt wie links := links + rechts
+
+#page#
+'abs'
+ #on("b")#REAL PROC abs (REAL CONST wert) #off("b")#
+ Absolutbetrag eines REAL-Wertes.
+
+ #on("b")#REAL OP ABS (REAL CONST wert) #off("b")#
+ Absolutbetrag eines REAL-Wertes.
+
+
+'arctan'
+ #on("b")#REAL PROC arctan (REAL CONST x) #off("b")#
+ Arcus Tangens-Funktion. Liefert einen Wert in Radiant.
+
+
+'arctand'
+ #on("b")#REAL PROC arctand (REAL CONST x) #off("b")#
+ Arcus Tangens-Funktion. Liefert einen Wert in Grad.
+
+
+'cos'
+ #on("b")#REAL PROC cos (REAL CONST x) #off("b")#
+ Cosinus-Funktion. 'x' muß in Radiant angegeben werden.
+
+
+'cosd'
+ #on("b")#REAL PROC cosd (REAL CONST x) #off("b")#
+ Cosinus-Funktion. 'x' muß in Winkelgrad angegeben werden.
+
+
+'decimal exponent'
+ #on("b")#INT PROC decimal exponent (REAL CONST mantisse) #off("b")#
+ Liefert aus einem REAL-Wert den dezimalen Exponenten als INT-Wert.
+
+
+'e'
+ #on("b")#REAL PROC e #off("b")#
+ Eulersche Zahl (2.718282).
+
+
+'exp'
+ #on("b")#REAL PROC exp (REAL CONST z) #off("b")#
+ Exponentialfunktion.
+
+
+'floor'
+ #on("b")#REAL PROC floor (REAL CONST real) #off("b")#
+ Schneidet die Nachkommastellen des REAL-Wertes 'real' ab.
+
+
+'frac'
+ #on("b")#REAL PROC frac (REAL CONST z) #off("b")#
+ Liefert die Stellen eines REAL-Wertes hinter dem Dezimalpunkt.
+
+
+'initialize random'
+ #on("b")#PROC initialize random (REAL CONST z) #off("b")#
+ 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'.
+
+
+'int'
+ #on("b")#INT PROC int (REAL CONST a) #off("b")#
+ Konvertierungsprozedur. Die Nachkommastellen werden abgeschnitten.
+ Bsp: int (3.9) => 3
+
+
+'ln'
+ #on("b")#REAL PROC ln (REAL CONST x) #off("b")#
+ Natürlicher Logarithmus.
+
+ FEHLER :
+ - ln mit negativer Zahl
+ Nur echt positive Argumente sind zulässig.
+
+
+'log2'
+ #on("b")#REAL PROC log2 (REAL CONST z) #off("b")#
+ Logarithmus zur Basis 2.
+
+ FEHLER :
+ - log2 mit negativer zahl
+ Nur echt positive Argumente sind zulässig.
+
+
+'log10'
+ #on("b")#REAL PROC log10 (REAL CONST x) #off("b")#
+ Logarithmus zur Basis 10.
+
+ FEHLER :
+ - log10 mit negativer zahl
+ Nur echt positive Argumente sind zulässig.
+
+
+'max'
+ #on("b")#REAL PROC max (REAL CONST links, rechts) #off("b")#
+ Liefert den Größten der beiden REAL-Werte.
+
+
+'maxreal'
+ #on("b")#REAL CONST maxreal #off("b")#
+ Größter REAL-Wert im EUMEL-System (9.999999999999e126).
+
+
+'min'
+ #on("b")#REAL PROC min (REAL CONST links, rechts) #off("b")#
+ Liefert den Kleinsten der beiden REAL-Werte.
+
+
+'MOD'
+ #on("b")#REAL OP MOD (REAL CONST links, rechts) #off("b")#
+ Modulo-Funktion für REALs (liefert den Rest). Beispiele:
+
+
+ 5.0 MOD 2.0 ==> 1.0
+ 4.5 MOD 4.0 ==> 0.5
+
+
+
+'pi'
+ #on("b")#REAL CONST pi #off("b")#
+ Die Zahl pi (3.141593).
+
+
+'random'
+ #on("b")#REAL PROC random #off("b")#
+ Pseudo-Zufallszahlen-Generator im Intervall 0 und 1. Es handelt sich hier um
+ den "REAL Random Generator".
+
+
+'round'
+ #on("b")#REAL PROC round (REAL CONST real, INT CONST digits) #off("b")#
+ 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 Vorkommastellen gerundet.
+
+
+ round (123.456, -2)
+
+
+ liefert '100.0'. Abweichung vom Standard: Es wird mit 'digits'-Ziffern gerundet.
+
+
+'sign'
+ #on("b")#INT PROC sign (REAL CONST argument) #off("b")#
+ Feststellen des Vorzeichens eines REAL-Wertes.
+
+ #on("b")#INT OP SIGN (REAL CONST argument) #off("b")#
+ Feststellen des Vorzeichens eines REAL-Wertes.
+
+
+'sin'
+ #on("b")#REAL PROC sin (REAL CONST x) #off("b")#
+ Sinus-Funktion. 'x' muß in Radiant (Bogenmaß) angegeben werden.
+
+
+'sind'
+ #on("b")#REAL PROC sind (REAL CONST x) #off("b")#
+ Sinus-Funktion. 'x' muß im Winkelgrad angegeben werden.
+
+
+'smallreal'
+ #on("b")#REAL PROC smallreal #off("b")#
+ 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'
+ #on("b")#REAL PROC sqrt (REAL CONST z) #off("b")#
+ Wurzel-Funktion.
+
+ FEHLER :
+ - sqrt von negativer Zahl
+ Das Argument muß größer gleich 0.0 sein.
+
+
+'tan'
+ #on("b")#REAL PROC tan (REAL CONST x) #off("b")#
+ Tangens-Funktion. 'x' muß in Radiant angegeben werden.
+
+
+'tand'
+ #on("b")#REAL PROC tand (REAL CONST x) #off("b")#
+ Tangens-Funktion. 'x' muß in Winkelgrad angegeben werden.
+
+
+'text'
+ #on("b")#TEXT PROC text (REAL CONST real) #off("b")#
+ Konvertierung eines REAL-Wertes in einen TEXT. Ggf. wird der TEXT in Expo­
+ nenten-Darstellung geliefert.
+
+ #on("b")#TEXT PROC text (REAL CONST real, laenge) #off("b")#
+ Konvertierung eines REAL-Wertes in einen TEXT. Der TEXT wird in Exponen­
+ ten-Darstellung geliefert. Um diese Darstellung zu ermöglichen ist der Wert
+ 'laenge' größer oder gleich 8 anzugeben.
+
+ #on("b")#TEXT PROC text (REAL CONST real, INT CONST laenge, fracs)#off("b")#
+ Konvertierung eines REAL-Wertes in einen TEXT. Dabei gibt 'laenge' die Länge
+ des Resultats einschließlich des Dezimalpunktes und 'fracs' die Anzahl der Dezi­
+ malstellen an. Kann der REAL-Wert nicht wie gewünscht dargestellt werden, wird
+
+
+ laenge * "*"
+
+
+ geliefert.
+
+#page#
+
+5.2.4 Text
+
+Jedes Datenobjekt vom Typ TEXT besteht aus einem festen Teil von 16 Bytes und
+möglicherweise aus einem flexiblen Teil auf dem #on("i")##on("b")#Heap#off("i")##off("b")#. Im festen Teil werden Texte
+bis zur Länge von 13 Zeichen untergebracht. Wenn eine TEXT-Variable einen Wert
+mit mehr als 13 Zeichen Länge annimmt, werden alle Zeichen auf dem Heap unterge­
+bracht. Genauer ergibt sich folgendes Bild:
+
+ kurzer Text (Länge <= 13):
+
+ Heap-Link 2 Bytes
+ Textlänge 1 Byte
+ Text 13 Bytes
+
+ langer Text (Länge > 13):
+
+ Heap-Link 2 Bytes
+ 255 1 Byte
+ Länge 2 Bytes
+ ungenutzt 11 Bytes
+
+Wenn eine Variable einmal Platz auf dem Heap bekommen hat, behält sie diesen
+vorbeugend auch dann, wenn sie wieder einen kurzen Text als Wert erhält. So muß
+wahrscheinlich kein neuer Platz auf dem Heap zugewiesen werden, wenn sie wieder
+länger wird. Das gilt allerdings nur bis zur nächsten #ib#Garbage Collection#ie# auf den
+TEXT-Heap, denn dabei werden alle Heap-Container minimal gemacht bzw. ge­
+löscht, wenn sie nicht mehr benötigt werden. Der Platz auf dem Heap wird in Vielfa­
+chen von 16 Bytes vergeben. In Fremddatenräumen wird in jedem #ib#Container#ie# neben
+dem eigentlichen Text auch die Containerlänge untergebracht.
+#page#
+Beispiele: TEXT-Länge Speicherbedarf (Byte)
+
+ 0 16
+ 13 16
+ 14 32
+ 15 48
+ 30 48
+ 31 64
+ 46 64
+ 47 80
+ 62 80
+
+
+Die Heapgröße eines Fremddatenraums berechnet sich als:
+
+ 1024 * 1024 = 1048056 - stat Bytes
+
+'stat' ist dabei die statische Größe der Datenstruktur, die dem Datenraum aufgeprägt
+wurde. Bei einem BOUND ROW 1000 TEXT ergibt sich also eine Heapgröße von
+
+ 1048056 - (1000 * 16) = 1032056 Bytes.
+
+
+
+'heap size'
+ #on("b")#INT PROC heap size #off("b")#
+ Informationsprozedur für die Größe (in KB) des TEXT-Heaps.
+
+#page#
+
+TEXT- Operationen:
+
+- Vergleich : = , <> , < , <= , > , >=
+ LEXEQUAL , LEXGREATER ,
+ LEXGREATEREQUAL
+
+- Verkettung : + , * , CAT
+
+- Veränderung : change , change all , code , compress , delete
+ char , insert char , length , LENGTH , max
+ text length , pos , real , replace , SUB ,
+ subtext , text
+#page#
+
+Der EUMEL-Zeichensatz
+#goalpage("codetab")#
+Das EUMEL System definiert einen Zeichensatz, der gewährleistet, daß gleiche Text­
+zeichen auf allen Maschinen gleich codiert werden.
+ Die interne Darstellung wird durch die folgende EUMEL-Codetabelle
+beschrieben. Der Zeichensatz beruht auf dem ASCII-Zeichensatz mit Erweiterungen.
+Der in der Tabelle freie Bereich (z.B code(127) bis code(213)) ist nicht einheitlich
+verfügbar und wird deshalb nicht beschrieben. Die Codierung bildet mithin auch
+Grundlage für Vergleiche und Sortierungen.
+
+Die Korrekte Darstellung dieser Zeichen auf Bildschirm, Drucker etc. setzt natürlich
+eine korrekte Konfiguration der Geräte voraus. Die Anpassung eines Geräts an diesen
+Zeichensatz ist im EUMEL-Systemhandbuch in Teil 2 beschrieben.
+
+
+ I 0 1 2 3 4 5 6 7 8 9
+---+--------------------------------------
+3 I SP ! " \# $ % & '
+ I
+4 I ( ) * + , - . / 0 1
+ I
+5 I 2 3 4 5 6 7 8 9 : ;
+ I
+6 I < = > ? § A B C D E
+ I
+7 I F G H I J K L M N O
+ I
+8 I P Q R S T U V W X Y
+ I
+9 I Z [ \ ] ^ _ ` a b c
+ I
+10 I d e f g h i j k l m
+ I
+11 I n o p q r s t u v w
+ I
+12 I x y z { | } ~
+ I
+13 I
+. I
+. I
+. I
+20 I
+ I
+21 I Ä Ö Ü ä ö ü
+ I
+22 I k ­ \# SP
+ I
+23 I
+ I
+24 I
+ I
+25 I ß
+#page#
+':='
+ #on("b")#TEXT OP := (TEXT VAR a, TEXT CONST b) #off("b")#
+ Zuweisung.
+
+
+'='
+ #on("b")#BOOL OP = (TEXT CONST links, rechts) #off("b")#
+ Vergleich von zwei Texten auf Gleichheit (Texte mit ungleichen Längen sind
+ immer ungleich).
+
+
+'<>'
+ #on("b")#BOOL OP <> (TEXT CONST links, rechts) #off("b")#
+ Vergleich von zwei Texten auf Ungleichheit (Texte mit ungleichen Längen sind
+ stets ungleich).
+
+
+'<'
+ #on("b")#BOOL OP < (TEXT CONST links, rechts) #off("b")#
+ Vergleich zweier Texte auf kleiner ('links' kommt lexikographisch vor 'rechts').
+
+
+'<='
+ #on("b")#BOOL OP <= (TEXT CONST links, rechts) #off("b")#
+ Vergleich von zwei Texten auf kleiner gleich ('links' kommt lexikographisch vor
+ oder ist gleich 'rechts').
+
+
+'>'
+ #on("b")#BOOL OP > (TEXT CONST links, rechts) #off("b")#
+ Vergleich zweier Texte auf größer ('links' kommt lexikographisch nach 'rechts').
+
+
+'>='
+ #on("b")#BOOL OP >= (TEXT CONST links, rechts) #off("b")#
+ Vergleich zweier Texte auf größer gleich ('links' kommt lexikographisch nach oder
+ ist gleich 'rechts').
+
+#page#
+'LEXEQUAL'
+ #on("b")#BOOL OP LEXEQUAL (TEXT CONST links, rechts) #off("b")#
+ Prüfung auf lexikalische Gleichheit.
+
+
+'LEXGREATER'
+ #on("b")#BOOL OP LEXGREATER (TEXT CONST links, rechts) #off("b")#
+ Prüfung ob der Text 'links' lexikalisch größer als 'rechts' ist.
+
+
+'LEXGREATEREQUAL'
+ #on("b")#BOOL OP LEXGREATEREQUAL (TEXT CONST links, rechts) #off("b")#
+ Prüfung ob der Text 'links' lexikalisch größer oder gleich dem Text 'rechts' ist.
+
+
+
+ Die drei Operatoren prüfen nach folgenden Regeln:
+
+ - Buchstaben haben die aufsteigende Reihenfolge 'A' bis 'Z'. Dabei werden kleine
+ und große Buchstaben gleich behandelt.
+
+ - Umlaute werden wie üblich ausgeschrieben. (Ä = Ae usw.)
+ (ß = ss)
+
+ - Alle Sonderzeichen (auch Ziffern) außer ' '(Leerzeichen) und '-' werden igno­
+ riert, diese beiden Zeichen werden gleich behandelt.
+
+#page#
+'+'
+ #on("b")#TEXT OP + (TEXT CONST links, rechts) #off("b")#
+ Verkettung der Texte 'links' und 'rechts' in dieser Reihenfolge. Die Länge des
+ Resultats ergibt sich aus der Addition der Längen der Operanden.
+
+
+'*'
+ #on("b")#TEXT OP * (INT CONST faktor, TEXT CONST quelle) #off("b")#
+ 'faktor' fache Erstellung von 'quelle' und Verkettung. Dabei muß
+
+
+ times >= 0
+
+
+ sein, sonst wird 'niltext' geliefert.
+
+
+'CAT'
+ #on("b")#OP CAT (TEXT VAR links, TEXT CONST rechts) #off("b")#
+ hat die gleiche Wirkung wie
+
+
+ links := links + rechts
+
+
+ Hinweis: Der Operator 'CAT' hat eine geringere Heap-Belastung als die Opera­
+ tion mit expliziter Zuweisung.
+
+#page#
+'change'
+ #on("b")#PROC change (TEXT VAR senke, TEXT CONST alt, neu) #off("b")#
+ Ersetzung des (Teil-) TEXTes 'alt' in 'senke' durch 'neu' bei dem erstmaligen
+ Auftreten. Ist 'alt' nicht in 'senke' vorhanden, so wird keine Meldung abgesetzt
+ (Abweichung vom Standard). Die Länge von 'senke' kann sich dabei verändern.
+ Beispiel:
+
+
+ TEXT VAR mein text :: "EUMEL-Benutzerhandbuch";
+ change (mein text, "Ben", "N");
+ (* EUMEL-Nutzerhandbuch *)
+
+
+ #on("b")#PROC change (TEXT VAR senke, INT CONST von, bis, TEXT CONST neu) #off("b")#
+ Der TEXT 'neu' wird in den TEXT 'senke' anstatt des TEXTes, der zwischen 'von'
+ und 'bis' steht, eingesetzt. Die Länge von 'senke' kann sich dabei verändern.
+ Beispiel:
+
+
+ TEXT VAR mein text :: "EUMEL-Benutzerhandbuch";
+ change (mein text, 7, 9, "N"); (* wie oben *)
+
+
+
+'change all'
+ #on("b")#PROC change all (TEXT VAR senke, TEXT CONST alt, neu) #off("b")#
+ Der Teiltext 'alt' wird durch 'neu' in 'senke' ersetzt. Im Unterschied zur 'chan­
+ ge'-Prozedur findet die Ersetzung nicht nur bei dem erstmaligen Auftreten von
+ 'alt' statt, sondern so oft, wie 'alt' in 'senke' vorhanden ist. Beispiel:
+
+
+ TEXT VAR x :: "Das ist ein Satz";
+ change all (x, " ", ""); (* DasisteinSatz *)
+
+#page#
+'code'
+ #on("b")#TEXT PROC code (INT CONST code) #off("b")#
+ Wandelt einen INT-Wert 'code' in ein Zeichen um. 'code' muß
+
+
+ 0 <= code <= 255
+
+
+ sein.
+
+ #on("b")#INT PROC code (TEXT CONST text) #off("b")#
+ 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).
+ (Codetabelle auf Seite 5- #topage("codetab")#)
+
+
+'compress'
+ #on("b")#TEXT PROC compress (TEXT CONST text) #off("b")#
+ Liefert den TEXT 'text' ohne führende und nachfolgende Leerzeichen.
+
+
+'delete char'
+ #on("b")#PROC delete char (TEXT VAR string, INT CONST delete pos)#off("b")#
+ 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.
+
+#page#
+'insert char'
+ #on("b")#PROC insert char (TEXT VAR string, TEXT CONST char,INT CONST insert pos)#off("b")#
+ 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.
+
+
+'length'
+ #on("b")#INT PROC length (TEXT CONST text) #off("b")#
+ Anzahl von Zeichen ("Länge") von 'text' einschließlich Leerzeichen.
+
+
+'LENGTH'
+ #on("b")#INT OP LENGTH (TEXT CONST text) #off("b")#
+ Anzahl von Zeichen ("Länge") von 'text' einschließlich Leerzeichen.
+
+
+'max text length'
+ #on("b")#INT CONST max text length #off("b")#
+ Maximale Anzahl von Zeichen in einem TEXT (32 000).
+
+#page#
+'pos'
+ #on("b")#INT PROC pos (TEXT CONST quelle, pattern) #off("b")#
+ Liefert die erste Position des ersten Zeichens von 'pattern' in 'quelle', falls 'pat­
+ tern' gefunden wird. Wird 'pattern' nicht gefunden oder ist 'pattern' niltext, so wird
+ der Wert '0' geliefert. Beispiel:
+
+
+ TEXT VAR t1 :: "abcdefghijk...xyz",
+ t2 :: "cd";
+ ... pos (t1, t2) ... (* liefert 3 *)
+ ... pos (t2, t1) ... (* liefert 0 *)
+
+
+
+ #on("b")#INT PROC pos (TEXT CONST quelle, pattern, INT CONST von)#off("b")#
+ Wie obige Prozedur, jedoch wird erst ab der Position 'von' ab gesucht. Dabei gilt
+ folgende Einschränkung:
+
+
+ length (pattern) < 255
+
+
+
+ #on("b")#INT PROC pos (TEXT CONST quelle, low char, high char, INT CONST von#off("b")#
+ Liefert die Position des ersten Zeichens 'x' in 'quelle' ab der Position 'von', so daß
+
+
+ low char <= x <= high char
+
+
+ 'low char' und 'high char' müssen TEXTe der Länge 1 sein. Wird kein Zeichen in
+ 'quelle' 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);
+
+____________________________________________________________________________
+
+#page#
+'real'
+ #on("b")#REAL PROC real (TEXT CONST text) #off("b")#
+ 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'
+ #on("b")#PROC replace (TEXT VAR senke, INT CONST position, TEXT CONST quelle)#off("b")#
+ Ersetzung eines Teiltextes in 'senke' durch 'quelle' an der Position 'position' in
+ 'senke'. Es muß gelten
+
+
+ 1 <= position <= LENGTH senke
+
+
+ d.h. 'position' muß innerhalb von 'senke' liegen und 'quelle' muß von der Posi­
+ tion 'position' ab in 'senke' einsetzbar sein. Dabei bleibt die Länge von 'senke'
+ unverändert.
+
+
+'SUB'
+ #on("b")#TEXT OP SUB (TEXT CONST text, INT CONST pos) #off("b")#
+ 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.
+
+#page#
+'subtext'
+ #on("b")#TEXT PROC subtext (TEXT CONST quelle, INT CONST von) #off("b")#
+ Teiltext von 'quelle', der bei der Position 'von' anfängt. Die Länge des Resultats
+ ergibt sich also zu
+
+
+ LENGTH quelle - von + 1
+
+
+ d.h. von der Position 'von' bis zum Ende von 'quelle'. 'von' muß innerhalb von
+ 'quelle' liegen. Ist von < 1, dann wird 'quelle' geliefert. Falls von > LENGTH
+ quelle ist, wird niltext geliefert.
+
+
+ #on("b")#TEXT PROC subtext (TEXT CONST quelle, INT CONST von, bis)#off("b")#
+ Teiltext von 'quelle' von der Position 'von' bis einschließlich der Position 'bis'. Die
+ Länge des Resultats ist also
+
+
+ bis - von + 1
+
+
+ Dabei muß gelten
+
+
+ 1 <= von <= bis <= LENGTH quelle
+
+
+ d.h. die Positionen 'von' und 'bis' müssen in dieser Reihenfolge innerhalb von
+ 'quelle' liegen. Ist
+
+
+ bis >= LENGTH quelle
+
+
+ wird 'subtext (quelle, von)' ausgeführt. Für die Bedingungen für 'von' siehe vor­
+ stehende Beschreibung von 'subtext'.
+
+
+'text'
+ #on("b")#TEXT PROC text (TEXT CONST quelle, INT CONST laenge) #off("b")#
+ Teiltext aus 'quelle' mit der Länge 'laenge', beginnend bei der Position 1 von
+ 'quelle'. Es muß gelten
+
+
+ 1 <= laenge <= LENGTH quelle
+
+
+ d.h. der gewünschte Teiltext muß aus 'quelle' ausblendbar sein.
+ Wenn gilt:
+
+ laenge > LENGTH quelle
+
+
+ wird der zu liefernde TEXT mit der an 'laenge' fehlenden Zeichen mit Leerzeichen
+ aufgefüllt.
+
+ #on("b")#TEXT PROC text (TEXT CONST quelle, INT CONST laenge, von)#off("b")#
+ Teiltext aus 'quelle' mit der Länge 'laenge', beginnend an der Position 'von' in
+ dem TEXT 'quelle'. Entspricht
+
+
+ text (subtext (quelle, von, LENGTH quelle),laenge)
+
+
+ Es muß
+
+
+ laenge >= 0
+ 1 <= von <= LENGTH quelle
+
+
+ gelten, d.h. 'von' muß eine Position angeben, die innerhalb von 'quelle' liegt. Für
+
+
+ laenge > LENGTH quelle - von + 1
+
+
+ also wenn die angegebene Länge 'laenge' größer ist als der auszublendende Text,
+ wird das Resultat rechts mit Leerzeichen aufgefüllt. Wenn
+
+
+ laenge < LENGTH quelle - von + 1
+
+
+ d.h. wenn die angegebene Länge kleiner ist als der Teiltext von 'von' bis zum
+ letzten Zeichen von 'quelle', wird das Resultat mit der Länge
+
+
+ LENGTH quelle - von + 1
+
+
+ geliefert.
+
diff --git a/doc/programming/programmierhandbuch.5b b/doc/programming/programmierhandbuch.5b
new file mode 100644
index 0000000..d91bcc9
--- /dev/null
+++ b/doc/programming/programmierhandbuch.5b
@@ -0,0 +1,1481 @@
+#pagenr("%",40)##setcount(1)##block##pageblock#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#TEIL 5 : Programmierung
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+5 - % #right#GMD
+#end#
+#bottomodd#
+#center#____________________________________________________________
+GMD #right#5 - %
+#end#
+
+5.3 Der Datentyp FILE (Textdateien)
+
+Der Datentyp FILE definiert Dateien von sequentieller Struktur, die Texte enthalten.
+Ein Objekt vom Datentyp FILE ist charakterisiert durch:
+
+1) seine Betriebsrichtung : input = nur lesender Zugriff
+ (TRANSPUTDIRECTION) output= nur schreibender Zugriff
+ modify= lesender und schreibender Zugriff.
+2) seinen Namen.
+
+Betriebsrichtung und Name werden in der Assoziierungsprozedur 'sequential file'
+(siehe Kap 2.8.2) festgelegt.
+
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+ TEXT VAR name := ausgabe ;
+
+ FILE VAR f := sequential file(output,name) ;
+
+
+____________________________________________________________________________
+
+
+
+Das Festlegen einer Betriebsrichtung impliziert eine Kontrolle der Benutzung der
+betreffenden Datei, hilft somit Programmierfehler zu vermeiden.
+
+ACHTUNG : #on("b")##on("u")#Alle#off("b")##off("u")# Prozeduren, die auf FILEs zugreifen, verlangen Objekte vom Typ
+ FILE VAR, da die Lese/Schreiboperationen als ändernd betrachtet wer­
+ den (müssen).
+
+#page#
+
+5.3.1 Assoziierung
+
+'sequential file'
+ #on("b")#FILE PROC sequential file (TRANSPUTDIRECTION CONST mode, DATASPACE VAR ds) #off("b")#
+ Assoziierung einer sequentiellen Datei mit dem Dataspace 'ds' und der Betriebs­
+ richtung 'mode' (vergl. 'modify', 'input' bzw. 'output'). Diese Prozedur dient zur
+ Assoziierung eines temporä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.
+
+
+ #on("b")#FILE PROC sequential file (TRANSPUTDIRECTION CONST mode,TEXT CONST name)#off("b")#
+ Assoziierung einer sequentiellen Datei mit dem Namen 'name' und der Betriebs­
+ richtung 'mode' (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 dagagen der FILE noch nicht und ist die
+ TRANSPUTDIRECTION 'output' oder 'modify', wird ein neuer FILE eingerich­
+ tet.
+
+ FEHLER : "name" gibt es nicht"
+ Es wurde versucht, einen nicht vorhandenen FILE mit 'input' zu asso­
+ ziieren.
+
+#page#
+
+'input'
+ #on("b")#PROC input (FILE VAR f) #off("b")#
+ Ändern der Verarbeitungsart von 'modify' oder 'output' in 'input'. Dabei wird auf
+ den ersten Satz der Datei positioniert.
+
+ #on("b")#TRANSPUTDIRECTION CONST input #off("b")#
+ Assoziierung in Zusammenhang mit der Prozedur 'sequential file' einer sequentiel­
+ len Datei mit der 'TRANSPUTDIRECTION' 'input' (nur lesen).
+
+
+'output'
+ #on("b")#PROC output (FILE VAR file) #off("b")#
+ Ändern der Verarbeitungsart von 'input' oder 'modify' in 'output'. Dabei wird hinter
+ den letzten Satz der Datei positioniert.
+
+ #on("b")#TRANSPUTDIRECTION CONST output #off("b")#
+ In Verbindung mit der Prozedur 'sequential file' kann eine Datei assoziiert werden
+ mit der Betriebsrichtung 'output' (nur schreiben).
+
+
+'modify'
+ #on("b")#PROC modify (FILE VAR f) #off("b")#
+ Ändern der Betriebsrichtung von 'input' oder 'output' in die Betriebsrichtung 'mo­
+ dify'.
+
+ #on("b")#TRANSPUTDIRECTION CONST modify #off("b")#
+ Diese Betriebsrichtung erlaubt das Vorwärts- und Rückwärts-Positionieren und
+ das beliebige Einfügen und Löschen von Sätzen. 'modify' wird für die Assoziie­
+ rungsprozedur 'sequential file' benötigt.
+
+
+
+#page#
+
+5.3.2 Informationsprozeduren
+
+'eof'
+ #on("b")#BOOL PROC eof (FILE CONST file) #off("b")#
+ Informationsprozedur auf das Ende eines FILEs. Liefert den Wert TRUE, sofern
+ hinter den letzten Satz eines FILEs positioniert wurde.
+
+
+'line no'
+ #on("b")#INT PROC line no (FILE CONST file) #off("b")#
+ Liefert die aktuelle Zeilennummer.
+
+
+'lines'
+ #on("b")#PROC lines (FILE VAR f) #off("b")#
+ Liefert die Anzahl der Zeilen der Datei 'f'.
+
+
+'headline'
+ #on("b")#TEXT PROC headline (FILE CONST f) #off("b")#
+ Liefert den Inhalt der Kopfzeile der Datei 'f'.
+
+ #on("b")#PROC headline (FILE VAR f, TEXT CONST ueberschrift) #off("b")#
+ Setzt #ib#'ueberschrift' in die Kopfzeile#ie# der Datei 'f'.
+#page#
+
+5.3.3 Betriebsrichtung INPUT
+
+In der Betriebsrichtung 'input' sind nur Leseoperationen auf der Datei zugelassen. Die
+Assoziierungsprozedur 'sequential file' bewirkt:
+
+1) Falls die Eingabedatei noch nicht existiert, wird eine Fehlermeldung ausgegeben.
+
+2) Falls es eine Datei des Namens gibt, wird auf das erste Zeichen des ersten
+ Satzes positioniert.
+
+
+
+'get'
+ #on("b")#PROC get (FILE VAR f, INT VAR number) #off("b")#
+ Lesen des nächsten Wortes aus der Datei 'f' und Konvertierung des Wortes zu
+ einem Integer-Objekt.
+
+ #on("b")#PROC get (FILE VAR f, REAL VAR number) #off("b")#
+ Lesen des nächsten Wortes aus der Datei 'f' und Konvertierung des Wortes zu
+ einem Real-Objekt.
+
+
+ #on("b")#PROC get (FILE VAR f, TEXT VAR text) #off("b")#
+ Lesen des nächsten Wortes aus der Datei 'f'.
+
+ #on("b")#PROC get (FILE VAR f, TEXT VAR text, TEXT CONST delimiter)#off("b")#
+ Lesen eines TEXT-Wertes 'text' von der Datei 'f', bis das Zeichen 'delimiter'
+ angetroffen wird. Ein eventueller Zeilenwechsel in der Datei wird dabei übergan­
+ gen.
+
+ #on("b")#PROC get (FILE VAR f, TEXT VAR text, INT CONST maxlength)#off("b")#
+ Lesen eines TEXT-Wertes 'text' von der Datei 'f' mit 'maxlength' Zeichen. Ein
+ eventueller Zeilenwechsel in der Datei wird dabei nicht übergangen.
+
+
+
+'getline'
+ #on("b")#PROC get line (FILE VAR file, TEXT VAR record) #off("b")#
+ Lesen der nächsten Zeile aus der sequentiellen Datei 'file'.
+ Mögliche Fehler bei Betriebsrichtung 'input':
+
+ "Datei zu"
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+
+ "Leseversuch nach Dateiende"
+ Es wurde versucht, über die letzte Zeile einer Datei zu lesen.
+
+ "Leseversuch auf output file"
+ Es wurde versucht, von einem mit 'output' assoziierten FILE zu lesen.
+
+ "Unzulässiger Zugriff auf modify-FILE"
+
+#page#
+
+5.3.4 Betriebsrichtung OUTPUT
+
+In der Betriebsrichtung 'output' sind nur Schreiboperationen auf der Datei zugelassen.
+Die Assoziierungsprozedur 'sequential file' bewirkt:
+
+1) Falls die Ausgabedatei noch nicht existiert, wird sie angelegt und auf den ersten
+ Satz positioniert.
+
+2) Falls es bereits eine Datei des Namens gibt, wird hinter den letzten Satz positio­
+ niert, die Datei wird also fortgeschrieben.
+
+
+'put'
+ #on("b")#PROC put (FILE VAR f, INT CONST number) #off("b")#
+ Ausgabe eines INT-Wertes 'number' in die Datei 'f'. Dabei wird ein Leerzeichen
+ an die Ausgabe angefügt.
+
+ #on("b")#PROC put (FILE VAR f, REAL CONST number) #off("b")#
+ Ausgabe eines REAL-Wertes 'number' in die Datei 'f'. Dabei wird ein Leerzei­
+ chen an die Ausgabe angefügt.
+
+ #on("b")#PROC put (FILE VAR f, TEXT CONST text) #off("b")#
+ Ausgabe eines TEXT-Wertes 'text' in die Datei 'f'. Dabei wird ein Leerzeichen an
+ die Ausgabe angefügt.
+
+
+
+'putline'
+ #on("b")#PROC putline (FILE VAR file, TEXT CONST record) #off("b")#
+ Ausgabe eines TEXTes 'record' in die Datei 'file'. Danach wird auf die nächste
+ Zeile positioniert. 'file' muß mit 'output' assoziiert sein.
+
+
+'write'
+ #on("b")#PROC write (FILE VAR f, TEXT CONST text) #off("b")#
+ Schreibt 'text' in die Datei 'f' (analog 'put (f, text)'), aber ohne Trennblank.
+
+
+'line'
+ #on("b")#PROC line (FILE VAR file) #off("b")#
+ Positionierung auf die nächste Zeile der Datei 'file'. Wird versucht, über das Ende
+ eines mit 'input' assoziierten FILEs zu positionieren, wird keine Aktion vorgenom­
+ men.
+
+ #on("b")#PROC line (FILE VAR file, INT CONST lines) #off("b")#
+ Positionierung mit 'lines' Zeilen Vorschub in der Datei 'file'.
+
+
+ FEHLER: "Datei zu!"
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+
+ "Schreibversuch auf input-File"
+ Es wurde versucht, auf einen mit 'input' assoziierten FILE zu
+ schreiben.
+
+
+ Bei Textdateien, die mit dem Editor weiterbearbeitet werden sollen, ist also zu
+ beachten: ine Ausgabe mit 'put' setzt ein 'blank' hinter die Ausgabe. Falls dieses
+ Leerzeichen das letzte Zeichen in der Zeile ist, wird eine Absatzmarke in der Zeile
+ gesetzt. Wird mit 'write' oder 'putline' ausgegeben, steht kein Leerzeichen und
+ somit keine Absatzmarke am Zeilenende.
+#page#
+
+5.3.5 Betriebsrichtung MODIFY
+
+In der Betriebsrichtung 'modify' sind Lese- und Schreiboperationen auf der Datei
+zugelassen. Desweiteren ist beliebiges Positionieren in der Datei erlaubt. Neue Sätze
+können an beliebiger Stelle in die Datei eingefügt werden, die sequentielle Struktur
+der Datei bleibt erhalten. Die Assoziierungsprozedur 'sequential file' bewirkt:
+
+1) Falls die Ausgabedatei noch nicht existiert, wird sie angelegt.
+
+2) Falls es bereits eine Datei des Namens gibt, ist undefiniert wo positioniert ist. Die
+ erste Positionierung muß explizit vorgenommen werden!
+
+
+
+'col'
+ #on("b")#PROC col (FILE VAR f, INT CONST position) #off("b")#
+ Positionierung auf die Spalte 'position' innerhalb der aktuellen Zeile.
+
+ #on("b")#INT PROC col (FILE CONST f) #off("b")#
+ Liefert die aktuelle Position innerhalb der aktuellen Zeile.
+
+
+'down'
+ #on("b")#PROC down (FILE VAR f) #off("b")#
+ Positionieren um eine Zeile vorwärts.
+
+ #on("b")#PROC down (FILE VAR f, INT CONST number) #off("b")#
+ Positionieren um 'number' Zeilen vorwärts.
+
+
+'to line'
+ #on("b")#PROC to line (FILE VAR f, INT CONST number) #off("b")#
+ Positionierung auf die Zeile 'number'.
+
+
+'up'
+ #on("b")#PROC up (FILE VAR f) #off("b")#
+ Positionieren um eine Zeile rückwärts.
+
+ #on("b")#PROC up (FILE VAR f, INT CONST number) #off("b")#
+ Positionieren um 'number' Zeilen rückwärts.
+
+#page#
+'delete record'
+ #on("b")#PROC delete record (FILE VAR file) #off("b")#
+ Der aktuelle Satz der Datei 'file' wird gelöscht. Der folgende Satz wird der aktuelle
+ Satz.
+
+
+'insert record'
+ #on("b'PROC insert record (FILE VAR file) #off("b")#
+ 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).
+
+
+
+'read record'
+ #on("b")#PROC read record (FILE CONST file, TEXT VAR record) #off("b")#
+ Liest den aktuellen Satz der Datei 'file' in den TEXT 'record'. Die Position wird
+ dabei nicht verändert.
+
+
+
+'write record'
+ #on("b")#PROC write record (FILE VAR file, TEXT CONST record) #off("b")#
+ 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.
+
+
+#page#
+
+5.3.6 FILE -Ausschnitte
+
+Ähnlich den Editorfunktionen 'ESC RUBOUT' und 'ESC RUBIN', die erlauben ganze
+Abschnitte einer Datei zu löschen und das Gelöschte an anderer Stelle wiedereinzu­
+fügen, gibt es die Möglichkeit per Programm solche Segmente
+eines 'modify-FILEs' zu verschieben.
+
+
+'clear removed'
+ #on("b")#PROC clear removed (FILE VAR f) #off("b")#
+ Das mit 'remove' entfernte Segment wird gelöscht und nicht an anderer Stelle
+ eingefügt.
+
+
+'reinsert'
+ #on("b")#PROC reinsert (FILE VAR f) #off("b")#
+ Das mit 'remove' entfernte Segment wird vor die aktuelle Zeile wiedereingefügt.
+
+
+'remove'
+ #on("b")#PROC remove (FILE VAR f, INT CONST size) #off("b")#
+ Löscht 'size' Zeilen vor der aktuellen Position aus 'f'. Das Segment wird in einen
+ internen Puffer geschrieben.
+
+
+'reorganize'
+ #on("b")#PROC reorganize (TEXT CONST datei)#off("b")#
+ Reorganisation von 'datei'. Die durch Löschen und Einfügen aus vielen
+ Segmenten bestehende Datei wird zu einem Segment zusammengefügt, die
+ aktuelle Position ist danach das erste Zeichen der ersten Zeile.
+
+ Durch diese Prozedur kann ggf. Speicherplatz gespart werden.
+
+ #on("b")#PROC reorganize#off("b")#
+ Reorganisation der zuletzt bearbeiteten Datei.
+
+
+'segments'
+ #on("b")#PROC segments (FILE VAR f) #off("b")#
+ Liefert die Anzahl der Segmente von 'f'. Eine große Anzahl von Segmenten kann
+ langsamere Zugriffe zur Folge haben.
+
+#page#
+
+5.4 Suchen und Ersetzen in Textdateien
+
+Such- und Ersetzungsprozeduren können sowohl interaktiv beim Editieren (siehe
+dazu 3.3), als auch in Prozeduren, die auf FILEs (siehe 5.3) arbeiten, angewandt
+werden.
+
+Die dazu dienenden Prozeduren sind im Paket 'pattern match' enthalten. Mit 'Pattern
+Matching' (Muster treffen) wird ein Verfahren bezeichnet Gleichheit von Objekten
+anhand von Regeln, denen diese Objekte genügen, zu überprüfen.
+
+Da oft nach Texten gesucht werden muß, deren genaue Ausprägung nicht bekannt ist,
+oder deren Auftreten nur in einem bestimmten Zusammenhang interessiert, gibt es die
+Möglichkeit feststehende Textelemente mit Elementen ungewisser Ausprägung zu
+kombinieren, also Textmuster zu erzeugen.
+
+Um einen Text zu suchen, muß die Suchrichtung und der gesuchte Text oder ein
+Muster, welches diesen Text beschreibt, angegeben werden.
+
+- Aufbauen von Textmustern : + , - , OR , any , bound , notion
+
+- Suchen nach Textmustern : down , downety , up , uppety
+
+- Treffer registrieren : LIKE , UNLIKE , at , pattern found
+
+- Treffer herausnehmen : ** , match , matchend , matchpos ,
+ somefix , word
+
+- Ändern in Dateien : change
+
+
+Nach einem erfolgreichen Suchvorgang ist stets auf das erste Zeichen der zu such­
+enden Zeichenkette positioniert.
+
+
+Eine besondere Funktion kommt dem 'joker' zu: Dieses Symbol (Defaultwert: '*') steht
+für eine beliebige Zeichenkette beliebiger Länge. Insbesondere bei Ersetzungsaktionen
+in denen dieses Zeichen zur Musterbeschreibung verwendet wird, ist daher Vorsicht
+geboten und sorgfältig zu testen.
+
+#page#
+
+5.4.1 Aufbau von Textmustern
+
+'+'
+ #on("b")#TEXT OP + (TEXT CONST links, rechts) #off("b")#
+ Verkettung der Texte 'links' und 'rechts' zu 'linksrechts'. Falls das Ergebnis länger
+ als die maximal zulässige Textlänge ist, ist es undefiniert.
+
+ Wenn 'muster1' einen beliebigen Text finden sollte, ( Siehe: PROC any) wird das
+ Ende des von 'muster1' erkannten Textes durch den Anfang des von 'muster2'
+ erkannten Textes im Nachhinein definiert.
+
+
+
+'-'
+ #on("b")#TEXT OP - (TEXT CONST alphabet) #off("b")#
+ Der Operator liefert das zu 'alphabet' komplementäre Alphabet, also alle Zeichen
+ gemäß der EUMEL Codetabelle (5.2.4), die nicht in 'alphabet' enthalten sind.
+ Sinnvoll im Zusammenhang mit der Textprozedur 'any'.
+
+
+'OR'
+ #on("b")#TEXT OP OR (TEXT CONST links, rechts) #off("b")#
+ Liefert die Alternative von 'links' und 'rechts'. Die Reihenfolge spielt beim Suchen
+ keine Rolle.
+
+
+
+'any'
+ Die Textprozedur 'any' liefert einen unbekannten Text unbestimmter Länge.
+ Dieser Text sollte entweder durch festen Text sinnvoll eingegrenzt werden, oder
+ direkt eingeschränkt werden.
+
+
+ #on("b")#TEXT PROC any #off("b")#
+ Beschreibt einen beliebigen Text.
+
+ #on("b")#TEXT PROC any (INT CONST laenge) #off("b")#
+ Beschreibt einen beliebigen Text der angebenen Länge.
+
+
+ #on("b")#TEXT PROC any (TEXT CONST alphabet) #off("b")#
+ Beschreibt einen beliebigen Text, der nur aus Zeichen besteht, die in 'alphabet'
+ enthalten sind.
+
+
+ #on("b")#TEXT PROC any (INT CONST laenge, TEXT CONST alphabet) #off("b")#
+ Beschreibt einen Text der vorgegebenen Länge, der nur aus den in 'alphabet'
+ vorgegebenen Zeichen besteht.
+
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+ Die Textprozedur 'any' liefert einen unbekannten Text unbe­
+ stimmter Länge. Dieser Text sollte entweder durch festen Text
+ sinnvoll eingegrenzt werden, oder direkt eingeschränkt werden.
+gib kommando: D("D" OR "d" + any (2,"aeirs")
+ Sucht nach bestimmten Artikeln: 'der', 'die', 'das' etc.
+
+____________________________________________________________________________
+
+
+
+'bound'
+ #on("b")#TEXT PROC bound #off("b")#
+ Bezeichnet ein Muster der Länge null, das nur am Zeilenanfang oder am Zeilenen­
+ de gefunden wird. Ein Präfix 'bound' fordert, daß das gesuchte Muster in der
+ ersten Spalte beginnen muß, ein Postfix 'bound' fordert, daß das Muster mit dem
+ Zeilenende abschließt.
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+ Die Textprozedur 'any' liefert einen unbekannten Text unbe­
+ stimmter Länge. Dieser Text sollte entweder durch festen
+ Textsinnvoll eingegrenzt werden, oder direkt eingeschränkt
+ werden.
+gib kommando: U(bound + any (" "))
+
+____________________________________________________________________________
+
+
+
+ liefert Treffer bei eingerückten Zeilen.
+
+
+
+'notion'
+ #on("b")#PROC notion (TEXT CONST suchwort) #off("b")#
+ Mit dieser Prozedur kann ein #on("u")#Wort#off("u")# spezifiziert werden, nach dem gesucht werden
+ soll. Bei der Suche nach 'suchwort' wird nur dann ein Treffer geliefert, wenn
+ 'suchwort' als Wort, also begrenzt von ' ' (blank), '.' , ',' oder anderen Sonderzei­
+ chen ist.
+
+ #on("b")#PROC notion (TEXT CONST suchwort, INT CONST reg) #off("b")#
+ Wie oben, der Treffer wird im Register 'reg' gespeichert.
+
+#page#
+
+5.4.2 Suche nach Textmustern
+
+'down'
+ #on("b")#PROC down (FILE VAR f, TEXT CONST muster) #off("b")#
+ Suche nach 'muster' in der Datei 'f' in Richtung Dateiende. Wird 'muster' gefun­
+ den, ist die Position das erste Zeichen von 'muster'. 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.
+
+
+ #on("b")#PROC down (FILE VAR f, TEXT CONST muster, INT CONST number)#off("b")#
+ Wie obiges 'down', es wird aber maximal nur 'number'-Zeilen weit nach 'muster'
+ gesucht.
+
+
+
+'downety'
+ #on("b")#PROC downety (FILE VAR f, TEXT CONST muster) #off("b")#
+ Suche nach 'muster' in der Datei 'f' in Richtung Dateiende. Wird 'muster' gefun­
+ den, ist die Position das erste Zeichen von 'muster'. Andernfalls steht man auf
+ dem letzten Zeichen der Datei.
+
+ Achtung: 'downety' sucht (im Gegensatz zu 'down') vom aktuellen Zeichen an.
+ Daher muß explizit vorwärts positioniert werden.
+
+
+ #on("b")#PROC downety (FILE VAR f, TEXT CONST muster, INT CONST number) #off("b")#
+ Wie obiges 'downety', aber maximal nur 'number'-Zeilen weit.
+#page#
+'up'
+ #on("b")#PROC up (FILE VAR f, TEXT CONST muster) #off("b")#
+ Suche nach 'muster' in der Datei 'f' in Richtung Dateianfang. Wird 'muster'
+ gefunden, ist die Position das erste Zeichen von 'muster'. Andernfalls steht man
+ auf dem ersten Zeichen der Datei.
+
+ Achtung: 'up' sucht vom nächsten Zeichen links ab, so daß wiederholtes Suchen
+ keine Endlosschleife ergibt.
+
+
+ #on("b")#PROC up (FILE VAR f, TEXT CONST muster, INT CONST number)#off("b")#
+ Wie obiges 'up', aber maximal nur 'number'-Zeilen weit.
+
+
+
+'uppety'
+ #on("b")#PROC uppety (FILE VAR f, TEXT CONST muster) #off("b")#
+ Suche nach 'muster' in der Datei 'f' in Richtung Dateianfang. Wird 'muster'
+ gefunden, ist die Position das erste Zeichen von 'muster'. Andernfalls steht man
+ auf dem ersten Zeichen der Datei.
+
+ Achtung: 'uppety' sucht (im Gegensatz zu 'up') vom aktuellen Zeichen.
+
+
+ #on("b")#PROC uppety (FILE VAR f, TEXT CONST muster, INT CONST number)#off("b")#
+ Wie obiges 'uppety', aber maximal nur 'number'-Zeilen weit.
+
+#page#
+
+5.4.3 Treffer registrieren
+
+'LIKE'
+ #on("b")#BOOL OP LIKE (TEXT CONST text , muster) #off("b")#
+ Liefert TRUE, falls der Text 'text' 'muster' entspricht. In 'muster' kann das
+ Spezialzeichen '*' verwandt werden, das abkürzend für die Konkatenation mit
+ 'any' steht.
+
+ Daraus folgt, daß das Suchen oder Ersetzen des Zeichens '*' nur durch
+ any (1,"*") zu bewerkstelligen ist.
+
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+ \#Druckdateien aus Thesaurus löschen\#
+ gib kommando:"*.p" C ""
+ 16.04.87 "Handbuch teil1"
+ 04.05.87 "Handbuch teil1.p"
+ 16.04.87 "Handbuch teil2"
+ 06.05.87 "Handbuch teil2.p"
+
+____________________________________________________________________________
+
+
+
+ aber:
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+ \#Vordere Kommentarklammern löschen \#
+ gib kommando:"(" + any(1,"*") C ""
+ lernsequenz auf taste legen("a" , "archive") ;
+ (* lernsequenz auf taste legen("(" , ""91"") ; *)
+ (* lernsequenz auf taste legen(")" , ""93"") ; *)
+ kommando auf taste legen("P" , "print("""")"8""8""11"") .
+
+____________________________________________________________________________
+
+
+
+'UNLIKE'
+ #on("b")#BOOL OP UNLIKE (TEXT CONST text , muster) #off("b")#
+ Wirkt wie: '(NOT text LIKE muster)'
+#page#
+
+5.4.4 Treffer herausnehmen
+
+Mit Hilfe der 'Register' ist es möglich identifizierte Texte zwischenzuspeichern und in
+weiteren Aktionen weiterzuverwenden.
+
+
+'**'
+ #on("b")#TEXT OP ** (TEXT CONST muster, INT CONST register)#off("b")#
+ Der als 'muster' erkannte Text wird einem 'Register' mit der Nummer 'register'
+ zugeordnet. Es können 256 Register (1 bis 256) benutzt werden.
+
+
+'match'
+ #on("b")#TEXT PROC match (INT CONST nr) #off("b")#
+ Liefert den Text der dem Register 'nr' zuletzt zugeordnet wurde.
+
+
+'matchpos'
+ #on("b")#INT PROC matchpos (INT CONST nummer) #off("b")#
+ Liefert die Spaltennummer, auf der das dem Register 'nummer' zugeordnete Mu­
+ ster in der Zeile beginnt.
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+
+ gib kommando:D("file"+any+"("+(any ** (1)...
+
+____________________________________________________________________________
+#page#
+
+5.4.5 Ändern in Dateien
+
+'change'
+ #on("b")#PROC change (FILE VAR datei, INT CONST von, bis , TEXT CONST neuertext)#off("b")#
+ In der Datei wird in der aktuellen Zeile in den Ausschnitt zwischen 'von' und 'bis'
+ der Text 'neuertext' eingesetzt.
+
+ entspricht:
+
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+ FILE VAR file := sequential file (modify, name)
+ TEXT VAR zeile;
+ .
+ .
+ read record (file ,zeile);
+ change (zeile, von, bis ,"neuertext");
+ write record (file, zeile);
+ .
+
+____________________________________________________________________________
+
+#page#
+
+5.4.6 Editor-Prozeduren
+
+'edit'
+ #on("b")#edit (TEXT CONST datei)#off("b")#
+ Editieren der Datei 'datei'. Das Editorfenster ist maximal groß (von 1,1 bis
+ max,max). Der Standard-Kommandointerpreter ist gültig, so daß Eingaben, die
+ mit #schl("ESC")# beginnen, interpretiert werden, wie in 3.4 'Vorbelegte Tasten' beschrie­
+ ben.
+
+ #on("b")#edit#off("b")#
+ Wie oben, editiert wird die Datei mit dem zuletzt benutzten Namen.
+
+ #on("b")#edit (THESAURUS CONST thes)#off("b")#
+ Wie oben, editiert werden alle Dateien, deren Namen im Thesaurus 'thes' enthal­
+ ten sind.
+
+ #on("b")#edit (TEXT CONST datei, INT CONST von x, von y, bis x, bis y)#off("b")#
+ Editieren der Datei 'datei'. Das Editorfenster hat die linke obere Ecke bei 'von x,
+ von y' und die rechte untere Ecke bei 'bis x, bis y'.
+
+ #on("b")#edit (FILE VAR f)#off("b")#
+ Editieren der als 'sequential file' assoziierten Textdatei 'f'.
+
+ #on("b")#edit (FILE VAR, INT CONST von x, von y, bis x, bis y)#off("b")#
+ Editieren der als 'sequential file' assoziierten Textdatei in einem Fenster mit der
+ linken, oberen Ecke 'von x, von y' und der rechten, unteren Ecke 'bis x, bis y'.
+
+ #on("b")#edit (FILE VAR f, TEXT CONST res,
+ PROC (TEXT CONST) kdo interpreter)#off("b")#
+ Editieren der als 'sequential file' assoziierten Textdatei 'f'. In 'res' werden reser­
+ vierte Zeichen übergeben, die von der Prozedur 'kdo interpreter' als Kommandos
+ interpretiert werden, wenn sie als ESC-Sequenz eingegeben werden.
+ Beispiel : #schl("ESC ")# #schl("e")#
+
+#page#
+'editget'
+ #on("b")#editget (TEXT VAR ausgabe) #off("b")#
+ Aufruf des Zeileneditor. An der aktuellen Cursorposition wird eine Zeile ausgegeben in
+ der 'ausgabe' steht. Für diese Zeile stehen alle Editiermöglichkeiten zur
+ Verfügung, 'ausgabe' kann also beliebig überschrieben, ergänzt etc. werden. Die
+ Eingabe wird durch #schl("CR")# abgeschlossen. Im Gegensatz zur Prozedur 'get' ist auch
+ eine leere Eingabe möglich.
+
+ #on("b")#editget (TEXT VAR ausgabe, INT CONST zeile, INT CONST scroll,
+ TEXT CONST sep, TEXT CONST res, TEXT VAR exit) #off("b")#
+ Wie oben, die Zeilenlänge ist jedoch auf 'zeile' Zeichen begrenzt. Die Eingabe
+ wird durch #schl("CR")# oder durch eine Cursorbewegung über die Position 'zeile' hinaus
+ abgeschlossen.
+
+ Die Angabe 'scroll' setzt die Breite des Zeilenfensters fest, wird diese Breite
+ überschritten, so wird 'ausgabe' gerollt.
+
+ In 'sep' (Separator) können Zeichen festgesetzt werden, mit denen die Eingabe
+ beendet wird (zusätzlich zu CR !).
+
+ In 'res' (reservierte Tasten) können Tasten festgelegt werden, die in Verbindung
+ mit <ESC> die Eingabe beenden.
+
+ Wurde der Zeileneditor durch einen Separator verlassen, so steht in 'exit' dieses
+ Zeichen. Falls der Zeileneditor durch eine reservierte Taste verlassen, so enthält
+ 'exit' 'ESC' und die Taste.
+
+ #on("b")#editget (TEXT VAR ausgabe, INT CONST zeile, INT CONST scroll)#off("b")#
+ Bedeutung der Parameter siehe oben.
+
+ #on("b")#editget (TEXT VAR ausgabe, TEXT CONST sep, TEXT CONST res,
+ TEXT VAR exit) #off("b")#
+ Bedeutung der Parameter siehe oben.
+
+ #on("b")#editget (TEXT VAR ausgabe, INT CONST zeile, TEXT VAR exit) #off("b")#
+ Bedeutung der Parameter siehe oben.
+#page#
+
+5.4.7 Sortierung von Textdateien
+
+Für die Sortierung von Textdateien gibt es zwei Sortierprogramme:
+
+- Sortierung nach ASCII : sort
+
+- Sortierung nach
+ deutschem Alphabet : lexsort
+
+
+'sort'
+ #on("b")#PROC sort (TEXT CONST datei) #off("b")#
+ Diese Prozedur sortiert die Datei 'datei' zeilenweise gemäß der von der EUMEL
+ Codetabelle (siehe 5.2.4) vorgegebenen Reihenfolge. Zur Sortierung werden die
+ Zeilen vom ersten Zeichen der Zeile beginnend, zeichenweise verglichen und
+ dementsprechend sortiert.
+
+ #on("b")#PROC sort (TEXT CONST datei, INT CONST position) #off("b")#
+ Sortierkriterien wie oben, jedoch wird bei Vergleich und Sortierung der Satz erst
+ ab der Position 'position' beachtet. Sortiert wird der ganze Satz!
+
+
+'lex sort'
+ #on("b")#PROC lex sort (TEXT CONST datei) #off("b")#
+ Zeilenweise Sortierung nach lexikographischer Reihenfolge gemäß DIN 5007. Zu
+ den Vergleichen werden die Operatoren LEXEQUAL, LEXGRATER,
+ LEXGRATEREQUAL benutzt (siehe 5.2.4).
+
+ #on("b")#PROC lex sort (TEXT CONST datei, INT CONST position) #off("b")#
+ Lexikalische Sortierung durch Vergleich ab Position 'position'.
+
+#page#
+
+5.4.8 Prozeduren auf Datenräumen
+
+Neben den Textdateien gibt es im EUMEL-System den Typ Datenraum, der Objekte
+jeglichen Typs aufnehmen kann und direkten Zugriff auf die Objekte gewährt (siehe
+2.9.2).
+
+Für Objekte von Type Datenraum (nicht für die in Datenräumen enthaltenen Objekte!)
+existieren folgende Standardprozeduren:
+
+
+':='
+ #on("b")#OP := ( DATASPACE VAR ds1, DATASPACE CONST ds2)#off("b")#
+ Der Datenraum 'ds1' wird als Kopie von 'ds2' angelegt. Es handelt sich zunächst
+ um eine logische Kopie, eine physische Kopie wird erst nach einem Schreibzugriff
+ auf 'ds1' oder 'ds2' nötig.
+
+
+'new'
+ #on("b")#DATASPACE PROC new (TEXT CONST dsname) #off("b")#
+ Liefert einen neuen Datenraum namens 'dsname'.
+
+____________________________________________________________________________
+
+ DATASPACE VAR ds := new ("datenraum")
+ (* ergibt zwei Datenräume 'ds' und 'datenraum'! *)
+
+____________________________________________________________________________
+
+
+
+'nilspace'
+ #on("b")#DATASPACE PROC nilspace#off("b")#
+ Der 'nilspace' ist ein leerer Datenraum, der ausschließlich als Quelle zum Kopie­
+ ren bei der Initialisierung Verwendung finden darf.
+
+
+'old'
+ #on("b")#DATASPACE PROC old (TEXT CONST dsname) #off("b")#
+ Liefert einen bereits existierenden Datenraum (oder auch eine Datei) mit dem
+ Namen 'dsname'.
+
+ FEHLER : "dsname" gibt es nicht
+
+
+'type'
+ #on("b")#PROC type (DATASPACE CONST ds, INT CONST typ)#off("b")#
+ Der Datenraum 'ds' erhält den frei wählbaren Schlüssel 'typ'. Es muß eine positive
+ Zahl gewählt werden. Der Datenraum muß zum Zeitpunkt der Typzuweisung an
+ ein BOUND Objekt gekoppelt (gewesen) sein.
+
+ #on("b")#INT PROC type (DATASPACE CONST ds)#off("b")#
+ Liefert den Schlüssel des Datenraums 'ds'. Falls 'ds' nie an ein BOUND Objekt
+ gekoppelt war, liefert die Prozedur einen Wert < 0, sonst 0 (keine Zuweisung
+ erfolgt) oder die zugewiesene Typnummer.
+
+
+'dataspaces'
+ #on("b")#INT PROC dataspaces (TASK CONST task) #off("b")#
+ Liefert die Anzahl der Datenräume der Task 'task'.
+
+ #on("b")#INT PROC dataspaces #off("b")#
+ Anzahl der Datenräume von 'myself'.
+
+
+'ds pages'
+ #on("b")#INT PROC ds pages (DATASPACE CONST ds)#off("b")#
+ Liefert die Anzahl der durch 'ds' belegten Seiten (je 512 Byte).
+
+
+'storage'
+ #on("b")#INT PROC storage (DATASPACE CONST ds)#off("b")#
+ Liefert den von 'ds' belegten Speicherplatz in KB.
+
+#page#
+'copy'
+ #on("b")#PROC copy (DATASPACE CONST ds, TEXT CONST datei) #off("b")#
+ Eine neue Datei mit dem Namen 'datei' wird angelegt. Der Inhalt der Datei ist eine
+ Kopie des Inhalts des Datenraumes 'ds'.
+
+
+'forget'
+ #on("b")#PROC forget (DATASPACE CONST ds)#off("b")#
+ Der Datenraum 'ds' wird gelöscht#u#1)#e#.
+
+#foot#
+
+ 1) Durch diese Prozedur steht nicht unmittelbar mehr freier Speicherplatz zur
+ Verfügung. Die physische Räumung von Speicherplatz erfolgt durch die
+ 'Müllabfuhr' bei einem Fixpunkt.
+#end#
+
+'fetch'
+ #on("b")#PROC fetch (DATASPACE CONST ziel, TEXT CONST datei,
+ TASK CONST manager) #off("b")#
+ Aus der Task 'manager' wird der Datenraum der Datei 'datei' in den eigenen
+ Datenraum 'ziel' kopiert.
+
+
+'save'
+ #on("b")#PROC save (DATASPACE CONST quelle, TEXT CONST datei,
+ TASK CONST manager) #off("b")#
+ Der eigene Datenraum 'quelle' wird in die Datei 'datei' in der Task 'manager'
+ kopiert.
+#page#
+
+5.5 Eingabe/Ausgabe
+
+- Eingabesteuerzeichen : HOP , � � � � , TAB , RUBIN , RUBOUT
+ CR , MARK , ESC
+
+- Ausgabesteuerzeichen : HOME , � � � � , CL EOP , CL EOL
+ CPOS , BELL , CR , ENDMARK , BEGINMARK
+
+- Positionierung : cursor , get cursor , line , page
+
+- Eingabe : get , getline , inchar , incharety
+
+- Ausgabe : cout , out , out subtext , put , putline ,
+ TIMESOUT , write
+
+- Kontrolle : online , pause , sysin , sysout
+
+- Zeitmessung : clock , date , day , hour , pause , time
+ time of day
+
+#page#
+
+5.5.1 E/A auf Bildschirm
+
+Steuerzeichen und Standardprozeduren zur Ein- Ausgabe am Bildschirm werden
+zur Steuerung des Dialogverhaltens von Prozeduren benutzt.
+
+
+5.5.1.1 Eingabesteuerzeichen
+Eingabesteuerzeichen werden durch die Funktionstasten (s. 3.2) erzeugt. Die Wirkung
+der Tasten ist ebenfalls an dieser Stelle beschrieben.
+
+Durch die Tasten werden folgende Codes an Programme gegeben:
+
+Codierung I Bezeichnung
+-----------+--------------
+HOP I 1
+RECHTS I 2
+OBEN I 3
+LINKS I 8
+TAB I 9
+UNTEN I 10
+RUBIN I 11
+RUBOUT I 12
+CR I 13
+MARK I 16
+ESC I 27
+
+
+#page#
+
+5.5.1.2 Ausgabesteuerzeichen
+
+Die Ausgabe dieser Zeichen bewirkt folgendes Verhalten der Bildschirmausgabe.
+
+Code I Name I Wirkung
+-----+-------------+-------------------------------------------------------
+ 0 I NUL I keine Wirkung
+ 1 I HOME I Cursor in die linke obere Ecke setzen (Position 0,0!)
+ 2 I RECHTS I Cursor eine Stelle nach rechts setzen
+ 3 I OBEN I Cursor eine Zeile höher setzen
+ 4 I CL EOP I Rest der Seite löschen
+ 5 I CL EOL I Rest der Zeile löschen
+ 6 I CPOS I Cursor setzen, nächstes Ausgabezeichen bestimmt die
+ I I y-Position, das darauf folgende die x-Position.
+ 7 I BELL I akustisches Signal
+ 8 I LINKS I Cursor eine Stelle nach links setzen
+10 I UNTEN I Cursor eine Stelle nach unten setzen
+13 I CR I Cursor an den Anfang der nächsten Zeile setzen
+14 I ENDMARK I Ende des markierten Bereichs
+15 I BEGINMARK I Anfang des markierten Bereichs
+
+
+
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+ TEXT VAR ausgabe := (""7""15"V O R S I C H T"14"7"");
+ out(ausgabe);
+
+____________________________________________________________________________
+
+#page#
+
+5.5.1.3 Positionierung
+
+'cursor'
+ #on("b")#PROC cursor (INT CONST column, row) #off("b")#
+ 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äteab­
+ hängig.
+
+
+
+'get cursor'
+ #on("b")#PROC get cursor (INT VAR x, y) #off("b")#
+ Erfragung der aktuellen Cursor-Position. Die Koordinaten des Cursors 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 Prozedur '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).
+
+
+'line'
+ #on("b")#PROC line #off("b")#
+ Es wird zum Anfang einer neuen Zeile positioniert.
+
+ #on("b")#PROC line (INT CONST number) #off("b")#
+ Es werden 'number' Zeilenwechsel vorgenommen.
+
+
+'page'
+ #on("b")#PROC page #off("b")#
+ Es wird zum Anfang einer neuen Seite positioniert (hier: linke obere Ecke (Position
+ 1,1 !) des Bildschirms, wobei der Bildschirm gelöscht wird).
+
+#page#
+
+5.5.1.4 Eingabe
+
+
+Grundlegende Prozeduren
+Die folgenden Prozeduren dienen ausschließlich der Eingabe vom Terminal.
+
+'editget'
+ Siehe 5.4.6
+
+
+'getchar'
+ #on("b")#PROC getchar (TEXT VAR zeichen)#off("b")#
+ Liest genau ein Zeichen von der Tastatur und schreibt es in die Variable 'zeichen'.
+
+
+'inchar'
+ #on("b")#PROC inchar (TEXT VAR character) #off("b")#
+ Wartet solange, bis ein Zeichen von der Tastatur eingegeben wird, und schreibt
+ dieses Zeichen in die Variable 'character'.
+
+
+'incharety'
+ #on("b")#TEXT PROC incharety #off("b")#
+ Versucht, ein Zeichen von der Tastatur zu lesen. Wurde kein Zeichen eingegeben,
+ wird niltext geliefert.
+
+ #on("b")#TEXT PROC incharety (INT CONST time limit) #off("b")#
+ Versucht, ein Zeichen vom Bildschirm zu lesen. Dabei wird maximal eine 'time
+ limit' lange Zeit auf das Zeichen gewartet (gemessen in Zehntel-Sekunden).
+
+#page#
+
+Umleitbare Eingabeprozeduren
+Die folgenden Eingabeprozeduren lesen ebenfalls vom Terminal, die Eingabequelle
+kann jedoch durch die Prozedur 'sysin' umgestellt werden. Falls in 'sysin' eine Datei
+angegeben wird wird die Eingabe statt vom Terminal aus dieser Datei gelesen.
+
+
+'sysin'
+ #on("b")#PROC sysin (TEXT CONST file name) #off("b")#
+ Eingabe-Routinen lesen nicht mehr vom Benutzer-Terminal, sondern aus der
+ Datei 'file name'.
+
+ #on("b")#TEXT PROC sysin #off("b")#
+ Liefert den Namen der eingestellten 'sysin'-Datei. "" bezeichnet das Benutzer-
+ Terminal.
+
+
+'get'
+ #on("b")#PROC get (INT VAR number) #off("b")#
+ Einlesen eines INT-Wertes vom Bildschirm. Der einzulesende INT-Wert kann
+ bei der Eingabe vom Terminal editiert werden.
+
+ #on("b")#PROC get (REAL VAR value) #off("b")#
+ Einlesen eines REAL-Wertes vom Bildschirm. Der einzulesende REAL-Wert
+ kann bei der Eingabe vom Terminal editiert werden.
+
+ #on("b")#PROC get (TEXT VAR word) #off("b")#
+ Liest einen Text in die Variable 'word' mit maximal 255 Zeichen. Es werden
+ solange Zeichen vom Terminal gelesen, bis ein Leerzeichen oder #schl("CR")# eingegeben
+ wird. Dabei werden führende Leerzeichen übergeben. Der einzulesende Text
+ kann bei der Eingabe editiert werden. Eine leere Eingabe ist nicht erlaubt.
+
+ #on("b")#PROC get (TEXT VAR word, INT CONST laenge) #off("b")#
+ Liest einen Text vom Bildschirm mit der Länge 'laenge' oder bis #schl("CR")# eingegeben
+ wird. Der einzulesende Wert kann bei der Eingabe editiert werden.
+
+ #on("b")#PROC get (TEXT VAR word, TEXT CONST separator) #off("b")#
+ Liest einen Text vom Bildschirm, bis ein Zeichen 'separator' angetroffen oder #schl("CR")#
+ eingegeben wird. Der einzulesende Text kann bei der Eingabe editiert werden.
+
+
+'getline'
+ #on("b")#PROC get line (TEXT VAR line) #off("b")#
+ Das System wartet auf eine Zeile vom Bildschirm (max. 255 Zeichen). #schl("CR")# been­
+ det die Eingabe.
+
+#page#
+
+5.5.1.5 Ausgabe
+
+
+Grundlegende Prozeduren
+Die folgenden Prozeduren dienen ausschließlich der Ausgabe auf das Terminal.
+
+
+'cout'
+ #on("b")#PROC cout (INT CONST number) #off("b")#
+ Schreibt 'number' an die aktuelle Cursor-Position auf den Bildschirm. Anschlie­
+ ßend wird an diese Position wieder zurück positioniert. 'number' muß > 0 sein.
+ Paßt 'number' nicht mehr auf die Zeile, so ist die Wirkung von 'cout' nicht de­
+ finiert. '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.
+
+
+'out'
+ #on("b")#PROC out (TEXT CONST text) #off("b")#
+ Ausgabe eines Textes auf dem Bildschirm. Im Unterschied zu 'put' wird kein
+ Blank an den ausgegebenen Text angefügt.
+
+
+
+'out subtext'
+ #on("b")#PROC out subtext (TEXT CONST source, INT CONST from) #off("b")#
+ Ausgabe eines Teiltextes von 'source' von der Position 'from' bis Textende. Es
+ wird keine Aktion vorgenommen für
+
+
+ from > LENGTH source
+
+
+ #on("b")#PROC out subtext (TEXT CONST source, INT CONST from, to)#off("b")#
+ Ausgabe eines Teiltextes von 'source' von der Position 'from' bis zur Position 'to'.
+ Für
+
+
+ to > LENGTH source
+
+
+ wird out subtext (source, from) ausgeführt.
+
+ #on("b")#PROC out text (TEXT CONST source, INT CONST from, to) #off("b")#
+ Ausgabe eines Teiltextes von 'source' von der Position 'from' bis zur Position 'to'.
+ Für
+
+
+ to > LENGTH source
+
+
+ wird für die fehlenden Zeichen Blanks ausgegeben.
+
+
+
+'TIMESOUT'
+ #on("b")#OP TIMESOUT (INT CONST times, TEXT CONST text) #off("b")#
+ 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
+
+
+#page#
+
+Umleitbare Ausgabeprozeduren
+Die folgenden Ausgabeprozeduren schreiben ebenfalls auf das Terminal, die Ausgabe
+kann jedoch durch die Prozedur 'sysout' umgeleitet werden. Falls in 'sysout' eine
+Datei angegeben wird wird die Ausgabe statt zum
+Terminal in die angegebene Datei geleitet.
+
+
+'sysout'
+ #on("b")#PROC sysout (TEXT CONST file name) #off("b")#
+ Ausgabe-Routinen gehen nicht mehr zum Benutzer-Terminal, sondern in die
+ Datei 'file name'.
+
+ #on("b")#TEXT PROC sysout #off("b")#
+ Liefert den Namen der eingestellten 'sysout'-Datei. "" bezeichnet das Benut­
+ zer-Terminal.
+
+
+'line'
+ #on("b")#line#off("b")#
+ Positionierung auf den Anfang einer neuen Ausgabezeile.
+
+ #on("b")#line (INT CONST faktor)#off("b")#
+ Nächste Ausgabezeile um 'faktor' Zeilen weiter positionieren.
+
+
+'put'
+ #on("b")#PROC put (INT CONST number) #off("b")#
+ Ausgabe eines INT-Wertes auf dem Bildschirm. Anschließend wird ein Leer­
+ zeichen ausgegeben.
+
+ #on("b")#PROC put (REAL CONST real) #off("b")#
+ Ausgabe eines REAL-Wertes auf dem Bildschirm. Anschließend wird ein Leer­
+ zeichen ausgegeben.
+
+ #on("b")#PROC put (TEXT CONST text) #off("b")#
+ Ausgabe eines Textes auf dem Bildschirm. Nach der Ausgabe von 'text' wird ein
+ Blank ausgegeben, um nachfolgenden Ausgaben auf der gleichen Zeile voneinan­
+ der zu trennen. Hardwareabhängig sind die Aktionen, wenn eine Ausgabe über
+ eine Zeilengrenze (hier: Bildschirmzeile) vorgenommen wird. Meist wird die Ausga­
+ be auf der nächsten Zeile fortgesetzt.
+
+
+'putline'
+ #on("b")#PROC putline (TEXT CONST text) #off("b")#
+ 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 Ausgabe über eine Zeilengrenze (hier: Bildschirm­
+ zeile) vorgenommen wird. Meist wird die Ausgabe auf der nächsten Zeile fort­
+ gesetzt.
+
+
+'write'
+ #on("b")#PROC write (TEXT CONST text) #off("b")#
+ Gibt 'text' ohne Trennblank aus ('put' mit Trennblank).
+
+#page#
+
+5.5.1.6 Kontrolle
+
+'online'
+ #on("b")#BOOL PROC online #off("b")#
+ Liefert TRUE, wenn die Task mit einem Terminal gekoppelt ist.
+
+
+'pause'
+ #on("b")#PROC pause (INT CONST time limit) #off("b")#
+ Wartet 'time limit' in Zehntel-Sekunden. Bei negativen Werten ist die Wirkung
+ nicht definiert. Die Wartezeit wird nicht nur durch das Erreichen der Grenze ab­
+ gebrochen, sondern auch durch die Eingabe eines beliebigen Zeichens.
+
+ #on("b")#PROC pause#off("b")#
+ Wartet bis zur Eingabe eines beliebigen Zeichens.
+
+
+#page#
+
+5.5.2 Zeitmessung
+
+'clock'
+ #on("b")#REAL PROC clock (INT CONST index) #off("b")#
+ 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 Realzeituhr 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' (vergl. 5- #topage("date")# ) (für den aktuellen Tag) und 'time of day' (Uhrzeit, vergl.
+ 5-#topage("time")#) 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' (vergl. 5- #topage("time")#) verwenden. Beispiel:
+
+____________________________________________________________________________
+
+ ........................... Beispiel ..........................
+ REAL CONST anfang :: clock (0);
+ berechnungen;
+ REAL CONST ende :: clock (0);
+ put ("benoetigte CPU-Zeit in Sek:");
+ put (time (ende - anfang))
+
+____________________________________________________________________________
+#page#
+'date'
+#goalpage("date")#
+ #on("b")#TEXT PROC date (REAL CONST time) #off("b")#
+ 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.87 *)
+
+____________________________________________________________________________
+
+
+ #on("b")#REAL PROC date (TEXT CONST datum) #off("b")#
+ 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.87")) (* 6.273539e10 *)
+
+____________________________________________________________________________
+
+
+ #on("b")#TEXT PROC date#off("b")#
+ Liefert das Tagesdatum. Wirkt wie 'date (clock (1))', ist jedoch erheblich schneller.
+
+
+
+'day'
+ #on("b")#REAL CONST day #off("b")#
+ Liefert die Anzahl der Sekunden eines Tages (86 400.0).
+
+
+
+'hour'
+ #on("b")#REAL CONST hour #off("b")#
+ Liefert die Anzahl der Sekunden einer Stunde (3600.0).
+
+
+
+'pause'
+ #on("b")#PROC pause (INT CONST time limit) #off("b")#
+ Wartet 'time limit' in Zehntel-Sekunden. Bei negativen Werten ist die Wirkung
+ nicht definiert. Die Wartezeit wird nicht nur durch das Erreichen der Grenze ab­
+ gebrochen, sondern auch durch die Eingabe eines beliebigen Zeichens.
+
+
+
+'time'
+#goalpage("time")#
+ #on("b")#TEXT PROC time (REAL CONST time) #off("b")#
+ Konvertierungsprozedur für die Zeiten der CPU-Zeituhr. Liefert die Zeiten in der
+ Form 'hh:mm:ss.s'. Vergl. dazu 'clock'.
+
+ #on("b")#TEXT PROC time (REAL CONST value, INT CONST laenge) #off("b")#
+ Konvertiert die Zeit in externe Darstellung. Für die 'laenge'-Werte ergibt sich:
+
+
+ laenge = 10 (* hh:mm:ss.s *)
+ laenge = 12 (* hhhh:mm:ss.s *)
+
+
+
+ #on("b")#REAL PROC time (TEXT CONST time) #off("b")#
+ Konvertierungsprozedur für Texte der CPU-Zeituhr in REAL-Werte.
+
+
+
+'time of day'
+ #on("b")#TEXT PROC time of day (REAL CONST time) #off("b")#
+ 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 *)
+
+____________________________________________________________________________
+
+
+ #on("b")#TEXT PROC time of day #off("b")#
+ Liefert die aktuelle Tageszeit. Entspricht
+
+____________________________________________________________________________
+
+ time of day (clock (1))
+
+____________________________________________________________________________
+#page#
+
+5.6 Scanner
+
+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
+
+
+ #ib#scan#ie#
+
+
+in den Scanner "hineingesteckt" werden. Mit der Prozedur
+
+
+ #ib#next symbol#ie#
+
+
+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" gemel­
+det. 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
+
+
+ #ib#continue scan#ie#
+
+
+verwandt. Sie setzt im letzten Scan-Zustand (z.B. Kommentar oder TEXT-Deno­
+ter) 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.
+
+____________________________________________________________________________
+
+ 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.
+
+____________________________________________________________________________
+
+#page#
+
+Scanner-Kommandos
+
+
+'continue scan'
+ #on("b")#PROC continue scan (TEXT CONST scan text) #off("b")#
+ 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' eingeleitet
+ werden!
+
+'next symbol'
+ #on("b")#PROC next symbol (TEXT VAR symbol, INT VAR type) #off("b")#
+ 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 abgeschnitten. Leerzeichen oder Kommentare
+ spielen in "tags" oder "numbers" keine Rolle. Zwischen Symbolen spielen Leer­
+ zeichen 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 innerhalb eines TEXT-Denoters
+ gefunden, so wird der schon analysierte Teil des Denoters und 'within text' gelie­
+ fert.
+
+ #on("b")#PROC next symbol (TEXT VAR symbol) #off("b")#
+ s.o. Es wird aber nur der Text des Symbols (ohne Typ) geliefert.
+
+ #on("b")#PROC next symbol (FILE VAR f, TEXT CONST symbol) #off("b")#
+ Arbeitet wie obige Prozeduren, jedoch auf einen FILE.
+
+ #on("b")#PROC next symbol (FILE VAR f, TEXT CONST symbol, INT VAR type)#off("b")#
+ Arbeitet wie obige Prozeduren, jedoch auf einen FILE.
+
+
+'scan'
+ #on("b")#PROC scan (TEXT CONST scan text) #off("b")#
+ 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.
+
+ #on("b")#PROC scan (FILE VAR f) #off("b")#
+ Wie obige Prozedur, jedoch auf einen FILE. Die zu scannende Zeile ist die näch­
+ ste Zeile im FILE 'f' ('scan' macht zuerst ein 'getline').
+
diff --git a/doc/programming/programmierhandbuch.6 b/doc/programming/programmierhandbuch.6
new file mode 100644
index 0000000..ce11f6f
--- /dev/null
+++ b/doc/programming/programmierhandbuch.6
@@ -0,0 +1,1441 @@
+#pagenr("%",1)##setcount(1)##block##pageblock#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#TEIL 6 : Das Archiv 'std.zusatz'
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+6 - % #right#GMD
+#end#
+#bottomodd#
+#center#____________________________________________________________
+GMD #right#6 - %
+#end#
+
+TEIL 6: Das Archiv 'std.zusatz'
+
+Das Archiv 'std.zusatz' enthält Pakete, die nur bei Bedarf insertiert werden sollen.
+Eine Einbindung in das EUMEL Grundsystem würde dieses ungebührlich unfangreich
+machen.
+
+Das Archiv enthält zusätzliche Software für:
+
+- mathematische Operationen : complex , longint , vector , matrix
+
+- Analyse : reporter , referencer
+
+- Taschenrechnerfunktion
+ zur Editor-Erweiterung : TeCal , TeCal Auskunft
+
+
+#page#
+
+6.1. Erweiterungen um
+ Mathematische Operationen
+
+
+6.1.1 COMPLEX
+
+Das Packet COMPLEX erweitert das System um den Datentyp COMPLEX (komplexe
+Zahlen) und Operationen auf komplexen Zahlen. Folgende Operationen stehen für
+COMPLEX zur Verfügung:
+
+- Einfache Operatoren : := , = , <> , + ,- , *
+
+- Eingabe/Ausgabe : get , put
+
+- Denotierungsprozedur : complex , complex i , complex one , com­
+ plex zero
+
+- Komponenten : real part , imag part
+
+- bes. Funktionen : ABS , CONJ , phi , dphi , sqrt
+
+#page#
+
+COMPLEX Operationen
+
+
+'TYPE COMPLEX'
+ Komplexe Zahl, bestehend aud Realteil 're' und Imaginärteil 'im'.
+
+
+':='
+ #on("b")#OP := (COMPLEX VAR a, COMPLEX CONST b) #off("b")#
+ Zuweisung.
+
+
+'='
+ #on("b")#BOOL OP = (COMPLEX CONST a, b) #off("b")#
+ Vergleich von 'a' und 'b' auf Gleichheit.
+
+
+'<>'
+ #on("b")#BOOL OP <> (COMPLEX CONST a, b) #off("b")#
+ Vergleich von 'a' und 'b' auf Ungleichheit.
+
+
+'+'
+ #on("b")#COMPLEX OP + (COMPLEX CONST a, b) #off("b")#
+ Summe von 'a' und 'b'.
+
+
+'-'
+ #on("b")#COMPLEX OP - (COMPLEX CONST a, b) #off("b")#
+ Differenz von 'a' und 'b'.
+
+
+'*'
+ #on("b")#COMPLEX OP * (COMPLEX CONST a, b) #off("b")#
+ Multiplikation von 'a' mit 'b'.
+
+
+'/'
+ #on("b")#COMPLEX OP / (COMPLEX CONST a, b) #off("b")#
+ Division von 'a' mit 'b'.
+
+#page#
+'get'
+ #on("b")#PROC get (COMPLEX VAR a) #off("b")#
+ Einlesen eines komplexen Wertes vom Bildschirm in der Form zweier REAL-De­
+ noter. Die Eingabe kann editiert werden.
+
+
+'put'
+ #on("b")#PROC put (COMPLEX CONST a) #off("b")#
+ Ausgabe eines komplexen Wertes auf dem Bildschirm in Form zweier REAL-
+ Werte. Hinter jedem REAL-Wert wird ein Leerzeichen angefügt.
+
+
+'complex'
+ #on("b")#COMPLEX PROC complex (REAL CONST re, im) #off("b")#
+ Denotierungsprozedur. Angabe in kartesischen Koordinaten.
+
+
+'complex i'
+ #on("b")#COMPLEX PROC complex i #off("b")#
+ Denotierungsprozedur für den komplexen Wert '0.0 + i 1.0'.
+
+
+'complex one'
+ #on("b")#COMPLEX PROC complex one #off("b")#
+ Denotierungsprozedur für den komplexen Wert '1.0 + i 0.0'.
+
+
+'complex zero'
+ #on("b")#COMPLEX PROC complex zero #off("b")#
+ Denotierungsprozedur für den komplexen Wert '0.0 + i 0.0'.
+
+
+'imag part'
+ #on("b")#REAL PROC imag part (COMPLEX CONST number) #off("b")#
+ Liefert den Imaginärteil des komplexen Wertes 'number'.
+
+
+'real part'
+ #on("b")#REAL PROC real part (COMPLEX CONST number) #off("b")#
+ Liefert den Real-Teil des komplexen Wertes 'number'.
+
+
+'ABS'
+ #on("b")#REAL OP ABS (COMPLEX CONST x) #off("b")#
+ REAL-Betrag von 'x'.
+
+
+'CONJ'
+ #on("b")#COMPLEX OP CONJ (COMPLEX CONST number) #off("b")#
+ Liefert den konjugiert komplexen Wert von 'number'.
+
+
+'dphi'
+ #on("b")#REAL PROC dphi (COMPLEX CONST x) #off("b")#
+ Winkel von 'x' (Polardarstellung).
+
+
+'phi'
+ #on("b")#REAL PROC phi (COMPLEX CONST x) #off("b")#
+ Winkel von 'x' (Polardarstellung) in Radiant.
+
+
+'sqrt'
+ #on("b")#COMPLEX PROC sqrt (COMPLEX CONST x) #off("b")#
+ Wurzelfunktion für komplexe Werte.
+
+#page#
+
+6.1.2 LONGINT
+
+LONGINT ist ein Datentyp, für den (fast) alle Prozeduren und Operatoren des Daten­
+typs 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:
+
+- Operatoren : := , = , <> , < , <= ,> , >= , + , - , * ,
+ ** ,
+ ABS , DECR , DIV , INCR , MOD , SIGN
+
+- Eingabe/Ausgabe : get , put
+
+
+- Math. Prozeduren : abs , int , longint , max , max logint , min ,
+ random , sign , text , zero
+
+
+
+LONGINT-Operationen
+
+
+'TYPE LONGINT'
+ Datentyp
+
+
+':='
+ #on("b")#OP := (LONGINT VAR links, LONGINT CONST rechts) : #off("b")#
+ Zuweisungsoperator
+
+
+'= '
+ #on("b")#BOOL OP = (LONGINT CONST links, rechts) #off("b")#
+ Vergleichen zweier LONGINTs auf Gleichheit.
+
+
+'<>'
+ #on("b")#BOOL OP <> (LONGINT CONST links, rechts) #off("b")#
+ Vergleichen zweier LONGINTs auf Ungleichheit.
+
+
+'< '
+ #on("b")#BOOL OP < (LONGINT CONST links, rechts) #off("b")#
+ Vergleichen zweier LONGINTs auf kleiner.
+
+
+'<='
+ #on("b")#BOOL OP <= (LONGINT CONST links, rechts) #off("b")#
+ Vergleichen zweier LONGINTs auf kleiner gleich.
+
+
+'> '
+ #on("b")#BOOL OP > (LONGINT CONST links, rechts) #off("b")#
+ Vergleichen zweier LONGINTs auf größer.
+
+
+'>='
+ #on("b")#BOOL OP >= (LONGINT CONST links, rechts) #off("b")#
+ Vergleichen zweier LONGINTs auf größer gleich.
+
+
+'+ '
+ #on("b")#LONGINT OP + (LONGINT CONST argument) #off("b")#
+ Monadischer Operator. Ohne Wirkung.
+
+ #on("b")#LONGINT OP + (LONGINT CONST links, rechts) #off("b")#
+ Addition zweier LONGINTs.
+
+
+'- '
+ #on("b")#LONGINT OP - (LONGINT CONST argument) #off("b")#
+ Vorzeichenumkehrung.
+
+ #on("b")#LONGINT OP - (LONGINT CONST links, rechts) #off("b")#
+ Subtraktion zweier LONGINTs.
+
+
+'* '
+ #on("b")#LONGINT OP * (LONGINT CONST links, rechts) #off("b")#
+ Multiplikation von zwei LONGINTs.
+
+
+'**'
+ #on("b")#LONGINT OP ** (LONGINT CONST argument, exponent) #off("b")#
+ Exponentiation zweier LONGINTs mit positivem Exponenten.
+
+ FEHLER :
+ LONGINT OP ** : negative exponent
+ Der 'exponent' muß >= 0 sein.
+ 0 ** 0 is not defined
+ 'argument' und 'exponent' dürfen nicht gleich 0 sein.
+
+
+ #on("b")#LONGINT OP ** (LONGINT CONST argument, INT CONST exponent)#off("b")#
+ Exponentiation eines LONGINT mit positiven INT Exponenten.
+
+ FEHLER :
+ LONGINT OP ** : negative exponent
+ Der 'exponent' muß >= 0 sein.
+ 0 ** 0 is not defined
+ 'argument' und 'exponent' dürfen nicht gleich 0 sein.
+
+'ABS'
+ #on("b")#LONGINT OP ABS (LONGINT CONST argument) #off("b")#
+ Absolutbetrag eines LONGINT.
+
+
+'DECR'
+ #on("b")#OP DECR (LONGINT VAR resultat, LONGINT CONST ab) #off("b")#
+ resultat := resultat - ab
+
+
+'DIV'
+ #on("b")#LONGINT OP DIV (LONGINT CONST links, rechts) #off("b")#
+ Division zweier LONGINTs.
+
+ FEHLER :
+ Division durch 0
+ 'rechts' muß <> 0 sein.
+
+
+'INCR'
+ #on("b")#LONGINT OP INCR (LONGINT VAR resultat, LONGINT CONST dazu)#off("b")#
+ resultat := resultat + dazu
+
+
+
+'MOD'
+ #on("b")#LONGINT OP MOD (LONGINT CONST links, rechts) #off("b")#
+ Modulo-Funktion für LONGINTs. Der Rest einer LONGINT-Division wird ermit­
+ telt.
+
+ FEHLER :
+ text (links) + 'MOD 0'
+ 'rechts' muß ungleich null sein.
+
+
+'SIGN'
+ #on("b")#INT OP SIGN (LONGINT CONST longint) #off("b")#
+ Feststellen des Vorzeichens von 'longint'. Liefert:
+
+
+ 0 wenn 'longint' = 0,
+ 1 wenn 'longint' > 0,
+ -1 wenn 'longint' < 0.
+
+
+#page#
+'get'
+ #on("b")#PROC get (LONGINT VAR zahl) #off("b")#
+ Eingabe eines LONGINTs vom Terminal.
+
+ #on("b")#PROC get (FILE VAR file, LONGINT VAR zahl) #off("b")#
+ Einlesen von 'zahl' aus der sequentiellen Datei 'file'. Die Datei muß mit 'input'
+ assoziiert sein (vergl. 'sequential file').
+
+ FEHLER :
+ Datei zu
+ Leseversuch nach Daateiende
+ Leseversuch auf output-FILE
+
+
+'put'
+ #on("b")#PROC put (LONGINT CONST longint) #off("b")#
+ 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 fortgesetzt.
+
+ #on("b")#PROC put (FILE VAR file, LONGINT CONST zahl) #off("b")#
+ Ausgabe von 'zahl' in die sequentielle Datei 'file'. 'file' muß mit 'output' assoziiert
+ sein.
+
+ FEHLER :
+ Datei zu
+ Schreibversuch auf input-FILE
+#page#
+'abs'
+ #on("b")#LONGINT PROC abs (LONGINT CONST argument) #off("b")#
+ Absolutbetrag eines LONGINT.
+
+
+'int'
+ #on("b")#INT PROC int (LONGINT CONST longint) #off("b")#
+ Konvertierung von LONGINT nach INT.
+
+ FEHLER :
+ integer overflow
+ 'longint' ist größer als 'maxint'.
+
+
+'longint'
+ #on("b")#LONGINT PROC longint (INT CONST int) #off("b")#
+ Konvertierung von 'int' nach LONGINT.
+
+ #on("b")#LONGINT PROC longint (TEXT CONST text) #off("b")#
+ Konvertierung von 'text' nach LONGINT.
+
+
+'max'
+ #on("b")#LONGINT PROC max (LONGINT CONST links, rechts) #off("b")#
+ Liefert das Maximum zweier LONGINTs.
+
+
+'maxlongint'
+ #on("b")#LONGINT PROC max longint #off("b")#
+ Liefert größten LONGINT Wert.
+
+
+'min'
+ #on("b")#LONGINT PROC min (LONGINT CONST links, rechts) #off("b")#
+ Liefert das Minimum zweier LONGINTs.
+
+
+'random'
+ #on("b")#LONGINT PROC random (LONGINT CONST lower bound, upper bound)#off("b")#
+ Pseudo-Zufallszahlen-Generator im Intervall 'lower bound' und 'upper bound'
+ einschließlich. Es handelt sich hier um den 'LONGINT Random Generator'.
+
+
+'sign'
+ #on("b")#INT PROC sign (LONGINT CONST longint) #off("b")#
+ Feststellen des Vorzeichens von 'longint'. Liefert:
+
+
+ 0 wenn 'longint' = 0,
+ 1 wenn 'longint' > 0,
+ -1 wenn 'longint' < 0.
+
+
+
+'text'
+ #on("b")#TEXT PROC text (LONGINT CONST longint) #off("b")#
+ Konvertierung von 'longint' nach TEXT.
+
+ #on("b")#TEXT PROC text (LONGINT CONST longint, INT CONST laenge) #off("b")#
+ 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' eingetra­
+ gen. 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)) > laenge
+
+
+ wird ein Text mit der Länge 'laenge' geliefert, der mit '*'-Zeichen gefüllt ist.
+
+
+'zero'
+ #on("b")#LONGINT PROC zero #off("b")#
+ Liefert LONGINT Wert Null.
+
+
+#page#
+
+6.1.3 VECTOR
+
+Der Datentyp VECTOR erlaubt Operationen auf Vektoren aus Elementen vom Typ
+REAL. Im Gegensatz zur Struktur 'ROW m REAL' muß die Anzahl der Elemente nicht
+zur Übersetzungszeit deklariert werden, sondern kann zur Laufzeit festgelegt werden.
+Somit kann eine zur Übersetzungszeit unbekannte Anzahl von REALs bearbeitet
+werden, wobei nur soviel Speicherplatz wie nötig verwendet wird. Die maximale Größe
+eines VECTOR beträgt 4000 Elemente.
+
+Der in den Operationen ':=', 'idn' und 'vector' benutzte Datentyp INITVECTOR wird
+nur intern gehalten. Er dient der Speicherplatzersparnis bei der Initialisierung.
+
+
+- Operatoren : := , = , <> , + , - , * , /
+ LENGTH , SUB
+
+- Eingabe/Ausgabe : get , put
+
+- Besondere Vector- : length , nilvector , norm , vector , replace
+ Operationen
+
+#page#
+':='
+ #on("b")#OP := (VECTOR VAR ziel, VECTOR CONST quelle) #off("b")#
+ 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 Zuweisung mehr oder weniger Ele­
+ mente als 'quelle' besaß. Beispiel:
+
+
+ VECTOR VAR y :: vector (10, 1.0),
+ z :: vector (15, 2.0);
+ ...
+ y := z; (* length (y) liefert nun 15 ! *)
+
+
+ #on("b")#OP := (VECTOR VAR ziel, INITVECTOR CONST quelle) #off("b")#
+ 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 Speicherplatz verbraucht.
+
+
+'='
+ #on("b")#BOOL OP = (VECTOR CONST a, b) #off("b")#
+ 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 *)
+
+
+'<>'
+ #on("b")#BOOL OP <> (VECTOR CONST a, b) #off("b")#
+ Vergleich zweier Vektoren auf Ungleichheit (NOT (a = b)).
+
+
+'+'
+ #on("b")#VECTOR OP + (VECTOR CONST a) #off("b")#
+ Monadisches '+' für VECTOR. Keine Auswirkung.
+
+ #on("b")#VECTOR OP + (VECTOR CONST a, b) #off("b")#
+ Elementweise Addition der Vektoren 'a' und 'b'. Beispiel:
+
+
+ VECTOR VAR x, (* 'x' hat undefinierte Länge *)
+ a :: vector (10, 1.0),
+ b :: vector (10, 2.0);
+ ...
+ x := a + b; (* 'x' hat nun 10 Elemente mit Werten'3.0'
+ *)
+
+ FEHLER :
+ VECTOR OP + : LENGTH a <> LENGTH b
+ 'a' und 'b' haben nicht die gleiche Anzahl von Elementen.
+
+
+'-'
+ #on("b")#VECTOR OP - (VECTOR CONST a) #off("b")#
+ Monadisches '-'.
+
+ #on("b")#VECTOR OP - (VECTOR CONST a, b) #off("b")#
+ Elementweise Subtraktion der Vektoren 'a' und 'b'.
+
+ FEHLER :
+ VECTOR OP - : LENGTH a <> LENGTH b
+ 'a' und 'b' haben nicht die gleiche Anzahl von Elementen.
+
+'*'
+ #on("b")#REAL OP * (VECTOR CONST a, b) #off("b")#
+ Skalarprodukt zweier Vektoren. Liefert die Summe der elementweisen Multiplika­
+ tion der Vektoren 'a' und 'b'. Beachte eventuelle Rundungsfehler! Beispiel:
+
+
+ REAL VAR a;
+ VECTOR VAR b :: vector (10, 2.0),
+ c :: vector (10, 2.0);
+ ...
+ a := b * c; (* 40.0 *)
+
+ FEHLER :
+ REAL OP * : LENGTH a <> LENGTH b
+ 'a' und 'b' haben nicht die gleiche Anzahl von Elementen.
+
+ #on("b")#VECTOR OP * (VECTOR CONST a, REAL CONST s) #off("b")#
+ Multiplikation des Vektors 'a' mit dem Skalar 's'.
+
+ #on("b")#VECTOR OP * (REAL CONST s, VECTOR CONST a) #off("b")#
+ Multiplikation des Skalars 's' mit dem Vektor 'a'.
+
+
+'/'
+ #on("b")#VECTOR OP / (VECTOR CONST a, REAL CONST s) #off("b")#
+ 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' *)
+
+
+
+'LENGTH'
+ #on("b")#INT OP LENGTH (VECTOR CONST a) #off("b")#
+ Liefert die Anzahl der Elemente von 'a'.
+
+
+'SUB'
+ #on("b")#REAL OP SUB (VECTOR CONST v, INT CONST i) #off("b")#
+ Liefert das 'i'-te Element von 'v'.
+
+ FEHLER :
+ OP SUB : subscript overflow
+ Der Index 'i' liegt außerhalb des Vektors (i > LENGTH v).
+ OP SUB : subscript underflow
+ Der Index 'i' liegt außerhalb des Vektors (i < 1).
+
+#page#
+'get'
+ #on("b")#PROC get (VECTOR VAR a, INT CONST l) #off("b")#
+ Einlesen der Elemente von 'a' vom Terminal, wobei 'l' die Anzahl der Elemente
+ angibt.
+
+ FEHLER :
+ PROC get : size <= 0
+ Die angeforderte Elementanzahl 'l' muß > 0 sein.
+
+
+'put'
+ #on("b")#PROC put (VECTOR CONST v) #off("b")#
+ Ausgabe der Werte der Elemente von 'v' auf dem Terminal.
+
+
+#page#
+'length'
+ #on("b")#INT PROC length (VECTOR CONST a) #off("b")#
+ 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 *)
+
+
+
+'nilvector'
+ #on("b")#INITVECTOR PROC nilvector #off("b")#
+ Erzeugen eines Vektors mit einem Element mit dem Wert '0.0'.
+
+
+'norm'
+ #on("b")#REAL PROC norm (VECTOR CONST v) #off("b")#
+ Euklidische Norm (Wurzel aus der Summe der Quadrate der Elemente).
+
+
+
+'replace'
+ #on("b")#PROC replace (VECTOR VAR v, INT CONST i, REAL CONST r)#off("b")#
+ 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' *)
+
+ FEHLER :
+ PROC replace : subscript overflow
+ Der Index 'i' liegt außerhalb des Vektors (i > LENGTH v).
+ PROC replace : subscript underflow
+ Der Index 'i' liegt außerhalb des Vektors (i < 1).
+
+
+'vector'
+ #on("b")#INITVECTOR PROC vector (INT CONST l) #off("b")#
+ 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.
+
+ FEHLER :
+ PROC vector : size <= 0
+ Die angeforderte Elementanzahl 'l' muß > 0 sein.
+
+ #on("b")#INITVECTOR PROC vector (INT CONST l, REAL CONST value)#off("b")#
+ 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' *)
+
+ FEHLER :
+ PROC vector : size <= 0
+ Die angeforderte Elementanzahl 'l' muß > 0 sein.
+
+#page#
+
+6.1.4 MATRIX
+
+Der Datentyp MATRIX erlaubt Operationen auf m x n Matrizen. Im Gegensatz zur
+Struktur 'ROW m ROW n REAL' muß die Anzahl der Elemente nicht zur Überset­
+zungszeit deklariert werden, sondern kann zur Laufzeit festgelegt werden. Somit kann
+eine zur Übersetzungszeit unbekannte Anzahl von REALs bearbeitet werden, wobei
+nur soviel Speicherplatz wie nötig verwendet wird. Die maximale Größe einer MATRIX
+beträgt 4000 Elemente.
+
+Der in den Operationen ':=', 'idn' und 'matrix' benutzte Datentyp INITMATRIX wird
+nur intern gehalten. Er dient der Speicherplatzersparnis bei der Initialisierung.
+
+
+- Operatoren : := , = , <> , + , - , *
+ COLUMNS , DET , INV , ROWS , TRANSP ,
+
+- Eingabe/Ausgabe : get , put
+
+- Besondere Matrix- : column , idn , matrix , row , sub
+ Operationen transp ,
+ replace column , replace element ,
+ replace row
+
+
+
+#page#
+':='
+ #on("b")#OP := (MATRIX VAR l, MATRIX CONST r) #off("b")#
+ 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 *)
+
+
+ #on("b")#OP := (MATRIX VAR l, INITMATRIX CONST r) #off("b")#
+ 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 Speicherplatz verbraucht.
+
+'='
+ #on("b")#BOOL OP = (MATRIX CONST l, r) #off("b")#
+ 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 *)
+
+
+
+'<>'
+ #on("b")#BOOL OP <> (MATRIX CONST l, r) #off("b")#
+ Vergleich der Matrizen 'l' und 'r' auf Ungleichheit.
+
+
+'+'
+ #on("b")#MATRIX OP + (MATRIX CONST m) #off("b")#
+ Monadisches '+'. Keine Auswirkungen.
+
+ #on("b")#MATRIX OP + (MATRIX CONST l, r) #off("b")#
+ 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' *)
+
+
+ FEHLER:
+ 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.
+
+
+'-'
+ #on("b")#MATRIX OP - (MATRIX CONST m) #off("b")#
+ Monadisches Minus. Beispiel:
+
+
+ MATRIX VAR a :: matrix (3, 4, 10.0)
+ a := - a; (* Alle Elemente haben den Wert '- 10.0' *)
+
+
+ #on("b")#MATRIX OP - (MATRIX CONST l, r) #off("b")#
+ Subtraktion zweier Matrizen. Die Anzahl der Reihen und Spalten muß gleich sein.
+
+ FEHLER:
+ 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.
+
+'*'
+ #on("b")#MATRIX OP * (REAL CONST r, MATRIX CONST m) #off("b")#
+ 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' *)
+
+
+ #on("b")#MATRIX OP * (MATRIX CONST m, REAL CONST r) #off("b")#
+ Multiplikation einer Matrix 'm' mit einem Skalar 'r'.
+
+ #on("b")#MATRIX OP * (MATRIX CONST l, r) #off("b")#
+ 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' *)
+
+
+ FEHLER :
+ MATRIX OP * : COLUMNS l <> ROWS r
+ Die Anzahl der Spalten von 'l' muß mit der Anzahl der Zeilen von 'r'
+ übereinstimmen.
+
+ #on("b")#VECTOR OP * (VECTOR CONST v, MATRIX CONST m) #off("b")#
+ Multiplikation des Vektors 'v' mit der Matrix 'm'.
+
+ FEHLER :
+ VECTOR OP * : LENGTH v <> ROWS m
+ Die Anzahl der Elemente von 'v' stimmt nicht mit den Anzahl der Zeilen
+ von 'm' überein.
+
+ #on("b")#VECTOR OP * (MATRIX CONST m, VECTOR CONST v) #off("b")#
+ Multiplikation der Matrix 'm' mit dem Vektor 'v'.
+
+ FEHLER :
+ VECTOR OP * : COLUMNS m <> LENGTH v
+ Die Anzahl der Spalten von 'm' stimmt nicht mit der Anzahl der Ele­
+ menten von 'v' überein.
+
+
+'COLUMNS'
+ #on("b")#INT OP COLUMNS (MATRIX CONST m) #off("b")#
+ 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'
+ #on("b")#REAL OP DET (MATRIX CONST m) #off("b")#
+ Es wird der Wert der Determinanten von 'm' geliefert.
+
+ FEHLER :
+ OP DET : no square matrix
+ Die Matrix ist nicht quadratisch, d.h. ROWS m <> COLUMNS m
+
+
+'INV'
+ #on("b")#MATRIX OP INV (MATRIX CONST m) #off("b")#
+ Liefert als Ergebnis die Inverse von 'm' (Achtung: starke Rundungsfehler möglich).
+
+ FEHLER:
+ 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.
+
+
+'ROWS'
+ #on("b")#INT OP ROWS (MATRIX CONST m) #off("b")#
+ 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 *)
+
+
+
+'TRANSP'
+ #on("b")#MATRIX OP TRANSP (MATRIX CONST m) #off("b")#
+ Liefert als Ergebnis die transponierte Matrix 'm'.
+
+#page#
+'get'
+ #on("b")#PROC get (MATRIX VAR m, INT CONST rows, columns) #off("b")#
+ Einlesen von Werten für die Matrix 'm' vom Terminal mit 'rows'-Zeilen und
+ 'columns'-Spalten.
+
+
+'put'
+ #on("b")#PROC put (MATRIX CONST m) #off("b")#
+ Ausgabe der Werte einer Matrix auf dem Terminal.
+#page#
+'column'
+ #on("b")#VECTOR PROC column (MATRIX CONST m, INT CONST i) #off("b")#
+ 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' *)
+
+ FEHLER:
+ 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).
+
+'idn'
+ #on("b")#INITMATRIX PROC idn (INT CONST size) #off("b")#
+ 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 Diagonalele­
+ mente, die den Wert '1.0' haben.*)
+
+ FEHLER :
+ PROC idn : size <= 0
+ Die angeforderte 'size' Anzahl Spalten oder Zeilen muß > 0 sein.
+
+
+'matrix'
+ #on("b")#INITMATRIX PROC matrix (INT CONST rows, columns) #off("b")#
+ 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);
+
+ FEHLER:
+ PROC matrix : rows <= 0
+ Die angeforderte Zeilenanzahl 'rows' muß > 0 sein.
+ PROC matrix : columns <= 0
+ Die angeforderte Spaltenanzahl 'columns' muß > 0 sein.
+
+ #on("b")#INITMATRIX PROC matrix (INT CONST rows, columns, REAL CONST value)#off("b")#
+ Erzeugen eines Datenobjekts vom Datentyp MATRIX mit 'rows' Zeilen und 'co­
+ lumns' Spalten. Alle Elemente der erzeugten MATRIX werden mit dem Wert
+ 'value' initialisiert. Beispiel:
+
+
+ MATRIX CONST :: matrix (3, 3, 3.14);
+
+ FEHLER:
+ PROC matrix : rows <= 0
+ Die angeforderte Zeilenanzahl 'rows' muß > 0 sein.
+ PROC matrix : columns <= 0
+ Die angeforderte Spaltenanzahl 'columns' muß > 0 sein.
+
+
+'row'
+ #on("b")#VECTOR PROC row (MATRIX CONST m, INT CONST i) #off("b")#
+ Die 'i'-te Reihe von 'm' wird als VECTOR mit 'COLUMNS m' Elementen gelie­
+ fert. Beispiel:
+
+
+ MATRIX CONST a :: matrix (3, 4);
+ VECTOR VAR b :: row (a, 1);
+ (* 'b' hat vier Elemente mit den Werten '0.0'*)
+
+ FEHLER:
+ 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).
+
+
+'sub'
+ #on("b")#REAL PROC sub (MATRIX CONST m, INT CONST row, column) #off("b")#
+ 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));
+
+ FEHLER:
+ 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'
+ #on("b")#PROC transp (MATRIX VAR m) #off("b")#
+ Transponieren der Matrix 'm', wobei kaum zusätzlicher Speicherplatz benötigt
+ wird.
+
+#page#
+'replace column'
+ #on("b")#PROC replace column (MATRIX VAR m, INT CONST column index, VECTOR
+ CONST column value) #off("b")#
+ 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 *)
+
+ FEHLER:
+ 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'
+ #on("b")#PROC replace element (MATRIX VAR m , INT CONST row, column,
+ REAL CONST value) #off("b")#
+ 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);
+
+ FEHLER:
+ 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'
+ #on("b")#PROC replace row (MATRIX VAR m, INT CONST rowindex,
+ VECTOR CONST rowvalue) #off("b")#
+ 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 *)
+
+ FEHLER:
+ 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).
+
+6.2 Programmanalyse
+
+Das Packet 'reporter' ermöglicht:
+
+a) Ablaufinformationen ("trace");
+b) #ib#Häufigkeitszählung#ie# ("frequency count");
+c) Programmunterbrechung bei Nichterfüllung einer Bedingung ("#ib#assertion#ie#").
+
+
+'Installation'
+Das Programm befindet sich in der Datei 'reporter' und kann wie üblich insertiert
+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' ver­
+wechselt werden können. Beispiel:
+
+
+ check off; insert ("reporter"); check on
+
+
+Mit dem Kommando
+
+
+ #ib#generate reports#ie# ("testdatei")
+
+
+werden die oben erwähnten Prozeduraufrufe ('#ib#report#ie#') in das zu testende Programm,
+welches in der Datei 'testdatei' steht, geschrieben. Die Prozeduraufrufe 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 Prozedurauf­
+rufe):
+
+
+ ...
+ PROC beispiel (INT CONST mist):
+ \#\#report ("PROC beispiel");\#\#
+ ...
+
+
+
+'Automatische Ablaufinformation'
+Ist ein Programm mit 'generate reports' mit 'report'-Aufrufen versehen worden, kann
+es wie gewohnt übersetzt werden. Wird das Programm vom ELAN-Compiler kor­
+rekt ü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' eingerichtet.
+
+Mit Hilfe dieser Datei kann der Programmablauf verfolgt werden. Es ist damit auch
+möglich festzustellen, wo eine "Endlos-Rekursion" auftritt. Die Ablaufinformationen
+bestehen nur aus den Namen der angetroffenen Prozeduren und Refinements. Trotz­
+dem können die Anzahl der Informationen sehr umfangreich werden. Deshalb gibt es
+die Möglichkeit, die Erzeugung der Ablaufinformationen ab- bzw. wieder anzuschal­
+ten. Dazu gibt es die Möglichkeit, in das zu testende Programm die Prozeduren
+
+
+ #ib#report on#ie#
+ #ib#report off#ie#
+
+
+einzufügen und das zu testende Programm mit diesen Prozeduraufrufen (erneut) zu
+übersetzen.
+
+
+'Benutzereigene Ablaufinformation'
+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 zwei­
+ten 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 einge­
+ fuegt *)
+ ...
+
+
+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
+
+
+ #ib#generate counts#ie# ("zu testende datei")
+
+
+werden die vermerkten Häufigkeiten in das zu testende Programm direkt eingefügt.
+Die Häufigkeiten werden wie oben beschrieben gekennzeichnet, so daß sie mit 'elimi­
+nate reports' entfernt werden können.
+
+
+'Assertions'
+Zusätzlich zu den oben erwähnten Möglichkeiten bietet 'reporter' noch die Prozedur
+
+
+ #ib#assert#ie#
+
+
+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 #ib#assert#ie# (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'
+ #on("b")#PROC count on #off("b")#
+ Schaltet die Häufigkeitszählung ein.
+
+'count off'
+ #on("b")#PROC count off #off("b")#
+ Schaltet die Häufigkeitszählung aus.
+
+'eliminate reports'
+ #on("b")#PROC eliminate reports (TEXT CONST datei) #off("b")#
+ Entfernt gekennzeichnete 'report'-Aufrufe aus der Datei 'datei'.
+
+'generate reports'
+ #on("b")#PROC generate reports (TEXT CONST datei) #off("b")#
+ Fügt 'report'-Aufrufe in die Datei 'datei' ein und kennzeichnet diese mit '\#\#'.
+
+'report on'
+ #on("b")#PROC report on #off("b")#
+ Schaltet die Ablaufinformationen in die Datei 'TRACE' ein.
+
+'report off'
+ #on("b")#PROC report off #off("b")#
+ Schaltet die Ablaufinformationen wieder aus.
+
+'generate counts'
+ #on("b")#PROC generate counts (TEXT CONST datei) #off("b")#
+ Bringt die Häufigkeitszählung (wie oft eine Prozedur oder Refinement durchlaufen
+ wurde) in die Programmdatei 'datei'. Mit 'eliminate reports' werden diese wieder
+ automatisch entfernt.
+
+'assert'
+ #on("b")#PROC assert (TEXT CONST message, BOOL CONST value) #off("b")#
+ Schreibt 'message' und den Wert von 'value' in die TRACE-Datei. Ist 'value'
+ FALSE, wird angefragt, ob das Programm fortgesetzt werden soll.
+#page#
+
+Referencer
+
+
+'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 #ib# Referenzliste#ie#.
+
+#ub#Achtung#ue#: 'referencer' arbeitet ausschließlich mit Namen und verarbeitet nur wenige
+syntaktische Konstrukte. Darum ist es nur erlaubt, ein PACKET auf einmal von 'refe­
+rencer' verarbeiten zu lassen. Verarbeitet man mehrere PACKETs auf einmal, kann es
+geschehen, daß gleichnamige Objekte in unterschiedlichen 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 umfan­
+greicheren Programmen (bei "Mini"-Programmen kann man dies sofort sehen).
+
+Bei der Erstellung der Referenzliste nimmt das Programm 'referencer' gleichzeitig
+einige Überprüfungen vor, die helfen können, ein Programm zu verbessern:
+
+1. Warnung bei mehrzeiligen Kommentaren.
+
+2. Überdeckungsfehler. Wird ein Objekt global (auf PACKET-Ebene) und nochmals
+ 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 Refinement 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 Zeilennum­
+ mern in der Referenzliste besitzen, sind verdächtig (Ausnahmen: importierte
+ Prozeduren, LET-Objekte u.a.m.).
+
+
+
+referencer - Kommandos
+
+
+'referencer'
+ #on("b")#PROC referencer (TEXT CONST check file, dump file) #off("b")#
+ Überprüft 'check file'. In 'dump file' steht nach Abschluß die Referenzliste.
+
+#page#
+
+6.3 Rechnen im Editor
+
+Das Programm TeCal ermöglicht einfache Rechnungen (ähnlich wie mit einem Ta­
+schenrechner) 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. Zur Benutzung
+müssen 'TeCal' und 'TeCal Auskunft' insertiert werden.
+
+TeCal wird aus dem Editor heraus durch 'ESC t' oder durch das Editor-Kommando
+
+
+ tecal
+
+
+aktiviert. Dadurch wird in der untersten Zeile des Bildschirms eine Informationszeile
+aufgebaut, in der die (Zwischen-) Ergebnisse einer Rechnung zur Kontrolle fest­
+gehalten werden.
+
+
+
+Arbeitsweise
+
+
+Wenn TeCal insertiert ist, kann die Taschenrechnerfunktion jederzeit durch <ESC> <t>
+aufgerufen werden. Aus der editierten Datei werden Werte mit <ESC> <L> gelesen,
+durch <ESC> <+> (bzw. -,*,/) verknüpft und mit <ESC> <S> an die aktuelle Cursor­
+position geschrieben werden.
+
+Der von TeCal errechnete Wert wird durch <ESC> <S> derart ausgegeben, daß an der
+Stelle an der der Cursor steht die letzte Stelle vor dem Dezimalpunkt geschrieben
+wird.
+
+Die Eingabe von Klammern geschieht durch <ESC> <(> <ESC> <)>.
+
+Durch die Hilfsfunktion <ESC> <?> lassen sich die TeCal Funktionen auflisten.
+
+Der Prozentoperator <ESC> <%> erlaubt einfache Rechnungen der Form: 'zahl' <ESC> <+>
+<ESC> <%> <ESC> <=> .
+
+Derartige Folgen können natürlich mit der bekannten Editor-Lernfunktion auch ge­
+lernt werden, so daß sich z.B. die Mehrwertsteuerberechnung auf wenige Tasten
+reduziert.
+
+Spalten können summiert werden, indem auf der #on("u")#untersten#off("u")# Zahl einer Spalte <ESC> <V>
+eingegeben wird. Daraufhin werden alle darüberliegende Zahlen addiert, bis ein
+Zeichen auftritt, das nicht in einer Zahl auftritt (Leerzeichen stören nicht!).
+
+____________________________________________________________________________
+ ............
+ 55.00
+ 66.99
+ 123.45
+
+ 99.99
+
+ 9876.54
+ ...........
+
+ Anzeige: 0.00 14.00% Memory: 0.00
+
+____________________________________________________________________________
+
+
+TeCal Prozeduren
+
+
+'evaluate'
+ #on("b")#evaluate (TEXT CONST zeile, INT CONST von) #off("b")#
+ Ausdruck 'zeile' ab der Stelle 'von' berechnen.
+
+ #on("b")#evaluate (TEXT CONST zeile) #off("b")#
+ Ausdruck 'zeile' ab Stelle 1 berechnen.
+
+
+'kommastellen'
+ #on("b")#kommastellen (INT CONST stellen) #off("b")#
+ Berechnungen auf 'stellen' Zahlen hinter dem Komma einstellen.
+
+
+'merke'
+ #on("b")#PROC merke (INT CONST zahl)#off("b")#
+ Integer 'zahl' im Merkregister abspeichern.
+
+ #on("b")#PROC merke (REAL CONST zahl)#off("b")#
+ Real 'zahl' im Merkregister abspeichern.
+
+'prozentsatz'
+ #on("b")#PROC prozentsatz (INT CONST zahl) #off("b")#
+ Prozentsatz von 'zahl' Prozent einstellen. Der Wert wird automatisch konvertiert.
+
+ #on("b")#PROC prozentsatz (REAL CONST zahl) #off("b")#
+ Prozentsatz von 'zahl' Prozent einstellen.
+
+
+'tecal'
+ #on("b")#PROC tecal (FILE VAR f) #off("b")#
+ Datei 'f', die mit 'sequential file' assoziiert ist, mit TeCal editieren.
+
+ #on("b")#PROC tecal (TEXT VAR datei) #off("b")#
+ 'datei' mit TeCal editieren.
+
+ #on("b")#PROC tecal #off("b")#
+ Zuletzt editierte Datei mit TeCal editieren.
+
+
+'tecalauskunft'
+ #on("b")#PROC tecalauskunft #off("b")#
+ Auskunft zeigen.
+
+ #on("b")#PROC tecalauskunft (TEXT CONST zeichen) #off("b")#
+ Auskunft zu 'zeichen' zeigen.
+
diff --git a/doc/programming/programmierhandbuch.index b/doc/programming/programmierhandbuch.index
new file mode 100644
index 0000000..f3f4ede
--- /dev/null
+++ b/doc/programming/programmierhandbuch.index
@@ -0,0 +1,449 @@
+#pagenr("%",1)##block##pageblock#
+#headandbottom("1","EUMEL-Benutzerhandbuch","INDEX","Index")#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#INDEX
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+#center#____________________________________________________________
+Index - % #right#GMD
+#end#
+#bottomodd#
+#center#____________________________________________________________
+GMD #right#Index - %
+#end#
+#lpos(0.2)##lpos(6.2)#
+
+INDEX
+
+#table#
+* 5-11, 5-18, 5-32, 6-19, 6-27, 6-4, 6-9
+** 5-11, 5-19, 5-60, 6-10
++ 4-20, 5-11, 5-18, 5-32, 5-54, 6-18, 6-26, 6-3, 6-9
+- 4-20, 5-11, 5-18, 5-54, 6-18, 6-26, 6-3, 6-9
+/ 4-20, 4-22, 5-18, 6-19, 6-4
+:= 2-91, 5-10, 5-17, 5-30, 5-65, 6-17, 6-25, 6-3, 6-8
+< 5-10, 5-17, 5-30, 6-8
+<= 5-10, 5-17, 5-30, 6-8
+<> 5-10, 5-17, 5-30, 6-18, 6-26, 6-3, 6-8
+= 5-10, 5-17, 5-30, 6-17, 6-25, 6-3, 6-8
+> 5-10, 5-17, 5-30, 6-9
+>= 5-10, 5-17, 5-30, 6-9
+
+Abfragekette 2-25
+ABS 6-10, 6-6
+abs 5-13, 5-20, 6-13
+Abweisende Schleife 2-29
+ALL 4-17
+all 4-17
+AND 5-7
+any 5-54
+Archiv 4-44
+Archivdiskette 4-47
+archive 1-9, 4-24, 4-45
+arctan 5-20
+arctand 5-20
+assert 6-39
+assertion 6-36
+Assertions 6-39
+Ausgabesteuerzeichen 5-70
+Ausschalten des Geräts 1-17
+Automatische Ablaufinformation 6-37
+
+begin 2-78, 4-3
+begin password 4-40
+Benutzereigene Ablaufinformation 6-37
+BOOL-Denoter: 2-9
+BOUND 2-83
+bound 5-56
+break 4-4
+brother 4-23
+bulletin 4-8
+
+CAND 5-7
+CAT 5-32
+change 5-33
+change 5-61
+change all 5-33
+check 4-49, 5-4
+clear 4-46
+clear removed 5-51
+clock 5-80
+code 5-34
+col 5-48
+column 6-31
+COLUMNS 6-28
+COMPILER ERROR 5-5
+complex 6-5
+complex i 6-5
+complex one 6-5
+complex zero 6-5
+compress 5-34
+configurator 1-9
+CONJ 6-6
+Container 5-26
+continue 4-3
+continue scan 5-83
+copy 4-26, 5-67
+COR 5-7
+cos 5-20
+cosd 5-20
+count off 6-39
+count on 6-39
+cout 5-75
+cursor 5-71
+
+dataspaces 5-66
+date 5-81
+Datenraum 1-3
+Datensicherheit 1-8
+day 5-81
+decimal exponent 5-20
+DECR 5-12, 5-19, 6-10
+delete char 5-34
+delete record 5-50
+Der EUMEL-Zeichensatz 5-29
+Der Lernmodus 3-17
+DET 6-28
+DIRFILE 2-73
+DIV 5-12, 6-11
+do 5-2
+down 5-48, 5-57
+downety 5-57
+dphi 6-6
+ds pages 5-66
+
+e 5-21
+edit 3-1, 4-29, 5-62
+editget 4-30, 5-63, 5-72
+editor 1-9
+Editor verlassen 3-2
+Ein- bzw. Ausschalten der Markierung 3-9
+Ein- bzw. Ausschalten des Einfügemodus 3-10
+Einfügen von Textpassagen 3-6
+Eingabesteuerzeichen 5-69
+Eingabetaste / Absatztaste 3-4
+eliminate reports 6-39
+Endlosschleife 2-28
+enter password 4-41
+eof 5-43
+erase 4-37
+Erweiterbarkeit 1-6
+
+ESC ) 3-16
+ESC ( 3-16
+ESC > 3-16
+ESC < 3-16
+ESC 9 3-14
+ESC 1 3-14
+ESC a 3-16
+ESC A 3-16
+ESC b 3-14
+ESC blank 3-16
+ESC d 3-15
+ESC e 3-14
+ESC ESC 3-16
+ESC f 3-14
+ESC g 3-15
+ESC HOP 3-17
+ESC HOP HOP 3-17
+ESC HOP taste 3-17
+ESC k 3-16
+ESC n 3-14
+ESC O 3-16
+ESC o 3-16
+ESC p 3-15
+ESC q 3-14
+ESC RUBIN 3-15
+ESC RUBOUT 3-15
+ESC s 3-16
+ESC ? taste 3-16
+ESC ! taste 3-16
+ESC U 3-16
+ESC u 3-16
+ESC v 3-14
+ESC w 3-14
+ESC k 3-16
+ESC ­ 3-16
+
+EUMEL-Editor 3-1
+evaluate 6-44
+exp 5-21
+
+false 5-7
+family password 4-42
+father 4-23
+Fehlermeldungen des Archivs 4-52
+fetch 4-33, 5-67
+fetchall 4-34
+FILE 2-73
+Fixpunkt 1-8
+floor 5-21
+forget 4-26, 4-47, 5-67
+frac 5-21
+
+Garbage Collection 5-26
+Gelerntes vergessen 3-17
+generate counts 6-40
+generate reports 6-40
+get 2-80, 5-44, 5-73, 6-5, 6-12, 6-21, 6-30
+getchar 5-72
+get cursor 5-71
+getline 5-45, 5-74
+
+Häufige Fehler bei der Benutzung von Datenräumen 2-85
+Häufigkeitszählung 6-36
+halt 4-4
+headline 5-43
+heap size 5-27
+help 4-5, 4-9
+hour 5-81
+
+idn 6-31
+imag part 6-6
+inchar 5-72
+incharety 5-72
+INCR 5-12, 5-19, 6-11
+INITFLAG 2-91
+initialized 2-91
+initialize random 5-13, 5-21
+input 2-75, 5-42
+insert 5-2
+insert char 5-35
+insert record 5-50
+Installation 6-36
+int 5-21
+int 6-13
+INT-Denoter: 2-7
+INV 6-28
+
+Kommando 1-9
+kommando auf taste 4-31
+kommando auf taste legen 4-31
+Kommando auf Taste legen 3-16
+Kommandotaste 3-11
+kommastellen 6-44
+Konfiguration 1-9
+
+length 5-35, 6-22
+LENGTH 5-35, 6-19
+Lernen ausschalten 3-17
+Lernen einschalten 3-17
+lernsequenz auf taste 4-32
+lernsequenz auf taste legen 4-32
+Lese-Fehler (Archiv) 4-52
+LEXEQUAL 5-31
+LEXGREATER 5-31
+LEXGREATEREQUAL 5-31
+lex sort 5-64
+LIKE 4-19, 5-59
+line 5-47, 5-71, 5-77
+line no 5-43
+lines 5-43
+list 4-27
+ln 5-22
+Löschtaste 3-10
+log10 5-22
+log2 5-22
+longint 6-13
+
+manager task 1-9
+Mantisse 5-16
+Markierzustand 3-9
+match 5-60
+matchpos 5-60
+matrix 6-32
+max 5-13, 5-22, 6-13
+maxint 5-13
+maxlongint 6-13
+maxreal 5-22
+max text length 5-35
+merke 6-45
+min 5-13, 5-23, 6-14
+minint 5-14
+MOD 5-14, 5-23, 6-11
+modify 2-75, 5-42
+Monitor 1-9
+Multi-Tasking-/Multi-User-Betrieb 1-5
+myself 4-23
+
+name 4-25
+Namensverzeichnis 4-16
+Netzwerkfähigkeit 1-6
+new 5-65
+next symbol 5-83
+next symbol 5-85
+Nicht abweisende Schleife 2-29
+nilspace 5-65
+niltask 4-22
+nilvector 6-22
+norm 6-22
+NOT 5-8
+notion 5-56
+
+old 5-66
+online 5-79
+Operationen auf Markierungen 3-15
+Operatoren 2-14
+OR 5-8
+OR 5-54
+out 5-75
+output 2-75, 5-42
+out subtext 5-76
+
+packets 4-8
+page 5-71
+Paketkonzept 2-1
+pause 5-79, 5-82
+phi 6-6
+pi 5-23
+pos 5-36
+Positionierung 5-71
+Positionierung des Cursors 3-4
+print 4-38
+PRINTER 4-24
+printer 4-24
+Priorität von generischen Operatoren 2-49
+Priorität von Operatoren 2-16
+prot 5-4
+Prozeduren als Parameter 2-39
+Prozeduren mit Parametern 2-38
+prozentsatz 6-45
+Prozeßkommunikation 1-6
+PUBLIC 4-24
+public 4-24
+put 5-46, 5-78, 6-12, 6-21, 6-30, 6-5
+putline 5-46, 5-78
+
+random 5-14, 5-23, 6-14
+read record 5-50
+real 5-14, 5-37
+REAL-Denoter: 2-8
+Realisierung von abstrakten Datentypen 2-47
+real part 6-6
+referencer 6-42
+Referenzliste 6-41
+Refinements 2-1
+reinsert 5-51
+release 4-45
+remainder 4-18
+remove 5-51
+rename 4-28
+rename myself 4-25
+reorganize 5-52
+replace 5-37, 6-22
+replace column 6-34
+replace element 6-34
+replace row 6-35
+report 6-36
+report off 6-40
+report on 6-40
+reserve 4-25
+REST 3-6
+round 5-23
+row 6-32
+ROWS 6-29
+run 5-3
+runagain 5-3
+
+save 4-35, 5-67
+saveall 4-36
+scan 5-86
+Schreibarbeit beenden 3-2
+Schutz vor fehlerhaftem Zugriff auf Datenobjekte 2-45
+Scratch-Datei 3-13
+segments 5-52
+sequential file 5-41
+SHard 1-5
+show 4-30
+shutup 1-17
+sign 5-15, 5-24, 6-14
+SIGN 6-11
+sin 5-24
+sind 5-24
+smallreal 5-24
+SOME 2-80, 4-17
+son 4-23
+sort 5-64
+Spracherweiterung 2-44
+sqrt 5-24, 6-6
+Standard-Datenraum 1-9
+std tastenbelegung 4-32
+STOP-Taste 3-20
+storage 4-11, 5-66
+storage info 4-5, 4-11
+sub 6-33
+SUB 5-37, 6-20
+subtext 5-38
+supervisor 4-24
+Supervisor 1-9
+SUPERVISOR-Taste 3-18
+Symbole 5-83
+sysin 5-73
+sysout 5-77
+
+Tabulatortaste 3-8
+tan 5-25
+tand 5-25
+task 4-22
+Task 1-9
+task info 4-5, 4-12
+Task-Organisation 1-2
+task password 4-43
+task status 4-15
+taste enthaelt kommando 4-31
+tecal 6-45
+tecalauskunft 6-45
+text 5-15, 5-25, 5-39, 6-15
+TEXT-Denoter: 2-9
+Thesaurus 4-16
+time 5-82
+time of day 5-82
+TIMESOUT 5-76
+Titelzeile 3-2
+to line 5-48
+transp 6-33
+TRANSP 6-29
+true 5-8
+type 5-66
+TYPE COMPLEX 6-3
+TYPE LONGINT 6-8
+
+Überschrift in die Kopfzeile 5-43
+Umschalttaste 3-4
+UNLIKE 5-59
+Unterbrechen einer Ausgabe 3-20
+up 5-49
+up 5-58
+uppety 5-58
+
+vector 6-23
+Vereinbarung eines dyadischen Operators 2-42
+Vereinbarung eines monadischen Operators 2-42
+Verstärkertaste 3-5
+Verwendung von Prozeduren 2-35
+Virtuelle Speicherverwaltung 1-7
+Vorbelegte Tasten 3-17
+
+warnings 5-4
+WEITER-Taste 3-20
+Wertliefernde Prozeduren 2-40
+Wertliefernde Refinements 2-34
+word wrap 4-32
+write 5-78
+write 5-47
+write record 5-50
+
+XOR 5-8
+
+Zählschleife 2-30
+Zeichen schreiben 3-16
+zero 6-15
+#tableend#
+
diff --git a/doc/programming/programmierhandbuch.inhalt b/doc/programming/programmierhandbuch.inhalt
new file mode 100644
index 0000000..45b3f1f
--- /dev/null
+++ b/doc/programming/programmierhandbuch.inhalt
@@ -0,0 +1,249 @@
+#setcount (1)#
+#block##pageblock#
+#pagenr ("%", 1)#
+#headeven#
+#center#EUMEL-Benutzerhandbuch
+#center#____________________________________________________________
+
+#end#
+#headodd#
+#center#Inhalt
+#center#____________________________________________________________
+
+#end#
+#bottomeven#
+
+#center#____________________________________________________________
+I - % #right#GMD
+#end#
+#bottomodd#
+
+#center#____________________________________________________________
+GMD #right# I - %
+#end#
+
+#lpos(0.2)##lpos(1.8)##lpos(9.0)#
+
+TEIL 1 : Einleitung
+#table#
+1.1 Allgemeines über EUMEL 1
+1.2 Struktur des Betriebssystems EUMEL 2
+1.3 Eigenschaften des Betriebssystems 4
+ Multi-Tasking-/Multi-User-Betrieb 5
+ Prozeßkommunikation und Netzwerkfähigkeit 6
+ Erweiterbarkeit 6
+ Virtuelle Speicherverwaltung 7
+ Datensicherheit 8
+1.4 Wichtige Begriffe 9
+1.5 Die Notation in diesem Buch 10
+1.6 Die Funktionstasten des EUMEL-Systems 11
+1.7 Eine Beispielsitzung 12
+#tableend#
+
+
+
+
+TEIL 2 : ELAN
+#table#
+2.1 Besondere Eigenschaften von ELAN 1
+2.2 Lexikalische Elemente 2
+2.2.1 Schlüsselwörter 2
+2.2.2 Bezeichner 3
+2.2.3 Sonderzeichen 4
+2.2.4 Kommentare 5
+2.3 Datenobjekte 6
+2.3.1 Elementare Datentypen 6
+2.3.1.1 Denoter für elementare Datentypen 7
+ INT-Denoter: 7
+ REAL-Denoter: 8
+ TEXT-Denoter: 9
+ BOOL-Denoter: 9
+2.3.1.2 LET-Konstrukt für Denoter 10
+2.3.2 Zugriffsrecht 11
+2.3.3 Deklaration 11
+2.3.4 Initialisierung 12
+2.4 Programmeinheiten 13
+2.4.1 Elementare Programmeinheiten 14
+2.4.1.1 Ausdruck 14
+ Operatoren 14
+ Priorität von Operatoren 16
+2.4.1.2 Zuweisung 18
+2.4.1.3 Refinementanwendung 19
+2.4.1.4 Prozeduraufruf 20
+2.4.2 Zusammengesetzte Programmeinheiten 22
+2.4.2.1 Folge 22
+2.4.2.2 Abfrage 23
+2.4.2.3 Auswahl 26
+2.4.2.4 Wertliefernde Abfrage
+ und wertliefernde Auswahl 27
+2.4.2.5 Wiederholung 27
+ Abfragekette 25
+ Endlosschleife 28
+ Abweisende Schleife 29
+ Nicht abweisende Schleife 29
+ Zählschleife 30
+2.4.3 Abstrahierende Programmeinheiten 32
+2.4.3.1 Refinementvereinbarung 32
+ Vorteile der Refinementanwendung 33
+ Wertliefernde Refinements 34
+2.4.3.2 Prozedurvereinbarung 35
+2.4.3.3 Operatorvereinbarung 41
+ Verwendung von Prozeduren 35
+ Prozeduren mit Parametern 38
+ Prozeduren als Parameter 39
+ Wertliefernde Prozeduren 40
+ Vereinbarung eines monadischen Operators 42
+ Vereinbarung eines dyadischen Operators 42
+2.4.3.4 Paketvereinbarung 43
+ Spracherweiterung 44
+ Schutz vor fehlerhaftem Zugriff
+ auf Datenobjekte 45
+ Realisierung von abstrakten Datentypen 47
+2.4.4 Terminatoren für Refinements,
+ Prozeduren und Operatoren 48
+2.4.5 Generizität von Prozeduren und Operatoren 49
+ Priorität von generischen Operatoren 49
+2.4.6 Rekursive Prozeduren und Operatoren 50
+2.5 Programmstruktur 52
+2.6 Zusammengesetzte Datentypen 56
+2.6.1 Reihung 56
+2.6.2 Struktur 61
+2.6.3 LET-Konstrukt für
+ zusammengesetzte Datentypen 64
+2.6.4 Denoter für zusammengesetzte
+ Datentypen (Konstruktor) 65
+2.7 Abstrakte Datentypen 67
+2.7.1 Definition neuer Datentypen 67
+2.7.2 Konkretisierung 69
+2.7.3 Denoter für abstrakte Datentypen (Konstruktor) 70
+2.8 Dateien 73
+2.8.1 Datentypen FILE und DIRFILE 73
+ FILE: 73
+ DIRFILE: 73
+2.8.2 Deklaration und Assoziierung 74
+ input: 75
+ output: 75
+ modify: 75
+2.9 Abstrakte Datentypen im EUMEL-System 77
+2.9.1 Datentyp TASK 77
+2.9.2 Datentyp THESAURUS 79
+2.9.3 Datenräume 81
+2.9.3.1 Datentyp DATASPACE 82
+2.9.3.2 BOUND-Objekte 83
+ Häufige Fehler bei der Benutzung von Datenräume 85
+2.9.3.3 Definition neuer Dateitypen 88
+2.9.4 Datentyp INITFLAG 91
+#tableend#
+
+
+
+
+TEIL 3 : Der Editor
+#table#
+3.1 Ein- und Ausschalten des Editors 1
+3.2 Die Funktionstasten 3
+3.3 Die Wirkung der Funktionstasten 4
+3.4 ESC Kommandos 11
+ Operationen auf Markierungen 15
+ Zeichen schreiben 16
+ Kommando auf Taste legen 16
+ Vorbelegte Tasten 17
+ Der Lernmodus 17
+3.5 Positionieren, Suchen, Ersetzen
+ im Kommandodialog 21
+ Weitere Hilfen 23
+#tableend#
+
+
+
+
+TEIL 4 : Kommandosprache
+#table#
+4.1 Supervisor 2
+4.2 Monitor 6
+4.2.1 Hilfsprozeduren 8
+ Informationsprozeduren 11
+4.2.2 Thesaurus 16
+4.2.3 Tasks 21
+4.2.4 Handhabung von Dateien 26
+4.2.5 Editor-Prozeduren 29
+4.2.6 Dateitransfer 33
+4.2.7 Passwortschutz 39
+4.2.8 Das Archiv 44
+ Fehlermeldungen des Archivs 52
+#tableend#
+
+
+
+
+TEIL 5 : Programmierung
+#table#
+5.1 Der ELAN-Compiler 1
+5.1.1 Fehlermeldungen des ELAN-Compilers 5
+5.2 Standardtypen 7
+5.2.1 Bool 7
+5.2.2 Integer-Arithmetik 9
+5.2.3 Real-Arithmetik 16
+5.2.4 Text 26
+ Der EUMEL-Zeichensatz 29
+5.3.1 Assoziierung 41
+5.3.2 Informationsprozeduren 43
+5.3.3 Betriebsrichtung INPUT 44
+5.3.4 Betriebsrichtung OUTPUT 46
+5.3.5 Betriebsrichtung MODIFY 48
+5.3.6 FILE -Ausschnitte 51
+5.4 Suchen und Ersetzen in Textdateien 53
+5.4.1 Aufbau von Textmustern 54
+5.4.2 Suche nach Textmustern 57
+5.4.3 Treffer registrieren 59
+5.4.4 Treffer herausnehmen 60
+5.4.5 Ändern in Dateien 61
+5.4.6 Editor-Prozeduren 62
+5.4.7 Sortierung von Textdateien 64
+5.4.8 Prozeduren auf Datenräumen 65
+5.5 Eingabe/Ausgabe 68
+5.5.1 E/A auf Bildschirm 69
+5.5.1.1 Eingabesteuerzeichen 69
+5.5.1.2 Ausgabesteuerzeichen 70
+5.5.1.3 Positionierung 71
+ Grundlegende Prozeduren 72
+ Umleitbare Eingabeprozeduren 73
+ Grundlegende Prozeduren 75
+ Umleitbare Ausgabeprozeduren 77
+5.5.1.4 Eingabe 72
+5.5.1.5 Ausgabe 75
+5.5.1.6 Kontrolle 79
+5.5.2 Zeitmessung 80
+5.6 Scanner 83
+ Scanner-Kommandos 85
+#tableend#
+
+
+
+
+TEIL 6 : Das Archiv 'std zusatz'
+#table#
+6.1 Erweiterungen um Mathematische Operationen 2
+6.1.1 COMPLEX 2
+6.1.2 LONGINT 7
+6.1.3 VECTOR 16
+6.1.4 MATRIX 24
+6.2 Programmanalyse 36
+ reporter - Kommandos 39
+ Referencer 41
+ referencer - Kommandos 42
+6.3 Rechnen im Editor 43
+ Arbeitsweise 43
+ TeCal Prozeduren 44
+#tableend#
+
+
+
+
+Anhang : ELAN-Syntaxdiagramme
+
+
+
+
+INDEX
+
diff --git a/doc/programming/programmierhandbuch.titel b/doc/programming/programmierhandbuch.titel
new file mode 100644
index 0000000..79b09b0
--- /dev/null
+++ b/doc/programming/programmierhandbuch.titel
@@ -0,0 +1,52 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#Programmierhandbuch
+
+
+
+
+#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#
+#block##pageblock#
+#start(5.0,1.5)#
+
+#lpos(3.0)#
+#table#
+
+
+
+
+
+
+Benutzerhandbuch
+
+Programmierung
+
+
+
+Stand: 1.7.87
+
+#tableend##page#
+
+
diff --git a/doc/prolog/prolog handbuch b/doc/prolog/prolog handbuch
new file mode 100644
index 0000000..ea7c6a5
--- /dev/null
+++ b/doc/prolog/prolog handbuch
@@ -0,0 +1,581 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#Prolog
+
+
+
+
+#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#
+
+Dr.P.Heyderhoff 12.03.1987
+GMD.F2.G2
+
+
+
+
+
+
+ E L A N - P R O L O G
+ _____________________
+
+ (Die Fachsprache der künstlichen Intelligenz)
+
+#on("u")#Benutzungsanleitung und technische Beschreibung#off("u")#
+
+
+Elan-Prolog ist eine Computersprache der fünften Generation, die für
+die Praxis der Programmierung und die Lehre in Informatik eine neue
+Dimension erschließt. Für den professionellen Programmierer eröffnet sie
+neue Möglichkeiten, mächtige Anwendungen, wie Expertensysteme und andere
+neuartige Systeme der Wissensverarbeitung zu entwickeln.
+
+Elan-Prolog unterscheidet sich grundsätzlich von üblichen konventionellen
+Programmiersprachen. In Sprachen wie Elan und Pascal muß der Programmierer
+genau angeben, wie ein gewünschtes Ergebnis errechnet werden soll. Um was es
+sich dabei handelt, steht bestenfalls dann in der Dokumentation. Ganz anders
+ist es in Prolog. PROLOG steht für PROgrammieren in LOgik und basiert auf
+dem Prädikaten-Kalkül, der bekanntesten Form der formalen Logik. Also in
+Prolog schreibt der Programmierer hin, worin das Problem besteht. Er bedient
+sich dabei dieser formalen Logik. Prolog versucht dann eine Lösung zu
+finden. Der Lösungsweg ist dabei im Programm nicht vorgeschrieben. Das
+entlastet den Programmierer, und er kann seine ganze Kraft auf die logische
+Beschreibung des Problems konzentrieren.
+
+Elan-Prolog ist ein interpretatives System, das voll kompatibel ist mit dem
+Edinburgh Standard Prolog und in in komfortabler Weise in das Betriebssystem
+Eumel eingebettet ist.
+
+Eigenschaftes von Elan-Prolog:
+
+- Syntax gemäß dem Edinburgh Standard Prolog nach Clocksin-Mellish
+
+- Interpretierendes System mit inkrementellem Einpass-Compiler
+
+- Interaktiver Mehrfenster-Texteditor des Eumelsystems
+
+- Zugriff auf Elan-Prozeduren als Prolog-Regeln
+
+- Geschwindigkeit ca. 100 LIPS auf IBM/PC-XT
+
+- optionale dynamische Ablaufverfolgung
+
+- Erklärungskomponente
+
+- Eingabe und Ausgabe von Prolog-Ausdrücken und Klartext
+
+- Programmiert und dokumentiert in ELAN (über 2000 Zeilen)
+
+- daher besonders für den Informatik-Unterricht geeignet
+#page#
+#on("u")#Beschränkungen des Elan-Prolog:#off("u")#
+
+Folgende Beschränkungen gelten für die Implementierung von Elan-Prolog im
+Eumel-Systems:
+
+- Maximal 16000 Fakten und Regeln
+
+- Maximal 16000 Terme zur Konstruktion von Ausdrücken, Listen und Regeln
+
+- Maximal 800 Variablenbindungen
+
+- Maximal 800 Einträge im Beweisbaum
+
+- Maximal 4000 Bezeichner für Atome und Variablen
+
+- Maximal 16000 Buchstaben für alle Bezeichner zusammen
+
+
+Wie sieht ein Prolog-Programm aus?
+
+Ein Prolog-Programm besteht aus
+
+ - Fakten über Objekte und ihre Beziehungen
+
+ - Regeln über Objekte und ihre Beziehungen
+
+und besonders wichtig:
+
+ - Der Benutzer kann Prolog über die Fakten und Regeln ausfragen.
+
+Fakten aus einer Wissensbasis, nämlich dem Prolog-Programm, sind z.B.:
+
+ enthaelt (wisky, aethanol).
+
+Das wird gelesen als: "Wisky enthält Aethanol.". Grundzüge der sehr
+einfachen Syntax lassen sich hieran erklären. Ein Faktum wird geschrieben
+wie in diesem Beispiel:
+
+ - Erst kommt der Name der Relation, geschrieben wie ein Elan-Name in
+ kleinen Buchstaben.
+
+ - Dann folgt in runden Klammern und durch Kommata getrennt eine Liste
+ von Objektnamen.
+
+ - Zum Schluß steht ein Punkt.
+
+Regeln sind Problembeschreibungen in der Form von logischen Ausdrücken der
+symbolischen Logik, wie z.B. die folgende Regel:
+
+ bewirkt (A, B, kopfschmerz) :- enthaelt (A, aethanol),
+ enthaelt (B, aspirin ).
+
+Das wird gelesen als: "Wenn man eine Droge A, die Aethanol enthält,
+und eine Droge B, die Aspirin enthält gleichzeitig einnimmt, dann bewirkt
+das Kopfschmerzen." Wie man sieht werden logische Variablen mit großen
+Buchstaben (wie Elan-Operatoren) geschrieben. Das Zeichen ":-" steht für das
+logische Wenn, und das Komma(",") für die logische Konjunktion. Die logische
+Disjunktion wird durch Semikolon(";") ausgedrückt.
+#page#
+Neben der hiermit vorgestellten Prefix-Schreibweise für Relationen gibt es in
+ELAN-Prolog auch noch eine Infix-Schreibweise für zweistellige Relationen.
+Hierbei werden die Relationen als Infix-Operatoren in großen
+Buchstaben geschrieben (wie in ELAN) und zwischen die beiden Operanden
+gesetzt. Als Operatoren sind auch die in Elan üblichen Operatoren
+
+ ( +, -, *, /, MOD, =, <, >, <=, >=, <> )
+zulässig.
+
+In Infixausdrücken (wie z.B. 2+3*4) gelten die bekannten Vorrangregeln. Auch
+Klammern sind zulässig. Selbstdefinierte Operatoren haben niedrigste
+Priorität.
+
+Obiges Beispiel in Infix-Schreibweise:
+
+ wisky ENTHAELT aethanol.
+
+ bewirkt (A, B, kopfschmerz) :- A ENTHAELT aethanol,
+ B ENTHAELT aspirin.
+
+
+Objekte in Prolog können Atome oder Listen sein. Für Atome gibt es zwei
+Schreibweisen:
+
+ - genau so wie Elan-Bezeichner, also bestehend aus kleinen Buchstaben
+ und Blanks. Dabei werden die Blanks eliminiert.
+
+ - genauso wie Elan-Texte, nämlich in Gänsefüßchen eingeschlossen.
+
+Für Listen von Objekten gibt es wiederrum zwei Schreibweisen, wie folgende
+zwei unterschiedlichen Notationen des gleichen Beispiels zeigen:
+
+ - [ das, ist, [ zum, beispiel ], eine, liste ]
+
+ - [ das, ist, [ zum | [ beispiel | [] ] ], eine, liste ]
+
+Im zweiten Fall ist die als drittes Element in der Gesamtlisten enthaltene
+Teilliste mit dem Konstruktor "|" und der leeren Liste "[]" zusammengesetzt.
+Die Grundoperationen, die aus der Programmiersprache LISP bekannt sind,
+können als Prolog-Fakten unmittelbar wie folgt definiert werden:
+
+ eq (X, X).
+ head ([X|Y], X).
+ tail ([X|Y], Y).
+ cons (X, Y, [X|Y]).
+#page#
+#on("u")#Standard - Operatoren von Elan-Prolog:#off("u")#
+
+Im System sind nur ganz wenige Standardoperatoren eingebaut. Es sind die
+folgenden Fakten:
+
+ - ! . der CUT-Operator schaltet des Backtracking ab.
+
+ - bye. beendet die prolog Anwendung.
+
+ - listing. zeigt alle insertierten Regeln.
+
+ - listing (X). zeigt alle insertierten Regeln über X.
+
+ - call (X). X wird ausgeführt.
+
+ - write (X). das an X gebundenen Prolog-Objekts wird ausgegeben,
+ writeq (X). und wenn nicht eindeutig, gequotet,
+ put (X). das Zeichen, dessen ASCII-Code X ist wird ausgegeben,
+ name (X,[Y]). unifiziert das Atom X mit der Liste seiner Buchstaben.
+
+ - read (X). ein Objekt wird gelesen und an die Variable gebunden.
+ get0 (X). das nächste Zeichen wird gelesen,
+ get (X). das nächste druckbare Zeichen wird gelesen,
+
+ - X = Y . Die an X und Y gebundenen Objekte sind gleich,
+ X <> Y . sie sind ungleich,
+ X <= Y . sie sind kleiner oder gleich,
+ X == Y . sie sind wörtlich gleich,
+ X =.. [F|A] . X ist der Term mit Funktor F und Argumentliste A.
+
+ - X + Y . sie sollen addiert,
+ X - Y . subtrahiert,
+ X * Y . multipliziert,
+ X / Y . dividiert,
+ X MOD Y . der Divisionsrest soll ermittelt werden,
+ die Auswertung geschieht durch den 'is'-Operators.
+
+ - X IS EXPR . Das Ergebnis des arithmetischen Ausdrucks EXPR wird
+ gebildet und mit X unifiziert.
+
+ - incr (X). der arithmetische Wert von X wird um eins erhöht.
+
+ - assertz ([X]). insertiert die Regel X am Ende einfügend.
+ asserta ([Χ]). insertiert die Regel X am Anfang einfügend.
+ retract ([X]). entfernt die Regel X wieder.
+ clause (X,[Y]). holt die Regel Y mit dem Kopf X aus der Knowledgebase.
+
+ - functor (X,Y,Z) Y ist der Funktor von X und Z ist seine Arität.
+ arg (X,Y,Z). Z ist das x-te Argument der Funktion Y.
+
+ - elan (X). Ausführung der insertierten ELAN-Prozedur X
+ elan (X,Y). Ausführung von X mit dem TEXT-CONST-Parameter Y
+
+ - elan(trace,on). schaltet den dynamischen Ablaufverfolger ein und
+ elan(trace,off) schaltet ihn wieder ab.
+
+ - elan(consult,X) lädt das Prologprogramm aus der Datei namens X hinzu.
+ elan(reconsult,X) ersetzt das Prologprogramm aus der Datei X.
+ elan(abolish,X) entfernt alle Regeln mit dem Namen X.
+#page#
+#on("u")#Das Dialogverhalten von Elan-Prolog:#off("u")#
+
+Elan-Prolog wird, sobald es in das Eumel-System insertiert ist, als Prozedur
+mit dem Namen "prolog" und einem optionalen TEXT-Parameter aufgerufen. Der
+Textparameter enthält den Namen einer Datei, die ein Prolog-Programm enthält,
+das geladen werden soll. Fehlt der Parameter, wird, wie üblich, die zuletzt
+bearbeitete Datei genommen. Im Prolog-Dialog können später weitere
+Prolog-Programme mit der Prozedur namens "consult" hinzugeladen werden.
+
+Also
+einfachster Aufruf: prolog ("")
+
+Antwort: ?-
+Beispiel-Eingabe: 3 = 3
+Antwort: yes
+ ?-
+Eingabe: 4 = -5
+Antwort: no
+ ?-
+
+Besondere Dialogkommandos:
+
+ ?-
+Eingabe: ?
+Antwort z.B.: 13.5 SEC
+ ?-
+Eingabe: listing
+Antwort: { zeigt alle aktuell verfügbaren Regeln }
+ ?-
+Eingabe: {ESCAPE} q
+Ausgabe: gib kommando:
+
+Eingabe: prolog again
+Ausgabe: ?-
+Eingabe: [sum, permute] {in eckigen Klammern!}
+ { konsultiert diese beiden Dateien }
+Antwort z.B.: 25 rules inserted.
+ ?-
+Eingabe: [-sum, -permute]
+ { löscht und rekonsultiert aus diesen Dateien }
+Antwort z.B.: 25 rules inserted.
+
+Eingabe: {ESCAPE} {ESCAPE}
+Antwort: gib kommado:
+Elan-Eingabe z.B.: show ("standard")
+ { zeigt die Datei dieses Namens }
+ ?-
+
+Auf diese Weise können bequem Eumel-Kommandos gegeben werden. Die
+Umschaltung vom Prolog- zum Eumelmonitor-Betrieb erfolgt durch die Tasten
+{ESCAPE},{ESCAPE} und {RETURN}. Wie üblich ist das zuletzt verwendete
+Kommando auch im Prolog-Dialog mit dem Escapekommando "{ESCAPE} k"
+wiederzubekommen. Das Kommando "{ESCAPE} q" beendet den Dialog.
+#page#
+#on("u")#Ausprobieren der Prolog-Programmbeispiele:#off("u")#
+
+Zum Ausprobieren sind die Prologbeispiele "eq", "permute" und "mann"
+beigefügt.
+
+Beispiel: ?-
+Eingabe: [permute] {in eckigen Klammern!}
+Antwort: 5 rules inserted.
+ ?-
+Eingabe: marquise(X)
+Antwort: beautiful marquise your beautiful eyes make me die of love
+Eingabe: {Semicolon}
+Antwort: your beautiful eyes beautiful marquise make me die of love
+ { usw }
+Eingabe: {Return}
+Antwort: ?-
+
+Jede #on("u")#Eingabe von Semicolon#off("u")# liefert als Antwort die nächste Permutation. Wenn
+eine andere Taste gedrückt wird, bricht die Ausgabe weiterer Ergebnisse ab.
+
+#on("u")#Eingabe von Fragezeichen#off("u")# liefert neben der Angabe der benötigten
+Rechenzeit eine Erklärung der letzten Antwort durch Ausgabe aller zu dieser
+Antwort führenden Schlußfolgerungen. Dabei wird der Beweisbaum in Form einer
+Einrückstruktur dargestellt. Die Einrückung stellt die Erklärungstiefe dar.
+
+
+#on("u")#Benutzung von Prolog von Elan-Programmen aus#off("u")#
+
+Wenn man Prolog als Unterprogramm von Elan aus aufrufen will, geht man
+folgendermaßen vor:
+
+1. Laden einer Wissensbasis,
+ die in einer Datei namens <knowledgebase> z.B."permute" bereitsteht:
+
+ push ("bye"13"");
+ prolog ("permute");
+
+
+2. Abfragen an diese Wissensbasis:
+
+ TEXT VAR query, answer;
+ query:= "marquise (X)";
+ IF prolog ( query, answer)
+ THEN put (answer)
+ ELSE put ("NO")
+ FI;
+
+In diesem Anwendungsbeispiel liefert die Ausgabeanweisung 'put (answer)':
+
+ beautiful marquise your beatiful eyes make me die of love
+
+#page#
+#on("u")#Literatur:#off("u")#
+
+
+1.) W.F.Clocksin, C.S.Mellish:
+ Programming in Prolog
+ Springer 1984
+
+2.) M.H.van Emden:
+ An interpreting algorithm for prolog programs
+ in Implementations of Prolog, Ellis Herwood Ltd, 1984
+
+3.) Alain Colmerauer:
+ Prolog in 10 Figures
+ Communications of the ACM December 1985
+
+4.) J. Cohen:
+ Describing Prolog by its Interpretation and Compilation
+ Communications of the ACM December 1985
+
+5.) Alain Colmerauer:
+ Les system q ou un formalisme pour alalyser et synthetiser des phrases
+ sur ordinateur.
+ Intern.Rep. 43, Departement d'informatique. Universite de Montreal
+ Sept. 1970
+#page#
+(*************************************************************************)
+(* *)
+(* Elan-Prolog *)
+(* *)
+(* Programm-Beispiele: *)
+(* *)
+(****************** standard (nach Clocksin-Mellish) ********************)
+
+abolish (X) :- elan (abolish, X).
+append ([], X, X) :- !.
+append ([X|Y], Z, [X|W]) :- append (Y, Z, W).
+atom (X) :- functor (X, Y, 0).
+atomic (X) :- atom (X); integer (X).
+consult (X) :- elan (consult, X).
+end :- bye.
+fail :- [].
+findall (X, Y, Z) :- tell ("$$"), write ("("), findall (X,Y);
+ write (")"), told, see ("$$"), read (Z),
+ seen, elan (forget, "$$").
+findall (X, Y) :- call (Y), writeq (X), write (","), [].
+integer (X) :- functor (X, Y, -1).
+listing (X).
+member (X, [X|Z]).
+member (X, [Y|Z]) :- member (X, Z).
+nl :- elan (line).
+non var (X) :- var (X), !, []; .
+not (X) :- call (X), !, []; .
+notrace :- elan (trace, off).
+reconsult (X) :- elan (reconsult, X).
+repeat.
+repeat :- repeat.
+see (X) :- elan (sysin, X).
+seen :- elan (sysin, "").
+tab (X) :- tab(X,1).
+tab (X,Y) :- Y<=X, !, put (32), incr(Y), tab(X,Y);.
+tell (X) :- elan (sysout, X).
+told :- elan (sysout, "").
+trace :- elan (trace, on).
+true.
+< (X, Y) :- <= (X, Y), <> (X, Y).
+> (X, Y) :- <= (Y, X).
+>= (X, Y) :- < (Y, X).
+#page#
+(**************************** sum ***********************************)
+
+suc (0, 1). suc (1, 2). suc (2, 3). suc (3, 4). suc (4, 5).
+suc (5, 6). suc (6, 7). suc (7, 8). suc (8, 9).
+sum (0, X, X).
+sum (X, Y, Z):- suc (V, X), sum (V, Y, W), suc (W, Z).
+plus (X, [0,0], X):- !.
+plus (X, Y, Z):- plus one (V, Y), plus (X, V, W), !, plus one (W, Z).
+plus one ([X, Y], [V, W]):- suc (Y, W), X = V, !;
+ Y = 9, suc (X, V), W = 0.
+treereverse (X,Y):- rev (X,Y), !; rev (Y,X), !.
+rev ([], []).
+rev ([X|Y], Z):- X <> [H|T], rev (Y, W), !, append (W, [X], Z);
+ rev (X, V), rev (Y, W), !, append (W, [V], Z).
+
+(**************************** permute ************************************)
+
+permute ([], []).
+permute ([E|X], Z):-
+ permute (X, Y), insert (E, Y, Z).
+insert (E, X, [E|X]).
+insert (E, [F|X], [F|Y]):-
+ insert (E, X, Y).
+marquise(RESULT):-
+ permute (["beautiful marquise",
+ "your beautiful eyes",
+ "make me",
+ "die",
+ "of love"
+ ],
+ RESULT).
+
+(**************************** puzzle ************************************)
+
+ {Solution: 9,5,6,7,0,8,2}
+puzzle:- repeat, permute ((9,8,7,6,5,2,0), SENDMORY),
+ write (SENDMORY),
+ puzzle (SENDMORY, SEND, MORE, MONEY),
+ elan (line),
+ write (SEND), write (+),
+ write (MORE), write (=),
+ write (MONEY).
+
+puzzle([S,E,N,D,O,R,Y], SEND, MORE, MONEY):-
+ SEND IS ((S * 10 + E) * 10 + N) * 10 + D,
+ MORE IS ((10 + O) * 10 + R) * 10 + E,
+ MONEY IS (((10 + O) * 10 + N) * 10 + E) * 10 + Y,
+ MONEY IS SEND + MORE.
+
+permute ([], []).
+permute ([E|X], Z):- permute (X, Y), insert (E, Y, Z).
+
+insert (E, X, [E|X]).
+insert (E, [F|X], [F|Y]):- insert (E, X, Y).
+
+repeat.
+repeat:- repeat.
+#page#
+(**************************** prieks ***********************************)
+
+ist priek (bo priek).
+ist priek (ki priek).
+ist priek (bla priek).
+
+WER GNASELT WEN :- population (B),
+ member ([WEN, WER, _], B),
+ bedingungen (B).
+
+WER KNAUDERT WEN:- population (B),
+ member ([WER, _, WEN], B),
+ bedingungen (B).
+
+population (B):- sind prieks (U, V, W),
+ sind knauderarten (R, S, T),
+ B = [ [drausla puemfe, U, R],
+ [glessla puemfe, V, S],
+ [hapla puemfe, W, T] ].
+
+sind prieks (X,Y,Z):- ist priek (G),
+ ist priek (H), H<>G,
+ ist priek (I), I<>G, I<>H, !,
+ permute ([G,H,I], [X,Y,Z]).
+
+sind knauderarten (X,Y,Z):- ist knauderart (G),
+ ist knauderart (H), H<>G,
+ ist knauderart (I), I<>G, I<>H, !,
+ permute ([G,H,I],[X,Y,Z]).
+
+ist knauderart (an).
+ist knauderart (ab).
+ist knauderart (ueber).
+
+bedingungen (B):- not member ([hapla puemfe,ki priek,_],B) ,
+ not member ([hapla puemfe,_,ueber],B) ,
+ not member ([drausla puemfe,bo priek,_],B) ,
+ not member ([_,bo priek,ab],B) ,
+ noch ne bedingung (B) ,
+ weitere bedingungen (B) , !.
+
+weitere bedingungen (B):- not member([_,ki priek,ueber],B),
+ not member([_,bo priek,ueber],B)
+ ;
+ member([drausla puemfe,_,an],B).
+
+noch ne bedingung (B):- not member ([drausla puemfe,ki priek,_],B)
+ ;
+ not member ([glessla puemfe,_,ueber],B).
+
+permute ([], []).
+permute (X, [Y|Z]):- delete (Y ,X, E), permute (E, Z).
+delete (X, [X|Z], Z).
+delete (X, [Y|Z], [Y|E]):- delete (X, Z, E).
+member (X, [X|Z]).
+member (X, [Y|Z]):- member (X, Z).
+not member (X, []).
+not member (X, [Y|Z]):- X <> Y, not member (X,Z).
+#page#
+(**************************** calc ************************************)
+
+{ CALC evaluates arithmetic expressions with store }
+
+calc:- eval ([], RS), write (result store), write (RS), nl.
+
+eval (SI, SO):-
+ read (CALC), nonvar (CALC), eval member (CALC, SI, SO).
+
+eval member (CALC, SI, SO):-
+ member (CALC, [stop,end,bye,eof]), SO=SI;
+ eval (CALC,I,SI,ST), write (I), eval (ST,SO);
+ write (error in), write (CALC), nl, eval (SI, SO).
+
+eval (I, I, S, S):- integer (I).
+eval (N, I, S, S):- atom (N), eval atom (N, I, S).
+
+eval atom (N, I, S):-
+ member (N=I, S);
+ write ("error: Cell"), write (N),
+ write("not found in store. 0 substituted."), nl, I=0.
+
+eval ( L+R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J+K.
+eval ( L-R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J-K.
+eval ( L*R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J*K.
+eval ( L/R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J/K.
+
+eval (N=O, I, SI, SO):-
+ atom (N), eval (O,I,SI,ST), eval repl (N,I,ST,SO).
+
+eval repl (N, I, [], [=(N,I)]).
+eval repl (N, I, [=(N,_)|S], [=(N,I)|S]).
+eval repl (N, I, [=(M,J)|SI], [=(M,J)|SO]):- eval repl (N, I, SI, SO).
+
diff --git a/doc/prozess/Anhang Prozess b/doc/prozess/Anhang Prozess
new file mode 100644
index 0000000..8415268
--- /dev/null
+++ b/doc/prozess/Anhang Prozess
@@ -0,0 +1,92 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#center##on("b")#Anhang#off("b")#
+
+#center##on("b")#Bezugsquellenverzeichnis#off("b")#
+
+
+ - AKTRONIK
+ Elektronik-Großhandel
+ A. Kaup
+ Teichstraße 9
+ 4401 Saerbeck
+ Tel.: 02574/8008 - 8009
+
+
+
+ - BICOS Computer GmbH
+ Werkering 6
+ Postfach 1229
+ 4800 Bielefeld 1
+ Tel.: 0521/34011
+
+
+
+ - lattasoft
+ Eva Latta-Weber
+ Software-  und
+ Hardware-Systeme
+ Brehmstraße 7
+ 4800 Bielefeld 1
+ Tel.: 0521/38919
+
+
+
+ - Landesinstitut für Schule
+ und Weiterbildung
+ Paradieser Weg 64
+ 4770 Soest
+ Tel.: 02921/683-1
+
+#page#
+#on("b")#Anhang#off("b")#
+
+#on("b")#Verzeichnis der Abbildungen#off("b")#
+
+Abb. 1: MUFI geöffnet
+Abb. 2: Mögliche DIP-Schalter-Stellung beim MUFI
+Abb. 3: Einbau des MUFIs in den Terminalkanal
+Abb. 4: RS232-Adapter geöffnet
+Abb. 5: Mögliche Jumperposition beim RS232-Adapter
+Abb. 6: Auswahl der Interface-Anpassung
+Abb. 7: Anschluß Leuchtdiodenanzeige -Kombikarte
+Abb. 8: Pinbelegung auf der E/A-Karte
+Abb. 9: Eingangsbildschirm ls-Prozess
+Abb.10: Menubildschirm zum Oberbegriff 'Interface'
+Abb.11: Information bei unkonfiguriertem System
+Abb.12: Auswahl der Steckplatzart
+Abb.13: Compact-Box: Belegung der Kanäle
+Abb.14: Auswahl einer Interfacekarte
+Abb.15: Kanalbelegung D/A-Karte (Einzelsteckplatz)
+Abb.16: A/D-Karte: Angabe der Schalterstellung
+Abb.17: A/D-Karte: Kanalbel./Spannungsber.(Bspl.)
+Abb.18: Ausgabetest - Einblendung
+Abb.19: Eingabetest - Einblendung
+Abb.20: Beispiellochkarte
+Abb.21: Aufbau eines Drehpotentiometers
+Abb.22: Eingangsbildschirm ls-Prozess
+Abb.23: Befehlsübersicht
+Abb.24: Auswahl Ausgabebefehle
+Abb.25: Auswahl Eingabebefehle
+Abb.26: Auswahl Testbefehle
+Abb.27: Auswahl 'Weitere Befehle'
+Abb.28: Menubildschirm zum Oberbegriff 'Interface'
+Abb.29: Menubildschirm zum Oberbegriff 'Programm'
+Abb.30: Informationsauswahl zum EUMEL-Editor
+Abb.31: Menubildschirm zum Oberbegriff 'Archiv'
+Abb.32: Auswahl der Archiv-Formate
+Abb.33: Auswahl der Zieltask
+
+
+
diff --git a/doc/prozess/Inhalt Prozess b/doc/prozess/Inhalt Prozess
new file mode 100644
index 0000000..ab9616a
--- /dev/null
+++ b/doc/prozess/Inhalt Prozess
@@ -0,0 +1,84 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#center##on("b")#Inhaltsverzeichnis#off("b")#
+
+1 Was kann gs-Prozess
+
+2 Allgemeines zur Prozeßdatenverarbeitung
+2.1 Welche Hardware-Lösungen gibt es zur Zeit ?
+2.2 Die besonderen Probleme unter EUMEL
+2.3 Die Wahl des Interface-Systems
+
+3 Installation des Interface-Systems
+3.1 Das MUFI der Firma BICOS als Adapter
+3.1.1 Einstellung der DIP-Schalter am MUFI
+3.1.2 Einbau des MUFIs in den Terminalkanal
+3.1.3 Das MUFI an separater serieller Schnittstelle
+3.2 Der RS232-Adapter der Firma AKTRONIK
+3.3 Verbindung Adapter - Interface-System
+3.4 Bereitstellung des Interface-Systems
+
+4 Installation von gs-Prozess
+4.1 Voraussetzungen
+4.2 Lieferumfang
+4.3 Installation
+4.4 Anmerkungen zur Erstinstallation
+
+5 Konfiguration von gs-Prozess
+5.1 Kontrolle der Konfigurationen/Anschlüsse
+5.2 Vorbereitungen für den Ein-/Ausgabetest
+5.2.1 Anschluß einer Leuchtdiodenanzeige an die Kombikarte
+5.2.2 Anschluß des Codekartenlesers (Drahtstück)
+5.3 Konfiguration von gs-Prozess
+5.3.1 Auswahl der Steckplatzart/Interfacekarte
+5.3.2 Bedeutung der Kanalnummern
+5.4 Aus- und Eingabetest
+5.5 Mögliche Fehlerfälle
+
+6 Arbeiten mit gs-Prozess
+6.1 Kleine Beispiele zur digitalen Ausgabe
+6.1.1 Möglichkeit eines Programmabbruchs
+6.1.2 Die "sonstigen" Befehle
+6.1.3 Schreibweise für Bitmuster/Bitsymbole
+6.1.4 Befehle für die digitale Ausgabe
+6.1.5 Befehle für die analoge Ausgabe
+6.2 Kleine Beispiele zur digitalen Eingabe
+6.2.1 Befehle für die digitale Eingabe
+6.2.2 Eingabetests
+6.2.3 Befehle für die analoge Eingabe
+6.3 Hinweise auf Aufgabenmaterial
+
+7 Beschreibung der Menufunktionen
+7.1 Kurzhinweise zur Bedienung der Menus
+7.2 Menufunktionen zum Oberbegriff 'Info'
+7.3 Menufunktionen zum Oberbegriff 'Interface'
+7.4 Menufunktionen zum Oberbegriff 'Programm'
+7.5 Menufunktionen zum Oberbegriff 'Archiv'
+
+8 Detailbeschreibung der Basisbefehle und Tests
+
+9 Hinweise für den Systembetreuer/    Programmierer
+9.1 Vergabe der Kanäle/Organisation des Tasksystems
+9.2 Informationsprozeduren
+9.3 Neufestlegung des Interfacekanals
+9.4 Fixieren der Konfiguration
+9.5 Mögliche Fehlerfälle
+9.6 Weitere Möglichkeiten
+
+Anhang: Bezugsquellenverzeichnis
+ Verzeichnis der Abbildungen
+
+
+
+
diff --git a/doc/prozess/gs-Prozess handbuch.impressum b/doc/prozess/gs-Prozess handbuch.impressum
new file mode 100644
index 0000000..ca22b10
--- /dev/null
+++ b/doc/prozess/gs-Prozess handbuch.impressum
@@ -0,0 +1,104 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#gs-Prozess
+
+
+
+
+#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#
+
+#free (4.0)##on("b")#
+#center#gs-Prozess
+
+
+#center#Benutzerhandbuch
+
+
+#center#Version 1.0
+
+
+#off("b")##center#copyright
+#center#Eva Latta-Weber
+#center#Software- und Hardware-Systeme, 1988
+#center#ERGOS GmbH, 1990
+#page#
+#block#
+#center#____________________________________________________________________________
+
+
+Copyright:  ERGOS GmbH   März 1990
+
+ Alle Rechte vorbehalten. Insbesondere ist die Überführung in
+ maschinenlesbare Form sowie das Speichern in Informations­
+ systemen, auch auszugsweise, nur mit schriftlicher Einwilligung
+ der ERGOS GmbH gestattet.
+
+
+#center#____________________________________________________________________________
+
+Es kann keine Gewähr übernommen werden, daß das Programm für eine
+bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
+Anwender.
+
+Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
+Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
+Handbuch kann jederzeit ohne Ankündigung geändert werden.
+
+Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
+ erstellt und aufbereitet und auf einem Kyocera Laser­
+ drucker gedruckt.
+
+
+
+
+#center#___________________________________________________________________________
+
+
+
+Ergonomic Office Software GmbH
+
+Bergstr. 7 Telefon: (02241) 63075
+5200 Siegburg Teletex: 2627-2241413=ERGOS
+ Telefax: (02241) 63078
+
+
+#center#____________________________________________________________________________
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/prozess/gs-Prozess-2 b/doc/prozess/gs-Prozess-2
new file mode 100644
index 0000000..376143e
--- /dev/null
+++ b/doc/prozess/gs-Prozess-2
@@ -0,0 +1,255 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#on("b")#2  Allgemeines zur Prozeßdatenverarbeitung#off("b")#
+
+In diesem Kapitel erfahren Sie, warum unter EUMEL/ELAN die Prozeßdatenver­
+arbeitung bisher kaum Berücksichtigung gefunden hat und welche Probleme zu
+überwinden waren. Es wird aufgezeigt, warum unter EUMEL/ELAN nicht jedes Inter­
+facesystem verwendet werden kann; außerdem werden die Gründe für die Wahl eines
+bestimmten Interfacesystems genannt.
+
+
+#on("b")#2.1  Welche Hardware-Lösungen gibt es zur Zeit ?#off("b")#
+
+Wie schon in Kapitel 1 erwähnt, ist zum Messen, Steuern und Regeln mit dem
+Computer ein Hardware-Interface notwendig, über das der "Kontakt zur Außenwelt"
+hergestellt wird.
+
+
+#on("b")#
+ Computer <--------> Interface <--------> Modell
+#off("b")#
+
+
+Interfaces (zu deutsch etwas mißverständlich: Schnittstellen) verbinden innerhalb
+eines Systems Teilsysteme und einzelne Funktionseinheiten miteinander. Dabei
+werden z.B. #on("b")#Hardware-Schnittstellen#off("b")# (Um diese geht es vornehmlich in diesem
+Kapitel), #on("b")#Hardware-Software-Schnittstellen#off("b")# (Nach Festlegung, welche Funktionen
+eines Rechnersystems von der Hardware und welche von der Software übernommen
+werden, erfolgt hierüber die Verknüpfung der beiden Komponenten), #on("b")#Software-
+Schnittstellen#off("b")# (zwischen Programmoduln), #on("b")#Mensch-Maschine-Schnittstellen#off("b")#
+(Benutzerschnittstellen - wie z.B. #on("b")#gs-DIALOG#off("b")#) unterschieden.
+
+Wenn wir im folgenden von 'Interface' reden, ist damit immer eine 'Hardware-
+Schnittstelle' gemeint.
+
+Über ein solches Interface (eine Hardware-Schnittstelle) können an den Computer
+externe Geräte/Modelle angeschlossen werden, die vom Computer aus gesteuert
+werden. Dabei setzt das Interface die vergleichsweise schwachen Signale des
+Computers in Ströme und Spannungen um, mit denen z.B. eine Lampe oder ein
+Motor betrieben werden kann. Umgekehrt senden externe Geräte/Modelle über das
+Interface Signale an den Computer, die von ihm ausgewertet werden. So müssen z.B.
+Widerstandsveränderungen eines Temperaturfühlers oder die Stellung eines Schalters
+in eine vom Computer erfaßbare Form umgewandelt werden.
+
+Inzwischen bieten verschiedene Hersteller (FISCHER, LEGO, AKTRONIK, PHYWE,
+etc.) und Lehrmittelverlage (METZLER, CVK, etc.) eine Reihe von Lösungen an.
+Leider sind die meisten Lösungen auf ganz spezielle Computertypen zugeschnitten
+und somit nicht an anderen Computertypen verwendbar - außerdem unterscheiden
+sich die verschiedenen Lösungen z.T. ganz erheblich im Leistungsumfang.
+
+Einzellösungen, insbesondere an den gängigen Homecomputern, gibt es schon seit
+langem. Voraussetzung ist zumeist, daß der Computer über einen speziellen
+Anschluß ('Userport' oder 'Joystick-Eingang') verfügt. Oder es werden Platinen
+geliefert, die in spezielle Steckplätze (Slots) einzustecken sind, wo sie vom Computer
+aus angesprochen werden können.
+
+Bei all diesen Lösungen konnten wir 'EUMELaner' nur neidvoll zuschauen. Der
+Vorteil, den wir sonst so zu schätzen wissen, ein einheitliches Betriebssystem auf ganz
+unterschiedlicher Hardware zur Verfügung zu haben, wird hier zum Nachteil. Eine
+einheitliche Lösung schien zu Anfang völlig aussichtslos zu sein.
+
+
+#on("b")#2.2  Die besonderen Probleme unter EUMEL#off("b")#
+
+Das Betriebssystem EUMEL gestattet es nicht, beliebig auf Hardwarekomponenten des
+Rechners zuzugreifen - und das aus gutem Grund, denn sonst wäre ein reibungsloser
+Multi-User-Betrieb nicht gewährleistet. Man kann aber den Zugriff auf neue Hard­
+warekomponenten im EUMEL-System etablieren. Allerdings ist das etwas aufwendiger
+als in anderen Systemen, denn das sogenannte 'Shard', die 'Software-Hardware-
+Schnittstelle', muß angepaßt werden.
+
+Unsere ersten "Gehversuche" mit der Prozeßdatenverarbeitung unter EUMEL haben
+so angefangen. Es ist aber leicht einzusehen, daß dieser Weg nicht sinnvoll ist. Denn
+dann müßten alle EUMEL-Shards (es gibt ja für jeden Rechnertyp mindestens eines)
+entsprechend geändert werden, ggf. müßten für verschiedene Lösungen verschiedene
+Versionen entwickelt werden - eine Aufgabe, die niemand bereit wäre zu überneh­
+men.
+
+
+#on("b")#2.3  Die Wahl des Interface-Systems#off("b")#
+
+Unser Ziel war klar: Wir wollten ein gängiges, käuflich zu erwerbendes Hardware-
+Interface möglichst universell an Computern verschiedener Hersteller unter dem
+Betriebssystem EUMEL ansprechen können.
+
+Nach Sichtung der angebotenen Systeme kamen nur drei in die engere Wahl: das
+LEGO-Interface, das FISCHER-Technik-Interface und das AKTRONIK-Interface (Soft­
+ware-kompatibel dazu ist das PHYWE-Interface).
+
+Bei der Auswahl hielten wir es für sinnvoll, die Empfehlung des Landesinstituts für
+Schule und Weiterbildung in Soest zu berücksichtigen, in der folgende Anforderungen
+an Interfaces formuliert sind:
+
+ - 8 digitale Eingänge
+ - 8 digitale Ausgänge
+ - optional: analoge Ein- und Ausgabe.
+
+Allen gestellten Anforderungen wird nur das AKTRONIK-Interface gerecht. Das System
+ist modular aufgebaut, je nach Anforderungen kann mit verschiedenen Steckkarten
+gearbeitet werden. Es gibt eine "Kompaktlösung", bei der die wichtigsten Funktionen
+bereitgestellt werden (8 digitale Eingänge, 8 digitale Ausgänge, 2 analoge Eingänge).
+Darüber hinaus kann auch noch mit dem sog. 'Modul-Bus' gearbeitet werden, bei
+dem gleichzeitig mehrere Steckkarten angesprochen werden können. Mit ent­
+sprechender Steckkarte ist auch die analoge Ausgabe möglich.
+
+Die beiden anderen Interfaces erfüllen die oben genannten Anforderungen nicht: Das
+LEGO-Interface verfügt über nur 6 digitale Ausgänge und 2 digitale Eingänge; analoge
+Ein- und Ausgabe ist gar nicht möglich.
+
+Das FISCHER-Technik-Inteface verfügt über 8 digitale Ausgänge und 8 digitale Ein­
+gänge. Das Interface verfügt auch über einen analogen Eingang - allerdings nicht
+über einen Analog-Digital-Wandler-Baustein! Das bedeutet, daß der angeschlossene
+Rechner die Auswertung der eingehenden Daten übernehmen muß - ein zeit­
+kritischer Prozeß, der in einem Multi-User-System nicht garantiert werden kann. Die
+analoge Ausgabe ist grundsätzlich nicht möglich, das System ist in sich abgeschlossen
+und kann sich ändernden Anforderungen ebensowenig angepaßt werden wie das
+LEGO-Interface.
+
+
+Wir entschieden uns also dafür, die weitere Entwicklung auf der Basis des
+AKTRONIK-Interfaces zu betreiben. Es galt jedoch noch, dieses Interface mit dem
+Computer zu verbinden - und das möglichst universell: möglichst unabhängig von der
+verwendeten Computerhardware.
+
+Dieses Ziel ist nur dann zu erreichen, wenn man die 'Standardschittstellen' des
+Computers berücksichtigt, die unter EUMEL problemlos ansprechbar sind: die
+parallelen (Centronics) und seriellen (V24) Schnittstellen. Diese 'Standardschnitt­
+stellen' sind zwar nicht für den direkten Anschluß der Modelle/Interfaces geeignet,
+über einen "Adapter" aber ist ein Anschluß möglich.
+
+Die Entscheidung fiel schnell gegen eine Verwendung der parallelen (Centronics)
+Schnittstelle. Die meisten Computer verfügen nur über eine dieser Schnittstellen, die
+zumeist auch schon durch den Drucker belegt ist. Außerdem handelt es sich dabei in
+der Regel um eine unidirektionale Schnittstelle - d.h. die Daten können vom
+Computer zum Endgerät (z.B. Drucker) gelangen, nicht aber vom Endgerät zum
+Computer. Somit wären zwar Steuerungsvorgänge, nicht aber Meß- und Regelungs­
+vorgänge über die Schnittstelle möglich.
+
+Einige Hersteller nutzen die Datenleitungen, über die z.B. der Drucker dem Rechner
+mitteilt, daß der interne Speicher voll bzw. das Papier zuende ist. Über diese Leitung
+werden Daten seriell übertragen und vom Rechner ausgewertet. Unter EUMEL
+scheidet diese Lösung aber aus, denn um hier eine sichere Auswertung zu gewähr­
+leisten, müßten Maschinenspracheprogramme eingebunden werden; das ist aber
+unter EUMEL nicht möglich.
+
+Damit war festgelegt, daß die weitere Entwicklung auf der Basis des AKTRONIK-Inter­
+faces über die serielle Schnittstelle erfolgen sollte. Wie schon erwähnt, ist das Inter­
+face auf keinen Fall direkt an die serielle Schnittstelle anschließbar. Wie der Name
+schon sagt, werden die Daten bei einer seriellen Schnittstelle seriell übertragen - um
+Prozeßdatenverarbeitung zu betreiben, müssen die Daten aber parallel vorliegen.
+
+Notwendig ist also ein "Adapter", der einen Seriell-Parallel-/Parallel-Seriell-Wandler
+beinhaltet, so daß die Verbindung zwischen Computer und Interface hergestellt
+werden kann.
+
+Inzwischen sind uns hier zwei (käuflich zu erwerbende) Lösungen bekannt - der
+"RS232-Adapter" der Firma AKTRONIK und das "MUFI" (Multifunktionales Interface)
+der Firma BICOS:
+
+Das MUFI ist sicherlich der universeller verwendbare "Adapter" (leider aber auch die
+kostspieligere Lösung). Einerseits kann es ebenso wie der "RS232-Adapter" an eine
+separate serielle Schnittstelle angeschlossen werden, andererseits verfügt es über
+einen zweiten - den eigentlich interessanten Betriebsmodus: Es kann nämlich auch
+in den Terminalkanal eingebaut werden.
+
+Die Idee, die dahintersteckt, ist folgende: Das MUFI verfügt (neben der eigentlich
+wichtigen bidirektionalen parallelen Schnittstelle) über einen (seriellen) Eingang und
+einen (seriellen) Ausgang. So kann das MUFI einfach in eine Leitung zwischen
+Computer und Terminal eingebaut werden. In ausgeschaltetem Zustand hat es
+keinen Einfluß auf den Datenaustausch zwischen Rechner und Terminal - als ob es
+gar nicht vorhanden wäre. In eingeschaltetem Zustand dagegen "horcht es den
+Datenfluß zwischen Rechner und Terminal ab". Auf eine vereinbarte Parole
+(Zeichenkombination) hin, "weiß es", daß die folgenden Daten nicht für das
+Terminal, sondern eben für sich bestimmt sind. Diese, und nur diese Daten werden
+aus dem Datenstrom vom MUFI "herausgefischt" und intern sachgerecht weiterver­
+arbeitet. Alle anderen Daten werden unbeeinflußt an das Terminal weitergeleitet,
+damit ja nicht der reibungslose Betrieb gestört wird. Natürlich ist das MUFI ebenso in
+der Lage, die gerade extern anliegenden Daten zu ermitteln und in den Datenstrom
+zum Computer "einzuschleusen".
+
+Um diese Aufgaben bewältigen zu können, wurde das MUFI mit einem eigenen,
+schnellen Mikroprozessor ausgestattet, der in der Lage ist, den Datenfluß zu
+bewältigen. Zudem wurde versucht, das MUFI mit soviel Intelligenz (Firmware)
+auszustatten, daß alle zeitkritischen Prozesse bei der Ansteuerung des Interface-
+Systems vom MUFI selbst erledigt und die Daten vom MUFI so aufbereitet werden,
+daß sie möglichst einfach weitergegeben und verarbeitet werden können.
+
+Durch die Beschränkung der Baud-Rate auf maximal 19200 ist die Verarbeitungs­
+geschwindigkeit allerdings auch beschränkt. Die rechnerisch maximale Ausgabetakt­
+rate von 320 Hz bei 19200 Baud und 160 Hz bei 9600 Baud wird von #on("b")#gs-Prozess#off("b")# auf
+einem 80386-Rechner im Alleinbetrieb tatsächlich erreicht. Natürlich bedeuten
+mehrere gleichzeitig betriebene MUFIs an einem Rechner Geschwindigkeitseinbußen.
+Ebenso sinkt die Ausgabetaktrate bei Prozessoren mit geringerem Durchsatz (8088:
+maximal 120 Hz). Für die Anwendungen in der Schule sind diese Geschwindigkeiten
+aber hinreichend.
+
+Die Vorteile des MUFI für diejenigen, die EUMEL im Multi-User-Betrieb nutzen, liegen
+dennoch klar auf der Hand:
+
+ - Es werden keine weiteren seriellen Schnittstellen benötigt. (Die vorhandenen
+ sind sowieso schon weitgehend belegt. Gegebenenfalls würden zusätzliche
+ Kosten verursacht.)
+
+ - Es sind keine weiteren Kabelverlegungen zwischen Rechner und Arbeitsplatz
+ notwendig, trotzdem befindet sich das MUFI direkt am Bildschirmarbeits­
+ platz.
+
+ - Das beim Anschluß an eine separate Schnittstelle notwendige, zeitauf­
+ wendige Ansteuern des Interface-Kanals entfällt.
+
+
+Arbeiten Sie an einem Einzelplatz-System (z.B. IBM-kompatibler Rechner nur mit
+Monitor) so ist ein Betrieb des MUFIs im Terminal-Kanal nicht möglich. Hier bleibt
+nur der Betrieb des Interface-Systems an einer separaten seriellen Schnittstelle.
+Sinnvoll ist aber auch ein solcher Betrieb, wenn (zunächst) nur die Hardware für
+einen Arbeitsplatz zur Verfügung steht. Das Interface kann dann nämlich von meh­
+reren Tasks abwechselnd angesprochen werden.
+
+Beim Anschluß an eine separate serielle Schnittstelle sind die Leistungen des MUFIs
+und des RS232-Adapters gleichwertig. Da das abwechselnde Ansprechen einer
+seriellen Schnittstelle und der Tastatur/des Monitors unter EUMEL relativ zeitauf­
+wendig ist, sind hier keine hohe Ausgabegeschwindigkeiten zu erwarten: bei einem
+8088-Rechner ca. 40 Hz, bei Prozessoren mit höherem Durchsatz eben entsprechend
+mehr. Dennoch ist das für die meisten Anwendungen in der Schule schnell genug.
+
+Für Spezialanwendungen ist auch die direkte Ansprache der Schnittstelle möglich.
+Hierbei sind Ausgabetaktraten von 960 Hz bei 19200 Baud bzw. 480 Hz bei 9600
+Baud möglich. Für die schulische Praxis (in der Sekundarstufe I) ist diese "direkte
+Ansprache" aber ungeeignet, da weitergehende Programmierkenntnisse erforderlich
+sind. Zudem kann bei Programmierfehlern "die Task am Kanal hängenbleiben".
+Genaueres dazu sehen Sie bitte im Kapitel 'Hinweise für den Systembetreuer/
+Programmierer'.
+
+Die Hardware-Konstellation stellt sich im Überblick also folgendermaßen dar:
+#on("b")#
+
+ Computer <---> Adapter <---> Interface <---> Modell
+
+ (mit se- ('MUFI' (AKTRONIK)
+ rieller oder
+ Schnitt- 'RS232-
+ stelle) Adapter')
+#off("b")#
+
diff --git a/doc/prozess/gs-Prozess-3 b/doc/prozess/gs-Prozess-3
new file mode 100644
index 0000000..3fae1bd
--- /dev/null
+++ b/doc/prozess/gs-Prozess-3
@@ -0,0 +1,346 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#on("b")#3  Installation des Interface-Systems#off("b")#
+
+In diesem Kapitel erfahren Sie, wie Sie Ihr Interface-System an den Rechner an­
+schließen und welche Einstellungen noch vorzunehmen sind. Für Details und weiter­
+gehende Informationen sehen Sie bitte in den Handbüchern / Begleitmaterialien der
+Firmen BICOS bzw. AKTRONIK nach.
+
+Am Ende des Kapitels 2 haben wir festgestellt, daß das Interface-System über einen
+Adapter mit dem Computer verbunden werden muß. An das Interface-System lassen
+sich dann entsprechende Modelle anschließen:
+
+#on("b")# Computer <----> Adapter <----> Interface <----> Modell
+
+ (mit se- ('MUFI' (AKTRONIK)
+ rieller oder
+ Schnitt- 'RS232-
+ stelle) Adapter') #off("b")#
+
+Wir möchten Ihnen zuerst erklären, wie Sie den jeweiligen Adapter mit dem
+Computer verbinden und welche Einstellungen am Adapter vorzunehmen sind. An­
+schließend beschreiben wir, wie Sie das Interface-System an den Adapter anschlie­
+ßen.
+
+Wie schon in Kapitel 2 erwähnt, können Sie zwischen zwei Adaptern wählen - dem
+MUFI der Firma BICOS und dem RS232-Adapter der Firma AKTRONIK. Letztge­
+nannter kann nur an einer separaten seriellen Schnittstelle betrieben werden,
+während das MUFI zusätzlich auch in den Terminalkanal eingebaut werden kann.
+
+
+#on("b")#3.1  Das MUFI der Firma BICOS als Adapter#off("b")#
+
+Für den Betrieb in einem Terminalkanal sollte das MUFI über eine sog. "Schnitt­
+stellen-Automatik" verfügen, die verhindert, daß das MUFI in ausgeschaltetem
+Zustand oder mit abgezogenem Netzstecker den Datenfluß zwischen Rechner und
+Terminal unterbricht. Diese sehr sinnvolle Automatik wird von BICOS #on("b")#nicht
+standardmäßig#off("b")# eingebaut. Sie sollten bei eventuellen Bestellungen darauf achten.
+Bevor Sie das MUFI in den Terminalkanal einbauen oder an eine separate serielle
+Schnittstelle anschließen, ist noch die Einstellung der DIP-Schalter zu kontrollieren
+bzw. eine Neueinstellung vorzunehmen.
+
+
+#on("b")#3.1.1  Einstellung der DIP-Schalter am MUFI#off("b")#
+
+Versichern Sie sich, daß das MUFI noch nicht an das Netz angeschlossen ist. Öffnen
+Sie dann das Gehäuse, indem Sie die vier Schrauben an der Unterseite des MUFIs
+(direkt neben den Füßen) lösen. Heben Sie nun #on("b")##on("b")#vorsichtig#off("b")##off("b")# den hellen Deckel des
+Gehäuses ab. Aber Achtung! Der Deckel bleibt über Kabel mit dem Fußteil ver­
+bunden! Legen Sie vorsichtig den Deckel neben das MUFI, so daß die Kabelver­
+bindungen nicht belastet werden.
+
+ +---------------------------------------------------+
+ | +-------+ +------------+ |
+ | | | | | +---------+ |
+ | +-------+ | | | DIP- | |
+ | +-------+ | | | Schalter| |
+Rück- | | | | | +---------+ | Vorder-
+seite | +-------+ | | +--------------+ | seite
+ | +-------+ | SCN68000 | | | |
+ | | | | | +--------------+ |
+ | +-------+ | | |
+ | +-------+ | | |
+ | | | | | |
+ | +-------+ +------------+ |
+ +---------------------------------------------------+
+
+
+
+#center#Abb.1: MUFI geöffnet
+
+
+Im Inneren des Fußteiles fällt Ihnen sofort der größte CHIP auf, der u.a. die
+Bezeichnung 'SCN68000' trägt. Drehen Sie das MUFI so vor sich, daß an der linken
+Seite dieses Chips die vier gleichen, mittelgroßen Chips zu liegen kommen. Dann
+sehen Sie rechts vom großen Chip, ganz hinten im Gehäuse eine kleine Plastikbox
+mit DIP-Schaltern, die die folgende Aufschrift trägt:
+
+#on("b")#
+ O N
+ 1 2 3 4
+#off("b")#
+
+Den durchsichtigen Deckel dieser kleinen Plastikbox müssen Sie nun öffnen, um die
+Stellung der DIP-Schalter einsehen zu können. Dazu verwenden Sie am besten einen
+Kugelschreiber oder einen kleinen Schraubendreher. Heben Sie damit den Deckel an
+der rechten Seite leicht an, dann läßt sich der Deckel nach links herüberlegen. Weist
+ein Schalter nach hinten (in dieser Lage des MUFIs von Ihrem Körper weg), so hat er
+die Stellung 'ON', weist er nach vorn (zu Ihrem Körper hin), so hat er die Stellung
+'OFF'.
+
+
+Beispiel:
+
+ +---------------------------------------+
+ | +-----+ +-----+ +-----+ +-----+ |
+ | |+++++| | | | | | | |
+ | |+++++| | | | | | | | ON
+ | |+++++| | | | | | | |
+ | |+++++| | | | | | | |
+ | | | | | | | | | |
+ | | | | | | | | | |
+ | | | | | | | | | |
+ | | | |+++++| |+++++| |+++++| |
+ | | | |+++++| |+++++| |+++++| |
+ | | | |+++++| |+++++| |+++++| | OFF
+ | | | |+++++| |+++++| |+++++| |
+ | +-----+ +-----+ +-----+ +-----+ |
+ +---------------------------------------+
+
+ 1 2 3 4
+
+#center#Abb.2:  Mögliche DIP-Schalter-Stellung beim MUFI
+
+
+Dabei haben die DIP-Schalter folgende Bedeutung:
+
+#on("b")#
+ 1 ON : Modulbusbetrieb
+ OFF : Parallelportbetrieb
+
+ 2 ON : RTS/CTS Hardware Handshake
+ OFF : XON-/XOFF-Protokoll
+
+ 3 ON : 9600 Baud
+ OFF : 19200 Baud
+
+ 4 ON : Even Parity
+ OFF : No Parity
+
+#off("b")#
+Wenn Sie das MUFI im Terminalkanal betreiben wollen, müssen Sie je nachdem, wie
+Sie Ihr Terminal konfiguriert haben, die entsprechende Einstellung vornehmen.
+
+Betreiben Sie das Terminal mit einer Übertragungsrate von 19200 Baud, so sollten
+Sie unbedingt mit XON/XOFF-Protokoll arbeiten - es sei denn, das Terminal unter­
+stützt RTS/CTS! In jedem Falle muß der DIP-Schalter 1 in die Stellung ON gebracht
+werden (der Betrieb des Interface-Systems der Firma AKTRONIK wird hier "Modul­
+busbetrieb" genannt).
+
+Wenn Sie das MUFI an einer separaten seriellen Schnittstelle betreiben wollen, #on("b")#muß#off("b")#
+der Datenaustausch mit dem RTS/CTS-Protokoll abgewickelt werden. Versichern Sie
+sich, daß Ihr Kabel darauf ausgelegt ist!
+
+Nach dieser Einstellung der DIP-Schalter ist das MUFI betriebsbereit. Schrauben Sie
+bitte den Gehäusedeckel mit den vier Schrauben wieder fest.
+
+
+#on("b")#3.1.2  Einbau des MUFIs in den Terminalkanal#off("b")#
+
+Um das MUFI in den Terminalkanal einbauen zu können, müssen Sie zunächst die
+Zuleitung vom Rechner zum Terminal am Terminal lösen. Auf der Rückseite des
+MUFIs befinden sich zwei Stecker, die mit V24/1 und V24/2 bezeichnet sind. Ver­
+inden Sie nun das Kabel, was ursprünglich vom Computer zum Terminal führte, mit
+dem MUFI, indem Sie es an den mit V24/2 gekennzeichneten Stecker anstecken. Sie
+benötigen jetzt noch ein weiteres (kurzes) V24-Kabel, um das MUFI mit dem
+Terminal zu verbinden. Es wird einerseits auf den mit V24/1 gekennzeichneten
+Stecker am MUFI aufgesteckt; das andere Ende wird mit dem Terminal in gleicher
+Weise verbunden, wie das ursprüngliche Kabel zwischen Rechner und Terminal.
+
+
+ +--------------------------+
+ | +----------------------+ |
+ | | V24/1 V24/2 | |
+ | | | | | |
+ | +----|-----------|-----+ |
+ +------|-----------|-------+
+ | |
+ | |
+ ZUM <-----+ +-----> ZUM
+ TERMINAL COMPUTER
+
+
+#center#Abb.3: Einbau des MUFIs in den Terminalkanal
+
+
+Beachten Sie bitte, daß die V24-Schnittstellen des MUFIs auf 8 Datenbits und 1 Stop­
+bit fest eingestellt sind - ggf. müssen Sie Ihre Terminalkonfiguration hieran anpassen.
+Kontrollieren Sie aber in jedem Falle, ob die Konfiguration mit diesen Daten überein­
+stimmt!
+
+Koppeln Sie dazu die Task 'configurator' an Ihr Terminal (mit 'continue
+("configurator") <RETURN>') und geben Sie dann das Kommando 'configurate
+<RETURN>'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt,
+ob Sie eine Konfiguration vornehmen wollen. Bei den "interessanten Kanälen" ant­
+worten Sie mit 'ja' (<j>).
+
+Wollen Sie sich nur die aktuelle Konfiguration ansehen, so beantworten Sie alle dann
+gestellten Fragen zum Kanal mit 'ja' (<j>), dann bleibt die aktuelle Einstellung
+erhalten. Der Konfigurationsdialog ist im EUMEL-Systemhandbuch auf den Seiten 6 -
+8 detailliert beschrieben.
+
+Die Verschaltung der V24-Kabel ist in der Bedienungsanweisung zum MUFI erläutert,
+ggf. können Sie entsprechende Kabel von der Firma BICOS beziehen.
+
+Wenn alle Kabelverbindungen gesteckt sind, sollten Sie auf alle Fälle erst einmal #on("b")#bei
+ausgeschaltetem MUFI#off("b")# prüfen, ob das Terminal sich noch bedienen läßt. Wenn das
+Terminal keine Reaktion mehr zeigt, obwohl es vorher (ohne MUFI) reibungslos
+funktioniert hat, dann haben Sie entweder ein MUFI ohne "Schnittstellen-Automatik"
+vor sich (vergl. Sie dazu Kap. 3.1), oder an den Kabelverbindungen stimmt irgend­
+etwas nicht. In diesem Falle sollten Sie noch einmal alle Anschlüsse und eventuell
+auch die interne Verschaltung der Kabel überprüfen.
+
+
+#on("b")#3.1.3  Das MUFI an separater serieller Schnittstelle#off("b")#
+
+Wenn Sie das MUFI als Endgerät an einer separaten seriellen Schnittstelle betreiben,
+dann stecken Sie das vom Computer kommende Kabel auf den mit V24/2
+bezeichneten Stecker an der Rückseite des MUFIs. Damit ein einwandfreier Betrieb
+gewährleistet ist, sollten Sie einen sog. "Kurzschlußstecker" auf die dann freie
+25polige D-Subminiatur-Buchse (V24/1) am MUFI aufstecken. Haben Sie eine solche
+nicht zur Hand, können Sie zwei kleine Brücken einsetzen: Nehmen Sie dazu zwei
+kleine Drahtstücke und verbinden Sie einmal Pin (Öffnung) 2 mit Pin 3 und außer­
+dem Pin 4 mit Pin 5.
+
+In der Task 'configurator' muß der Kanal, an dem das MUFI angeschlossen ist, auf
+'transparent, 8 Bit, 1 Stopbit, RTS/CTS-Protokoll' eingestellt werden, weiterhin je nach
+MUFI-DIP-Schalter-Stellung auf '9600' bzw. '19200 Baud' und 'no parity' bzw. 'even
+parity'.
+
+
+#on("b")#3.2  Der RS232-Adapter der Firma AKTRONIK#off("b")#
+
+Bevor Sie den Adapter an die serielle Schnittstelle anschließen, ist noch die einge­
+stellte Baudrate zu überprüfen bzw. eine Neueinstellung vorzunehmen.
+
+Öffnen Sie das Gehäuse des Adapters, indem Sie die vier Schrauben an der Unterseite
+lösen. Drehen Sie den Adapter so vor sich, daß die 25polige D-Subminiatur-Buchse
+von Ihrem Körper wegzeigt. Vorn rechts sind dann zwei parallele 8polige Pfosten­
+steckerleisten sichtbar.
+
+#center#25-pol. D-Subminiatur-Stecker
+
+ +---------------+
+ | |
+ +---+ +---+
+ | +------+ |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | +------+ |
+ | +------+ |
+ | | | +-------+ |
+ | +------+ | | |
+ | +------+ +-------+ |
+ | | | +-------+ |
+ | +------+ | <-|---------Jumper-Leiste
+ | +-------+ |
+ +---+ +---+
+ | Baudrate |
+ +---------------+
+
+
+#center#Abb.4:  RS232-Adapter geöffnet
+
+
+Auf einem Paar steckt ein 'Jumper', mit dem die Baudrate eingestellt wird.
+Gegebenenfalls ist dieser Jumper umzustecken. Anschließend schrauben Sie das
+Gehäuse mit den vier entfernten Schrauben wieder zu.
+
+ +---------+
+ | o o | 300
+ | o o | 600
+ | o o | 1200
+ | o o | 2400
+ | o o | 4800
+ | o o | 9600
+ Jumper ---> | o o | 19200
+ | o o | 38400
+ +---------+
+ Baudrate
+
+
+#center#Abb.5:  Mögliche Jumperposition beim RS232-Adapter
+
+
+Nun muß noch in der Task 'configurator' der entsprechende Kanal konfiguriert
+werden. Koppeln Sie dazu die Task 'configurator' an Ihr Terminal (mit 'continue
+("configurator") <RETURN>') und geben Sie dann das Kommando 'configurate
+<RETURN>'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt,
+ob Sie eine Konfiguration vornehmen wollen. Beim vorgesehenen Kanal antworten Sie
+mit 'ja' (<j>).
+
+Wollen Sie sich nur die aktuelle Konfiguration ansehen, so beantworten Sie alle dann
+gestellten Fragen zum Kanal mit 'ja' (<j>), dann bleibt die aktuelle Einstellung
+erhalten. Der Konfigurationsdialog ist im EUMEL-Systemhandbuch auf den Seiten 6 -
+8 detailliert beschrieben.
+
+Folgende Konfigurationsmerkmale müssen eingestellt werden:
+
+ transparent, 8 Bit, 2 Stopbit, no Parity, #on("b")#kein#off("b")# Protokoll
+
+Die Baudrate ist entsprechend der Jumper-Stellung einzustellen.
+
+Am Adapter ist ein Kabel mit 25poligem D-Subminiatur-Stecker bereits fest montiert.
+Sollte der Stecker nicht an Ihren Rechner passen, so müßten Sie ein entsprechendes
+Adapterkabel basteln oder kaufen.
+
+
+
+#on("b")#3.3  Verbindung Adapter - Interface-System#off("b")#
+
+Nachdem Sie nun den Adapter (MUFI oder RS232-Adapter) an den Rechner ange­
+schlossen haben, müssen Sie noch die Verbindung zum Interface-System herstellen.
+Dabei ist es gleichgültig, ob Sie eine Compact-Box, einen Einzelsteckplatz oder einen
+Mehrfachsteckplatz benutzen, denn alle diese Geräte verfügen über den gleichen
+Anschlußstecker. Den RS232-Adapter können Sie direkt an das Interface-System
+anschließen, denn er verfügt bereits über einen entsprechenden Stecker.
+
+Für das MUFI benötigen Sie ein Anschlußkabel, das auf der einen Seite einen
+36poligen Centronics-Stecker und auf der anderen Seite einen 25poligen D-Sub­
+miniatur-Stecker besitzt (von der Firma BICOS zu beziehen).
+
+
+#on("b")#3.4  Bereitstellung des Interface-Systems#off("b")#
+
+Sofern Sie eine Compact-Box angeschlossen haben, brauchen Sie nur noch das mitge­
+lieferte Netzteil mit der Compact-Box und dem Netz zu verbinden und die ent­
+sprechende Spannung laut beiliegender Bedienungsanweisung der Fa. AKTRONIK
+einzustellen.
+
+Wenn Sie mit einem Einzelsteckplatz oder einem Mehrfachsteckplatz arbeiten,
+müssen Sie zunächst noch eine Interface-Karte einstecken. Für einen anschließenden
+Test des Systems (sehen Sie dazu Kapitel 5) empfiehlt es sich, eine Kombikarte oder
+eine E/A-Karte zu verwenden. Nach dem Einstecken der Interface-Karte ist der Steck­
+platz noch mit dem Netzstecker an das Stromnetz anzuschließen, um eine
+Spannungsversorgung zu gewährleisten.
+
+
+
+
+
+
+
diff --git a/doc/prozess/gs-Prozess-4 b/doc/prozess/gs-Prozess-4
new file mode 100644
index 0000000..e106df1
--- /dev/null
+++ b/doc/prozess/gs-Prozess-4
@@ -0,0 +1,173 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#on("b")#4  Installation von gs-Prozess#off("b")#
+
+
+Bevor Sie #on("b")#gs-Prozess#off("b")# auf Ihrem Computer benutzen können, müssen Sie das
+Programm zunächst installieren. Wenn #on("b")#gs-Prozess#off("b")# auf Ihrem System schon zur
+Verfügung steht, können Sie dieses Kapitel ruhig überspringen.
+
+
+
+#on("b")#4.1  Voraussetzungen#off("b")#
+
+
+Um #on("b")#gs-Prozess#off("b")# auf Ihrem Computer betreiben zu können, muß das EUMEL-
+Betriebssystem installiert sein. #on("b")#gs-Prozess#off("b")# setzt die Multi-User-Version voraus und ist
+lauffähig ab Version 1.8.x. #on("b")#gs-Prozess#off("b")# setzt weiterhin voraus, daß auf Ihrem
+Computer bereits das Programm #on("b")#gs-DIALOG#off("b")# (Version 1.1) installiert ist.
+
+
+
+#on("b")#4.2  Lieferumfang#off("b")#
+
+
+#on("b")#gs-Prozess#off("b")# wird auf einer Diskette geliefert, die alle notwendigen Programme ent­
+hält (die Installation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den Inhalt der
+Diskette feststellen zu können, starten Sie Ihr System und bringen es dazu, daß 'gib
+kommando:' erscheint. Dann legen Sie die Diskette ein und geben das Kommando:
+
+
+#on("b")##center#archive("gs-Prozess");list(archive);release(archive) <RETURN>#off("b")#
+#page#
+Anschließend erscheint eine Übersicht der auf dem Archiv vorhandenen Programme.
+Folgende Programme sollten sich in der Übersicht befinden:
+
+
+ "gs-Prozess 1 für MUFI im Terminalkanal"
+ "gs-Prozess 1 für MUFI als Endgerät"
+ "gs-Prozess 1 für AKTRONIK Adapter"
+ "gs-Prozess 2"
+ "gs-Prozess 3"
+ "gs-Prozess 4"
+ "gs-Prozess 5"
+ "gs-MENUKARTE:Prozess"
+ "gs-Prozess/gen"
+
+
+Eventuell können noch weitere Namen auf der Diskette vorhanden sein. Wenn Sie den
+Inhalt der Diskette kontrolliert haben und diese Programme auf der Diskette vor­
+handen sind, können Sie #on("b")#gs-Prozess#off("b")# installieren.
+
+Sollten Sie statt der Übersicht eine Fehlermeldung erhalten, überprüfen Sie bitte, ob
+die Diskette das richtige Format besitzt oder ob Ihr Diskettenlaufwerk Probleme
+macht. Sollten dagegen Programme fehlen, so reklamieren Sie die Diskette.
+
+
+#on("b")#4.3  Installation#off("b")#
+
+#on("b")#gs-Prozess#off("b")# muß in einer Task installiert werden, in der bereits das Programm
+#on("b")#gs-DIALOG#off("b")# zur Verfügung steht. Alle Söhne und Enkel der neuen Task können
+anschließend mit #on("b")#gs-Prozess#off("b")# arbeiten. Richten Sie also eine Task als Sohn der Task
+ein, in der auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir nehmen hier
+an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' installiert ist und die neue Task den Namen
+'PDV' erhalten soll. (Sie können für die Task auch einen beliebigen anderen Namen
+wählen):
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+
+ --> gib supervisor kommando:
+
+ begin ("PDV","MENU") <RETURN>
+
+ --> gib kommando:
+
+
+#off("b")#
+(Arbeiten mehrere Personen mit dem Computer, dann ist es sinnvoll, diese Task vor
+unbefugtem Zugriff durch ein Passwort zu schützen. Wie das gemacht wird, können
+Sie in Ihrem EUMEL-Benutzerhandbuch erfahren.)
+
+
+Legen Sie dann die Archivdiskette ein, auf der sich #on("b")#gs-Prozess#off("b")# befindet, und geben
+Sie das folgende Kommando:
+
+
+#on("b")#
+ archive("gs-Prozess") <RETURN>
+
+ fetch("gs-Prozess/gen",archive) <RETURN>
+
+ run <RETURN>
+
+#off("b")#
+
+Sie haben damit das Generatorprogramm gestartet. Bevor die Generierung allerdings
+ausgeführt werden kann, müssen Sie dem System noch Angaben über den ver­
+wendeten Adapter machen. Die zur Verfügung stehenden Anpassungen werden Ihnen
+zur Auswahl angeboten:
+ +--------------------------------------------------------+
+ | Auswahl der Interface-Anpassung |
+ | Bitte gewünschte Anpassung ankreuzen! |
+ |--------------------------------------------------------|
+ | Auswahl  e i n e r  Datei durch Ankreuzen |
+ |--------------------------------------------------------|
+ |==> > gs-Prozess 1 für MUFI im Terminalkanal |
+ | > gs-Prozess 1 für MUFI als Endgerät |
+ | > gs-Prozess 1 für AKTRONIC-Adapter |
+ | |
+ +--------------------------------------------------------|
+ | Info: <?> Fertig: <ESC><q> Abbrechen: <ESC><h> |
+ +--------------------------------------------------------+
+#center#Abb.6:  Auswahl der Interface-Anpassung
+
+
+Bringen Sie den Pfeil mit den Pfeiltasten vor die gewünschte Anpassung und drücken
+Sie die <RETURN>-Taste.
+
+Haben Sie als Anpassung "gs-Prozess für AKTRONIK Adapter" oder "gs-Prozess für
+MUFI als Endgerät" gewählt, so erscheint als nächstes die Aufforderung:
+
+#center##on("b")#'Gib Interface-Kanal:'#off("b")#
+
+Geben Sie hier die Kanalnummer der seriellen Schnittstelle ein, an der der Adapter
+betrieben werden soll.
+
+Die Installation wird automatisch durchgeführt. Lassen Sie während des gesamten
+Vorgangs die Archivdiskette eingelegt. Die Generierung ist beendet, wenn der
+EUMEL-Eingangsbildschirm erscheint. Die Task, in der die Generierung stattfin­
+det, wird automatisch zur Managertask, das heißt, daß Söhne von ihr eingerichtet
+werden können.
+
+
+#on("b")#4.4  Anmerkungen zur Erstinstallation#off("b")#
+
+Mit der Installation der Software ist das Gesamtsystem allerdings noch nicht betriebs­
+bereit. Dazu fehlen #on("b")#gs-Prozess#off("b")# noch einige Informationen. Bisher ist #on("b")#gs-Prozess#off("b")#
+nämlich nur bekannt, welchen Adapter Sie verwenden und ob Sie ihn im Terminal­
+kanal oder an einer separaten Schnittstelle betreiben wollen.
+
+Um das angeschlossene Interface-System sachgerecht ansteuern zu können, benötigt
+#on("b")#gs-Prozess#off("b")# aber noch Informationen über die Hardware-Konstellation. Diese Mit­
+teilungen, die noch gemacht werden müssen, nennen wir "Konfiguration von
+#on("b")#gs-Prozess#off("b")#". Wie diese Konfiguration vorgenommen wird und wie Sie anschließend
+Ihr Interface-System testen, ist im Kapitel 5 detailliert beschrieben.
+
+#on("b")#gs-Prozess#off("b")# bietet Ihnen eine Reihe von Möglichkeiten, die vorhandene Hardware
+möglichst effektiv zu nutzen. So ist es möglich, wenn Sie Ihre(n) Adapter an
+separater/separaten Schnittstelle(n) betreiben, von verschiedenen Tasks aus auf
+einen Adapter zuzugreifen. Gerade in der Anschaffungsphase, wenn noch nicht
+genügend Hardware zur Verfügung steht, ist das eine sinnvolle/preiswerte Möglich­
+keit, von verschiedenen Arbeitsplätzen aus Prozeßdatenverarbeitung zu betreiben.
+
+Zu diesem Zeitpunkt würde es aber zu weit führen, hierzu Details zu erläutern.
+Beschreibungen dieser Möglichkeiten finden Sie im Kapitel "Hinweise für den
+Systembetreuer/ Programmierer".
+
+#on("b")#
+Sie sollten sich zunächst darauf beschränken, ein Interface-System "zum
+Laufen zu bringen". Verfahren Sie dazu bitte genau, wie im Kapitel 5
+beschrieben.#off("b")#
+
diff --git a/doc/prozess/gs-prozess-1 b/doc/prozess/gs-prozess-1
new file mode 100644
index 0000000..f6a3696
--- /dev/null
+++ b/doc/prozess/gs-prozess-1
@@ -0,0 +1,99 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#on("b")#1  Was kann gs-Prozess#off("b")#
+
+#on("b")#gs-Prozess#off("b")# ist ein Programmsystem unter dem Betriebssystem EUMEL, mit dem ein
+Anwendungsbereich erschlossen werden kann, der bisher in der Schule zumeist sehr
+stiefmütterlich behandelt wurde: die Prozeßdatenverarbeitung - das Messen, Steuern
+und Regeln mit dem Computer.
+
+Es wird dadurch möglich, externe Modelle/Geräte (z.B. eine Ampelanlage) zu steuern
+oder von externen Meßfühlern (z.B. einem Temperaturfühler) oder Eingabeeinheiten
+(z.B. einem Lochkartenleser) Daten aufzunehmen. Durch die Kombination der
+beiden Vorgänge können sogar komplexe geregelte Systeme in Modellen nachgebildet
+werden.
+
+Eigentlich ist eine solch stiefmütterliche Behandlung dieses Anwendungsbereiches
+von Computern in der Schule gar nicht einzusehen, denn in der Forschung, im
+Dienstleistungsbereich, im privaten Bereich und vor allem in der Produktion gibt es
+eine Vielzahl von Anwendungen, z.B.:
+
+ Meßdatenerfassung und -auswertung bei Experimenten, Wetterbeobachtung,
+ seismologische Untersuchungen, ..., Ampelsteuerungen, Verkehrsleitsysteme, ...,
+ Scannerkassen, Scheckkartenleser, Geldautomaten, ..., Waschmaschinen,
+ Heizungsanlagen, Modelleisenbahnen, ..., CNC-Maschinen, Universalhand­
+ habungsautomaten (Roboter),...
+
+In den meisten Fällen werden Computer eingesetzt, die speziell für diesen
+Anwendungsbereich entwickelt wurden. Insbesondere an die Verarbeitungsge­
+schwindigkeit solcher Systeme werden sehr hohe Anforderungen gestellt. Solche
+Systeme sind für die schulische Verwendung viel zu teuer. Zumeist sind auch die in
+der Realität ablaufenden Vorgänge so komplex, daß sie als Ganzes gar nicht im
+Unterricht nachgebildet werden können.
+
+Das aber kann auch nicht Ziel einer Auseinandersetzung mit diesem Anwendungs­
+bereich in der Schule sein. Hier gilt es, unter didaktisch-methodischen Gesichts­
+punkten, Grundprinzipen der Prozeßdatenverarbeitung zu vermitteln und beispiel­
+hafte Anwendungen an Modellen zu erarbeiten und zu erproben. In einem zeitge­
+mäßen Informatikunterricht darf dieser wichtige Anwendungsbereich von Computern
+nicht ausgespart bleiben.
+
+Bisher scheiterte das Messen, Steuern und Regeln mit dem Computer in der Schule
+meistens daran, daß es keine standardisierten Software- und Hardware-Systeme und
+auch keine geeigneten Modelle gab. Das aber hat sich inzwischen geändert.
+Verschiedene Hersteller bieten Interface-Systeme und Modelle an, die gut verwendet
+werden können.
+
+Auch #on("b")#gs-Prozess#off("b")# greift auf ein solches Interface-System zu, das aus mehreren
+Einzelkomponenten besteht (mehr dazu in den folgenden Kapiteln). Das sind Geräte,
+über die der Computer "Kontakt" mit den 'Endgeräten' (z.B. Modellen) aufnimmt:
+Hier werden Ausgaben des Computers in "elektrische Impulse" umgesetzt, mit denen
+Modelle angesprochen werden können (z.B. Lämpchen ein- und ausgeschaltet,
+Motoren zu Drehungen nach links oder rechts veranlaßt werden können). Ein­
+gehende "Impulse" werden in "computerangemessene Form" umgewandelt und an
+den Computer weitergegeben.
+
+Der Aufwand, der betrieben werden muß, um ein Interfacesystem sachgerecht anzu­
+steuern, ist erheblich. Es kostet einige Mühe und vor allem viel Zeit, um alle Details
+des Interfacesystems und seiner Programmierung kennenzulernen, und es gehört
+eine gehörige Portion Erfahrung und vor allem viel Geduld dazu, um Fehlfunktionen
+zu analysieren und letztlich zu beheben. Das alles ist einem Anwender, dem es z.B.
+darum geht, ein bestimmtes Modell anzusteuern, nicht zumutbar.
+
+Hier schafft nun #on("b")#gs-Prozess#off("b")# Abhilfe! #on("b")#gs-Prozess#off("b")# ist eingebettet in die komfortable
+Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")#, so daß der Einarbeitungsaufwand in das
+Programmsystem gering und eine einfache Bedienung des Systems gewährleistet ist.
+
+Ähnlich wie bei #on("b")#gs-Herbert und Robbi#off("b")# wird eine komplette Programmier­
+umgebung zur Verfügung gestellt, die alle Funtionen enthält (Informationen,
+Konfiguration des Systems, Erstellung und Ausführung von Programmen, Archiv­
+handling), die bei der Arbeit von Bedeutung sein können - natürlich jetzt auf das
+Messen, Steuern und Regeln bezogen. Durch diese Programmierumgebung wird
+selbst dem Computerneuling ermöglicht, einen einfachen, eingängigen Zugang zu
+diesem Anwendungsbereich zu finden.
+
+#on("b")#gs-Prozess#off("b")# stellt einen Basisbefehlssatz (Eingabe-, Ausgabebefehle und Tests) zur
+Verfügung, mit dessen Hilfe Lösungsalgorithmen aus diesem Anwendungsbereich
+angemessen formuliert werden können. Dabei kann sich der Anwender ganz auf sein
+Problem konzentrieren, da er sich um die spezifische Ansteuerung des Interfaces
+nicht zu kümmern braucht - das erledigt #on("b")#gs-Prozess#off("b")#.
+
+Der Basisbefehlssatz besteht aus nur wenigen Befehlen, um das Erlernen und den
+Umgang damit möglichst einfach zu gestalten. Andererseits ist der Befehlssatz so
+umfangreich und universell, daß alle schulisch relevanten Problemstellungen aus
+diesem Anwendungsbereich angemessen bearbeitet werden können.
+
+
+
+
diff --git a/doc/prozess/gs-prozess-5 b/doc/prozess/gs-prozess-5
new file mode 100644
index 0000000..5c44f29
--- /dev/null
+++ b/doc/prozess/gs-prozess-5
@@ -0,0 +1,819 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#on("b")#5  Konfiguration von gs-Prozess#off("b")#
+#on("b")#    Test des Interface-Systems#off("b")#
+
+In diesem Kapitel erfahren Sie, wie Sie #on("b")#gs-Prozess#off("b")# entsprechend der angeschlossenen
+Hardware konfigurieren müssen. Anschließend zeigen wir Ihnen, wie Sie Ihr Inter­
+face-System testen können.
+
+Wir gehen hier davon aus, daß die Hardware-Voraussetzungen erfüllt, das Interface-
+System über einen Adapter (MUFI / RS232-Adapter) angeschlossen und #on("b")#gs-Prozess#off("b")#
+auf dem Rechner installiert sind.
+
+
+#on("b")#5.1  Kontrolle der Konfigurationen/Anschlüsse#off("b")#
+
+Bevor Sie mit der Arbeit beginnen, überzeugen Sie sich unbedingt (noch einmal)
+davon, daß die Konfigurationen und die Steckverbindungen den Vorgaben ent­
+sprechen:
+
+- #on("b")#MUFI im Terminalkanal:#off("b")#
+
+ Sind die beiden Kabel zum Rechner und zum Terminal an der Rückseite des
+ MUFIs korrekt aufgesteckt (sehen Sie Abb.3)? Haben Sie die notwendigen
+ Konfigurationen vorgenommen (Task 'configurator', MUFI-DIP-Schalter, Ter­
+ minal)? Ist das Netzkabel des MUFIs mit dem Stromnetz verbunden? Ist das
+ Verbindungskabel zwischen MUFI und Interface-System an der Vorderseite des
+ MUFIs und am Interface-System (Compact-Box, Einzel- oder Mehrfachsteck­
+ platz) aufgesteckt?
+#page#
+- #on("b")#MUFI als Endgerät:#off("b")#
+
+ Ist das vom Computer kommende Kabel auf den mit V24/2 gekennzeichneten
+ Stecker aufgesteckt? Haben Sie auf den freien Stecker (V24/1) einen "Kurz­
+ schlußstecker" aufgesteckt? Haben Sie ein Kabel verwendet, über welches das
+ RTS/CTS-Protokoll abgewickelt werden kann? Haben Sie den Kanal, an dem das
+ MUFI betrieben wird, den Anweisungen in Kapitel 3.1.3 entsprechend kon­
+ figuriert? Sind die DIP-Schalter im MUFI entsprechend eingestellt? Ist das
+ Netzkabel des MUFIs mit dem Stromnetz verbunden? Ist das Verbindungskabel
+ zwischen MUFI und Interface-System an der Vorderseite des MUFIs und am
+ Interface-System (Compact-Box, Einzel- oder Mehrfachsteckplatz) aufgesteckt?
+
+
+- #on("b")#RS232-Adapter:#off("b")#
+
+ Ist das Schnittstellen-Kabel korrekt am Computer angeschlossen? Haben Sie den
+ Kanal, an dem der RS232-Adapter betrieben wird, den Anweisungen in Kapitel
+ 3.2 entsprechend konfiguriert? Ist der Jumper im RS232-Adapter korrekt aufge­
+ steckt? Ist der RS232-Adapter an das Interface-System (Compact-Box, Einzel-
+ oder Mehrfachsteckplatz) angesteckt? Ist der 3polige Platinenstecker des
+ Adapters in die 12V-Spannungsversorgungs-Buchse des Interface-Systems
+ eingesteckt?
+
+
+- #on("b")#Compact-Box#off("b")#
+
+ Ist die Compact-Box an das zugehörige Netzgerät angeschlossen? Ist der Stecker
+ wirklich richtig herum eingesteckt? Ist das Netzteil mit dem Stromnetz ver­
+ bunden?
+
+- #on("b")#Einzelsteckplatz#off("b")#
+
+ Ist eine Kombi-Karte oder eine E/A-Karte eingesteckt? Ist das Netzkabel des
+ Steckplatz-Netzgerätes mit dem Stromnetz verbunden?
+#page#
+- #on("b")#Mehrfachsteckplatz#off("b")#
+
+ Ist ein passendes Netzteil an den Mehrfachsteckplatz angeschlossen? Ist das
+ zugehörige Netzkabel mit dem Stromnetz verbunden? Ist eine Kombi- oder
+ E/A-Karte in einen Steckplatz eingesteckt?
+
+
+#on("b")#5.2  Vorbereitungen für den Ein-/Ausgabetest#off("b")#
+
+Für den Ausgabetest sollte eine 8elementige Leuchtdiodenanzeige zur Verfügung
+stehen, um am Interface-System die Ausgaben kontrollieren zu können. Sofern Sie
+mit der Compact-Box arbeiten oder eine E/A-Karte verwenden, brauchen Sie sich
+darum nicht weiter zu kümmern, denn in diese Systeme ist eine Leuchtdioden­
+anzeige integriert. Wenn Sie dagegen mit einer Kombikarte arbeiten, muß eine
+gesonderte Anzeige (kann leicht selbst gebaut werden oder ist fertig zu kaufen bei der
+Fa. AKTRONIK) angeschlossen werden.
+
+Für den Eingabetest reicht ein kleines Drahtstück, an dem zwei kleine Lötschuhe
+angelötet sind - schön wäre es, wenn ein Codekarten-Leser zur Verfügung stünde.
+
+
+#on("b")#5.2.1  Anschluß einer Leuchtdiodenanzeige an die Kombikarte#off("b")#
+
+Stecken Sie den 8poligen Platinenstecker, der an der Leuchtdiodenanzeige befestigt
+ist, auf die mit "AUSG." gekennzeichnte Buchse der Kombikarte. Den Lötschuh des
+einzelnen Drahtes an der Leuchtdiodenanzeige stecken Sie auf den Masse-Lötstift
+direkt neben der "Ausgangs-Buchse" der Kombikarte (sehen Sie Abb. 7). Da die
+Leuchtdiodenanzeige mit Spannung versorgt werden muß, müssen jetzt noch zwei
+Kabel - wie in der Abb. 7 dargestellt (Kabel 1 und Kabel 2) - aufgesteckt werden.
+#page#
+
+
+
+ +---------------------------------------------------------------+
+ | 4-7 o----------+ |
+ | +-+-----------+-+ | |
+ | | | O | | GMD o | |
+ | | | | | | Kabel 1 |
+ | | | | | | |
+ | v | | O | | | |
+ | | | | | | |
+ | E| | | | | |
+ | | | O | | | |
+ | +-+-------------+ ___________| |
+ | o -----------| |
+ | Ausg. | |
+ | +---------------+ O 0 | |
+ | | +-----------+ | 1 O | |
+ ---+---|-|---| | | O 2 | |
+ ---+---|-|---| | | 3 O | |
+ ---+---|-|---| | | O 4 | |
+ ---|---|-|---| | | 5 O | |
+ ---|---|-|---| | | O 6 | |
+ ---|---|-|---| | | 7 O | |
+ | | +-----------+ | | |
+ | +---------------+ | |
+<-----------------o | Kabel 2 |
+ Zur Leuchtdiodenanzeige | |
+ | +---------------+ | |
+ | | O | O 0 | |
+ | | O | 1 O | |
+ | | O | O 2 | |
+ | | O | 3 O | |
+ | | O | O 4 | |
+ | | O | 5 O | |
+ | | O | O 6 | |
+ | | O | 7 O | |
+ | +---------------+ | |
+ | GMD o o +5V | |
+ | | | |
+ | +----------------------------+ |
+ | |
+ | +---------------+ |
+ | | O | + O |
+ | | O | O E2 |
+ | | O | GMD O |
+ | +---------------+ |
+ | |
+ | +---------------+ |
+ | | O | + O |
+ | | O | O E2 |
+ | | O | GMD O |
+ | +---------------+ |
+ | o o o o o o o o o o |
+ | | | | | | | | | | | |
+ | +-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+ |
+ | | | |
+ +----------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+----------+
+ | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | |
+
+#center#Abb.7:  Anschluß Leuchtdiodenanzeige - Kombikarte
+
+#on("b")#ACHTUNG!#off("b")# Bei dieser Spannungversorgung auf der Kombikarte (+5V) darf #on("b")#auf
+keinen Fall#off("b")# eine größere Last (z.B. Motor oder auch nur eine Glühbirne) ange­
+schlossen werden, da dadurch die Interfacekarte bzw. das Netzteil im Einzelsteck­
+platz beschädigt werden könnte.
+#page#
+Möchten Sie eine größere Last anschließen, so benötigen Sie ein stabilisiertes Netzteil
+mit "ordentlich geglättetem" Gleichstrom. Die Masse (Minuspol) des Netztteils be­
+festigen Sie an dem Lötschuh (oder der davorliegenden Klemme), der zwischen den
+beiden Lötstiften liegt, an denen in der Abb.7 das Kabel 1 befestigt ist. Den Pluspol
+des Netzteiles verbinden Sie mit mit einem der Lötstifte (bzw. an der davorliegenden
+Klemme), auf dem jetzt das Kabel 1 befestigt ist. Damit alle 8 Ausgänge mit Span­
+nung versorgt werden, müssen Sie auch hier ebenfalls eine Brücke zum zweiten
+Lötschuh (oder der Klemme davor), an dem in der Zeichnung Kabel 1 befestigt ist,
+anbringen.
+
+Da die Compact-Box ohnehin durch das Netzteil versorgt wird, kann es hier nicht zu
+Komplikationen kommen. Wollen Sie eine größere Last an die E/A-Karte anschließen,
+so benötigen Sie z.B. eine Relais-Box.
+
+
+
+#on("b")#5.2.2  Anschluß des Codekartenlesers (Drahtstück)#off("b")#
+
+Stecken Sie den 8poligen Platinenstecker, der am Codekartenleser befestigt ist, auf
+die Eingangsbuchse an Ihrem Interface-System. Dann muß noch der 3polige
+Platinenstecker, der ebenfalls am Codekartenleser befestigt ist, an die 12V-Span­
+nungsversorgungs-Buchse an Ihrem Interface-System aufgesteckt werden.
+
+haben Sie keinen Codekartenleser zur Hand, so reicht für den Eingabetest auch ein
+kleines Kabelstück aus, an dessen Enden jeweils ein Lötschuh angelötet sein sollte.
+Stecken Sie den einen Lötschuh auf einen +5V-Lötstift Ihres Interface-Systems. Das
+andere Ende des Kabels wird zunächst noch nicht befestigt.
+
+Auf der Kombikarte sind die +5V-Lötstifte beschriftet und damit leicht zu finden. Wo
+Sie einen +5V-Lötstift auf der E/A-Karte finden, können Sie der folgenden Abbildung
+entnehmen:
+#page#
+ Leuchtdiodenanzeige
+ |
+ +---------------------------------------+------------+
+ | +---------------+ | |
+ | | O | O 0 V |
+Digital- | | O | 1 O o o o o o o o o |
+Ausgang | | O | O 2 |
+ | | O | 3 O |
+ | | O | O 4 |
+ | | O | 5 O |
+ | | O | O 6 |
+ | | O | 7 O |
+ | +---------------+ |
+ | +---------------+ |
+ | | O | O 0 |
+Digital- | | O | 1 O |
+Eingang | | O | O 2 |
+ | | O | 3 O |
+ | | O | O 4 |
+ | | O | 5 O |
+ | | O | O 6 |
+ | | O | 7 O |
+ | +---------------+ |
+ | +---------------+ |
+ | | O | O 0 |
+Versorgungs- | | O | 1 O |
+und | | O | O 2 |
+Steuer- | | O | 3 O |
+leitung | | O | O 4 |
+ | | O | 5 O |
+ | | O---5V------O 6 |
+ | | O | 7 O |
+ | +-------|-------+ | |
+ | | | |
+ | +---------------+ |
+ | | |
+ | GMD |
+ | |
+ | o o o o o o o o o o |
+ | | | | | | | | | | | |
+ | +-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+ |
+ | | | |
+ +----+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+---+
+ | | | | | | | | | | | | | | | | | | | | |
+ | | | | | | | | | | | | | | | | | | | | |
+
+
+#center#Abb.8:  Pinbelegung auf der E/A-Karte
+
+
+#on("b")#5.3  Konfiguration von gs-Prozess#off("b")#
+
+Normalerweise kann in jeder Task, in der #on("b")#gs-Prozess#off("b")# zur Verfügung steht, die
+Konfiguration vorgenommen werden (beachten Sie aber bitte die Bemerkungen im
+Kapitel "Hinweise für den Systembetreuer/Programmierer").
+
+Richten Sie eine Sohntask der Task ein, in der #on("b")#gs-Prozess#off("b")# installiert ist - in unserem
+Fall soll das die Task 'PDV' sein. Die Sohntask soll den Namen 'pdvtest' erhalten:
+#page#
+#on("b")#
+ <SV> (Supervisor - Taste)
+#off("b")#
+ --> gib supervisor kommando:
+#on("b")#
+ begin ("pdvtest","PDV") <RETURN>
+#off("b")#
+ --> gib kommando:
+#on("b")#
+ pdv <RETURN>
+#off("b")#
+
+Daraufhin erscheint der in Abb.9 dargestellte Menubildschirm. Über die Menupunkte
+im dann sichtbaren Pull-Down-Menu können Sie diverse Informationen zu
+#on("b")#gs-Prozess#off("b")# abrufen, auf die wir hier allerdings nicht weiter eingehen wollen. Statt­
+dessen drücken Sie bitte die 'Pfeiltaste rechts'. Sie gelangen so zum Menu unter dem
+Oberbegriff "Interface" (Abb. 10).
+
+
++---------------------------------------------------------------------+
+| PDV:  Info Interface Programm Archiv |
+|-------+------------------------+------------------------------------+
+| | u  Übersicht Befehle | |
+| | --------------------- | |
+| | a  Ausgabebefehle | |
+| | e  Eingabebefehle | |
+| | t  Testbefehle | |
+| | w  Weitere Befehle | |
+| | --------------------- | |
+| | b  Bitmuster | |
+| | s  Symbole/Zeichen | |
+| | d  Digital-/Analogwerte| |
+| +------------------------+ |
+| |
+| +----------------------------------------+ |
+| | gs-Prozess | |
+| | Version 1.0 | |
+| | | |
+| | Copyright Ρ 1988 bei Eva Latta-Weber, | |
+| | Bielefeld | |
+| +----------------------------------------+ |
++---------------------------------------------------------------------+
+|Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>|
++---------------------------------------------------------------------+
+
+
+ Abb.9:  Eingangsbildschirm #on("b")#gs-Prozess#off("b")#
+#page#
+
++-----------------------------------------------------------------------+
+| PDV:  Info Interface Programm Archiv |
++-------+-------------------+-------------------------------------------+
+| | i  Informationen | |
+| | ---------------- | |
+| | k  Konfigurieren | |
+| | ---------------- | |
+| | a  Ausgabetest | |
+| | e  Eingabetest | |
+| +-------------------+ |
+| |
+| |
+| |
++---------------------------------------------------------------------- +
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
++-----------------------------------------------------------------------+
+
+ #center#Abb.10:  Menubildschirm zum Oberbegriff 'Interface'
+
+
+Über den ersten Menupunkt ("Informationen") kann die aktuelle Konfiguration des
+Interfaces erfragt werden. Wenn Sie diesen Menupunkt aktivieren und es ist weder in
+dieser Task noch in einer übergeordneten Task eine Konfiguration vorgenommen
+worden, erhalten Sie die folgende Warnung:
+
+ +----------------------------------------+
+ | Interface ist noch nicht konfiguriert! |
+ +----------------------------------------+
+#center#Abb.11:  Information bei unkonfiguriertem System
+
+
+Ist schon eine Konfiguration, z.B. in der Vatertask vorgenommen worden, so wird
+Ihnen die aktuellen Einstellung angezeigt (s.u.).
+#page#
+#on("b")#5.3.1  Auswahl der Steckplatzart/Interfacekarte#off("b")#
+
+Da Sie in jedem Falle eine Konfiguration von #on("b")#gs-Prozess#off("b")# vornehmen sollen,
+aktivieren Sie jetzt bitte den Menupunkt "Konfigurieren". Daraufhin erscheint die
+folgende Auswahl:
+ +-----------------------------+
+ | Auswahl der Steckplatzart |
+ | |
+ | c Compactbox |
+ | e Einzelsteckplatz |
+ | m Mehrfachsteckplatz |
+ | |
+ | Compact   Einzel   Mehrfach |
+ +-----------------------------+
+
+#center#Abb.12:  Auswahl der Steckplatzart
+
+
+Haben Sie eine Compact-Box angeschlossen, so ist die Konfiguration schnell erledigt:
+Sie tippen die Taste <c>. Daraufhin wird die komplette Konfiguration ausgeführt
+und die Einstellung eingeblendet.
+ +------------------------------------+
+ | Eingestellt: Compactbox |
+ | |
+ | Belegung der Kanäle: |
+ | |
+ | Kanal 1:   Analogeingang 1 (E1) |
+ | |
+ | Kanal 2:   Analogeingang 2 (E2) |
+ | |
+ | Kanal 3:   Digitaleingang |
+ | |
+ | Kanal 4:   Digitalausgang |
+ +------------------------------------+
+
+#center#Abb.13:  Compact-Box: Belegung der Kanäle
+#page#
+Die Anzeige verschwindet, wenn Sie eine beliebige Taste tippen.
+
+Anders dagegen, wenn Sie zuvor dem System mitgeteilt haben, daß ein Einzelsteck­
+platz bzw. ein Mehrfachsteckplatz angeschlossen ist. In diesem Fall müssen Sie
+#on("b")#gs-Prozess#off("b")# noch mitteilen, welche Steckkarten Sie verwenden. Dazu wird Ihnen die
+folgende Auswahl angeboten:
+
+ +----------------------------------+
+ | Angabe der Interfacekarte: |
+ | |
+ | k  Kombikarte |
+ | e  E/A - Karte |
+ | d  D/A - Wandler - Karte |
+ | a  A/D - Wandler - Karte |
+ | 0  Keine Steckkarte |
+ | |
+ | Kombi  E/A  D/A  A/D  Keine |
+ +----------------------------------+
+
+
+#center#Abb.14:  Auswahl einer Interfacekarte
+
+
+Wenn Sie eine Kombikarte, eine E/A-Karte oder eine D/A-Wandler-Karte verwenden,
+ist durch die jeweilige Angabe der Einstellvorgang abgeschlossen. #on("b")#gs-Prozess#off("b")# teilt
+Ihnen daraufhin - ähnlich wie bei der Compact-Box - jeweils die Belegung der Kanäle
+mit. Bei Nutzung der D/A-Wandler-Karte wird zusätzlich der gültige Spannungs­
+bereich angezeigt.
+#page#
+
+ +------------------------------------------------------+
+ | Einzelsteckplatz mit D/A - Karte: |
+ | |
+ | Belegung der Kanäle: |
+ | |
+ | Die Karte stellt einen Analogausgang zur Verfügung, |
+ | der auf zwei Arten angesprochen werden kann:        |
+ | |
+ | Kanal 1:    Spannungsbereich  -5 V  -  +5 V |
+ | |
+ | Kanal 2:    Spannungsbereich   0 V  -  +5 V |
+ | |
+ +------------------------------------------------------+
+
+#center#Abb.15:  Kanalbelegung D/A-Karte (Einzelsteckplatz)
+
+
+Haben Sie dagegen eine A/D-Wandler-Karte angegeben, so erfragt #on("b")#gs-Prozess#off("b")# noch
+die Schalterstellung der DIP-Schalter auf der A/D-Wandler-Karte. Über diese Schalter­
+stellung kann der Spannungsbereich der Analogeingänge festgelegt werden. Das
+erfolgt nach folgendem Prinzip:
+
+Das Spannungsintervall wird jeweils über 3 Schalter festgelegt. Für den Eingang 1
+stehen die Schalter 1, 2 und 3 zur Verfügung, für denn Eingang 2 die Schalter 4, 5
+und 6. Im folgenden werden wir die Einstellung für den Eingang 1 aufzeigen - für den
+Eingang 2 ist mit den drei genannten Schaltern synonym zu verfahren.
+
+Steht Schalter 1 in der Position 'ON', so ist ein Spannungsintervall von 0V - 25V einge­
+stellt (Fall 1) - unabhängig von der Stellung der anderen beiden Schalter. Innerhalb
+eines Schaltertripletts "dominiert" nämlich ein Schalter mit kleinerer Nummer über
+den/die mit größerer Nummer. Ist Schalter 1 in Stellung 'OFF' und Schalter 2 in
+Stellung 'ON', so ist ein Spannungsbereich von 0V - 2,5V eingestellt (Fall 2). Sind die
+beiden ersten Schalter in der Position 'OFF' und nur der Schalter 3 in der Position
+'ON', so ist ein Spannungsintervall von 0V - 0,25V eingestellt (Fall 3).
+#page#
+Eine besondere Bedeutung kommt noch den Schaltern 7 und 8 zu, denn sie beein­
+flussen noch die eben genannten Intervalle. Dabei ist überraschenderweise der
+Schalter 7 für den Eingang 2 und der Schalter 8 für den Eingang 1 zuständig. Die drei
+oben genannten Fälle gelten nämlich nur, wenn Schalter 8 in der Position 'OFF' steht.
+In der Position 'ON' werden die durch das Schaltertriplett eingestellten Spannungs­
+intervalle dagegen symmmetrisch um 0V angelegt: im Fall 1 also der Bereich von
+-12,5V - +12,5V, im Fall 2 von -1,25V - +1,25V und im Fall 3 von -0,125V -
++0,125V.
+ +----------------------------------------------------+
+ | Angabe der Schalterstellungen auf der A/D - Karte: |
+ | |
+ | Bitte die aktuelle Schalterstellung eintragen: |
+ | |
+ | Es bedeutet: 1 - Schalterstellung "on" |
+ | 0 - Schalterstellung "off" |
+ | |
+ | Nummer: 12345678 |
+ | |
+ | Eingabe: 10010010 |
+ +----------------------------------------------------+
+#center#Abb.16:  A/D-Karte: Angabe der Schalterstellung
+
+
+Der Spannungsbereich wird von #on("b")#gs-Prozess#off("b")# aus der Schalterstellung automatisch
+ermittelt und neben den festgelegten Kanalnummer angezeigt. Die obige Schalter­
+stellung führt somit zu folgender Meldung:
+
+ +----------------------------------------------------------------+
+ | Einzelsteckplatz mit A/D - Karte: |
+ | |
+ | Zwei analoge Einträge stehen zur Vefügung: |
+ | |
+ | Kanal 1: (E1) Spannungsbereich 0.000 V  -  +25.000 V |
+ | |
+ | Kanal 2: (E2) Spannungsbereich -12.500 V  -  +12.500 V |
+ | |
+ +----------------------------------------------------------------+
+#center#Abb.17:  A/D-Karte: Kanalbel./Spannungsber.(Bspl.)
+#page#
+Während Sie bei Verwendung eines Einzelsteckplatzes nur einmal nach all diesen
+Angaben gefragt werden, erfolgt die Abfrage bei einem Mehrfachsteckplatz viermal
+hintereinander. Haben Sie einen Steckplatz nicht belegt, so tippen Sie bei der Angabe
+der Interfacekarte die Taste <0> (keine Steckkarte).
+
+
+#on("b")#5.3.2  Bedeutung der Kanalnummern#off("b")#
+
+Nachdem Sie #on("b")#gs-Prozess#off("b")# die Angaben zur Konfiguration (Steckplatzart/Interface­
+kartenart) mitgeteilt haben, teilt Ihnen das System jeweils die Kanalnummern mit.
+Diese Nummern sollten Sie sich merken, denn wenn Sie mit dem von #on("b")#gs-Prozess#off("b")# zur
+Verfügung gestellten Befehlen programmieren wollen, müssen Sie jeweils diese
+Kanalnummern angeben. Fordern Sie von einem Kanal eine Aktion, die nicht ausge­
+führt werden kann/nicht sinnvoll ist, so kann Ihnen dadurch eine Fehlermeldung
+zugestellt werden.
+
+Auf der Compact-Box bzw. der Kombikarte an einem Einzelsteckplatz ist die
+Numerierung identisch: die beiden Analogeingänge haben die Kanalnummern 1 und
+2, der Digitaleingang hat die Nummer 3 und der Digitalausgang die Nummer 4.
+
+Die E/A-Karte verfügt nur über je einen digitalen Eingang und digitalen Ausgang, die
+über die Kanäle 1 und 2 angesprochen werden können. Damit nun aber auch
+Programme, die für die Compact-Box bzw. eine Kombikarte geschrieben sind, auch
+auf der E/A-Karte laufen, können diese beiden Kanäle auch unter der Kanalnummer
+3 (Eingang) bzw. 4 (Ausgang) angesprochen werden. Natürlich ist ein solches
+Programm nur dann auf der E/A-Karte lauffähig, wenn keine Analogeingänge ange­
+sprochen werden, denn die sind ja auf der E/A-Karte gar nicht vorhanden!
+
+Die Kanalnummern auf einem Mehrfachsteckplatz werden nach folgendem System
+vergeben: Die Kanalnummern sind immer zweistellig. Über die erste Ziffer wird der
+Steckplatz (1 - 4) identifiziert, über die zweite Ziffer der eigentliche Kanal auf der
+Steckkarte. Steckt also z.B. in Steckplatz 3 eine Kombikarte (4 mögliche Kanäle) und
+möchten Sie hier den Digitalausgang (Kanal 4) ansprechen, so muß als Kanal die
+Nummer 34 angegeben werden.
+#page#
+Aber auch hier gibt es eine zusätzliche Vereinbarung: Der erste Steckplatz eines
+Mehrfachsteckplatzes kann (zusätzlich) wie ein Einzelsteckplatz angesprochen
+werden. Bei Belegung des ersten Steckplatzes mit einer Kombikarte, können Sie die
+Karte also über die Kanalnummern 11, 12, 13 und 14 ansprechen und zusätzlich
+über die Nummern 1, 2, 3 und 4. Der Sinn der dahintersteckt ist Ihnen sicher sofort
+klar geworden: Dadurch kann ein Programm, das z.B. für die Compact-Box ge­
+schrieben wurde, ohne Änderung übernommen werden, wenn eine Kombikarte auf
+Steckplatz 1 des Mehrfachsteckplatzes steckt etc..
+
+
+#on("b")#5.4  Aus- und Eingabetest#off("b")#
+
+Nun wird es spannend, denn Sie sollen jetzt testen, ob Sie mit Ihrem Interface-System
+arbeiten können. Sofern Sie mit dem MUFI als Adapter arbeiten, schalten Sie das
+MUFI mit dem Schalter an der Vorderseite ein.
+
+Wenn Sie das MUFI im Terminalkanal betreiben, kann das Einschalten dazu führen,
+daß eine unsinnige Zeichenkette auf dem Bildschirm erscheint. Diese Zeichen
+werden durch den "Einschaltknack" verursacht und haben eigentlich nichts zu
+bedeuten. Allerdings läßt sich die Ausgabe auch nicht verhindern. Die Zeichen ver­
+schwinden bei der nächsten Menubedienung.
+
+Wenn Sie alle Hinweise in Kapitel 5.1 beachtet haben, müßte spätestens jetzt das
+Interface-System betriebsbereit sein - gleichgültig, welchen Adapter und welche
+Interface-Komponenten Sie verwenden.
+
+Aktivieren Sie nun den Menupunkt 'Ausgabetest', indem Sie z.B. die Taste <a>
+tippen. Wenn Sie eine Compact-Box angeschlossen haben, müßte die folgende Ein­
+blendung in Ihrem Menubildschirm erscheinen:
+#page#
+ +-------------------------------------------------------------+
+ | Ausgabetest |
+ | |
+ | Ausgabe an Kanal 4 (= Digitalausgang der Compact-Box) |
+ |-------------------------------------------------------------|
+ | |
+ | |
+ | |
+ | Ausgabewert: 129 |
+ | |
+ |-------------------------------------------------------------|
+ | Bitte einen Wert zwischen 0 und 255 eingeben! |
+ | |
+ +-------------------------------------------------------------+
+#center#Abb.18:  Ausgabetest - Einblendung
+
+
+Eine nahezu identische Einblendung erhalten Sie, wenn Sie einen Einzelsteckplatz
+mit Kombi- oder E/A-Karte angeschlossen haben.
+
+Da beim Ausgabetest nur die Ausgänge einer Karte angesprochen werden, ist ein
+Ausgabetest an einer A/D-Wandler-Karte nicht möglich! An einer D/A-Wandler-Karte
+kann zwar prinzipiell ein Ausgabetest erfolgen - ist aber nicht sinnvoll, da die zur
+Kontrolle notwendige Leuchtdiodenanzeige hier nicht angeschlossen werden kann.
+
+Wenn Sie einen Mehrfachsteckplatz angeschlossen haben, werden Sie zuvor noch
+gefragt, welchen Steckplatz Sie testen wollen. Bitte beachten Sie hier das im vorigen
+Abschnitt Gesagte. Ansonsten ist auch hier die anschließende Einblendung nahezu
+identisch.
+
+Zum Testen geben Sie jetzt einige Werte zwischen 0 und 255 ein. Nach jeder Eingabe
+tippen Sie bitte die <RETURN>-Taste. Bei Eingabe der '0' müßten alle Leucht­
+dioden dunkel sein. Bei '1' dürfte nur die letzte Leuchtdiode (rechts) aufleuchten,
+bei 128 nur die erste (links); bei 255 müßten alle 8 Leuchtdioden der Anzeige auf­
+leuchten.
+#page#
+Sollten wider Erwarten Fehler aufgetreten sein, lesen Sie bitte im Kapitel 5.5 nach.
+Wenn alles wie beschrieben funktioniert hat, gehen Sie gleich zum Eingabetest über.
+Verlassen Sie dazu den Ausgabetest durch die Tastenfolge <ESC><q> und
+aktivieren Sie anschließend den Menupunkt 'Eingabetest' indem Sie z.B. die Taste
+<e> tippen.
+
+Außer bei der E/A-Karte im Einzelsteckplatz werden Sie hier zusätzlich nach der
+Nummer des Kanals gefragt, über den der Einlesetest erfolgen soll. Das liegt daran,
+daß sich auf den meisten Interfacesystemen mehrere Eingänge befinden. Beim
+Einzelsteckplatz werden die Auswahlmöglichkeiten vorgegeben; beim Mehrfachsteck­
+platz erfolgt eine freie Eingabe der Kanalnummern.
+
+Wenn Sie eine Compact-Box angeschlossen haben, müßte die folgende Einblendung
+in Ihrem Menubildschirm erscheinen:
+
+ +-------------------------------------------------------------+
+ | Eingabetest |
+ | |
+ | Eingabe von Kanal 3 (= Digitaleingang der Compact-Box) |
+ | |
+ |-------------------------------------------------------------|
+ | |
+ | |
+ | Eingelesener Wert: 129 |
+ |-------------------------------------------------------------|
+ | |
+ +-------------------------------------------------------------+
+
+#center#Abb.19:  Eingabetest - Einblendung
+
+
+Wenn Sie den Codekartenleser am Digitaleingang angeschlossen haben und alles
+korrekt funktioniert, müßte als eingelesener Wert die Zahl 255 erscheinen. Legen Sie
+eine Lochkarte ein oder legen Sie einen Finger zwischen Beleuchtung und Licht­
+sensoren. Daraufhin müßte sich die Anzeige auf dem Bildschirm ändern. Nun
+können Sie versuchen, durch Abdecken der Sensoren die bei der Ausgabe schon
+angesprochenen Testwerte zu erhalten.
+#page#
+Wenn Sie über keinen Codekartenleser verfügen, so benutzen Sie jetzt bitte das kleine
+Kabelstück, das Sie auf den +5V-Lötschuh aufgesteckt haben und dessen anderes
+Ende bisher noch nirgendwo aufgesteckt ist. Berühren Sie nun mit diesem freien
+Ende die Stifte, die im 8poligen Eingangs-Platinenstecker sichbar sind. Wird kein Pin
+berührt, müßte auf dem Bildschirm der Wert '0' erscheinen. Berühren Sie einen der
+Pins an der Seite, müßte der Wert '1', berühren Sie den an der anderen Seite, müßte
+der Wert '128' erscheinen. Wenn Sie also nacheinander die Pins berühren, müßten
+die Zahlenwerte 1, 2, 4, 8, 16, 32, 64, 128 erscheinen.
+
+Wenn sowohl Ausgabe- als auch Eingabetest korrekt abgewickelt werden konnten,
+brauchen Sie das Kapitel 5.5 nicht zu lesen, denn das beschäftigt sich nur mit
+Fehlern, die bisher aufgetreten sein könnten. Den Eingabetest verlassen Sie bitte
+durch die Tastenfolge <ESC><q>.
+
+
+#on("b")#5.5  Mögliche Fehlerfälle#off("b")#
+
+#on("b")#
+- Das MUFI wurde in den Terminalkanal eingebaut. Selbst beim vom Netz
+ getrennten MUFI ist kein Terminalbetrieb möglich:
+#off("b")#
+
+ --> Das neu eingefügte Kabel ist unzureichend oder falsch verdrahtet. Bitte
+ Hinweise im MUFI-Handbuch lesen bzw. Informationen von BICOS ein­
+ holen.
+
+
+#on("b")#
+- Das MUFI wurde in den Terminalkanal eingebaut. Beim Einschalten des
+ MUFIs erscheinen unsinnige Zeichenketten auf dem Bildschirm bzw. das
+ Einschalten hat noch schwerwiegendere Folgen: #off("b")#
+
+ --> Der "Einschaltknack" des MUFI "schlägt auf andere Systemkomponenten
+ durch". Sofern nur Zeichen auf dem Bildscchirm erscheinen, ist das weit­
+ gehend unproblematisch - kann auch nicht beseitigt werden. Ansonsten
+ erst das MUFI, dann das Terminal bzw. den Rechner einschalten. Ggf.
+ Rücksprache mit BICOS.
+#page#
+#on("b")#
+- Das MUFI wurde in den Terminalkanal eingebaut. Bei ausgeschaltetem
+ MUFI ist ein einwandfreier Terminalbetrieb möglich, bei einge­
+ schaltetem MUFI reagiert das Terminal nicht mehr:
+#off("b")#
+
+ --> MUFI- und Terminalkonfiguration passen nicht zueinander (Baudrate,
+ Protokoll, Anzahl der Stopbits). Einstellungen am Terminal, in der Task
+ 'configurator' und die DIP-Schalter-Stellung im MUFI kontrollieren; ggf.
+ Neueinstellung.
+
+ --> MUFI defekt - Rücksprache mit BICOS.
+
+
+#on("b")#
+- Beim Austest erscheint die Einblendung "Interface ist noch nicht
+ konfiguriert!":
+#off("b")#
+
+ --> #on("b")#gs-Prozess#off("b")# wurde noch nicht konfiguriert. Unter dem Oberbegriff 'Inter­
+ face' den Menupunkt 'Konfigurieren' aktivieren und den Ausführungen in
+ Kapitel 5.3 folgend die Konfiguration vornehmen.
+
+ --> Bei Betrieb des Interface Systems an separater serieller Schnittstelle werden
+ unbenannte Sohntasks eingerichtet (unter der eigenen Task bzw. unter
+ einer "zentralen Abwicklungstask"). Diese unbenannte Sohntask wurde
+ irrtümlich gelöscht. Abhilfe: Neukonfiguration vornehmen. #on("b")#*)#off("b")#
+
+ --> Bei Betrieb des Interface-Systems an separater serieller Schnittstelle und
+ "zentraler Abwicklungstask" wurde in der "zentralen Abwicklungs-Task"
+ eine Neukonfiguration von #on("b")#gs-Prozess#off("b")# vorgenommen. Die dabei ent­
+ standene unbenannte Sohntask wird von den "alten" Sohntasks nicht mehr
+ erkannt. Abhilfe: Alle Sohntasks, die auf die "zentrale Abwicklungstask"
+ zugreifen, löschen und neu einrichten. #on("b")#*)#off("b")#
+#page#
+#on("b")#
+- Es erscheint die Fehlermeldung "Interface meldet sich nicht!":
+#off("b")#
+
+ --> Der angeschlossene Adapter ist ohne Spannungsversorgung. Netzstecker
+ des Adapters überprüfen. Beim MUFI den Schalter an der Vorderseite in
+ Stellung 'Ein' bringen. Beim RS232-Adapter den 3poligen Platinenstecker
+ in die 12V-Spannungsversorgungsbuchse am Interface-System einstecken.
+
+ --> Es wurde bei der Installation von #on("b")#gs-Prozess#off("b")# eine falsche Interface-
+ Kanal-Nummer angegeben. Die Kanalnummer kann mit 'put(interface­
+ kanal) <RETURN>' erfragt werden. Kanalnummer überprüfen. Ggf. neue
+ Kanalnummer angeben. Dafür steht die Prozedur 'PROC interfacekanal
+ (INT CONST nummer)' zur Verfügung.
+
+ --> Speziell beim MUFI: Das MUFI wurde zwischenzeitlich (versehentlich)
+ ausgeschaltet oder es kam zu einem "ungeregeltem Bedienungsabbruch"
+ z.B. durch Drücken der SV-Taste im laufenden Betrieb. Die interne Ein­
+ stellung des MUFIs ist verändert. Abhilfe: Menupunkt verlassen, MUFI
+ ausschalten, einige Sekunden warten, MUFI anschalten, Menupunkt neu
+ anwählen.
+
+
+#on("b")#
+- Es erscheint die Fehlermeldung "Interface-Kanal ist belegt!:
+#off("b")#
+
+ --> Das Interface-System ist an einer separaten seriellen Schnittstelle ange­
+ schlossen. Am Kanal wurden schon andere Geräte betrieben, die nicht
+ ordentlich abgemeldet wurden. Mit 'taskinfo (2) <RETURN>' kann die
+ Belegung der Kanäle eingesehen werden. Ggf. erst ein Terminal an den
+ Kanal anschließen (Kanal umkonfigurieren!) und dort 'break
+ <RETURN>' geben. Oder von einer privilegierten Task aus die ange­
+ koppelte Task "abschießen".
+
+ --> Das Interface-System ist an einer separaten seriellen Schnittstelle ange­
+ schlossen. Eine andere Task greift bereits auf das Interface-System am
+ eingestellten Kanal zu. Benutzer bitten, den Kanal freizugeben. #on("b")#*)#off("b")#
+#page#
+#on("b")#
+- Es erscheint die Fehlermeldung "Interface-Task ist besetzt!":
+#off("b")#
+
+ --> Das Interface-System ist an einer separaten seriellen Schnittstelle ange­
+ schlossen. Die Kommunikation erfolgt über eine "zentrale Abwicklungs­
+ task". Auf diese Task greift zur Zeit ein anderer Benutzer zu. Mit dem
+ anderen Benutzer verständigen und warten, bis die Task freigegeben wird.
+ #on("b")#*)#off("b")#
+
+
+#on("b")#
+- Es erschient die Fehlermeldung "An Kanal ... ist keine Digitaleingabe
+ (Digiatalausgabe, Analogeingabe, Analogausgabe) möglich!":
+#off("b")#
+
+ --> Laut Konfiguration ist die gewünschte Leistung am angegebenen Kanal auf
+ der angeschlossenen Interfacekarte nicht möglich. Kanal neu konfigurieren
+ oder anderen Kanal ansprechen bzw. Interface-Karte wechseln und neu
+ konfigurieren.
+
+
+#on("b")#
+- Es erschient die Fehlermeldung "Kanalnummer ... ist unzulässig!":
+#off("b")#
+
+ --> Es wurde eine - bezogen auf das angeschlossene Interface-System - un­
+ sinnige Kanalnummer angegeben. Diese Fehlermeldung erscheint in jedem
+ Falle, wenn die Kanalnummer kleiner als 1 oder größer als 49 ist! Abhilfe:
+ korrekte Kanalnummer angeben.
+
+
+#on("b")#
+- Es erschient die Fehlermeldung "Interface kann nicht geöffnet werden!":
+#off("b")#
+
+ --> Interessanter Fehler! Bitte alle Details der Fehlersituation notieren und an
+ ERGOS einsenden!
+#page#
+#on("b")#
+- Beim Austest erscheint zwar keine Fehlermeldung, aber die Leucht­
+ diodenanzeige zeigt auf verschiedene Ausgabewerte keine Reaktion
+ (bleibt dunkel oder unsinnige fixe Anzeige):
+#off("b")#
+
+ --> Die angeschlossene Leuchtdiodenanzeige ist nicht korrekt angeschlossen.
+ Platinenstecker (Digitalausgang) überprüfen; Massekabel überprüfen; die
+ beiden Überbrückungskabel (Abb.7) überprüfen.
+
+ --> Steckplatz/Compact-Box wird nicht mit Spannung versorgt. Netzkabel/An­
+ schluß zum Netzteil überprüfen.
+
+ --> Verbindungskabel Adapter - Interface-System nicht richtig aufgesteckt oder
+ intern falsch verdrahtet.
+
+
+#on("b")#
+- Beim Austest erscheinen verschiedene Ausgabemuster an den Leucht­
+ dioden, die Muster sind aber nicht korrekt:
+#off("b")#
+
+ --> Kabel vom Adapter zum Interface ist falsch verdrahtet.
+
+ --> Kabel in der Leuchtdiodenanzeige (Selbstbau ?) sind falsch verdrahtet.
+
+
+#on("b")#*)#off("b")# Die hier genannten Fehlermeldungen sind bei der oben beschriebenen Erst­
+ installation (noch) nicht möglich. Sie können erst auftreten, wenn weiter­
+ gehende Installationen erfolgt sind (z.B. Installation einer "zentralen Abwick­
+ lungs-Task" etc.). Zum Verständnis lesen Sie bitte das Kapitel "Hinweise für den
+ Systembetreuer/Programmierer".
+
+
+
+
+
+
+
+
diff --git a/doc/prozess/gs-prozess-6 b/doc/prozess/gs-prozess-6
new file mode 100644
index 0000000..a3835cd
--- /dev/null
+++ b/doc/prozess/gs-prozess-6
@@ -0,0 +1,641 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#on("b")#6  Arbeiten mit gs-Prozess#off("b")#
+
+In diesem Kapitel werden wir Ihnen die Basisbefehle von #on("b")#gs-Prozess#off("b")# vorstellen und
+erläutern, was die einzelnen Befehle bewirken. Dabei werden wir an einfachen
+Beispielen aufzeigen, wie Sie mit #on("b")#gs-Prozess#off("b")# arbeiten können.
+
+Wir gehen hier davon aus, daß die Hardware-Voraussetzungen erfüllt, das Interface-
+System angeschlossen und die Software (#on("b")#gs-Prozess#off("b")#) auf dem Rechner installiert
+sind. Sie sollten #on("b")#gs-Prozess#off("b")# bereits konfiguriert und einen Ein- und Ausgabetest
+durchgeführt haben.
+
+In unserer Beschreibung gehen wir weiterhin davon aus, daß als Interface-System
+eine Compact-Box verwendet wird. Alle hier beschriebenen Beispiele gelten ganz
+genauso für einen Einzelsteckplatz mit Kombikarte (hier müssen Sie nur zusätzlich
+eine Leuchtdiodenanzeige anschließen - aber Sie wissen ja schon, wie das gemacht
+wird.) Bei anderen Hardware-Konfigurationen ist darauf zu achten, daß ggf. andere
+Kanalnummern anzugeben sind.
+
+Die Compact-Box verfügt - genau wie die Kombikarte - über zwei analoge Eingänge
+(Kanal 1 und Kanal 2), über einen digitalen Eingang (Kanal 3) sowie über einen
+digitalen Ausgang (Kanal 4). Wie Sie schon bei der Konfiguration von #on("b")#gs-Prozess#off("b")#
+gesehen haben, haben Sie keinen Einfluß auf die Numerierung der Kanäle - die wird
+vom #on("b")#gs-Prozess#off("b")# vorgegeben. Diese Kanalnummer müssen Sie kennen, wenn Sie das
+System ansprechen (programmieren) wollen (ggf. können Sie die Kanalnummern
+durch Aktivieren des Menupunktes 'Information' unter dem Oberbegriff 'Interface'
+erfragen).
+
+
+#on("b")#6.1  Kleine Beispiele zur digitalen Ausgabe#off("b")#
+
+Bei diesem Einführungsbeispiel wollen wir uns zunächst ausschließlich auf die
+digitale Ausgabe beschränken. Wenn Sie die Compact-Box (oder eine E/A-Karte)
+angeschlossen haben, benötigen Sie hierzu keine zusätzliche Hardware, ansonsten
+schließen Sie bitte an Ihren digitalen Ausgang eine 8-elementige Leuchtdiodenanzeige
+an.
+#page#
+Sie haben sicher schon an einer Autobahnbaustelle ein sogenanntes "Lauflicht"
+gesehen. Es erscheint, als ob ein Licht über die aufgestellten Barken hinwegläuft.
+Dadurch soll auf die Baustellenein- bzw. -ausfahrt hingewiesen werden. Dieser Effekt
+wird dadurch erreicht, daß die Lampen, die an den Barken angebracht sind, nach­
+einander ein- und auch wieder ausgeschaltet werden.
+
+Wir wollen jetzt auf unserer 8-elementigen Leuchtdiodenanzeige ein solches Lauflicht
+nachbilden. Dabei soll das "Licht von rechts nach links über die Anzeige wandern".
+
+Um das Programm zu schreiben, aktivieren Sie im #on("b")#gs-Prozess#off("b")#-Menu unter dem
+Oberbegriff "Programm" den Menupunkt "Neu erstellen". Sie werden dann nach
+einem Namen gefragt, den Sie der Programmdatei geben wollen. Tragen Sie hier
+einen beliebigen Namen ein, und tippen Sie anschließend die <RETURN>-Taste.
+Notieren Sie dann das folgende ELAN-Programm:
+
+#on("b")#
+ initialisiere interface;
+ REP
+ lauflichtdurchgang;
+ warte (2.0)
+ UNTIL abbruch gewuenscht PER.
+
+ lauflichtdurchgang:
+ bitmuster ausgeben (4, "OOOOOOOI");
+ bitmuster ausgeben (4, "OOOOOOIO");
+ bitmuster ausgeben (4, "OOOOOIOO");
+ bitmuster ausgeben (4, "OOOOIOOO");
+ bitmuster ausgeben (4, "OOOIOOOO");
+ bitmuster ausgeben (4, "OOIOOOOO");
+ bitmuster ausgeben (4, "OIOOOOOO");
+ bitmuster ausgeben (4, "IOOOOOOO")
+#off("b")#
+
+
+Wenn Sie das Programm fertiggeschrieben haben, verlassen Sie die Datei durch die
+Tastenfolge <ESC><q>. Sie gelangen wieder zum Menu und aktivieren jetzt den
+Menupunkt "Starten". Daraufhin wird das Programm übersetzt und ausgeführt.
+#page#
+#on("b")#6.1.1  Möglichkeit eines Programmabbruchs#off("b")#
+
+Wir hoffen natürlich, daß das Programm genau die Ausgabe an der Leuchtdioden­
+anzeige erzeugt, die Sie erwartet haben.
+
+Als Ausgangsbedingung der Schleife haben wir den Testbefehl 'abbruch gewuenscht'
+verwendet. Dieser Befehl wird von #on("b")#gs-Prozess#off("b")# zur Verfügung gestellt. Durch den
+Testbefehl wird überprüft, ab zwischenzeitlich die Tastenkombination <ESC><q>
+eingegeben wurde. Ist das bei unserem Programm der Fall, so wird die Schleife
+('regulär') beendet.
+
+Aber bitte etwas Geduld: Das Programm wird nicht sofort nach Eingabe der Tasten­
+folge "abgebrochen". Hat nämlich gerade ein neuer 'lauflichtdurchgang' begonnen,
+so wird das Refinement natürlich erst vollständig abgearbeitet. Erst dann wird
+geprüft, ob die Tastenfolge zwischenzeitlich eingegeben wurde.
+
+Sollten Sie einmal in einer Situation sein, in der Sie ein Programm tatsächlich
+abbrechen müssen, so ist das (in den meisten Fällen) über die Tastenfolge
+<ESC><h> möglich. Diese Tastenkombination sollten Sie sich für "Notfälle"
+merken. Vielleicht probieren Sie sie gleich an unserem Beispiel aus.
+
+
+#on("b")#6.1.2  Die "sonstigen" Befehle#off("b")#
+
+Gehen wir zunächst auf die beiden Befehle 'initialisiere interface' und 'warte' sowie
+auf den Testbefehl 'abbruch gewuenscht ein:
+
+#on("b")#
+PROC initialisiere interface
+#off("b")#
+
+ Jedes Programm zur Prozeßdatenverarbeitung, das auf das Interface-System
+ zugreift, sollte mit diesem Befehl beginnen. Durch diesen Befehl wird das System
+ in einen definierten Anfangszustand versetzt; systeminterne Variablen werden
+ initialisiert, so daß vom Programm aus darauf zugegriffen werden kann.
+#page#
+#on("b")#
+PROC warte (REAL CONST wert)
+PROC warte (INT CONST wert)
+#off("b")#
+
+ Der Befehl 'warte' ähnelt dem Ihnen sicher bekannten Befehl 'pause'. Allerdings
+ wird hier als Parameter (INT oder REAL) die Wartezeit in Sekunden angegeben -
+ bei 'pause' dagegen die Anzahl der Zehntelsekunden. Der eigentliche Unterschied
+ besteht aber darin, daß 'warte' im Gegensatz zu 'pause' ein "Nothalt" - d.h. die
+ Tastenkombination <ESC><h>, die wir im vorigen Kapitel beschrieben haben
+ - registriert. Aus diesem Grunde sollte in Prozeßdatenverarbeitungsprogrammen
+ mit 'warte' statt mit 'pause' gearbeitet werden.
+
+
+#on("b")#
+BOOL PROC abbruch gewuenscht
+#off("b")#
+
+ Die Prozedur liefert den Wert 'TRUE', wenn zwischenzeitlich die Tasten­
+ kombination <ESC><q> eingegeben wurde, sonst den Wert 'FALSE'.
+
+
+#on("b")#6.1.3  Schreibweise für Bitmuster/Bitsymbole#off("b")#
+
+Beim Befehl 'bitmuster ausgeben', wird eine Zeichenkette, die aus 8 Zeichen besteht,
+übergeben - das sog. Bitmsuster. In unserem Falle kommen hier nur die Zeichen 'I'
+und 'O' vor. Ihnen ist sicher die Bedeutung sofort klar gewesen:
+
+ 'I' bedeutet, daß an der entsprechenden Position ein High-Pegel (5V) angelegt
+ werden soll; 'O' bedeutet, daß an der entsprechenden Position ein Low-
+ Pegel (0V) angelegt werden soll.
+
+So werden über den ersten Befehl im Refinement 'lauflichtdurchgang' alle Leucht­
+dioden ausgeschaltet, nur die Leuchtdiode ganz rechts wird angeschaltet. Über den
+zweiten Befehl wird diese wieder ausgeschaltet und dafür aber die zweite von rechts
+eingeschaltet usw.
+#page#
+Neben den Zeichen 'I' und 'O' dürfen auch die Zeichen 'X' und 'T' in der über­
+gebenen Zeichenkette auftauchen. Um die Bedeutung zu verstehen, muß man
+wissen, daß #on("b")#gs-Prozess#off("b")# den jeweils letzten Zustand des digitalen Ausgangs speichert
+(durch 'initialisiere interface' werden alle Ausgänge auf 'O' gesetzt).
+
+ 'X' bedeutet, daß an der entsprechenden Position der zuletzt dagewesene
+ Zustand erhalten bleibt, d.h. durch diese Ausgabe nicht beeinflußt wird.
+
+ 'T' bedeutet, daß an der entsprechenden Position der zuletzt dagewesene
+ Zustand "umgekehrt" wird. Lag zuletzt ein Low-Pegel (O) an, so wird
+ daraus ein High-Pegel (I) und umgekehrt.
+
+Sie können sich nun sicher sofort erklären, was das folgende Programm bewirkt:
+
+
+#on("b")#
+ initialisiere interface;
+ bitmuster ausgeben (4, "OIOIOIOI");
+ REP
+ bitmuster ausgeben (4, "TTTTTTTT");
+ warte (1)
+ UNTIL abbruch gewuenscht PER
+#off("b")#
+
+
+Durch den ersten Befehl 'bitmuster ausgeben' wird jede zweite Leuchtdiode ange­
+schaltet, die anderen werden ausgeschaltet. Durch den zweiten Befehl in der Schleife
+wird nun jeweils jeder Zustand in "das Gegenteil umgekehrt", so daß ein Blinklicht
+entsteht, bei dem abwechselnd einmal die einen vier, dann die anderen vier Leucht­
+dioden aufleuchten - und das jeweils für eine Sekunde.
+
+
+#on("b")#6.1.4  Befehle für die digitale Ausgabe#off("b")#
+
+Einen Befehl, mit dem der digitale Ausgang des Interfaces angesprochen werden
+kann, haben Sie schon in Kapitel 6.1 kennengelernt:
+#page#
+#on("b")#
+PROC bitmuster ausgeben (INT CONST kanal,
+ TEXT CONST zeichenkette)
+#off("b")#
+
+Über den ersten Parameter wird der Kanal angegeben, über den der digitale Ausgang
+angesprochen werden kann; bei uns ist das der Kanal 4 auf der Compact-Box. Über
+den zweiten Parameter wird das sogenannte Bitmuster übergeben; ein Text, der aus
+genau 8 Zeichen besteht. Dabei dürfen die Zeichen "I, O, X und T verwendet werden
+(sehen Sie dazu auch Kapitel 6.1.3).
+
+#on("b")#gs-Prozess#off("b")# stellt noch zwei weitere Befehle für die digitale Ausgabe zur Verfügung.
+Um die Wirkungsweise der Befehle zu verdeutlichen, hier das erste Beispiel (das
+Lauflicht) in einer zweiten Version:
+
+#on("b")#
+ initialisiere interface;
+ REP
+ lauflichtdurchgang;
+ warte (2.0)
+ UNTIL abbruch gewuenscht PER.
+
+ lauflichtdurchgang:
+ INT VAR zeiger;
+ FOR zeiger FROM 0 UPTO 7 REP
+ schalte aktuelle leichtdiode an;
+ schalte vorgaenger aus
+ PER.
+
+ schalte aktuelle leuchtdiode an:
+ bitsymbol ausgeben (4, zeiger, "I").
+
+ schalte vorgaenger aus:
+ IF zeiger = 0
+ THEN bitsymbol ausgeben (4, 7, "O")
+ ELSE bitsymbol ausgeben (4, zeiger - 1, "O")
+ FI.
+#off("b")#
+
+#on("b")#
+PROC bitsymbol ausgeben (INT CONST kanal, bitnummer,
+ TEXT CONST zeichen)
+#off("b")#
+#page#
+Während durch den Befehl 'bitmuster ausgeben' auf alle 8 Ausgänge gleichzeitig
+Einfluß genommen werden kann, wird mit dem Befehl 'bitsymbol ausgeben' gezielt
+nur genau einer der 8 Ausgänge, d.h. eines der 8 Bits manipuliert. Welcher Ausgang /
+welches Bit manipuliert werden soll, wird über den zweiten Parameter festgelegt: hier
+kann einer der Werte 0...7 angegeben werden (Beachten Sie die Numerierung der
+Ausgänge (!)).
+
+Als dritter Parameter wird ein Text übergeben, der aus genau einem Zeichen
+bestehen muß. Ebenso wie beim Befehl 'bitmuster ausgeben' sind hier die Zeichen I,
+O, X und T zulässig. Sie haben hier auch die gleiche Bedeutung.
+
+Mit dem dritten Ausgabebefehl für den digitalen Ausgang können wir das Beispiel
+noch in einer dritten Version notieren:
+
+#on("b")#
+ initialisiere interface;
+ REP
+ lauflichtdurchgang;
+ warte (2.0)
+ UNTIL abbruch gewuenscht PER.
+
+ lauflichtdurchgang:
+ INT VAR wert :: 1;
+ REP
+ dezimalwert ausgeben (4, wert);
+ wert := 2 * wert
+ UNTIL wert > 128 PER.
+#off("b")#
+
+#on("b")#
+PROC dezimalwert ausgeben (INT CONST kanal, wert)
+#off("b")#
+
+'wert' kann Werte zwischen 0 und 255 annehmen. Das zugehörige Bitmuster wird
+dann am angegebenen Kanal ausgegeben. Anhand dieses Befehls wird Ihnen sicher
+auch klar, warum gerade die oben beschriebene Numerierung der Bits gewählt
+wurde.
+#page#
+#on("b")#6.1.5  Befehle für die analoge Ausgabe#off("b")#
+
+Neben der 'digitalen' Ausgabe ist auch eine 'analoge' Ausgabe möglich. Allerdings
+wollen wir die Beschreibung der Befehle an dieser Stelle sehr kurz halten, denn eine
+"analoge" Ausgabe ist nur möglich, wenn Sie eine D/A-Karte besitzen.
+
+Auf der D/A-Karte steht nur ein physikalischer Ausgabekanal zur Verfügung, der von
+#on("b")#gs-Prozess#off("b")# jedoch über zwei Kanalnummern angesprochen werden kann.
+
+Über den Ausgabekanal 1 können Spannungswerte zwischen -5V und +5V aus­
+gegeben werden, über den Ausgabekanal 2 Spannungswerte zwischen 0V und +5V.
+
+Dafür stellt #on("b")#gs-Prozess#off("b")# zwei Befehle bereit:
+
+#on("b")#
+PROC spannungswert ausgeben (INT CONST kanal,
+ REAL CONST wert)
+#off("b")#
+
+'wert' kann, in Abhängigkeit vom angegebenen Kanal, Werte zwischen -5.0 und +5.0
+(bei Kanal 1) bzw. 0.0 und +5.0 (bei Kanal 2) annehmen. Bei dem Versuch, Werte
+außerhalb dieser Grenzen anzugeben, erhalten Sie die Fehlermeldung "Der
+Spannungswert ... ist nicht zulässig!".
+
+
+#on("b")#
+PROC wert an analogausgang ausgeben (INT CONST kanal, wert)
+#off("b")#
+
+Für 'wert' kann eine Zahl zwischen 0 und 255 angegeben werden. Dabei wird 0 auf
+den kleinstmöglichen Spannungswert am jeweilgen Kanal (bei Kanal 1 also auf -5V,
+bei Kanal 2 auf 0V) und 255 auf den größtmöglichen Spannungswert am jeweilgen
+Kanal (bei beiden Kanälen auf +5V) abgebildet. Das Intervall zwischen kleinst- und
+größtmöglichem Spannungswert wird in 255 gleichgroße Teilintervalle eingeteilt. Es
+wird nun die Spannung ausgegeben, die der Intervallnummer entspricht.
+Anmerkung: Dieser Befehl hat nur einen "geringen praktischen Nutzwert"; er dient
+ vornehmlich dazu, den Wandlungsprozeß zu verdeutlichen.
+#page#
+#on("b")#6.2  Kleine Beispiele zur digitalen Eingabe#off("b")#
+
+Für die im folgenden beschriebenen kleinen Beispiele benötigen Sie einen Code­
+kartenleser und einige Codekarten (können auch von der Fa. AKTRONIK bezogen
+werden). Der Anschluß des Codekartenlesers an Ihr Interface-System ist denkbar
+einfach. Stecken Sie den 8poligen Platinenstecker des Codekartenlesers in die Buchse
+des Digitaleinganges der Steckkarte bzw. der Compact-Box und den 3poligen
+Platinenstecker in die passende Spannungsversorgungsbuchse (12V) am Steckplatz
+bzw. auf der Compact-Box - fertig! Bei eingeschalteter Betriebsspannung müßte nun
+der Codekartenleser beleuchtet sein.
+
+Auf den Lochkarten sind bis zu 8 Löcher eingestanzt. Dabei können bestimmte
+Löcher (Bits) für die Erfassung definierter Merkmale verwendet werden. Dazu kann
+eine Karte in bestimmte Bereiche aufgeteilt werden.
+
+In unserem kleinen Beispiel stellen wir uns vor, daß eine (Modell-)Sparkasse zwei
+Filialen hat. Sie hat an Ihre "Kunden" Codekarten verteilt. Die Filialen sind durch
+Farben gekennzeichnet. Die oberen (höchstwertigen) zwei Bits der Karte sollen diese
+Farbe kodiert enthalten, damit auch der "Sparkassen-Computer" die Farbe schnell
+ermitteln kann. Die Karte soll folgenden Aufbau haben:
+
+ +---------------------------------+
+ | O o o O o o O |
+ | | |
+ | Farbbits| Kundennummer |
+ | | |
+ | | |
+ | | |
+ | |
+ +---------------------------------+
+
+
+#center#Abb.20 Beispiellochkarte
+#page#
+Bit 7 sei für rote, Bit 6 für grüne Farbe gesetzt, d.h. gelocht. Wie wollen jetzt ein
+Programm erstellen, das auf Eingabe einer Karte deren Farbe und den durch die
+ersten 6 Bits bestimmten Wert (Kundennummer) ausgibt:
+
+#on("b")#
+ initialisiere interface;
+ REP
+ erfasse lochkarte
+ UNTIL abbruch gewuenscht PER.
+
+ erfasse lochkarte:
+ warte bis karte im leser;
+ gib farbe aus;
+ gib kundennummer aus;
+ warte bis keine karte im leser.
+
+ warte bis karte im leser:
+ put ("Bitte eine Codekarte einlegen!"); line;
+ WHILE NOT alles abgedunkelt REP
+ tue nichts
+ END REP;
+ WHILE alles abgedunkelt REP
+ tue nichts
+ END REP;
+ warte (1).
+
+ warte bis keine karte im leser:
+ put ("Bitte die Karte entnehmen!");
+ REP
+ tue nichts
+ UNTIL alles beleuchtet PER.
+
+ alles abgedunkelt:
+ bitmuster (3) = "OOOOOOOO".
+
+ alles beleuchtet:
+ bitmuster (3) = "IIIIIIII".
+
+ gib farbe aus:
+ IF bitsymbol (3, 7) = "I"
+ THEN put ("rote Karte"); line
+ ELSE put ("grüne Karte");line
+ FI;
+#page#
+ gib kundennummer aus:
+ INT VAR kundennummer :: 0, bitnummer;
+ FOR bitnummer FROM 0 UPTO 5 REP
+ registriere gesetztes bit
+ PER;
+ put ("Kundennummer:"); put (kundennummer): line.
+
+ registriere gesetztes bit:
+ IF bit ist gesetzt (3, bitnummer)
+ THEN kundennummer INCR (2 ** bitnummer)
+ FI.
+
+
+#off("b")#
+ (Hinweis: Es handelt sich hier um ein Beispielprogramm, an dem diverse
+ Befehle erläutert werden sollen - die Programmierung ist nicht
+ optimal! Im Refinement 'warte bis karte im leser' ist es z.B.
+ günstiger, solange einzulesen, bis der eingelesene Wert "stabil" ist.
+ Auch das Refinement 'registriere gesetztes bit' würde man so nicht
+ programmieren, sondern nach einem Einlesevorgang (Bitmuster)
+ über Textoperationen aus dem Bitmuster die 'kundennummer'
+ ermitteln...).
+
+Bevor wir Ihnen die Funktionsweise der von #on("b")#gs-Prozess#off("b")# bereitgestellten Prozeduren
+im Detail erläutern, möchten wir Ihnen noch ein paar kurze Erläuterungen zum
+obigen Programm geben.
+
+Besondere Aufmerksamkeit sollten Sie den Refinements 'warte bis karte im leser' und
+'warte bis keine karte im leser' schenken. Im erstgenannten Refinement ist sicherzu­
+stellen, daß das Einschieben der Karte (erst muß alles abgedunkelt werden - dann
+müssen einige Positionen beleuchtet sein) registriert wird. Um Fehlauswertungen der
+Karte zu vermeiden (z.B. beim Verkanten einer Karte) wird zur Sicherheit vor der
+Auswertung eine Sekunde gewartet. Am Ende des Lesevorgangs soll sichergestellt
+werden, daß die Karte auch entnommen worden ist (alle Positionen wieder beleuchtet
+sind).
+#page#
+Wir prüfen im Refinement 'gib farbe aus' nur das 7. Bit (sehen Sie die Erklärung zu
+'bitsymbol'). Ist das Bit gesetzt (die Karte hier gelocht), so identifizieren wir die Farbe
+Rot, sonst Grün. Natürlich ist es möglich, mit 2 "Farbbits" vier Farben zu ver­
+schlüsseln: z.B. Rot, wenn nur Bit 7 gesetzt ist; Grün, wenn nur Bit 6 gesetzt ist; Blau,
+wenn Bit 7 und Bit 6 gesetzt sind; Gelb, wenn weder Bit 7 noch Bit 6 gesetzt sind.
+Dadurch wird der Auswertalgorithmus aber etwas aufwendiger. Vielleicht probieren
+Sie es nacher einmal.
+
+Die Prozedur 'tue nichts' wird schon von #on("b")#gs-Prozess#off("b")# bereitgestellt. Es wird keine
+Aktion ausgeführt - jedoch überprüft, ob zwischenzeitlich die Tastenfolge
+<ESC><h> ("Notbremse") eingegeben wurde. Es empfiehlt sich, diese Prozedur
+gerade in Schleifenrümpfen einzusetzten, damit die Möglichkeit besteht, bei einer
+"Endlosschleife" einen Abbruch herbeizuführen (sonst "hängt" die Task ggf. am
+Interfacekanal)!
+
+
+#on("b")#6.2.1  Befehle für die digitale Eingabe#off("b")#
+
+In Kapitel 6.1.4 haben Sie die Befehle für die digitale Ausgabe kennengelernt, die
+Ihnen #on("b")#gs-Prozess#off("b")# zur Verfügung stellt. Zu jedem dieser drei Befehle gibt es das
+"Gegenstück" auch als Eingabebefehl. Alle Eingabebefehle sind als werteliefernde
+Prozeduren (Funktionen) ausgelegt.
+
+In den Refinements 'alles abgedunkelt' und 'alles beleuchtet' benutzen wir den
+Befehl:
+
+#on("b")#
+TEXT PROC bitmuster (INT CONST kanal)
+#off("b")#
+
+Über den Parameter wird der Kanal angegeben, über den der digitale Eingang ange­
+sprochen werden kann; bei uns ist das der Kanal 3 auf der Compact-Box. Die
+Prozedur liefert einen Text, der aus acht Zeichen besteht. Dabei können nur die
+Zeichen "I und "O" auftreten (sehen Sie dazu auch Kapitel 6.1.3).
+#page#
+Die beiden gerade genannten Refinements hätten aber auch so notiert werden
+können:
+
+#on("b")#
+ alles abgedunkelt:
+ dezimalwert (3) = 0.
+
+ alles beleuchtet:
+ dezimalwert (3) = 255.
+#off("b")#
+
+#on("b")#
+INT PROC dezimalwert (INT CONST kanal)
+#off("b")#
+
+Über den Parameter wird der Kanal angegeben, über den der digitale Eingang ange­
+sprochen werden kann; bei uns ist das wieder der Kanal 3 auf der Compact-Box. Die
+Prozedur liefert einen Integer-Wert zwischen 0 und 255 (sehen Sie dazu auch unter
+'dezimalwert ausgeben' im Kapitel 6.1.4).
+
+Den dritten Eingabebefehl für den Digitaleingang, den #on("b")#gs-Prozess#off("b")# bereitstellt, finden
+Sie im Refinement 'gib farbe aus':
+
+#on("b")#
+TEXT PROC bitsymbol (INT CONST kanal, bitnummer)
+#off("b")#
+
+Wie schon bei den anderen beiden Eingabebefehlen wird hier über den ersten
+Parameter der Eingabekanal festgelegt; bei uns auf der Compact-Box ist das wieder
+der Kanal 3. Über den zweiten Parameter wird die Nummer des Bits angegeben,
+dessen Wert ermittelt werden soll. Ist das betreffende Bit gesetzt, so liefert die
+Prozedur das Zeichen "I", sonst das Zeichen "O" (sehen Sie dazu auch das Kapitel
+6.1.3 'Schreibweise für Bitmuster/Bitsymbole').
+
+
+#on("b")#6.2.2  Eingabetests#off("b")#
+
+Neben diesen drei Eingabebefehlen stellt #on("b")#gs-Prozess#off("b")# noch zwei Testbefehle zur
+Verfügung, die man häufig gut verwenden kann. Auf einen greifen wir schon im
+Refinement 'registriere gesetztes bit' zurück:
+#page#
+#on("b")#
+BOOL PROC bit ist gesetzt (INT CONST kanal, bitnummer)
+#off("b")#
+
+Die Parameter sind die gleichen wie beim Befehl 'bitsymbol'. Zunächst liest die
+Prozedur die aktuelle Einstellung am angegebenen Digitaleingang ('kanal') ein und
+untersucht dann das Bit mit der angegebenen Bitnummer (0, ..., 7). Die Prozedur
+liefert den Wert 'TRUE', wenn das Bit mit der entsprechenden Bitnummer gesetzt ist
+(die Prozedur bitsymbol' mit gleichen Parametern also den Wert "I" liefern würde),
+sonst 'FALSE' (die Prozedur bitsymbol' mit gleichen Parametern also den Wert "O"
+liefern würde).
+
+Den zweiten Testbefehl haben wir im obigen Programm noch nicht verwendet. Wir
+könnten damit aber auch die Refinements 'alles abgedunkelt' und 'alles beleuchtet'
+folgendermaßen notieren:
+
+#on("b")#
+ alles abgedunkelt:
+ bitmuster gleich (3, "OOOOOOOO").
+
+ alles beleuchtet:
+ bitmuster gleich (3, "IIIIIIII").
+#off("b")#
+
+
+#on("b")#
+BOOL PROC bitmuster gleich (INT CONST kanal,
+ TEXT CONST vorgabe)
+#off("b")#
+
+Wie bereits zuvor wird über den ersten Parameter der Kanal angegeben, über den der
+Digitaleingang angesprochen werden kann. Zunächst liest die Prozedur am ange­
+gebenen Kanal die aktuelle Einstellung ein und vergleicht es mit der 'vorgabe'. Der
+eigentliche Vorteil der Prozedur liegt darin, daß bei der Beschreibung der 'vorgabe'
+neben den Zeichen "I" und "O" auch das Zeichen "X" verwendet werden darf. z.B.
+"IOXXXXX". Entspricht das eingelesene Bitmuster der 'vorgabe', so liefert die Prozedur
+den Wert 'TRUE', sonst den Wert 'FALSE'. In gerade genannten Beispiel liefert die
+Prozedur also immer dann 'TRUE', wenn eine Karte mit der Markierung für Rot
+eingeschoben wurde - gleichgültig, welche Kundennummer eingestanzt ist.
+#page#
+#on("b")#6.2.3  Befehle für die analoge Eingabe#off("b")#
+
+Die analoge Eingabe möchten wir Ihnen an einem ganz einfachen Beispiel vor Augen
+führen. Sie brauchen dazu nur ein ganz normales Drehpotentiometer (ca. 5kOhm),
+das Sie in jedem Elektronik-Fachgeschäft für wenig Geld erhalten können. Ein
+solches Drehpotentiometer verfügt über drei Anschlüsse. Wenn man sich den inneren
+Aufbau vor Augen führt, ist die Belegung der drei Anschlüsse auch recht einsichtig.
+
+
+ siehe Physikbuch!!
+
+
+
+#on("b")##center#Abb.21 Aufbau eines Drehpotentiometers#off("b")#
+
+Löten Sie ggf. auf die drei Anschlüsse je einen Lötschuh, um eine einfache Steckver­
+bindung zur Kombikarte/Compact-Box herstellen zu können. Wichtig ist vor allem,
+daß der mittlere Anschluß am Drehpotentiometer auf den mittleren Stecksockel am
+Analogeingang auf der Kombikarte/Compact-Box aufgesteckt wird. Die beiden
+anderen Anschlüsse können können Sie beliebig auf die beiden dann noch freien
+Lötstifte (+ und �) des gleichen Analogeingangs aufstecken.
+
+Starten Sie dann das folgende Programm:
+
+#on("b")#
+ initialisiere interface;
+ page;
+ REP
+ notiere potentiometerwert
+ UNTIL abbruch gewuenscht PER.
+
+ notiere potentiometerwert:
+ put (wert von analogeingang (1));
+ line.
+#off("b")#
+#page#
+Nach dem Start des Programms müßten auf dem Bildschirm untereinander immer
+wieder die gleiche Zahl (ein Wert zwischen 0 und 255) auftauchen. Wenn Sie dann
+am Potentiometer drehen, müßten sich auch die Werte auf dem Bildschirm ändern.
+
+Sie hätten das Refinement 'notiere potentiometerwert' auch folgendermaßen notieren
+können:
+
+#on("b")#
+ notiere potentiometerwert:
+ put (spannungswert (1));
+ line.
+#off("b")#
+
+Statt Wert zwischen 0 und 255 zu erhalten, müßten Sie jetzt Werte zwischen 0.0 und
+5.0 erhalten.
+
+
+#on("b")#
+REAL PROC spannungswert (INT CONST kanal)
+#off("b")#
+
+Über den Parameter wird der Kanal angegeben, über den der analoge Eingang ange­
+sprochen werden kann; bei uns ist das der Kanal 1 (oder 2) auf der Kombikarte/
+Compact-Box. Auf der Kombikarte/Compact-Box können nur Spannungswerte
+zwischen 0.0V und 5.0V eingelesen werden. Auf der A/D-Karte kann der Bereich für
+die einzulesenden Sapnnungwerte durch die Schalterstellung auf der Karte eingestellt
+werden (Sehen Sie dazu auch Kapitel 5.3.1).
+
+
+#on("b")#
+REAL PROC wert von analogeingang (INT CONST kanal)
+#off("b")#
+
+Über den Parameter wird der Kanal angegeben, über den der analoge Eingang ange­
+sprochen werden kann; bei uns ist das der Kanal 1 (oder 2) auf der Kombikarte/
+Compact-Box. Geliefert werden Werte zwischen 0 und 255.
+
+Tatsächlich wird aber ein Spannungswert vom Analogeingang eingelesen. Dieser
+Spannungswert wird vom Analog-Digital-Wandler auf der Karte nach folgendem
+Verfahren gewandelt:
+#page#
+Dem größtmöglichen Spannungswert an diesem Eingang wird der Wert 255, dem
+kleinstmöglichen der Wert 0 zugeordnet. Das Intervall zwischen dem kleinst- und
+größtmöglichen Spannungswert wird in 255 gleichgroße Teilintervalle eingeteilt. Es
+wird nun die Nummer des Intervalls geliefert, in das die eingelesene Spannung fällt.
+Kleinst- und größtmögliche Spannungswerte sind abhängig von der aktuellen Steck­
+karte, Interface-Konfiguration).
+
+
+#on("b")#6.3  Hinweise auf Aufgabenmaterial#off("b")#
+
+Eine Fülle von Beispielanwendungen sind beschrieben in:
+
+ Landesinstitut für Schule und Weiterbildung (Hrsg.), Materialien zur Lehrerfort­
+ bildung in Nordrhein-Westfalen, Heft 2, Neue Technologien - Informations­
+ technologische Inhalte im Wahlpflichtunterricht der Klassen 9/10, 2. über­
+ arbeitete Auflage 1987
+
diff --git a/doc/prozess/gs-prozess-7 b/doc/prozess/gs-prozess-7
new file mode 100644
index 0000000..db3b9d1
--- /dev/null
+++ b/doc/prozess/gs-prozess-7
@@ -0,0 +1,1121 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#on("b")#7  Beschreibung der Menufunktionen#off("b")#
+
+Nach Aufruf meldet sich #on("b")#gs-Prozess#off("b")# zunächst mit dem #on("b")#gs-DIALOG#off("b")#-Emblem. Kurze
+Zeit später erscheint das folgende Menu auf dem Bildschirm:
+
++---------------------------------------------------------------------+
+| PDV:  Info Interface Programm Archiv |
+|-------+------------------------+------------------------------------+
+| | u  Übersicht Befehle | |
+| | --------------------- | |
+| | a  Ausgabebefehle | |
+| | e  Eingabebefehle | |
+| | t  Testbefehle | |
+| | w  Weitere Befehle | |
+| | --------------------- | |
+| | b  Bitmuster | |
+| | s  Symbole/Zeichen | |
+| | d  Digital-/Analogwerte| |
+| +------------------------+ |
+| |
+| +----------------------------------------+ |
+| | gs-Prozess | |
+| | Version 1.0 | |
+| | | |
+| | Copyright Ρ 1988 bei Eva Latta-Weber, | |
+| | Bielefeld | |
+| +----------------------------------------+ |
++---------------------------------------------------------------------+
+|Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>|
++---------------------------------------------------------------------+
+
+#center#Abb.22:  Eingangsbildschirm #on("b")#gs-Prozess#off("b")#
+
+
+Bevor wir Ihnen die Bedeutung der einzelnen Menupunkte erklären, geben wir erst
+noch einige grundsätzliche Hinweise zur Bedienung des Menusystems für diejenigen
+Leser, die im Umgang mit Menus unter #on("b")#gs-DIALOG#off("b")# nicht geübt sind.
+#page#
+#on("b")#7.1  Kurzhinweise zur Bedienung der Menus#off("b")#
+
+Die Bedienung des Menus ist sehr einfach. Eine ausführliche Beschreibung dazu
+finden Sie in den Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle
+sollen nur die wesentlichen Bedienungsvorgänge beschrieben werden.
+
+- Mit der Tastenfolge <ESC><?> können Sie sich Informationen zur Bedienung
+ des Menusystems in das Menu einblenden lassen.
+
+- Mit den Pfeiltasten <rechts> und <links> können Sie zwischen den "Ober­
+ begriffen" in der Kopfzeile wählen. Der aktuelle Oberbegriff ist jeweils invers
+ dargestellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich auf diesen invers
+ dargestellten Oberbegriff.
+
+- Mit den Pfeiltasten <hoch> und <runter> können Sie zwischen den Menu­
+ funktionen wählen, die Ihnen im aktuellen Pull-Down-Menu zur Auswahl ange­
+ boten werden. Die aktuell angewählte Menufunktion wird jeweils invers darge­
+ stellt. Die Trennlinien, die in einigen Pull-Down-Menus sichtbar sind, dienen nur
+ der optischen Untergliederung; sie können nicht angewählt werden und werden
+ deshalb automatisch übersprungen. Die einzelnen Menupunkte sind "zyklisch
+ miteinander verknüpft", das heißt, man gelangt vom untersten Menupunkt
+ wieder zum obersten und umgekehrt. Menupunkte, vor denen ein Minuszeichen
+ steht ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können nicht angewählt
+ werden und werden einfach übersprungen.
+
+- Durch Tippen der Fragezeichentaste (<?>) können Sie sich jeweils zur
+ aktuellen Menufunktion (invers im Pull-Down-Menu) Informationen in das
+ Menu einblenden lassen.
+
+- Um eine Menufunktion ausführen zu lassen, bewegen Sie sich mit den Pfeiltasten
+ auf die gewünschte Menufunktion im aktuellen Pull-Down-Menu und tippen
+ dann die <RETURN>-Taste. Steht vor dem gewünschten Menupunkt ein
+#page#
+ einzelner Buchstabe oder eine Ziffer, so kann durch Tippen der entsprechenden
+ Taste diese Menufunktion dadurch direkt aufgerufen werden. Sobald eine Menu­
+ funktion aufgerufen worden ist, erscheint davor ein Stern ('*'). Daraus können
+ Sie entnehmen, daß das System bereits den Auftrag ausführt.
+
+- An verschiedenen Stellen werden Fragen an Sie gerichtet, die Sie mit 'ja' oder
+ 'nein' beantworten müssen. Tippen Sie dazu entsprechend der Entscheidung die
+ Taste <j> (für 'ja') bzw. <n> (für 'nein').
+
+- Werden Ihnen vom Menu aus Dateinamen zur Auswahl angeboten, so können Sie
+ den auf dem Bildschirm sichtbaren Pfeil vor den gewünschten Namen
+ positionieren. Mit den Tasten <x> oder <RETURN> können Sie den Namen
+ ankreuzen. Ist die Auswahl mehrerer Dateinamen möglich, so können Sie den
+ Vorgang wiederholen. Mit den Tasten <o> oder <RUBOUT> können Sie auch
+ ein Kreuz vor einem Namen wieder löschen. Daneben gibt es noch einige Ta­
+ stenfunktionen, die für die Bedienung recht hilfreich sein können. Tippen Sie
+ während der Auswahl die Fragezeichentaste (<?>), so werden Ihnen alle
+ Bedienungsmöglichkeiten auf dem Bildschirm angezeigt. Eine Auswahl, in der
+ mehrere Dateien angekreuzt werden dürfen, wird durch die Tastenfolge
+ <ESC><q> verlassen. Anschließend wird die eingestellte Operation mit den
+ angekreuzten Dateien ausgeführt. Sind Sie versehentlich in eine solche Auswahl
+ gelangt, so können Sie den Vorgang durch die Tastenkombination <ESC><h>
+ abbrechen.
+
+- An einigen Stellen werden Sie aufgefordert, eine Eingabe zu machen (z.B. einen
+ Dateinamen einzugeben). Wird Ihnen hier ein Vorschlag gemacht, den Sie
+ akzeptieren, so brauchen Sie zur Bestätigung nur die <RETURN>-Taste zu
+ tippen. Gefällt Ihnen der Vorschlag nicht oder wird Ihnen kein Vorschlag ge­
+ macht, so machen Sie bitte die gewünschte Eingabe. Zum Schreiben stehen
+ Ihnen alle aus dem Editor bekannten Funktionen zur Verfügung. Mit der Taste
+ <RUBOUT> können Sie Buchstaben löschen, mit <RUBIN> einfügen. Die
+#page#
+ Eingabe wird durch Tippen der <RETURN>-Taste abgeschlossen. Ist der von
+ Ihnen gewünschte Name schon in Ihrer Task vorhanden und steht in der Fußzeile
+ der Hinweis 'Zeigen: <ESC><z>', dann können Sie sich auch alle vor­
+ handenen Namen zur Auswahl anbieten lassen und durch Ankreuzen den beab­
+ sichtigten Namen auswählen.
+
+- Ihnen können auch mehrere Alternativen angeboten werden, zwischen denen Sie
+ wählen müssen. In der untersten Zeile eines solchen Kastens, in denen Ihnen die
+ Alternativen auf dem Bildschirm eingeblendet werden, sind die Möglichkeiten
+ aufgeführt, die darüber beschrieben sind. Mit den Pfeiltasten können sie die
+ Markierung auf die gewünschte Alternative positionieren und dann durch die
+ <RETURN>-Taste zur Ausführung bringen. (Manchmal ist das auch durch
+ Tippen der den Alternativen vorangestellten Buchstaben oder Ziffern möglich).
+
+- Durch die Tastenfolge <ESC><q> kann das Menu insgesamt verlassen
+ werden. Damit das nicht versehentlich geschieht, wird jeweils die Frage gestellt,
+ ob Sie das Menu tatsächlich verlassen wollen. Diese Frage beantworten Sie bitte je
+ nach Wunsch mit 'ja' oder 'nein' durch Tippen der Tasten <j> bzw. <n>.
+
+
+#on("b")#7.2  Menufunktionen zum Oberbegriff 'Info'#off("b")#
+
+Das auf dem Bildschirm sichtbare Pull-Down-Menu ist oben abgebildet.
+
+#on("b")#u   Übersicht Befehle#off("b")#
+
+Mit dieser Funktion können Sie sich eine Übersicht der Befehle, die Ihnen
+#on("b")#gs-Prozess#off("b")# zur Verfügung stellt, in den aktuellen Bildschirm einblenden lassen:
+#page#
+#free(2.0)#
+ +------------------------------------------------------------+
+ | Ausgabebefehle: Eingabebefehle: |
+ | |
+ | dezimalwert ausgeben dezimalwert |
+ | bitmuster ausgeben bitmuster |
+ | bitsymbol ausgeben bitsymbol |
+ | spannungswert ausgeben spannungswert |
+ | wert an analogausgang ausgeben wert von analogeingang |
+ | |
+ | |
+ | Testbefehle: Weitere Befehle: |
+ | |
+ | bitmuster gleich initialisiere interface |
+ | bit ist gesetzt warte |
+ | |
+ +------------------------------------------------------------+
+#center#Abb.23:  Befehlsübersicht
+
+ Es werden 'Eingabebefehle', 'Ausgabebefehle' und 'Testbefehle' unterschieden.
+ Darüberhinaus werden 'Weitere Befehle' angegeben. Eine ausführliche
+ Beschreibung der einzelnen Befehle ist unter den gleichnamigen Menupunkten
+ abrufbar.
+
+
+#on("b")#a   Ausgabebefehle#off("b")#
+
+ Mit dieser Funktion können Sie sich die zur Verfügung stehenden Ausgabe­
+ befehle detailliert erläutern lassen. Zuerst gelangen Sie in eine Auswahl, von
+ der aus zu jedem einzelnen Ausgabebefehl eine Informationstafel abgerufen
+ werden kann:
+#page#
+#free(2.0)#
+ +-------------------------------------+
+ | Ausgabebefehle: |
+ | |
+ | 1  dezimalwert ausgeben |
+ | |
+ | 2  bitmuster ausgeben |
+ | 3  bitsymbol ausgeben |
+ | |
+ | 4  spannungswert ausgeben |
+ | 5  wert an analogausgang ausgeben |
+ | |
+ | z  Zurück in das Menu |
+ | |
+ | 1   2   3   4   5   z |
+ +-------------------------------------+
+
+#center#Abb.24:  Auswahl Ausgabebefehle
+
+ Auf jeder Informationstafel ist ein kleines Beispiel zur Verwendung des Befehls
+ angegeben, das auch erläutert wird. Anschließend wird ausführlich auf die
+ Parameter der Befehle eingegangen (Datentyp, Wertebereich, etc.). Aus den
+ einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl zurück.
+ Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangsmenu.
+
+
+#on("b")#e   Eingabebefehle#off("b")#
+
+ Mit dieser Funktion können Sie sich die zur Verfügung stehenden Eingabe­
+ befehle detailliert erläutern lassen. Zuerst gelangen Sie in eine Auswahl, von
+ der aus zu jedem einzelnen Eingabebefehl eine Informationstafel abgerufen
+ werden kann:
+#page#
+#free(1.0)#
+ +------------------------------+
+ | Eingabebefehle: |
+ | |
+ | 1  dezimalwert |
+ | |
+ | 2  bitmuster |
+ | 3  bitsymbol |
+ | |
+ | 4  spannungswert |
+ | 5  wert von analogeingang |
+ | |
+ | z  Zurück in das Menu |
+ | |
+ | 1   2   3   4   5   z |
+ +------------------------------+
+
+
+#center#Abb.25:  Auswahl Eingabebefehle
+
+ Auf jeder Informationstafel ist ein kleines Beispiel zur Verwendung des Befehls
+ angegeben, das auch erläutert wird. Anschließend wird ausführlich auf die
+ Parameter der Befehle (Datentyp, Wertebereich, etc.) und die Werte, die
+ geliefert werden, eingegangen.
+
+ Aus den einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl
+ zurück. Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangs­
+ menu.
+
+
+#on("b")#t   Testbefehle#off("b")#
+
+ Mit dieser Funktion können Sie sich die zur Verfügung stehenden Testbefehle
+ detailliert erläutern lassen. Zuerst gelangen Sie in eine Auswahl, von der aus zu
+ jedem einzelnen Testbefehl eine Informationstafel abgerufen werden kann:
+#page#
+ +------------------------+
+ | Testbefehle: |
+ | |
+ | 1  bitmuster gleich |
+ | 2  bit ist gesetzt |
+ | |
+ | z  Zurück in das Menu |
+ | |
+ | 1   2   z |
+ +------------------------+
+
+#center#Abb.26:  Auswahl Testbefehle
+
+ Auf jeder Informationstafel ist ein kleines Beispiel zur Verwendung des Befehls
+ angegeben, das auch erläutert wird. Anschließend wird ausführlich auf die
+ Parameter der Befehle (Datentyp, Wertebereich, etc.) und die Werte, die ge­
+ liefert werden, eingegangen.
+ Aus den einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl
+ zurück. Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangs­
+ menu.
+
+
+#on("b")#w   Weitere Befehle#off("b")#
+
+ Hier werden noch weitere zur Verfügung stehende Befehle erläutert, die für die
+ Programmierung ganz hilfreich sind. Zuerst gelangen Sie in eine Auswahl, von
+ der aus zu jedem Befehl eine Informationstafel abgerufen werden kann:
+
+
+ +----------------------------+
+ | Weitere Befehle: |
+ | |
+ | 1  initialisiere interface |
+ | 2  warte |
+ | |
+ | z  Zurück in das Menu |
+ | |
+ | 1   2   z |
+ +----------------------------+
+
+#center#Abb.27:  Auswahl 'Weitere Befehle'
+#page#
+ Aus den einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl
+ zurück. Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangs­
+ menu.
+
+
+#on("b")#b   Bitmuster#off("b")#
+
+ Nach Aufruf dieser Funktion wird der Aufbau der Bitmuster erläutert, die als
+ Parameter übergeben oder auch von Prozeduren geliefert werden.
+
+ Insbesondere wird auf die Numerierung der einzelnen Bits eingegangen.
+
+
+#on("b")#s   Symbole/Zeichen#off("b")#
+
+ Nach Aufruf der Funktion werden die Zeichen erläutert, die bei der Be­
+ schreibung von Bitmustern und Bitsymbolen Verwendung finden.
+
+
+#on("b")#d   Digital-/Analogwerte#off("b")#
+
+ Bei den beiden Befehlen 'wert an analogausgang ausgeben' und 'wert von
+ analogeingang', wird ein Wert zwischen 0 und 255 als Parameter übergeben
+ bzw. von der Prozedur geliefert. Am Analogausgang wird aber eine Spannung
+ ausgegeben bzw. eingelesen. Hier wird erläutert, wie die Spannungswerte
+ innerhalb der Prozeduren gewandelt werden.
+
+
+#on("b")#7.3  Menufunktionen zum Oberbegriff 'Interface'#off("b")#
+
+Über die Menufunktionen unter diesem Oberbegriff nehmen Sie die Konfiguration
+von #on("b")#gs-Prozess#off("b")# vor. Ebenso ist von hier aus ein Test des Interface-Systems möglich.
+#page#
+
++-----------------------------------------------------------------------+
+| PDV:  Info Interface Programm Archiv |
++-------+-------------------+-------------------------------------------+
+| | i  Informationen | |
+| | ---------------- | |
+| | k  Konfigurieren | |
+| | ---------------- | |
+| | a  Ausgabetest | |
+| | e  Eingabetest | |
+| +-------------------+ |
+| |
+| |
+| |
++---------------------------------------------------------------------- +
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
++-----------------------------------------------------------------------+
+
+#center#Abb.28:  Menubildschirm zum Oberbegriff 'Interface'
+
+
+#on("b")#i   Informationen#off("b")#
+
+ Mit dieser Menufunktion können Sie sich zu jedem Zeitpunkt die aktuell
+ eingestellte Konfiguration von #on("b")#gs-Prozess#off("b")# anzeigen lassen. Sie können er­
+ sehen, welches Interface-System eingestellt ist, wie die Kanäle belegt und
+ numeriert sind (sehen Sie das Beispiel in Abb.13).
+
+ Ist eine Compact-Box oder ein Einzelsteckplatz eingestellt, erhalten Sie die
+ Informationen direkt eingeblendet. Ist dagegen ein Mehrfachsteckplatz einge­
+ stellt, gelangen Sie in eine Auswahl. Von hier aus können Sie Informationen zu
+ jedem einzelnen Steckplatz getrennt abrufen.
+
+ Fehlerfälle:
+ - Wurde #on("b")#gs-Prozess#off("b")# bisher noch nicht konfiguriert, so erhalten Sie eine
+ Warnung (sehen Sie Abb.11). In diesem Falle ist zunächst eine Konfigura­
+ tion von #on("b")#gs-Prozess#off("b")# vorzunehmen (sehen Sie die Beschreibung zur
+ nächsten Menufunktion).
+#page#
+#on("b")#k   Konfigurieren#off("b")#
+
+ Mit dieser Menufunktion können Sie #on("b")#gs-Prozess#off("b")# auf das aktuell angeschlos­
+ sene Interface-System einstellen. Dazu haben Sie verschiedene Angaben zu
+ machen.
+
+ Zunächst wird Ihnen eine Auswahl der Steckplatzart angeboten (sehen Sie
+ dazu Abb.12). Hier können Sie zur Zeit zwischen Compact-Box, Einzelsteck­
+ platz und Mehrfachsteckplatz wählen.
+
+ Ist eine Compact-Box angeschlossen, ist mit der hier gemachten Angabe die
+ Konfiguration abgeschlossen; die aktuelle Kanalbelegung wird Ihnen dann nur
+ noch zur Information eingeblendet.
+
+ Bei Einzel- und Mehrfachsteckplatz haben Sie noch anzugeben, welche Inter­
+ facekarte eingesteckt ist. Beim Einzelsteckplatz ist diese Angabe nur einmal zu
+ machen, beim Mehrfachsteckplatz halt mehrfach. Hierzu wird Ihnen aber
+ ebenfalls eine Auswahl angeboten (sehen Sie Abb.14). Nach jeder vorge­
+ nommenen Einstellung wird Ihnen zur Information die Kanalbelegung mitge­
+ teilt. Sofern Sie eine A/D-Karte verwenden, wird noch die Schalterstellung auf
+ der Karte erfragt, denn daraus kann #on("b")#gs-Prozess#off("b")# die eingestellte Eingangsem­
+ pfindlichkeit ermitteln.
+
+
+#on("b")#a   Ausgabetest#off("b")#
+
+ Mit dieser Menufunktion können Sie auf einfache Weise testen, ob Ihr Inter­
+ face-System korrekte Ausgaben erzeugt. Nach Aktivieren der Menufunktion
+ erhalten Sie die Möglichkeit, Ausgabewerte einzutragen (sehen Sie Abb.18).
+ Jede Eintragung ist durch <RETURN> abzuschließen.
+
+ Für den Ausgabetest sollte eine Leuchtdiodenanzeige zur Verfügung stehen, um
+ die Ausgaben am Interface kontrollieren zu können. Für detailliertere Informa­
+ tionen lesen Sie bitte unbedingt Kapitel 5.
+#page#
+ Fehlerfälle:
+ - Interface meldet sich nicht!
+ Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen
+ und eingeschlatet ist (sehen Sie Kapitel 5). Wenn ein MUFI
+ verwendet wird, MUFI aus- und nach kurzer Pause wieder
+ einschalten. Noch einmal den Ausgabetest versuchen.
+ - Interface-Kanal belegt!
+ (Kann nur beim Betrieb von MUFI als Endgerät oder bei RS232-Adapter
+ auftreten!)
+ Abhilfe: Feststellen, welche Task an den Interface-Kanal gekoppelt ist
+ ('taskinfo (2) <RETURN>') und diese dann abmelden
+ ('break' oder 'end'). Die Nummer des Interfacekanals kann
+ mit dem Kommando 'put (interfacekanal) <RETURN>'
+ erfragt werden.
+ - Sehen Sie bitte die detaillierte Fehlerliste in Kapitel 5.5.
+
+
+#on("b")#e   Eingabetest#off("b")#
+
+ Mit dieser Menufunktion können Sie auf einfache Weise testen, ob über Ihr
+ Interface-System korrekte Eingaben möglich sind. Nach Aktivieren der Menu­
+ funktion erhalten Sie die Möglichkeit, am Interface angelegte Eingabewerte
+ abzulesen (sehen Sie Abb.19).
+
+ Für den Eingabetest sollte ein Codekartenleser oder zumindest ein kurzer
+ Draht zur Verfügung stehen. Für detailliertere Informationen lesen Sie bitte
+ unbedingt Kapitel 5.
+
+ Fehlerfälle:
+ - Interface meldet sich nicht!
+ Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen
+ und eingeschlatet ist (sehen Sie Kapitel 5). Wenn ein MUFI
+ verwendet wird, MUFI aus- und nach kurzer Pause wieder
+ einschalten. Noch einmal den Ausgabetest versuchen.
+#page#
+ - Interface-Kanal belegt!
+ (Kann nur beim Betrieb von MUFI als Endgerät oder bei RS232-Adapter
+ auftreten!)
+ Abhilfe: Feststellen, welche Task an den Interface-Kanal gekoppelt ist
+ ('taskinfo (2) <RETURN>') und diese dann abmelden
+ ('break' oder 'end'). Die Nummer des Interfacekanals kann
+ mit dem Kommando 'put (interfacekanal) <RETURN>'
+ erfragt werden.
+ - Sehen Sie bitte die detaillierte Fehlerliste in Kapitel 5.5.
+
+
+#on("b")#7.4  Menufunktionen zum Oberbegriff 'Programm'#off("b")#
+
+
++-------------------------------------------------------------------------+
+| PDV:  Info Interface Programm Archiv |
+|---------------------+---------------------+-----------------------------|
+| | n  Neu erstellen | |
+| | a  Ansehen/Ändern | |
+| | | |
+| | s  Starten | |
+| | w  Wiederholen | |
+| | | |
+| | v  Verzeichnis | |
+| | | |
+| | l  Löschen | |
+| | d  Drucken | |
+| | | |
+| | k  Kopieren | |
+| | u  Umbenennen | |
+| +---------------------+ |
+|-------------------------------------------------------------------------|
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
++-------------------------------------------------------------------------+
+
+#center#Abb.29:  Menubildschirm zum Oberbegriff 'Programm'
+#page#
+#on("b")#n   Neu erstellen#off("b")#
+
+ Mit dieser Funktion können Sie eine neue Programmdatei anlegen und be­
+ schreiben.
+
+ Sie werden zunächst nach einem Namen für die #on("b")#neue#off("b")# Programmdatei gefragt.
+ Geben Sie einen beliebigen Namen (#on("b")#ohne Anführungszeichen (!)#off("b")#) ein und
+ schließen Sie die Eingabe durch <RETURN> ab. Daraufhin wird Ihnen auf
+ dem Bildschirm eine neue Datei zum beschreiben angeboten.
+
+ Sollte schon eine Programmdatei mit diesem Namen in der Task vorhanden
+ sein, so werden Sie darauf aufmerksam gemacht.
+
+ Sie können sich während des Schreibens die wichtigsten Tastenfunktionen des
+ Editors einblenden lassen. Tippen Sie dazu die Tastenfolge <ESC><?>. Es
+ erscheint dann das folgende Angebot aus dem Sie auswählen können:
+
+
+ +------------------------------------------------+
+ | Der EUMEL - Editor |
+ | |
+ | b ... Beschreibung desEditors |
+ | w ... Wichtige Tasten |
+ | p ... Positionieren der Schreibmarke |
+ | k ... Korrigieren im Text (Einfügen/Löschen) |
+ | m ... Markierte Textpassagen bearbeiten |
+ | l ... Lernen im Editor |
+ | a ... Anweisungen im Editor (Kommandodialog) |
+ | |
+ | z ... Zurück in den Schreibmodus |
+ | |
+ | b   w   p   k   m   l   a   z |
+ | |
+ +------------------------------------------------+
+
+#center#Abb.30:  Informationsauswahl zum EUMEL-Editor
+#page#
+ Fehlerfälle:
+ - Eine Datei mit dem vorgeschlagenen Namen existiert schon.
+
+
+#on("b")#a   Ansehen/Ändern#off("b")#
+
+ Mit dieser Funktion können Sie sich Dateien, die schon in Ihrer Task
+ existieren, ansehen oder auch verändern.
+
+ Sie werden zunächst gefragt, ob Sie #on("b")#die zuletzt bearbeitete Programmdatei#off("b")#
+ ansehen bzw. verändern möchten (sofern Sie schon vorher mit #on("b")#gs-Prozess#off("b")# in
+ der Task gearbeitet haben).
+
+ Bejahen Sie diese Frage, dann wird Ihnen diese Programmdatei zur Be­
+ arbeitung angeboten. Verneinen Sie die Frage dagegen, so gelangen Sie in die
+ 'Auswahl' (d.h es werden Ihnen alle Programmdateien in der Task zur Auswahl
+ angeboten). Nachdem Sie einen der Namen angekreuzt haben, wird Ihnen die
+ ausgewählte Programmdatei zur Bearbeitung auf dem Bildschirm angebo­
+ ten.
+
+ Fehlerfälle:
+ - In der Task existiert noch keine Programmdatei.
+
+
+#on("b")#s   Starten#off("b")#
+
+ Mit dieser Menufunktion können Sie eine Programmdatei übersetzen und
+ ausführen lassen.
+
+ Sie werden zunächst gefragt, ob #on("b")#das zuletzt bearbeitete Programm#off("b")# ausgeführt
+ werden soll. Bejahen Sie die Frage, so wird dieses Programm gestartet; ver­
+ neinen Sie die Frage dagegen, so gelangen Sie in die 'Auswahl'. Nach An­
+ kreuzen des gewünschten Programmnamens wird das ausgewählte Programm
+ ausgeführt.
+#page#
+ Sind im Programm noch Fehler enthalten, so werden das Programm und die
+ Fehlermeldungen gleichzeitig auf dem Bildschirm dargestellt (Paralleleditor)
+ und zur Korrektur angeboten. Für die Programmkorrektur stehen ebenfalls alle
+ Editorfunktionen zur Verfügung.
+
+ Sollte Ihnen beim Programmieren ein Fehler unterlaufen sein (z.B. eine
+ Endlosschleife), so kann mit der Tastenfolge <ESC><h> der Programmlauf
+ abgebrochen werden ("Notbremse").
+
+
+#on("b")##on("b")#w   Wiederholen#off("b")#
+
+ Mit dieser Funktion können Sie den Ablauf des zuletzt ausgeführten
+ Programms wiederholen, ohne daß das Programm neu übersetzt wird.
+
+ Beachten Sie aber bitte, daß Veränderungen am Programmtext, die seit dem
+ letzten Prtogrammlauf vorgenommen wurden, #on("b")#nicht#off("b")# berücksichtigt werden;
+ dazu muß das Programm erneut mit der Menufunktion 's Starten' übersetzt
+ werden.
+
+ Ist die Wiederholung eines Programmlaufs nicht möglich, so erfolgt ein Hin­
+ weis darauf.
+
+
+#on("b")#v   Verzeichnis#off("b")#
+
+ Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task
+ vorhandenen Programmdateien verschaffen.
+
+ Nach Aufruf dieser Funktion wird eine Liste der Programmdateien auf dem
+ Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste selbst
+ eine Datei ist, kann Sie mit der Tastenkombination <ESC><q> verlassen
+ werden - hierauf wird auch in der Kopfzeile der Datei hingewiesen. Falls nicht
+ alle Namen auf den Bildschirm passen, können Sie das Fenster mit
+ <HOP><runter> und <HOP><hoch> verschieben.
+#page#
+#on("b")#l   Löschen#off("b")#
+
+ Mit dieser Funktion können Sie Programmdateien, die Sie nicht mehr
+ benötigen, die unnötig Platz belegen, löschen. Aber Vorsicht! Die Programm­
+ dateien verschwinden durch diese Funktion unwiederbringlich!
+
+ Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
+ Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
+ <ESC><q> verlassen.
+
+ Für jede einzelne Programmdatei wird noch einmal zur Sicherheit gefragt, ob
+ sie auch tatsächlich gelöscht werden soll. Zur Bestätigung tippen Sie bitte die
+ Taste <j> ('ja') - zur Verhinderung <n> ('nein').
+
+ Fehlerfälle:
+ - In der Task exsitiert noch keine Programmdatei.
+
+
+#on("b")#d   Drucken#off("b")#
+
+ Mit dieser Funktion können Sie Programmdateien über einen angeschlossenen
+ Drucker ausgeben lassen.
+
+ Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
+ Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
+ <ESC><q> verlassen.
+
+ Die angekreuzten Programmdateien werden anschließend zum Drucker ge­
+ schickt. Der Vorgang wird auf dem Bildschirm protokolliert.
+#page#
+ Fehlerfälle:
+ - In der Task existiert noch keine Programmdatei.
+ - Der Drucker ist nicht funktionsbereit.
+ - Der Drucker wird nicht über die Task 'PRINTER' betrieben.
+ - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich
+ mit einer Codenummer identifizieren.
+
+
+#on("b")#k   Kopieren#off("b")#
+
+ Mit dieser Funktion können Sie sich eine Kopie einer bereits in der Task
+ vorhandenen Programmdatei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich
+ einen bestimmten 'Stand' aufbewahren wollen oder wenn Sie ein Programm
+ schreiben wollen, das einem bereits vorhandenen ähnelt.
+
+ Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
+ wird die Auswahl automatisch verlassen.
+
+ Anschließend wird der angekreuzte Name angezeigt und der Name für die
+ Kopie erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch
+ nicht für eine Programmdatei vergeben wurde; ansonsten erfolgt ein Hinweis
+ darauf und es wird nicht kopiert!
+
+ Da man aber oft für die Kopie einen ähnlichen Namen wie für das Original
+ wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
+ aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
+ funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
+ eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
+ Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der
+ Task.
+#page#
+#on("b")#u   Umbenennen#off("b")#
+
+ Mit dieser Funktion können Sie einer bereits vorhandenen Programmdatei
+ einen neuen Namen geben.
+
+ Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
+ wird die Auswahl automatisch verlassen.
+
+ Anschließend wird dieser Name angezeigt und der zukünftige Name für die
+ Programmdatei erfragt. Es muß ein Name eingetragen werden, der in dieser
+ Task noch nicht für eine Programmdatei vergeben wurde - ansonsten erfolgt
+ ein Hinweis darauf und die Programmdatei wird nicht umbenannt!
+
+ Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen
+ wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
+ aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
+ funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
+ eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
+ Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der
+ Task.
+#page#
+#on("b")#7.5  Menufunktionen zum Oberbegriff 'Archiv'#off("b")#
+
+
++-----------------------------------------------------------------------+
+| PDV:  Info Interface Programm Archiv |
+|------------------+------------------------+---------------------------|
+| | r  Reservieren | |
+| | -  Neue Diskette | |
+| | | |
+| | -  Schreiben | |
+| | -  Checken | |
+| | -  Kombination | |
+| | -  Holen/Lesen | |
+| | -  Löschen | |
+| | | |
+| | -  Verzeichnis | |
+| | -  Drucken | |
+| | | +---------------------+ |
+| | i  Initialisieren | | Dateiaustausch mit:| |
+| | z  Zieltask einstellen | | Archiv | |
+| +------------------------+ | Archivname: | |
+| | __________ | |
+| +---------------------+ |
+|-----------------------------------------------------------------------|
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
++-----------------------------------------------------------------------+
+
+#center#Abb.31:  Menubildschirm zum Oberbegriff 'Archiv'
+
+
+In diesem Kapitel werden alle die Menufunktionen beschrieben, die Ihnen unter dem
+Oberbegriff 'Archiv' im Menu angeboten werden. Mit den Funktionen in diesem Menu
+können Sie aber nicht nur Dateien auf dem Archiv behandeln, sondern auch in
+anderen Tasks im Multi-User-System oder über das EUMEL-Netz sogar auf anderen
+Rechnern!
+
+Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen haben, sind nicht alle Funk­
+tionen aktivierbar! Um weitere Funktionen zu aktivieren, muß erst einer der aktivier­
+baren Menupunkte gewählt werden.
+#page#
+#on("b")#r   Reservieren#off("b")# (des Archivlaufwerks)
+
+ Im EUMEL-Multi-User-System haben normalerweise mehrere Personen das
+ Zugriffsrecht auf das Archivlaufwerk. Allerdings muß der Zugriff so geregelt
+ werden, daß sich die Beteiligten dabei nicht gegenseitig "in die Quere
+ kommen". Ein Zugriff auf das Archivlaufwerk erfordert zunächst eine An­
+ meldung. Ist diese Anmeldung erfolgt, kann von den anderen Beteiligten so
+ lange nicht mehr auf das Laufwerk zugegriffen werden, bis es wieder freige­
+ geben worden ist.
+
+ Diese Anmeldung des Archivlaufwerkes erfolgt über die Menufunktion 'r Reser­
+ vieren'. Greift bereits eine andere Task auf das Laufwerk zu, so erhalten Sie
+ darüber einen Hinweis auf dem Bildschirm. Ansonsten wird an Sie die Frage
+ gestellt, ob die Diskette eingelegt und das Laufwerk geschlossen ist.
+
+ Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie den alleinigen Zugriff auf
+ das Laufwerk haben. Deshalb sollten Sie, wenn Sie mit mehreren Personen am
+ Computer arbeiten, erst zum Zeitpunkt der Fragestellung die Diskette ins
+ Laufwerk einlegen.
+
+ Nachdem Sie die Diskette eingelegt und die Frage bejaht haben, ermittelt das
+ System selbständig den Namen der eingelegten Diskette, zeigt den Namen auf
+ dem Bildschirm (im kleinen Kasten unten) an und aktiviert die anderen
+ Menupunkte des Pull-Down-Menus.
+
+ Beim Verlassen des Pull-Down-Menus, wenn eine andere Zieltask eingestellt
+ wird oder wenn das Menu gänzlich verlassen wird, wird die Reservierung
+ automatisch aufgehoben!
+#page#
+ Fehlerfälle:
+ - Das Laufwerk ist von einer anderen Task belegt.
+ - Die Diskette ist falsch eingelegt oder das Laufwerk ist nicht richtig ge­
+ schlossen.
+ - Die Diskette ist nicht formatiert bzw. initialisiert.
+ - Die Diskette kann nicht gelesen werden (keine EUMEL-Diskette, Diskette
+ hat ein falsches Format, Diskette ist verschmutzt...).
+
+
+#on("b")#n   Neue Diskette#off("b")# (anmelden)
+
+ Der Dateiaustausch mit einer Diskette ist nur dann möglich, wenn der im
+ System eingestellte Diskettenname (auf dem Bildschirm im kleinen Kasten
+ unten sichtbar) mit dem tatsächlichen Namen der Diskette übereinstimmt.
+ Nach einem Diskettenwechsel ist das aber in der Regel nicht mehr der Fall.
+ Greift man dann auf die neu eingelegte Diskette zu, so erscheint die Fehlermel­
+ dung: 'Falscher Archivname! Bitte neue Diskette anmelden!'.
+
+ Das Anmelden einer neuen Diskette - ohne einen neuen Reservierungsvorgang
+ - wird durch diese Menufunktion ermöglicht. Nach Aktivieren dieses Menu­
+ punktes wird der Name der eingelegten Diskette ermittelt, im System eingestellt
+ und auf dem Bildschirm angezeigt.
+
+ Im Gegensatz zur Menufunktion 'r Reservieren' greift das System ohne Anfrage
+ an den Benutzer auf das Archivlaufwerk zu (die Reservierung bleibt ja
+ bestehen). Ist das Archivlaufwerk reserviert, so ist die Neuanmeldung einer
+ Diskette über diese Menufunktion weniger zeitaufwendig.
+
+ Fehlerfälle:
+ - wie unter 'r Reservieren'.
+#page#
+#on("b")#s   Schreiben#off("b")# (Kopieren)
+
+ Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die
+ Auswahl durch die Tastenfolge <ESC><q> verlassen, überprüft das System
+ zunächst, ob die Dateien in der eingestellten Zieltask schon vorhanden sind. Ist
+ das der Fall, wird erfragt, ob die dort vorhandenen Dateien überschrieben, d.h.
+ gelöscht werden dürfen (s.u.). Anschließend werden alle angekreuzten Dateien
+ in der Reihenfolge, in der Sie sie angekreuzt haben, in die eingestellte Zieltask
+ kopiert. Der Vorgang wird auf dem Bildschirm protokolliert. Die Original­
+ dateien in der eigenen Task bleiben dabei erhalten.
+
+ Wenn in der Zieltask schon eine Datei existiert, die den gleichen Namen hat
+ wie eine Datei, die Sie dorthin kopieren möchten, so wird angefragt, ob die
+ vorher schon existierende Datei überschrieben (gelöscht!) werden soll. Bejahen
+ Sie diese Frage, so wird die bereits in der Zieltask existierende Datei (un­
+ wiederbringlich) gelöscht und die gewünschte Datei dorthin transportiert. Ein
+ Überschreiben aus Versehen ist nicht möglich, wenn Sie die an Sie gestellte
+ Frage sorgfältig beantworten.
+
+ Verneinen Sie die Frage, so wird die Datei auch nicht hinübertransportiert! Sie
+ können die Datei aber umbenennen (Menufunktion 'u Umbenennen' unter
+ den Oberbegriffen 'Landschaft'/Arbeitsfeld' bzw. 'Programm') und an­
+ schließend mit anderem Namen hinüberschreiben.
+
+ Beachten Sie, daß beim Überschreiben einer Datei auf einer Archivdiskette der
+ Speicherplatz der alten (überschriebenen) Version im allgemeinen nicht
+ wiederverwendet werden kann. In einem solchen Fall könnte die Diskette voll
+ geschrieben werden, obwohl eigentlich genügend Platz vorhanden wäre. Zur
+ Optimierung wird deshalb zuerst überprüft, ob die angekreuzten Dateien
+ schon in der Zieltask vorhanden sind und löscht diese, wenn Sie Ihr Einver­
+ ständnis geben. Erst anschließend werden die Dateien insgesamt kopiert.
+#page#
+ Normalerweise ist als Zieltask das Archivlaufwerk der eigenen Station einge­
+ stellt. Mit der Menufunktion 'z Zieltask einstellen' kann diese Einstellung aber
+ verändert werden.
+
+ Fehlerfälle:
+ - Die Diskette ist falsch eingelegt oder beschädigt.
+ - Die Diskette kann nicht beschrieben werden (Schreibfehler).
+ - Die Diskette ist voll.
+ - Sehen Sie auch unter 'r Reservieren'
+ 'z Zieltask einstellen'.
+
+
+#on("b")#c   Checken#off("b")#
+
+ Diese Menufunktion kann nur ausgeführt werden, wenn der Dateiaustausch
+ mit einem Archiv(manager) erfolgt - ansonsten ist diese Menufunktion auch
+ nicht aktivierbar. Die Menufunktion dient dazu, auf Diskette geschriebene
+ Dateien auf Lesefehler hin zu prüfen. Es empfiehlt sich, diese Prüfroutine auf
+ neu auf die Diskette geschriebene Dateien anzuwenden. Sehen Sie dazu auch
+ 'k Kombination'.
+
+ Alle Dateien der eingestellten Zieltask (Archiv) werden zur Auswahl angeboten.
+ Wenn Sie die Auswahl durch die Tastenfolge <ESC><q> verlassen, werden
+ alle angekreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben,
+ "gecheckt", d.h. auf Lesefehler hin überprüft. Der Vorgang wird auf dem Bild­
+ schirm protokolliert.
+
+ Fehlerfälle:
+ - Lesefehler auf dem Archiv.
+ - Sehen Sie auch unter 'r Reservieren'.
+
+#page#
+#on("b")#k   Kombination#off("b")#
+
+ Diese Menufunktion ist eine Kombination aus den beiden Menufunktionen 's
+ Schreiben' und 'c Checken' (Sehen Sie weitere Informationen auch dort!).
+
+ Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die
+ Auswahl durch die Tastenfolge <ESC><q> verlassen, werden alle ange­
+ kreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, in die
+ eingestellte Zieltask kopiert (gegebenenfalls müssen bereits vorhandene
+ Dateien gleichen Namens in der Zieltask gelöscht werden). Anschließend
+ werden alle Dateien, die gerade geschrieben wurden, gecheckt, d.h. auf Lese­
+ fehler hin untersucht. Beide Vorgänge werden auf dem Bildschirm
+ protokolliert.
+
+ Da die 'Check' - Operation nur bei Archivmanagern zulässig ist, ist diese Menu­
+ funktionen ebenfalls nur bei Archivmanagern aktivierbar. Zur Erläuterung
+ sehen Sie bitte auch unter 'z Zieltask einstellen'.
+
+
+#on("b")#h   Holen/Lesen#off("b")#
+
+ Die Menufunktion dient dazu, Dateien, die bereits auf einer Archivdiskette oder
+ in einer anderen Task existieren, in die eigene Task zu kopieren.
+
+ Alle Dateien der eingestellten Zieltask werden zur Auswahl angeboten. An­
+ schließend werden Kopien der angekreuzten Dateien in der Reihenfolge des
+ Ankreuzens in die eigene Task geholt. Das Original in der Zieltask bleibt dabei
+ unverändert! Der Vorgang wird auf dem Bildschirm protokolliert.
+
+ Sind in der eigenen Task schon Dateien mit gleichem Namen vorhanden, so
+ wird gefragt, ob die 'alten' Dateien überschrieben (gelöscht) werden dürfen.
+ Nur wenn Sie zustimmen, werden die in Ihrer Task existierenden Dateien
+ (unwiederbringlich!) gelöscht und Kopien der gleichnamigen Dateien aus der
+ Zieltask angefertigt.
+#page#
+ Stimmen Sie dem Löschvorgang nicht zu, dann bleiben die bisherigen Dateien
+ in Ihrer Task erhalten - die Dateien aus der Zieltask werden dann aber auch
+ nicht in Ihre Task kopiert! Um dennoch die Kopien zu erhalten, können Sie die
+ namensgleichen Dateien in Ihrer Task umbenennen und dann erst die Dateien
+ aus der anderen Task anfordern.
+
+ Normalerweise werden die Dateien vom Archiv der eigenen Station geholt. Mit
+ dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert
+ werden.
+
+ Fehlerfälle:
+ - Lesefehler auf dem Archiv.
+ - Sehen Sie auch unter 'r Reservieren'
+ 's Schreiben'
+ 'z Zieltask einstellen'.
+
+
+#on("b")#l   Löschen#off("b")#
+
+ Die Menufunktion dient dazu, Dateien in der Zieltask (unwiederbringlich!) zu
+ löschen. Dazu werden alle Dateien der eingestellten Zieltask zur Auswahl ange­
+ boten. Anschließend werden die angekreuzten Dateien in der Reihenfolge ihres
+ Ankreuzens gelöscht. Zur Sicherheit muß noch einmal für jede einzelne Datei
+ bestätigt werden, daß sie auch tatsächlich gelöscht werden soll.
+
+ Beachten Sie, daß beim Löschen einer Datei auf einer Archivdiskette der
+ Speicherplatz im allgemeinen nicht wieder verwendet werden kann. In einem
+ solchen Fall könnte die Diskette voll geschrieben werden, obwohl eigentlich
+ genügend Platz vorhanden wäre. Diese Probleme treten bei anderen Tasks, die
+ keine Archivmanager sind, nicht auf, da deren Speicherplatz intelligenter
+ verwaltet wird.
+#page#
+ Normalerweise ist als Zieltask das Archiv der eigenen Station eingestellt. Mit
+ dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert
+ werden.
+
+ Fehlerfälle:
+ - Sehen Sie auch unter 'r Reservieren'
+ 's Schreiben'
+ 'z Zieltask einstellen'.
+
+
+#on("b")#v   Verzeichnis#off("b")#
+
+ Mit dieser Menufunktion können Sie sich einen Überblick über die in der
+ Zieltask (z.B. auf dem Archiv) vorhandenen Dateien verschaffen.
+
+ Nach Aufruf der Funktion wird eine Liste der Dateien auf dem Bildschirm
+ ausgegeben, die sich in der Zieltask (z.B. auf dem Archiv) befinden. Ist die
+ Zieltask ein Archiv(manager), so wird auch angezeigt, wieviel Platz auf der
+ Diskette belegt ist. Da die Liste selbst eine Datei ist, kann sie mit der Tasten­
+ kombination <ESC><q> verlassen werden. Falls nicht alle Dateinamen auf
+ den Bildschirm passen, können Sie das Fenster mit <HOP><hoch> und
+ <HOP><runter> verschieben.
+
+ Fehlerfälle:
+ - Sehen Sie unter 'z Zieltask einstellen'.
+
+
+#on("b")#d   Drucken#off("b")#
+
+ Das Verzeichnis der Dateien in der Zieltask, das man mit der Menufunktion 'v
+ Verzeichnis' auf dem Bildschirm angezeigt bekommt, kann mit dieser Menu­
+ funktion ausgedruckt werden.
+#page#
+ Zur Sicherheit wird angefragt, ob wirklich ein solches Dateiverzeichnis der
+ Zieltask gedruckt werden soll. Bejaht man die Frage, so wird ein Dateiver­
+ zeichnis erstellt und zum Drucker geschickt.
+
+ Fehlerfälle:
+ - Der Drucker ist nicht funktionsbereit.
+ - Der Drucker wird nicht über die Task 'PRINTER' betrieben.
+ - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich
+ mit einer Codenummer identifizieren.
+
+
+#on("b")#i  Initialisieren#off("b")#
+
+ Diese Menufunktion gestattet es, frische Disketten zu formatieren, zu
+ initialisieren bzw. beschriebene Disketten vollständig zu löschen und ggf. dabei
+ umzubenennen. Bei Aufruf dieser Menufunktion wird - sofern noch nicht
+ geschehen - das Archivlaufwerk automatisch reserviert.
+
+ Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen, müssen Sie
+ diese zunächst #on("b")#formatieren#off("b")#. Dabei wird die Diskette auf ein festgelegtes
+ physikalisches Format eingestellt. Ohne daß diese Operation vorausgegangen
+ ist, kann eine Diskette weder beschrieben noch gelesen werden.
+
+ Prinzipiell braucht eine Diskette nur ein einziges Mal formatiert zu werden. Sie
+ können Sie jedoch jederzeit wieder formatieren - z.B. wenn Sie Disketten ha­
+ ben, von denen Sie nicht genau wissen, für welche Zwecke sie zuvor verwendet
+ wurden.
+
+ Wenn Sie diese Menufunktion aktivieren, werden Sie so zunächst gefragt, ob Sie
+ die Diskette auch formatieren wollen. Bejahen Sie die Frage, so werden Ihnen
+ mehrere Formate zur Auswahl angeboten:
+#page#
+ +----------------------------------+
+ | Formatieren einer Diskette |
+ | |
+ | Dies sind die möglichen Formate: |
+ | |
+ | 1 .... 40 Spur - 360 KB |
+ | 2 .... 80 Spur - 720 KB |
+ | 3 .... 5 1/4" - 1,2 MB |
+ | 4 .... 3 1/2" - 1,4 MB |
+ | s .... Standard - Format |
+ | |
+ | |
+ | 1   2   3   4   s |
+ +----------------------------------+
+
+#center#Abb.32:  Auswahl der Archiv-Formate
+
+ Erkundigen Sie sich bei Ihrem Händler, welches Format Sie bei Ihrem Rechner
+ und den von Ihnen verwendeten Disketten einstellen müssen. Manche Rechner
+ unterstützen diese Operation innerhalb des EUMEL-Systems auch gar nicht,
+ das Formatieren muß dann irgendwie anders außerhalb des EUMEL-Systems
+ geschehen.
+
+ Wenn Sie die Formatierung abgeschlossen oder auch übersprungen haben,
+ beginnt die eigentliche Initialisierung der Diskette. Dabei wird als erstes der
+ Archivname auf die Diskette geschrieben. Alle alten Daten, die sich ggf. auf der
+ Diskette befinden, werden bei diesem Vorgang unwiederbringlich (!) gelöscht.
+
+ Zur Sicherheit überprüft das System in jedem Falle, ob es sich um eine EUMEL
+ - Diskette handelt, und erfragt Ihr Einverständnis, ob die Diskette wirklich
+ initialisiert werden soll. Geben Sie hierzu Ihr Einverständnis, dann wird noch
+ der (neue) Archivname erfragt. Hatte die Diskette schon einen Namen, dann
+ wird dieser zum Überschreiben angeboten. Wollen Sie den alten Archivnamen
+ beibehalten, so brauchen Sie nur die <RETURN>-Taste zu tippen, ansonsten
+ können Sie den Namen auch zuvor verändern oder einen ganz neuen Namen
+ hinschreiben. Anhand des ausgegebenen Namens können Sie auch über­
+ prüfen, ob Sie die richtige Diskette eingelegt haben.
+#page#
+ Das Initialisieren funktioniert natürlich nur, wenn Sie als Zieltask einen
+ Archivmanager eingestellt haben - ansonsten ist diese Menufunktion gesperrt
+ (nicht aktivierbar!).
+
+ Fehlerfälle:
+ - Formatieren ist nicht auf dem System möglich.
+ - Sehen Sie auch unter 'r Reservieren'
+ 'z Zieltask einstellen'.
+
+
+#on("b")#z   Zieltask einstellen#off("b")#
+
+ Mit dieser Menufunktion können Sie festlegen, mit welcher Zieltask Sie
+ kommunizieren, d.h. z.B. Dateien austauschen möchten. Normalerweise ist hier
+ das Archiv am eigenen Rechner eingestellt. Das wird auch nach Aufklappen des
+ Pull-Down-Menus im Kasten unten angezeigt.
+
+ Diese Menufunktion kann im Unterricht z.B. dazu genutzt werden, um fertig­
+ gestellte Hausaufgaben in eine bestimmte Task zu schicken (Vatertask) oder um
+ von dort z.B. vorgefertigte Landschaften oder/und Programme abzuholen.
+
+ Sie können aber auch eine andere Task einstellen (z.B. die Vatertask oder die
+ Task 'PUBLIC'), um mit diesen Dateien auszutauschen oder um sich auch nur
+ einen Überblick über die dort vorhandenen Dateien zu verschaffen. Wenn Sie
+ mit Ihrem Rechner in ein EUMEL-Netz integriert sind, können Sie auch auf
+ Tasks anderer Rechner zugreifen oder auch Disketten von Laufwerken anderer
+ Rechner einlesen (z.B. wenn Sie Disketten anderer Formate haben, die von
+ Ihrem Rechner nicht gelesen werden können).
+
+ Dabei werden zwei Anforderungen an die Zieltask gestellt: Sie muß existieren
+ und bereit für den Dateiaustausch sein, d.h es muß eine Managertask sein, auf
+ die Sie Zugriff haben. Versuchen Sie auf andere Tasks zuzugreifen, so erhalten
+ Sie entsprechende (Fehler-)Meldungen.
+#page#
+ Zu beachten ist noch, daß es im EUMEL-System verschiedene Arten von
+ Managertasks gibt - Archivmanager und normale Dateimanager. Der Unter­
+ schied besteht darin, daß ein Archivmanager vom Benutzer vor dem Zugriff
+ reserviert werden muß - anschließend hat nur dieser Benutzer (bis zur Aufgabe
+ der Reservierung) ein Zugriffsrecht auf den Manager. Normale Dateimanager
+ können dagegen von mehreren Benutzern in beliebiger Reihenfolge ange­
+ sprochen werden.
+
+ Ein Archivmanager kann auch auf bestimmte Diskettenformate spezialisert sein
+ (z.B. auf das Lesen von DOS-Disketten). Manche Rechner haben auch mehrere
+ Archivmanager für verschiedene Laufwerke etc. Durch Einstellen unterschied­
+ licher Archivmanager können Sie dann auf verschiedenen Laufwerken
+ archivieren.
+
+ Nach Aktivieren dieses Menupunktes werden Ihnen die folgenden Alternativen
+ angeboten:
+
+
+ +-----------------------------------------+
+ | Dateiaustausch gewünscht mit: |
+ | |
+ | a ...   Archiv (Eigene Station) |
+ | |
+ | v ...   Vatertask |
+ | |
+ | p ...   'PUBLIC' (Eigene Station) |
+ | |
+ | s ...   Sonstige Task |
+ | |
+ | Archiv   Vatertask   PUBLIC   Sonstige |
+ +-----------------------------------------+
+
+#center#Abb.33:  Auswahl der Zieltask
+
+ Da der Dateiaustausch mit dem Standardarchiv der eigenen Station (Task:
+ 'ARCHIVE'), mit der Vatertask und der Task 'PUBLIC' recht häufig in Anspruch
+ genommen wird, sind diese drei Optionen unter den Alternativen direkt ange­
+#page#
+ geben. Entscheiden Sie sich für eine dieser drei Tasks, so nimmt das System
+ alle notwendigen Einstellungen vor. Möchten Sie dagegen in Kontakt mit einer
+ anderen Task treten, so wählen Sie die Alternative 's ... Sonstige Task'. In
+ diesem Falle haben Sie noch 3 Angaben zu machen:
+
+ - Zunächst werden Sie nach dem Namen der Zieltask gefragt. Geben Sie den
+ Namen der Zieltask - ohne Anführungsstriche (!) - ein und schließen Sie
+ die Eingabe mit der <RETURN>-Taste ab. (Den ausgegebenen Namen der
+ z.Z. eingestellten Task können Sie dabei verändern bzw. überschreiben.)
+
+ - Dann wird die Nummer der Station im EUMEL-Netz erfragt, auf der sich
+ die Zieltask befindet. Die Nummer Ihrer Station wird als Vorschlag ausge­
+ geben. Wollen Sie mit einer Task auf Ihrem Rechner kommunizieren, so
+ brauchen Sie diesen Vorschlag nur durch Drücken der <RETURN>-Taste
+ bestätigen - ansonsten tragen Sie zuvor die entsprechende Stationsnummer
+ ein. Ist Ihr Rechner nicht in ein EUMEL-Netz integriert, so wird die
+ Stationsnummer 0 (Null) ausgegeben. Bitte bestätigen Sie diese Stations­
+ nummer durch Tippen der <RETURN>-Taste.
+
+ - Zum Abschluß müssen Sie noch angeben, ob die eingestellte Zieltask ein
+ Archivmanager ist oder nicht.
+
+ Das System versucht dann den Kontakt herzustellen. Je nachdem, welche
+ Einstellung Sie vorgenommen haben, sind bestimmte Funktionen innerhalb
+ des Menus nicht aktivierbar. Das System läßt nur die Funktionen zu, die
+ aufgrund Ihrer Einstellungen zulässig sind.
+
+ Im Kasten unten auf dem Bildschirm wird jeweils angezeigt, welche Zieltask
+ eingestellt ist. Erscheint in diesem Kasten auch ein Hinweis auf den Archiv­
+ namen, so haben Sie einen Archivmanager eingestellt. Ist dagegen vor dem
+ Namen der Zieltask noch eine Zahl und ein Schrägstrich angegeben, so haben
+ Sie eine Zieltask auf einem anderen Rechner eingestellt.
+#page#
+ Bedenken Sie, daß Operationen mit Tasks auf anderen Stationen länger an­
+ dauern können - werden Sie nicht ungeduldig!
+
+ Sie können die Einstellung der Zieltask jederzeit wieder verändern!
+
+ Fehlerfälle:
+ - Die eingestellte Zieltask existiert nicht.
+ - Die eingestellte Zieltask existiert zwar, ist aber nicht empfangsbereit, d.h.
+ ein Zugriff von Ihrer Task aus ist nicht möglich!
+ - Das Netz ist nicht funktionsbereit (Collector-Task fehlt).
+ - Die Kommunikation war nicht erfolgreich.
+ - Die gewünschte Operation kann mit der eingestellten Zieltask nicht ausge­
+ führt werden (Zieltask ist z.B. gar kein Archivmanager - Sie aber ver­
+ suchen, das Laufwerk zu reservieren).
+
diff --git a/doc/prozess/gs-prozess-8 b/doc/prozess/gs-prozess-8
new file mode 100644
index 0000000..c36ccc9
--- /dev/null
+++ b/doc/prozess/gs-prozess-8
@@ -0,0 +1,377 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#on("b")#8  Detailbeschreibung der Basisbefehle und Tests#off("b")#
+
+
+#on("b")#
+BOOL PROC abbruch gewuenscht
+#off("b")#
+
+ - erfragt, ob inzwischen durch einen Basisbefehl die Tastenfolge <ESC><q>
+ im Eingabestrom registriert worden ist. Ist das der Fall, liefert die Prozedur
+ den Wert 'TRUE', sonst 'FALSE'.
+
+
+#on("b")#
+BOOL PROC bit ist gesetzt (INT CONST kanal, bitnummer)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
+ - untersucht, ob die angegebene Bitnummer zulässig ist (0 #on("b")#<#off("b")# 'bitnummer' #on("b")#<#off("b")#
+ 7). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "Bit­
+ nummer ... ist nicht zulässig!".
+ - liest den aktuell anliegenden Wert am angegebenen Kanal.
+ - liefert den Wert 'TRUE', wenn in der binären Darstellung das Bit mit der
+ angegebenen Bitnummer gesetzt ist ("I"), sonst den Wert 'FALSE'.
+
+#on("b")#
+TEXT PROC bitmuster (INT CONST kanal)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+#page#
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
+ - liest den aktuell anliegenden Wert am angegebenen Kanal ein und wandelt
+ ihn in die binäre Darstellung.
+ - liefert einen Text der Länge 8, bestehend aus den Zeichen "I" und/oder "O".
+
+
+#on("b")#
+PROC bitmuster ausgeben (INT CONST kanal,
+ TEXT CONST bitmuster)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Aus­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Digital-Ausgabe möglich!".
+ - untersucht die übergebene Zeichenkette (bitmuster) auf korrekte Länge (8
+ Zeichen). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung
+ "Das Bitmuster ... hat eine unzulässige Länge!".
+ - überprüft die in der übergebenen Zeichenkette (bitmuster) vorkommenden
+ Symbole auf ihre Zulässigkeit ("I", "O", "X", "T"). Taucht ein unzulässiges
+ Symbol auf, erfolgt ein Abbruch mit der Fehlermeldung "... ist ein unzu­
+ lässiges Bitsymbol in ...!".
+#page#
+ - aus dem am angegebenen Kanal zuletzt ausgegeben Wert und der über­
+ gebenen Zeichenkette (bitmuster) wird der auszugebende Dezimalwert er­
+ mittelt. Dieser Dezimalwert wird am angegebenen Kanal ausgegeben. Dabei
+ bedeuten "I", daß das betreffende Bit gesetzt wird,  "O", daß das betreffende
+ Bit nicht gesetzt wird,  "X", daß das betreffende Bit gegenüber der zuvor
+ erfolgten Ausgabe am gleichen Kanal nicht verändert wird und   "T", daß das
+ betreffende Bit gegenüber der zuvor erfolgten Ausgabe am gleichen Kanal
+ invertiert wird.
+
+
+#on("b")#
+BOOL PROC bitmuster gleich (INT CONST kanal,
+ TEXT CONST vergleichsmuster)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
+ - untersucht die übergebene Zeichenkette (bitmuster) auf korrekte Länge (8
+ Zeichen). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung
+ "Das Bitmuster ... hat eine unzulässige Länge!".
+ - überprüft die im 'vergleichsmuster' vorkommenden Symbole auf ihre Zu­
+ lässigkeit ("I", "O", "X"). Taucht ein unzulässiges Symbol auf, erfolgt ein
+ Abbruch mit der Fehlermeldung "... ist ein unzulässiges Bitsymbol in ...!".
+ - liest den aktuell anliegenden Wert am angegebenen Kanal ein und wandelt
+ ihn in die binäre Darstellung.
+ - überprüft, ob das eingelesene Bitmuster zum 'vergleichsmuster' "paßt". Ist
+ das der Fall, wird der Wert 'TRUE' geliefert, sonst der Wert 'FALSE'.
+#page#
+#on("b")#
+TEXT PROC bitsymbol (INT CONST kanal, bitnummer)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
+ - untersucht, ob die angegebene Bitnummer zulässig ist (0 #on("b")#<#off("b")# 'bitnummer' #on("b")#<#off("b")#
+ 7). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "Bit­
+ nummer ... ist nicht zulässig!".
+ - liest den aktuell anliegenden Wert am angegebenen Kanal ein und wandelt
+ ihn in die binäre Darstellung.
+ - liefert einen Text der Länge 1, nämlich "I" oder "O".
+
+
+#on("b")#
+PROC bitsymbol ausgeben (INT CONST kanalnummer, bitnummer,
+ TEXT CONST bitsymbol)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Aus­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Digital-Ausgabe möglich!".
+#page#
+ - untersucht, ob die angegebene Bitnummer zulässig ist (0 #on("b")#<#off("b")# 'bitnummer' #on("b")#<#off("b")#
+ 7). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "Bit­
+ nummer ... ist nicht zulässig!".
+ - überprüft das übergebene Bitsymbol auf Zulässigkeit ("I", "O", "X", "T").
+ Taucht ein unzulässiges Symbol auf oder besteht das Bitsymbol aus mehr als
+ einem Zeichen, erfolgt ein Abbruch mit der Fehlermeldung "... ist ein unzu­
+ lässiges Bitsymbol!".
+ - ermittelt aus dem am angegebenen Kanal zuletzt ausgegeben Wert und der
+ übergebenen Bitnummer/dem übergebenen Bitsymbol den auszugebende
+ Dezimalwert. Dieser Dezimalwert wird am angegebenen Kanal ausgegeben.
+ Dabei bedeuten "I", daß das betreffende Bit gesetzt wird,  "O", daß das be­
+ treffende Bit nicht gesetzt wird,  "X", daß das betreffende Bit gegenüber der
+ zuvor erfolgten Ausgabe am gleichen Kanal nicht verändert wird und  "T", daß
+ das betreffende Bit gegenüber der zuvor erfolgten Ausgabe am gleichen Kanal
+ invertiert wird.
+
+
+#on("b")#
+INT PROC dezimalwert (INT CONST kanal)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
+ - liest den aktuell anliegenden Wert am angegebenen Kanal ein.
+ - liefert einen INT-Wert mit  0 #on("b")#<#off("b")# 'wert' #on("b")#<#off("b")# 255.
+#page#
+#on("b")#
+PROC dezimalwert ausgeben (INT CONST kanal, wert)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Aus­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Digital-Ausgabe möglich!".
+ - ermittelt den auszugebenden Wert durch die Rechnung
+#on("b")#
+#center#ausgabe = wert MOD 256,
+#off("b")#
+ und gibt diesen am angegebenen Kanal aus.
+
+
+#on("b")#
+PROC initialisiere interface
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob das Programm korrekt (mit 'run pdv') gestartet wurde. Ist das
+ nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "PDV-Programme
+ müssen mit 'run pdv' gestartet werden!". Dieser Fehler kann nicht auftreten,
+ wenn die Programme vom #on("b")#gs-Prozess#off("b")#-Menu gestartet werden!
+ - An jeden Digitalausgang des angeschlossenen Interface-Systems wird der Wert
+ '0', an jeden Analogausgang eine "Nullspannung" angelegt (d.h. alles wird
+ "ausgeschaltet"). Die internen Variablen werden dabei initialisiert.
+#page#
+#on("b")#
+PROC spannungswert (INT CONST kanal)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Ein­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Analog-Eingabe möglich!".
+ - ermittelt die laut Konfiguration aktuelle Obergrenze (u max) und Untergrenze
+ (u min) des Spannungsbereiches am angegebenen Analogeingang.
+ - liest den aktuell anliegenden Wert (0 #on("b")#<#off("b")# 'wert' #on("b")#<#off("b")# 255) am angegebenen
+ Kanal ein und wandelt ihn nach folgender Rechnung:
+
+#on("b")#
+ real(wert) * (u max - u min)
+ lieferwert = ---------------------------- + u min
+ 255.0
+
+#off("b")#
+ - liefert einen REAL-Wert mit  u min #on("b")#<#off("b")# 'lieferwert' #on("b")#<#off("b")# u max, gerundet auf drei
+ Nachkommastellen.
+
+
+#on("b")#
+PROC spannungswert ausgeben (INT CONST kanal,
+ REAL CONST spannung)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+#page#
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Aus­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Analog-Ausgabe möglich!".
+ - ermittelt die laut Konfiguration aktuelle Obergrenze (u max) und Untergrenze
+ (u min) des Spannungsbereiches am angegebenen Analogausgang und prüft,
+ ob  u min #on("b")#<#off("b")# 'spannung' #on("b")#<#off("b")# u max. Ist das nicht der Fall, erfolgt ein Abbruch
+ mit der Fehlermeldung 'Der Spannungswert ... ist nicht zulässig!".
+ - wandelt die angegebene 'spannung' nach der Rechnung:
+
+#on("b")#
+ (wert - u min) * 255.0
+ ausgabewert = int ( ---------------------- + 0.5 )
+ u max - u min
+
+#off("b")#
+ - gibt den ermittelten 'ausgabewert' am angegebenen Kanal aus.
+
+
+#on("b")#
+REAL PROC temperatur (REAL CONST spannungswert)
+#off("b")#
+
+ - errechnet aus dem Spannungswert, der vom Temperaturfühler eingelesen
+ wurde, der Thermometerkonstanten und der Minimaltemperatur die
+ Temperatur in �C.
+ - liefert einen REAL-Wert (die Temperatur in �C).
+ So nur anwendbar auf den Temperaturfühler der Fa. AKTRONIK!
+
+
+#on("b")#
+PROC tue nichts
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+#page#
+#on("b")#
+PROC warte (INT CONST sekunden)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - wirkt sonst wie 'pause (sekunden * 10)'.
+
+
+#on("b")#
+PROC warte (REAL CONST sekunden)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - wirkt sonst wie 'pause (int (sekunden * 10.0 + 0.5))'.
+
+
+#on("b")#
+PROC wert an analogausgang ausgeben (INT CONST kanal, wert)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Aus­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Analog-Ausgabe möglich!".
+ - ermittelt den auszugebenden Wert durch die Rechnung
+
+#on("b")#
+#center#ausgabe = wert MOD 256,
+
+#off("b")#
+ und gibt diesen Wert am angegebenen Kanal aus. Die am Analogausgang
+ auszugebende Spannung wird vom D/A-Wandler des Interface-Systems er­
+ mittelt.
+#page#
+#on("b")#
+INT PROC wert von analogeingang (INT CONST kanal)
+#off("b")#
+
+ - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
+ Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
+ "Programm-Abbruch durch <ESC><h>!".
+ - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
+ - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
+ 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "Kanalnummer ... ist unzulässig!".
+ - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Ein­
+ gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
+ meldung "An Kanal ... ist keine Analog-Eingabe möglich!".
+ - liefert den vom A/D-Wandler des Interface-Systems gelieferten Wert mit 0 #on("b")#<#off("b")#
+ 'lieferwert' #on("b")#<#off("b")# 255.
+
diff --git a/doc/prozess/gs-prozess-9 b/doc/prozess/gs-prozess-9
new file mode 100644
index 0000000..6551b01
--- /dev/null
+++ b/doc/prozess/gs-prozess-9
@@ -0,0 +1,477 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (1)#
+#headodd#
+#center#gs-Prozess#right#%
+
+#end#
+#headeven#
+%#center#gs-Prozess
+
+#end#
+#center#1
+
+#on("b")#9  Hinweise für den Systembetreuer/   Programmierer#off("b")#
+
+Sie haben wahrscheinlich bisher - ausschließlich zu Testzwecken - mit nur einem
+Interface-System gearbeitet. In diesem Kapitel möchten wir Ihnen Vorschläge
+machen, wie Sie Ihr Tasksystem organisieren können, um möglichst effektiv und
+störungsfrei mit der vorhandenen Hardware zu arbeiten.
+
+Neben den Möglichkeiten der Organisation des Systems werden wir Ihnen zeigen, wie
+Sie eine einmal vorgenommene Konfiguration/Organisation "fixieren", d.h. schützen
+können.
+
+Im letzten Teil dieses Kapitels werden wir für den #on("b")#routinierten(!) Programmierer#off("b")#,
+Möglichkeiten aufzeigen, wie man, unter weitgehender Umgehung von #on("b")#gs-Prozess#off("b")#,
+Programme für spezielle Anwendungen entwickeln kann. Schon an dieser Stelle sei
+ausdrücklich gesagt, daß dabei alle "Sicherheiten", die #on("b")#gs-Prozess#off("b")# normalerweise
+bietet, nicht (mehr) vorhanden sind.
+
+
+#on("b")#9.1  Vergabe der Kanäle/Organisation des Tasksystems#off("b")#
+
+Zur optimalen Organisation Ihres Systems sollten Sie wissen, in welcher Task die
+Konfiguration sinnvollerweise vorzunehmen ist. Da die Aspekte sehr vielfältig sind,
+werden wir verschiedene Situationen beschreiben. Lesen Sie die Ausführungen zu der
+Situation, die der Ihren am ehesten entspricht.
+
+
+#on("b")#
+1) Es stehen mehrere MUFIs als Adapter zur Verfügung. Alle MUFIs sollen
+ im Terminalkanal betrieben werden. Die Arbeitsplätze sind alle mit
+ dem gleichen Interfacesystem ausgestattet.
+#off("b")#
+#page#
+ Sie sind hervorragend ausgestattet. Die Organisation und Konfiguration des
+ Systems ist sehr einfach:
+
+ Es ist sinnvoll, die Konfiguration von #on("b")#gs-Prozess#off("b")# in der Task vorzunehmen, in
+ der Sie #on("b")#gs-Prozess#off("b")# installiert haben. Das hat den Vorteil, daß alle Sohntasks,
+ die sich anschließend anmelden, diese Konfiguration "erben".
+
+ Bei dieser Ausstattung ist es sinnvoll die Konfiguration zu "fixieren", um irrtüm­
+ lichen oder "böswilligen" Umkonfigurationen vorzubeugen. Sehen Sie dazu
+ Kapitel 9.4.
+
+
+#on("b")#
+2) Es stehen mehrere MUFIs als Adapter zur Verfügung. Alle MUFIs sollen
+ im Terminalkanal betrieben werden. Die Arbeitsplätze sind aber mit
+ verschiedenen Interface-Systemen ausgestattet.
+#off("b")#
+
+ Wenn die Bestückung der einzelnen Arbeitsplätze ständig wechselt, ist es nicht
+ sinnvoll, eine generelle Konfiguration vorzugeben. Teilen Sie jedem Anwender
+ mit, daß er selbst für die Konfiguration seines Systems zuständig ist. Er sollte bei
+ jedem Neuankoppeln seiner Task zumindest die Konfiguration überprüfen und
+ ggf. den Vorgaben entsprechend eine Anpassung vornehmen. Es ist nicht sinn­
+ voll, die jeweilige Konfiguration zu fixieren.
+
+ Wenn Sie zwar unterschiedliche Interface-Systeme verwenden, aber die Inter­
+ face-Systeme einzelnen MUFIs eindeutig zuordnen können, lohnt es sich schon,
+ eine Konfiguration des Systems vorzugeben.
+
+ Richten Sie zu diesem Zwecke so viele Tasks ein, wie Sie unterschiedliche
+ Interface-Systeme zur Verfügung haben, und ordnen Sie jedem Interface-System
+ eindeutig je eine Task zu. Die Namen der Tasks sollten Sie so wählen, daß sofort
+ ersichtlich ist, welchem Interface-System sie zugeordnet ist.
+
+ Nehmen Sie in jeder Task eine Konfiguration von #on("b")#gs-Prozess#off("b")# entsprechend
+ dem zugeordneten Interface-System vor.
+#page#
+ Auch hier ist es sinnvoll, die vorgenommenen Konfigurationen zu "fixieren", um
+ irrtümlichen oder "böswilligen" Umkonfigurationen vorzubeugen. Sehen Sie
+ dazu Kapitel 9.4.
+
+ Die Anwender sollten sich später jeweils als Sohntask der Task anmelden, die
+ sich dem an ihrem Arbeitsplatz vorhandenen Interface-System eindeutig zu­
+ ordnen läßt.
+
+
+#on("b")#
+3) Es steht nur ein MUFI als Adapter zur Verfügung. Das MUFI soll im
+ Terminalkanal betrieben werden.
+#off("b")#
+
+ Je nachdem, ob Sie eine feste Hardware am MUFI betreiben oder nicht, sollten
+ Sie sich an den beiden zuvor beschriebenen Fällen orientieren.
+
+
+#on("b")#
+4) Es steht nur ein RS232-Adapter oder ein MUFI, das als Endgerät an
+ einer separaten Schnittstelle betrieben werden soll, zur Verfügung. Es
+ soll nur von einem Arbeitsplatz/einer Task aus mit dem angeschlos­
+ senen Interface-System gearbeitet werden.
+#off("b")#
+
+ Nehmen Sie die Installation/Konfiguration wie unter 5) beschrieben vor.
+ Arbeiten Sie nur in der Task, in der Sie die Konfiguration vorgenommen haben.
+
+
+#on("b")#
+5) Es steht nur ein Adapter zur Verfügung. Sie wollen aber die Möglichkeit
+ schaffen, daß von verschiedenen Tasks abwechselnd darauf zugegriffen
+ werden kann.
+#off("b")#
+
+ Es ist gleichgültig, ob Sie ein MUFI oder einen RS232-Adapter verwenden - sie
+ sollten den Adapter an einer separaten seriellen Schnittstelle betreiben.
+#page#
+ Auch wenn Sie ein MUFI besitzen, kann es vorteilhaft sein, das MUFI nicht im
+ Terminalkanal, sondern an einer separaten Schnittstelle zu betreiben:
+
+ Beim Betrieb im Terminalkanal kann nämlich nur die Task mit dem MUFI
+ kommunizieren, die an das Terminal gekoppelt ist, in dessen Zuleitung das
+ MUFI eingebaut ist. Das wird hier zum Nachteil, denn wenn eine andere Task
+ auf das Interface-System zugreifen möchte, muß erst die alte Task abgekoppelt
+ und die neue an das Terminal mit dem MUFI angekoppelt werden.
+
+ Der Betrieb an einer separaten Schnittstelle bietet hier wahrscheinlich viel­
+ fältigere Möglichkeiten, wenngleich Sie dadurch auch Geschwindigkeitsein­
+ bußen hinnehmen müssen.
+
+ #on("b")#gs-Prozess#off("b")# bietet Ihnen bei Betrieb eines Adapters an einer separaten seriellen
+ Schnittstelle nämlich die Möglichkeit, abwechselnd von verschiedenen Tasks auf
+ den Adapter und das angeschlossene Interface-System zugreifen zu können.
+
+ Teilen Sie bei der Installation (automatischen Generierung) von #on("b")#gs-Prozess#off("b")#
+ dem System gleich mit, daß Sie Ihren Adapter (ob nun MUFI oder
+ RS232-Adapter) an einer separaten seriellen Schnittstelle betreiben wollen.
+ Schon bei dieser Installation werden Sie nach der Kanalnummer gefragt.
+
+ Wir gehen hier davon aus, daß Sie immer mit dem gleichen Interface-System an
+ diesem Adapter arbeiten werden. In diesem Falle empfiehlt es sich, gleich in der
+ Task, in der Sie die Installation vorgenommen haben, auch die Konfiguration
+ von #on("b")#gs-Prozess#off("b")# vorzunehmen und die Konfiguration zu "fixieren". Durch die
+ Konfiguration in dieser Task, "erben" alle Sohntasks, die anschließend ange­
+ meldet werden, diese Konfiguration.
+
+ Wenn Sie sich mit 'taskinfo <RETURN>' einen Katalog ausgeben lassen,
+ werden Sie feststellen, daß eine weitere Task als unbenannter Sohn ("-") Ihrer
+ Task eingerichtet worden ist. Sie haben nämlich Ihre Task zu einer "zentralen
+ Abwicklungstask" gemacht - genauer gesagt die unbenannte Sohntask.
+#page#
+ Wenn Sie aus Ihrer Task, in der Sie die Konfiguration vorgenommen haben, mit
+ dem Interface-System kommunizieren, erfolgt der Zugriff über diese unbe­
+ nannte Sohntask!
+
+ Sie schaffen dadurch aber zusätzlich die Möglichkeit, daß mehrere Sohntasks -
+ natürlich abwechselnd - über diese "zentrale Abwicklungstask" mit dem Inter­
+ face-System kommunizieren. Selbstverständlich setzt der Zugriff auf das Inter­
+ face-System eine Absprache zwischen den Beteiligten voraus!
+
+
+ Gerade in der Aufbauphase, wenn erst wenige Geräte zur Verfügung stehen, ist
+ das eine Möglichkeit, von verschiedenen Arbeitsplätzen aus mit nur einem Adap­
+ ter/Interface-System Prozeßdatenverarbeitung zu betreiben.
+
+
+#on("b")#
+6) Sie wollen mehrere Adapter an separaten seriellen Schnittstellen
+ betreiben.
+#off("b")#
+
+ In diesem Falle ist es sinnvoll - bevor Sie eine Konfiguration vornehmen - gleich
+ nach der Installation von #on("b")#gs-Prozess#off("b")# für jeden einzelnen Adapter eine Sohntask
+ unter der Task einzurichten, in der #on("b")#gs-Prozess#off("b")# installiert ist. Jede dieser Sohn­
+ tasks koppeln Sie mit einem festen Kanal, an dem ein Adapter/Interface-System
+ angeschlossen ist.
+
+ Sie brauchen dazu #on("b")#gs-Prozess#off("b")# nicht mehrfach zu installieren; wir haben für
+ diesen Fall vorgesorgt. Für die Kopplung der Tasks an die einzelnen Kanäle steht
+ die Prozedur 'PROC interfacekanal (INT CONST kanalnummer)' zur Verfügung.
+ Geben Sie also in einer Task z.B. das Kommando 'interfacekanal (5)
+ <RETURN>', so wird von dieser Task aus das Interface-System am Kanal 5
+ angesprochen.
+
+ Über die Prozedur 'INT PROC interfacekanal' können Sie sich in jeder Task
+ informieren, über welchen Kanal die Kommunikation mit dem Interface-System
+ abgewickelt wird: z.B. mit 'put (interfacekanal) <RETURN>'.
+#page#
+ Ihnen ist sicher klar, daß es auch hier sinnvoll ist, den Namen der jeweiligen
+ Task so zu wählen, daß daraus sofort der betreffende Interfacekanal ablesbar
+ ist.
+
+ In jeder so an einen Kanal gekoppelten Task sollten Sie die Konfiguration von
+ #on("b")#gs-Prozess#off("b")# vornehmen und ggf. "fixieren". Jede solche Task richtet auto­
+ matisch eine unbenannte Sohntask ("-") ein, die sich wie eine "zentrale Ab­
+ wicklungstask" verhält. Wenn Sie also aus Ihrer Task oder aus neu einge­
+ richteten Sohntasks mit dem Interface-System kommunizieren, so erfolgt das
+ über die "zentrale Abwicklungstask".
+
+
+#on("b")#9.2  Informationsprozeduren#off("b")#
+
+Zur Information stehen dem Systembetreuer drei wichtige Prozeduren zur Verfügung:
+
+#on("b")#
+TEXT PROC adapterart
+#off("b")#
+
+Hiermit können Sie in Erfahrung bringen, welche Interfaceanpassung z.Z. in der
+aktuellen Task insertiert ist: MUFI im Terminalkanal, MUFI als Endgerät oder
+AKTRONIK-Adapter (RS232-Adapter).
+
+
+#on("b")#
+INT PROC interfacekanal
+#off("b")#
+
+Hiermit können Sie in Erfahrung bringen, über welchen Kanal z.Z. mit dem Inter­
+face-System aus der Task kommuniziert wird. Die Prozedur steht allerdings nur dann
+zur Verfügung, wenn das Interface-System an einer separaten Schnittstelle betrieben
+wird - sonst erscheint der Hinweis 'FEHLER: unbekanntes Kommando'.
+
+Es gibt noch einen Befehl, mit dem Sie sich über den Zustand des Interface-Systems
+informieren können:
+#page#
+#on("b")#
+PROC oeffne interface (INT VAR testwert)
+#off("b")#
+
+Die Prozedur versucht, die aktuelle Betriebsart einzustellen. Anschließend erhalten
+Sie eine 'Erfolgsauskunft'. Dabei bedeuten:
+
+ 0 - alles okay
+ -1 - Interface ist noch nicht konfiguriert
+ -2 - Interface-Task ist besetzt
+ -3 - Interfacekanal ist belegt
+ -4 - Interface meldet sich nicht
+ -5 - Interface kann nicht geöffnet werden
+
+Ist der Adapter an einer separaten Schnittstelle angeschlossen, so arbeitet der Befehl
+über die "zentrale Abwicklungstask". Als Antwort können alle genannten Codes auftre­
+ten; beim MUFI im Terminalkanal allerdings nur die Codes 0, -1 und -4. Die oben
+genannten Fehlermeldungen sind detailliert in Kapitel 5.5 erläutert.
+
+Sie sollten anschließend #on("b")#unbedingt#off("b")# das Kommando 'schliesse interface' geben: Eine
+eventuell durch 'oeffne interface' vollzogene Betriebsartumstellung wird dadurch
+rückgängig gemacht.
+
+
+
+#on("b")#9.3  Neufestlegung des Interfacekanals#off("b")#
+
+Wenn Sie mit MUFI(s) im Terminalkanal arbeiten, spielen Kanalnummern für das
+Ansprechen des/der MUFIs keine Rolle. Das jeweilige MUFI kann in diesem Falle
+nämlich immer nur von der Task aus angesprochen werden, die an das Terminal
+gekoppelt ist, in dessen Zuleitung das MUFI eingebaut wurde.
+
+Wenn Sie Adapter (MUFI oder RS232-Adapter) an separaten seriellen Schnittstellen
+betreiben, so legen Sie schon bei der Installation von #on("b")#gs-Prozess#off("b")# den Kanal fest,
+über den die Task mit dem Interface-System kommuniziert. Wie wir schon oben be­
+schrieben haben, können Sie den Interface-Kanal mit der Prozedur 'PROC interface­
+kanal (INT CONST kanalnummer)' neu festlegen. Beachten Sie dabei aber bitte
+folgendes:
+#page#
+Wenn Sie in einer Task #on("b")#gs-Prozess#off("b")# konfigurieren und zuvor entschieden haben, daß
+der Adapter an einer separaten Schnittstelle betrieben wird, so wird automatisch eine
+unbenannte Sohntask ("-") eingerichtet. Diese Sohntask wird zur "zentralen Abwick­
+lungstask". Wenn Sie nun aus der Task, in der Sie die Konfiguration vorgenommen
+haben, oder aus einer Sohntask dieser Task, die anschließend eingerichtet wird, mit
+dem Interface-System kommunizieren, so erfolgt diese Kommunikation über diese
+unbenannte Sohntask. Daher wählten wir die Bezeichnung "zentrale Abwicklungs­
+task".
+
+Da die "zentrale Abwicklungstask" den "Zustand der Vatertask" in dem Augenblick
+erbt, in dem Sie eingerichtet wird, würde eine später erfolgende Neufestlegung des
+Interfacekanals nicht von Ihr registriert und damit auch nicht wirksam.
+
+#on("b")#Es ist unbedingt notwendig#off("b")#, in der Task, in der Sie eine Neufestlegung des Interface-
+Kanals vornehmen, #on("b")#gs-Prozess#off("b")# auch neu zu konfigurieren! Bei der Neukonfiguration
+wird nämlich die unbenannte Sohntask gelöscht und neu eingerichtet.
+
+(Das hier beschriebene Phänomen ist Ihnen wahrscheinlich schon aus der
+PRINTER-Task bekannt).
+
+Hinsichtlich der Sicherheit des Systems hat dieses Vorgehen aber einen Vorteil: wenn
+in den "zugänglichen Sohntask", die über eine "zentrale Abwicklungstask" mit dem
+Interface-System kommunizieren eine Neueinstellung des Interface-Kanals vorge­
+nommen wird, so bleibt diese unwirksam (solange in der Sohntask nicht umkonfigu­
+riert wird - was sich aber verhindern läßt! Sehen Sie dazu das folgende Kapitel!).
+
+
+#on("b")#9.4  Fixieren der Konfiguration#off("b")#
+
+Prinzipiell kann in jeder Task, in der #on("b")#gs-Prozess#off("b")# zur Verfügung steht, die Konfigura­
+tion (von #on("b")#gs-Prozess#off("b")#) vorgenommen werden. Gerade von unerfahrenen Anwendern
+könnte aber irrtümlich eine Umkonfiguration vorgenommen werden. Aber nicht nur
+das: auch erfahrene Anwender könnten "böswillig" die Konfiguration verändern. Aus
+diesem Grunde ist es ggf. sinnvoll, eine vorgenommene Konfiguration zu fixieren
+(schützen).
+#page#
+Dazu steht die Prozedur 'PROC pdv konfiguration zugelassen (BOOL CONST ent­
+scheidung)' zur Verfügung. Mit dem Kommando 'pdv konfiguration zugelassen
+(FALSE) <RETURN>' sperren Sie in der aktuellen Task und in allen Sohntasks, die
+sich #on("b")#anschließend#off("b")# unter dieser Task anmelden, den Menupunkt 'k Konfigurieren'
+unter dem Oberbegriff 'Interface'.
+
+Sofern nötig, können Sie diese Sperre mit dem Kommando 'pdv konfiguration zuge­
+lassen (TRUE) <RETURN>' wieder aufheben, #on("b")#allerdings nur in der Task, in der Sie
+auch die Sperre gesetzt haben#off("b")#, denn #on("b")#gs-Prozess#off("b")# merkt sich diesen Tasknamen!
+Wenn Sie also ein Password auf diese Task legen, und damit anderen den Zugang
+verwehren, kann auch eine "böswilligie Umkonfiguration" verhindert werden.
+
+
+#on("b")#9.5  Mögliche Fehlerfälle#off("b")#
+
+Wenn Fehlermeldungen auftreten, so finden Sie Fehlerbeschreibungen und Möglich­
+keiten zur Abhilfe im Kapitel 5.5 beschrieben. Auf einen Fehlerzustand möchten wir
+Sie hier noch besonders hinweisen:
+
+#on("b")#Interfacekanal ist belegt!#off("b")#
+
+ Über den angegebenen Kanal greift schon eine andere Task auf das angeschlos­
+ sene Interface-System zu. Vielleicht wurde der betreffende Kanal auch zuvor für
+ andere Zwecke verwendet - anschließend hat der Benutzer den Kanal nicht
+ ordentlich freigegeben. Geben Sie in der 'gib kommmando'-Ebene den Befehl
+ 'taskinfo (2) <RETURN>'. In der Spalte mit der Überschrift 'CHAN' müßte jetzt
+ irgendwo die Kanalnummer auftauchen. Steht die Kanalnummer bei einem Sohn
+ der Task 'SUPERVISOR', so liegt der letztgenannte Fall vor, sonst der erstge­
+ nannte.
+
+ Abhilfe: Schließen Sie Ihr Interface-System an einen anderen Kanal an oder
+ bitten Sie den betreffenden Anwender, den Kanal freizugeben.
+ Ist das nicht möglich, so kann aus einer Systemtask das Kommando
+ 'end (canal (kanalnummer))' <RETURN>' gegeben werden. Statt
+ 'kanalnummer' ist natürlich die tatsächliche Nummer (z.B. '4')
+ anzugeben.
+#page#
+#on("b")#9.6  Weitere Möglichkeiten#off("b")#
+
+Ihnen ist sicher aufgefallen, daß wir uns bemüht haben, einen sinnvollen Kompro­
+miß zwischen Sicherheit in der Handhabung und Geschwindigkeit des Systems zu
+finden. In Zweifelsfällen haben wir uns eher zugunsten der Sicherheit entschieden.
+
+Sicher werden Sie inzwischen bemerkt haben, daß die Kommunikation mit einem
+Adapter (MUFI oder RS232-Adapter) an einer separaten seriellen Schnittstelle recht
+zeitaufwendig ist.
+
+Prinzipiell standen uns bei der Konzeption zwei Möglichkeiten zur Verfügung: Ent­
+weder wir gestalten jeden Basisbefehl so, daß wir uns zu Beginn der Ausführung
+jeweils direkt an den betreffenden Kanal ankoppeln und am Ende der Ausführung
+des Befehls wieder abkoppeln - oder wir richten eine "zentrale Abwicklungstask" ein
+und nutzen die Intertaskkommunikation des EUMELs. Wir haben uns nach diversen
+Tests für die zweite Variante entschieden: Einmal zeigte sich, daß dieses Verfahren
+weit weniger zeitaufwendig ist als das ständige An- und Abkoppeln an den Interface-
+Kanal. Zum anderen konnten wir so die Möglichkeit schaffen, über diese "zentrale
+Abwicklungstask" den abwechselnden, koordinierten Zugriff mehrerer Tasks auf ein
+Interface-System zu realiseren.
+
+Wenn Sie nun aber spezielle Anwendungen schreiben wollen, für die die Geschwin­
+digkeit beim Ansprechen des Interface-Systems an einer separaten Schnittstelle nicht
+ausreicht, so möchten wir Ihnen hier noch eine Möglichkeit aufzeigen, dieses
+Problem zu bewältigen.
+
+Auch an dieser Stelle sei noch einmal ausdrücklich darauf hingewiesen, daß Sie bei
+dieser Programmiermöglichkeit auf alle Sicherheiten, die Ihnen #on("b")#gs-Prozess#off("b")# bietet,
+verzichten müssen. Deshalb sollten Sie diesen Weg nur beschreiten, wenn Sie ein
+hinlängliches Maß an Programmierroutine besitzen! Die zur Verfügung stehenden
+Befehle und die Besonderheiten möchten wir Ihnen an einem kleinen Beispiel­
+programm aufzeigen:
+#page#
+#on("b")#
+ LET ausgabekanal = 4,
+ eingabekanal = 3;
+
+ INT VAR test, eingabewert;
+ INT VAR terminalkanal :: channel (myself);
+ schliesse interface;
+ continue (interfacekanal);
+ oeffne interface direkt (test);
+ IF test < 0
+ THEN continue (terminalkanal);
+ errorstop ("Funktionsfehler Interface-System")
+ FI;
+ initialisiere interface direkt;
+ eigentliches programm;
+ schliesse interface direkt;
+ continue (terminalkanal).
+
+ eigentliches programm:
+ direkt ausgeben (ausgabekanal, 3);
+ eingabewert := direkteingabe (eingabekanal).
+#off("b")#
+
+Wenn Sie ein solches Programm geschrieben haben, starten Sie es bitte mit dem
+Befehl 'run pdv' oder aus dem Menusystem heraus mit der Menufunktion 's Starten'.
+(Bei 'run' kann der Befehl 'schliesse interface' gestrichen werden!).
+
+Für die eigentliche Programmierung des Interface-Systems stehen Ihnen nur zwei
+Befehle zur Verfügung:
+
+#on("b")#
+PROC direkt ausgeben (INT CONST kanal, wert)
+#off("b")#
+
+ - ermittelt den auszugebenden Wert durch die Rechnung
+
+#on("b")##center#ausgabe = wert MOD 256#off("b")#
+
+ und gibt diesen am Ausgabekanal aus.
+
+ Der Befehl ähnelt dem Befehl 'dezimalwert ausgeben' - hat aber im Gegensatz
+ dazu keinerlei "Fehlerfänger": so werden Sie z.B. nicht darauf aufmerksam
+ gemacht, wenn der angegebene Kanal gar kein Ausgang ist, etc.)
+#page#
+#on("b")#
+INT PROC direkteingabe (INT CONST kanal)
+#off("b")#
+
+ - liest den aktuell anliegenden Wert am angegebenen Kanal ein.
+ - liefert einen INT-Wert mit 0 � 'wert' � 255.
+
+ Der Befehl ähnelt dem Befehl 'dezimalwert' - hat aber im Gegensatz dazu
+ ebenfalls keinerlei "Fehlerfänger"!
+
+
+Das obige Programm beginnt mit dem Befehl 'schliesse interface'. Sicher kommt es
+Ihnen sonderbar vor, daß zu Beginn des Programms das Interface geschlossen wird,
+wo wir es doch eigentlich "öffnen" müßten. Ihnen wird die Funktion aber sofort klar,
+wenn Sie sich die Situation vor Augen führen:
+
+Als Sie #on("b")#gs-Prozess#off("b")# in Ihrer Task konfiguriert haben, und festlegten, daß der Adapter
+an einer separaten Schnittstelle "hängt", richtete #on("b")#gs-Prozess#off("b")# automatisch eine
+unbenannte Sohntask ("-") als "zentrale Abwicklungstask" ein, die durch das
+Kommando 'run pdv' bzw. durch die Menufunktion 's Starten' an den Interfacekanal
+gekoppelt wird. Der Befehl 'schliesse interface' koppelt die Task "-" wieder vom Inter­
+face-Kanal ab, so daß Sie direkt darauf zugreifen können. Außerdem werden die
+internen Einstellungen im Adapter wieder in Ausgangsstellung gebracht.
+
+Mit der Prozedur 'PROC oeffne interface direkt (INT VAR testwert)' sprechen Sie das
+Interface neu an. Dabei wird ein angeschlossener Adapter automatisch auf Betriebs­
+bereitschaft getestet und dann auf den Betrieb an einer separaten seriellen Schnitt­
+stelle umgestellt (nur beim MUFI).
+
+Über 'testwert' erhalten Sie eine Rückmeldung. Dabei haben die gelieferten 'test­
+werte' folgende Bedeutung:
+
+ 0 - Interface betriebsbereit
+ -4 - Interface #on("b")#nicht#off("b")# betriebsbereit
+ (Interface meldet sich nicht)
+#page#
+Der Befehl 'initialisiere interface direkt' wirkt ähnlich wie der schon oben be­
+schriebene Befehl 'initialisiere interface', jedoch #on("b")#nicht#off("b")# über den "Umweg zentrale
+Abwicklungstask" - sondern halt 'direkt' am Interface-Kanal. Einzige Aufgabe hier:
+Alle Ausgabe-Kanäle auf Wert '0' bzw. Nullspannung setzen.
+
+Durch das abschließende 'schliesse interface direkt' bringen Sie ein angeschlossenes
+MUFI wieder in die "Ausgangsstellung".
+
+Beachten Sie bei der Programmierung bitte unbedingt, daß Sie ständig zwischen dem
+Kanal, an dem Sie arbeiten (Terminal) und dem Interfacekanal hin- und herschalten
+(müssen), wenn Ein- oder Ausgaben auf dem Terminal erfolgen sollen. Die direkte
+Programmierung lohnt sich demnach nur, wenn aufeinanderfolgende Aktionen am
+Interfacekanal durchgeführt werden (z.B. Schrittmotorsteuerungen etc.).
+
+Treten Programmfehler auf, während Sie an den Interfacekanal gekoppelt sind,
+haben Sie keine Chance, von Ihrem Terminalkanal aus auf das Interface zuzugreifen
+- denn das "hängt am Interfacekanal" (z.B. bei "Programmabsturz" oder Endlos­
+schleife).
+
+Bei Ihrer Programmierung sollten Sie diesem Fall vorbeugen (disable stop - enable
+stop). Ansonsten müßten Sie aus einer Systemtask den Kanal "abschießen". Geben
+Sie dazu in einer Systemtask z.B. das Kommando 'end (canal (5)) <RETURN>',
+wenn das Interface-System über den Kanal 5 angesprochen wird.
+
diff --git a/doc/system/systemhandbuch.1 b/doc/system/systemhandbuch.1
new file mode 100644
index 0000000..a8f53bb
--- /dev/null
+++ b/doc/system/systemhandbuch.1
@@ -0,0 +1,1685 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#Systemhandbuch
+
+
+
+
+#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.1,1.5)#
+#free(4.0)#
+#center#EUMEL
+
+
+#center#Systemhandbuch
+
+
+
+
+
+
+
+
+
+#center#copyright ERGOS GmbH, 1990
+
+
+#page#
+#block#
+
+Copyright: ERGOS GmbH April 1990
+
+ Alle Rechte vorbehalten. Insbesondere ist die Überführung in
+ maschinenlesbare Form sowie das Speichern in Informations­
+ systemen, auch auszugsweise, nur mit schriftlicher Einwilligung
+ der ERGOS GmbH gestattet.
+
+
+ +-----------------------------------------------------+
+
+
+
+
+
+
+
+Autoren : Jochen Liedtke
+ Dietmar Heinrichs
+ Rainer Hahn
+ Christian Szymanski
+ Thomas Müller
+
+Texterstellung : Dieser Text wurde mit der ERGOS-EUMEL Textverarbeitung erstellt
+ und aufbereitet und auf einem Kyocera Laserdrucker ge­
+ druckt.
+#page#
+
+
+
+
+
+
+
+ +----------------------------------------------+
+
+
+
+
+#page#
+
+#start(2.5,1.5)#
+#pageblock#
+#block#
+#headeven#
+
+%#center#EUMEL-Systemhandbuch
+
+
+#end#
+#headodd#
+
+#center#Einführung#right#%
+
+
+#end#
+
+#ib(9)#Einführung#ie(9)#
+
+Der größte Teil dieses Systemhandbuchs ist für Anwender geschrieben, die tiefer in
+das EUMEL-System einsteigen und evtl. Systemergänzungen oder Systemänderun­
+gen programmieren wollen. Der erste Teil ist allerdings für alle interessant, die ein
+EUMEL-System verwenden, selbst für Anfänger, die ihr System zum ersten Mal in
+Betrieb nehmen wollen. Entsprechend der verschiedenen Adressatenkreise unter­
+scheiden sich die einzelnen Kapitel stark in der Beschreibungsart. Deshalb:
+
+#on("b")##on("i")#Sind Sie EUMEL-Neuling?#off("b")##off("i")#
+
+ Dann sollten Sie #on("b")##on("i")#vor#off("b")##off("i")# dem Einschalten Ihres Systems die Einführung des Kapi­
+ tels "System einrichten" lesen. Dort werden keine weiteren Kenntnisse voraus­
+ gesetzt. Danach sollten Sie erst einmal durch praktisches Arbeiten mit Hilfe des
+ Benutzerhandbuchs etwas mit dem System vertraut werden.
+
+
+#on("b")##on("i")#Haben Sie schon einige Zeit mit dem EUMEL gearbeitet?#off("b")##off("i")#
+#on("b")##on("i")#Sind Sie mit dem System einigermaßen vertraut?#off("b")##off("i")#
+
+ Dann lesen Sie den kompletten Teil 1 ("System einrichten") dieses Systemhand­
+ buchs.
+ Das Lesen der folgenden Kapitel ist für den einfachen Betrieb des EUMEL-
+ Systems nicht erforderlich. Sie setzen auch intime Kenntnis des Systems auf
+ dem Niveau des Benutzerhandbuchs voraus und würden Anfänger leicht verwir­
+ ren.
+
+
+#on("b")##on("i")#Haben Sie Probleme mit Ihrer Hardware?#off("b")##off("i")#
+
+ #on("i")#Wenn Sie nichts von Hardware verstehen, wenden Sie sich an einen Fachmann!#off("i")#
+
+ Wenn Sie ein gewisses Grundwissen über Hardware haben, dann lesen Sie Teil 2
+ ("Hardware und ihre Steuerung"). In diesem Kapitel sollten Sie "3. Kanä­
+ le und Konfigurierung" erst einmal auslassen.
+
+
+#on("b")##on("i")#Wollen Sie tiefer in das Betriebssystem einsteigen?#off("b")##off("i")#
+#on("b")##on("i")#Haben Sie EUMEL-Erfahrung?#off("b")##off("i")#
+#on("b")##on("i")#Haben Sie Programmiererfahrung?#off("b")##off("i")#
+
+ Dann lesen Sie im Systemhandbuch alles, was Ihnen interessant erscheint.
+#page#
+#headeven#
+
+%#center#EUMEL-Systemhandbuch
+
+
+#end#
+#headodd#
+
+#center#1. System einrichten#right#%
+
+
+#end#
+
+#ib(9)#1. #ib#System einrichten#ie##ie(9)#
+
+#ib(9)#1.1. Einführung#ie(9)#
+
+#ib(9)#Wie Ihr System aufgebaut ist#ie(9)#
+
+Der kleinstmögliche EUMEL-Rechner besteht aus einem #ib#Rechnerkern#ie# und einem Ter­
+minal:
+
+
+ Rechnerkern Terminal 1
+
+
+ #on("i")#Anmerkung: In manchen Fällen ist das Terminal hardwaremäßig in den Rechner
+ integriert. Trotzdem fassen wir diese physische Einheit dann als
+ zwei logisch getrennte Komponenten auf, nämlich Rechnerkern
+ und Terminal!#off("i")#
+
+Wie man sieht, hat das #ib#Terminal#ie# die Nummer 1. Das bedeutet, daß es über Kanal 1 mit
+dem Rechnerkern verbunden ist. Das EUMEL-System kennt 16 solche #ib#Kanäle#ie#, wobei es
+von der konkreten Hardware abhängt, welche Kanäle wirklich vorhanden sind und
+welche Geräte man daran anschließen kann. (Allerdings ist der Kanal 1 als Verbindung
+zum Terminal 1 immer vorhanden.)
+
+In den meisten Fällen wird auch ein #ib#Drucker#ie# angeschlossen sein. Die genaue An­
+schlußart ist wieder von der konkret verwendeten Hardware abhängig. Nehmen wir an,
+er sei an Kanal 4 angeschlossen:
+
+
+
+ Rechnerkern Terminal 1
+
+ Drucker (Kanal 4)
+
+
+
+Man sieht also, daß Lücken bei der Verwendung der Kanäle auftreten dürfen. Bei
+Multi-User-Systemen können, sofern die entsprechenden Schnittstellen vorhanden
+sind, weitere Terminals und andere Geräte (z.B. #ib#Plotter#ie#) angeschlossen werden:
+
+
+
+ Rechnerkern Terminal 1
+
+ Terminal 2
+
+ Plotter (Kanal 3)
+
+ Drucker (Kanal 4)
+
+ Terminal 5
+
+ Terminal 6
+
+
+
+
+
+#ib(9)#1.2. Wie Sie die EUMEL-Software erhalten und
+ installieren#ie(9)#
+
+
+
+Betriebssystem : EUMEL (Version 1.8)
+Hardware : IBM-PC/AT, IBM-PC/XT und Kompatible
+SHard-Version : 4.9 und 5.0
+
+Erforderliche Disketten
+
+ - EUMEL-Generierungsdiskette : "SETUP-EUMEL AT" (bzw. "SETUP-
+ EUMEL XT")
+ - EUMEL-Systemdisketten : "HG0" und "HG1" (EUMEL0-Maschine
+ und Hintergrund) evtl. auch nur eine 1,2
+ MB Hintergrunddiskette
+
+Die Diskette "SETUP-EUMEL" ist ein kleines EUMEL-System zur Installation des Be­
+triebssystems EUMEL auf einem AT/XT kompatiblen Rechner. Auf diesem System
+laufen Programme ab, die im Dialog mit dem Benutzer das Einrichten einer oder
+mehrerer EUMEL-Partitionen ermöglichen.
+#on("b")#Diese Diskette darf nicht schreibgeschützt sein!#off("b")#
+
+Beim Einrichten einer EUMEL-Partition wird nach Prüfung der Festplatte durch
+"SETUP-EUMEL" der hardwarenahe Teil des EUMEL-Systems, 'SHard' (Software/
+Hardware-Interface), auf die Festplatte geschrieben.
+
+Die Hintergrunddisketten beinhalten das eigentliche Betriebssystem EUMEL (den
+Systemkern (EUMEL-0-Maschine)) und die darauf aufbauenden Systemteile (Hinter­
+grund)).
+
+
+Leistungen des SETUP EUMEL
+
+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. Die Min­
+destgröße einer Partition für ein EUMEL-System beträgt ca. 1MB, die maximale Größe
+ist vom benutzten Systemkern abhängig: der in der Version 1.8.6 M+ verwendete
+Systemkern u186+ \#1523 erlaubt eine maximale Größe von 128 MB. Andere, ältere
+EUMEL Versionen erlauben nur eine Partitionsgröße von 16 MB. Aus Kompatibilitäts­
+gründen stellt das Installationsprogramm eine Kontrollfrage bei Überschreiten der 16
+MB Grenze.
+
+Soll neben EUMEL auch eine MS-DOS Partition auf der Festplatte sein, muß, da
+MS-DOS standardmäßig die gesamte Festplatte belegt, dieses System gesichert, mit
+dem MS-DOS-Kommando 'fdisk' (o.ä.) die Partition gelöscht und entsprechend kleiner
+neu eingerichtet werden. Sie können auch bei der EUMEL-Installation alle bereits
+bestehenden Systeme löschen; dazu bietet Ihnen der SETUP-EUMEL die Option
+'Löschen der gesamten Partitionstabelle' an. Dabei gehen jedoch alle Daten auf der
+Festplatte verloren. Achten Sie also darauf, daß sie alle Daten vorher gesichert haben!
+
+Um nun die Partitionierung für Ihr EUMEL-System vorzunehmen, legen Sie die Diskette
+"SETUP-EUMEL" ohne Schreibschutzmarke in das Start-Laufwerk. Sollten Sie ein Gerät
+mit zwei Laufwerken besitzen, dann ist es das Laufwerk A:. (Bei Unklarheiten im Benut­
+zerhandbuch des Herstellers nachsehen.)
+
+Schalten Sie nun den Rechner ein bzw. betätigen Sie den Tastatur-RESET, wenn Ihr
+Gerät bereits eingeschaltet ist (meistens mit dem gleichzeitigen Druck der Tasten
+CTRL, ALT und DEL).
+
+Der SETUP-EUMEL gibt zunächst folgende SHard-Meldung aus:
+
++--------------------------------------------+
+i i
+i Setup-SHard für EUMEL auf IBM PC/AT, V 4.8 i
+i Copyright (C) 1989 ERGOS GmbH, Siegburg i
+i i
++--------------------------------------------+
+
+Warten Sie beim Hochfahren des SETUP-EUMELs, bis Ihnen nach einem Zwischen­
+bildschirm ("SETUP-EUMEL für Modul-SHard") eine Partitionstabelle angezeigt wird.
+Dieser können Sie entnehmen, 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-Nummer. 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
+Nummern 1 oder 4 vergeben. Außerdem wird die gerade aktive Partition durch einen
+entsprechenden Eintrag in der Tabelle kenntlich gemacht. "Aktiv" ist die Partition, die
+nach dem nächsten Einschalten des Rechners bzw. nach dem nächsten Tastatur-
+RESET gestartet würde.
+
+
+Sie sehen zusätzlich ein Menü mit folgenden zur Auswahl stehenden Funktionen:
+
++------------------------------------------------------------+
+i i
+i - EUMEL-Partition einrichten 1 i
+i - erneuern (Neuer SHard) 2 i
+i - aktivieren 3 i
+i - löschen 4 i
+i - Partitionstabelle löschen 5 i
+i - SHard-Konfiguration anzeigen 6 i
+i - SHard konfigurieren 7 i
+i - SHardmodule laden oder löschen 8 i
+i - SETUP-EUMEL beenden 0 i
+i i
++------------------------------------------------------------+
+
+#on("i")##on("u")#EUMEL - Partition einrichten #off("u")##off("i")#
+
+Eine neue EUMEL-Partition wird gemäß den im weiteren erfragten Angaben eingerich­
+tet. In die Partition wird ein SHard geschrieben, dessen Konfiguration die gelieferte
+Grundkonfiguration oder die von Ihnen eingestellte ist (s. Partitionieren der Festplatte,
+Seite 3).
+
+
+#on("i")##on("u")#EUMEL - Partition erneuern (Neuer SHARD)#off("u")##off("i")#
+
+In eine bereits vorhandene Partition wird ein SHard in der eingestellten Konfiguration
+geschrieben. Der bis dahin vorhandene SHard wird überschrieben. Die Möglichkeit
+besteht jedoch nur, wenn die Partition mit einem SETUP-EUMEL eingerichtet worden
+ist.
+
+Erneuern bedeutet, nur den SHard #on("u")#auszutauschen#off("u")# auf einer Partition, die schon einen
+fertigen EUMEL enthält, ohne daß man dabei den EUMEL löscht. Das ist dann sinnvoll,
+wenn man eine neue Version des SHard benutzen möchte oder den SHard aus ir­
+gendwelchen Gründen (z.B. Streamer gekauft) um einen oder mehrere Module erwei­
+tern will.
+
+Diese Aktion kann nur durchgeführt werden, wenn bereits ein SHard mit der Versions­
+nummer 4.x in dieser Partion vorhanden ist. Ältere (Version 2.7, 2.8 etc.) können #on("u")#nicht#off("u")#
+ersetzt werden.
+
+
+#on("i")##on("u")#EUMEL - Partition aktivieren#off("u")##off("i")#
+
+Eine Partition wird ausgewählt und aktiv gesetzt, d.h. beim nächsten Start des Re­
+chners wird das System, das auf dieser Partition steht, hochgefahren.
+
+
+#on("i")##on("u")#EUMEL - Partition löschen #off("u")##off("i")#
+
+Hierbei wird ein Eintrag aus der Partitionstabelle entfernt. Die EUMEL-Partition wird
+nicht wirklich gelöscht, d.h. wenn man nach dem Löschen den Plattenbereich noch
+nicht anderweitig verwendet hat, kann das EUMEL-System auf dieser Partition durch
+ein "EUMEL-Partition einrichten" auf genau demselben Plattenbereich (Start-/Endzy­
+linder) wieder hergestellt werden.
+
+
+#on("i")##on("u")#Partitionstabelle löschen#off("u")##off("i")#
+
+Dies ist eine sehr gefährliche Option !
+Es werden hiermit #on("u")##on("b")#alle#off("b")##off("u")# Partitionen auf der Platte gelöscht (nicht nur die von EUMEL).
+Auch hier gilt zwar, daß die Partitionen selbst an sich unangetastet bleiben und wie­
+derhergestellt werden könnten, aber dies ist bei anderen Betriebssystemen oft nicht
+möglich. Also #on("u")#VORSICHT#off("u")#.
+
+
+#on("i")##on("u")#SHard-Konfiguration anzeigen #off("u")##off("i")#
+
+Die Module des SHard, der bereitgestellt ist, um auf die Platte geschrieben zu werden,
+werden angezeigt. Es werden alle definierten Kanäle angezeigt und zu jeder Kanal­
+nummer der assoziierte Modulname. Aufgelistet ist die zuletzt mit dem SETUP-EUMEL
+zusammengestellte Konfiguration.
+
+
+#on("i")##on("u")#SHard konfigurieren #off("i")##off("u")#
+
+Zusammenstellen von einer SHardbasis und SHardmodulen zu einem neuen SHard,
+um eine neue Partition einzurichten oder den SHard einer bestehenden Partition zu
+ersetzen.
+ACHTUNG: Bitte diesen Menuepunkt nicht experimentell benutzen! Eine Anleitung
+ zum Thema Module etc. wird separat erscheinen.
+#page#
+#on("i")##on("u")#SHardmodule laden oder löschen #off("u")##off("i")#
+
+Hiermit können neue Module oder neue Versionen von Modulen in den SETUP-EUMEL
+geladen werden oder nicht mehr benötigte Module gelöscht werden. Die neuen Modu­
+le werden von einer EUMEL-Archivdiskette gelesen, deren Name zuvor eingegeben
+werden muß.
+ACHTUNG: Bitte diesen Menüpunkt nicht experimentell benutzen! Eine Anleitung
+ zum Thema Module etc. wird separat erscheinen.
+
+
+#on("i")##on("u")#SETUP-EUMEL beenden #off("u")##off("i")#
+
+SETUP-Programm ordnungsgemäß beenden.
+ENDE-Meldung abwarten!
+
+
+
+
+Die eigentliche Partitionierung beginnt nun, indem Sie Menü-Punkt 1 "EUMEL-Partition
+einrichten" anwählen. (Punkt 1 wird Ihnen nur dann #on("b")#nicht#off("b")# angeboten, wenn die Fest­
+platte bereits vollständig belegt ist. Sichern Sie dann das alte System und löschen eine
+oder alle Partitionen.) Die Kontrollabfrage "Neue EUMEL-Partition einrichten? (j/n)"
+beantworten Sie entsprechend mit "j".
+
+Beim Generieren einer EUMEL-Partition werden Angaben zu Größe und Startzylinder
+abgefragt. Dafür werden Vorgaben gemacht, die Sie bestätigen, indem Sie die
+<RETURN>-Taste betätigen, oder die Sie überschreiben können. Die abschließende
+Abfrage "Sind die Partitionsangaben korrekt?" fordert Sie zur Überprüfung Ihrer Einga­
+ben auf.
+
+Nach der Eingabe und der Überprüfung der Sektoren erscheint eine Meldung wie z.B.:
+
++--------------------------------------------------+
+i i
+i Ich habe keine schlechten Sektoren gefunden i
+i SHard wird auf die Partition geschrieben i
+i Bitte betätigen Sie eine Taste! i
+i i
++--------------------------------------------------+
+
+oder
+
++--------------------------------------------------+
+i i
+i Ich habe 2 schlechte Sektoren gefunden i
+i SHard wird auf die Partition geschrieben i
+i Bitte betätigen Sie eine Taste! i
+i i
++--------------------------------------------------+
+
+Danach gelangen Sie wieder in das Generierungsmenü. Wählen Sie "0" für "SETUP-
+EUMEL beenden". Über eine Sicherheitsfrage verlassen Sie nun den ersten Teil der
+Installation. Warten Sie #on("b")#unbedingt#off("b")#, bis auf dem Bildschirm die Meldung "ENDE" er­
+scheint, bevor Sie die Diskette "SETUP EUMEL" aus dem Laufwerk nehmen.
+
+
+
+Installieren eines EUMEL-Hintergrundes
+
+Im nächsten Schritt wird auf ihrer Festplatte das vollständige EUMEL-System instal­
+liert.
+
+Bitte betätigen Sie den Tastatur-Reset an Ihrem Rechner (oder die Tasten CTRL, ALT
+und DEL oder den AUS-/EIN-Schalter).
+
+Auf dem Bildschirm erscheint die folgende Meldung:
+
++--------------------------------------------------------------------------+
+i i
+i SHard für EUMEL auf IBM PC,AT,XT, V 4.7 i
+i Copyright (c) 1985, 86, 87, 88, 89 Martin Schönbeck Beratungen GmbH, i
+i Spenge i
+i Ladevorgang kann durch Tastendruck unterbrochen werden i
+i Habe leider keine EUMEL-0-Maschine gefunden i
+i Ladevorgang unterbrochen, drücken Sie eine Taste um fortzufahren. i
+i i
++--------------------------------------------------------------------------+
+
+Legen Sie nun die erste Hintergrunddiskette (HG0) in das Laufwerk ein und betätigen
+Sie eine Taste. Der Systemkern wird geladen und es erscheinen Angaben zu HG-,
+RAM-, und Pufferkapazität sowie zu den angeschlossenen Kanälen, diesmal jedoch
+bezogen auf die Festplatten-Partition. Warten Sie nun, bis die Meldung "HG ungültig"
+kommt. Drücken Sie anschließend eine beliebige Taste.
+Falls Sie in ein bereits bestehendes EUMEL-System einen neuen Urlader einspielen
+wollen, lesen Sie bitte den Abschnitt "Installation eines neuen Urladers".
+
+#page#
+#free(1.0)#
+Ein Menü bietet Ihnen dann folgende Auswahl:
+
++-----------------------------------------+
+i i
+i (1) Systemstart i
+i (2) Hintergrund vom Archiv laden i
+i (3) Hardwaretest i
+i (4) neuen Urlader vom Archiv laden i
+i i
++-----------------------------------------+
+
+Wählen Sie Menü-Punkt (2) "Hintergrund vom Archiv laden" und bestätigen Sie die
+Abfrage "Alten HG überschreiben?" mit "j".
+
+Das Laden des Hintergrundes kann einige Minuten in Anspruch nehmen. Sie werden
+mit der Meldung "Nächstes HG-Archiv eingelegt? (j/n)" zum Einlegen der Folgedisket­
+te(n) aufgefordert, was Sie anschließend mit der Eingabe von "j" quittieren.
+
+Es können bei beschädigten Disketten Lesefehler auftreten; dann gibt das System eine
+der Meldungen 'Harter Lesefehler' bzw. 'Softerror' aus. Bei letzterem könnte der ent­
+sprechende Sektor nach mehrmaligem Versuch noch gelesen werden. Bei einem
+harten Lesefehler können Sie die Diskette nicht verwenden. Bitte benachrichtigen Sie
+die Firma, von der Sie die Disketten erhalten haben.
+
+Wenn der Hintergrund eingelesen ist, erscheint die Aufforderung 'fertig, bitte RESET'.
+#on("b")#Vergessen Sie nicht#off("b")#, vor der Betätigung des Tastatur-RESET die Hintergrunddiskette
+aus dem Diskettenlaufwerk zu entfernen.
+
+Wenn Sie während des Hochfahrens keine Taste drücken, dann startet der Lader durch
+und das EUMEL-System meldet sich mit einer Tabelle von Geräteanpassungen:
+
++--------------------------------------------------------------------------+
+i i
+i psi transparent pc.1.25 pc.2.25 i
+i pc.3.25 pc.1.24 pc.2.24 pc.3.24 i
+i psi25 tandberg.2244s DEC.VT100.ascii DEC.VT100 i
+i DEC.VT220.ascii DEC.VT220.german FT10/20.german FT10/20.ascii i
+i ampex210.ascii ampex210.german ampex220.german ampex232 i
+i Wyse.WY50.ascii Wyse.WY50.german Wyse.WY60.german i
+i Wyse.WY120.german i
+i i
+i Kanal 1 (j/n) i
+i i
++--------------------------------------------------------------------------+
+
+Da unterschiedliche Tastaturen auch unterschiedliche Tastenbelegungen haben, ist es
+notwendig, mit Hilfe der Konfigurationstabelle Ihre Tastatur und Ihren Bildschirm an
+das EUMEL-System anzupassen. Dafür bietet Ihnen das System "Kanäle" an. #on("u")#Kanal 1#off("u")#
+entspricht dem Haupt-Terminal des Rechners, #on("u")#muß also auf jeden Fall konfiguriert
+werden#off("u")#. Beantworten Sie also die Frage "Kanal 1 (j/n)" mit "j".
+Das EUMEL-System funktioniert auch, wenn Sie zunächst nur Kanal 1 mit der Anpas­
+sung konfigurieren, die Ihrem Gerätetyp entspricht. Wenn Ihr Rechner eine AT-Tastatur
+hat, ist die korrekte Konfiguration "pc.1"; die Konfigurationen "pc.2" und "pc.3" decken
+die meisten der Rechner ab, deren Tastenbelegung von der Standard-AT Tastatur
+geringfügig abweicht. Die Erweiterung ".24" bzw. ".25" gibt die Anzahl der Bildschirm­
+zeilen wieder. Standardmäßig sind im SHard 24 Zeilen eingestellt.
+
+Weitere Kanäle zum Anschluß von Druckern oder weiteren Terminals können jederzeit
+bei Bedarf vorgenommen werden (EUMEL Systemhandbuch Teil 1).
+Die Anfrage nach der Konfiguration weiterer Kanäle kann deshalb verneint werden. Die
+Abfrage 'koennen unbenutzte Geraetetypen geloescht werden (j/n)' beantworten Sie
+einstweilen mit 'n'. Anschließend werden noch Datum und Uhrzeit abgefragt. Damit ist
+das Erstinstallationsprogramm abgeschlossen und es erscheint die Meldung 'mainten­
+ance :'. Geben Sie an dieser Stelle <ESC> <q> (nacheinander) ein. Sie haben damit
+die Task 'configurator' ordnungsgemäß verlassen. Erst damit ist sichergestellt, daß die
+eingestellte Konfiguration wirksam wird.
+
+
+Installation eines neuen Urladers
+
+Wenn Sie den alten Urlader mit einem neuen (z.B. protected mode) überschreiben
+wollen, starten Sie das EUMEL-System zunächst neu. Sobald die Meldung
+
+ #on("b")#Ladevorgang kann durch Tastendruck unterbrochen werden#off("b")#
+
+erscheint, drücken Sie eine beliebige Taste (z.B. ENTER). Auf dem Bildschirm er­
+scheint nun zusätzlich die Meldung
+
+ #on("b")#Ladevorgang unterbrochen, drücken Sie eine Taste um fortzufahren#off("b")#
+#page#
+Legen Sie nun die Diskette mit dem neuen Urlader in das Bootlaufwerk und drücken
+Sie wieder eine beliebige Taste. Danach werden folgende Meldungen auf dem Bild­
+schirm ausgegeben:
+
++-----------------------------------------------------+
+i i
+i EUMEL wird von Diskette geladen i
+i i
+i i
+i E U M E L - Vortest i
+i i
+i Terminals: 1 .... i
+i RAM-Groesse (gesamt): .... kB i
+i Pufferbereich: .... kB i
+i Hintergrund-Speicher .... kB i
+i i
+i Speichertest: ********** i
+i i
++-----------------------------------------------------+
+
+In der Zeit, in der die Sternchen des Speichertests erscheinen, drücken Sie bitte wieder
+die ENTER-Taste. Nach dem Speichertest erscheint dann folgendes Menü:
+
++-----------------------------------------------------+
+i i
+i (1) Systemstart i
+i (2) neuen Hintergrund vom Archiv laden i
+i (3) Hardwaretest i
+i (4) neuen Urlader vom Archiv laden i
+i i
++-----------------------------------------------------+
+
+Wählen Sie Menüpunkt 4 und auf dem Bildschirm erscheinen die folgenden Zeilen:
+
+#box("-0.1","0.0","8.0","1.0")#
+ \# xxx
+ fertig, bitte RESET
+
+wobei hinter dem \#-Zeichen die übertragenen Blöcke des neuen Urladers gezählt
+werden.
+
+Anschließend entfernen Sie bitte die Urladerdiskette aus dem Laufwerk und drücken
+den RESET-Schalter Ihres Rechners. Das EUMEL-Betriebssystem wird nun mit dem
+neuen Urlader gestartet.
+
+
+Tastenbelegung:
+
+EUMEL-Zeichen: Taste auf dem IBM-PC/AT
+
+ MARK : +--------+
+ i bild i (oder Pfeil nach oben)
+ +--------+
+
+ RUBIN : +--------+
+ i Einfüg i
+ +--------+
+
+ RUBOUT : +--------+
+ i Lösch i
+ +--------+
+
+ TAB : +--------+
+ i <= => i
+ +--------+
+
+ HOP : +--------+
+ i Pos 1 i
+ +--------+
+
+ ESC : +------------+
+ i Eing Lösch i
+ +------------+
+
+ SV : +------------+ +-------+
+ i CTRL g i oder i F1 i
+ +------------+ +-------+
+
+Bemerkung: Die CTRL-Taste kann auch mit STRG bezeichnet sein.
+
+Sollte die Tastaturbelegung noch nicht die EUMEL-spezifischen Tasten (HOP, MARK,
+SV, RUBIN, RUBOUT) an den entsprechenden Orten anbieten, können Sie durch
+Ankoppeln der Task "configurator" und Absetzen des Befehls "configurate" die Tastatu­
+ren (auch für zusätzlich angeschlossene Terminals) kanalweise umkonfigurieren. Nähe­
+res entnehmen Sie bitte dem Systemhandbuch, S.6ff.
+
+
+Zusatzprogramme
+
+Nachdem das System vollständig installiert ist, kann noch typspezifische Software
+eingespielt werden. Diese befindet sich auf der Diskette 'EUMEL-Archiv "AT" (bzw.
+"XT")'. Der folgende Ablauf skizziert schon das Prinzip jeder Arbeit in einem EUMEL-
+System: Task ankoppeln mit 'continue("taskname")' bzw. 'begin("taskname")', Eingabe
+von Kommandos wie 'edit', 'run' oder 'generate shutup dialog manager', abschließend
+Task abkoppeln durch <ESC> <q>. Eine ausführliche Beschreibung finden Sie in
+den EUMEL-Handbüchern.
+#page#
+Wenn Sie nach Einstellen des Kanals 1 die Task 'configurator' verlassen haben, befin­
+den Sie Sich auf Supervisor-Ebene. Um die auf der Diskette befindlichen Programme
+an der richtigen Stelle zu übersetzen, sind folgende Schritte notwendig:
+
+Drücken Sie die <SV>-Taste (F1). Damit landen Sie im Supervisor-Menü, dem
+Systemverteiler. Mit <ESC> <c> und Eingabe des Tasknamens 'SYSUR' (auf Groß­
+schreibung achten!) holen Sie die Task 'SYSUR' an das Terminal. Diese Task meldet
+sich mit 'maintenance:'. Da Sie mit einem Mehrbenutzersystem arbeiten, müssen Sie
+das Diskettenlaufwerk zunächst für sich reservieren: 'archive("AT")'. Erst dann können
+Sie Dateien von der Diskette holen: 'fetch("AT install",archive)' und das Installations­
+programm ausführen: 'run'. Der weitere Ablauf erfordert keine Eingriffe.
+
+Nach Ablauf der Programme sollten Sie schließlich eine besondere Task zum Abschal­
+ten einrichten. Dazu müssen Sie nocheinmal die Task 'SYSUR' an den Bildschirm
+holen und dort das durch die Zusatzsoftware (u.a.) neu hinzugewonnene Kommando
+'generate shutup dialog manager' geben. Nach Absetzen des Kommandos können Sie
+'SYSUR' durch <ESC> <q> wieder verlassen.
+
+Um menügesteuert das Betriebssystem abzuschalten oder einen Partitionswechsel
+vorzunehmen, steht Ihnen die Task 'shutup dialog' zur Verfügung. Bei Ausführung des
+Supervisor-Kommandos 'continue("shutup dialog")' wird Ihnen die aktuelle Partitions­
+tabelle angezeigt, so wie Sie diese bereits bei der Generierung kennengelernt haben,
+d.h. mit Angabe von Größe, Start- und Endzylinder der eingerichteten Partitionen. Sie
+können dann eine beliebige Partition menugesteuert auswählen und starten oder das
+Betriebssystem kontrolliert abschalten (sog. 'shutup'). Dabei wird der aktuelle System­
+zustand automatisch gesichert.
+
+
+Archivformate bei ATs und Kompatiblen mit zwei Diskettenlauf­
+werken:
+
+Standardmäßig ist der Archivkanal 31 an das Laufwerk 'A:' gebunden, das eine Kapazi­
+tät von 1,2 Megabyte besitzt. Ist jedoch bei Ihrem Gerät ein zweites Diskettenlaufwerk,
+z.B. mit einer Kapazität von 360 Kilobyte eingebaut, dann können Sie auf dieses Lauf­
+werk über den Kanal 30 zugreifen.
+
+Dazu richten Sie unter 'SYSUR' eine Task ein, die Sie z.B. 'ARCHIVE 360' benennen.
+Geben Sie in dieser Task das Kommando 'archive manager (30)'; dann können Sie von
+jeder Benutzertask das Archiv mit dem Kommando 'archive ("Archivname",/ "ARCHIVE
+360")' anmelden. Der Zugriff auf eine Diskette in diesem Laufwerk geschieht z.B. über
+'list(/"ARCHIVE 360")' oder 'save ("Dateiname",/"ARCHIVE 360")'. Eine andere Möglich­
+keit ist ein 3,5" Laufwerk.
+
+
+
+Die einzelnen Schritte der Installation im Überblick:
+
+
+ 1. Die Diskette 'SETUP-EUMEL' in das Laufwerk stecken.
+
+ 2. Rechner einschalten oder Tastatur-RESET
+
+ 3. EUMEL-Partition einrichten.
+
+ 4. Generierung beenden und auf 'ENDE'-Meldung warten.
+
+ 5. Diskette 'SETUP-EUMEL AT (XT)' entnehmen.
+
+ 6. Tastatur-RESET.
+
+ 7. Die Meldung 'Leider keine EUMEL-0-Maschine gefunden' abwarten.
+
+ 8. Hintergrunddiskette ('HG0') einlegen und Taste drücken.
+
+ 9. Nach der Meldung 'HG-ungültig' eine Taste betätigen, um in den Startdialog zu
+ gelangen.
+
+ 10. Menupunkt 2 anwählen: Neuen Hintergrund vom Archiv laden. Hintergrunddis­
+ kette einlegen und 'Alten HG überschreiben?' mit "j" quittieren. Folgedisketten
+ einlegen, sobald entsprechende Meldung ("weiterer Archivträger eingelegt?")
+ erscheint, und "j" eingeben.
+
+ 11. Hintergrunddiskette entnehmen und anschließend Tastatur-RESET ausführen.
+
+ 12. Kanal 1 konfigurieren.
+
+
+
+#ib(9)#1.3. Ausführliche Beschreibung#ie(9)#
+
+
+#ib##ib(9)#System laden#ie##ie(9)#
+
+
+Wie Sie in der Installationsanleitung lesen konnten, geht man beim Systemstart durch
+Eingabe eines Zeichens während des Vortests in das Startmenü und wählt dort "Hin­
+tergrund vom Archiv laden" an. Falls der zu ladende Hintergrund sich über mehrere
+Archiv-Disketten erstreckt, werden die folgenden sukzessive angefordert.
+
+
+
+
+#ib##ib(9)#System sichern#ie##ie(9)#
+
+
+Der aktuelle eigene Hintergrund läßt sich (mit allen Tasks und allen Dateien) durch das
+Kommando
+
+ #ib#save system#ie#
+
+auf Archivdisketten sichern. Dabei wird der Systemzustand zunächst über einen Fix­
+punkt gesichert. Anschließend werden #on("b")##on("i")#formatierte#off("i")##off("b")# Disketten angefordert. Der Hinter­
+grund wird komprimiert gesichert, d.h. nur die belegten Blöcke werden auf das Archiv
+geschrieben.
+
+#on("i")#Anmerkung: Diese Prozedur kann nur von privilegierten Tasks (Nachfahren von
+ "SYSUR"), wie dem OPERATOR, aufgerufen werden.
+ Vor dem Aufruf von 'save system' sollten Sie genügend Disketten for­
+ matiert haben (Überprüfen Sie mit 'storage info', wieviele Disketten Sie
+ benötigen, um den gesammten Hintergrund darauf zu schreiben). #off("i")#
+
+
+
+
+#ib(9)#System gegen Unbefugte schützen#ie(9)#
+
+
+Falls der Benutzerkreis eines Multi-User-Systems nicht "gutartig" ist, sollte man verhin­
+dern, daß jeder Benutzer des Systems Zugang zu #ib#privilegierten Operationen#ie# hat, wie
+Löschen anderer Tasks, Konfiguration ändern und System sichern.
+
+Dies erreichen Sie dadurch, daß Sie #on("b")#alle#off("b")# privilegierten Tasks, das sind 'SYSUR' und alle
+Söhne, Enkel usw. von 'SYSUR', durch #ib#Paßworte#ie# schützen. Damit wird der Zugang zu
+diesen Tasks nur möglich, wenn man das entsprechende Paßwort eingibt. Man de­
+finiert solche #on("i")##on("b")##ib#Task-Paßworte#ie##off("i")##off("b")#, indem man die zu schützende Task mit Hilfe des Super­
+visor-Kommandos "continue" an ein Terminal holt und dann das Kommando
+
+ #ib#task password#ie# ("simsalabim")
+
+gibt. Dabei ist "simsalabim" nur ein Beispiel. Bitte verwenden Sie ein anderes Paß­
+wort! Da die Eigenschaft, privilegiert zu sein, nur davon abhängt, im "SYSUR"-Zweig
+(und nicht im normalen "UR"-Zweig) des Systems zu sein, könnte sich ein gewitzter
+Anwender die Privilegierung einfach erschleichen, indem er eine neue Sohntask von
+"SYSUR" einrichtet. Um auch diese Möglichkeit zu unterbinden, sollte man in #on("b")#jeder#off("b")#
+Task des SYSUR-Zweiges ebenfalls ein #on("i")##on("b")#"begin"-Paßwort#off("i")##off("b")# definieren. Das geschieht mit
+dem Kommando
+
+ #ib#begin password#ie# ("simsalabim")
+
+Bei der Wahl der Paßworte sollte man folgendes bedenken:
+
+ - Ein zu kurzes oder offensichtliches Paßwort (beispielsweise der Name des
+ Systemverwalters) wird von "Hackern" schnell herausgefunden.
+
+ - Oft werden Paßworte bekannt, weil irgendwo ein Zettel mit den Paßworten
+ herumliegt.
+
+ - Der Paßwortschutz ist hart. Wenn man sein Paßwort vergessen hat, gibt es
+ keinen Zugang mehr zu der geschützten Task.
+
+
+
+Beschreibung der Paßwortprozeduren:
+
+#ib#task password#ie#
+ PROC task password (TEXT CONST password)
+ Zweck: Einstellen eines Paßwortes für eine Task im Monitor.
+
+#ib#begin password#ie#
+ PROC begin password (TEXT CONST password)
+ Zweck: Verhindert das unberechtigte Einrichten einer Sohn-Task.
+ Anmerkung: Das 'begin password' vererbt sich auf die später erzeugten Sohn-
+ Tasks.
+
+#ib#family password#ie#
+ PROC family password (TEXT CONST password)
+ Zweck: Setzt oder ändert das Paßwort derjenigen Familienmitglieder, die kein
+ Paßwort oder das gleiche Paßwort wie die aufrufende Task haben.
+ Zu einer Familie gehören die Task in der man sich befindet und die ihr
+ untergeordneten Tasks.
+ Bsp.: Das Kommando 'family password ("EUMEL")' wird in SYSUR
+ gegeben. Dadurch wird das SYSUR-Paßwort und die Paßworte
+ der entsprechenden Tasks unter SYSUR auf "EUMEL" gesetzt.
+
+
+
+#ib##ib(9)#Konfiguration#ie##ie(9)#
+
+Die #ib#Konfiguration#ie# läuft über die Task "#ib#configurator#ie#" ab. Diese Task müssen Sie also für
+die hier aufgeführten Operationen durch das Supervisor-Kommando "continue" an­
+koppeln (Dabei wird das Paßwort überprüft, falls die Task geschützt wurde).
+
+#on("i")#Anmerkung: Man kann die Task "configurator" löschen und dann neu (als Sohn, En­
+ kel,... von SYSUR) wieder einrichten. Danach holt man die Konfigura­
+ tionsdatei (z.B. von std.devices) und gibt das Kommando "#ib#configuration
+ manager#ie#".#off("i")#
+
+
+Der in der Einführung unter "Wie Sie die Konfiguration einstellen" beschriebene Konfi­
+gurationsdialog läßt sich vermittels des Kommandos
+
+ #ib#configurate#ie#
+
+aufrufen. Dabei wird für jeden angewählten Kanal die bis jetzt gültige Einstellung als
+Vorschlag mit ausgegeben. Die Einstellung aller Kanäle, die nicht angesprochen wer­
+den, bleibt unverändert.
+
+Im Menü werden die Namen aller Dateien mit #ib#Gerätetabellen#ie# aufgeführt, die in der
+Task enthalten sind. Daraus folgt, daß nur noch die bei der letzten Konfigurierung
+benutzten Typen aufgeführt werden, wenn vorher auf die Frage "Koennen unbenutzte
+Geraetetypen geloescht werden (j/n)?" mit "j" geantwortet wurde. Löschen Sie also
+nicht alle unbenutzten Gerätetypen, wenn Sie sie später evtl. nochmal bruachen (siehe
+auch "Teil 2, 3. Kanäle und Konfigurierung").
+
+Im Konfigurationsdialog kann folgendes eingestellt werden:
+
+ #ib#Typ#ie# Es werden alle vorhandenen Gerätetabellen durchgegangen, bis
+ eine davon ausgewählt wurde. Diese manchmal etwas langwierige
+ Arbeit kann man durch Eingabe des Zeichens ESC abkürzen:
+ Danach kann man den Typnamen direkt eingeben. #on("i")#Das funktioniert
+ aber nur vernünftig, wenn das eigene Arbeitsterminal bereits richtig
+ konfiguriert worden ist!#off("i")#
+
+ #ib#Baudrate#ie# (nur für V.24-Kanäle von Bedeutung) Es werden alle einstellbaren
+ Baudraten durchgegangen, bis eine davon ausgewählt wurde. Das
+ sind die Werte 50, 75, 110, 134.5, 150, 300, 600, 1200, 1800, 2400,
+ 3600, 4800, 7200, 9600, 19200, 38400 Baud.
+
+ #ib#Bits#ie# (nur für V.24-Kanäle von Bedeutung) Es werden die einstellbaren
+ Zeichengrößen durchgegangen, d.h. 7 oder 8 Bit pro Zeichen.
+
+ #ib#Parität#ie# (nur für V.24-Kanäle von Bedeutung) Möglich sind die Einstellun­
+ gen 'no', 'even' und 'odd'.
+
+ #ib#Stopbits#ie# (nur für V.24-Kanäle von Bedeutung) Stopbits geben die Pause
+ zwischen zwei aufeinanderfolgenden Zeichen an. Möglich sind 1
+ oder 2 Stopbits.
+
+
+ #ib#Protokoll#ie# Terminals u.ä. werden üblicherweise ohne Protokoll angeschlossen.
+ Bei langsamen Geräten wie Druckern bzw. Plottern oder aber bei
+ Rechnerkopplungen bzw. Netzen kann der Empfänger nicht immer
+ so schnell Zeichen annehmen wie sie von der Gegenstation gesen­
+ det werden. In diesem Fall kann man das #ib#XON/XOFF-#ie# oder das
+ #ib#RTS/CTS-Protokoll#ie# einstellen.
+ #on("b")#BEACHTE: Sender und Empfänger müssen auf das gleiche Proto­
+ koll eingestellt sein.#off("b")#
+
+ Manchmal müssen auch Terminals mit Protokoll angeschlossen
+ werden. Üblicherweise wählt man dann aber ein rein ausgabe­
+ seitiges Protokoll, damit SV den EUMEL auf jeden Fall erreicht.
+ Es gibt folgende Protokolle:
+
+ #ib#XON/XOFF-Protokoll#ie#:
+ Rechner und Gerät steuern die Sendungen jeweils über
+ XON/XOFF-Zeichen.
+ #ib#RTS/CTS-Protokoll#ie#:
+ Rechner und Gerät steuern ihre Sendungen jeweils über
+ RTS/CTS- Leitungen.
+ #ib#XON/XOFF-ausgabeseitig#ie#:
+ Das angeschlossene Gerät steuert die Ausgabe über
+ XON/XOFF.Eingaben zum Rechner unterliegen keinem
+ Protokoll.
+ #ib#RTS/CTS-ausgabeseitig#ie#:
+ Das angeschlossene Gerät steuert die Ausgabe über
+ RTS/CTS. Eingaben zum Rechner unterliegen keinem
+ Protokoll.
+ #ib#XON/XOFF-eingabeseitig#ie#:
+ Der EUMEL-Rechner steuert die angeschlossenen
+ Geräte durch XON/XOFF. Die Ausgaben zum Gerät
+ unterliegen keinem Protokoll.
+ #ib#RTS/CTS-eingabeseitig#ie#:
+ Der EUMEL-Rechner steuert die angeschlossenen
+ Geräte durch RTS/CTS. Die Ausgaben zum Gerät unter­
+ liegen keinem Protokoll.
+
+ #ib#Puffer#ie# Terminals und alle Ausgabegeräte (Drucker u.ä.) haben standard­
+ mäßig die normalen "kleinen" Eingabepuffer im System zugeord­
+ net. Bei Rechner-Rechner-Kopplungen, DFÜ oder Netzen kann ein
+ "großer" #ib#Eingabepuffer#ie# von 512 Byte notwendig werden. Dement­
+ sprechend sind #ib#Großpuffer#ie# nur beim Schnittstellentyp 'transparent'
+ möglich.
+
+Im #ib#Konfigurationsdialog#ie# werden bei jedem Kanal nur die dort vorhandenen Möglich­
+keiten angeboten. Dabei wird die vorherige Einstellung immer als erste angeboten. So
+kann man sich verhältnismäßig einfach "durchtasten".
+
+Die Fragen des #ib#Konfigurationsdialog#ie#s werden nach folgendem Schema gestellt:
+
+#linefeed(1.18)#
+ erfrage ("Kanal") ;
+ erfrage ("Typ") ;
+ IF dieses ist ein v24 kanal
+ THEN IF baudrate einstellbar
+ THEN erfrage ("Baudrate")
+ FI ;
+ IF zeichengroesse einstellbar
+ THEN erfrage ("Bits")
+ FI ;
+ IF parität einstellbar
+ THEN erfrage ("Parität")
+ FI ;
+ IF stopbits einstellbar
+ THEN erfrage ("Stopbits")
+ FI ;
+ FI ;
+ erfrage ("Protokoll") ;
+ IF typ ist tranparent
+ THEN erfrage ("Puffer")
+ FI.
+
+#linefeed(1.0)#
+Will man seine eingestellte #ib#Konfiguration sichern#ie#, reicht es, alle Dateien der Task
+"#ib#configurator#ie#" auf ein Archiv zu schreiben. Diese Konfiguration kann man dann bei
+einem neuen Hintergrund einfach vom Archiv laden. Um die Konfigurierung dann auch
+auszuführen, gibt man das Kommando "setup".
+
+
+
+
+#ib##ib(9)#Druckersoftware einrichten#ie##ie(9)#
+
+
+
+Das Standardarchive "std.printer" enthält einige Druckeranpassungen für die Ansteu­
+erung diverser Druckertypen. Soll einer dieser Druckertypen an das EUMEL-System
+angeschlossen werden, so muß zuerst eine Task "#ib#PRINTER#ie#" (als Sohntask von
+"SYSUR" mit dem Supervisorkommando) vorhanden sein bzw. durch
+
+
+ begin ("PRINTER", "SYSUR")
+
+
+eingerichtet werden. In dieser Task müssen dann die folgenden Schritte vollzogen
+werden:
+
+- Anmelden des Archivs:
+
+ archive ("std.printer")
+
+
+- Holen der Druckeranpassung vom Archiv:
+
+ fetch ("druckertyp.inserter", archive)
+
+
+- Insertieren der Druckeranpassung:
+
+ insert ("druckertyp.inserter")
+
+
+
+Beispiel:
+ archive ("std.printer")
+ fetch ("laser.inserter", archive);
+ check off;
+ insert ("laser.inserter")
+
+
+Nach Beendigung der Kompilierung finden Sie sich in einem Menü wieder, daß Ihnen
+die Auswahl Ihres Drucker-Herstellers durch die Eingabe der vor dem Firmennamen
+stehenden Zahl erlaubt. Diese Eingabe schicken Sie mit RETURN ab. Da Hersteller
+mitunter verschiedene Modelle mit verschiedenen Funktionen anbieten, ist es nötig,
+daß Sie Ihr Modell auswählen. Auch diese Eingabe wird durch RETURN abgeschickt.
+Nachdem Sie die Nummer des gewünschten Druckers eingegeben haben, erfolgt noch
+einmal eine Sicherheitsabfrage, ob dieser Drucker installiert werden soll.
+
+Neben den speziell zu dem gewählten Drucker passenden Fragen (z.B. NLQ-Modus
+standardmäßig) ist es erforderlich, den Kanal einzugeben, an dem der Drucker ange­
+schlossen ist (z.B. Kanal 15 für eine parallele Schnittstelle).
+
+Wenn die Generierung beendet ist, muß in allen bestehenden Tasks - insbesondere in
+der Task 'PUBLIC' - die Fonttabelle mit dem fonttable-Kommando eingestellt werden.
+Mit dem Kommando
+
+
+ print ("dateiname")
+
+
+wird dann eine Datei ausgedruckt.
+
+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 Druck­
+kopfes 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. Für eine bessere Ansteuerung des
+Drucker muß ein Programm geschrieben werden, das das Druckertreiber-Interface
+erfüllt (siehe Teil 6 "Der EUMEL-Drucker") und eine Fonttabelle erstellt (siehe Teil 7 "Der
+Fontspeicher") werden.
+#page#
+#headeven#
+
+%#center#EUMEL-Systemhandbuch
+
+
+#end#
+#headodd#
+
+#center#2. Hardware und ihre Steuerung#right#%
+
+
+#end#
+
+
+#ib(9)#2. Hardware und ihre Steuerung#ie(9)#
+
+
+
+
+#ib(9)#2.1. Vorwort#ie(9)#
+
+
+Die #ib#Hardware#ie# eines jeden EUMEL-Systems läßt sich in #ib#Rechnerkern#ie# und Peripherie
+einteilen.
+
+
+a) Der #ib#Rechnerkern#ie#
+
+
+In der Regel wird der Rechnerkern aus folgenden Komponenten bestehen:
+
+ - #ib#CPU#ie#
+ - #ib#Vordergrundspeicher#ie# (oft als RAM bezeichnet)
+ - #ib#Hintergrundspeicher#ie# (Floppy, Harddisk, oder auch RAM/ROM)
+
+Alle Daten, Dateien und Programme werden auf dem Hintergrundspeicher abgelegt.
+Der benötigte Platz wird dabei dynamisch nach Bedarf zugewiesen. Jeder Zugriff auf
+Daten, die sich auf dem Hintergrundspeicher befinden, muß über den Vordergrund­
+speicher erfolgen. Zu diesem Zweck verlagert das EUMEL-System automatisch alle
+aktuell benötigten Daten in den Vordergrundspeicher. Das erfolgt nach dem Prinzip
+des #ib#Demand-Paging#ie# (s. Benutzerhandbuch Kap. 1). Die CPU führt die aktiven Pro­
+gramme (unter Benutzung des Speichers) aus. Dabei bearbeitet sie reihum alle re­
+chenwilligen Prozesse.
+Die drei Komponenten des Rechnerkerns werden vollständig vom EUMEL-Betriebs­
+system verwaltet und miteinander verknüpft, so daß der Anwender sich in der Regel
+darum weder kümmern muß noch kann. Ausgenommen davon sind allerdings die
+Diagnose von Hardwarefehlern und Überlegungen zur Systemleistung.
+
+
+b) Die #ib#Peripherie#ie#
+
+
+Alle anderen Geräte oder Gerätekomponenten gehören aus der Sicht des EUMEL-
+Systems zur Peripherie. Wesentliches Kennzeichen ist, daß sie über Kanäle mit dem
+Rechnerkern verbunden sind und von dort aus durch System- und Anwender­
+programm gesteuert werden können. Angeschlossen werden können u.a.
+
+ - #ib#Terminal#ie#s
+ - #ib#Drucker#ie# und #ib#Plotter#ie#
+ - andere #ib#Rechner#ie# bzw. #ib#Rechnernetze#ie#
+ - #ib#Archivgerät#ie#e (z.B. Floppy-Laufwerke)
+
+In der Regel hat jedes EUMEL-System mindestens ein #ib#Terminal#ie# und #ib#Archivlaufwerk#ie#.
+Auch wenn dieses "Terminal 1" und das Floppy-Laufwerk baulich in den Rechner
+integiert sind, gehören sie logisch zur Peripherie. Die entsprechenden Kanäle sind
+dann allerdings Teil des Rechners und brauchen den Anwender nicht zu interessie­
+ren. Die beiden wesentlichen anderen Kanaltypen sind:
+
+ - #ib#serielle Schnittstelle#ie#n (#ib#V.24#ie#)
+ - #ib#Parallelschnittstellen#ie#
+
+Beide führen "echt" aus dem Rechner heraus und sind u.U. hardwaremäßig für den
+Anwender von Bedeutung. Normalerweise sollte zwar der Lieferant der EUMEL-
+Hardware für die Verkabelung und den Anschluß peripherer Geräte sorgen, aber
+Kenntnisse können in Fehlersituationen (z.B. Kabelbruch), bei Umkonfigurierungen
+und bei Kombinationen verschiedener Geräte helfen.
+
+
+
+
+#ib(9)#2.2. #ib#Hardware-Test#ie##ie(9)#
+
+
+
+Der EUMEL-Hardware-Test ist ein rechnerunabhängiger Test und kann demzufolge
+nicht so viel überprüfen wie Testprogramme, die genau auf eine entsprechende Hard­
+ware zugeschnitten sind. Trotzdem sollten die meisten Hardware-Fehler schon mit
+dem EUMEL-#ib#Hardware-Test#ie# gefunden werden.
+
+Bei jedem Systemstart wird der "#ib#Vortest#ie#" durchgeführt. Nachdem er Terminals, Spei­
+cher und Hintergrund angezeigt hat, testet er einmal den Hauptspeicher. Danach wird
+das eigentliche EUMEL-System gestartet.
+
+
+Durch Eingabe eines beliebigen Zeichens während des Vortests (Speichertest:
+*********) kommt man in den ausführlichen #ib#Start-Dialog#ie#. Dort wird u.a. auch die
+Möglichkeit "Hardware-Test" angeboten. Wählt man diese an, werden die verfügbaren
+Tests als Menü aufgelistet. Bei jedem EUMEL-System stehen folgende Testmöglichkei­
+ten zur Verfügung:
+
+ (1) #ib#Speichertest#ie#
+ (2) #ib#Kanaltest#ie#
+ (3) #ib#Hintergrundtest#ie#
+ (4) #ib#Archivtest#ie#
+
+Alle Tests sind dabei Dauertests, d.h. sie beginnen nach jedem Durchlauf von neu­
+em, können aber durch <ESC> abgebrochen werden.
+
+
+
+
+
+#ib##ib(9)#Speichertest#ie##ie(9)#
+
+
+Der #ib#Speichertest#ie# soll den Vordergrundspeicher (#ib#RAM#ie#) des Rechners untersuchen.
+Gerade #ib#Speicherfehler#ie# tendieren aber dazu, nur sporadisch aufzutreten oder wär­
+meabhängig zu sein. Deshalb sollte der Test bei Verdacht auf Speicherfehler längere
+Zeit (einige Stunden) laufen. Leider können auch dann nicht alle Fehler aufgedeckt
+werden, z.B. nicht solche, die nur in ganz speziellen Situationen entstehen, wie Spei­
+cherzugriff mit gleichzeitig anlaufendem Floppymotor und Zeichenausgabe. Generell
+gilt hier (wie für jeden Test), daß das Nichtvorhandensein von Fehlern nie Vollkommen
+sicher nachgewiesen werden kann.
+
+Der Speichertest teilt den Speicher in drei verschiedene Bereiche auf:
+
+ 0 : adresse MOD 3 = 0
+ 1 : adresse MOD 3 = 1
+ 2 : adresse MOD 3 = 2
+
+Der freie Speicher wird nach folgendem Algorithmus geprüft:
+
+ schreibe (1, OLOLOLOL) ; out ("*") ;
+ schreibe (2, OLOLOLOL) ; out ("*") ;
+ schreibe (0, LOLOLOLO) ; out ("*") ;
+ pruefe (1, OLOLOLOL) ; out ("*") ;
+ schreibe (1, LOLOLOLO) ; out ("*") ;
+ pruefe (2, OLOLOLOL) ; out ("*") ;
+ pruefe (0, LOLOLOLO) ; out ("*") ;
+ pruefe (1, LOLOLOLO) ; out ("*") ;
+ schreibe (0, OLOLOLOL) ; out ("*") ;
+ pruefe (0, OLOLOLOL) ; out ("*") ;
+ schreibe (2, LOLOLOLO) ; out ("*") ;
+ pruefe (2, LOLOLOLO) ; out ("*") .
+
+
+Dabei werden durch 'PROC schreibe (INT CONST bereich, BYTE CONST muster)' alle
+Bytes des entsprechenden Bereichs mit dem angegebenen Muster geladen. 'PROC
+pruefe (INT CONST bereich, BYTE CONST soll)' überprüft entsprechend alle Bytes des
+Bereichs darauf, ob sie das Sollmuster enthalten.
+
+Findet der Speichertest Fehler, können u.a. folgende Ursachen vorliegen:
+
+ - Ein Speicherchip ist defekt.
+
+ - Die Versorgungsspannung für den Speicher (meistens +5V) ist zu niedrig,
+ d.h. das Netzteil ist nicht richtig eingestellt bzw. defekt. (Das kann insbeson­
+ dere dann entstehen, wenn ein Rechner so "hochgerüstet" wurde, daß das
+ Netzteil nachgeregelt werden müßte.)
+
+ - Die Kontakte der Speicherkarten sind locker oder oxidiert.
+
+ - Die Speicheransteuerung ist defekt.
+
+
+
+
+
+#ib##ib(9)#Kanaltest#ie##ie(9)#
+
+
+Beim #ib#Kanaltest#ie# werden fortlaufend auf allen #ib#Terminalkanälen#ie# (außer auf Terminal 1)
+die jeweiligen Kanalnummern in der Form "Kanal: n" ausgegeben. Jedes Eingabe­
+zeichen wird in dezimaler Verschlüssung unter Angabe der Kanalnummer auf dem
+Terminal 1 gemeldet.
+
+Mit Hilfe dieses Tests können u.a. Kabel und Geräteeinstellungen überprüft werden.
+Mögliche Fehlerursachen:
+
+ - falsche #ib#Baudrate#ie# eingestellt
+
+ Symptome: Bei Aus- und Eingabe werden vollkommen unsinnige Zeichen
+ angeliefert.
+ Abhilfe: Baudrate am Endgerät oder am Rechner richtig einstellen.
+
+ - falsche #ib#Parität#ie# eingestellt
+
+ Symptome: Einige Zeichen werden richtig übertragen, andere verfälscht. In
+ einigen Fällen können auch alle Zeichen falsch übertragen wer­
+ den.
+ Abhilfe: Parität am Endgerät oder am Rechner richtig einstellen.
+
+ - falsches #ib#Kabel#ie# (z.B. Sende- und Empfangsleitungen fälschlich gekreuzt bzw.
+ nicht gekreuzt, Kabel ohne Flußkontrolle an Schnittstelle mit
+ Flußkontrolle, V.24-Kabel an Parallelschnittstelle oder umge­
+ kehrt):
+
+ Symptome: Keine Ausgabe, keine Eingabe oder andauernder Strom von
+ "Schrottzeichen".
+ Abhilfe: richtiges Kabel nehmen oder Kabel korrigieren.
+
+ - defektes Kabel (Kabelbruch, defekter Stecker o.ä.)
+
+ Symptome: beliebig.
+ Testmöglichkeit: Kabel wechseln.
+
+ - defektes #ib#Endgerät#ie#
+
+ Symptome: beliebig.
+ Testmöglichkeit: Anderes Gerät mit gleicher Einstellung (Baudrate, Parität
+ usw.) anschließen.
+
+ - defekte #ib#Schnittstelle#ie# im Rechner
+
+ Symptome: beliebig
+ Testmöglichkeit: Endgerät mit gleichem Kabel an eine andere Schnittstelle
+ am Rechner anschließen (dazu evtl. die Geräteparameter
+ wie Baudrate anpassen).
+
+
+
+
+
+#ib##ib(9)#Hintergrundtest#ie(9)##ie#
+
+
+Zur Überprüfung des #ib#Hintergrund#ie#es werden drei Tests angeboten:
+
+ (1) #ib#Lesetest#ie#
+ (2) #ib#Lese-/Schreibtest#ie#
+ (3) #ib#Positioniertest#ie#
+
+
+Der #ib##on("i")##on("b")#Lesetest#off("i")##off("b")##ie# prüft, ob alle für EUMEL verfügbaren Blöcke auf der Platte bzw. Floppy
+lesbar sind. Dabei wird der Blockinhalt nicht inspiziert. Sowohl behebbare (soft) als
+auch harte #ib#Lesefehler#ie# werden gemeldet. Der Bediener kann einen Korrekturversuch
+durch Rückschreiben veranlassen. Bei einem #ib#Soft-Error#ie# (Block konnte nach mehreren
+Versuchen doch gelesen werden) wird der gelesene Block neu geschrieben. Der Fehler
+kann jetzt ohne negative Folgen behoben sein, bei defekter Hardware aber auch zu
+Folgefehlern führen.
+Als Korrekturversuch bei harten Fehlern wird ein mit 'FFFD' gefüllter Block geschrie­
+ben. Wird ein solcher Block später vom EUMEL gelesen und als Code angesehen, führt
+das zur Fehlermeldung "#ib#code block unreadable#ie#". Wird FFFD als INT angesehen, liefert
+es den Wert -3, bei REAL oder TEXT können keine Vorhersagen gemacht werden.
+
+
+Bei dem #ib##on("i")##on("b")#Schreib-/Lesetest#off("i")##off("b")##ie# wird jeder Block mit mehreren Bitmustern beschrieben und
+zur Kontrolle wieder gelesen. Der alte Inhalt wird vor dem Test gesichert und nachher
+wieder in den Block geschrieben.
+
+ #on("b")#Achtung: Normalerweise zerstört der Test den EUMEL-Hintergrund nicht. Bei
+ defekter Platte können allerdings Blöcke durch mißlungenes Rück­
+ schreiben zerstört werden. #off("b")#
+
+
+Der #ib##on("i")##on("b")#Positioniertest#off("i")##off("b")##ie# arbeitet ähnlich wie die Leseprüfung. Allerdings wird in der Reihen­
+folge 0, 1, 0, 2, 0, 3, ... gelesen, so daß die Platte für jeden Lesevorgang positionieren
+muß.
+
+ #on("b")#Achtung: Wegen der harten Plattenbelastung sollte dieser Test nicht zu lange
+ laufen.#off("b")#
+
+
+
+
+
+#ib##ib(9)#Archivtest#ie##ie(9)#
+
+
+Der Archivtest arbeitet ähnlich wie der Hintergrundtest - allerdings auf dem Archiv. Er
+kann sowohl zur Überprüfung von Archiv-Datenträgern (#ib#Lesetest#ie#) als auch zum Test
+des #ib#Archivlaufwerks#ie# benutzt werden.
+
+
+
+
+
+#ib(9)#2.3. #ib#Serielle Geräteschnittstelle#ie##ie(9)#
+
+
+#ib##ib(9)#Pinbelegung und Kabel#ie(9)##ie#
+
+
+#on("b")##on("i")#Anmerkung: Dieses Kapitel ist nur für solche Anwender von Bedeutung, die sich selbst
+ mit der Verkabelung ihrer Geräte befassen.#off("i")##off("b")#
+
+Im folgenden werden die wichtigsten Leitungen der offiziellen #ib#V.24-Schnittstelle#ie# (#ib#seriel­
+le Schnittstelle#ie# zum Anschluß von Terminals, Druckern, Fremdrechnern u.ä.) beschrie­
+ben:
+
+ Pin Betriebsrichtung Bedeutung
+
+ 2 out Sendedaten
+ 3 in Empfangsdaten
+
+ 4 out Sendeaufforderung (RTS)
+ 5 in Empfangsbereitschaft (CTS)
+
+ 7 Signalerde
+
+ 8 in Gegenstation bereit (DCD)
+
+ 20 out eigene Station bereit (DTR)
+
+
+Dabei dient das Paar (2,3) zur Übertragung der Daten, mit Hilfe von (4,5) ist #ib#Flußkon­
+trolle#ie# möglich (z.B. kann ein Drucker damit Sendungen vom Rechner "verlangsamen").
+Das Paar (8,20) wird bei manchen Geräten und Rechnern benutzt, um festzustellen, ob
+die Gegenstation eingeschaltet ist.
+
+
+Die meisten Rechner haben die gleiche #ib#Pinbelegung#ie# wie oben aufgeführt. Die Kabel
+müssen dann die folgenden #ib#Pin#ie#s verbinden:
+
+
+Rechner 2 3 4 5 7 8 20 Vollständige Verbindung mit Flußkontrolle.
+
+Gerät 2 3 4 5 7 8 20
+
+
+Rechner 2 3 4 5 7 Reicht für die meisten Anschlüsse mit Flußkontrol­
+ le, z.B. Rechnerkopplung.
+Gerät 2 3 4 5 7
+
+
+Rechner 2 3 5 7 Reicht für die meisten Drucker, Flußkontrolle nur
+ einseitig vom Drucker zum Rechner.
+Gerät 2 3 4 7
+
+
+Rechner 2 3 7 Reicht meistens für Terminals, Flußkontrolle ist
+ dabei überflüssig.
+Gerät 2 3 7
+
+
+Rechner 2 3 4 5 7 Manchmal für Terminals. Rechnerseitig wird Fluß­
+ kontrolle durch die Brücke 4-5 simuliert.
+Gerät 2 3 7
+
+
+Bei manchen Rechnern werden die notwendigen paarweisen Vertauschungen schon
+im Rechner durchgeführt. Es ergibt sich entsprechend:
+
+
+Rechner 2 3 4 5 7 8 20 Vollständige Verbindung mit Flußkontrolle.
+
+Gerät 2 3 4 5 7 8 20
+
+
+Rechner 2 3 4 5 7 Einfacher Anschluß mit Flußkontrolle.
+
+Gerät 2 3 4 5 7
+
+
+Rechner 2 3 4 7 Drucker, einseitige Flußkontrolle.
+
+Gerät 2 3 4 7
+
+
+Rechner 2 3 7 Terminal.
+
+Gerät 2 3 7
+
+
+Rechner 2 3 4 5 7 Terminal mit simulierter Flußkontrolle.
+
+Gerät 2 3 7
+
+
+
+
+
+
+
+#ib(9)#2.4. #ib#Kanäle#ie# und #ib#Konfigurierung#ie##ie(9)#
+
+
+
+Im EUMEL-System dienen #ib#Kanäle#ie# zur Kommunikation mit der Außenwelt, d.h. Kanäle
+sind Verbindungen vom Rechner zu peripheren Geräten wie Terminals, Drucker, Plotter
+und Archiv. Kanäle können für zeichen- und #ib#blockorientierte Ein-/Ausgabe#ie# verwendet
+werden. Ein Kanal heißt #ub##ib#privilegiert#ie(1,"er Kanal")##ue#, wenn er nur von privilegierten Systemtasks (Nach­
+kommen des Supervisors) benutzt werden kann.
+
+#ib#Kanalaufteilung#ie#:
+
+ Kanal Bedeutung
+
+ 1 zeichenorientiert, blockorientiert
+ Dieser Kanal muß mit einem Terminal verbunden sein, da
+ über ihn der Systemstart erfolgt.
+ 2-16 zeichenorientiert, blockorientiert
+ Diese Kanäle werden für weitere Terminals, Drucker, Plot­
+ ter, Rechnerkopplung usw. verwandt.
+
+ 15-23 blockorientiert
+
+ 24-30 blockorientiert, privilegiert
+
+ 31 blockorientiert, privilegiert
+ Dieser Kanal ist der #ib#Standardkanal des Archivsystems#ie#, d.h.
+ üblicherweise wird darüber die Archivfloppy angesprochen.
+
+ 32 blockorientiert, privilegiert
+ Dieses ist ein #ib#interner Kanal#ie#, an den kein externes Gerät
+ angeschlossen werden kann. Er wird zur Konfigurierung
+ der anderen Kanäle benutzt.
+
+Der Supervisor des EUMEL-Systems verwaltet die Kanäle. Jeder Task ist dabei kein
+oder genau ein Kanal zugeordnet. Entsprechend ist jedem Kanal keine oder genau
+eine Task zugeordnet. Solche Zuordnungen können von außen durch den Benutzer
+(nur bei interaktiven Kanälen) über die SV-Kommandos bzw. Prozeduraufrufe 'conti­
+nue' und 'break' (s. Kap. 5) verändert werden. In jedem Fall überprüft der Supervisor
+die Zugriffsberechtigung.
+
+
+
+
+
+#ib##ib(9)#Zeichenorientierte Ein-/Ausgabe#ie##ie(9)#
+
+
+Zeichenorientierte Ein-/Ausgabe kann auf den Kanälen 1 bis 16 benutzt werden. Dafür
+stehen die Basisoperationen
+
+ PROC #ib#out#ie# (TEXT CONST text)
+ PROC #ib#outsubtext#ie# (TEXT CONST source,
+ INT CNST from)
+ PROC outsubtext (TEXT CONST source,
+ INT CONST from, to)9
+ PROC #ib#cursor#ie# (INT CONST x, y)
+ PROC #ib#inchar#ie# (TEXT VAR char)
+ TEXT PROC #ib#incharety#ie#
+ TEXT PROC incharety (INT CONST time limit)
+ PROC #ib#get cursor#ie# (INT VAR x, y)
+
+und alle darauf aufbauenden Operationen (wie 'put', 'get', 'putline', 'getline' usw.) zur
+Verfügung. Diese Kanäle sind 'konfigurierbar' (s.u.) und erlauben den Anruf des
+Systems durch den Benutzer von außen (SV-Taste). In der Regel werden die Kanäle 1
+bis 16 für Terminals, Drucker, Plotter und andere zeichenorientierte Anschlüsse be­
+nutzt.
+Wenn ein Kanal zum Anschluß eines Terminals verwendet wird, müssen die #ib#Standard-
+Steuerzeichen#ie# des EUMEL-Systems (s. Benutzerhandbuch Programmierung, Kap. 3
+"Der Editor", "5.2.4. Der EUMEL-Zeichensatz") auf jedem Terminal die gleiche Semantik
+haben. Das heißt beispielsweise, daß der Code ""2"" auf jedem Terminal bei Ausgabe
+den Cursor um eine Stelle nach rechts verschiebt. Da Datenendgeräte in dieser Hin­
+sicht aber faktisch keiner Norm gehorchen, müssen die EUMEL-Codes in der Regel in
+#ib#terminalspezifische Codes#ie# umgesetzt werden. Diese Umsetzregeln kann man bei der
+Konfigurierung (s.u.) festlegen. Für die meisten Terminaltypen werden allerdings
+fertige Konfigurationssätze mit dem EUMEL-System zusammen ausgeliefert, die man
+bei der Einrichtung des Systems (s. Kap. 1 Installationsanleitung) interaktiv anwählen
+kann.
+
+
+
+
+#ib##ib(9)#Blockorientierte Ein-/Ausgabe#ie##ie(9)#
+
+
+Blockorientiere Ein-/Ausgabe kann auf den Kanälen 1 bis 32 benutzt werden. Dafür
+stehen die Operationen
+
+ PROC #ib#control#ie# (INT CONST code1, code2, code3,
+ INT VAR return code)
+ PROC #ib#blockout#ie# (DATASPACE CONST ds,
+ INT CONST page nr, code1, code2, INT VAR return code)
+ PROC #ib#blockout#ie# (ROW 256 INT CONST block,
+ INT CONST code1, code2, INT VAR return code)
+ PROC #ib#blockin#ie# (DATASPACE VAR ds,
+ INT CONST page nr, code1, code2, INT VAR return code)
+ PROC #ib#blockin#ie# (ROW 256 INT VAR block,
+ INT CONST code1, code2, INT VAR return code)
+
+zur Verfügung. Näheres findet man in Kap. 4.5 dieses Systemhandbuchs.
+
+
+
+
+
+#ib##ib(9)#Konfigurierung von Kanal 1 bis 15#ie(9)##ie#
+
+
+
+Alle #ib#zeichenorientierten Kanäle#ie# können (mittels Block I/O auf Kanal 32) konfiguriert
+werden. Dabei werden im wesentlichen #ib#Umsetzregeln#ie# für Ein- und Ausgabe definiert,
+die den Zweck haben,
+
+ - bei der Ausgabe den EUMEL Zeichensatz auf den Zeichensatz des ange­
+ schlossenen Geräts abzubilden und
+
+ - bei der Eingabe die gerätespezifischen Zeichen auf den EUMEL Zeichensatz
+ abzubilden.
+
+So ist eine geräteunabhängige Programmierung möglich.
+
+Mit Hilfe der Prozedur '#ib#link#ie#' kann man einen der Kanäle 1 bis 16 auf einen bestimm­
+ten Typ setzen. Immer vorhanden sind die Typen:
+
+"#ib#transparent#ie#": Keine Codeumsetzungen (für Drucker usw.) und
+"#ib#psi#ie#" : Keine Codeumsetzungen, jedoch folgende Sonderfunktionen:
+#free(1.0)#
+ Code Funktion
+ 7 (CTLg) SV
+ 17 (CTLq) Stop
+ 23 (CTLw) Weiter
+
+Weitere Typen müssen in Form eines DATASPACE, die nach den Gerätetypen benannt
+sind, in der Task vorliegen, in der das Kommando 'link' gegeben wird.
+
+Neue Terminaltypen können mit den Prozeduren 'new type', 'enter outcode', 'enter
+incode' usw. definiert werden. Im einzelnen stehen folgende Prozeduren zur Verfü­
+gung:
+
+
+#ib#link#ie#
+ PROC link (INT CONST channel, TEXT CONST type)
+ Zweck: Der angegebene Kanal (1 bis 16) wird auf den angegebenen Typ konfi­
+ guriert.
+ Hinweis: Die Prozedur 'link' hat die angegebene Wirkung nur, wenn
+ die Task an Kanal 32 hängt, der nur für Söhne des
+ SUPERVISOR zugänglich ist ('continue (32)').
+
+#ib#y size#ie#
+ PROC y size (INT CONST channel, new size, INT VAR old size)
+ Zweck: Einstellmöglichkeiten für verschiedene Bildschirmgrößen. Diese Proze­
+ dur wirkt nur auf Kanal 32. 'channel' gibt dabei den zu konfigurierenden
+ Kanal an.
+
+#ib#new type#ie#
+ PROC new type (TEXT CONST typ)
+ Zweck: Eröffnet einen neuen Kanaltyp mit dem Namen 'typ'. Die folgenden
+ Aufrufe von 'enter outcode', 'enter incode' usw. beziehen sich dann auf
+ diesen Typ.
+
+#ib#enter outcode#ie#
+ PROC enter outcode (INT CONST eumelcode, zielcode)
+ Zweck: Legt fest, daß der Code 'eumelcode' bei Ausgabe auf dem Terminaltyp
+ in 'zielcode' gewandelt werden soll.
+
+ PROC enter outcode (INT CONST eumelcode, TEXT CONST zeichen)
+ Zweck: Wirkt wie 'enter outcode (eumelcode, code (zeichen))'.
+
+ PROC enter outcode (INT CONST eumelcode, zeit, TEXT CONST seq)
+ Zweck: Hiermit wird festgelegt, daß der Code 'eumelcode' als Mehrzeichenfolge
+ 'seq' ausgegeben werden soll. Jedesmal, wenn diese Folge ausgegeben
+ wurde, verzögert das System die Ausgabe des nächsten Zeichens um
+ mindestens 'zeit' Millisekunden. Dies wird z.B. von den meisten Termi­
+ nals gefordert, wenn sie die Funktion 'Löschen Bildschirm' ausführen
+ sollen.
+
+#ib#enter incode#ie#
+ PROC enter incode (INT CONST eumelcode, TEXT CONST seq)
+ Zweck: Es wird festgelegt, daß eine Eingabezeichenfolge 'seq' an das System
+ als ein (!) Zeichen mit dem Code 'eumelcode' weitergegeben werden
+ soll. Die ganze Sequenz muß dabei innerhalb von ca. 40 Millisekunden
+ eintreffen, andernfalls werden die Zeichen einzeln gemeldet. Diese
+ Logik ist erforderlich, um auch Terminals anzuschließen, die z.B. Cursor­
+ tasten als ESC-Sequenzen melden. Ohne die Zeitüberwachung würde
+ das Betätigen der ESC-Taste sonst die Eingabe blockieren, bis die Folge
+ 'seq' vollständig ist.
+ Folgende Eumelcodes sind für die Sondertasten (SV usw.) anzugeben:
+
+ 17 : STOP
+ 23 : WEITER
+ 7 : SV
+
+ Weitere Codes ('HOP',...) sind im Benutzerhandbuch Programmierung
+ (5 - 29, Der EUMEL-Zeichensatz) angegeben.
+
+ #on("i")#Hinweis: Liefert die SV-Taste eines Terminals von sich aus schon Code
+ 7, so ist dennoch 'enter incode (7, ""7"")' anzugeben. Entspre­
+ chendes gilt für die zwei anderen "Ereignistasten" STOP und
+ WEITER. Bei allen anderen Tasten brauchen jedoch nur echte
+ Umcodierungen vermerkt zu werden.#off("i")#
+
+
+#ib#cursor logic#ie#
+ PROC cursor logic (INT CONST offset, modus, TEXT CONST pre, mid, post)
+ Zweck: Es wird festgelegt, daß der EUMEL-Code 6 (Cursorposition) mit den
+ folgenden beiden Zeichen, deren Codes y und x seien,
+
+ bei modus = 255 als
+ pre + code (offset+y) + mid + code (offset+x) + post
+ und bei modus = 1 als
+ pre + text (offset+y) + mid + text (offset+x) + post
+
+ ausgegeben wird.
+ Hinweis: 'offset' ist üblicherweise 32 (manchmal 0) und
+ mid = post = "".
+
+#ib#cursor logic#ie#
+ PROC cursor logic (INT CONST dist, TEXT CONST pre, mid, post)
+ Zweck: Diese Prozedur wird von den Konfigurationsdateien alter Versionen
+ benutzt.
+
+#ib#ansi cursor#ie#
+ PROC ansi cursor (TEXT CONST pre, mid, post)
+ Zweck: Diese Prozedur ist anstelle von 'cursor logic' zu verwenden, wenn die
+ Cursor-Positionierungen bei dem Terminal so erfolgt, wie im Ansi-
+ Standard definiert wird.
+
+#ib#elbit cursor#ie#
+ PROC elbit cursor
+ Zweck: Diese Prozedur ist bei Elbit-Terminals anstelle von 'cursor logic' zu
+ verwenden.
+
+
+
+
+
+
+#ib##ib(9)#Konfigurations-Manager#ie##ie(9)#
+
+
+Wenn das System gestartet wird, weiß der Urlader noch nicht, welche #ib#Terminaltypen#ie#
+an welchen Kanälen hängen. (Der Vortest kann deshalb auch nicht bildschirmorien­
+tiert arbeiten).
+
+Falls eine Task 'configurator' im System ist, schickt der SUPERVISOR dieser eine Start­
+sendung zu. Diese Task kann daraufhin die nötigen Konfigurierkommandos ('link',...)
+ausführen.
+
+Ansonsten ist 'configurator' ein normaler Fontmanager, der die Fonttabellen verwaltet
+(siehe Kap. 7). Deshalb sollte im System immer eine Task 'configurator' existieren und
+nach Möglichkeit immer im 'wait' stehen. Man kann ihn also auch mit 'continue' an ein
+Terminal holen und dann wie üblich Kommandos geben.
+
+#ib#configurate#ie#
+ PROC configurate
+ Zweck: Führt den Konfigurationsdialog und anschließendes 'setup' durch.
+
+#ib#setup#ie#
+ PROC setup
+ Zweck: Alle Kanäle werden gemäß der im letzten Konfigurationsdialog bestimm­
+ ten Werte konfiguriert (wird automatisch bei jedem Systemstart durch­
+ geführt).
+
+#ib#configuration manager#ie#
+ PROC configuration manager
+ Zweck: Durch Aufruf dieser Prozedur wird die Task zu einem Konfigurations­
+ manager. Man kann also die Task "configurator" löschen, neu als
+ Systemtask einrichten und mit diesem Kommando wieder etablieren.
+ BEACHTE: - Die Task muß 'configurator' heißen.
+ - Alle Terminalanpassungen gehen beim Löschen verloren, d.h.
+ man sollte sie vorher sichern!
+
+
+#on("i")#Hinweis: Es passieren, daß eine Task schon Ausgaben macht, bevor der Kanal
+ konfiguriert ist (z.B. wenn ein 'shutup' bei aktiver Netz-Kommunikation
+ durchgeführt wurde).#off("i")#
+
diff --git a/doc/system/systemhandbuch.2 b/doc/system/systemhandbuch.2
new file mode 100644
index 0000000..c4772f0
--- /dev/null
+++ b/doc/system/systemhandbuch.2
@@ -0,0 +1,1351 @@
+#start(2.5,1.5)#
+#pageblock#
+#block#
+#page (35)#
+#headeven#
+
+%#center#EUMEL-Systemhandbuch
+
+
+#end#
+#headodd#
+
+#center#3. ELAN-Programme#right#%
+
+
+#end#
+
+
+#ib(9)#3. #ib#ELAN-Programme#ie##ie(9)#
+
+
+
+
+#ib(9)#3.1. #ib#Wertebereich#ie#e und #ib#Speicherbedarf#ie##ie(9)#
+
+
+#ib#INT-Objekte#ie#
+
+
+Jedes #ib#Datenobjekt#ie# vom Typ INT belegt im Speicher 2 Bytes. Mögliche INT-Werte sind
+die ganzen Zahlen von -32768 bis +32767 einschließlich.
+
+
+
+
+#ib#REAL-Objekte#ie#
+
+
+Jedes Datenobjekt vom Typ REAL belegt im Speicher 8 Bytes.
+
+REALs haben eine 13-stellige #ib#Mantisse#ie#, die im Rechner dezimal geführt wird. (Das
+heißt, bei Konversionen zwischen interner und TEXT-Darstellung treten keine Run­
+dungsfehler auf.) Der Wertebereich wird durch folgende Eckwerte abgelegt:
+
+ 9.999999999999e+126 größter REAL-Wert
+ 0.000000000001 kleinster positiver REAL-Wert mit x + 1.0 > 1.0
+ 9.999999999999e-126 kleinster positiver REAL-Wert > 0.0
+ -9.999999999999e-126 größter negativer REAL-Wert
+ -9.999999999999e+126 kleinster REAL-Wert
+
+
+
+
+
+#ib#BOOL-Objekte#ie#
+
+
+Jedes Datenobjekt vom Typ BOOL belegt im Speicher 2 Bytes.
+
+
+
+
+
+#ib#TEXT-Objekte#ie#
+
+
+Jedes Datenobjekt vom Typ TEXT besteht aus einem festen Teil von 16 Bytes und
+möglicherweise aus einem flexiblen Teil auf dem #on("i")##on("b")##ib#Heap#ie##off("i")##off("b")#. Im festen Teil werden #ib#Texte bis
+zur Länge von 13 Zeichen#ie# untergebracht. Wenn eine TEXT-Variable einen Wert mit
+mehr als 13 Zeichen Länge annimmt, werden alle Zeichen auf dem Heap unterge­
+bracht. Genauer ergibt sich folgendes Bild:
+
+ kurzer Text (LENGTH <= 13):
+
+ Heap-Link 2 Bytes
+ Textlänge 1 Byte
+ Text 13 Bytes
+
+ langer Text (LENGTH > 13):
+
+ Heap-Link 2 Bytes
+ 255 1 Byte
+ Länge 2 Bytes
+ ungenutzt 11 Bytes
+
+Wenn eine Variable einmal Platz auf dem Heap bekommen hat, behält sie diesen
+vorbeugend auch dann, wenn sie wieder einen kurzen Text als Wert erhält. So muß
+wahrscheinlich kein neuer Platz auf dem Heap zugewiesen werden, wenn sie wieder
+länger wird. Das gilt allerdings nur bis zur nächsten #ib#Garbage Collection#ie# auf den
+TEXT-Heap, denn dabei werden alle Heap-Container minimal gemacht bzw. gelöscht,
+wenn sie nicht mehr benötigt werden. Der Platz auf dem Heap wird in Vielfachen von
+16 Bytes vergeben. In Fremddatenräumen wird in jedem #ib#Container#ie# neben dem eigent­
+lichen Text auch die Containerlänge untergebracht.
+
+Beispiele: TEXT-Länge Speicherbedarf (Byte)
+
+ 0 16
+ 13 16
+ 14 32
+ 15 48
+ 30 48
+ 31 64
+ 46 64
+ 47 80
+ 62 80
+
+
+Die Heapgröße eines Fremddatenraums berechnet sich als:
+
+ 1024 * 1024 - 520 = 1048056 - stat Bytes
+
+'stat' ist dabei die statistische Größe der Datenstruktur, die dem Datenraum aufgeprägt
+wurde. Bei einem BOUND ROW 1000 TEXT ergibt sich also eine Heapgröße von
+
+ 1048056 - (1000 * 16) = 1032056 Bytes.
+
+
+
+
+
+
+#ib#ROW- und STRUCT-Objekte#ie#
+
+
+Bei der Berechnung des Speicherbedarfs von #ib#STRUCT#ie#s und #ib#ROW#ie#s muß man beden­
+ken, daß längere Datenobjekte ausgerichtet werden. Und zwar werden alle Objekte, die
+mindestens die Länge eines REAL-Objektes haben, auf durch 8 teilbare Speichera­
+dressen ausgerichtet. Man bedenke, daß bei ROWs alle Elemente entsprechend ihres
+Elementtyps ausgerichtet sind.
+
+Beispiele: Länge (Byte)
+
+ ROW 2 BOOL 4
+ ROW 4 INT 8
+ ROW 5 INT 16
+ ROW 2 STRUCT (INT, BOOL) 4
+ ROW 100 STRUCT (INT,INT) 400
+ ROW 100 STRUCT (INT,REAL) 1600
+ ROW 100 STRUCT (INT,INT,INT,INT,REAL) 1600
+ ROW 100 STRUCT (REAL, REAL) 1600
+ ROW 100 STRUCT (INT,TEXT) 2400
+ ROW 100 STRUCT (INT,INT,INT,INT,TEXT) 2400
+ ROW 100 STRUCT (INT,TEXT,INT,TEXT) 4800
+ ROW 100 STRUCT (INT,INT,TEXT,TEXT) 4000
+ ROW 100 ROW 3 INT 600
+ ROW 100 ROW 4 INT 800
+ ROW 100 ROW 5 INT 1600
+aber:
+ ROW 500 INT 1000
+
+#on("i")#Anmerkung: Bei der #ib#Speichervergabe#ie# der einfachen Variablen und Konstanten eines
+ Programms spielen Verluste aufgrund von Ausrichtungen in der Regel
+ keine Rolle. Der ELAN-Compiler optimiert dabei soweit möglich.#off("i")#
+#page#
+#headeven#
+
+%#center#EUMEL-Systemhandbuch
+
+
+#end#
+#headodd#
+
+#center#4. Standardpakete für Systemprogrammierer#right#%
+
+
+#end#
+
+
+#ib(9)#4. #ib#Standardpakete für
+ Systemprogrammierer#ie(9)##ie#
+
+
+#ib(9)#4.1. #ib#Fehlerbehandlung#ie##ie(9)#
+
+
+Übersicht
+
+
+#on("italics")#
+ Fehler treten auf, wenn ein Programm eine gewünschte Leistung
+ nicht erbringen kann. Solche Situationen müssen von System-
+ Programmen kontrolliert behandelt werden. Die folgenden Aus­
+ führungen sind somit nur für diejenigen interessant, die "Sy­
+ stem"-Programme schreiben wollen.#off("italics")#
+
+#ib#Fehler#ie# treten in Operationen auf, wenn diese eine geforderte Leistung nicht erbringen
+können (z.B. das Drucken einer nicht vorhandenen Datei). Da folgende Anweisungen
+aber davon ausgehen, daß die gewünschten Leistungen erbracht wurden, ist es nicht
+sinnvoll, die Operation weiter auszuführen. Wir sprechen vom #ib#Abbruch einer Operation#ie#,
+wenn nach einem Fehler keine Anweisungen mehr ausgeführt werden, sondern die
+Operation verlassen wird. Im EUMEL-System kann durch folgende drei Maßnahmen
+ein Abbruch verursacht werden:
+
+- Aufruf der Prozedur '#ib#errorstop#ie#':
+ Die Operation wird mit einer Fehlermeldung abgebrochen, die man dem Aufruf von
+ 'errorstop' als Parameter beifügt werden kann.
+
+- Aufruf der Prozedur '#ib#stop#ie#':
+ Die Operation wird abgebrochen. Wirkt wie 'errorstop' mit der Meldung "stop".
+
+- Umschalten in den Supervisor:
+ Durch Betätigen der Taste SV und Eingabe des Kommandos '#ib#halt#ie#'. Die laufende
+ Operation wird abgebrochen. Wirkt wie ein 'errorstop', der von "außen" in das
+ Programm induziert wird.
+
+Da alle drei Maßnahmen zum Abbruch führen können und somit eine anormale (vor­
+zeitige) Beendigung eines Programms bewirken, werden sie im folgenden zusammen­
+fassend als #ib#Fehler#ie# bezeichnet.
+
+Für solche Fehler bietet das EUMEL-System die Möglichkeit, den Abbruch zu unter­
+drücken. Dies kann notwendig werden, wenn
+
+a) bestimmte Fehlerfälle vom aufrufenden Programm selbst behandelt werden sollen.
+ Beispiel:
+
+ Der EUMEL-Editor wird aufgerufen, um eine Datei zu bearbeiten. Er versucht als
+ erstes, die Datei zu assoziieren. Existiert die Datei nicht, wird die Prozedur
+ (z.B. 'old'), mit der die Datei angemeldet werden soll, normalerweise mit der Feh­
+ lermeldung ' "datei" gibt es nicht' abgebrochen. Diesen Fehlerzustand fängt der
+ Editor jedoch ab und versucht, eine neue Datei einzurichten (Anmerkung: In Wirk­
+ lichkeit fragt der Editor natürlich vor der Assoziierung mit 'exists' ab, ob die Datei
+ existiert).
+
+b) eine Operation die Kontrolle auf jeden Fall behalten soll.
+
+ Dies ist z.B. beim Monitor notwendig. Gleich welche Fehler vom Monitor gerufene
+ Programme produzieren, der Monitor muß in der Lage sein, die weitere Bearbei­
+ tung zu ermöglichen.
+
+c) eine Operation nicht unterbrechbar sein darf.
+
+ Beispielsweise dürfen Programm(teil)e, die Daten transportieren, nicht unterbro­
+ chen werden, da sonst ein Verlust dieser Daten eintreten könnte.
+
+
+
+#ib(9)##ib#Fehlerbehandlung#ie# und #ib#Fängerebenen#ie##ie(9)#
+
+
+Der Aufruf einer der Prozeduren
+
+ #ib#errorstop#ie#
+ #ib#stop#ie#
+ #ib#halt#ie#
+
+(wobei letztere vom Supervisor gegeben werden muß) werden zusammenfassend als
+#ib#Fehler#ie# bezeichnet. Bei einem Fehler wird ein #ib#Fehlerzustand#ie# gesetzt. Im Fehlerzustand
+merkt sich das EUMEL-System, daß ein Fehler vorliegt. Die Prozeduren
+
+ #ib#enable stop#ie#
+ #ib#disable stop#ie#
+
+bestimmen, ob Operationen im Fehlerzustand weiter bearbeitet oder abgebrochen
+werden. Beispiel:
+
+
+ INT VAR x;
+ get (x);
+ ...
+ disable stop;
+ x := x * x;
+ ...
+
+
+Hier wird mit 'disable stop' verhindert, daß ein Abbruch beispielsweise durch 'INT-
+Ueberlauf' auftreten kann. Die Anweisungen nach 'x * x' werden also weiter bearbei­
+tet.
+
+Welchen Wert hat aber nun die Variable 'x', nachdem der Fehler auftrat? Offensicht­
+lich war die den Fehler auslösende Operation '*' nicht in der Lage, den richtigen Wert
+zu errechnen. #ib#Abgebrochene Operationen#ie# liefern in der Regel keinen Wert. Dadurch ist
+der Wert von 'x' in unserem Beispiel nach einem Fehler bei '*' undefiniert. Es ist nun
+ersichtlich, daß mit der Anwendung der 'disable stop'-Prozedur äußerst vorsichtig zu
+verfahren ist, weil u.U. Werte verloren gehen können bzw. mit unerwarteten Werten
+weitergerechnet wird.
+
+Damit Programmierer erfahren können, ob ein Fehler aufgetreten ist, gibt es die Infor­
+mations-Prozedur
+
+ #ib#is error#ie#
+
+über den Fehlerzustand. Die Prozedur liefert den Wert TRUE, wenn ein Fehler vorliegt,
+andernfalls FALSE. Die Prozedur
+
+ #ib#clear error#ie#
+
+"löscht" den Fehlerzustand, d.h. anschließende Abfragen mit 'is error' liefern FALSE.
+(Die "richtige" Reaktion auf den Fehler muß ein Programmierer natürlich selbst be­
+stimmen).
+
+Beispiel:
+
+
+ INT VAR x;
+ get (x);
+ ...
+ disable stop;
+ x := x * x;
+ IF is error
+ THEN put ("'x'-Wert zu groß");
+ x := 0;
+ clear error
+ FI;
+ ...
+
+
+Leider würden jetzt aber auch alle folgenden Anweisungen bei eventuellen Fehlern
+nicht abgebrochen, also auch in Situationen, in denen ein Abbruch erwünscht ist, um
+#ib#Programmierfehler#ie# zu erkennen. Deshalb können durch
+
+ #ib#enable stop#ie#
+
+Abbrüche wieder zugelassen werden. Wenn wir jetzt also schreiben:
+
+
+ INT VAR x;
+ get (x);
+ ...
+ disable stop;
+ x := x * x;
+ IF is error
+ THEN put ("'x'-wert zu gross");
+ x := 0;
+ clear error
+ FI;
+ enable stop;
+ ...
+
+
+dann würden - wie gewünscht - eventuelle Fehler in den Anweisungen nach 'enable
+stop' zu einem Abbruch führen.
+
+Nicht mit '#ib#clear error#ie#' gelöschte Fehler führen bei '#ib#enable stop#ie#' ebenfalls zu einem
+Abbruch. In dem Programmteil
+
+
+ ...
+ disable stop;
+ x := x * x;
+ enable stop;
+ ...
+
+
+würde der eventuell auftretender Fehler 'INT Ueberlauf' nicht abgefangen, sondern nur
+verzögert wirksam, weil er nicht mit 'clear error' gelöscht wurde.
+
+Für die Behandlung von Fehlern durch Benutzer gibt es Prozeduren, die eine adäquate
+Reaktion auf den Fehler erlauben. Mit
+
+ #ib#error message#ie#
+
+können Sie auf die erste Fehlermeldung (eines 'error stop') nach dem letzen 'clear
+error' zugreifen (d.h. Folgefehler verändern nicht die Originalmeldung). Die Prozedur
+
+ #ib#error code#ie#
+
+liefert den #ib#Fehlercode#ie#, der bei der Prozedur 'errorstop' zusätzlich zum #ib#Fehlertext#ie#
+angegeben werden kann.
+
+ #ib#error line#ie#
+
+liefert die Zeilennummer des zuletzt aufgetretenen Fehlers. Mit
+
+ #ib#put error#ie#
+
+kann eine noch anstehende Fehlermeldung ausgegeben werden. Beispiel:
+
+
+ INT VAR x;
+ get (x);
+ ...
+ disable stop;
+ x := x * x;
+ IF is error
+ THEN IF error message = "INT-Ueberlauf"
+ THEN put ("'x'-wert zu gross");
+ ELSE put error
+ FI;
+ clear error
+ FI;
+ enable stop;
+ ...
+
+
+Tritt ein Fehler auf, so wird die den Fehler auslösende Operation entweder abgebro­
+chen oder "normal" weiter bearbeitet, je nachdem, ob 'enable stop' oder 'disable stop'
+gesetzt ist. Auf jeden Fall wird der #ib#Fehlerzustand#ie# an die aufrufende Operation weiter­
+gemeldet, die wiederum abgebrochen oder weiterbearbeitet werden kann usw. Die
+#ib#Weitermeldung#ie# eines Fehlers kann auch über mehrere Stufen erfolgen, solange bis der
+Fehler gelöscht wird. Andererseits gilt 'enable/ disable stop' nicht nur für die aktuelle
+Operation, sondern auch für gerufene Operationen ("Vererbung"). Die gerufenen Ope­
+rationen können allerdings 'enable/disable stop' neu festlegen. Beispiel:
+
+
+ PROC a: PROC b: PROC c:
+ ... ... ROW 10 INT VAR x;
+ disable stop; enable stop; ...
+ b; ... INT VAR i :: 4711;
+ IF is error c; x [i] := ...;
+ THEN ... ... ...
+ clear error END PROC b END PROC c
+ FI;
+ enable stop
+ END PROC a;
+
+
+In der Prozedur 'a' wird die Prozedur 'b' aufgerufen. Diese ruft wiederum eine Prozedur
+'c' auf. Für die Prozedur 'c' gilt nun der Zustand 'enable stop' der Prozedur 'b' (#ib#Verer­
+bung von 'enable stop'#ie#). Tritt jetzt in 'c' der Subskriptions-Fehler auf, wird 'c' abgebro­
+chen. Die Wirkung der fehlerauslösenden Operation ist nicht definiert.
+
+Da aber auch die Prozedur 'b' im 'enable stop' Zustand ist, wird auch die Prozedur 'b'
+abgebrochen. Der Fehler bleibt jedoch erhalten, wird also weitergemeldet. Dies wirkt
+sich so aus, daß die Anweisung 'c' nicht ausgeführt wird. Da die Prozedur 'a' 'disable
+stop' gesetzt hat, werden die auf den Aufruf von 'b' folgenden Anweisungen durchlau­
+fen und somit durch 'clear error' der Fehler gelöscht. In diesem Beispiel "fängt" die
+Prozedur 'a' Fehler auf, die in den Prozeduren 'b' und 'c' entstehen können.
+
+Ein solcher #ib#Fänger#ie# wird durch zwei Prozeduren konstruiert. Der eigentliche Fänger
+(hier: Prozedur 'a') ruft eine ausführende Prozedur (hier: 'b') im 'disable stop'-Zustand
+auf. Die gerufene Prozedur setzt sofort 'enable stop' und führt dann die eigentlichen
+Aktionen aus. So wird die gerufene Prozedur abgebrochen (kann also im Fehlerfall
+nicht zuviel Schaden anrichten). Der Abbruch führt bis zur Fängerprozedur ('a') hinter
+den Aufruf der gerufenen Prozedur ('b'). Nach Löschung eventuell auftretender Fehler
+ist somit sichergestellt, daß der Fänger immer weiterarbeiten kann.
+
+
+
+#ib(9)#Wichtiger Hinweis#ie(9)#
+
+
+
+ 1. #on("italics")##on("bold")#Da im 'disable stop'-Zustand kein Fehler zum Abbruch führt, kann
+ eine Operation in diesem Zustand auch nicht durch 'halt' abge­
+ brochen werden. Einerseits ist das für manche Systemteile wün­
+ schenswert, andererseits können Operationen, die auf Grund von
+ Programmierfehlern nicht terminieren (Endlosschleifen), nicht
+ unter Kontrolle gebracht werden. Also Vorsicht! (Letztes Mittel:
+ Task löschen)#off("italics")##off("bold")#
+
+ 2. #on("i")##on("b")#Es ist nicht (!) garantiert, daß im Fehlerzustand aufgerufene
+ Prozeduren ihre normale Wirkung haben. Garantiert ist dies je­
+ doch für alle Prozeduren und Operatoren, die in diesem Kapi­
+ tel aufgeführt werden.#off("i")##off("b")#
+
+#on("italics")##on("bold")#Merke: Fehler sind im EUMEL-System Aufrufe der Prozeduren 'errorstop',
+ 'stop' oder das Betätigen der SV Taste und dem Supervisor-
+ Kommando 'halt'. Ein Fehler gilt solange, bis er mit Hilfe der
+ Prozedur 'clear error' gelöscht wurde. Die Prozeduren 'enable/
+ disable stop' steuern die Abarbeitung der Operationen im Fehler­
+ fall. Gilt für eine Operation 'enable stop', wird die Operation
+ abgebrochen, d.h. die restlichen Anweisungen der Operation
+ nach der Fehler auslösenden Anweisung werden nicht durchlau­
+ fen. Ist 'disable stop' gesetzt, werden die restlichen Operationen
+ weiterhin abgearbeitet. 'enable/disable stop' gilt für alle - auch
+ indirekt - aufgerufenen Operationen ("Vererbung"), es sei denn, in
+ den gerufenen Operationen wird ein erneutes 'enable/disable
+ stop' gesetzt. Über die Aufrufkette werden ggf. auch die Fehler
+ zurück gemeldet.#off("italics")##off("bold")#
+
+
+ #on("italics")##on("bold")#Eine Fänger-Ebene ist eine Prozedur, die 'disable stop' setzt und
+ dann andere Operationen aufruft. Nach jedem dieser Aufrufe
+ kann eine Fehlerbehandlung mit 'clear error' durchgeführt wer­
+ den. Damit ist gewährleistet, daß Fehler immer von der Fänger-
+ Ebene "aufgefangen" und entsprechend behandelt werden.#off("italics")##off("bold")#
+
+
+
+#ib(9)##ib#Prozeduren zur Fehlerbehandlung#ie##ie(9)#
+
+
+#ib#clear error#ie#
+ PROC clear error
+ Zweck: Löscht den Fehlerzustand. 'is error' liefert anschließend wieder FALSE.
+ 'error message', 'error code' und 'error line' werden nicht gelöscht.
+
+#ib#disable stop#ie#
+ PROC disable stop
+ Zweck: Unterbindet den Abbruch in aufgerufenen Operationen. 'disable stop'
+ gilt für die Prozedur, in der sie aufgerufen wird und in allen folgenden
+ gerufenen Prozeduren, es sei denn, sie wird durch 'enable stop' außer
+ Kraft gesetzt. Wird die Operation verlassen, in der 'disable stop' aufge­
+ rufen wurde, wird der "alte" Zustand wiederhergestellt, der vor dem
+ Aufruf der Operation galt. 'disable stop' kann weiterhin in einer aufge­
+ rufenen Operation durch den Aufruf von 'enable stop' in dieser und den
+ folgenden Operationen außer Kraft gesetzt werden.
+
+#ib#enable stop#ie#
+ PROC enable stop
+ Zweck: Setzt die Wirkung eines Aufrufs von 'disable stop' zurück. Fehler ('error­
+ stop', 'stop' oder 'halt') in der aktuellen Operation oder den folgenden
+ aufgerufenen Operationen führen zum Abbruch. Bisher nicht gelöschte
+ Fehler (siehe 'clear error') führen sofort zum Abbruch.
+
+#ib#error code#ie##--goalpage ("fehlercodes")#
+ INT PROC error code
+ Zweck: Liefert den durch 'errorstop' gesetzten #ib#Fehlercode#ie#. Beispiel:
+
+ PROC test:
+ enable stop;
+ error stop (110, "Dies ist mein Abbruch!");
+ END PROC test;
+
+ ...
+ disable stop;
+ test;
+ put (error code); (* liefert 110 *)
+ clear error;
+ enable stop
+
+
+#ib#error line#ie#
+ INT PROC error line
+ Zweck: Liefert die Zeilennummmer des Fehlers (Voraussetzung : Die Überset­
+ zung erfolgt im 'checkon-Modus).
+
+#ib#error message#ie#
+ TEXT PROC error message
+ Zweck: Liefert die Fehlermeldung als Text. Anhand dieser Meldung kann ent­
+ schieden werden, welcher Fehler vorliegt.
+ Hinweis: Eine Fehlermeldung "" (also: 'error stop ("")') führt zum Fehlerabbruch
+ mit der Bedeutung "Fehlermeldung wurde bereits ausgegeben". Dem­
+ entsprechend erfolgt bei der Fehlermeldung 'niltext' keine Reaktion bei
+ 'put error'.
+
+#ib#errorstop#ie#
+ PROC error stop (TEXT CONST message)
+ Zweck: Bricht ab und setzt die Zeilennummer (wenn man sich im 'checkon'-
+ Modus befindet), in der der Fehler aufgetreten ist, sowie den Text 'mes­
+ sage'. Der Abbruch kann mit 'disable stop' unterbunden werden. 'error­
+ stop' hat keine Wirkung, wenn ein noch nicht gelöschter Fehler vorliegt.
+ Zu einer Fehlermeldung "" siehe auch die Prozedur 'error message'. Als
+ 'error-code' wird 0 gesetzt.
+
+
+ PROC error stop (INT CONST code, TEXT CONST message)
+ Zweck: Analog obiger 'errorstop'-Prozedur, aber mit Angabe des Fehlercodes,
+ der durch die Prozedur 'error code' in einer Fängerebene erfragt wer­
+ den kann.
+
+#ib#is error#ie#
+ BOOL PROC is error
+ Zweck: Informationsprozedur auf das Vorhandensein eines Fehlers.
+
+#ib#put error#ie#
+ PROC put error
+ Zweck: Gibt die durch 'errorstop' gesetzte Fehlermeldung aus, falls ein Fehler
+ noch nicht gelöscht ist (siehe auch: 'error message').
+
+
+
+
+#ib##ib(9)#Fehlercode#ie#s#ie(9)#
+
+
+Einige Fehlercodes sind bereits belegt:
+
+ 0 kein Fehlercode spezifiziert (Standardwert)
+ 1 'halt' vom Terminal
+ 2 Stack-Ueberlauf
+ 3 Heap-Ueberlauf
+ 4 INT-Ueberlauf
+ 5 DIV durch 0
+ 6 REAL-Ueberlauf
+ 7 TEXT-Ueberlauf
+ 8 zu viele DATASPACEs
+ 9 Ueberlauf bei Subskription
+ 10 Unterlauf bei Subskription
+ 11 falscher DATASPACE-Zugriff
+ 12 INT nicht initialisiert
+ 13 REAL nicht initialisiert
+ 14 TEXT nicht initialisiert
+ 15 nicht implementiert
+ 16 Block unlesbar
+ 17 Codefehler
+ 100 Syntax-Fehler beim Übersetzen
+
+
+
+
+
+#ib(9)#4.2. #ib#THESAURUS#ie##ie(9)#
+
+
+
+Ein #ib#Thesaurus#ie# ist ein #ib#Namensverzeichnis#ie#, das bis zu 200 Namen beinhalten kann.
+Dabei muß jeder Namen mindestens ein Zeichen und darf höchstens 100 Zeichen lang
+sein. Steuerzeichen (code < 32) sind in Namen nicht erlaubt.
+
+Ein Thesaurus ordnet jedem eingetragenen Namen einen Index zwischen 1 und 200
+(einschließlich) zu. Diese Indizes bieten dem Anwender die Möglichkeit, Thesauri zur
+Verwaltung benannter Objekte zu verwenden. (Der Zugriff erfolgt dann über den Index
+eines Namens in einem Thesaurus). So werden Thesauri u.a. von der Dateiverwaltung
+benutzt. Sie bilden die Grundlage der ALL- und SOME-Operatoren.
+
+
+
+
+#ib(9)#Grundoperationen#ie(9)#
+
+
+#ib#CONTAINS#ie#
+ BOOL OP CONTAINS (THESAURUS CONST t, TEXT CONST name)
+ Zweck: Liefert genau dann TRUE, wenn 't' den Namen 'name' enthält. Falls
+ 'name=""' oder 'LENGTH name > 100', wird FALSE geliefert.
+
+#ib#delete#ie#
+ PROC delete (THESAURUS VAR t, TEXT CONST name, INT VAR index)
+ Zweck: Falls der Name 'name' im Thesaurus 't' enthalten ist, wird er dort ge­
+ löscht. In 'index' wird dann sein alter Index geliefert, unter dem er im
+ Thesaurus eingetragen war. Ist der Name nicht im Thesaurus enthalten,
+ wird 0 als Index geliefert.
+
+ PROC delete (THESAURUS VAR t, INT CONST index)
+ Zweck: Der Eintrag mit dem angegebenen Index wird aus dem Thesaurus 't'
+ gelöscht.
+
+#ib#empty thesaurus#ie#
+ THESAURUS PROC empty thesaurus
+ Zweck: Für Initialisierungszwecke wird ein leerer Thesaurus geliefert.
+
+#ib#get#ie#
+ PROC get (THESAURUS CONST t, TEXT VAR name, INT VAR index)
+ Zweck: Liefert den "nächsten" Eintrag aus dem Thesaurus 't'. "Nächster" heißt
+ hier, der kleinste vorhandene mit einem Index größer als 'index'. Dabei
+ wird in 'name' der Name und in 'index' der Index des Eintrags geliefert.
+ D.h. 'index' wird automatisch weitergeschaltet. Den ersten Eintrag erhält
+ man entsprechend durch Aufruf mit 'index=0'. Nach dem letzten Ein­
+ trag wird 'name=""' und 'index=0' geliefert. Beispiel:
+
+
+ TEXT VAR name;
+ INT VAR index := 0 ;
+ get (thesaurus, name, index) ;
+ WHILE index > 0 REP
+ putline (name) ;
+ get (thesaurus, name, index)
+ PER
+
+
+#ib#highest entry#ie#
+ INT PROC highest entry (THESAURUS CONST t)
+ Zweck: Liefert den höchsten belegten Index des Thesaurus 't'.
+ Achtung: Das ist nicht die Anzahl der vorhandenen Namen, da durch
+ Löschungen Lücken entstanden sein können.
+
+#ib#insert#ie#
+ PROC insert (THESAURUS VAR t, TEXT CONST name, INT VAR index)
+ Zweck: Der Name 'name' wird als zusätzlicher Eintrag in den Thesaurus 't'
+ eingetragen und der dafür vergebene Index geliefert. Falls der Thesau­
+ rus schon voll ist und der Name nicht mehr eingetragen werden kann,
+ wird 0 als Index geliefert.
+ Achtung: Mehrfacheintragungen sind möglich. Wenn man diese verhin­
+ dern will, muß man entsprechend vermittels
+
+
+ IF NOT t CONTAINS name
+ THEN insert (t, name, index)
+ FI
+
+
+ eintragen.
+ Fehlerfall:
+ * Name unzulaessig
+
+ PROC insert (THESAURUS VAR t, TEXT CONST name)
+ Zweck: s.o. Allerdings wird der Index des Namens nicht geliefert. Ein Thesau­
+ rusüberlauf wird entsprechend als 'errorstop' gemeldet.
+ Fehlerfälle:
+ * Name unzulaessig
+ * THESAURUS-Ueberlauf
+
+#ib#link#ie#
+ INT PROC link (THESAURUS CONST t, TEXT CONST name)
+ Zweck: Liefert den Index des Namens 'name' im Thesaurus 't'. Falls der Name
+ nicht enthalten ist, wird 0 geliefert. Ist der Name mehrfach im Thesau­
+ rus enthalten, ist nicht definiert, welcher der möglichen Indizes geliefert
+ wird.
+
+#ib#name#ie#
+ TEXT PROC name (THESAURUS CONST t, INT CONST index)
+ Zweck: Liefert den Namen des Eintrags mit dem Index 'index' aus dem The­
+ saurus 't'. Falls kein solcher Eintrag im Thesaurus enthalten ist, wird
+ Niltext geliefert.
+
+#ib#rename#ie#
+ PROC rename (THESAURUS VAR t, TEXT CONST old, new)
+ Zweck: Ändert im Thesaurus 't' einen Eintrag mit dem alten Namen 'old' in 'new'
+ um. Falls 'old' nicht im Thesaurus enthalten ist, wird keine Leistung
+ erbracht. Falls 'old' mehrfach in 't' enthalten ist, ist nicht definiert, wel­
+ cher der möglichen Einträge geändert wird.
+ Fehlerfall:
+ * Name unzulaessig
+
+ PROC rename (THESAURUS VAR t, INT CONST index, TEXT CONST new)
+ Zweck: Ändert im Thesaurus 't' den Namen des durch 'index' identifizierten
+ Eintrags in 'new'.
+ Fehlerfall:
+ * Name unzulaessig
+
+#ib#THESAURUS#ie#
+ TYPE THESAURUS
+ Zweck: Bezeichnet Thesaurus-Datenobjekte
+
+:=
+ OP := (THESAURUS VAR dest, THESAURUS CONST source)
+ Zweck: Zuweisung
+
+
+
+
+
+
+#ib(9)#Verknüpfungsoperationen#ie(9)#
+
+Das Paket '#ib#nameset#ie#' bietet die Möglichkeit, Operationen nicht nur auf einzelnen Datei­
+en, sondern auf (geordneten) Mengen ablaufen zu lassen:
+
+#ib#ALL#ie#
+ THESAURUS OP ALL (TASK CONST task)
+ Zweck: Liefert einen Thesaurus, der alle Dateinamen der angegebenen Task
+ enthält.
+
+ THESAURUS OP ALL (TEXT CONST file name)
+ Zweck: Liefert einen Thesaurus, der die in der angegebenen Datei vorhande­
+ nen Namen (jede Zeile ein Name) enthält.
+
+#ib#all#ie#
+ THESAURUS PROC all
+ Zweck: Liefert einen Thesaurus, der alle Dateinamen der eigenen Task enthält.
+ Entspricht 'ALL myself'.
+
+#ib#LIKE#ie#
+ THESAURUS OP LIKE (THESAURUS CONST thesaurus, TEXT CONST muster)
+ Zweck: Alle im Thesaurus enthaltenen Dateien, die dem 'muster' entsprechen
+ sind im Ergebnisthesaurus enthalten.
+ (Die Syntax von 'muster' findet man bei der Beschreibung des Pattern-
+ Matching)
+
+#ib#SOME#ie#
+ THESAURUS OP SOME (THESAURUS CONST thesaurus)
+ Zweck: Bietet den angegebenen Thesaurus im EUMEL-Editor zum Ändern an.
+ Es können nicht erwünschte Namen gestrichen werden.
+
+ THESAURUS OP SOME (TASK CONST task)
+ Zweck: Aufruf von: SOME ALL task.
+
+ THESAURUS OP SOME (TEXT CONST file name)
+ Zweck: Aufruf von: SOME ALL filename.
+
+#ib#FILLBY#ie#
+ OP FILLBY (THESAURUS VAR thesaurus, FILE VAR file)
+ Zweck: Schreibt 'file' in den Thesaurus. Dabei werden Zeilen, die schon im
+ Thesaurus sind, nicht mehr in den Thesaurus geschrieben. Jede Zeile
+ kommt im Thesaurus also nur einmal vor.
+
+ OP FILLBY (FILE VAR file, THESAURUS CONST thesaurus)
+ Zweck: Schreibt den Thesaurus in die Datei 'file'.
+
+ OP FILLBY (TEXT CONST filename,
+ THESAURUS CONST thesaurus)
+ Zweck: Richtet eine Datei mit dem Namen 'filename' ein und schreibt den The­
+ saurus in die Datei.
+
++
+ THESAURUS OP + (THESAURUS CONST left, right)
+ Zweck: Liefert die Vereinigungsmenge von 'left' und 'right'.
+ Achtung: Die Vereinigungsmenge enthält keine Namen mehrfach.
+
+ THESAURUS OP + (THESAURUS CONST left, TEXT CONST right)
+ Zweck: Fügt dem Thesaurus 'right' zu, wenn 'right' noch nicht im Thesaurus
+ enthalten ist.
+
+-
+ THESAURUS OP - (THESAURUS CONST left, right)
+ Zweck: Liefert die Differenzmenge. Achtung: Die Differenzmenge enthält keine
+ Namen mehrfach.
+
+ THESAURUS OP - (THESAURUS CONST left, TEXT CONST right)
+ Zweck: Nimmt den Namen 'right' aus dem Thesaurus.
+
+/
+ THESAURUS OP / (THESAURUS CONST left, right)
+ Zweck: Liefert die Schnittmenge
+ Achtung: Die Schnittmenge enthält keine Namen mehrfach.
+
+#ib#do#ie#
+ PROC do (PROC (TEXT CONST) operate, THESAURUS CONST thesaurus)
+ Zweck: Ruft 'operate' nacheinander mit allen im Thesaurus enthaltenen Namen
+ auf.
+
+ PROC do (PROC (TEXT CONST, TASK CONST) operate,
+ THESAURUS CONST thesaurus, TASK CONST task)
+ Zweck: s.o.
+
+#ib#erase#ie#
+ PROC erase (THESAURUS CONST thesaurus)
+ Zweck: Löscht alle aufgeführten Dateien in der Vater-Task.
+
+ PROC erase (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: Löscht alle aufgeführten Dateien in der Task 'manager'.
+
+#ib#fetch#ie#
+ PROC fetch (THESAURUS CONST thesaurus)
+ Zweck: Holt alle aufgeführten Dateien vom Vater.
+
+ PROC fetch (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: Holt alle aufgeführten Dateien vom 'manager'.
+
+#ib#fetch all#ie#
+ PROC fetch all (TASK CONST manager)
+ Zweck: Holt alle Dateien vom 'manager'. Diese Prozedur entspricht dem Aufruf
+ der Prozedur 'fetch (ALL manager, manager)'.
+
+ PROC fetch all
+ Zweck: Aufruf der Prozedur 'fetch all (father)'.
+
+#ib#forget#ie#
+ PROC forget (THESAURUS CONST thesaurus)
+ Zweck: Löscht alle aufgeführten Dateien in der Benutzer-Task.
+
+#ib#insert#ie#
+ PROC insert (THESAURUS CONST thesaurus)
+ Zweck: Insertiert alle aufgeführten Dateien in der Benutzer-Task.
+
+#ib#remainder#ie#
+ PROC remainder
+ Zweck: Liefert nach einem 'errorstop' die noch nicht bearbeiteten Dateien.
+ Beispiel:
+ 'save all (archive)'
+ kann dazu führen, daß nicht alle Dateien auf das Archiv geschrie­
+ ben werden können. Fehlermeldung:
+ '"....." kann nicht geschrieben werden (Archiv voll)'
+ Nachdem man eine neue Floppy ins Archivlaufwerk gelegt hat,
+ kann man mit
+ 'save (remainder, archive)'
+ den Rest der Dateien auf der Floppy sichern.
+
+#ib#save#ie#
+ PROC save (THESAURUS CONST thesaurus)
+ Zweck: Schickt alle aufgeführten Dateien zur Vater-Task.
+
+ PROC save (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: s.o.
+
+#ib#save all#ie#
+ PROC save all (TASK CONST manager)
+ Zweck: Schickt alle eigenen Dateien zum 'manager'. Diese Prozedur entspricht
+ dem Aufruf der Prozedur 'save (ALL myself, manager)'.
+
+ PROC save all
+ Zweck: Aufruf der Prozedur 'save all (father)'.
+
+
+Beispiele:
+
+ save (ALL myself)
+ forget (ALL myself)
+ forget (all)
+ fetch (SOME father)
+ fetch (ALL father - ALL myself)
+ insert (ALL "gen datei")
+ save (ALL myself - ALL archive, archive)
+
+
+
+
+#ib(9)#4.3. #ib#Kommandos und Dialog#ie(9)##ie#
+
+
+
+#ib##ib(9)#Kommandodialog#ie##ie(9)#
+
+
+Das Paket "#ib#command dialogue#ie#" dient zur zentralen Steuerung und einfachen Durch­
+führung von #ib#Kommando-Dialog#ie#en wie
+
+ "datei" loeschen (j/n)?
+
+Er wird von allen Systemteilen verwandt, die einen Kommandodialog mit dem Benut­
+zer aufnehmen. Anwenderprozeduren mit ähnlichen Problemen sollten genauso damit
+arbeiten.
+
+Der Kommandodialog kann zentral aus- und eingeschaltet werden.
+
+
+
+#ib#command dialogue#ie#
+ BOOL PROC command dialogue
+ Zweck: Liefert den aktuellen Zustand des Kommandodialogs:
+ TRUE - Dialog soll geführt werden!
+ FALSE - Dialog soll nicht geführt werden!
+
+ PROC command dialogue (BOOL CONST status)
+ Zweck: Schaltet den Kommandodialog ein ('status' = TRUE) oder aus ('status'
+ = FALSE). Der alte Zustand wird überschrieben. Soll später wieder in
+ den alten Zustand zurückgeschaltet werden, muß er vorher erfragt und
+ gesichert werden.
+
+#ib#yes#ie#
+ BOOL PROC yes (TEXT CONST question)
+ Zweck: a) Kommandodialog soll geführt werden (command dialogue = TRUE)
+ Der übergebene Fragetext wird durch " (j/n)?" ergänzt auf dem Ter­
+ minal ausgegeben. Als Antwort wird eine der Tasten <j>, <J>,
+ <y>, <Y>, <n>, <N> akzeptiert; jede andere Eingabe führt zu
+ einem akustischen Signal und der Fragewiederholung. Das Resultat
+ der Prozedur ist
+ TRUE bei bejahender Antwort (j,J,y,Y)
+ FALSE bei verneinender Antwort (n,N)
+ b) Kommandodialog soll nicht geführt werden (command dialogue =
+ FALSE)
+ Keine Aktion, das Resultat ist TRUE.
+
+#ib#no#ie#
+ BOOL PROC no (TEXT CONST question)
+ Zweck: a) Kommandodialog soll geführt werden (command dialogue = TRUE)
+ Frage und Antwort wie bei 'yes'. Das Resultat ist
+ TRUE bei verneinender Antwort (n,N)
+ FALSE bei bejahender Antwort (j,J,y,Y)
+ b) Kommandodialog soll nicht geführt werden (command dialogue =
+ FALSE)
+ Keine Aktion, das Resultat ist FALSE.
+
+#ib#say#ie#
+ PROC say (TEXT CONST message)
+ Zweck: IF command dialogue THEN out (text) FI
+
+#ib#last param#ie#
+ TEXT PROC last param
+ Zweck: Liefert den zuletzt gesetzten Parameter-Text (siehe folgende Proze­
+ dur). Falls 'command dialogue' = TRUE und die 'param position' > 0
+ ist, wird der Parametertext als Standardparameter an der angegebenen
+ x-Position eine Zeile höher in der Form ("...") ausgegeben. Diese Proze­
+ dur wird von den parameterlosen Kommandos bzw. Prozeduren wie
+ 'edit', 'run' usw. verwandt, um mit dem Standardparameter weiterzuar­
+ beiten.
+
+ PROC last param (TEXT CONST new)
+ Zweck: Setzt 'last param' auf 'new'. (Das Setzen muß explizit durchgeführt
+ werden und geschieht nicht implizit durch den 'command handler'. 'Last
+ param' wird beispielsweise von den einparametrigen Prozeduren 'edit'
+ und 'run' gesetzt.
+
+#ib#param position#ie#
+ PROC param position (INT CONST x)
+ Zweck: Setzt die Echoposition für 'last param'. Bei x=0 wird ein Echo unter­
+ drückt.
+
+#ib#std#ie#
+ TEXT PROC std
+ Zweck: Liefert wie 'last param' den zuletzt gesetzten Parameter. Im Gegensatz
+ dazu wird der Parameter aber nicht ausgegeben.
+
+
+
+
+
+#ib##ib(9)#Kommandoverarbeitung#ie##ie(9)#
+
+
+Das Paket '#ib#command handler#ie#' stellt Prozeduren zur #ib#Kommandoanalyse#ie# und zum
+Führen des kompletten Kommandodialogs zur Verfügung.
+
+
+#ib#get command#ie#
+ PROC get command (TEXT CONST dialogue text, TEXT VAR command line)
+ Zweck: Falls eine Fehlermeldung aussteht, ('is error' liefert TRUE), wird sie über
+ 'put error' ausgegeben und der Fehlerzustand zurückgesetzt. Der 'dialo­
+ gue text' wird als Dialogaufforderung ausgegeben und der Benutzer
+ kann eine Kommandozeile eingeben. Die letzte Kommandozeile wird
+ ihm dabei automatisch (zum Ändern) angeboten, wenn vorher eine
+ Fehlermeldung anstand. Der Benutzer kann dies ebenfalls erreichen,
+ wenn er zu Beginn <ESC k> gibt. Die Kommandozeile wird dem Auf­
+ rufer in der Variablen 'command line' geliefert.
+
+ PROC get command (TEXT CONST dialogue text)
+ Zweck: s.o. Allerdings wird eine interne Kommandozeile des Pakets 'command
+ handler' als 'command line' verwandt. Dadurch wird es möglich, alle
+ Spuren einer Kommandoeingabe durch 'cover tracks' zu beseitigen.
+
+#ib#analyze command#ie#
+ PROC analyze command (TEXT CONST command list, command line,
+ INT CONST permitted type,
+ INT VAR command index, number of params,
+ TEXT VAR param 1, param 2)
+ Zweck: Die übergebene Kommandozeile ('command line') wird anhand der
+ übergebenen 'command list' analysiert. Sie ist ein TEXT, der aus einer
+ Folge von Kommandospezifikationen besteht. Jede hat die Form
+ K:I.P
+
+ K Kommandotext, Prozedurname nach ELAN-Syntax
+ I Hauptindex, Form eines INT-Denoters
+ P Parameterspezifikation, eine Folge der Ziffern 0, 1 und 2.
+
+ Beispiele:
+ - 'edit:15.012'
+ Das Kommando 'edit' wird in drei verschieden parametrisierten
+ Formen spezifiziert:
+ edit mit 0 Parameter erhält Index 15
+ edit mit 1 Parameter erhält Index 16
+ edit mit 2 Parametern erhält Index 17
+
+ - 'fetch:18.1'
+ Das Kommando 'fetch' wird in einer Form spezifiert:
+ fetch mit 1 Parameter erhält Index 18
+
+ Die Analyse erfolgt gemäß ELAN-Syntaxregeln. Dabei sind als Para­
+ meter Denoter vom Typ TEXT und vom übergebenen ' permitted type'
+ zugelassen. Diese Typen werden wie beim Scanner (s. Benutzerhand­
+ buch Programmierung Kap. 5.6) angegeben:
+
+ 1 tag
+ 2 bold
+ 3 number
+ 4 text
+ 5 operator
+ 6 delimiter
+
+ Falls das Kommando in der Kommandoliste gefunden wird (und die
+ Syntax in Ordnung ist), wird der entsprechende 'command index' zu­
+ rückgemeldet. Die Parameter werden (falls vorhanden) in 'param 1' und
+ 'param 2' abgelegt. Undefinierte oder nicht vorhandene Parameter
+ werden als Niltext geliefert. Wenn ein Kommando vorhanden ist, die
+ Anzahl der Parameter aber nicht stimmt, wird der negative Hauptindex
+ geliefert. Ist es vollkommen unbekannt oder ist die Eingabe zu komplex
+ (mehrere Kommandos, Ausdrücke oder komplexere ELAN-Statements),
+ wird 0 geliefert. Der Anwender kann in solchen Fällen die Analyse mit
+ einer anderen Kommandoliste fortsetzen, das Kommando dem ELAN-
+ Compiler übergeben oder eine Fehlermeldung auslösen (s. 'command
+ error').
+
+ PROC analyze command (TEXT CONST command list,
+ INT CONST permitted type,
+ INT VAR command index, number of params,
+ TEXT VAR param 1, param 2)
+ Zweck: s.o. Allerdings wird die interne Kommandozeile des Pakets 'command
+ handler' als 'command line' verwandt.
+
+#ib#command error#ie#
+ PROC command error
+ Zweck: Falls bei der Kommandoanalyse ein Fehler gefunden wurde, führt er
+ nicht zum 'errorstop', sondern wird nur hinterlegt. (Soll das Kommando
+ dem Compiler übergeben werden, liegt ja evt. überhaupt kein Fehler
+ vor.) Diese hinterlegte Meldung kann mit 'command error' als 'errorstop'
+ gegeben werden. Mögliche Meldungen:
+ "ungueltiger name"
+ ") fehlt"
+ "( fehlt"
+ "Parameter ist kein TEXT ("fehlt)"
+ "Kommando zu schwierig"
+
+#ib#cover tracks#ie#
+ PROC cover tracks
+ Zweck: Die Spuren der letzten Kommandoanalyse werden gelöscht. Das dient
+ u.a. dazu, daß später eingerichtete Sohntasks keine Relikte des Kom­
+ mandos mehr auf dem Textheap vorfinden und evtl. mittels nicht initiali­
+ sierter TEXT VARs herausfinden können. Vollständig können die Spuren
+ aber nur dann gelöscht werden, wenn für die Kommandoanalyse die
+ 'get command'- und 'analyze command'-Prozeduren benutzt wurden,
+ die auf der internen Kommandozeile des Pakets 'command handler'
+ arbeiten.
+
+#ib#do command#ie#
+ PROC do command
+ Zweck: Die interne Kommandozeile des Pakets 'command handler' wird dem
+ ELAN-Compiler zur Ausführung übergeben.
+
+
+
+
+
+#ib(9)#Beispiele zur Kommandoverarbeitung#ie(9)#
+
+
+#ib##ub#Kleiner Monitor#ue##ie#
+
+
+LET command list = "otto:1.12emil:3.012hugo:6.0" ;
+
+LET number = 3 ,
+ text = 4 ;
+
+INT VAR command index, params ;
+TEXT VAR param 1, param 2 ;
+
+PROC monitor :
+
+ disable stop ;
+ command dialogue (TRUE) ;
+ REP get command ("gib kleines kommando:") ;
+ analyze command (command list, text,
+ command index, params,
+ param 1, param 2) ;
+ execute command
+ PER
+
+ENDPROC monitor ;
+
+PROC execute command :
+
+ enable stop ;
+ SELECT command index OF
+ CASE 1 : otto (param 1)
+ CASE 2 : otto (param 1, param 2)
+ CASE 3 : emil
+ CASE 4 : emil (param 1)
+ CASE 5 : emil (param 1, param 2)
+ CASE 6 : hugo
+ OTHERWISE do command line
+ END SELECT
+
+ENDPROC execute command ;
+
+
+
+#ib(9)##ub#Steuerkommando-Analyse#ue##ie(9)#
+
+
+PROC command (TEXT CONST command text) :
+
+ disable stop ;
+ command dialoge (FALSE) ;
+ analyze command (command list, command text, number,
+ command index, params, param 1, param 2) ;
+ execute command ;
+ IF is error
+ THEN put error ;
+ clear error
+ FI
+
+ENDPROC command ;
+
+PROC execute command :
+
+ enable stop ;
+ SELECT command index OF
+ CASE ....
+ OTHERWISE IF command index = 0
+ THEN errorstop ("unbekanntes Kommando") ELSE command error
+ FI
+ END SELECT
+
+ENDPROC execute command ;
+
+
+
+
+
+#ib(9)#4.4. Verschiedenes#ie(9)#
+
+
+#ib(9)##ib#SESSION#ie(9)##ie#
+
+
+Mit Hilfe von 'session' kann man feststellen, ob das System neu gestartet wurde. Dabei
+spielt es keine Rolle, ob es korrekt ('shutup') abgeschaltet wurde, oder ob es sich um
+einen "RERUN" handelt.
+
+#ib#session#ie#
+ INT PROC session
+ Zweck: Liefert eine "Sitzungsnummer". Diese wird automatisch bei jedem
+ Systemstart erhöht.
+
+Beispiel:
+
+
+ REP
+ INT VAR old session := session ;
+ WHILE session = old session REP pause (100) PER ;
+ putline ("Neuer Systemstart")
+ PER.
+
+
+
+
+#ib(9)##ib#INITFLAG#ie##ie(9)#
+
+
+Im Multi-User-System ist es oft notwendig, Pakete beim Einrichten einer neuen Task in
+dieser neu zu initialisieren. Das muß z.B. bei der Dateiverwaltung gemacht werden, da
+die neue Task ja nicht die Dateien des Vaters erbt. Mit Hilfe von INITFLAG-Objekten
+kann man zu diesem Zweck feststellen, ob ein Paket #on("b")##on("i")#in dieser Task#off("b")##off("i")# schon initialisiert
+wurde.
+
+
+#ib#INITFLAG#ie#
+ TYPE INITFLAG
+ Zweck: Erlaubt die Deklaration entsprechender Flaggen.
+
+:=
+ OP := (INITFLAG VAR flag, BOOL CONST flagtrue)
+ Zweck: Erlaubt die Initialisierung von INITFLAGs
+
+#ib#initialized#ie#
+ BOOL PROC initialized (INITFLAG VAR flag)
+ Zweck: Wenn die Flagge in der Task A auf TRUE oder FALSE gesetzt wurde,
+ dann liefert sie beim ersten Aufruf den entsprechenden Wert, danach
+ immer TRUE (in der Task A!).
+ Beim Einrichten von Söhnen wird die Flagge in den Sohntasks automa­
+ tisch auf FALSE gesetzt. So wird erreicht, daß diese Prozedur in den neu
+ eingerichteten Söhnen und Enkeltasks genau beim ersten Aufruf FALSE
+ liefert.
+
+
+Beispiel:
+
+ PACKET stack DEFINES push, pop:
+
+ INITFLAG VAR in this task := FALSE ;
+ INT VAR stack pointer ;
+ ROW 1000 INT VAR stack ;
+
+ PROC push (INT CONST value) :
+
+ initialize stack if necessary ;
+ ....
+
+ ENDPROC push ;
+
+ PROC pop (INT VAR value) :
+
+ initialize stack if necessary ;
+ ....
+
+ ENDPROC pop ;.
+
+ initialize stack if necessary :
+ IF NOT initialized (in this task)
+ THEN stack pointer := 1
+ FI .
+
+ ENDPACKET stack
+
+
+
+
+
+#ib(9)##ib#Bit-Handling#ie##ie(9)#
+
+
+Die #ib#Bit-Operationen#ie# arbeiten auf INT-Objekten. Sie können z.B. für die Systempro­
+grammierung benutzt werden, wenn es um Bitmasken u.ä. geht.
+
+Ein INT besteht aus 16 Bits. Dabei hat das niederwertigste die Nummer 0, das höch­
+stwertige die Nummer 15.
+
+
+#ib#AND#ie#
+ INT OP AND (INT CONST left, right)
+ Zweck: Bitweise UND-Verknüpfung von 'left' mit 'right'.
+
+#ib#OR#ie#
+ INT OP OR (INT CONST left, right)
+ Zweck: Bitweise ODER-Verknüpfung von 'left' mit 'right'.
+
+#ib#XOR#ie#
+ INT OP XOR (INT CONST left, right)
+ Zweck: Bitweise EXCLUSIV-ODER-Verknüpfung von 'left' mit 'right'.
+
+#ib#bit#ie#
+ BOOL PROC bit (INT CONST bits, bit no)
+ Zweck: Liefert TRUE genau dann, wenn das Bit mit der Nummer 'bit no' in dem
+ INT 'bits' gesetzt ist.
+
+#ib#set bit#ie#
+ PROC set bit (INT VAR bits, INT CONST bit no)
+ Zweck: Das Bit mit der Nummer 'bit no' wird in 'bits' auf 1 gesetzt.
+
+#ib#reset bit#ie#
+ PROC reset bit (INT VAR bits, INT CONST bit no)
+ Zweck: Das Bit mit der Nummer 'bit no' wird in 'bits' auf 0 gesetzt.
+
+#ib#rotate#ie#
+ PROC rotate (INT VAR bits, INT CONST number of bits)
+ Zweck: Bits können mit dieser Prozedur zyklisch geschiftet werden.
+ Bsp.: rotate (1,1) ---> 2
+ rotate (1,2) ---> 4
+ rotate (1,-3) ---> 16384
+ rotate (16384,3) ---> 1
+
+#ib#lowest set#ie#
+ INT PROC lowest set (INT CONST bits)
+ Zweck: Liefert die Nummer des niederwertigsten 1-Bits in 'bits'. Ist kein Bit auf 1
+ gesetzt, wird -1 geliefert.
+
+#ib#lowest reset#ie#
+ INT PROC lowest reset (INT CONST bits)
+ Zweck: Liefert die Nummer des niederwertigsten 0-Bits in 'bits'. Ist kein Bit auf 0
+ gesetzt, wird -1 geliefert.
+
+
+
+
+
+#ib(9)#4.5. #ib#Blockorientierte Ein-/Ausgabe#ie##ie(9)#
+
+
+
+Die blockorientierte Ein-/Ausgabe dient dazu, Datenraumseiten (#ib#Blöcke#ie#) oder Teile
+davon über die #ib#Kanäle#ie# zu transferieren. Sie wird vom System u.a. beim Archivzugriff
+und bei der Konfigurierung der Kanäle eingesetzt.
+
+Die Wirkung der blockorientierten Ein-/Ausgabeoperationen kann dabei kanal- und
+rechnerspezifisch unterschiedlich sein.
+Auf dem Archivkanal (31) und allen anderen Block-IO-Kanälen werden bei
+'code 1 = 0' die normalen Blocklese- bzw. -schreiboperationen durchgeführt. 'code 2'
+gibt dabei die Blocknummer an. Andere (positive) Werte von 'code 1' sind zur Zeit
+nicht offiziell definiert. Negative Werte können vom SHard für Spezialaufgaben verge­
+ben werden.
+
+
+
+#ib#blockin#ie#
+ PROC blockin (DATASPACE VAR ds, INT CONST page nr, code1, code2,
+ INT VAR return code)
+ Zweck: Die Seite 'page nr' des Datenraums 'ds' wird "eingelesen". Die Opera­
+ tion kann durch 'code1' und 'code2' näher gesteuert werden.
+
+ PROC blockin (ROW 256 INT VAR block, INT CONST code1, code2,
+ INT VAR return code)
+ Zweck: Wie oben, nur wird der Block direkt als Datenstruktur übergeben.
+
+#ib#blockout#ie#
+ PROC blockout (DATASPACE CONST ds, INT CONST page nr,
+ code1, code2, INT VAR return code)
+ Zweck: Die Seite 'page nr' des Datenraums 'ds' wird "ausgegeben". Die Opera­
+ tion kann durch 'code1' und 'code2' näher gesteuert werden.
+
+ PROC blockout (ROW 256 INT CONST block, INT CONST code1, code2,
+ INT VAR return code)
+ Zweck: Wie oben, nur wird der Block als Datenstruktur übergeben.
+
+#ib#control#ie#
+ PROC control (INT CONST code1, code2, code3, INT VAR return code)
+ Zweck: Diese Prozedur dient zur Kanalsteuerung.
+
+#ib#ds pages#ie#
+ INT PROC ds pages (DATASPACE CONST ds)
+ Zweck: Liefert die Anzahl der belegten Seiten eines Datenraums. (Jede Seite ist
+ 512 Byte groß.)
+
+#ib#next ds page#ie#
+ INT PROC next ds page (DATASPACE CONST ds, INT CONST page nr)
+ Zweck: Liefert die Nummer der nächsten (von 'page nr' an gerechneten) Seite
+ des Datenraums. Die erste belegte Seite erhält man durch
+
+ next ds page (ds, -1)
+
+ #on ("b")#Achtung: Die Seitennummern müssen nicht lückenlos sein.#off ("b")#
+
diff --git a/doc/system/systemhandbuch.3 b/doc/system/systemhandbuch.3
new file mode 100644
index 0000000..3c0a482
--- /dev/null
+++ b/doc/system/systemhandbuch.3
@@ -0,0 +1,1366 @@
+#start(2.5,1.5)#
+#pageblock#
+#block#
+#page (63)#
+#headeven#
+
+%#center#EUMEL-Systemhandbuch
+
+
+#end#
+#headodd#
+
+#center#5. Supervisor, Tasks und Systemsteuerung#right#%
+
+
+#end#
+
+#ib(9)#5. #ib#Supervisor#ie#, #ib#Tasks#ie# und
+ #ib#Systemsteuerung#ie##ie(9)#
+
+
+
+#ib(9)#5.1. #ib#Tasks#ie##ie(9)#
+
+
+
+#ib(9)#Der Datentyp #ib#TASK#ie##ie(9)#
+
+
+Benannte Tasks werden innerhalb eines Rechners vollständig und eindeutig über ihren
+Namen identifiziert. Eine weitere Möglichkeit der Identifikation besteht in der Verwen­
+dung von Datenobjekten vom Typ TASK. Beispiel:
+
+ TASK VAR plotter := task ("PLOTTER 1")
+
+Die Taskvariable 'plotter' bezeichnet jetzt die Task im System, die augenblicklich den
+Namen "PLOTTER 1" hat. Nun sind #ib#Taskvariablen#ie# auch unter Berücksichtigung der Zeit
+und nicht nur im aktuellen Systemzustand eindeutig. Der Programmierer braucht sich
+also keine Sorgen darüber zu machen, daß seine Taskvariable irgendwann einmal eine
+"falsche" Task (nach Löschen von "PLOTTER 1" neu eingerichtete gleichen oder ande­
+ren Namens) identifiziert. Wenn die Task "PLOTTER 1" gelöscht worden ist, bezeichnet
+'plotter' keine gültige Task mehr.
+
+#ib#Unbenannte Tasks#ie# haben alle den Pseudonamen "-". Sie können nur über Taskvari­
+ablen angesprochen werden.
+
+Der #ib#Task-Katalog#ie# wird vom Supervisor geführt; andere Tasks können sich Kopien
+dieses Katalogs besorgen. Einige Prozeduren arbeiten auf dieser taskeigenen Kopie,
+ohne diese automatisch auf den neuesten Stand zu bringen (Effizienzgründe). Das
+muß bei Bedarf explizit geschehen.
+
+
+#ib#TASK#ie#
+ TYPE TASK
+ Zweck: Interner Taskbezeichner
+
+:=
+ OP := (TASK VAR dest, TASK CONST source)
+ Zweck: Zuweisung von internen Taskbezeichnern
+
+=
+ BOOL OP = (TASK CONST left, right)
+ Zweck: Gleichheitsabfrage
+
+<
+ BOOL OP < (TASK CONST left, right)
+ Zweck: Überprüft, ob die Task 'left' ein Sohn, Enkel, Urenkel, ... der Task 'right'
+ ist.
+
+/
+ TASK OP / (TEXT CONST task name)
+ Zweck: Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene
+ Katalog wird automatisch aktualisiert (identisch mit der
+ PROC task (TEXT CONST task name).
+ Fehlerfall:
+ * ... gibt es nicht
+
+ TASK OP / (INT CONST station number, TEXT CONST name)
+ Zweck: Liefert die Task des angegebenen Namen von der Station mit der ange­
+ gebenen Nummer.
+
+#ib#access#ie#
+ PROC access (TASK CONST task)
+ Zweck: Aktualisiert den eigenen Taskkatalog, falls 'task' nicht darin enthalten ist.
+
+#ib#access catalogue#ie#
+ PROC access catalogue
+ Zweck: Aktualisiert den eigenen Taskkatalog, indem die neueste Fassung vom
+ Supervisor geholt wird. Die Prozeduren 'father', 'son', 'brother' arbeiten
+ dann auf dieser neuen Fassung.
+
+#ib#archive#ie#
+ TASK PROC archive
+ Zweck: Liefert den internen Taskbezeichner der aktuellen Task mit Namen
+ "ARCHIVE". Diese Prozedur dient zum schnellen und bequemen An­
+ sprechen der Archivtask.
+
+#ib#brother#ie#
+ TASK PROC brother (TASK CONST task)
+ Zweck: Liefert den nächsten Bruder von 'task'. Falls kein Bruder existiert, wird
+ 'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automatisch!
+
+#ib#canal#ie#
+ TASK PROC canal (INT CONST channel number)
+ Zweck: Diese Prozedur zeigt an, welche Command-Analyser-Task an einem
+ bestimmten Kanal hängt.
+
+#ib#exists#ie#
+ BOOL PROC exists (TASK CONST task)
+ Zweck: Falls 'task' auf der eigenen Station liegt, informiert diese Prozedur, ob
+ die angegebene 'task' noch existiert. Der eigene Taskkatalog wird dabei
+ aktualisiert.
+ Wenn abgefragt werden soll, ob 'task' auf einer anderen Station liegt,
+ muß die Prozedur 'name (task) <> "" ' verwendet werden.
+ Achtung: Diese Prozedur taugt nicht dazu, zu erfragen, ob eine Task
+ mit bestimmtem Namen im System exisiert.
+
+ exists (task ("hugo"))
+
+ Falls die Task "hugo" nicht existiert, führt schon der Aufruf
+ 'task ("hugo")' zum 'errorstop (""hugo" gibt es nicht")'.
+
+#ib#exists task#ie#
+ BOOL PROC exists task (TEXT CONST name)
+ Zweck: Wenn auf der eigenen Station eine Task mit dem Namen 'name' exi­
+ stiert, liefert diese Prozedur 'TRUE'.
+
+#ib#father#ie#
+ TASK PROC father
+ Zweck: Liefert die eigene Vatertask.
+
+ TASK PROC father (TASK CONST task)
+ Zweck: Liefert den Vater von 'task'. Existiert kein Vater (z.B. bei UR), wird niltask
+ geliefert. Aktualisiert den eigenen Katalog nicht automatisch!
+
+#ib#index#ie#
+ INT PROC index (TASK CONST task)
+ Zweck: Liefert einen INT-Wert von 1 bis 125, der 'task' unter allen gleichzeitig (!)
+ existierenden Tasks eindeutig identifiziert.
+
+#ib#is niltask#ie#
+ BOOL PROC is niltask (TASK CONST task)
+ Zweck: task = niltask
+
+#ib#myself#ie#
+ TASK PROC myself
+ Zweck: Liefert eigenen Task-Bezeichner.
+
+#ib#name#ie#
+ TEXT PROC name (TASK CONST task)
+ Zweck: Liefert den Namen von 'task'. Die Task muß noch im System existieren,
+ sonst ist der Name nicht mehr bekannt. Falls die 'task' noch nicht im
+ eigenen Katalog enthalten ist, wird er aktualisiert.
+
+#ib#niltask#ie#
+ TASK CONST niltask
+ Zweck: Bezeichner für "keine Task". So liefern die Prozeduren 'son', 'brother'
+ und 'father' als Resultat 'niltask', wenn keine Sohn-, Bruder- oder Vater­
+ task existiert.
+
+#ib#printer#ie#
+ TASK PROC printer
+ Zweck: Liefert den internen Taskbezeichner der aktuellen Task mit Namen
+ #ib#PRINTER#ie#. Diese Prozedur dient zum schnellen und bequemen Anspre­
+ chen des Druckspoolers.
+
+#ib#public#ie#
+ TASK PROC public
+ Zweck: Liefert den internen Taskbezeichner der Task #ib#PUBLIC#ie#.
+
+#ib#reserve#ie#
+ PROC reserve (TASK CONST task)
+ Zweck: Reservieren einer Task für den ausschließlichen Dialog mit der Task, in
+ der das Kommando gegeben wurde.
+ PROC reserve (TEXT CONST message, TASK CONST task)
+ Zweck: Wie 'reserve (TASK CONST task)' mit Übergabe einer 'message'.
+
+#ib#son#ie#
+ TASK PROC son (TASK CONST task)
+ Zweck: Liefert den ersten Sohn von 'task'. Falls keiner im Katalog vermerkt ist,
+ wird 'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automa­
+ tisch!
+
+#ib#supervisor#ie#
+ TASK PROC supervisor
+ Zweck: Liefert den internen Taskbezeichner des Supervisors.
+
+#ib#task#ie#
+ TASK PROC task (TEXT CONST task name)
+ Zweck: Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene
+ Katalog wird automatisch aktualisiert.
+ Fehlerfall:
+ * ... gibt es nicht
+
+ TASK PROC task (INT CONST channel number)
+ Zweck: Liefert den Namen der Task, die an dem angegebenen Kanal hängt.
+
+
+
+#ib##ib(9)#Inter-Task-Kommunikation#ie##ie(9)#
+
+
+Die #ib#Task-Kommunikation#ie# im EUMEL System ist strikt botschaftsorientiert. Eine #ib#Bot­
+schaft#ie# bzw. "#ib#Sendung#ie#" besteht immer aus einem #ib#Sendungscode#ie# (INT) und einem
+Datenraum (DATASPACE). Damit kann eine Botschaft bis zu 1 Mbyte umfassen!
+
+Kommunikation zwischen zwei Tasks ist nur dann möglich, wenn #ib#Sender#ie# und #ib#Empfän­
+ger#ie# dazu bereit sind. Eine Sendung kann also nur dann korrekt transferiert werden,
+wenn der Empfänger existiert und empfangsbereit ist. Diese Art der Kommunikation
+wurde gewählt, um
+
+ - eine möglichst einfache und effiziente Implementation zu ermöglichen und
+ - mit den vorhandenen Primitiva möglichst flexibel bei der Implementation
+ "höherer" Kommunikationsmethoden (z.B. Warteschlangen) zu sein.
+
+
+#ib#call#ie#
+ PROC call (TASK CONST destination, INT CONST send code,
+ DATASPACE VAR message ds, INT VAR reply code)
+ Zweck: Die eigene Task wartet, bis die Zieltask 'destination' empfangsbereit ist.
+ Dann wird die Sendung ('send code' und 'message ds') transferiert.
+ Anschließend wartet die Sendertask auf eine Antwort von 'destination'.
+ Für Sendungen anderer Tasks ist sie dabei nicht (!) empfangsbereit, nur
+ die Zieltask kann eine Antwortsendung schicken. Nachdem eine solche
+ Antwort eingetroffen ist, wird sie in 'message ds' und 'reply code' gelie­
+ fert und die eigene Task fortgesetzt. Wenn die angesprochene Zieltask
+ nicht existiert, wird -1 als 'reply code' geliefert. 'message ds' ist in
+ diesem Fall unverändert.
+ 'call' hat Ähnlichkeiten mit einem Prozeduraufruf, nur ist es hier der
+ Aufruf einer anderen Task. Störungen können hierbei nicht auftreten, da
+ der Zustand der Zieltask keine Rolle spielt (es wird auf Empfangsbereit­
+ schaft gewartet) und beim Warten auf Antwort auch keine "Querschlä­
+ gersendungen" von anderen Tasks dazwischenfunken können.
+
+#ib#pingpong#ie#
+ PROC pingpong (TASK CONST destination, INT CONST send code,
+ DATASPACE VAR message ds, INT VAR reply code)
+ Zweck: Diese Prozedur wirkt wie die entsprechende 'call'-Prozedur, wartet aber
+ nicht (!), bis die Zieltask empfangsbereit ist. Wenn die Zieltask existiert,
+ aber nicht empfangsbereit ist, wird -2 als 'reply code' geliefert. Der
+ 'message ds' ist dann nicht verändert.
+
+#ib#send#ie#
+ PROC send (TASK VAR destination, INT CONST send code,
+ DATASPACE VAR message ds, INT VAR receipt)
+ Zweck: Wenn die Zieltask existiert und empfangsbereit ist, wird die Sendung
+ ('send code' und 'message ds') transferiert und die Zieltask aktiviert. Als
+ 'receipt' wird 0 (=ack) gemeldet. Diese positive Quittung kommt nicht
+ von der Zieltask, sondern bestätigt nur, daß die Sendung ordnungsge­
+ mäß übertragen wurde. Der Datenraum gehört dann nicht mehr der
+ Sender-, sondern der Zieltask, d.h. die Variable 'message ds' bezeichnet
+ keinen gültigen Datenraum mehr.
+ Im Gegensatz zu 'call' und 'pingpong' läuft die Sendertask ohne Halt
+ weiter und wartet nicht auf eine Antwort von der Zieltask.
+ Falls die Zieltask nicht existiert, wird -1, falls sie nicht empfangsbereit ist,
+ -2 als 'receipt' geliefert. Bei diesen negativen Quittungen bleibt der
+ Datenraum Eigentum der Absendertask, d.h. die Variable 'message ds'
+ bezeichnet immer noch einen gültigen Datenraum.
+
+ PROC send (TASK VAR destination, INT CONST send code,
+ DATASPACE VAR message ds)
+ Zweck: s.o. Negative Quittungen (-1 oder -2) werden jedoch ignoriert. Der Da­
+ tenraum wird entweder transferiert oder gelöscht ('forget'), steht also in
+ keinem Fall mehr zur Verfügung. Die Prozedur sollte nur verwendet
+ werden, wenn der Sender sicher ist, daß die Sendung transferiert wer­
+ den kann, bzw. daß sie im Fehlerfall nicht transferiert zu werden braucht.
+
+#ib#wait#ie#
+ PROC wait (DATASPACE VAR message ds, INT VAR message code,
+ TASK VAR source task)
+ Zweck: Die eigene Task geht in den #ub##ib#offenen Wartezustand#ie##ue# über. Sie ist jetzt
+ gegenüber allen anderen Tasks empfangsbereit. Sie wird erst fortge­
+ setzt, wenn eine Sendung eintrifft. Diese wird in 'message ds' und 'mes­
+ sage code', die Absendertask in 'source task' geliefert.
+
+Der #ub##ib#Sendungscode#ue##ie# muß zwischen den Beteiligten abgesprochen sein und ist also frei
+wählbar. Allerdings sind negative Werte nicht erlaubt, sondern für bestimmte "Pseudo­
+antworten" vom Betriebssystem reserviert:
+
+ -1 "Zieltask existiert nicht"
+
+ -2 "Zieltask ist nicht empfangsbereit"
+
+ -4 "Eingabe vom Kanal" Diese Meldung kann nur (!) beim offenen War­
+ ten ('wait') auftreten, und auch dann nur, wenn die Task gleichzeitig
+ an einen Kanal angekoppelt ist. Auf diese Weise wird mitgeteilt, daß
+ mindestens ein Zeichen vorliegt. Dieses kann im folgenden mit 'in­
+ char', 'incharety', 'blockin' oder darauf aufbauenden Prozeduren
+ gelesen werden.
+
+Weitere Codes werden in Systemroutinen standardmäßig verwandt und sollten auch
+von Anwenderroutinen genauso interpretiert werden:
+
+ 0 "#ib#ack#ie#" positive Quittung
+
+ 1 "#ib#nak#ie#" negative Quittung
+
+ 2 "#ib#error nak#ie#" negative Quittung mit Fehlermeldung.
+ Der gelieferte Datenraum sollte die Struktur eines
+ BOUND TEXTs haben und die Fehlermeldung in
+ diesem TEXT beinhalten.
+
+
+Beispiel: #ub#Kommunikation mit einem Manager#ue#
+
+
+ Auftraggeber Manager
+
+
+ call (....) REP
+ wait (ds, order, order task) ;
+ execute order ;
+ send (order task, reply, ds)
+ PER
+
+Da der Auftraggeber 'call' verwendet, wartet er automatisch so lange, bis der Manager
+für ihn empfangsbereit wird. Dann schickt er die Sendung und geht gleichzeitig (!) in
+den geschlossenen "auf Antwort warten" - Zustand über. Der Manager kann daher
+unbesorgt mit dem "unsicheren" 'send' antworten, da die Empfangsbereitschaft des
+Auftraggebers nur durch Katastrophen wie Löschung der Task oder "halt from terminal"
+gestört werden kann. (In diesen Fällen kann die Antwort ruhig ins Leere gehen.)
+
+Hier sieht man auch den Unterschied zwischen
+
+ call (...) und send (....); wait (....) .
+
+Bei der zweiten Alternative können drei Störfälle eintreten:
+
+
+ a) Der Manager ist nicht empfangsbereit. 'send' versagt, 'wait' wartet ewig.
+
+ b) Da über die zeitlichen Rahmenbedingungen nichts ausgesagt werden kann,
+ ist es möglich, daß der Manager die Antwort schickt, bevor die 'wait'-Opera­
+ tion beim Auftraggeber ausgeführt werden konnte. In unserem Beispiel
+ würde das den Verlust der Rückmeldung und ewiges Warten seitens des
+ Auftraggebers auslösen.
+
+ c) Beim 'wait' kann eine Störsendung einer anderen Task eintreffen.
+
+
+
+
+
+
+
+#ib(9)#5.2. #ib#Supervisor#ie##ie(9)#
+
+
+
+#ib(9)##ib#Verbindung zum Supervisor#ie##ie(9)#
+
+
+#ib#begin#ie#
+ PROC begin (PROC start, TASK VAR new task)
+ Zweck: Es wird eine #ib#unbenannte Task#ie# (Pseudoname "-") als neuer Sohn der
+ aufrufenden eingerichtet und mit der Prozedur 'start' gestartet. Namens­
+ kollision ist nicht möglich, die erzeugte Task kann aber auch nicht na­
+ mensmäßig angesprochen werden. 'new task' identifiziert den neuen
+ Sohn, falls kein Fehler auftrat.
+ Fehlerfälle :
+ * zu viele Tasks
+
+ PROC begin (TEXT CONST son name, PROC start, TASK VAR new task)
+ Zweck: Es wird eine Task mit Namen 'son name' als Sohn der aufgerufenen
+ eingerichtet und mit der Prozedur 'start' gestartet. 'new task' identifi­
+ ziert den neuen Sohn, falls kein Fehler auftrat.
+ Fehlerfälle :
+ * zu viele Tasks
+ * Name unzulaessig (* "" oder LENGTH > 100 *)
+ * ... existiert bereits
+
+#ib#begin password#ie#
+ PROC begin password (TEXT CONST password)
+ Zweck: Bei normalen 'global manager'-Tasks kann man mit dieser Operation
+ das weitere Kreieren von Sohntasks unter Paßwortkontrolle stellen.
+ Wenn dieses Kommando in der Manager-Task gegeben worden ist, wird
+ bei folgenden SV-begin-Kommandos interaktiv das Paßwort verlangt.
+ Dabei gelten die üblichen Paßwort-Konventionen:
+
+ a) "" (Niltext) bedeutet #on("i")#kein Paßwort#off("i")#. Damit kann man durch
+ 'begin password ("")' das Paßwort wieder ausschalten.
+ b) "-" bedeutet #on("i")#jedes eingegebene Paßwort ist ungültig#off("i")#. Damit
+ kann man durch 'begin password ("-")' das Einrichten von
+ Sohntasks von außen (durch SV-Kommando) abschalten.
+
+#ib#break#ie#
+ PROC break
+ Zweck: Die Task koppelt sich von einem evtl. angekoppelten Terminal ab. Bei
+ der Abkopplung wird auf dem Terminal die "Tapete" ("Terminal n...
+ EUMEL Version ..../M...") ausgegeben.
+
+ PROC break (QUIET CONST quiet)
+ Zweck: Die Task koppelt sich von einem evtl. angekoppelten Terminal ab. Dabei
+ wird aber keine "Tapete" ausgegeben.
+
+#ib#channel#ie#
+ INT PROC channel
+ Zweck: Liefert die #ib#Kanalnummer#ie# der eigenen Task. Falls kein Kanal (Terminal)
+ zugeordnet ist, wird 0 geliefert.
+
+ INT PROC channel (TASK CONST task)
+ Zweck: Liefert die Kanalnummer der angegebenen Task. Ist kein Kanal zuge­
+ ordnet, wird 0 geliefert.
+
+#ib#clock#ie#
+ REAL PROC clock (INT CONST index)
+ Zweck: Liefert die über Index spezifizierte #ib#Systemuhr#ie#. Die Zeiteinheit ist 1 sec,
+ die Meßgenauigkeit 0.1 sec.
+ clock (0) : CPU-Zeit der eigenen Task
+ clock (1) : Realzeit des Systems
+
+ REAL PROC clock (TASK CONST task)
+ Zweck: Liefert die CPU-Zeit der angegebenen Task.
+
+ Hinweis: Die CPU-Zeit beginnt mit der Taskkreation zu laufen. Sie gibt also
+ jeweils die gesamte bisher verbrauchte CPU-Zeit an. Die Zeitdauer
+ bestimmter Operationen kann als Differenz zweier 'clock'-Aufrufe
+ gemessen werden. Beim Ende einer Task wird ihr CPU-Zeitverbrauch
+ dem Vater zugeschlagen, um Abrechnungen zu ermöglichen.
+
+#ib#continue#ie#
+ PROC continue (INT CONST channel nr)
+ Zweck: Die Task versucht, sich an den vorgegebenen Kanal anzukoppeln. Falls
+ sie vorher schon an ein Terminal gekoppelt war, wird implizit 'break'
+ durchgeführt, falls die Aktion erfolgreich durchgeführt werden konnte.
+ Ein erfolgreiches 'continue' beinhaltet implizit 'reset autonom'.
+ Anmerkung: Normale Tasks können auf die Kanäle 1-24 zugreifen,
+ Systemtasks dürfen sich auch an die privilegierten Kanäle
+ 25-32 ankoppeln.
+ Fehlerfälle:
+ * ungueltiger Kanal
+ * Kanal belegt
+
+#ib#end#ie#
+ PROC end
+ Zweck: Löscht die eigene Task und alle Söhne. Wenn die Task an ein Terminal
+ angekoppelt ist, wird vorher angefragt, ob wirklich gelöscht werden soll.
+ Anschließend wird die Standard-"Tapete" auf dem Bildschirm ausge­
+ geben.
+
+ PROC end (TASK CONST task)
+ Zweck: Löscht die angegebene 'task'. 'task' muß allerdings die eigene oder eine
+ Sohn- bzw. Enkel-Task der eigenen sein (siehe auch: 'Privilegierte Ope­
+ rationen'). Im Unterschied zur oben aufgeführten parameterlosen Proze­
+ dur 'end' wird nicht angefragt und auch keine "Tapete" ausgegeben.
+ Wenn also die eigene Task ohne Reaktion auf dem Terminal beendet
+ werden soll, kann dies mit 'end (myself)' geschehen.
+ Fehlerfall:
+ * 'end' unzulaessig
+
+#ib#family password#ie#
+ PROC family password (TEXT CONST password)
+ Zweck: Diese Prozedur setzt oder ändert das Paßwort derjenigen Familien­
+ mitglieder, die kein Paßwort oder das gleiche Paßwort wie die aufrufen­
+ de Task haben.
+ Zu einer Familie gehören die Task, in der man sich befindet, und die ihr
+ untergeordneten Tasks.
+ Natürlich gelten auch hier die allgemeinen Paßwortbedingungen (siehe
+ dazu: 'task password').
+ Beispiel: Das Kommando 'family password ("EUMEL")' wird in SYSUR
+ gegeben. Dadurch wird das SYSUR­Paßwort und die Paß­
+ worte der entsprechenden Tasks unter SYSUR auf "EUMEL"
+ gesetzt.
+
+
+#ib#next active#ie#
+ PROC next active (TASK VAR task)
+ Zweck: 'task' wird auf die nächste aktive Task gesetzt. Aktiv sind alle Tasks, die
+ sich im Zustand 'busy' befinden oder auf Ein/Ausgabe warten (i/o) und
+ an einen Kanal angekoppelt sind. Beispiel:
+
+
+ TASK VAR actual task := myself;
+ REP
+ ... ;
+ next active (actual task)
+ UNTIL actual task = myself PER.
+
+
+ Hier werden alle aktiven Tasks durchgemustert (z.B. für Scheduling-
+ Anwendungen). Dieses Verfahren ist sehr viel weniger aufwendig als
+ eine Durchmusterung des ganzen Taskbaumes, liefert aber nur die
+ gerade aktiven Tasks.
+
+#ib#rename myself#ie#
+ PROC rename myself (TEXT CONST new task name)
+ Zweck: Die eigene Task erhält als neuen Tasknamen 'new task name'. Damit
+ kann auch aus einer benannten eine unbenannte Task mit dem Pseu­
+ donamen "-" werden. Umbenennung in die andere Richtung ist eben­
+ falls möglich.
+ Achtung: Durch das Umbenennen der Task werden alle Taskvariablen,
+ die sich auf diese Task beziehen, ungültig (als wäre die Task
+ gelöscht und dann neu eingerichtet).
+ Fehlerfälle:
+ * ... existiert bereits
+ * Name unzulaessig
+
+#ib#reset autonom#ie#
+ PROC reset autonom
+ Zweck: Die eigene Task deklariert sich beim Supervisor als nicht autonom
+ (Normalzustand). Das bedeutet, 'continue'-Aufforderungen über ein
+ 'Supervisor-Kommando' vom Terminal werden vom System ohne Be­
+ nachrichtigung der Task durchgeführt.
+
+#ib#set autonom#ie#
+ PROC set autonom
+ Zweck: Die eigene Task deklariert sich beim Supervisor als #ib#autonom#ie# (üblich für
+ Manager-Tasks). Wenn jetzt ein 'continue'-Supervisor-Kommando auf
+ diese Task von einem Terminal aus gegeben wird, wird der Task über
+ 'send' eine Nachricht zugestellt.
+ Achtung: Im autonomen Zustand ist der Programmierer selbst für die
+ Reaktion der Task verantwortlich. Man kann sie von außen auf
+ keine Weise gewaltsam an ein Terminal koppeln (ermög­
+ licht Paßalgorithmen / Datenschutz).
+ Um die Programmierung etwas zu entschärfen, wird eine
+ Task automatisch aus dem autonomen in den Normalzustand
+ überführt, wenn sie selbst ein 'continue' gibt.
+
+#ib#status#ie#
+ INT PROC status (TASK CONST task)
+ Zweck: Liefert den Status der angegebenen Task:
+
+ 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, ist 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.
+
+#ib#storage#ie#
+ PROC storage (INT VAR size, used)
+ Zweck: Informiert über den physisch verfügbaren ('size') und belegten ('used')
+ Speicher des Gesamtsystems. Die Einheit ist KByte.
+ Achtung: 'size' gibt den Speicher an, der benutzt werden kann, ohne in
+ eine Engpaßsituation zu kommen. Tatsächlich wird auf dem
+ Hintergrundmedium noch eine gewisse Reserve freigehalten.
+ Wenn diese angebrochen wird, befindet sich das System im
+ #ib#Speicherengpaß#ie#. Dieser Zustand kann mit 'used > size'
+ abgefragt werden.
+
+ INT PROC storage (TASK CONST task)
+ Zweck: Liefert die Größe des Speicherbereichs in KByte, den die angegebene
+ Task augenblicklich belegt.
+ Dabei werden durch Sharing mögliche Optimierungen nicht berücksich­
+ tigt. D.h. eine Task kann physisch erheblich weniger Speicher als logisch
+ belegen. Entsprechend kann die Speichersumme aller Tasks den phy­
+ sisch belegten Speicherbereich des Gesamtsystems beträchtlich über­
+ schreiten.
+
+#ib#task password#ie#
+ PROC task password (TEXT CONST password)
+ Zweck: Das angegebene Paßwort wird beim Supervisor hinterlegt. Bei folgen­
+ den SV-Kommandos 'continue...' auf diese Task wird interaktiv das
+ Paßwort abgefragt. Dabei gelten die üblichen Paßwort-Konventionen:
+
+ a) "" (Niltext) bedeutet #on("i")#kein Paßwort#off("i")#. Damit kann man durch
+ 'task password ("")' das Paßwort wieder ausschalten.
+
+ b) "-" bedeutet #on("i")#jedes eingegebene Paßwort ist ungültig#off("i")#. Damit
+ kann man durch 'task password ("-")' das Ankoppeln an ein
+ Terminal von außen (durch SV-Kommando) unterbinden.
+
+
+
+
+#ib##ib(9)#Privilegierte Operationen#ie(9)##ie#
+
+
+Die im folgenden aufgeführten privilegierten Operationen können #ub#nur#ue# von #ib#System­
+tasks#ie# - das sind direkte oder indirekte Söhne des Supervisors - ausgeführt werden. Um
+Mißbrauch unmöglich zu machen, sollte der Supervisor nach der Einrichtung der
+gewünschten Systemtasks bzgl. der Einrichtung neuer Söhne gesperrt und alle Sy­
+stemtasks durch Paßworte geschützt werden.
+
+
+#ib#block#ie#
+ PROC block (TASK CONST task)
+ Zweck: Die angegebene #ib#Task wird blockiert#ie#, d.h. so lange von der Verarbeitung
+ suspendiert, bis die Blockade durch 'unblock' wieder aufgehoben wird.
+ Diese Operation wird vom Scheduler benutzt. Falls das Packet 'schedu­
+ ler' insertiert ist, sollten andere Tasks die Prozedur 'block' nicht anwen­
+ den, um dem Scheduling nicht entgegenzuwirken.
+
+#ib#collect garbage blocks#ie#
+ PROC collect garbage blocks
+ Zweck: Es wird eine außerplanmäßige Gesamtmüllabfuhr durchgeführt. Plan­
+ mäßig (d.h. ohne Aufruf dieser Prozedur) wird sie alle 15 Minuten und in
+ Engpaßsituationen durchgeführt. Nach Aufruf dieser Prozedur wird der
+ automatische Fixpunkt/ Müllabfuhr-Rhythmus ca. 1 Stunde lang ge­
+ sperrt. Somit kann man z.B. in der Task "scheduler" einen eigenen
+ Fixpunkt/Müllabfuhr-Rhythmus implementieren.
+ Achtung: Diese Operation erfordert starkes Paging und dauert dement­
+ sprechend lange.
+
+#ib#end#ie#
+ PROC end (TASK CONST task)
+ Zweck: Die angegebene Task und alle Söhne, Enkel etc. werden gelöscht.
+ Systemtasks (direkte und indirekte Nachkommen des SUPERVISORs)
+ können beliebige andere Tasks (nicht nur eigene Söhne) löschen.
+
+#ib#fixpoint#ie#
+ PROC fixpoint
+ Zweck: Für das Gesamtsystem wird ein außerplanmäßiger #ib#Fixpunkt#ie# geschrie­
+ ben. Planmäßige Fixpunkte (d.h. ohne Aufruf dieser Prozedur) werden
+ alle 15 Minuten geschrieben. Nach Aufruf dieser Prozedur wird der
+ automatische Fixpunkt/Müllabfuhr-Rhythmus ca. 1 Stunde lang ge­
+ sperrt. Somit kann man z.B. in der Task "scheduler" einen eigenen
+ Fixpunkt/Müllabfuhr-Rhythmus implementieren.
+ Achtung: Diese Operation verursacht starkes Paging (Rückschreiben
+ aller veränderten Seiten auf das Hintergrundmedium) und
+ dauert dementsprechend lange.
+
+#ib#prio#ie#
+ INT PROC prio (TASK CONST task)
+ Zweck: Liefert die augenblickliche #ib#Priorität#ie# der angegebenen Task.
+
+ PROC prio (TASK CONST task, INT CONST new prio)
+ Zweck: Setzt die Priorität der Task.
+
+ Hinweis: 0 ist die höchste, 15 die niedrigste Priorität. Die Prioritäten 0 bis 2
+ werden von EUMEL 0 (fine scheduling) verwaltet. Die restlichen Priori­
+ täten können für 'rough scheduling' (siehe auch im Kapitel Scheduler)
+ eingesetzt werden.
+ Durch 'continue ("name")' wird die Priorität wieder auf 0 gesetzet.
+
+#ib#set date#ie#
+ PROC set date
+ Zweck: #ib#Datum#ie# und #ib#Uhrzeit#ie# können im Dialog gesetzt werden (Form wie beim
+ Start des Systems). Dabei wird gegebenenfalls die Hardware­Uhr gele­
+ sen.
+ Sollte der SHard ein falsches Datum liefern, so muß das Datum mit
+ set clock (date("tt.mm.jj") + time ("hh:mm:ss"))
+ gesetzt werden.
+
+#ib#save system#ie#
+ PROC save system
+ Zweck: Der gesamte Systemhintergrund wird auf Archivdisketten gesichert. Zu
+ diesem Zweck wird das System wie bei 'shutup' heruntergefahren.
+
+#ib#shutup#ie#
+ PROC shutup
+ Zweck: #ib#Kontrolliertes Herunterfahren des Systems#ie#. Beim nächsten Systemstart
+ wird automatisch Datum und Uhrzeit erfragt, wenn der Kommandodial­
+ og eingeschaltet ('command dialogue (TRUE)') und keine Hardwareuhr
+ vorhanden ist. Falls diese Prozedur nicht vor dem Abschalten aufgerufen
+ wurde, findet beim Neustart ein Aufsetzen auf dem letzten Fixpunkt statt
+ (RERUN).
+
+#ib#unblock#ie#
+ PROC unblock (TASK CONST task)
+ Zweck: Eine vorherige Blockierung der Task wird aufgehoben. Ist die Task nicht
+ blockiert, bewirkt 'unblock' nichts. Diese Operation wird vom Scheduler
+ benutzt. Andere Tasks sollten sie normalerweise nicht anwenden, um
+ dem Scheduling nicht entgegenzuwirken.
+
+
+
+
+
+#ib(9)#5.3. #ib#ID ­ Konstanten#ie##ie(9)#
+
+
+Die Informationsprozedur
+
+ INT PROC id (INT CONST no)
+
+liefert folgende Informationen über die Soft­ und Hardware des Rechners:
+
+ Von EUMEL 0 werden geliefert:
+ id (0) --> EUMEL­Version
+ id (1) --> Prozessortyp (1: Z80,
+ 2: Z8001,
+ 3: 8086 und kompatible,
+ 4: 68000
+ 5: 80286)
+ id (2) --> Urlader­Version
+ id (3) --> reserviert
+
+ Vom SHard werden geliefert:
+ id (4) --> Lizenznummer des SHards
+ id (5) --> Installationsnummer des EUMEL­Anwenders
+ id (6) --> SHard­spezifisch
+ id (7) --> SHard­spezifisch
+
+
+
+
+
+#ib(9)#5.4. #ib#Systemverwaltung#ie##ie(9)#
+
+
+#on("i")#Achtung#off("i")#: Dieser Teil des Systemhandbuchs ist nur für solche Multi-User-Installationen
+ von Bedeutung, die erweiterte Systemverwaltungsfunktionen generieren
+ bzw. modifizieren wollen.
+
+ #on("i")#Das EUMEL-System ist in der ausgelieferten minimalen Standardform (ohne
+ die Features) ohne weiteres benutzbar#off("i")#.
+
+
+
+
+
+#ib(9)#Der Systemmanager #ib#SYSUR#ie##ie(9)#
+
+
+Der Systemmanager verhält sich im wesentlichen wie ein normaler Manager, allerdings
+mit folgender Erweiterung:
+
+ - Die Operationen 'list' und 'fetch' können von allen Tasks des Systems und
+ nicht nur von Söhnen durchgeführt werden. Damit kann man Systemverwal­
+ tungsdateien (z.B. "#ib#logbuch#ie#") von allen Tasks aus lesen. 'erase' und 'save' sind
+ jedoch nur von Söhnen bzw. Enkeln - d.h. von privilegierten Systemtasks - aus
+ zulässig.
+
+Das Paket stellt folgende Operationen zusätzlich zur Verfügung:
+
+#ib#generate shutup manager#ie#
+ PROC generate shutup manager
+ Zweck: Es wird eine Sohntask mit Namen "shutup" kreiert. Diese Task ist nicht­
+ (!) paßwortgeschützt, läßt aber keine normalen Kommandos zu, son­
+ dern fragt nur
+
+ shutup (j/n) ?
+
+ So kann jeder das System kontrolliert abschalten und die privilegierten
+ Operationen des OPERATORs wie 'end' sind dennoch geschützt.
+
+#ib#put log#ie#
+ PROC put log (TEXT CONST log record)
+ Zweck: Der angegebene 'log record' wird mit vorangestelltem Tasknamen des
+ Absenders, Datums- und Uhrzeitangabe in die Logbuchdatei "logbuch"
+ in der Task "SYSUR" geschrieben. Der neue Satz wird an die Datei ange­
+ fügt. ("logbuch" wird z.B. vom EUMELmeter verwandt.)
+
+ Hinweis: Bei Verwendung des Logbuchs darf die zwar große, aber doch end­
+ liche Dateikapazität nicht vergessen werden. Nachdem das Logbuch
+ mit 4073 Sätzen voll ist, werden weitere 'put log' Operationen igno­
+ riert. Die Datei "logbuch" sollte deshalb - wenn sie beispielsweise vom
+ EUMELmeter verwandt wird - von Zeit zu Zeit gelöscht werden ('erase'
+ bzw. 'forget')!
+
+
+
+
+#ib(9)##ib#Scheduler#ie##ie(9)#
+
+
+Der Scheduler dient zur Verwaltung der rechenwilligen #ib#Hintergrundtask#ie#s. Will man den
+Scheduler (eventuell abgeändert) insertieren, muß man die Task "scheduler" als Sohn
+von SYSUR einrichten. Dann holt man die Datei "scheduler" vom Archiv und insertiert
+sie. "scheduler" beinhaltet "#ib#eumelmeter#ie#". Es wird beim Start erfragt, ob die Meßrouti­
+nen aktiviert werden sollen oder nicht.
+
+
+
+
+#ib##ib(9)#Funktionsweise des Schedulers#ie(9)##ie#
+
+
+Der Scheduler sammelt in bestimmten Zeitintervallen alle aktiven (rechnenden) Tasks
+ab, die an kein Terminal angekoppelt sind und auch keine Manager sind. Diese Tasks
+werden blockiert und in die Warteschlange der #ib#Standardklasse#ie# eingefügt.
+
+Die Klassen des Schedulers werden durch die #ib#Taskpriorität#ie#en 5 bis 9 definiert. Die
+Standardklasse entspricht der Priorität 7. Die Klassenzugehörigkeit einer Task kann von
+einer Systemtask aus (z.B. von "OPERATOR") mit der Prozedur '#ib#prio#ie#' verändert werden.
+
+Der Scheduler geht nach folgender Strategie vor:
+
+ Anhand der Vordergrund/Hintergrundlast des Systems wird entschieden, ob
+ überhaupt Hintergrundtasks aktiv sein dürfen, welche Klassen aktiv sein dürfen
+ und wieviel #ib#Hintergrundtask#ie#s gleichzeitig rechnen dürfen.
+
+ Die wartenden #ib#Hintergrundtask#ie#s werden im #ib#Round-Robin-Verfahren#ie# aktiviert.
+ Dabei kommt die Klasse n+1 erst dann zum Zug, wenn die Warteschlange der
+ Klasse n leer ist oder weniger Tasks enthält, als gleichzeitig aktiviert werden
+ sollen.
+
+Die implementierte Standardstrategie hat als oberste Maxime, den Vordergrund auf
+keinen Fall zu stören. Dementsprechend wird der Hintergrund nur aktiviert, wenn eine
+der folgenden Bedingungen erfüllt ist:
+
+ - Die Vordergrundlast des Systems liegt unter 3% .
+
+ - Es ist keine normale #ib#Vordergrundtask#ie# (Nachfahre von "UR") an einen Kanal
+ angekoppelt. Man beachte, daß Systemtasks hierbei nicht berücksichtigt
+ werden. Ein aktiver Drucker blockiert die Hintergrundtasks also nicht.
+
+
+
+
+EUMELmeter (Systemstatistik)
+
+
+Die #ib#Meßsoftware#ie# zum #ib#Protokollieren der Systembelastung#ie# befindet sich auf dem Archiv
+'std.zusatz'.
+
+Falls das System keinen #ib#Scheduler#ie# benutzt, muß eine Meßtask als Sohn von "SYSUR"
+eingerichtet werden. In diese Task muß dann die Datei "#ib#eumelmeter#ie#" vom Archiv geholt
+und übersetzt werden.
+
+Falls das System einen Scheduler beinhalten soll, muß bei der Generierung des Sche­
+dulers lediglich auf die Frage "mit eumelmeter (j/n) ?" mit "j" geantwortet werden.
+
+
+
+#ib##ib(9)#EUMELmeter#ie(9)##ie#
+
+
+Das EUMELmeter protokolliert die #ib#Systemlast#ie# in ca. 10 minütigen Abständen in der
+Datei "#ib#logbuch#ie#" in "SYSUR". Für jedes Meßintervall wird eine Zeile angefügt. Die Zeilen
+sind folgendermaßen aufgebaut:
+
+tt.mm.jj hh:mm hg uf ub pw pb cpuf cpub cpus last nutz
+
+
+tt.mm.jj hh:mm Datum und Uhrzeit des Eintrags
+
+hg Größe des aktuell belegten Hintergrundspeichers
+ (in KB)
+
+uf Anzahl der aktiven Vordergrundtasks
+
+ub Anzahl der aktiven Hintergrundtasks
+
+pw #ib#Paginglast#ie# bei wartender CPU (#ib#Paging/Wait#ie#)
+
+pb Paginglast bei aktiver CPU (#ib#Paging/Busy#ie#)
+
+cpuf #ib#CPU-Auslastung#ie# durch Vordergrundtasks
+
+cpub CPU-Auslastung durch Hintergrundtasks
+
+cpus #ib#CPU-Systemlast#ie#
+
+last #ib#Gesamtlast des Systems#ie#:
+ pw + pb + cpuf + cpub+ cpus
+ (Achtung: kann 100% übersteigen, da Platte und CPU über­
+ lappt arbeiten können.)
+
+nutz #ib#Nutzgüte#ie# im Meßintervall: 100% - pw - cpus
+ Die Nutzgüte gibt an, welcher Anteil der Systemarbeit für echte
+ Nutzarbeit verfügbar war. Sie ist die Summe aus der echten
+ Nutzlast 'cpuf+cpub' und der Leerzeit, die ja theoretisch auch
+ für Nutzarbeit hätte verwandt werden können. Sie läßt sich, wie
+ oben angegeben, auch berechnen, indem man den idealerweise
+ überflüssigen Overhead 'cpus' und 'pw' von 100% abzieht.
+#page#
+
+#count per page#
+#headeven#
+%#center#EUMEL-Systemhandbuch
+
+
+#end#
+#headodd#
+#center#6. Der EUMEL-Drucker#right#%
+
+
+#end#
+
+#ib(9)#6. Der #ib#EUMEL-Drucker#ie##ie(9)#
+
+
+
+#ib(9)#6.1. Allgemeine Einführung#ie(9)#
+
+
+Die Ansteuerung eines #ib#Druckers#ie# durch das EUMEL-System geschieht durch zwei
+aufeinanderbauende Komponenten. Die eine Komponete ist der hardwareunabhängi­
+ge #ib#EUMEL-Drucker#ie#, der die #ib#Textverarbeitungsanweisungen#ie# umsetzt und die Druck­
+seite entsprechend aufbereitet, so daß sie im Blocksatz, in Tabellenform oder in Spal­
+ten gedruckt werden kann. Die andere Komponente ist der hardwareabhängige #ib#Druk­
+kertreiber#ie#, der durch ein einfaches Interface zum EUMEL-Drucker, wie z.B. Textausge­
+ben, Positionieren oder Schrifttypen und Modifikationen an- und ausschalten, den
+eigentlichen Druck vornimmt.
+Die hardwareunabhängige Komponente, der EUMEL-Drucker, befindet sich bei den
+ausgelieferten Systemen im priviligierten Ast des Taskbaums, so daß beim Anschluß
+eines Druckers nur noch der hardwareabhängige Druckertreiber insertiert werden muß.
+Auf dem PRINTER-Archiv befinden sich schon einige Druckeranpassungen für diverse
+Druckertypen.
+
+- Implementierung des Druckertreiber-Interface
+ Das Paket mit dem Druckertreiber muß in einer Task "PRINTER" insertiert und
+ ein Spool eingerichtet werden.
+
+- Erstellen einer Fonttabelle für den anzuschießenden Drucker
+ Eine vorhandene Fonttabelle wird dabei in die Task "configurator" gebracht
+ werden. Die Fonttabelle sollte in allen bestehenden Tasks - insbesondere in
+ der Task "PUBLIC" und der Task "PRINTER" - mit dem #on("i")##on("b")#fonttable#off("i")##off("b")#-Kommando
+ eingestellt werden.
+
+
+
+
+#ib(9)#6.2. Das #ib#Druckertreiber-Interface#ie##ie(9)#
+
+
+Da der EUMEL-Drucker vor dem Druckertreiber insertiert ist, aber auf dem Drucker­
+treiber aufbaut, müssen beim Aufruf der 'print'-Prozedur des EUMEL-Druckers die
+Prozeduren des Druckertreibers mit übergeben werden. Aus progammtechnischen
+Gründen sollte ihre Anzahl möglichst gering gehalten werden. Deshalb gibt es die
+folgende drei Prozeduren, die mit einem 'op code' parametrisiert werden. Die Bedeu­
+tung der weiteren Parameter der Interfaceprozeduren hängen von diesem 'op code' ab.
+Die folgende Beschreibung der Prozeduren gibt einen Programmrahmen vor, in dem
+die Parameter durch Refinements entsprechend ihrer Bedeutung umdefiniert sind.
+
+
+
+PROC open (INT CONST op code, INT VAR param 1, param 2) :
+
+ LET document code = 1 ,
+ page code = 2 ;
+
+ SELECT op code OF
+ CASE document code : open document
+ CASE page code : open page
+ END SELECT.
+
+
+ x steps : param1 .
+ y steps : param2 .
+
+ #ib#open document#ie# :
+
+ Zweck: Die Prozedur wird vom EUMEL-Drucker zur Einleitung jedes Ausdrucks
+ aufgerufen. Hier können notwendige Initialisierungen der Hardware
+ durchgeführt werden. In 'x steps' und 'y steps' muß die Breite bzw.
+ Höhe der bedruckbaren Fläche des Papieres in Mikroschritten des
+ Druckers angegeben werden.#u##count#)#e#
+#foot#
+
+#value#) Zur Definition der Mikroschritte siehe Bemerkung 2.
+#end#
+
+
+
+ x start : param1 .
+ y start : param2 .
+
+ #ib#open page#ie# :
+
+ Zweck: Hiermit wird dem Hardware-Interface der Beginn einer neuen Seite
+ mitgeteilt. Die Parameter 'x start' und 'y start' liefern die gewünschte
+ Position der linken oberen Ecke des Schreibfeldes. Das Hardware-In­
+ terface muß in diesen Parametern seine augenblickliche Position auf
+ dem Papier zurückmelden, wobei die Position (0,0) die linke obere
+ Ecke des Papieres ist.
+ Vor der Rückmeldung kann aber auch auf die angegebene Startpo­
+ sition positioniert und diese zurückgemeldet werden. Es ist jedoch
+ darauf zu achten, daß die zurückgemeldete Position den internen
+ Nullpunkt für die Absolutkoordinaten im EUMEL-Drucker definiert.
+ Deswegen muß das Hardware-Interface sicherstellen, daß bei einem
+ "Zeilenrücklauf" die zurückgemeldete Position 'x start' erreicht wird.
+ (Siehe 'carriage return' in der Prozedur 'execute'). Auch gibt es Fälle,
+ bei denen links von der gemeldeten 'x start'-Position positioniert wird.
+ Bei #ib#Druckern mit Einzelblatteinzug#ie#, bei denen das Papier gleich auf die
+ zweite oder dritte Zeile positioniert wird, sollte, um ein korrektes Druck­
+ bild zu erreichen, diese Postion in 'y start' zurückgemeldet werden.
+
+
+END PROC open;
+
+
+PROC close (INT CONST op code, INT CONST param 1) :
+
+ LET document code = 1 ,
+ page code = 2 ;
+
+ SELECT op code OF
+ CASE document code : close document
+ CASE page code : close page
+ END SELECT.
+
+
+ #ib#close document#ie# :
+
+ Zweck: Hiermit wird dem Hardware-Interface das Ende eines Druckvorgangs
+ mitgeteilt.
+
+
+
+ remaining y steps : param 1 .
+
+ #ib#close page#ie# :
+
+ Zweck: Hiermit wird dem Hardware-Interface mitgeteilt, daß der Druck der
+ aktuellen Seite abgeschlossen ist.
+ 'remaining y steps' gibt an, wieviel Mikroschritte das vertikale Papier­
+ ende noch von der aktuellen Druckposition entfernt ist. Die x-Position
+ des Druckers ist bei Aufruf dieser Prozedur immer der linke Rand
+ 'x start'.
+
+
+END PROC close;
+
+
+PROC execute (INT CONST op code, TEXT CONST string,
+ INT CONST param1, param2) :
+
+ LET write text code = 1 ,
+ write cmd code = 2 ,
+ carriage return code = 3 ,
+ move code = 4 ,
+ draw code = 5 ,
+ on code = 6 ,
+ off code = 7 ,
+ type code = 8 ;
+
+ SELECT op code OF
+ CASE write text code : write text
+ CASE write cmd code : write cmd
+ CASE carriage return code : carriage return
+ CASE move code : move
+ CASE draw code : draw
+ CASE on code : on
+ CASE off code : off
+ CASE type code : type
+ END SELECT .
+
+
+ from : param1 .
+ to : param2 .
+
+ #ib#write text#ie# :
+
+ Zweck: Der übergebene Text 'string' muß von der Zeichenposition 'from' bis
+ 'to' (einschließlich) auf dem Drucker ausgegeben werden. Die Über­
+ schreitung der Papierbreite braucht nicht überprüft zu werden.
+
+
+
+ #ib#write cmd#ie# :
+
+ Zweck: Der übergebene Text 'string' enthält zwischen den Positionen 'from'
+ und 'to' ein direkt angegebenes #ib#Druckerkommando#ie# (\#"..."\#). Wenn
+ direkte Druckerkommandos erlaubt sein sollen, müssen sie ausgege­
+ ben werden.
+
+
+
+ x steps to left margin : param 1 .
+
+ #ib#carriage return#ie# :
+
+ Zweck: Der Druckkopf muß (ohne Zeilenvorschub) an den linken Rand be­
+ wegt werden, d.h. an die bei 'open page' vom Druckertreiber gemel­
+ dete Position 'x start'. 'x steps to left margin' gibt an, wieviel Minimal­
+ schritte die augenblickliche Position vom linken Rand entfernt ist.
+
+
+
+ x steps : param 1 .
+ y steps : param 2 .
+
+ #ib#move#ie# :
+
+ Zweck: Die Schreibposition muß um 'x steps' Mikroschritte nach rechts und um
+ 'y steps' Mikroschritte nach unten verschoben werden. Negative
+ Schrittwerte bedeuten dabei die jeweils andere Richtung. Das Über­
+ schreiten des Papiers braucht nicht überprüft zu werden. Bei einer
+ horizontalen Bewegung nach rechts ('x steps' > 0) müssen die einge­
+ schalteten Modifikationen beachtet werden. Wenn z.B. 'underline'
+ eingeschaltet ist, muß die Strecke unterstrichen werden.
+ Kann eine Leistung (z.B. Bewegung nach links) nicht erbracht wer­
+ den, muß ein 'errorstop' ausgelöst werden. Im Fehlerfall bei einer
+ Horizontalbewegung versucht der EUMEL-Drucker nach einem Zei­
+ lenrücklauf nochmals die angestrebte x-Position zu erreichen. Somit
+ brauchen horizontale Bewegungen nach links ('x steps' < 0) nicht
+ unbedingt implementiert zu werden, sondern können mit einem 'error­
+ stop' beantwortet werden. Im Fehlerfall bei einer vertikalen Bewegung
+ wird an der alten Position weitergeschrieben.
+
+
+
+ #ib#draw#ie# :
+ Zweck: Von der aktuellen Schreibposition an (linke untere Ecke der Zeichenposition)
+ soll eine gerade Linie zum Zielpunkt ('x steps' weiter rechts, 'y steps' weiter
+ unten) gezogen werden. Kann eine Leistung (z.B. schräge Linie, Linie nach
+ oben o.ä.) nicht erbracht werden, muß ein 'errorstop' ausgelöst werden.
+ Dieser Fehlerfall wird vom EUMEL-Drucker ignoriert. Das Überschreiten
+ des Schreibfeldes braucht nicht überprüft zu werden.
+
+
+
+ modification : param 1 .
+
+ #ib#on#ie# :
+
+ Zweck: Die #ib#Modifikation#ie# der Nummer 'modification' soll eingeschaltet wer­
+ den, sofern die Hardware es erlaubt. Augenblicklich gibt es folgende
+ Modifikationen:
+
+ 1 underline
+ 2 bold
+ 4 italics
+ 8 reverse
+
+ Die in der Fonttabelle spezifizierte Befehlssequenz, um die entspre­
+ chende Modifikation anzuschalten, kann mit der Prozedur #on("i")#on string
+ (modification)#off("i")# abgefragt werden.
+ Kann eine Leistung nicht erbracht werden, muß ein 'errorstop' aus­
+ gelöst werden. Im Fehlerfall der Modifikation 'underline' versucht der
+ neue EUMEL-Drucker die Zeile mit Hilfe von 'draw' zu unterstreichen.
+ Im Fehlerfall der Modifikation 'bold' wird die Zeile nochmals, um den in
+ der Fonttabelle spezifizierten 'bold offset' verschoben, ausgegeben.
+ Bei den restlichen beiden Modifkationen wird der Fehlerfall ignoriert.
+
+
+
+ #ib#off#ie# :
+
+ Zweck: Die angegebene #ib#Modifikation#ie# 'modification' soll ausgeschaltet wer­
+ den. Die in der Fonttabelle spezifizierte Befehlssequenz, um die ent­
+ sprechende Modifikation auszuschalten, kann mit der Prozedur #on("i")#off
+ string (modification)#off("i")# abgefragt werden. Ein Fehlerfall wird hier igno­
+ riert.
+
+
+
+ font nr : param 1 .
+
+ #ibie# :
+
+ Zweck: Die Druckausgabe soll auf den #ib#Schrifttyp#ie# mit der angegebenen Font­
+ nummer 'font nr' umgeschaltet werden. Diese Nummer bezieht sich auf
+ die eingestellte Fonttabelle. Mit den Prozeduren des Fontspeichers
+ können anhand dieser Nummer die nötigen Informationen beschafft
+ werden. So liefert z.B. die Prozedur #on("i")#font string (font nr)#off("i")# die in der Font­
+ tabelle spezifizierte Befehlssequenz oder die Prozedur #on("i")#font (font nr)#off("i")#
+ den Namen des Fonts. Die Breite des Leerzeichens kann mit #on("i")#char pitch
+ (font nr, " ")#off("i")# bestimmt werden.
+
+
+END PROC execute;
+
+
+
+
+
+#ib(9)#6.3. Prozedur-Schnittstelle des EUMEL-
+ Druckers#ie(9)#
+
+
+
+#ib#print#ie#
+ PROC print (PROC (TEXT VAR) next line, BOOL PROC eof,
+ PROC (INT CONST, INT VAR, INT VAR) open,
+ PROC (INT CONST, INT CONST) close,
+ PROC (INT CONST, TEXT CONST,
+ INT CONST, INT CONST) execute,
+ BOOL CONST elan listing, TEXT CONST file name)
+ Zweck: Solange die Prozedur 'eof' FALSE liefert wird mit der Prozedur 'next
+ line' eine Zeile eingelesen. Dieser Eingabestrom wird für den Druck
+ aufbereitet. Ist die Konstante 'elan listing' auf FALSE gesetzt, so wird
+ der Eingabestrom als Textdatei mit Textkosmetik-Anweisungen aus­
+ gedruckt. Andernfalls wird der Eingabestrom wie ein ELAN-Listing
+ behandelt. In der Textkonstanten 'file name' muß dann der Dateiname
+ der Programmdatei enthalten sein.
+
+
+ PROC print (FILE VAR file,
+ PROC (INT CONST, INT VAR, INT VAR) open
+ PROC (INT CONST, INT CONST) close
+ PROC (INT CONST, TEXT CONST,
+ INT CONST, INT CONST) execute)
+ Zweck: Der Eingabestrom kommt aus der angegebenen Datei. Anhand vorge­
+ gebener Kriterien wird entschieden, ob diese Datei als Textdatei oder
+ als ELAN-Listing ausgedruckt wird.
+
+#ib#with elan listings#ie#
+ PROC with elan listings (BOOL CONST flag)
+ Zweck: Mit dieser Prozedur kann bei der vorangegangenen 'print'-Prozedur
+ gesteuert werden, ob überhaupt irgendwelche Dateien als ELAN-Lis­
+ tings gedruckt werden sollen. Wird damit FALSE eingestellt, so wer­
+ den alle Dateien als Textdateien gedruckt.
+
+ BOOL PROC with elan listings
+ Zweck: Liefert die aktuelle Einstellung.
+
+
+#ib#is elan source#ie#
+ PROC is elan source (FILE VAR file)
+ Zweck: Entscheidet nach vorgebenen Kriterien, ob die angegebene Datei ein
+ ELAN-Listing ist.
+
+
+#ib#bottom label for elan listings#ie#
+ PROC bottom label for elan listings (TEXT CONST label)
+ Zweck: Bei ELAN-Listings wird in der Fußzeile ein Text eingestellt, der durch
+ Schägstrich getrennt vor die Seitennummer geschrieben wird. (z.B. zur
+ Durchnumerierung der Pakete im Quellcode)
+
+ TEXT PROC bottom label for elan listings
+ Zweck: Liefert die aktuelle Einstellung.
+
+
+#ib#material#ie#
+ TEXT PROC material
+ Zweck: Hier kann das Hardware-Interface jeder Zeit den aktuellen Material­
+ wert abfragen, der vom Benutzer mit der 'material'-Anweisung einge­
+ stellt ist.
+
+
+#ib#x pos#ie#
+ INT PROC x pos
+ Zweck: Wird in der Prozedur 'execute' die Funktion 'move' oder 'draw' ange­
+ steuert, so liefert diese Prozedur die absolute Zielposition in x-Rich­
+ tung, wo bei der Nullpunkt durch das zurückgelieferte 'x start' bei 'open
+ page' definiert ist. Diese Prozedur dient zur Unterstützung von Druk­
+ kern, die eine absolute Positionierung in horizontaler Richtung benöti­
+ gen.
+
+
+#ib#y pos#ie#
+ INT PROC y pos
+ Zweck: Wird in der Prozedur 'execute' die Funktion 'move' oder 'draw' an­
+ gesteuert, so liefert diese Prozedur die absolute Zielposition in y-Rich­
+ tung, wo bei der Nullpunkt durch das zurückgelieferte 'y start' bei 'open
+ page' definiert ist. Diese Prozedur dient zur Unterstützung von Druk­
+ kern, die eine absolute Positionierung in vertikaler Richtung benötigen.
+
+
+#ibie#
+ INT PROC linetype
+ Zweck: Wird in der Prozedur 'execute' die Funktion 'draw' angesteuert, so gibt
+ diese Prozedur den gewünschten Linientyp an. Bisher ist nur definiert:
+ 1 underline
+
+ Anmerkung: Bis jetzt benutzt der EUMEL-Druckers die Funktion 'draw' lediglich
+ zum Unterstreichen in Fehlerfall der Modifikation 'underline', d.h.
+ zeichnen mit 'y steps = 0' und 'x steps >= 0' mit 'line type = 1'
+ reicht aus.
+
+
+#ib#y offset index#ie#
+ INT PROC y offset index
+ Zweck: Wurde der Font mit 'y offsets' definiert, so kann hiermit in der bei der
+ Funktion 'write text' in der Prozedur 'execute' der jeweilige Offset-In­
+ dex für den auszugebenden Text abgefragt werden. Der Offset-Index
+ sagt aus, die wievielte Verschiebung nun ausgegeben wird. Dabei
+ werden die Verschiebungen in der Reihenfolge durchnummeriert, in
+ der sie in der Fonttabelle angegeben wurden. Anhand dieses Offset-In­
+ dex muß das Hardware-Interface entscheiden, welche Bitmuster aus­
+ gegeben werden müssen.
+
+
+#ib#pages printed#ie#
+ INT PROC pages printed
+ Zweck: Gibt nach dem Ausdruck an, wieviel Seiten gedruckt wurden.
+
+
+
+
+#ib(9)#6.4. Bemerkungen und Ratschläge#ie(9)#
+
+
+
+1) Für ein Paket, das dieses Interface implementiert, sind folgende Punkte wichtig:
+
+ - Man braucht sich keine Zustände (aktuelle Position o.ä.) zu merken.
+
+ - Rückmeldungen über die Leistungsfähigkeit eines Druckers bzw. seiner An­
+ passung erfolgen über 'errorstop'. Der #ib#EUMEL-Drucker#ie# stellt fest, ob bestimm­
+ te Leistungen (Einschalten der Attribute und Bewegungen des Druckers)
+ verfügbar sind, indem er sie versuchsweise ausführen läßt. Bei den Prozedu­
+ ren 'open', 'close' und den Funktionen 'write text', 'write cmd', 'carriage return'
+ und 'type' der Prozedur 'execute' führt ein 'errorstop' jedoch zum Abbruch des
+ Drucks.
+
+2) Die #on("i")##on("b")##ib#Mikroschritte#ie##off("i")##off("b")# sollten die kleinsten durchführbaren horizontalen bzw. vertikalen
+ Bewegungen des Druckers sein. Oft gibt aber das Handbuch des Druckers keine
+ eindeutige Angabe über die Mikroschritte in horizontaler Richtung, sondern sagt
+ nur, daß es gewisse Schriften mit einer bestimmten Anzahl von Zeichen pro Zoll
+ gibt.#u##count#)#e# Dann ergibt sich die Anzahl von Mikroschritten pro Zoll aus dem kleinsten#foot#
+
+#value#) 1 Zoll = 1 Inch = 2.54 cm
+
+#end#
+ gemeinsamen Vielfachen der Anzahl Zeichen pro Zoll aller Schriften.
+
+ Beispiel:
+ Der Olivetti Drucker PR1470 hat drei Schriften mit 10, 12, und 16.6 Zeichen pro
+ Zoll. Das kleinste gemeinsame Vielfache ist 300. Ein Mikroschritt bei dem Druk­
+ ker PR1470 entspricht also einem 300stel Zoll. Die Breite der einzelnen Schrif­
+ ten läßt sich nun aus der folgenden Tabelle ablesen.
+
+ Anzahl Zeichen pro Zoll Breite in 1/300 Zoll
+ 10 30
+ 12 25
+ 16.6 18
+
+ Wenn der Drucker in diesen theoretischen Mikroschritten nicht positionieren kann,
+ so muß er bei einem #on("i")#move#off("i")#-Befehl so genau wie möglich positionieren. Der Rest
+ sollte abgespeichert und beim nächsten #on("i")#move#off("i")#-Befehl hinzuaddiert werden.
+
+3) Um ein optimales Druckbild zu bekommen, müssen alle Breiten und Höhenanga­
+ ben der Zeichen genau angegeben werden.
+
+4) Die Fonttabelle bietet eine einfache Möglichkeit, Zeichen mit Hilfe der #ib#Ersatzdar­
+ stellung#ie#en umzucodieren. Deshalb sollte der Druckerkanal auch mit der Konfigu­
+ rationstabelle 'transparent' konfiguriert werden.
+
+5) Um den Schrifttyp festzulegen, mit dem #ib#ELAN-Listing#ie#s gedruckt werden sollen,
+ kann in der Fonttabelle einem Font der Name #on("i")##on("b")#"#ib#elanlist#ie#"#off("i")##off("b")# zugeordnet werden, denn
+ der ELAN-Lister versucht auf einen Schrifttyp mit diesem Namen zuschalten. Wenn
+ kein Schrifttyp "elanlist" existiert, dann wird für ELAN-Listings der erste Schrifttyp
+ der Fonttabelle genommen.
+
+6) Nach der Installation des #ib#Druckertreiber#ie#s ist darauf zu achten, daß in der Task
+ "PRINTER" eine Fonttabelle des Druckers eingestellt ist.
+
+7) Der #ib#Druckertreiber#ie# sollte eventuell noch ein Prozedur bereitstellen, mit der die
+ Papierbreite bzw. -höhe eingestellt werden kann, die bei 'open document' dem
+ EUMEL-Drucker gemeldet wird.
+
+
+
+
+#ib(9)#6.5. Arbeitsweise des EUMEL-Druckers#ie(9)#
+
+
+
+Der EUMEL-Drucker arbeitet mit der folgenden Strategie:
+
+Die Datei wird zeilenweise analysiert. Bei der Analyse werden einzelne #ib#Token#ie# be­
+stimmt. Ein Token ist ein Textteil, der zusammenhängend gedruckt werden kann, ohne
+daß es zu Typumschaltungen, Modifkationsänderungen oder Positionierungen in x-
+bzw. y-Richtung kommt. So ist bei einfachem Zeilendruck jede Zeile ein Token, wäh­
+rend im Blocksatz jedes Wort ein Token ist. Ein Token hat also immer
+
+ - einen Text,
+ - die Länge des Textes bei der Ausgabe,
+ - eine absolute x- und y- Position auf dem Papier,
+ - einen Schrifttyp,
+ - Modifikationen für den Text,
+ - Modifikationen für den Zwischenraum vom letzten Token zu diesem Token.
+
+Sind alle Token einer Zeile bestimmt, so werden sie in eine Liste aller bisher erzeug­
+ten, aber noch nicht gedruckten Token der absoluten y-Position nach einsortiert. Diese
+Tokenliste wird erst dann ausgedruckt, wenn sichergestellt ist, daß im weiteren Verlauf
+der Datei kein Token vor das letzte Token der sortierten Liste kommt. Beim Zeilendruck
+ist dies nach jeder Zeile der Fall. Bei Spaltendruck kann jedoch erst dann ausgedruckt
+werden, wenn sich die Analyse in der letzten Spalte befindet. Spätestens bei einem
+Seitenwechsel muß die Tokenliste ausgegeben werden.
+
+Durch diese Strategie lassen sich Spaltendruck oder Indizes und Exponenten sehr
+leicht für alle Drucker implementieren, ohne daß ein Drucker in vertikaler Richtung
+rückwärts positionieren muß.
+
+Bei der Ausgabe der Tokenliste wird jeweils auf die nächst größere y-Position posi­
+tioniert und dort werden alle Token zu dieser y-Position ausgegeben. Die Ausgabe
+eines Tokens erfolgt in der folgenden Reihenfolge:
+
+ - der Schrifttyp wird eingeschaltet,
+ - die Modifikationen für den Zwischenraum werden eingeschaltet,
+ - der Positionsbefehl für horizontale Bewegungen wird gegeben,
+ - die Modifikationen für den Text werden eingeschaltet,
+ - der Text wird ausgegeben.
+
+Die ersten vier Punkte werden nur dann ausgeführt, wenn sie notwendig sind. Über­
+schreitet der Text die Papierbreite, so zeigen Punkte am Ende der Zeile dies an.
+
diff --git a/doc/system/systemhandbuch.4 b/doc/system/systemhandbuch.4
new file mode 100644
index 0000000..e511eb5
--- /dev/null
+++ b/doc/system/systemhandbuch.4
@@ -0,0 +1,1185 @@
+#start(2.5,1.5)#
+#pageblock#
+#block#
+#page (91)#
+#headeven#
+%#center#EUMEL-Systemhandbuch
+
+
+#end#
+#headodd#
+#center#7. Der Fontspeicher#right#%
+
+
+#end#
+
+#ib(9)#7. Der #ib#Fontspeicher#ie##ie(9)#
+
+
+
+#ib(9)#7.1. #ib#Fonttabellen#ie##ie(9)#
+
+
+Damit die Textverarbeitung Dokumente formatieren kann, muß sie über Breiten und
+Höhen der einzelnen Schrifttypen (auch "#ib#Fonts#ie#" genannt) des Druckers, auf dem das
+Dokument gedruckt wird, Bescheid wissen. Auch bei dem Ausdruck des Dokuments
+wird diese Information benötigt. Im EUMEL-System stellt der #ib#Fontspeicher#ie# diese Infor­
+mation den #ib#Formatierprogramm#ie#en (#on("i")#lineform#off("i")# und #on("i")#pageform#off("i")#) und dem #ib#EUMEL-Drucker#ie#
+zur Verfügung.
+
+Da nun der Drucker Angaben zur Positionierung in seinen #ib#Mikroschritten#ie# (kleinste
+Schrittweite in horizontaler oder vertikalter Richtung) benötigt, liefert die Fonttabelle
+die Breiten- und Höhenangaben in Mikroschritten und eine Umrechnungseinheit von
+Schritten in Zentimeter oder umgekehrt. So braucht der EUMEL-Drucker bei Positionie­
+rungen keine Umrechnung vorzunehmen. Allerdings müssen die Formatierprogramme
+auch in Mikroschritten des jeweiligen Druckers rechnen. Dadurch werden jedoch
+Unterschiede durch Rundungsfehler zwischen dem EUMEL-Drucker und den Forma­
+tierprogrammen vermieden.
+
+Bei diesem Konzept können Fonts von verschiedenen Druckern nicht in einer Fontta­
+belle verwaltet werden, denn unterschiedliche Drucker haben meist verschiedene
+Mikroschritte. Somit muß es für jeden Drucker mindestens eine Fonttabelle geben.
+
+Es gibt aber auch Fälle, in denen Fonts auf einem Drucker nicht mit anderen Fonts des
+Druckers zusammengedruckt werden können. Solche Fälle liegen z.B. bei Typenrad­
+druckern vor, die immer nur mit einem Typenrad drucken können und dessen Zei­
+chenbreite hardwaremäßig eingestellt werden muß (z.B. beim Olivetti PR320), bei
+Druckern, die verschiedene Fonts für Längs- und Querformat haben (z.B. beim Agfa
+P400), oder bei Druckern, deren Fonts geladen werden (z.B. beim HP 2686). Eine
+#on("b")##ib#Fonttabelle#ie##off("b")# enthält also alle die Fonts eines Druckers, #on("b")#die auf dem Drucker kompati­
+bel sind#off("b")#. Es kann mehrere Fonttabellen zu einem Drucker geben.
+
+Die verschiedenen Fonttabellen werden von im Multi-User Betrieb von der Task "#ib#confi­
+gurator#ie#" verwaltet. Sie enthält alle Fonttabellen, die auf dem Rechner zur Verfügung
+stehen. Mit dem Kommando
+
+
+ #ib#fonttable#ie# ("Name der Fonttabelle")
+
+
+wird in einer Task die gewünschte Fonttabelle eingestellt. Danach stehen die Fonts
+dieser Tabelle in der Task zur Verfügung. Die Einstellung der Fonttabelle vererbt sich
+auf die Sohntasks, d.h. wird eine Sohntask begonnen, so ist dort die Fonttabelle des
+Vaters eingestellt.
+
+Dazu das folgenden Beispiel:
+
+ Für den Agfa-Drucker P400 gibt es die Fonttabellen "agfa" und "agfaquer", in
+ denen die Fonts für Längsdruck bzw. Querdruck enthalten sind. In der Task
+ #on("i")#PUBLIC#off("i")# wird mit dem Kommando #on("i")#fonttable ("agfa")#off("i")# die Fonttabelle "agfa" ein­
+ gestellt. Alle neuen Sohntasks können sofort ohne weitere Einstellung mit der
+ Textformatierung im Längsformat beginnen. Will nun jemand im Querformat
+ drucken, so muß er in seiner Task mit dem Kommando #on("i")#fonttable ("agfaquer")#off("i")# den
+ Fontspeicher auf die Fonts zum Querdruck umstellen.
+
+Das Kommando
+
+
+ #ib#list fonts#ie#
+
+
+listet die Fonts der eingestellten Fontabelle ins #on("i")#notebook#off("i")# und das Kommando
+
+
+ #ib#list fonttables#ie#
+
+
+informiert über die verfügbaren Fonttabellen.
+
+
+
+
+#ib(9)#7.2. Erstellen einer #ib#Fonttabelle#ie##ie(9)#
+
+
+Die Fonttabelle ist ein Datenraum mit einer eigenen Struktur. Somit kann sie nicht
+mehr mit dem Editor, sondern nur mit einem entsprechenden Programm bearbeitet
+werden. Solch ein Programm befindet sich in der Datei "#ib#font convertor#ie#" auf dem Stan­
+dardarchiv 'std.zusatz'. Diese Datei sollte in einer Systemtask (Sohntask von "SYSUR")
+insertiert werden. Danach stehen entsprechende Kommandos zur Bearbeitung einer
+Fonttabelle zur Verfügung.
+
+Um eine Fonttabelle zu bekommen, muß zuerst eine #on("b")##ib#Fontdatei#ie##off("b")# (d.h. eine editierbare
+Datei mit dem unten beschriebenen Aufbau) angelegt werden. Mit dem Kommando
+
+
+ #ib#create fonttable#ie# ("Name der Fontdatei")
+
+
+werden alle in der Fontdatei spezifizierten Fonttabellen erstellt. Sie liegen als benannte
+Datenräume in der Task vor und können mit dem Kommando #on("i")#save#off("i")# von einer System­
+task an die Task "configurator" gesendet werden. Danach sind diese Fonttabellen in
+allen Task auf dem Rechner verfügbar und können mit dem #on("i")#fonttable#off("i")# - Kommando
+eingestellt werden.
+
+Soll dagegen eine bestehende Fonttabelle geändert werden, so erstellt das Komman­
+do
+
+
+ #ib#create fontfile#ie# ("Name der Fonttabelle", "Name der Fontdatei")
+
+
+aus der angegebenen Fonttabelle eine Fontdatei. Die Fonttabelle muß dazu in der Task
+als benannter Datenraum vorliegen (d.h. sie muß eventuell mit #on("i")#fetch#off("i")# von der Task
+"configurator" geholt werden). In der so erstellten Fontdatei können die Änderungen
+mit dem Editor vorgenommen, mit #on("i")#create fonttable#off("i")# die geänderte Fonttabelle erstellt
+und diese wiederum mit #on("i")#save#off("i")# an die Task "configurator" gesendet werden. Mit dem
+#on("i")#fonttable#off("i")#-Kommando kann dann in den bestehenden Tasks die geänderte Fonttabelle
+eingestellt werden. Alle neuen Tasks erhalten automatisch die geänderte Fonttabelle.
+
+
+
+#ib(9)#Prozedurbeschreibung der Umwand­
+lungs­Kommandos#ie(9)#
+
+
+Nach der Insertierung der Datei "font convertor" stehen die folgenden Kommandos zur
+Umwandlung einer Fontdatei in eine Fonttabelle oder umgekehrt zur Verfügung.
+
+#ib#create fontfile#ie#
+ PROC create fontfile (TEXT CONST fonttable name, fontfile name)
+ Zweck: Aus Fonttabelle 'fonttable name' wird eine Fontdatei mit dem ange­
+ gebenen Name erstellt. Die Fonttabelle muß dabei in der eigenen Task
+ als benannter Datenraum vorliegen.
+
+#ib#create fonttable#ie#
+ PROC create fonttable (TEXT CONST fontfile name)
+ Zweck: Es werden alle Fonttabellen erzeugt, die in der Fontdatei 'fontfile name'
+ angegeben sind. Die Fonttabellen liegen dann als benannte Datenräu­
+ me in der Task vor.
+
+ PROC create fonttable
+ Zweck: Es werden alle Fonttabellen erzeugt, die in der zuletzt bearbeiteten
+ Datei angegeben sind.
+
+
+
+
+#ib(9)#7.3. Aufbau der #ib#Fontdatei#ie##ie(9)#
+
+
+In der Fontdatei können drei Strukturen stehen und zwar Kennungen, Identifkationen
+und Zeichenspezifikationen.#u##count#)#e#
+#foot#
+
+#value#) Beim formalen Aufbau bedeuten eckige Klammern, daß diese Angaben optional sind.
+
+#end#
+
+
+
+#ib(9)##ib#Kennungen#ie##ie(9)#
+
+
+ Formaler Aufbau: <#on("i")#Kennung#off("i")#> : Name 1 [, Name 2] [ ... ] ;
+
+ Eine Kennung leitet eine Definition ein. Für die Namen der Namensliste gelten die
+ folgenden Konventionen:
+
+ - der Name muß als TEXT-Denoter angegeben werden,
+ - der Name muß ungleich #on("i")#niltext#off("i")# sein,
+ - Leerzeichen sind im Namen nicht signifikant (d.h. "agfa quer" wird zu "agfa­
+ quer").
+
+ Eine Kennung kann die folgenden Werte annehmen:
+
+ <#on("i")#Kennung#off("i")#> { FONTTABLE, FONT }
+
+ - #on("b")##ib#FONTTABLE#ie##off("b")#
+ Hiermit wird eine Definition einer Fonttabelle eingeleitet. Es wird nur der erste
+ Name der Namensliste ausgewertet, da die Fonttabelle eindeutig identifiziert
+ sein muß. Alle folgenden Angaben werden dieser Fonttabelle zugeordnet, bis
+ eine neue Kennung FONTTABLE folgt.
+
+ - #on("b")##ib#FONT#ie##off("b")#
+ Hiermit wird eine Definition eines Schrifttyps eingeleitet. Ein Schrifttyp kann
+ mehrere Namen haben. Jedoch darf in einer Fonttabelle jeder Fontname nur
+ einem Font zugeordnet werden.
+
+
+
+#ib(9)##ib#Identifikation#ie#en#ie(9)#
+
+
+ Formaler Aufbau: [ <#on("i")#Identifikation#off("i")#> = <Wert der Identifikation> ; ]
+
+ Mit den Identifikationen werden bestimmte Angaben zu den Kennungen gemacht.
+ Sie müssen unmittelbar nach der entsprechenden Kennung folgen, brauchen aber
+ nur angegeben werden, wenn sie von den Standardwerten abweichen.
+
+
+
+#ib(9)#Identifikationen nach der Kennung #ib#FONTTABLE#ie##ie(9)#
+
+
+ <#on("i")#Identifikation#off("i")#> { x unit, y unit, on string, off string }
+
+ - #on("b")##ib#x unit#ie##off("b")#
+ Hiermit wird die Anzahl der Mikroschritte des Druckers pro Zentimeter in
+ horizontaler (x-) Richtung spezifiziert. Die Einheit muß als REAL-Denoter
+ angegeben werden. Alle weiteren Breitenangaben zu den Fonts dieses Druk­
+ kers beziehen sich auf diese Einheit.
+
+ STD-Wert: 10.0 / 2.54 = 3.937008
+
+ - #on("b")##ib#y unit#ie##off("b")#
+ Hiermit wird die Anzahl der Mikroschritte des Druckers pro Zentimeter in
+ vertikaler (y-) Richtung spezifiziert. Die Einheit muß als REAL-Denoter ange­
+ geben werden. Alle weiteren Höhenangaben zu den Fonts dieses Druckers
+ beziehen sich auf diese Einheit.
+
+ STD-Wert: 6.0 / 2.54 = 2.362205
+
+ - #on("b")##ib#on string#ie##off("b")#
+ Hier müssen vier Textdenoter, durch Komma getrennt, angegeben werden.
+ Die Textdenoter enthalten die Befehlssequenzen, um beim Drucker die Mo­
+ difikationen anzuschalten. Dabei ist die Reihenfolge der Modifikationen
+ underline, bold, italics, reverse.
+ Liegt für eine der Modifikationen keine Befehlssequenz vor, so muß #on("i")#niltext#off("i")#
+ angegeben werden. Die Befehlssequenzen können vom Druckertreiber ab­
+ gefragt werden.
+
+ STD-Wert: #on("i")#niltext#off("i")# für alle Modifikationen
+
+ - #on("b")##ib#off string#ie##off("b")#
+ Hier müssen vier Textdenoter, durch Komma getrennt, angegeben werden.
+ Die Textdenoter enthalten die Befehlssequenzen, um beim Drucker die Mo­
+ difikationen auszuschalten. Dabei ist die Reihenfolge der Modifikationen
+ underline, bold, italics, reverse.
+ Liegt für eine der Modifikationen keine Befehlssequenz vor, so muß #on("i")#niltext#off("i")#
+ angegeben werden. Die Befehlssequenzen können vom Druckertreiber ab­
+ gefragt werden.
+
+ STD-Wert: #on("i")#niltext#off("i")# für alle Modifikationen
+
+
+
+#ib(9)#Identifikationen nach der Kennung #ib#FONT#ie##ie(9)#
+
+
+ <#on("i")#Identifikation#off("i")#> { font lead, font height, font depth, indentation pitch,
+ next larger font, next smaller font,
+ font string, y offsets, bold offset }
+
+ - #on("b")##ib#font lead#ie##off("b")##u##count#)#e#
+ Der Durchschuß eines Fonts gibt den Zwischenraum in vertikaler Richtung
+ zwischen den Zeilen bei einfachem Zeilenvorschub an. Er muß in Mikroschrit­
+ ten der y-Richtung als INT-Denoter angegeben werden.
+
+ STD-Wert: 0
+#foot#
+
+#value#) Für spätere Erweiterungen des EUMEL-Druckers wurde die bisherige Fonthöhe in Durchschuß, Fonthöhe
+ und Fonttiefe aufgespalten. Für alle bis jetzt definierten Leistungen braucht nur wie bisher die Fonthöhe
+ angegeben zu werden. Der Durchschuß und die Fonttiefe werden dann auf Null gesetzt.
+#end#
+
+ - #on("b")##ib#font height#ie##off("b")##u##value#)#e#
+ Die Fonthöhe ist die Distanz von der Basislinie bis zur Oberkante des höch­
+ sten Zeichens. Sie muß in Mikroschritten der y-Richtung als INT-Denoter
+ angegeben werden.
+
+ STD-Wert: 6 Zeilen pro Inch entsprechend der definierten #on("i")#y unit#off("i")#
+
+ - #on("b")##ib#font depth#ie##off("b")##u##value#)#e#
+ Die Fonttiefe ist die Distanz von der Basislinie bis zur Unterkante des tief­
+ sten Zeichens. Sie muß in Mikroschritten der y-Richtung als INT-Denoter
+ angegeben werden.
+
+ STD-Wert: 0
+
+ - #on("b")##ib#indentation pitch#ie##off("b")#
+ Einrückungen oder Aufzählungen werden äquidistant berechnet, d.h. Anzahl
+ der Zeichen mal einer festen Breite. Diese Einrückbreite sollte ein Mittel al­
+ ler Zeichenbreiten sein und braucht nicht der Breite des Leerzeichens zu
+ entsprechen. Sie muß in Mikroschritten der x-Richtung als INT-Denoter an­
+ gegeben werden.
+
+ STD-Wert: 10 Zeichen pro Inch entsprechend der definierten #on("i")#x unit#off("i")#
+
+ - #on("b")##ib#next larger font#ie##off("b")#
+ Hier muß der Name des nächst größeren Fonts als TEXT-Denoter aufgeführt
+ werden. Gibt es keinen nächst größeren Font, so ist #on("i")#niltext#off("i")# anzugeben.
+
+ STD-Wert: #on("i")#niltext#off("i")#
+
+ - #on("b")##ib#next smaller font#ie##off("b")#
+ Hier muß der Name des nächst kleineren Fonts als TEXT-Denoter aufge­
+ führt werden. Gibt es keinen nächst kleineren Font, so ist #on("i")#niltext#off("i")# anzugeben.
+ Bei Indizes oder Exponenten wird automatisch auf diesen nächst kleineren
+ Font umgeschaltet.
+
+ STD-Wert: #on("i")#niltext#off("i")#
+
+
+ - #on("b")##ib#font string#ie##off("b")#
+ Hier kann als TEXT-Denoter eine Befehlssequenz angegeben werden, die
+ den Drucker auf diesen Font umschaltet. Diese Befehlssequenz kann vom
+ Druckertreiber abgefragt werden. Dadurch ist es nicht nötig, daß er die Na­
+ men der Fonts kennt.
+
+ STD-Wert: #on("i")#niltext#off("i")#
+
+ - #on("b")##ib#y offsets#ie##off("b")#
+ Um bei Matrixdruckern Schriften zu erzeugen, die höher als eine Nadelreihe
+ sind, müssen entsprechende Bitmuster des Textes an verschiedenen y-Po­
+ sitionen ausgegeben werden. Um diese Anforderung durch den EUMEL-
+ Drucker zu unterstützen, kann hier eine Liste von Verschiebungen von der
+ Basislinie angegeben werden, an denen der Text ein weiteres Mal ausgege­
+ ben wird. Dabei bedeuten negative Werte eine Verschiebung oberhalb und
+ positive Werte eine Verschiebung unterhalb der Basislinie. Ist der Wert Null,
+ so wird der Text auf der Basislinie ausgegeben. Die Modifikation #on("i")#underline#off("i")#
+ wird bei der Ausgabe des Textes nur an der ersten Verschiebung angestellt.
+ Die Werte für die Verschiebungen müssen in Mikroschritten der y-Richtung
+ als INT-Denoter angegeben und durch Komma getrennt werden.
+
+ STD-Wert: 0
+
+ - #on("b")##ib#bold offset#ie##off("b")#
+ Falls der Drucker die Modifikation #on("i")#bold#off("i")# nicht beherrscht, versucht der
+ EUMEL-Drucker sie durch Doppeldruck zu simulieren. Der 'bold offset' gibt
+ an, ob und wieviel der zweite Durchgang in x-Richtung verschoben werden
+ soll. Dies ergibt insbesondere bei Laserdruckern, die nicht für alle Schriftty­
+ pen einen Bold-Typ haben, einen recht guten Fettdruck. Der Wert muß in
+ Mikroschritten der x-Richtung als INT-Denoter angegeben werden.
+
+ STD-Wert: 0
+
+
+
+#ib(9)##ib#Zeichenspezifikationen#ie##ie(9)#
+
+
+
+ Formaler Aufbau: [ <Zeichen> [, <Breite des Zeichens>]
+ [, <Ersatzdarstellung des Zeichens>] ; ]
+
+
+ Nachdem die Identifikationen zu einer Kennung angegeben wurden, können Zei­
+ chenspezifikationen folgen, d.h. zu einem Zeichen kann die Breite und/oder eine
+ Ersatzdarstellung spezifiziert werden. Dazu muß zuerst das Zeichen selber als
+ TEXT-Denoter angegeben werden.
+
+ - #on("b")##ib#Breite des Zeichens#ie##off("b")#
+ Die Zeichenbreite muß als INT-Denoter in Mikroschritten angegeben werden.
+ Alle Zeichenbreiten werden mit der Einrückbreite vorbesetzt, so daß nur sol­
+ che Zeichen angegeben werden müssen, deren Breite von der Einrückbreite
+ abweichen. Negative Zeichenbreiten sind nicht erlaubt. Die Angabe von Zei­
+ chenbreiten nach der Kennung FONTTABLE wird ignoriert.
+
+ - #on("b")##ib#Ersatzdarstellung des Zeichens#ie##off("b")#
+ Die Ersatzdarstellung wird statt des Zeichens ausgedruckt. Sie muß als
+ TEXT-Denoter angegeben werden. Werden Ersatzdarstellungen nach der
+ Kennung FONTTABLE angegeben, so gelten sie global für alle Fonts dieser
+ Fonttabelle. Sie können jedoch bei der Fontangabe lokal wieder überschrie­
+ ben werden. Eine Ersatzdarstellung darf höchsten 255 Zeichen lang sein. Alle
+ Ersatzdarstellungen eines Fonts dürfen 32767 Zeichen nicht überschreiten.
+
+
+
+#ib(9)##ib#Kommentare in der Fontdatei#ie##ie(9)#
+
+
+ In der Fontdatei dürfen Kommentare eingefügt werden. Sie müssen den Kommen­
+ taren der ELAN-Syntax entsprechen, d.h. mit '(*' beginnen und mit '*)' enden.
+
+
+
+#ib(9)##ib#Deutsche Namen#ie##ie(9)#
+
+
+ Kennungen und Identifikationen dürfen in der Fontdatei auch mit folgenden deut­
+ schen Namen angegeben werden.
+
+ FONTABLE : FONTABELLE
+ FONT : FONT
+
+#free (0.15)#
+ x unit : x einheit
+ y unit : y einheit
+ on string : on sequenz
+ off string : off sequenz
+ indentation pitch : einrueckbreite
+ font lead : durchschuss
+ font height : fonthoehe
+ font depth : fonttiefe
+ next larger font : groesserer font
+ next smaller font : kleinerer font
+ font string : font sequenz
+ y offsets : y verschiebungen
+ bold offset : bold verschiebung
+
+
+
+
+#ib(9)#7.4. Beispiel für eine Fontdatei#ie(9)#
+
+
+In diesem Beispiel einer Fonttdatei sind drei Fonttabellen enthalten, nämlich "agfa" und
+"agfaquer" für den Agfa-Drucker und "epson" für einen Epson-Drucker.
+
+
+FONTTABLE : "agfa" ;
+ x unit = 160.0 ; #right#(* Anzahl der Mikroschritte pro cm *)
+ y unit = 160.0 ;
+ on string = "\UL1;", "\BO1;", "\IT1;", "\CFW;\CBB;" ;
+ off string = "\UL0;", "\BO0;", "\IT0;", "\CFT;\CBT;" ;
+
+#right#(* globale Ersatzdarstellungen für alle Agfa-Fonts *)
+
+ ""214"" , "\!298;" ; #right#(* AE *)
+ ""215"" , "\!299;" ; #right#(* OE *)
+ ""216"" , "\!300;" ; #right#(* UE *)
+ ""217"" , "\!451;" ; #right#(* ae *)
+ ""218"" , "\!452;" ; #right#(* oe *)
+ ""219"" , "\!453;" ; #right#(* ue *)
+ .
+ .
+ .
+
+ FONT : "trium10" ;
+ indentation pitch = 30 ;
+ font lead = 7 ;
+ font heigth = 54 ;
+ font depth = 15 ;
+ next larger font = "trium12" ;
+ next smaller font = "helvetica8" ;
+ font string = "\FO5;" ;
+
+ " " , 20 ; "!" , 16 ;
+ """" , 22 ; "\#" , 31 ;
+ "$" , 31 ; "%" , 55 ;
+ .
+ .
+ .
+ ""217"" , 31 ; #right#(* ae *)
+
+#right#(* lokale Ersatzdarstellungen für Font "trium10" *)
+
+ ""244"" , 43 , "\FO23;\!725;\FO5;" ; #right#(* ungleich *)
+ ""245"" , 31 , "\FO23;\!405;\FO5;" ; #right#(* mal-Zeichen *)
+
+ FONT : "modern12", "elanlist" ; #right#(* Mehrere Namen für einen Font *)
+ indentation pitch = 33 ;
+ font lead = 14;
+ font heigth = 53;
+ font depth = 13;
+ next larger font = "" ;
+ next smaller font = "micro" ;
+ font string = "\FO11;"
+ #right#(* Alle Zeichen haben die gleiche Breite *)
+
+ FONT . . .
+
+
+FONTTABLE : "agfaquer" ;
+ x unit = 160.0 ;
+ y unit = 160.0 ;
+ on string = "\UL1;", "\BO1;", "\IT1;", "\CFW;\CBB;" ;
+ off string = "\UL0;", "\BO0;", "\IT0;", "\CFT;\CBT;" ;
+ .
+ .
+ .
+
+
+FONTTABLE : "epson" ;
+ x unit = 47.24409 ; #right#(* 120.0 / 2.54 *)
+ y unit = 85.03937 ; #right#(* 216.0 / 2.54 *)
+ on string = ""27"-"1"", "", ""27"4", "";
+ off string = ""27"-"0"", "", ""27"5", "";
+
+ ""214"" , ""27"R"2""091""27"R"0"" ; #right#(* AE *)
+ ""215"" , ""27"R"2""092""27"R"0"" ; #right#(* OE *)
+ ""216"" , ""27"R"2""093""27"R"0"" ; #right#(* UE *)
+ ""217"" , ""27"R"2""123""27"R"0"" ; #right#(* ae *)
+ ""218"" , ""27"R"2""124""27"R"0"" ; #right#(* oe *)
+ ""219"" , ""27"R"2""125""27"R"0"" ; #right#(* ue *)
+ ""220"" , "k" ; #right#(* Trenn-k *)
+ ""221"" , "-" ; #right#(* Trennstrich *)
+ ""222"" , "\#" ; #right#(* geschütztes Nummernkreuz *)
+ ""223"" , " " ; #right#(* geschütztes Leerzeichen *)
+ ""251"" , ""27"R"2""126""27"R"0"" ; #right#(* ss *)
+ ""252"" , ""27"R"2""064""27"R"0"" ; #right#(* Paragraph *)
+
+ FONT : "12", "elite", "elite12" ; #right#(* Mehrere Namen für einen Font *)
+ font height = 36 ;
+ indentation pitch = 10 ;
+ next smaller font = "12.klein" ;
+ font string = ""27"!"1""27"p"0""27"T" ;
+ bold offset = 2 ;
+
+ FONT : "12.klein", "elite.klein", "elanlist" ;
+ font height = 20 ;
+ indentation pitch = 10 ;
+ next smaller font = "12.klein" ;
+ font string = ""27"!"1""27"p"0""27"S"1"" ;
+ bold offset = 1 ;
+
+ FONT : "12.hoch" ;
+ font height = 96 ;
+ indentation pitch = 10 ;
+ next smaller font = "12.klein" ;
+ font string = "" ;
+ bold offset = 2 ;
+ y offsets = 12, -12 ;#right#(* der Text wird jeweils 12 Mikroschritte unter-
+ #right# und überhalb der Basislinie ausgegeben *)
+
+ FONT : "prop10", "prop" ;
+ font height = 12 ;
+ indentation pitch = 24 ;
+ next smaller font = "" ;
+ font string = ""27"!"0""27"p"1""27"T" ;
+ bold offset = 2 ;
+
+ "!" , 10 ;
+ """" , 16 ;
+ "(" , 12 ;
+ . . .
+
+
+
+
+
+#ib(9)#7.5. Schnittstelle des #ib#Fontspeicher#ie#s#ie(9)#
+
+
+
+Das Paket #on("i")#font store#off("i")# liefert die folgenden Prozeduren:
+
+#ib#fonttable#ie#
+ PROC fonttable (TEXT CONST fonttable name)
+ Zweck: Stellt die angegebene Fonttabelle in der Task ein. Dabei wird zuerst in
+ der eigenen Task nach der angegebenen Fonttabelle gesucht. Existiert
+ die Fonttabelle in der eigenen Task nicht, so wird die Fonttabelle von
+ der Task "configurator" geholt.
+ Wenn die Fonttabelle eingestellt ist, sind in der Task nur noch die Fonts
+ dieser Fonttabelle bekannt. Die Einstellung vererbt sich auf die Sohn­
+ tasks.
+
+ TEXT PROC fonttable
+ Zweck: Liefert den Name der eingestellten Fonttabelle.
+
+#ib#list fonttables#ie#
+ PROC list fonttables
+ Zweck: Zeigt die Liste der verfügbaren Fonttabellen im #on("i")#notebook#off("i")#.
+
+#ib#list fonts#ie#
+ PROC list fonts
+ Zweck: Listet die Fonts der eingestellten Tabelle ins #on("i")#notebook#off("i")#.
+
+ PROC list fonts (TEXT CONST fonttable name)
+ Zweck: Listet die Fonts der angegebenen Fonttabelle ins #on("i")#notebook#off("i")#. Die vorher
+ eingestellte Fonttabelle bleibt jedoch weiter eingestellt.
+
+#ib#x step conversion#ie#
+ INT PROC x step conversion (REAL CONST cm)
+ Zweck: Rechnet die in Zentimeter angegebene Länge in Mikroschritte der
+ x-Richtung um.
+
+ REAL PROC x step conversion (INT CONST steps)
+ Zweck: Rechnet die in Mikroschritten der x-Richtung angegebene Länge in
+ Zentimeter um.
+
+#ib#y step conversion#ie#
+ INT PROC y step conversion (REAL CONST cm)
+ Zweck: Rechnet die in Zentimeter angegebene Länge in Mikroschritte der
+ y-Richtung um.
+
+ REAL PROC y step conversion (INT CONST steps)
+ Zweck: Rechnet die in Mikroschritten der y-Richtung angegebene Länge in
+ Zentimeter um.
+
+#ib#on string#ie#
+ TEXT PROC on string (INT CONST modification)
+ Zweck: Liefert die in der Fonttabelle spezifizierte Befehlssequenz, um eine
+ Modifikation anzuschalten. Es gibt die folgenden Modifikationen
+ 1 underline
+ 2 bold
+ 4 italics
+ 8 reverse
+
+#ib#off string#ie#
+ TEXT PROC off string (INT CONST modification)
+ Zweck: Liefert die in der Fonttabelle spezifizierte Befehlssequenz, um eine
+ Modifikation auszuschalten. Es gibt die folgenden Modifikationen
+ 1 underline
+ 2 bold
+ 4 italics
+ 8 reverse
+
+#ib#font#ie#
+ INT PROC font (TEXT CONST font name)
+ Zweck: Liefert die interne Fontnummer des Fonts. Mit dieser Fontnummer
+ können die weiteren Informationen über den Font angefordert werden.
+ Existiert kein Font mit diesem Namen, so wird Null geliefert.
+
+ TEXT PROC font (TEXT CONST font nr)
+ Zweck: Liefert den Fontnamen des Fonts mit der angegeben Fontnummer. Hat
+ der Font mehrere Namen, so wird der erste Name der Namensliste aus
+ der Fontdatei geliefert. Existiert kein Font unter dieser Nummer, so wird
+ #on("i")#niltext#off("i")# geliefert.
+
+#ib#font exists#ie#
+ BOOL PROC font exists (TEXT CONST font name)
+ Zweck: Informationsprozedur zur Abfrage der Existenz eines Fonts.
+
+#ib#next smaller font exists#ie#
+ BOOL PROC next smaller font exists (INT CONST font nr,
+ INT VAR next smaller font)
+ Zweck: Informationsprozedur zur Abfrage der Existenz des nächst kleineren
+ Fonts. Wenn er existiert, wird die Fontnummer dieses Fonts zurück­
+ geliefert.
+
+#ib#next larger font exists#ie#
+ BOOL PROC next larger font exists (INT CONST font nr,
+ INT VAR next larger font)
+ Zweck: Informationsprozedur zur Abfrage der Existenz des nächst größeren
+ Fonts. Wenn er existiert, wird die Fontnummer dieses Fonts zurück­
+ geliefert.
+
+#ib#indentation pitch#ie#
+ INT PROC indentation pitch (INT CONST font nr)
+ Zweck: Liefert die Einrückbreite in Mikroschritten der x-Richtung. Sie sollte eine
+ mittlere Breite der Zeichen sein, denn mit ihr werden die Einrückungen
+ und Aufzählungen berechnet.
+
+#ib#font lead#ie#
+ INT PROC font lead (INT CONST font nr)
+ Zweck: Liefert den Durchschuss des Fonts in Mikroschritten der y-Richtung.
+ Der Druchschuß ist der Zwischenraum zwischen den einzelnen Zeilen
+ bei einfachem Zeilenvorschub.
+
+#ib#font height#ie#
+ INT PROC font height (INT CONST font nr)
+ Zweck: Liefert die Höhe des Fonts in Mikroschritten der y-Richtung. Die Fon­
+ thöhe ist die Distanz von der Basislinie bis zur Oberkante des höchsten
+ Zeichens.
+
+#ib#font depth#ie#
+ INT PROC font depth (INT CONST font nr)
+ Zweck: Liefert die Tiefe des Fonts in Mikroschritten der y-Richtung. Die Fonttie­
+ fe ist die Distanz von der Basislinie bis zur Unterkante des tiefsten
+ Zeichens.
+
+#ib#font string#ie#
+ TEXT PROC font string (INT CONST font nr)
+ Zweck: Liefert den Fontstring des Fonts. Der Fontstring enthält die Befehls­
+ sequenz, um den Drucker auf diesen Font umzuschalten.
+
+#ib#y offsets#ie#
+ TEXT PROC y offsets (INT CONST font nr)
+ Zweck: Liefert einen Text mit den y-Verschiebungen von der Basislinie. Die
+ einzelnen Verschiebungen können mit dem Operator 'ISUB' abgefragt
+ werden.
+
+#ib#bold offsets#ie#
+ INT PROC bold offsets (INT CONST font nr)
+ Zweck: Liefert die 'bold'-Verschiebung.
+
+#ib#char pitch#ie#
+ INT PROC char pitch (INT CONST font nr, TEXT CONST char)
+ Zweck: Liefert die Breite des Zeichens in Mikroschritten der x-Richtung.
+
+#ib#replacement#ie#
+ TEXT PROC replacement (INT CONST font nr, TEXT CONST char)
+ Zweck: Falls das Zeichen eine Ersatzdarstellung hat, so wird diese geliefert,
+ anderfalls das Zeichen selbst.
+
+#ib#get font#ie#
+ PROC get font (INT CONST font nr,
+ INT VAR indentation pitch, font lead, font height, font depth,
+ ROW 256 INT VAR pitch table)
+ Zweck: Die Variablen liefern die entsprechenden Informantionen über den
+ Font. Der Eintrag des Codewerts eines Zeichens plus eins in der Brei­
+ tentabelle liefert die Breite dieses Zeichens.
+
+#ib#get replacements#ie#
+ PROC get replacements (INT CONST font nr,
+ TEXT VAR replacements,
+ ROW 256 INT VAR replacement table)
+ Zweck: In der Fonttabelle kann für jedes Zeichen eine Ersatzdarstellung an­
+ gegeben werden. Diese Ersatzdarstellungen werden mit dieser Proze­
+ dur geliefert. Dabei stehen in der Textvariablen 'replacement' die ge­
+ samten Ersatzdarstellungen des Fonts. Die Ersatzdarstellungstabelle
+ enthält Zeiger auf den Text der Ersatzdarstellungen. Die Ersatzdarstel­
+ lung eines Zeichnes bestimmt sich wie folgt:
+
+
+ ersatzdarstellung :
+ INT CONST wert := replacement table (code( zeichen ) + 1);
+ IF wert > 0
+ THEN INT CONST ende := wert + code (replacements SUB wert);
+ subtext (replacements, wert + 1, ende)
+ ELSE zeichen
+ FI.
+
+
+Bei den Prozeduren des Packets #on("i")#font store#off("i")# können die folgenden Fehlerfälle auftreten:
+
+ - Fonttabelle noch nicht eingestellt
+ Es wurde noch keine Fonttabelle in der Task eingestellt.
+
+ - Fonttabelle "fonttable name" gibt es nicht
+ Die angegebene Fonttabelle wurde weder in der eigenen Task, noch in der
+ Task 'configurator' gefunden.
+
+ - Font 'font nr' gibt es nicht
+ Unter der angegebenen Fontnummer gibt es in der eingestellten Font­
+ tabelle keinen Font. Speziell ist das für 'font nr' = 0 der Fall, falls ein Font­
+ name nicht gefunden wurde.
+
+ - unzulaessige Modifikation
+ Die angegebene Modifikation ist ungleich 1, 2, 4 oder 8.
+#page#
+
+#headeven#
+
+%#center#EUMEL-Systemhandbuch
+
+
+#end#
+#headodd#
+
+#center#8. Verschiedenes#right#%
+
+
+#end#
+
+#ib(9)#8. Verschiedenes#ie(9)#
+
+
+
+
+#ib(9)#8.1. Der Spoolmanager#ie(9)#
+
+
+Der "#ib#Spoolmanager#ie#" verwaltet eine #ib#Warteschlange von Datenräumen#ie# (Dateien), die von
+einem "#ib#Server#ie#" abgearbeitet werden sollen. Dabei puffert der Spoolmanager Dateien,
+die von beliebigen Tasks geschickt werden können, in einer Warteschlange und gibt
+sie der Reihe nach dem Server zur eigentlichen Verarbeitung. Ein typischer Einsatzfall
+(aber nicht der einzige) für ein solches System ist der Druck von Dateien in Multi-
+User-Systemen. Unabhängig davon, ob der Drucker gerade aktiv ist und wieviele
+Dateien noch auf den Ausdruck warten, kann jeder seine Datei dem Druckerspool (in
+der Regel die Task "PRINTER") senden und sofort danach weiterarbeiten.
+
+
+
+#ib(9)#Prozeduren des Spoolmanagers#ie(9)#
+
+
+Im privilegierten Ast des Taskbaumes (Söhne von "SYSUR"), stehen die folgenden
+Prozeduren zur Einrichtung eines Spoolmanagers zur Verfügung.
+
+#ib#spool manager#ie#
+ PROC spool manager (PROC server, BOOL CONST with start)
+ Zweck: Die Task, in der die Prozedur aufgerufen wird, wird zum Spoolmanager.
+ Wenn 'with start' auf TRUE gesetzt ist, wird eine Server-Task als unbe­
+ nannter Sohn ("-") eingerichtet und mit der übergebenen 'PROC server'
+ gestartet. Anderfalls muß der Spool durch den Benutzer mit Hilfe der
+ Spoolkommandos (siehe dort) gestartet werden.
+
+ PROC spool manager (PROC server)
+ Zweck: Diese Prozedur ruft die Prozedur 'spool manager' mit 'with start' gleich
+ TRUE auf.
+
+
+Mit Hilfe der folgenden Prozeduren kann der Spool eingestellt werden.
+
+#ib#station only#ie#
+ PROC station only (BOOL CONST flag)
+ Zweck: Wenn flag auf TRUE gesetzt ist, nimmt der Spooler nur Aufträge von
+ Tasks der eigenen Station entgegen.
+ Voreinstellung: 'station only (FALSE)'.
+
+ BOOL PROC station only
+ Zweck: liefert TRUE, wenn der Spooler nur von der eigenen Station benutzt
+ werden darf.
+
+#ib#spool duty#ie#
+ PROC spool duty (TEXT CONST duty)
+ Zweck: Mit dieser Prozedur kann ein Text im Spooler eingestellt werden, der die
+ Aufgabe des Spoolers beschreibt. Dieser wird beim 'list' gemeldet.
+
+ TEXT PROC spool duty
+ Zweck: Liefert die eingestellte Text-Beschreibung der Aufgabe des Spools.
+
+#ib#spool control task#ie#
+ PROC spool control task (TASK CONST task)
+ Zweck: Diese Prozedur gibt der Task 'task' und ihrer Söhne die Berechtigung
+ Spoolkommandos (z.B. 'stop' oder 'start') an den Spoolmanager zusen­
+ den. Dabei muß die Task auf derselben Station wie der Spool sein und
+ in der Task muß die Datei "spool cmd", die sich auf dem Standardar­
+ chiv befindet, insertiert werden.
+ Wird "SUPERVISOR" als Spoolkontrolltask eingestellt, so können alle
+ Tasks der Station, in denen die Datei "spool cmd" insertiert ist, die
+ Spoolkommandos geben.
+
+ TASK PROC spool control task
+ Zweck: Liefert die Taskidentifikation der Spoolkontrolltask.
+
+#ib#server channel#ie#
+ PROC server channel (INT CONST channel)
+ Zweck: Mit Hilfe dieser Prozedur wird im Spoolmanager eine Kanalnummer
+ eingestellt, die der Server mit der Prozedur 'server channel' abfragen
+ kann.
+ Fehlerfall:
+ * falsche Kanalangabe
+ Der angegebene Kanal ist kleiner als 1 oder größerer als 32.
+
+ INT PROC serverchannel
+ Zweck: Liefert die Nummer des Kanals, der im Spool eingestellt ist.
+
+#on("b")#Anmerkung:#off("b")# Soll im nicht-privilegierten Ast des Taskbaums (Söhne von "PUBLIC") ein
+ Spool eingerichtet werden, so muß dort die Datei "spool manager", die
+ sich auf dem Standardarchiv "std.zusatz" befindet, insertiert werden.
+
+
+
+
+#ib(9)##ib#Spoolkommandos#ie##ie(9)#
+
+
+Ein Spool kann zur Verwaltung der Warteschlange wie jede andere Task ans Termi­
+nal gekoppelt werden. Danach stehen die folgenden Spoolkommandos zur Verfügung.
+Diese Kommandos sind keine Prozeduren, sondern werden nur interpretiert. Sie dürfen
+also nur alleine eingegeben werden. Nach Beendigung der Verwaltungsaufgaben muß
+der Spool mit dem Kommando 'break' verlassen werden, da sonst keine weiteren
+Aufträge an den Spool gesendet werden können und auch die Warteschlange nicht
+weiter abgearbeitet wird.
+
+#ib#stop#ie#
+ Zweck: Die Server-Task wird gelöscht und dadurch der Spool deaktiviert. Der
+ Spool empfängt zwar noch weitere Aufträge und sortiert diese in die
+ Warteschlange ein. Die Warteschlange wird aber nicht weiterabgearbei­
+ tet. Ein eventuell von der Server-Task belegter Kanal wird freigegeben.
+ Ist bei einem 'stop' noch ein Auftrag in Bearbeitung, so wird dieser
+ Auftrag abrupt abgebrochen. Es wird jedoch angefragt, ob der Auftrag
+ nochmal neu an die erste Stelle in der Warteschlange eingetragen wer­
+ den soll.
+ Ist ein Spool deaktiviert, so wird dies bei einem 'list' angezeigt,
+
+#ib#halt#ie#
+ Zweck: Der Spool deaktiviert sich nach Abarbeitung des Auftrags, der gerade
+ bearbeitet wird. Bei einem 'list' wird dies vermerkt.
+
+#ib#start#ie#
+ Zweck: Der Spool wird aktiviert, indem eine neue Server-Task begonnen wird. Ist
+ der Spool zuvor nicht gestoppt worden, so wird zuerst ein 'stop' durch­
+ geführt.
+ Wurde mit der Prozedur 'server channel' kein Kanal eingestellt, so wird
+ die Warnung
+ WARNUNG : Serverkanal nicht eingestellt
+ ausgeben. Der Spool wird trotzdem gestartet.
+
+start (kanal nummer)
+ Zweck: Vor dem Start des Spools wird zuerst mit der Prozedur 'server channel'
+ der angegebene Kanal eingestellt.
+
+#ib#first#ie#
+ Zweck: Im Dialog kann ein Auftrag in der Warteschlange auf den ersten Platz
+ vorgezogen werden.
+
+#ib#killer#ie#
+ Zweck: Im Dialog werden alle Aufträge der Warteschlange zum Löschen ange­
+ boten.
+
+#ib#list spool#ie#
+ Zweck: Der aktuelle Zustand des Spools und die Warteschlange werden geli­
+ stet.
+
+Ist nun eine Spoolkontrolltask eingestellt worden (siehe 'spool control task'), so muß in
+ihr die Datei "spool cmd" insertiert werden. Danach stehen die folgenden Prozeduren
+zur Verfügung.
+
+#ib#stop#ie#
+ PROC stop (TASK CONST spool)
+ Zweck: Dem Spool 'spool' wird ein 'stop' zugestellt, was den Spool deaktiviert.
+ Wird noch ein Auftrag bearbeitet, so wird angefragt, ob dieser neu
+ eingetragen werden soll.
+
+#ib#halt#ie#
+ PROC halt (TASK CONST spool)
+ Zweck: Dem Spool 'spool' wird ein 'halt' zugestellt, d.h der Spool deaktiviert
+ sich nach Beendigung des aktuellen Auftrags.
+
+#ib#wait for halt#ie#
+ PROC wait for halt (TASK CONST spool)
+ Zweck: Dem Spool 'spool' wird ein 'halt' zugestellt. Die Task wartet jedoch auf
+ eine Rückantwort, die ihr der Spool sendet, wenn er sich nach Been­
+ digung des aktuellen Auftrags deaktiviert hat.
+ Fehlerfall:
+ * Task "task name" wartet schon auf halt
+ Die angegebene Task wartet schon auf eine Rückantwort des Spools
+ 'spool'.
+
+#ib#start#ie#
+ PROC start (TASK CONST spool)
+ Zweck: Dem Spool 'spool' wird ein 'start' zugestellt, wodurch der Spool sich
+ aktiviert. War der Spool zuvor nicht deaktiviert, so wird er zuerst ge­
+ stoppt.
+
+#ib#first#ie#
+ PROC first (TASK CONST spool)
+ Zweck: Im Dialog kann einer der Aufträge in der Warteschlange des Spools
+ 'spool' auf den ersten Platz vorgezogen werden.
+
+#ib#killer#ie#
+ PROC killer (TASK CONST spool)
+ Zweck: Im Dialog werden die Aufträge der Warteschlange des Spools 'spool'
+ zum Löschen angeboten.
+
+
+
+#ib(9)#Arbeitsweise des #ib#Servers#ie##ie(9)#
+
+
+Der Server wird vom Spoolmanager mit einer Prozedur gestartet, die die Abarbeitung
+der Warteschlange vornimmt. Dabei muß diese Prozedur zuerst den Datenraum mit
+dem 'fetch code' (= 11) holen. Danach kann der Server sich noch mit dem 'fetch
+param code' (= 21) die Dateiparameter (Dateiname, Schreib- und Lesepaßwort, Sen­
+dername und Senderstation) abholen und mit der Bearbeitung des Auftrags beginnen.
+
+Beispiel:
+
+
+LET fetch code = 11,
+ param fetch code = 21;
+BOUND STRUCT (TEXT name, write pass, read pass, sendername,
+ INT senderstation ) VAR msg;
+DATASPACE VAR ds, param ds;
+INT VAR reply;
+
+spool manager (PROC server);
+
+PROC server :
+ disable stop;
+ continue (server channel);
+ REP forget (ds); ds := nilspace;
+ call (father, fetch code, ds, reply);
+ forget (param ds); param ds := nilspace;
+ call (father, param fetch code, param ds, reply);
+ msg := param ds;
+ execute spool;
+ IF is error THEN error treatment FI;
+ PER;
+END PROC server;
+
+PROC execute spool :
+ enable stop;
+ ...
+
+
+
+
+
+#ib(9)#Senden eines Auftrags an den Spool#ie(9)#
+
+
+Jede Task kann jedem Spool durch Aufruf von '#ib#save#ie#' eine Datei senden.
+
+Beispiel:
+
+
+ save ("datei name", task ("spool name"))
+
+
+Dieses 'save'-Kommando funktioniert zweiphasig. Dabei wird in der ersten Phase dem
+Spool die Dateiparameter zugesendet. In der zweiten Phase folgt dann der Datenraum
+selber. Bei Netzübertragung zu einem Spool ist dieses zweiphasige 'save' jedoch
+nachteilig. Deshalb können Dateien vom Typ 'FILE' auch mit einem einphasigen 'save'
+unter dem 'file save code' (= 22) an den Spool gesendet werden. Die #on("i")#'headline'#off("i")# dieser
+Dateien muß jedoch dann auf eine bestimmte Art und Weise aufbereitet werden, so
+daß sie die Dateiparameter enthält. Beim Aufbau der #on("i")#'headline'#off("i")# muß eine Information
+muß mit dem Code 0 beginnen und dem Code 1 enden. Die Dateiparamter müssen
+dann mit der folgenden Reihenfolge in die #on("i")#'headline'#off("i")# eingetragen werden.
+
+ - Dateiname
+ - Schreibepaßwort
+ - Lesepaßwort
+ - Name des Senders
+ - Station des Senders
+
+Beispiel:
+
+
+...
+LET file save code = 22;
+DATASPACE VAR ds := old (file name);
+FILE VAR file := sequential file (input, ds);
+INT VAR reply;
+headline (file, ""0"" + file name +
+ ""1""0"" + write password +
+ ""1""0"" + read password +
+ ""1""0"" + name (myself) +
+ ""1""0"" + text (station (myself)) + ""1"");
+call (spool task, file save code, ds, reply);
+...
+
+
+Der Spoolmanager setzt bei Dateien, die mit dem 'file save code' angeliefert werden
+die #on("i")#'headline'#off("i")# wieder auf den Dateinamen.
+
+Den Benutzer stehen neben dem '#ib#save#ie#'-Kommando zur Übertragung einer Datei zum
+Spool noch die folgenden Kommandos zur Verfügung.
+
+
+ save (ALL myself, task ("spool name"))
+ save (SOME myself, task ("spool name"))
+
+ übertragung aller bzw. einiger Dateien der eigenen Task zum Spool.
+
+
+ #ib#erase#ie# ("datei name", task ("spool name"))
+ erase (ALL task ("spool name"), task ("spool name"))
+
+ Löschen eines bzw. aller eigenen Aufträge in der Warteschlange des Spools
+
+
+ #ib#list#ie# (task ("spool name"))
+
+ Liste des Spools über den aktuellen Zustand und die Warteschlange.
+
+Existiert ein Spool "PRINTER", so gibt es noch die folgenden Befehle.
+
+
+ #ib#print#ie#
+ print ("datei name")
+ print (ALL myself)
+ print (SOME myself)
+
+ Sie entsprechen einem 'save' an die Task "PRINTER"
+
+
+ #ib#printer#ie#
+
+ Liefert den internen Taskbezeichner der Task "PRINTER", d.h. diese Proze­
+ dur entspricht dem Aufruf von 'task ("PRINTER")'.
+
+
+
+
+
+#ib(9)#8.2. #ib#Freie Kanäle#ie(9)##ie#
+
+
+Das Paket '#ib#free channel#ie#' ermöglicht in Multi-User-Systemen die Einrichtung freier
+Kanäle. Freie Kanäle kann man zusätzlich zu dem Terminalkanal, der einem vom
+Supervisor zugeordnet wurde, benutzen. Jeder freie Kanal wird durch eine (benannte)
+Task - dem #ib#Kanalmanager#ie# - implementiert. Er wird danach mit dem Tasknamen ange­
+sprochen und kann von jeder Task belegt und wieder freigegeben werden. Während
+einer Belegung können andere Tasks den Kanal nicht benutzen. Der Kanalmanager
+koppelt sich für jede Belegung an den physikalischen Kanal an und gibt ihn danach
+auch wieder frei. Ein physischer Kanal kann also im Wechsel von mehreren Kanalma­
+nagern oder einem Kanalmanager und "normalen" Tasks belegt werden.
+
+Das Paket 'free channel' muß beim Kanalmanager und allen Benutzern des Kanals
+bzw. bei einem gemeinsamen Vater insertiert sein.
+
+
+#ib#FCHANNEL#ie#
+ Zweck: Der Datentyp FCHANNEL spezifiziert einen freien Kanal. Die Assoziie­
+ rung mit einem realen freien Kanal erfolgt mit der Prozedur 'free chan­
+ nel' und der Zuweisung ':=' (ähnlich wie beim Datentyp FILE).
+
+:=
+ OP := (FCHANNEL VAR dest, FCHANNEL CONST source)
+ Zweck: Zuweisung. Wird insbesondere bei der Assoziation (Assoziation: Verbin­
+ dung zwischen FCHANNEL VAR und Kanal) benötigt.
+
+#ib#close#ie#
+ PROC close (FCHANNEL VAR f)
+ Zweck: Der belegte FCHANNEL wird freigeben.
+
+ PROC close (TEXT CONST channel name)
+ Zweck: Der namentlich spezifizierte Kanal wird freigegeben.
+
+#ib#dialogue#ie#
+ PROC dialogue (FCHANNEL CONST f, TEXT CONST end of dialogue char)
+ Zweck: Der Terminalkanal wird direkt mit dem angegebenen freien Kanal ge­
+ koppelt. (Das Benutzerterminal wird "durchgeschaltet".) Eingaben am
+ Terminal werden auf 'f' ausgegeben, auf 'f' ankommende Daten werden
+ auf dem Benutzerterminal ausgegeben. Der Datenverkehr erfolgt im
+ #ib#Vollduplexmodus#ie#, d.h. der Datenverkehr beider Richtungen läuft unab­
+ hängig voneinander parallel. Hiermit können Terminals dynamisch an
+ andere Rechner gekoppelt werden. Der Dialogzustand wird durch Ein­
+ gabe des 'end of dialogue char' am Benutzerterminal beendet.
+
+#ib#fetch#ie#
+ PROC fetch (FCHANNEL VAR channel, TEXT CONST filename, controlchars)
+ Zweck: Die angegebene datei wird über den Kanal 'channel' eingelesen. Dabei
+ besteht 'control chars' aus zwei bis vier Zeichen
+ (eof + eol + handshake + handshake prompt)
+ eof:
+ Dieses Zeichen wird als Dateiabschluß erwartet.
+ eol:
+ Dieses Zeichen wird als Zeilenende erwartet.
+ handshake, handshake prompt:
+ Falls 'handshake prompt <> "" ' ist, wird bei dem Empfang eines
+ Prompt­Zeichen eine Quittung (Handshake­Zeichen) ausgegeben.
+
+#ib#free channel#ie#
+ FCHANNEL PROC free channel (TEXT CONST channel name)
+ Zweck: Der namentlich spezifizierte Kanal wird belegt und als FCHANNEL
+ geliefert.
+ Fehlerfälle:
+ * task not existing
+ * channel not free
+
+ PROC free channel (INT CONST physical channel number)
+ Zweck: Installiert die eigene Task als Kanalmanager für den angegebenen
+ physikalischen Kanal.
+
+#ib#in#ie#
+ PROC in (FCHANNEL CONST f, TEXT VAR response)
+ Zweck: Es werden die Daten geliefert, die seit dem letzten 'in'­Aufruf bzw. seit
+ der Assoziierung eingetroffenen Daten geliefert. Bei 'niltext' liegen keine
+ Eingabedaten vor.
+
+#ib#open#ie#
+ PROC open (FCHANNEL VAR f)
+ Zweck: Der Kanal wird neu belegt. Die Assoziation erfolgt mit dem gleichen
+ Kanal wie bei der letzten Assoziation.
+ Fehlerfälle:
+ * "task" gibt es nicht
+ * Kanal ist nicht frei
+
+#ib#out#ie#
+ PROC out (FCHANNEL VAR f, TEXT CONST message)
+ Zweck: Der übergebene Text wird auf dem Kanal 'f' ausgegeben.
+
+#ib#save#ie#
+ PROC save (FCHANNEL VAR f, TEXT CONST name, control chars)
+ Zweck: Die übergebene Datei muß eine Textdatei sein (Struktur eines FILEs
+ haben). Sie wird komplett auf dem Kanal 'f' ausgegeben.
+ Dabei bestehen 'control chars' aus bis zu drei Zeichen:
+ (eof char + eol char + handshake option)
+ eof char:
+ Dieses Zeichen wird als Dateiabschluß geschickt.
+ eol char:
+ Dieses zeichen wird als Zeilenabschluß geschickt.
+ handshake option:
+ Falls die 'control chars' drei Zeichen umfassen, wird nach jeder
+ Zeile auf das als drittes definierte Handshake­Zeichen gewartet.
+
+Beispiele:
+
+
+ a) FCHANNEL VAR f := free channel ("otto") ;
+ TEXT VAR antwort ;
+ out (f, "hallo") ;
+ in (f, antwort) ;
+ put (antwort) ;
+ close (f) ;
+
+ b) open (f) ;
+ REP
+ out (f, "hallo ") ;
+ in (f, antwort)
+ UNTIL antwort <> "" PER ;
+ put (antwort) ;
+ close (f) ;
+
+ c) open (f) ;
+ dialogue (f, "§") ;
+ close (f)
+
diff --git a/doc/user/benutzerhandbuch.1 b/doc/user/benutzerhandbuch.1
new file mode 100644
index 0000000..7c8fec7
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.2 b/doc/user/benutzerhandbuch.2
new file mode 100644
index 0000000..0153fae
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.3 b/doc/user/benutzerhandbuch.3
new file mode 100644
index 0000000..eb1c762
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.4 b/doc/user/benutzerhandbuch.4
new file mode 100644
index 0000000..c13a091
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.5a b/doc/user/benutzerhandbuch.5a
new file mode 100644
index 0000000..1e907f0
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.5b b/doc/user/benutzerhandbuch.5b
new file mode 100644
index 0000000..748e398
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.5c b/doc/user/benutzerhandbuch.5c
new file mode 100644
index 0000000..010cacd
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.5d b/doc/user/benutzerhandbuch.5d
new file mode 100644
index 0000000..8a61f29
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.5e b/doc/user/benutzerhandbuch.5e
new file mode 100644
index 0000000..d515c6a
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.6 b/doc/user/benutzerhandbuch.6
new file mode 100644
index 0000000..5e035d2
--- /dev/null
+++ b/doc/user/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/benutzerhandbuch.anhang b/doc/user/benutzerhandbuch.anhang
new file mode 100644
index 0000000..5a58f95
--- /dev/null
+++ b/doc/user/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/warenhaus/Anhang Warenhaus b/doc/warenhaus/Anhang Warenhaus
new file mode 100644
index 0000000..9388ceb
--- /dev/null
+++ b/doc/warenhaus/Anhang Warenhaus
@@ -0,0 +1,65 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (100)#
+#headodd#
+#center#gs-Warenhaus#right#%
+
+#end#
+#headeven#
+%#center#gs-Warenhaus
+
+#end#
+#center#1
+
+#center##on("b")##Anhang#off("b")#
+
+#on("b")##center#Muster für Codekarten#off("b")#
+
+ +-------------------+
+ | O O O O O O O O |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ | ----------------- |
+ +-------------------+
+
+
+
+ +--------------------+
+ | |
+ | O O O O |
+ | |
+ | |
+ |W A R E N K A R T E |
+ | |
+ | |
+ | Artikel |
+ | ---------------- |
+ | |
+ +--------------------+
+
+#page#
+
+
+ +------------------------+
+ | |
+ | O O O O O O |
+ | |
+ | K U N D E N K A R T E |
+ | |
+ | |
+ | Name |
+ | ---------------------- |
+ | |
+ | |
+ +------------------------+
+
+
+
+
+
+
diff --git a/doc/warenhaus/Inhalt Warenhaus b/doc/warenhaus/Inhalt Warenhaus
new file mode 100644
index 0000000..a9b720d
--- /dev/null
+++ b/doc/warenhaus/Inhalt Warenhaus
@@ -0,0 +1,50 @@
+#limit (11.5)##pagelength (16.5)##pageblock#
+#start (1.8,0.0)#
+Inhaltsverzeichnis
+
+
+1 Was kann gs-Warenhaus 1-1
+
+2 Aufbau von gs-Warenhaus 2-1
+
+3 Installation von gs-Warenhaus 3-1
+3.1 Voraussetzungen 3-1
+3.2 Lieferumfang 3-1
+3.3 Installation 3-2
+3.4 Einrichten mehrerer Hauptstellen 3-8
+
+4 Anschluß eines Codekartenlesers 4-1
+4.1 Hardware-Voraussetzungen 4-1
+4.2 Verwendung des MUFI 4-2
+4.2.1 Einstellungen am MUFI 4-3
+4.2.2 MUFI im Terminalkanal 4-5
+4.2.3 MUFI als Endgerät 4-6
+4.3 Verwendung des AKTRONIC-Adapters 4-7
+4.4 Konfiguration der seriellen Schnittstelle 4-8
+4.5 Verbindung der Hardware-Komponenten 4-10
+
+5 Beschreibung der Menufunktionen 5-1
+5.1 Kurzhinweise zur Bedienung des Menus 5-1
+5.2 Menufunktionen zum Oberbegriff 'Info' 5-4
+5.3 Menufunktionen zum Oberbegriff 'Eingabeart' 5-7
+5.4 Menufunktionen zum Oberbegriff 'Kommandos' 5-9
+5.5 Menufunktionen zum Oberbegriff 'Programme' 5-18
+5.6 Menufunktionen zum Oberbegriff 'Filialdaten' 5-24
+5.7 Menufunktionen zum Oberbegriff 'Archiv' 5-28
+
+6 Beschreibung der Programmierschnittstelle 6-1
+6.1 Schreibweisen und Syntaxregeln in GRIN-Programmen 6-4
+6.2 Kontrollstrukturen 6-8
+6.3 Detailbeschreibung der Warenhaus-Grundbefehle 6-13
+
+7 Weitere Kommandos (für Systembetreuer) 7-1
+
+Anhang: Muster für Codekarten
+
+
+
+
+
+
+
+
diff --git a/doc/warenhaus/gs-Warenhaus handbuch.impressum b/doc/warenhaus/gs-Warenhaus handbuch.impressum
new file mode 100644
index 0000000..3fbb371
--- /dev/null
+++ b/doc/warenhaus/gs-Warenhaus handbuch.impressum
@@ -0,0 +1,89 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#gs-Warenhaus
+
+
+
+
+#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#
+
+#free (4.0)##on("b")#
+#center#gs-Warenhaus
+
+
+#center#Benutzerhandbuch
+
+
+#center#Version 1.0
+
+
+#off("b")##center#copyright
+#center#Eva Latta-Weber
+#center#Software- und Hardware-Systeme, 1988
+#center#ERGOS GmbH, 1990
+#page#
+#block#
+#center#____________________________________________________________________________
+
+
+Copyright:  ERGOS GmbH   März 1990
+
+ Alle Rechte vorbehalten. Insbesondere ist die Überführung in
+ maschinenlesbare Form sowie das Speichern in Informations­
+ systemen, auch auszugsweise, nur mit schriftlicher Einwilligung
+ der ERGOS GmbH gestattet.
+
+
+#center#____________________________________________________________________________
+
+Es kann keine Gewähr übernommen werden, daß das Programm für eine
+bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
+Anwender.
+
+Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
+Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
+Handbuch kann jederzeit ohne Ankündigung geändert werden.
+
+Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
+ erstellt und aufbereitet und auf einem Kyocera Laser­
+ drucker gedruckt.
+
+
+
+
+#center#___________________________________________________________________________
+
+
+
+Ergonomic Office Software GmbH
+
+Bergstr. 7 Telefon: (02241) 63075
+5200 Siegburg Teletex: 2627-2241413=ERGOS
+ Telefax: (02241) 63078
+
+
+#center#____________________________________________________________________________
+
+
diff --git a/doc/warenhaus/gs-Warenhaus-1 b/doc/warenhaus/gs-Warenhaus-1
new file mode 100644
index 0000000..ca79094
--- /dev/null
+++ b/doc/warenhaus/gs-Warenhaus-1
@@ -0,0 +1,124 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (3)#
+#headodd#
+#center#gs-warenhaus#right#%
+
+#end#
+#headeven#
+%#center#gs-warenhaus
+
+#end#
+#center#1  Was kann gs-Warenhaus
+
+
+Das Programmpaket #on("b")#gs-Warenhaus#off("b")# entstand auf der Grundlage der projekt­
+orientierten Unterrichtseinheit "WARENHAUS", die vom 'Landesinstitut für Schule
+und Weiterbildung' (LSW) in Soest für den Bereich der 'Informations- und
+kommunikationstechnologischen Grundbildung' (kurz: GRIN) entwickelt wurde.
+
+Unter #on("b")#1.1 Thema und Ziele #off("b")# ist in dem zugehörigen Begleitheft folgendes zu
+finden:
+
+#i1#"Die Schülerinnen und Schüler sollen in dieser Unterrichtseinheit die An­
+wendungen neuer Technologien im Warenhaus kennenlernen und dabei sowohl
+die grundlegenden technologischen Zusammenhänge erarbeiten als auch die
+Auswirkungen reflektieren, die sich durch ihren Einsatz ergeben. Sie werden
+dabei nicht nur die Rolle der Kunden einnehmen, sondern auch die Interessen
+der Angestellten und die der Geschäftsleitung in ihre Beurteilung mit einbe­
+ziehen.
+
+Diese komplexen Zusammenhänge werden den Schülerinnen und Schülern im 8.
+Schuljahr nähergebracht, indem sie veranlaßt werden, in einem Modell-Waren­
+haus selbst schrittweise das Modell eines Warenwirtschaftssystems aufzubauen
+und damit zu arbeiten.
+
+In diesem Modell-Warenhaus kommt dem Umgang mit dem Computer eine
+besondere Bedeutung zu. Mit Hilfe des Rechners, an den ein Codekartenleser
+angeschlossen ist, und des zugehörigen Programms werden die wesentlichen
+Bestandteile eines modernen Kassensystems abgebildet.
+
+Mit dem Codekartenleser kann das Merkmal des automatischen Dateneinlesens
+vereinfacht dargestellt werden. Programmabläufe, Bildschirmausgaben werden
+nicht nur über Tastatureingaben der Benutzer beeinflußt, sondern auch durch
+das Lesen verschlüsselter Informationen. Am Beispiel des Lesegerätes wird zum
+#page#
+einen der Rationalisierungseffekt an der Kasse verdeutlicht, es lassen sich zum
+anderen aber auch Fragen der Zugangsberechtigung durch maschinenlesbare
+Ausweiskarten ansprechen.
+
+Das zur Verfügung stehende Programm erlaubt es, daß die Schülerinnen und
+Schüler schrittweise die zentralen Funktionen eines modernen Warenwirtschafts­
+systems kennenlernen. Neben der maschinellen Datenerfassung mit Hilfe des
+Lesegeräts und der Decodierung von Informationen sind dies z.B.:
+
+- automatische Abrechnung,
+- Speicherung von Warendaten,
+- Kontrolle des Lagerbestandes,
+- Informationen über Verkaufszahlen,
+- automatische Nachbestellung,
+- Speicherung von Kundendaten,
+- Zusammenfassung von Informationen aus verschiedenen Filialen,
+- Erstellen von Übersichten.
+
+Die Schülerinnen und Schüler arbeiten dabei mit einer benutzerfreundlichen
+Programmierumgebung. Diese bietet einerseits die Möglichkeit, die Befehle direkt
+aufzurufen, mit denen alle Funktionen dieses vereinfachten Warenwirtschafts­
+systems ausgeführt werden können, wie etwa Dateien aufbauen, einkaufen und
+Listen erstellen. Andererseits stellt die Programmierumgebung weitere Befehle
+zur Verfügung, mit denen einige dieser Funktionen auch 'programmiert' werden
+können."#off("b")#
+
+Soweit zu Thema und Zielen dieser Unterrichtseinheit. Für weitere didaktisch-
+methodische Informationen zu dieser Reihe verweisen wir auf das entsprechende
+Begleitheft des LSW.
+(Vertrieb: Soester Verlagskontor, Jakobistraße 46, 4770 Soest; Bestellnummer 1710)
+#page#
+Da bei der Software-Entwicklung für GRIN vom LSW das Betriebssystem EUMEL nicht
+mit berücksichtigt wird, erscheint es notwendig, durch Eigeninitiativen wenigstens
+einige GRIN - Projekte unter EUMEL zur Verfügung zu stellen, um den Schulen, die
+mit EUMEL arbeiten, nicht gänzlich den Zugang zu GRIN zu verwehren.
+
+Das Projekt WARENHAUS bietet sich dabei besonders an, weil die Vernetzungen
+innerhalb eines Warenwirtschaftssystems mit einem Mehrplatz-System und der
+Möglichkeit der Intertask-Kommunikation wesentlich wirklichkeitsnäher aufzeigbar
+sind als mit einem reinen Einzelplatz-System wie z.B. MS DOS, bei dem die
+Kommunikation nur über den Transport von Disketten geregelt wird. (Ein Netzwerk
+ist in der Software der LSW nicht vorgesehen.)
+
+#on("b")#gs-Warenhaus#off("b")# umfaßt die wesentlichen Funktionen der vom LSW für MS DOS
+erstellten Programmierumgebung WARENHAUS-2. Es ist jedoch keine genaue 'Nach­
+bildung' dieser Software, sondern eher eine Realisierung des 'Vorbildes' unter
+Berücksichtigung der besonderen Gegebenheiten des EUMEL-Systems, wobei sowohl
+am äußeren Erscheinungsbild als auch inhaltlich Änderungen und Erweiterungen
+vorgenommen wurden. Eingebettet ist #on("b")#gs-Warenhaus#off("b")# in die menüorientierte
+Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")#.
+
+Ein Codekartenleser kann in Verbindung mit einem Interface (z.B. dem MUFI der
+Firma BICOS) verwendet werden, ist für die Nutzung des Programmes aber nicht
+unbedingt erforderlich.
+
+Da zur Zeit der Entstehung dieses Programms GRIN an den Schulen noch nicht
+etabliert ist und man mit (vorerst) nur einem Projekt dem Ansatz von GRIN sicher
+nicht gerecht werden kann, ist #on("b")#gs-Warenhaus#off("b")# flexibel angelegt. Es enthält neben
+einer Programmierumgebung, in der die vom LSW für GRIN entwickelten Befehle und
+Syntaxregeln benutzt werden, eine weitere, in der in gewohnter ELAN-Syntax ge­
+arbeitet werden kann, so daß es z.B. ebenfalls für den Unterricht in Klasse 9/10 (für
+spezielle Fragestellungen evtl. auch in der Sek. II) verwendbar ist.
+#page#
+Natürlich ist #on("b")#gs-Warenhaus#off("b")# #i1#kein#off("b")# Verwaltungsprogramm für 'echte' Warenhäuser
+oder gar ganze Warenwirtschaftssysteme, es ist vielmehr ein Simulationsprogramm,
+das die Vorgänge in solch einem System anhand eines stark vereinfachten Modells
+klarmachen soll. Aus diesem Grunde werden Ihnen beim Umgang mit diesem Pro­
+gramm wahrscheinlich eine ganze Reihe von Erweiterungsmöglichkeiten und
+Funktionen einfallen, die das Programm nicht bietet. Denken Sie dabei bitte aber
+immer daran, daß #on("b")#gs-Warenhaus#off("b")# in erster Linie für den Einsatz in GRIN oder im
+WP-Unterricht konzipiert wurde, vornehmlich also von absoluten 'Anfängern' auf dem
+Gebiet des Umgangs mit Rechnern genutzt wird, die von einer zu großen Fülle von
+Programmfunktionen nur verwirrt würden.
+
+Wir werden Ihnen in den folgenden Kapiteln dieses Handbuchs den Umgang mit den
+Funktionsangeboten von #on("b")#gs-Warenhaus#off("b")# erklären, auf die Umsetzungsmöglichkeiten
+der am Anfang dieses Kapitels erwähnten Ziele im Unterricht gehen wir jedoch nicht
+ein. Beschaffen Sie sich dafür bitte das bereits oben angegebene Begleitheft des LSW.
+
diff --git a/doc/warenhaus/gs-Warenhaus-2 b/doc/warenhaus/gs-Warenhaus-2
new file mode 100644
index 0000000..f3f1284
--- /dev/null
+++ b/doc/warenhaus/gs-Warenhaus-2
@@ -0,0 +1,72 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (5)#
+#headodd#
+#center#gs-warenhaus#right#%
+
+#end#
+#headeven#
+%#center#gs-warenhaus
+
+#end#
+#center##on("b")#2  Aufbau von gs-Warenhaus#off("b")#
+
+#on("b")#gs-Warenhaus#off("b")# bietet die Möglichkeit, nicht nur #us#ein#use# Warenhaus, sondern eine
+Warenhaus-Kette im Modell nachzubilden. Solch eine Warenhauskette besteht hier
+stets aus einer #us#Hauptstelle#use# und einer oder mehrerer (bis zu 10) #us#Filialen#use#. Damit die
+Filialen auf die zentralen Daten der Warenhauskette zugreifen können, verfügt jede
+Hauptstelle über eine #us#Zentrale#use#, die jederzeit angerufen werden kann. Für die
+Kommunikation untereinander gehört zu jeder Filiale eine (Filial-) #us#Verwaltung#use#, bei
+der die aktuellen Filialdaten erfragt werden können.
+
+
+Realisiert wird dieser Aufbau durch verschiedene Tasks und der Möglichkeit der
+Intertask-Kommunikation. Unter einer Task, in der #on("b")#gs-Warenhaus#off("b")# insertiert ist,
+können eine oder mehrere Tasks als Hauptstellen angemeldet werden (siehe '3.3
+Installation' und '7 Weitere Kommandos'). So kann man z.B. für verschiedene
+Klassen gleichzeitig Warenhausketten einrichten. Zu beachten ist, daß verschiedene
+Ketten untereinander völlig unabhängig sind und dadurch #us#nicht#use# miteinander
+kommunizieren können.
+
+
+Jede Hauptstellen-Task richtet sich automatisch eine Sohn-Task als Zentrale ein.
+Werden nun Sohn-Tasks einer Hauptstellen-Task angemeldet, so werden diese zu
+Filialen der entsprechenden Hauptstelle, wobei ihnen automatisch eine Filialnummer
+zugeteilt wird, die identisch ist mit der Kanalnummer des benutzten Terminals.
+(Steht keine Mehrplatzanlage zur Verfügung, so läßt sich nur #us#eine#use# Filiale einrichten;
+die Filialnummer ist dann in der Regel 1.)
+
+
+Die Filial-Tasks ihrerseits legen beim Starten von #on("b")#gs-Warenhaus#off("b")# automatisch jeweils
+eine Sohn-Task als (Filial-) Verwaltung an.
+#page#
+Insgesamt ergibt sich folgender schematischer Aufbau (die Pfeile zeigen die
+Kommunikationsmöglichkeiten an):
+
+
+#on("b")#
+ W A R E N H A U S
+ / | \
+ Hauptstelle A Hauptstelle B Hauptstelle C . . .
+
+ / | \
+Zentrale A Filiale A1 Filiale A2 . . .
+ ^
+ |
+ | Verwaltg.A1 Verwaltg.A2 . . .
+ | ^ ^
+ | | |
+ --------------------------- . . .
+#off("b")#
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/warenhaus/gs-Warenhaus-3 b/doc/warenhaus/gs-Warenhaus-3
new file mode 100644
index 0000000..ffef881
--- /dev/null
+++ b/doc/warenhaus/gs-Warenhaus-3
@@ -0,0 +1,309 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (7)#
+#headodd#
+#center#gs-Warenhaus#right#%
+
+#end#
+#headeven#
+%#center#gs-Warenhaus
+
+#end#
+#center#1
+
+#center##on("b")#3  Installation von gs-Warenhaus#off("b")#
+
+
+Bevor Sie #on("b")#gs-Warenhaus#off("b")# auf Ihrem Computer benutzen können, müssen Sie das
+Programm zunächst installieren. Wenn #on("b")#gs-Warenhaus#off("b")# auf Ihrem System schon zur
+Verfügung steht, können Sie dieses Kapitel ruhig überspringen.
+
+
+
+#on("b")#3.1  Voraussetzungen#off("b")#
+
+Um #on("b")#gs-Warenhaus#off("b")# auf Ihrem Computer betreiben zu können, muß das EUMEL-
+Betriebssystem installiert sein. #on("b")#gs-Warenhaus#off("b")# setzt die Multi-User-Version voraus
+und ist lauffähig ab Version 1.8.0. #on("b")#gs-Warenhaus#off("b")# setzt weiterhin voraus, daß auf
+Ihrem Computer bereits das Programm #on("b")#gs-DIALOG#off("b")# (ab Version 1.1) installiert ist.
+
+
+
+#on("b")#3.2  Lieferumfang#off("b")#
+
+#on("b")#gs-Warenhaus#off("b")# wird auf einer Diskette geliefert, die alle notwendigen Programme
+enthält (die Installation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den Inhalt
+der Diskette feststellen zu können, starten Sie Ihr System und bringen es dazu, daß
+'gib kommando:' erscheint. Dann legen Sie die Diskette ein und geben das
+Kommando:
+
+
+#on("b")#archive("gs-Warenhaus"); list(archive); release(archive) <RETURN>#off("b")#
+#page#
+Anschließend erscheint eine Übersicht der auf dem Archiv vorhandenen Programme.
+Folgende Dateinamen sollten sich in der Übersicht befinden:
+
+ "gs-MENUKARTE:Warenhaus"
+ "gs-Warenhaus 0: ohne Kartenleser"
+ "gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter"
+ "gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät"
+ "gs-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal"
+ "--------------------------------------------"
+ "gs-Warenhaus 1"
+ "gs-Warenhaus 2"
+ "gs-Warenhaus 3"
+ "gs-Warenhaus 4"
+ "gs-Warenhaus 5"
+ "gs-Warenhaus/gen"
+
+Eventuell können noch weitere Namen auf der Diskette vorhanden sein. Wenn Sie den
+Inhalt der Diskette kontrolliert haben und diese Dateien auf der Diskette vorhanden
+sind, können Sie #on("b")#gs-Warenhaus#off("b")# installieren.
+
+Sollten Sie statt der Übersicht eine Fehlermeldung erhalten, überprüfen Sie bitte, ob
+die Diskette das richtige Format besitzt oder ob Ihr Diskettenlaufwerk Probleme
+macht. Sollten dagegen Programme fehlen, so reklamieren Sie die Diskette.
+
+
+
+#on("b")#3.3  Installation#off("b")#
+
+#on("b")#gs-Warenhaus#off("b")# muß in einer Task installiert werden, in der bereits das Programm
+#on("b")#gs-DIALOG#off("b")# zur Verfügung steht. Alle Söhne und Enkel der neuen Task können
+anschließend das Warenhaus-Modell aufrufen. Richten Sie also eine Task als Sohn
+#page#
+der Task ein, in der auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir
+nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' installiert ist und die neue
+Task den Namen 'WARENHAUS' erhalten soll. (Sie können für die Task auch einen
+beliebigen anderen Namen wählen):
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+
+#off("b")#
+ --> gib supervisor kommando:
+#on("b")#
+ begin ("WARENHAUS","MENU") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+
+(Arbeiten mehrere Personen mit dem Computer, dann ist es sinnvoll, diese Task vor
+unbefugtem Zugriff durch ein Passwort zu schützen. Wie das gemacht wird, können
+Sie in Ihrem EUMEL-Benutzerhandbuch erfahren.)
+
+Legen Sie dann die Archivdiskette ein, auf der sich #on("b")#gs-Warenhaus#off("b")# befindet, und
+geben Sie die folgenden Kommandos:
+
+#on("b")#
+ archive ("gs-Warenhaus") <RETURN>
+
+ fetch (ALL archive, archive) <RETURN>
+
+ release (archive) <RETURN>
+
+ run ("gs-Warenhaus/gen") <RETURN>
+#off("b")#
+
+Sie haben damit das Installationsprogramm gestartet und können die Diskette wieder
+aus dem Laufwerk nehmen. (Natürlich können Sie die Dateien auch mit Hilfe von
+#on("b")#gs-DIALOG#off("b")# von der Diskette holen. Achten Sie dann bitte darauf, daß sie #on("b")#alle#off("b")# oben
+angegebenen Dateien von der Diskette in Ihre Task holen).
+#page#
+Zunächst werden Sie nun aufgefordert, eine Interface-Anpassung für den Codekarten­
+leser auszuwählen. Dazu erscheint das folgende Menu auf dem Bildschirm:
+
++----------------------------------------------------------------------+
+|center#Auswahl einer Interface-Anpassung für den Codekartenleser |
+|center#Wenn kein Kartenleser benutzt wird, <ESC><q> tippen! |
+| |
+| Auswahl  e i n e r  Datei durch Ankreuzen |
+| |
+| ==> � gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter |
+| � gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät |
+| � gs-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal |
+| |
+| |
+| |
+| |
+| Info: <?> Fertig: <ESC><q> Abbrechen: <ESC><h> |
+| |
++-----------------------------------------------------------------------
+Soll kein Kartenleser benutzt werden, tippen Sie einfach <ESC><q>. Sonst fahren
+Sie den Pfeil mit den Cursor-Tasten in die gewünschte Zeile und drücken
+<RETURN>. Welche der angegebenen Anpassung für welchen Zweck die geeignete
+ist, wird in Kapitel 4 ("Anschluß eines Codekartenlesers") genauer beschrieben.
+
+Daraufhin wird die Installation automatisch durchgeführt. Haben Sie die Anpassung
+für den 'AKTRONIC-Adapter' oder für das 'MUFI als Endgerät' ausgewält, so erscheint
+nach der Insertierung dieser Datei die Aufforderung
+
+#center##on("b")#Gib Interface-Kanal:#off("b")#
+
+Hier muß angegeben werden, an welchen Kanal (serielle Schnittstelle) das Interface
+angeschlossen werden soll (vgl. wiederum Kapitel 4). Der Interface-Kanal läßt sich
+auch später noch umstellen (vgl. Kapitel 7).
+
+Wenn der Insertierungs-Vorgang abgeschlossen ist, müssen Sie noch einige Fragen
+beantworten:
+
+#on("b")#Frage 1:#off("b")# #on("b")#Version für GRIN (j/n)?#off("b")#
+
+Tippen Sie hier ein <j>, so werden später in der Programmierumgebung die
+'Soester' Befehle und Syntax-Regeln benutzt, ein <n> liefert die Programmier­
+umgebung für ELAN. Die Versions-Einstellung kann auch noch später geändert
+werden (vgl. Kapitel 7, Befehl 'grin').
+
+#on("b")#Frage 2:#off("b")# #on("b")#Soll diese Task Warenhaus-Hauptstelle sein (j/n)?#off("b")#
+
+Das Tippen von <j> macht Ihre momentan benutzte Task zur (einzigen!) Waren­
+haus-Hauptstelle; Sie können dann (nach Beantwortung mindestens einer weiteren
+Frage, s.u.) in Söhnen dieser Task das Warenhaus-Programm starten. Allerdings ist es
+dann nicht mehr möglich, Sohntasks dieser Task zu Hauptstellen zu machen!
+
+Möchten Sie aber mehrere Hauptstellen (evtl. für verschiedene Lerngruppen) ein­
+richten, so müssen Sie hier ein <n> tippen. In diesem Fall ist die Installation
+zunächst beendet und es erscheint der EUMEL-Eingangsbildschirm. Was Sie dann
+noch tun müssen, erfahren Sie in Kapitel 3.4; die folgenden Ausführungen können
+Sie überschlagen.
+
+#on("b")#Frage 3:#off("b")# #on("b")#Mit Direktstart (j/n)?#off("b")#
+
+Wenn Sie vor dem Benutzer die 'gib kommando:'-Ebene verbergen wollen, können
+Sie das System durch Tippen eines <j> so einstellen, daß sich sofort nach Ein­
+richten einer Sohntask das Menusystem meldet. Für den Anfänger kann das die
+Arbeit durchaus erleichtern. Wenn Sie das nicht möchten, tippen Sie hier ein <n>.
+Haben Sie die Frage mit <j> beantwortet, so erscheint noch eine (letzte) Abfrage:
+
+#on("b")#Frage 4:#off("b")# #on("b")#Mit automatischem Löschen (j/n)?#off("b")#
+
+Durch Tippen eines <j> legen Sie fest, daß in den Sohntasks nach Verlassen des
+Menus die jeweilige Task automatisch gelöscht wird. Tippen Sie ein <n>, dann wird
+nach Verlassen des Menus angefragt, ob die Task gelöscht werden soll. Wird die Frage
+bejaht, wird gelöscht - sonst wird die Task abgekoppelt (break) und kann durch
+'continue' wieder angekoppelt werden.
+
+#on("b")#Anmerkung:#off("b")# In Tasks, in denen Sie die Frage nach dem Direktstart mit <j> beant­
+wortet haben, sollte nicht das Kommando 'monitor' gegeben werden, da Sie durch
+dieses Kommando auch diese Task zu einer Task machen, die sich direkt mit dem
+Menu meldet und ggf. bei Verlassen des Menus automatisch gelöscht wird!
+
+
+Nachdem der EUMEL-Eingangsbildschirm zu sehen ist, können Sie nun #on("b")#gs-Waren­
+haus#off("b")# starten. Nehmen wir an, die Task 'WARENHAUS' sei Hauptstellen-Task. Sie ist
+damit automatisch Managertask, Sie können also Sohntasks anmelden:
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+
+#off("b")#
+ --> gib supervisor kommando:
+#on("b")#
+ begin ("Test","WARENHAUS") <RETURN>
+#off("b")#
+
+Statt 'Test' können Sie der Sohntask natürlich auch einen beliebigen anderen Namen
+geben. Wenn Sie einen Direktstart eingerichtet haben, erscheint nun sofort das
+#on("b")#gs-DIALOG#off("b")#-Emblem.
+
+ +------------------------+
+ | gs-DIALOG |
+ +---------------------------+ |
+ | Version 1.1 | |
+ +-----------------------------+ | |
+ | (C) 1987/88 Eva Latta Weber | | |
+ +-------------------------------+ | |-----+
+ | (C) 1988 ERGOS GmbH | | |
+ | | |---+
+ +------------------------------+ | |
+ | gggggggg ssssssss | |-------+
+ | ggg sss sss | |
+ | ggg sss | --------+
+ | ggg gggg ssssssss |
+ | ggg ggg sss |
+ | ggg ggg sss |
+ | gggggggggg sssssssss |
+ +------------------------------+
+
+ W A R E N H A U S
+
+ Filiale 1
+#off("b")#
+Andernfalls erscheint
+
+#on("b")#
+ gib kommando:
+#off("b")#
+
+Mit dem Kommando
+
+ #on("b")#warenhaus <RETURN>#off("b")#
+
+starten Sie #on("b")#gs-Warenhaus#off("b")# und erhalten zunächst ebenfalls das obige Emblem auf
+dem Bildschirm. Links unten sehen Sie, unter welcher Filialnummer diese Task nun
+von #on("b")#gs-Warenhaus#off("b")# geführt wird. Diese Nummer ist identisch mit der Kanalnummer,
+unter der das EUMEL-System Ihren Arbeitsplatz verwaltet.
+
+Kurze Zeit später erscheint das WARENHAUS-Eingangsmenu. Wie Sie nun weiter mit
+#on("b")#gs-Warenhaus#off("b")# arbeiten können, erfahren Sie in Kapitel 5.
+
+
+
+#on("b")#3.4  Einrichten mehrerer Hauptstellen#off("b")#
+
+Wir gehen hier davon aus, daß Sie die Installation von #on("b")#gs-Warenhaus#off("b")# gemäß den
+Beschreibungen in Kapitel 3.3 bereits durchgeführt und dabei die Frage 2 ("Soll diese
+Task Warenhaus-Hauptstelle sein (j/n)?") mit 'nein' beantwortet haben. (Falls Sie
+Frage 2 mit 'ja' beantwortet haben und nun den Hauptstellen-Status der Task wieder
+rückgängig machen wollen, so lesen Sie zunächst in Kapitel 7 nach.)
+
+Die Task, in der die Installation stattfand (wir nehmen weiterhin an, daß sie den
+Namen 'WARENHAUS' hat), wurde automatisch zur Managertask, das heißt, daß
+Söhne von ihr eingerichtet werden können. Bevor Sie in diesem Fall das Programm
+nutzen können, müssen Sie nun noch mindestens eine Sohntask zur Hauptstelle
+machen. Gehen Sie dabei folgendermaßen vor:
+
+#on("b")#
+ <SV> (Supervisor - Taste)
+
+#off("b")#
+ --> gib supervisor kommando:
+#on("b")#
+ begin ("Hauptstelle A","WARENHAUS") <RETURN>
+#off("b")#
+
+ --> gib kommando:
+
+
+Mit dem Kommando
+
+#center##on("b")#warenhaus hauptstelle (TRUE) <RETURN>#off("b")#
+
+wird die Task 'Hauptstelle A' zur Warenhaus-Hauptstelle.
+
+Zu beantworten sind dabei eine oder zwei Fragen; es sind dieselben, die auftauchen,
+wenn bei der Abfrage 'Soll diese Task Warenhaus-Hauptstelle sein (j/n)?' ein <j>
+getippt wird. Lesen Sie deshalb nun weiter in Kapitel 3.3 bei der Frage 3: 'Mit Direkt­
+start (j/n)?'.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/warenhaus/gs-Warenhaus-4 b/doc/warenhaus/gs-Warenhaus-4
new file mode 100644
index 0000000..2c5d7dc
--- /dev/null
+++ b/doc/warenhaus/gs-Warenhaus-4
@@ -0,0 +1,378 @@
+limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (11)#
+#headodd#
+#center#gs-Warenhaus#right#%
+
+#end#
+#headeven#
+%#center#gs-Warenhaus
+
+#end#
+#center#1
+
+#center# #on("b")#4  Anschluß eines Codekartenlesers#off("b")#
+
+
+Ein 'echter' Scanner oder Barcodeleser ist als automatisches Lesegerät für den Ein­
+satz im Unterricht nicht geeignet und kann unter EUMEL/ELAN unseres Wissens nach
+auch nicht angesteuert werden. #on("b")#gs-Warenhaus#off("b")# benutzt stattdessen (ebenso wie die
+Soester Software) den von der Firma AKTRONIC vertriebenen Codekartenleser für
+einfache 8-Bit-Lochkarten (siehe Anhang).
+
+Die Verwendung eines Codekartenlesers ist für die Bedienung des Programms zwar
+nicht unbedingt notwendig, bietet jedoch beim Einsatz von #on("b")#gs-Warenhaus#off("b")# im Unter­
+richt neben den didaktischen Hintergründen (Modell für Scanner-Kasse) auch noch
+mancherlei Vorteile bezüglich des "Datenschutzes" (Änderungen an Kunden- oder
+Artikeldaten sowie Zugriffe auf Auskunftsfunktionen nur mit entsprechender Code­
+karte möglich), so daß sein Anschluß sehr empfohlen werden muß.
+
+Allerdings ist solch ein Gerät nur mittels eines (relativ teuren) Interface-Systems
+anschließbar, dessen Anschaffung sich nur lohnt, wenn das System auch sonst noch
+zum Messen, Steuern, Regeln (= "Prozeßdatenverarbeitung", "PDV") im Unterricht
+genutzt wird. (#on("b")#ERGOS#off("b")# bietet mit #on("b")#"gs-Prozess"#off("b")# auch ein Programmpaket zur PDV
+unter EUMEL/ELAN an!)
+
+
+
+#on("b")#4.1  Hardware-Voraussetzungen#off("b")#
+
+Der Codekartenleser wird an einen Steckplatz des Interface-Systems MODUL-BUS der
+Firma AKTRONIC angeschlossen, wobei ein Einzel- oder Mehrfachsteckplatz mit
+Kombi- oder E/A-Karte oder eine Compact-Box benutzt werden können.
+
+Da Eingaben von externen Geräten unter EUMEL in der Regel nur über eine serielle
+Schnittstelle möglich sind, benötigt man neben dem Kartenleser und dem MODUL-
+#page#
+BUS-Steckplatz noch einen 'Adapter', der die parallelen Signale des MODUL-BUS-
+Systems in serielle Signale wandelt, die der Computer über eine serielle Schnittstelle
+(auch RS232- oder V24-Schnittstelle genannt) empfangen kann. Für erfahrene
+Elektronik-Bastler ist das Erstellen solch eines Adapters sicher eine lösbare Aufgabe,
+unter den fix und fertig kaufbaren Geräten haben wir allerdings nur zwei geeignete
+gefunden: das 'Multifunktionale Interface' (kurz: MUFI) der Firma BICOS und den
+'RS232-Adapter für das MODUL-BUS-System' der Firma AKTRONIC. Diese beiden
+Geräte werden auch von #on("b")#gs-Warenhaus#off("b")# unterstützt.
+
+Die erforderliche Hardware-Konstellation stellt sich im Überblick also folgender­
+maßen dar:
+
+#on("b")#
+ Computer <----> Adapter <----> Interface <----> Kartenleser
+
+ (mit se- ('MUFI' ('MODUL-
+ rieller oder BUS'-
+ Schnitt- 'AKTRONIC- Steck-
+ stelle) Adapter') platz)
+#off("b")#
+
+
+#on("b")#4.2  Verwendung des MUFI#off("b")#
+
+Das MUFI ist speziell für die Arbeit in einem Mehrplatz-System entwickelt worden. Es
+benötigt keine zusätzliche serielle Schnittstelle am Rechner, sondern kann einfach
+zwischen Rechner und Terminal 'in den Terminalkanal gesteckt' werden, sodaß man
+von diesem Terminal aus optimal auf das Interface-System zugreifen kann. Im Ideal­
+fall sollte jeder Arbeitsplatz mit der oben genannten Hardware ausgestattet sein, was
+aber momentan sicher nicht für jede Schule finanzierbar ist. Haben Sie zunächst nur
+ein (oder wenige) MUFI(s) zur Verfügung und möchten von verschiedenen Terminals
+(abwechselnd) auf ein Interface-System zugreifen oder verfügen Sie gar nicht über
+ein Terminal, sondern nur über einen Monitor (z.B. bei IBM-Kompatiblen), so
+können Sie das MUFI auch 'als Endgerät' an einer separaten seriellen Schnittstelle
+nutzen.
+#page#
+Für den Betrieb in einem Terminalkanal sollte das MUFI über eine sog. "Schnitt­
+stellen-Automatik" verfügen, die verhindert, daß das MUFI in ausgeschaltetem
+Zustand oder mit abgezogenem Netzstecker den Datenfluß vom Rechner zum
+Terminal unterbricht. Diese sehr sinnvolle Automatik wird von BICOS #on("b")#nicht#off("b")#
+standardmäßig eingebaut. Sie sollten bei eventuellen Bestellungen darauf achten.
+
+
+#on("b")#4.2.1  Einstellungen am MUFI#off("b")#
+
+Gleichgültig ob Sie das MUFI 'im Terminalkanal' oder 'als Endgerät' benutzen,
+müssen Sie zunächst am MUFI einige Einstellungen per DIP-Schalter im Inneren des
+MUFI vornehmen. Ziehen Sie dazu aber auf alle Fälle den Stecker aus der Steckdose!
+Lösen Sie dann die 4 Schrauben an der Unterseite des Gehäuses, heben das Oberteil
+vorsichtig ab und legen es neben das Unterteil, sodaß die Kabelverbindungen
+zwischen Unter- und Oberteil nicht belastet werden.
+
+ +---------------------------------------------------+
+ | +-------+ +------------+ |
+ | | | | | +---------+ |
+ | +-------+ | | | DIP- | |
+ | +-------+ | | | Schalter| |
+Rück- | | | | | +---------+ | Vorder-
+seite | +-------+ | | +--------------+ | seite
+ | +-------+ | SCN68000 | | | |
+ | | | | | +--------------+ |
+ | +-------+ | | |
+ | +-------+ | | |
+ | | | | | |
+ | +-------+ +------------+ |
+ +---------------------------------------------------+
+
+
+
+#center#Abb.1: MUFI geöffnet
+#page#
+Die kleine Plastikbox mit den DIP-Schaltern trägt die folgende Aufschrift:
+
+#center##on("b")#O N  
+#center#1 2 3 4#off("b")#
+
+Heben Sie den Deckel mit Hilfe eines kleinen Schraubendrehers o.ä. an der rechten
+Seite leicht an und klappen Sie ihn nach links um. Sie können nun die 4 DIP-
+Schalter sehen.
+
+ +---------------------------------------+
+ | +-----+ +-----+ +-----+ +-----+ |
+ | |+++++| | | | | | | |
+ | |+++++| | | | | | | | ON
+ | |+++++| | | | | | | |
+ | |+++++| | | | | | | |
+ | | | | | | | | | |
+ | | | | | | | | | |
+ | | | | | | | | | |
+ | | | |+++++| |+++++| |+++++| |
+ | | | |+++++| |+++++| |+++++| |
+ | | | |+++++| |+++++| |+++++| | OFF
+ | | | |+++++| |+++++| |+++++| |
+ | +-----+ +-----+ +-----+ +-----+ |
+ +---------------------------------------+
+
+ 1 2 3 4
+
+#center#Abb.2: Mögliche DIP-Schalter-Stellung beim MUFI
+
+ Dabei haben die DIP-Schalter folgende Bedeutung:
+
+ 1 ON : Modulbusbetrieb
+ OFF : Parallelportbetrieb
+ 2 ON : RTS/CTS-Hardware-Handshake
+ OFF : XON/XOFF-Protokoll
+ 3 ON : 9600 Baud
+ OFF : 19200 Baud
+ 4 ON : Even Parity
+ OFF : No Parity
+
+In jedem Fall muß der DIP-Schalter 1 in Stellung #on("b")#ON#off("b")# gebracht werden.
+#page#
+Wenn Sie das MUFI im Terminalkanal betreiben wollen, müssen Sie die anderen
+Einstellungen so vornehmen, daß sie zu der Konfiguration des Terminals passen (vgl.
+auch Kapitel 4.4). Beträgt die Übertragungsrate 19200 Baud, so sollten Sie unbedingt
+mit dem XON/XOFF-Protokoll arbeiten - es sei denn, das Terminal unterstützt
+RTS/CTS! Wenn Sie das MUFI an einer separaten seriellen Schnittstelle als Endgerät
+betreiben wollen, #on("b")#muß#off("b")# der Datenaustausch mit dem RTS/CTS-Protokoll abgewickelt
+werden (Schalter 2 auf 'ON'!). Vergewissern Sie sich, daß Ihr Schnittstellen-Kabel
+auch darauf ausgelegt ist! Nach dieser Einstellung der DIP-Schalter ist das MUFI
+betriebsbereit. Fügen Sie die beiden Gehäuseteile wieder zusammen und ver­
+schrauben Sie sie wieder.
+
+
+#on("b")#4.2.2  MUFI im Terminalkanal#off("b")#
+
+Um das MUFI in den Terminalkanal einbauen zu können, müssen Sie zunächst am
+Terminal die Zuleitung vom Rechner lösen. Auf der Rückseite des MUFIs befinden
+sich zwei Stecker, die mit V24/1 und V24/2 bezeichnet sind. Stecken Sie an Stecker
+V24/2 das Kabel, das ursprünglich vom Computer zum Terminal führte. Sie
+benötigen jetzt noch ein weiteres (kurzes) V24-Kabel, um das MUFI mit dem
+Terminal zu verbinden. Dieses wird einerseits auf Stecker V24/1 am MUFI gesteckt
+und andererseits auf den Stecker am Terminal, von dem Sie das ursprüngliche Kabel
+zwischen Rechner und Terminal abgezogen haben.
+
+ +--------------------------+
+ | +----------------------+ |
+ | | V24/1 V24/2 | |
+ | | | | | |
+ | +----|-----------|-----+ |
+ +------|-----------|-------+
+ | |
+ | |
+ ZUM <-----+ +-----> ZUM
+ TERMINAL COMPUTER
+
+
+#center#Abb.3: Einbau des MUFIs in den Terminalkanal
+#page#
+Die Verschaltung der V24-Kabel ist in der Bedienungsanleitung zum MUFI erläutert,
+ggf. können Sie entsprechende Kabel von der Firma BICOS beziehen.
+
+Wenn alle Kabelverbindungen gesteckt sind, sollten Sie auf alle Fälle erst einmal #on("b")#bei
+ausgeschaltetem MUFI#off("b")# prüfen, ob das Terminal sich noch bedienen läßt. Wenn dieses
+keine Reaktion mehr zeigt, obwohl es vorher (ohne MUFI) reibungslos funktioniert
+hat, dann haben Sie entweder ein MUFI ohne "Schnittstellen-Automatik" vor sich
+(vgl. Kapitel 4.2, Seite 15), oder an den Kabelverbindungen stimmt irgendetwas nicht.
+In diesem Fall sollten Sie noch einmal alle Anschlüsse und evtl. auch die interne
+Verschaltung der Kabel überprüfen.
+
+Schalten Sie dann das MUFI ein. Bei ebenfalls eingeschaltetem Terminal können nun
+einige Zeichen auf dem Bildschirm erscheinen, dieser Effekt ist normal. Funktioniert
+Ihr Terminal bei eingeschaltetem MUFI reibungslos, so sind alle Einstellungen richtig
+und Sie brauchen erst bei Kapitel 4.5 weiterzulesen. Andernfalls studieren Sie Kapitel
+4.4 unter Beachtung von Kapitel 4.2.1!
+
+
+#on("b")#4.2.3  MUFI als Endgerät#off("b")#
+
+Wenn Sie das MUFI als Endgerät an einer separaten seriellen Schnittstelle betreiben
+wollen, dann stecken Sie das vom Computer kommende Kabel auf den mit V24/2
+bezeichneten Stecker des MUFI.
+
+Damit ein einwandfreier Betrieb gewährleistet ist, sollten Sie einen sog. 'Kurzschluß­
+stecker' auf den dann freien Stecker V24/1 des MUFIs stecken. Haben Sie einen
+solchen nicht zur Hand, können Sie auch zwei provisorische Drahtbrücken einsetzen:
+Verbinden Sie mit zwei kleinen Drähten einmal Pin (Öffnung) 2 mit Pin 3 und
+außerdem Pin 4 mit Pin 5.
+
+Die Anpassung 'gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät' unterstützt
+standardmäßig nur den Betrieb von #on("b")#einem#off("b")# MUFI als Endgerät. Wie Sie vorgehen
+müssen, wenn Sie mehrere MUFIs in dieser Betriebsart benutzen wollen, erfahren Sie
+in Kapitel 7.
+#page#
+#on("b")#4.3  Verwendung des AKTRONIC-Adapters#off("b")#
+
+Im Gegensatz zum MUFI ist der AKTRONIC-Adapter #on("b")#nicht#off("b")# für den Einbau in einen
+Terminalkanal geeignet, sondern kann nur als Endgerät an einer separaten seriellen
+Schnittstelle betrieben werden. Bevor Sie den Adapter an eine serielle Schnittstelle an­
+schließen, sollten Sie noch die eingestellte Baud-Rate überprüfen und gegebenenfalls
+neu einstellen.
+
+Öffnen Sie dazu das Gehäuse des Adapters, indem Sie die vier Schrauben an der
+Unterseite lösen. Drehen Sie den Adapter so vor sich, daß die 25-polige D-Sub­
+miniaturbuchse von Ihnen weg zeigt. Vorn rechts sind dann zwei parallele 8-polige
+Pfostensteckerleisten sichtbar.
+
+#center#25-pol. D-Subminiatur-Stecker
+
+ +---------------+
+ | |
+ +---+ +---+
+ | +------+ |
+ | | | |
+ | | | |
+ | | | |
+ | | | |
+ | +------+ |
+ | +------+ |
+ | | | +-------+ |
+ | +------+ | | |
+ | +------+ +-------+ |
+ | | | +-------+ |
+ | +------+ | <-|---------Jumperleiste
+ | +-------+ |
+ +---+ +---+
+ | Baudrate |
+ +---------------+
+
+
+#center#Abb.4: AKTRONIC-Adapter geöffmet
+#page#
+Auf einem Pfostensteckerpaar steckt ein 'Jumper', der gegebenenfalls (passend zu
+der Schnittstellen-Konfiguration im Computer, vgl. Kapitel 4.4) umgesteckt werden
+muß.
+
+ +---------+
+ | ζ ζ | 300
+ | ζ ζ | 600
+ | ζ ζ | 1200
+ | ζ ζ | 2400
+ | ζ ζ | 4800
+ | ζ ζ | 9600
+ Jumper > | ζ ζ | 19200
+ | ζ ζ | 38400
+ +---------+
+ Baudrate
+
+
+#center#Abb.5: Mögliche Jumperposition beim AKTRONIC-Adapter
+
+
+Am Adapter ist ein Kabel mit 25-poligem D-Subminiaturstecker bereits fest montiert.
+Sollte der Stecker nicht an Ihren Rechner passen, so müßten Sie ein entsprechendes
+Adapterkabel basteln oder kaufen.
+
+Die Anpassung 'gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter' unterstützt
+standardmäßig nur den Betrieb von #on("b")#einem#off("b")# Adapter. Wie Sie vorgehen müssen, wenn
+Sie mehrere dieser Adapter benutzen wollen, erfahren Sie in Kapitel 7.
+
+
+#on("b")#4.4  Konfiguration der seriellen Schnittstelle#off("b")#
+
+Sie müssen nun noch dafür Sorge tragen, daß die Einstellungen am MUFI bzw. am
+AKTRONIC-Adapter mit den Einstellungen im Computer übereinstimmen.
+#page#
+Koppeln Sie dazu die Task 'configurator' an Ihr Terminal an (mit 'continue
+("configurator") <RETURN>') und geben Sie dann das Kommando 'configurate
+<RETURN>'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt,
+ob Sie eine Konfiguration vornehmen wollen. Bei den "interessanten" Kanälen ant­
+worten Sie mit 'ja' (<j>). Wollen Sie sich nur die aktuelle Konfiguration ansehen, so
+beantworten Sie alle weiterhin gestellten Fragen zu diesem Kanal mit 'ja' (<j>),
+dann bleibt die aktuelle Einstellung erhalten. (Der Konfigurationsdialog ist im
+EUMEL-Systemhandbuch auf den Seiten 6 - 8 detailliert beschrieben.)
+
+Benutzen Sie ein MUFI, so müssen auf alle Fälle #on("b")#8 Datenbits#off("b")# und #on("b")#1 Stopbit#off("b")# einge­
+stellt sein und außerdem je nach DIP-Schalter-Stellung im MUFI (vgl. Kapitel 4.2.1)
+9600 oder 19200 Baud sowie 'no parity' oder 'even parity'.
+
+Benutzen Sie das MUFI im Terminalkanal, so müssen Sie bei einer eventuellen
+Änderung der Konfiguration an diesen Stellen auch das entsprechende Terminal auf
+diese Werte einstellen!
+
+Bei der Verwendung des MUFIs als Endgerät muß der Kanal, an den das MUFI ange­
+schlossen wird, darüberhinaus unbedingt auf die Betriebsarten
+
+#center#transparent und RTS/CTS-Protokoll
+
+eingestellt werden.
+
+Verwenden Sie einen AKTRONIC-Adapter, so müssen für den entsprechenden Kanal
+folgende Konfigurationsmerkmale eingestellt werden:
+
+#center#transparent, 8 Bit, 2 Stopbit, #on("b")#kein#off("b")# Protokoll
+
+Die Baud-Rate ist gemäß der Jumper-Position im Adapter (vgl. Kapitel 4.3) einzu­
+stellen.
+
+
+
+#on("b")#4.5  Verbindung der Hardware-Komponenten#off("b")#
+
+Der Anschluß des Kartenlesers an den MODUL-BUS-Steckplatz ist denkbar einfach:
+Stecken Sie den 8-poligen Platinenstecker des Codekartenlesers in die Buchse des
+Digital-Einganges der Steckkarte bzw. Compact-Box und den 3-poligen Platinen­
+stecker in die passende Spannungsversorgungsbuchse (12 V) am Steckplatz bzw. auf
+der Compact-Box, fertig. Bei eingeschalteter Betriebsspannung muß nun der Code­
+kartenleser beleuchtet sein. (Falls Sie einen Mehrfachsteckplatz benutzen, benötigen
+Sie ein passendes Netzteil für diesen Steckplatz! Achten Sie auch darauf, daß in
+diesem Fall die Kombi- oder E/A-Karte in Steckplatz (Slot) 1 installiert ist.)
+
+Nun müssen Sie noch die Verbindung zu dem verwendeten Adapter herstellen. Dabei
+ist es gleichgültig, ob Sie eine Compact-Box, einen Einzel- oder einen Mehrfachsteck­
+platz benutzen, denn alle diese Geräte verfügen über ein Anschlußkabel mit dem
+gleichen 25-poligen Stecker.
+
+Den AKTRONIC-Adapter können Sie damit direkt an den Steckplatz anschließen,
+denn er verfügt bereits über eine entsprechende 25-polige Buchse. Hier müssen Sie
+dann nur noch die Stromversorgung des Adapters sichern, indem Sie das Kabel mit
+dem 3-poligen Platinenstecker in die passende Spannungsversorgungsbuchse (12 V)
+am Steckplatz oder auf der Compact-Box stecken. (Damit Codekartenleser und
+Adapter hier gleichzeitig versorgt werden können, ist in den Stecker eine Verzweigung
+eingebaut.)
+
+Für das MUFI benötigen Sie ein weiteres Kabel, das an einem Ende einen 36-poligen
+Centronics-Stecker besitzt und an dem anderen einen 25-poligen D-Subminiatur­
+stecker (von der Firma BICOS zu beziehen).
+
+Zum Ausprobieren des Kartenlesers benutzen Sie am besten die Menupunkte
+'Dezimalwert lesen' und 'Bitmuster lesen' unter dem Oberbegriff 'Kommandos' des
+Warenhaus-Menus. Eine Beschreibung dieser Punkte finden Sie in Kapitel 5.4.
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/warenhaus/gs-Warenhaus-5 b/doc/warenhaus/gs-Warenhaus-5
new file mode 100644
index 0000000..c1164ad
--- /dev/null
+++ b/doc/warenhaus/gs-Warenhaus-5
@@ -0,0 +1,1468 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (20)#
+#headodd#
+#center#gs-Warenhaus#right#%
+
+#end#
+#headeven#
+%#center#gs-Warenhaus
+
+#end#
+#center#1
+
+#center##on("b")#5  Beschreibung der Menufunktionen#off("b")#
+
+
+Nach Aufruf meldet sich #on("b")#gs-Warenhaus#off("b")# zunächst mit dem #on("b")#gs-DIALOG#off("b")#-Emblem
+(vgl. Kapitel 3.3). Kurze Zeit später erscheint das WARENHAUS-Eingangsmenu auf
+dem Bildschirm:
+
+ +------------------------------------------------------------------------+
+ | WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv|
+ |------------------------------------------------------------------------|
+ | | b  Befehlsvorrat | |
+ | | ------------------ | |
+ | | a  Artikeldaten | |
+ | | k  Kundendaten | |
+ | +--------------------+ |
+ | |
+ | |
+ | |
+ |------------------------------------------------------------------------+
+ | |
+ | Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
+ +------------------------------------------------------------------------+
+
+#off("b")#
+
+
+Bevor wir Ihnen die Bedeutung der einzelnen Menu-Punkte erklären, geben wir erst
+noch einige grundsätzliche Hinweise zur Bedienung des Menus für diejenigen Leser,
+die im Umgang mit Menus unter #on("b")#gs-DIALOG#off("b")# nicht geübt sind.
+
+
+
+#on("b")#5.1  Kurzhinweise zur Bedienung des Menus#off("b")#
+
+Die Bedienung des Menus ist sehr einfach. Eine ausführliche Beschreibung dazu
+finden Sie in den Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle
+sollen nur die wesentlichen Bedienungsvorgänge beschrieben werden.
+#page#
+- Mit der Tastenfolge <ESC><?> können Sie sich Informationen zur Bedienung
+ des Menusystems in das Menu einblenden lassen
+
+- Mit den Pfeiltasten <rechts> und <links> können Sie zwischen den "Ober­
+ begriffen" in der Kopfzeile wählen. Der aktuelle Oberbegriff ist jeweils invers
+ dargestellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich auf diesen invers
+ dargestellten Oberbegriff.
+
+- Mit den Pfeiltasten <hoch> und <runter> können Sie zwischen den Menu­
+ funktionen wählen, die Ihnen im aktuellen Pull-Down-Menu zur Auswahl ange­
+ boten werden. Die aktuell angewählte Menufunktion wird jeweils invers darge­
+ stellt. Die Trennlinien, die in einigen Pull-Down-Menus sichtbar sind, dienen nur
+ der optischen Untergliederung; sie können nicht angewählt werden und werden
+ deshalb automatisch übersprungen. Die einzelnen Menupunkte sind "zyklisch
+ miteinander verknüpft", das heißt, man gelangt vom untersten Menupunkt
+ wieder zum obersten und umgekehrt. Menupunkte, vor denen ein Minuszeichen
+ steht ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können nicht angewählt
+ werden und werden einfach übersprungen.
+
+- Durch Tippen der Fragezeichentaste (<?>) können Sie sich jeweils zur
+ aktuellen Menufunktion (invers im Pull-Down-Menu) Informationen in das Menu
+ einblenden lassen.
+
+- Um eine Menufunktion ausführen zu lassen, bewegen Sie sich mit den Pfeiltasten
+ auf die gewünschte Menufunktion im aktuellen Pull-Down-Menu und tippen
+ dann die <RETURN>-Taste. Steht vor dem gewünschten Menupunkt ein
+ einzelner Buchstabe oder eine Ziffer, so kann durch Tippen der entsprechenden
+ Taste diese Menufunktion dadurch direkt aufgerufen werden. Sobald eine Menu­
+ funktion aufgerufen worden ist, erscheint davor ein Stern ('*'). Daraus können
+ Sie entnehmen, daß das System bereits den Auftrag ausführt.
+
+- An verschiedenen Stellen werden Fragen an Sie gerichtet, die Sie mit 'ja' oder
+ 'nein' beantworten müssen. Tippen Sie dazu entsprechend der Entscheidung die
+ Taste <j> (für 'ja') bzw. <n> (für 'nein').
+
+- Werden Ihnen vom Menu aus Dateinamen zur Auswahl angeboten, so können Sie
+ den auf dem Bildschirm sichtbaren Pfeil vor den gewünschten Namen
+#page#
+ positionieren. Mit den Tasten <x> oder <RETURN> können Sie den Namen
+ ankreuzen. Ist die Auswahl mehrerer Dateinamen möglich, so können Sie den
+ Vorgang wiederholen. Mit den Tasten <o> oder <RUBOUT> können Sie auch
+ ein Kreuz vor einem Namen wieder löschen. Daneben gibt es noch einige Tasten­
+ funktionen, die für die Bedienung recht hilfreich sein können. Tippen Sie
+ während der Auswahl die Fragezeichentaste (<?>), so werden Ihnen alle
+ Bedienungsmöglichkeiten auf dem Bildschirm angezeigt. Eine Auswahl, in der
+ mehrere Dateien angekreuzt werden dürfen, wird durch die Tastenfolge
+ <ESC><q> verlassen. Anschließend wird die eingestellte Operation mit den
+ angekreuzten Dateien ausgeführt. Sind Sie versehentlich in eine solche Auswahl
+ gelangt, so können Sie den Vorgang durch die Tastenkombination <ESC><h>
+ abbrechen.
+
+- An einigen Stellen werden Sie aufgefordert, eine Eingabe zu machen (z.B. einen
+ Dateinamen einzugeben). Wird Ihnen hier ein Vorschlag gemacht, den Sie
+ akzeptieren, so brauchen Sie zur Bestätigung nur die <RETURN>-Taste zu
+ tippen. Gefällt Ihnen der Vorschlag nicht oder wird Ihnen kein Vorschlag
+ gemacht, so machen Sie bitte die gewünschte Eingabe. Zum Schreiben stehen
+ Ihnen alle aus dem Editor bekannten Funktionen zur Verfügung. Mit der Taste
+ <RUBOUT> können Sie Buchstaben löschen, mit <RUBIN> einfügen. Die
+ Eingabe wird durch Tippen der <RETURN>-Taste abgeschlossen. Ist der von
+ Ihnen gewünschte Name schon in Ihrer Task vorhanden und steht in der Fußzeile
+ der Hinweis 'Zeigen: <ESC><z>', dann können Sie sich auch alle vor­
+ handenen Namen zur Auswahl anbieten lassen und durch Ankreuzen den beab­
+ sichtigten Namen auswählen.
+
+- Ihnen können auch mehrere Alternativen angeboten werden, zwischen denen Sie
+ wählen müssen. In der untersten Zeile eines solchen Kastens, in denen Ihnen die
+ Alternativen auf dem Bildschirm eingeblendet werden, sind die Möglichkeiten
+ aufgeführt, die darüber beschrieben sind. Mit den Pfeiltasten können sie die
+ Markierung auf die gewünschte Alternative positionieren und dann durch die
+ <RETURN>-Taste zur Ausführung bringen. (Manchmal ist das auch durch
+ Tippen der den Alternativen vorangestellten Buchstaben oder Ziffern möglich).
+#page#
+- Durch die Tastenfolge <ESC><q> kann das Menu insgesamt verlassen
+ werden. Damit das nicht versehentlich geschieht, wird jeweils die Frage gestellt,
+ ob Sie das Menu tatsächlich verlassen wollen. Diese Frage beantworten Sie bitte je
+ nach Wunsch mit 'ja' oder 'nein' durch Tippen der Tasten <j> bzw. <n>.
+
+
+#on("b")#5.2  Menufunktionen zum Oberbegriff 'Info'#off("b")#
+
+Das auf dem Bildschirm sichtbare Pull-Down-Menu ist bereits oben abgebildet.
+
+#on("b")#b Befehlsvorrat#off("b")#
+
+ Mit dieser Funktion können Sie sich die Befehle, die Ihnen von der jeweils
+ eingestellten Programmierumgebung zur Verfügung gestellt werden, auf dem
+ Bildschirm anzeigen lassen. Anhand dieser Informationen können Sie auch
+ feststellen, ob in dem System, das Ihnen zur Verfügung steht, die 'GRIN-
+ Version' oder die 'ELAN-Version' eingestellt ist.
+
+ Je nach Version gelangen Sie zunächst in eines der folgenden beiden Auswahl­
+ menus:
+#on("b")#
+ GRIN-Version:
+
+
+ +-------------------------------------------------+
+ | d   Datei - Bearbeitung |
+ | e   Einkaufen und Auskunft |
+ | k   Kontroll - Strukturen |
+ | |
+ | z   Zurück zum Hauptmenü |
+ | |
+ | Datei   Kaufen/Auskunft   Kontroll   Zurück |
+ | |
+ +-------------------------------------------------+
+#off("b")#
+#page#
+#on("b")#
+ ELAN-Version:
+
+ +-------------------------------------------------+
+ | d   Datei - Bearbeitung |
+ | e   Einkaufen und Auskunft |
+ | s   Sonstige Befehle |
+ | |
+ | z   Zurück zum Hauptmenü |
+ | |
+ | Datei   Kaufen/Auskunft   Sonstige   Zurück |
+ | |
+ +-------------------------------------------------+
+
+#off("b")#
+
+ Von hier aus können Sie zu jedem dort angegebenen Bereich eine Informa­
+ tionstafel abrufen.
+
+ Aus jeder dieser Tafeln gelangen Sie wieder in die Auswahl zurück. Verlassen
+ Sie die Auswahl selbst, gelangen Sie zurück ins Ausgangsmenu.
+
+
+#on("b")#a Artikeldaten#off("b")#
+
+ Bei Aktivierung dieses Menupunktes erhalten Sie eine Kurzinformation über
+ Aufbau und Umfang der Artikeldaten:
+#on("b")#
+ +-------------------------------------------------------+
+ | Ein Satz 'Artikeldaten' besteht aus: |
+ | |
+ | Artikelname |
+ | Preis |
+ | Mindestbestand |
+ | Bestand |
+ | |
+ | Es können Daten für maximal 15 Artikel gespeichert |
+ | werden. Die zugehörigen Artikelnummern sind 1...15. |
+ | |
+ +-------------------------------------------------------+
+
+
+#off("b")#
+
+ In allen Filialen müssen zu einer Artikelnummer stets der Artikelname und
+ Preis identisch sein, Bestand und Mindestbestand können beliebig gewählt
+ werden. Artikeldateien werden nur in den jeweiligen Filialen gehalten und
+ nicht in der Zentrale.
+#page#
+ Gegenüber der Soester Warenhaus-Version sind Artikeldaten um den Punkt
+ 'Mindestbestand' erweitert worden, weil sich damit unserer Meinung nach eine
+ realistischere Nachbestellung realisieren läßt (vgl. auch Kapitel 5.4, 'Nachbe­
+ stellen').
+
+ Sollte Ihnen der Umfang des Warensortiments mit maximal 15 verschiedenen
+ Artikeln sehr gering vorkommen, so denken Sie bitte daran, daß die Artikel­
+ daten an jedem Arbeitsplatz erst einmal eingegeben werden müssen, was bei
+ Computer-Anfängern recht lange dauert. Außerdem kommt es nur bei einem
+ genügend kleinen Sortiment zu den methodisch-didaktisch erwünschten
+ Einkaufshäufungen bei bestimmten Produkten.
+
+
+#on("b")#k Kundendaten#off("b")#
+
+ Bei Aktivierung dieses Menupunktes erhalten Sie eine Kurzinformation über
+ Aufbau und Umfang der Kundendaten:
+#on("b")#
+ +----------------------------------------------------------+
+ | Nachname |
+ | Vorname |
+ | Geschlecht |
+ | |
+ | Es können Daten für maxomal 31 Kunden gespeichert |
+ | werden. Die zugehörigen Kundennummern sind 129...159. |
+ | |
+ +----------------------------------------------------------+
+#off("b")#
+
+ Die Zuordnung Kundennummer ---> Kunde muß in allen Filialen gleich sein.
+ Kundendateien werden von jeder Filiale und von der Zentrale geführt.
+
+ Gegenüber der Soester Warenhaus-Version sind Kundendaten um die Punkte
+ 'Nachname' und 'Geschlecht' erweitert worden, um dem Begriff Kunden#on("b")#daten#off("b")#
+ etwas gerechter zu werden. Die maximale Kundenanzahl von 31 entspricht
+ etwa der Größe einer Klasse.
+#page#
+#on("b")#5.3  Menufunktionen zum Oberbegriff 'Eingabeart'#off("b")#
+
+Die Funktionen unter diesem Oberbegriff sind nur dann für Sie interessant, wenn Sie
+einen Codekartenleser verwenden.
+#on("b")#
++-------------------------------------------------------------------------+
+| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
+|-------------+-----------------+-----------------------------------------|
+| | *  Anzeigen | |
+| | --------------- | |
+| | k  Kartenleser | |
+| | t  Tastatur | |
+| +-----------------+ |
+| |
+| |
+| +------------------------+ |
+| | Die Eingabeart ist auf | |
+| | | |
+| | Tastatur | |
+| | | |
+| | eingestellt | |
+| +------------------------+ |
+|-------------------------------------------------------------------------|
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
++-------------------------------------------------------------------------+
+#off("b")#
+
+#on("b")#a Anzeigen#off("b")#
+
+ Es wird die momentan eingestellte Eingabeart angezeigt. Möglich sind die
+ Eingabearten #on("b")#Tastatur#off("b")# und #on("b")#Kartenleser#off("b")#. Die Standardeinstellung ist
+ 'Tastatur'!
+
+
+#on("b")#k Kartenleser#off("b")#
+
+ Die Eingabeart 'Kartenleser' wird eingestellt. Alle Artikelnummern, Kunden­
+ nummern und sonstige Codenummern (für Auskünfte) können danach nur
+ über den Kartenleser eingegeben werden.
+#page#
+ Diese Eingabeart kann nur eingestellt werden, wenn ein Kartenleser mit
+ funktionstüchtigem Interface angeschlossen ist. Sonst erfolgt eine ent­
+ sprechende Fehlermeldung.
+
+ Fehlerfälle:
+
+ - Kein Interface vorhanden!
+ Ursache: Bei der Installation von #on("b")#gs-Warenhaus#off("b")# wurde angegeben, daß
+ kein Kartenleser benutzt werden soll.
+
+ - Interface meldet sich nicht!
+ Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen und
+ eingeschaltet ist (vgl. Kapitel 4). Notfalls Eingabeart auf
+ 'Tastatur' schalten; wenn ein MUFI verwendet wird, MUFI aus-
+ und nach kleiner Pause wieder einschalten; noch einmal die
+ Eingabe 'Kartenleser' anwählen.
+
+ - TASK für Interface ist besetzt!
+ (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter
+ auftreten.)
+ Abhilfe: Wenn irgendeine andere Task die Eingabeart 'Kartenleser' ein­
+ gestellt hat, dort auf 'Tastatur' umstellen.
+
+ - Interface-Kanal belegt!
+ (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter
+ auftreten.)
+ Abhilfe: Feststellen, welche Task an den Interface-Kanal angekoppelt ist
+ ('taskinfo (2)'), und diese dann abmelden ('break' oder 'end').
+ Die Nummer des Interface-Kanals kann mit dem Befehl 'put
+ (interfacekanal)' erfragt werden.
+
+ - TASK für Interface existiert nicht!
+ (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter
+ auftreten.)
+ Abhilfe: Task löschen; in der Vatertask das Kommando 'init interface­
+ channel' geben; Task neu anmelden.
+#page#
+#on("b")#t Tastatur#off("b")#
+
+ Die Eingabeart 'Tastatur' wird eingestellt. Alle Artikelnummern, Kunden­
+ nummern und sonstige Codenummern (für Auskünfte) können danach nur
+ über die Tastatur eingegeben werden. Ein etwa angeschlossener Codekarten­
+ leser ist bei dieser Einstellung nicht mehr ansprechbar.
+
+
+
+#on("b")#5.4  Menufunktionen zum Oberbegriff 'Kommandos'#off("b")#
+
+Dieses ist das zentrale Menu für den Benutzer von #on("b")#gs-Warenhaus#off("b")#. Unter diesem
+Oberbegriff finden Sie alle Funktionen, die notwendig sind, um die Abläufe innerhalb
+des Modell-Warenhauses zu simulieren. (Die angebotenen Menufunktionen ent­
+sprechen etwa den "Direktbefehlen" der Soester Software.)
+#on("b")#
++-------------------------------------------------------------------------+
+| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
+|---------------------+-------------------------------+-------------------|
+| | w   Warendatei bearbeiten | |
+| | k   Kundendatei bearbeiten | |
+| | -------------------------- | |
+| | e   Einkaufen | |
+| | -------------------------- | |
+| | a   Auskunft einholen | |
+| | n   Nachbestellen | |
+| | -------------------------- | |
+| | -   Dezimalwert lesen | |
+| | -   Bitmuster lesen | |
+| +-------------------------------+ |
+| |
+|-------------------------------------------------------------------------|
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>|
++-------------------------------------------------------------------------+
+#off("b")#
+
+Wird im Unterricht kein Kartenleser benutzt, so sind die eingegeben Daten völlig
+ungeschützt. Vor allem bei der Kundendatei muß sichergestellt werden, daß dort
+#page#
+keine unsinnigen Eintragungen oder Änderungen vorgenommen werden, da alle
+Neueintragungen und Änderungen in dieser Datei auch in der Warenhaus-Zentrale
+wirksam werden und von dort aus auf Anfrage jeder Filiale mitgeteilt werden.
+Korrekturen können dadurch sehr mühsam werden. Natürlich sind ohne Kartenleser
+(und dem damit verbundenen 'Ausweis' Codekarte) auch jederzeit Einkäufe mit jeder
+beliebigen Kundennummer möglich. Auch hier sollten Sie etwaigem Mißbrauch
+vorbeugen.
+
+
+#on("b")#w Warendatei bearbeiten#off("b")#
+
+ Hiermit kann die Warendatei der Filiale aufgebaut und verändert werden. Der
+ Bildschirm sieht dabei wie folgt aus:
+#on("b")#
++------------------------------------------------------------------------+
+|WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
+|-----------------------------------+------------------------------------|
+| | Artikelnummer : 1 |
+| | |
+| | |
+| | Artikelname : Bier (Kasten)|
+| | |
+| | Preis : 16.85 |
+| | |
+| | Mindestbestand : 25 |
+| | |
+| | Bestand : 20 |
+| | |
+| | |
+| | Alles richtig ? |
+| | |
+| | Ja    Nein |
+|-----------------------------------+------------------------------------|
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
++------------------------------------------------------------------------+
+#off("b")#
+
+ Zunächst muß eine Artikelnummer (1...15) eingegeben werden (je nach
+ Einstellung über die Tastatur oder mittels einer Warenkarte über den Code­
+ kartenleser). Unzulässige Artikelnummern werden dabei nicht akzeptiert.
+#page#
+ Ist unter dieser Nummer bereits ein Artikel gespeichert, so werden die ent­
+ sprechenden Artikeldaten in dem rechten oberen Bildschirmfenster gezeigt
+ und können dort geändert oder einfach übernommen werden. Gibt es noch
+ keinen Artikel mit dieser Nummer, so sind neue Artikeldaten einzugeben.
+
+ Dieser Vorgang wird solange wiederholt, bis bei der Eingabe der Artikelnummer
+ die Tastenfolge <ESC><q> gedrückt wird.
+
+ Achten Sie darauf, daß in jeder Filiale der zu einer Artikelnummer gehörige
+ Artikel stets denselben Artikelnamen und -preis erhält. Bestand und Mindest­
+ bestand können unterschiedlich sein.
+
+
+#on("b")#k Kundendatei bearbeiten#off("b")#
+
+ Hiermit kann die Kundendatei der Filiale aufgebaut und verändert werden.
+ Ähnlich wie bei der Funktion 'Warendatei bearbeiten' erfolgen die Eingaben im
+ rechten oberen Bildschirmfenster.
+
+ Zunächst muß eine Kundennummer (129...159) eingegeben werden (je nach
+ Einstellung über die Tastatur oder mittels einer Kundenkarte über den Code­
+ kartenleser). Unzulässige Kundennummern werden dabei nicht akzeptiert.
+
+ Ist unter dieser Nummer bereits ein Kunde in der Filiale oder in der Zentrale
+ gespeichert, so werden die entsprechenden Kundendaten in dem rechten
+ oberen Bildschirmfenster gezeigt und können dort geändert oder einfach über­
+ nommen werden. Gibt es noch keinen Kunden mit dieser Nummer, so sind
+ neue Kundendaten einzugeben. (Neueingaben und Änderungen werden sofort
+ der Zentrale, aber nicht automatisch den andern Filialen mitgeteilt!)
+
+ Dieser Vorgang wird solange wiederholt, bis bei der Eingabe der Kunden­
+ nummer die Tastenfolge <ESC><q> gedrückt wird.
+#page#
+#on("b")#e Einkaufen#off("b")#
+
+ Zunächst wird eine Kundennummer (129...159) erfragt. Wird die Nummer
+ eines Kunden eingegeben, dessen Daten in der Filiale oder Zentrale bereits
+ gespeichert sind, so erscheint im linken Bildschirmfenster der Rechnungskopf
+ mit dem Namen des Kunden. Ist unter der Nummer noch kein Kunde einge­
+ tragen oder wird die Eingabe der Kundennummer durch die Tastenfolge
+ <ESC><q> abgebrochen, so enthält der Rechnungskopf keinen Kunden­
+ namen.
+
+ Das eigentliche Einkaufen erfolgt nun durch die Eingabe von Artikelnummern
+ (1...15). Der zugehörige Artikelname und der Preis werden daraufhin in die
+ Rechnung eingetragen.
+#on("b")#
++------------------------------------------------------------------------+
+|WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
+|----------------------------------+-------------------------------------|
+| RECHNUNG für Herrn B. Pollok | Artikelnummer :  1 |
+| | |
+| Bier (Kasten) 16.85 | |
+| Tageszeitung 0.80 | |
+| Pflaster 2.39 | |
+| Mehl 0.79 | |
+| Seife 1.80 | |
+| Weinbrand 12.75 | |
+| Zigaretten 3.80 | |
+| Brot 2.29 | |
+| Schallplatte 19.90 | |
+| Geodreieck 2.35 |-------------------------------------|
+| Videokassette 12.75 | Artikelnummer eingeben |
+| Schulheft 0.85 | |
+| | Stoptaste:  <ESC><q> |
+|----------------------------------+-------------------------------------|
+| Einkaufen |
++------------------------------------------------------------------------+
+#off("b")# |
+
+ Dieser Vorgang wird solange wiederholt, bis die Eingabe einer Artikelnummer
+ durch Tippen der Tastenfolge <ESC><q> abgebrochen wird.
+
+ Abschließend wird der Rechnungsgesamtbetrag ausgegeben und gefragt, ob die
+ Rechnung gedruckt werden soll.
+#page#
+#on("b")#a Auskunft einholen#off("b")#
+
+ Mit Hilfe dieses Kommandos lassen sich nach Einlesen einer Codenummer (je
+ nach Einstellung über Tastatur oder Codekartenleser) verschiedene Auskünfte
+ über die gespeicherten Daten abrufen. Es können #on("b")#Einzelauskünfte#off("b")# oder
+ #on("b")#Listenauskünfte#off("b")# eingeholt werden. Bei Eingabe einer falschen Nummer wird
+ die Auskunft abgebrochen!
+
+
+ #on("b")#Einzelauskünfte:#off("b")#
+
+ Codenummern 1...15 (Artikelnummern):
+ Die zugehörigen Artikeldaten werden im rechten oberen Bild­
+ schirmfenster angezeigt.
+
+ Codenummern 129...159 (Kundennummern):
+ Die zugehörigen Kundendaten werden im rechten oberen
+ Bildschirmfenster angezeigt.
+
+
+ #on("b")#Listenauskünfte:#off("b")#
+
+ Hierbei liefern jeweils 3 benachbarte Codenummern von der Art her ähnliche
+ Auskunfts-Listen, die auf Wunsch auch ausgedruckt werden können. Die
+ mittlere Nummer bezieht die Auskünfte stets auf die eigene Filiale; die beiden
+ anderen sind nur effizient, wenn mehrere Filialen angemeldet sind. Dabei
+ werden bei Eingabe der linken Nummer die jeweiligen Daten #on("b")#aller#off("b")# Filialen
+ 'aufaddiert' und in #on("b")#einer#off("b")# Gesamtliste ausgegeben. Bei Eingabe der rechten
+ Nummer hingegen werden die jeweiligen Listen von allen angeschlossenen
+ Filialen der Reihe nach abgerufen und #on("b")#hintereinander#off("b")# in eine Datei ge­
+ schrieben, sodaß man eine Zusammenstellung der entsprechenden #on("b")#Einzel#off("b")#-
+ Listen der Filialen erhält:
+#page#
+ Codenummern 66, 67, 68:
+ Die bisherigen Verkaufszahlen der einzelnen Waren werden
+ gezeigt; die Listen sind sortiert nach diesen Zahlen ('Ver­
+ kaufs-Hitlisten').
+
+ Codenummern 73, 74, 75:
+ Nach Eingabe einer Artikelnummer wird eine Liste aller
+ Käufer dieses Artikels ausgegeben.
+
+ Codenummern 77, 78, 79:
+ Diese Codes liefern Kundenlisten der Filialen.
+
+ Codenummern 84, 85, 86:
+ Nach Eingabe einer Kundennummer wird eine Liste aller von
+ diesem Kunden gekauften Artikel ausgegeben.
+
+ Codenummern 89, 90, 91:
+ Diese Codes liefern die Lagerbestandslisten der Filialen. Sollte
+ sich bei der Auskunft '90' herausstellen, daß der Bestand
+ mehrerer Artikel unter den Mindestbestand abgesunken ist, ist
+ es sinnvoll, als nächstes den Menupunkt 'Nachbestellen'
+ anzuwählen (s.u.).
+#page#
+ Beispiel: Der Code '90' liefert bei entsprechend eingegebener Warendatei
+ folgende Auskunft:
+#on("b")#
+ +------------------------------------------------------------------------+
+ | ............. Auskunft: Filiale 1 ................... Zeile 1 |
+ | |
+ | Lagerübersicht: |
+ | ---------------------------------------------------------------------- |
+ | ---------------------------------------------------------------------- |
+ | | Art.Nr.| Artikelname | Preis | Min.Best. | Bestand | |
+ | ---+---------+------------------+-------------+-----------+----------+ |
+ | | | | | | | |
+ | | 1 | Bier (Kasten) | 16.85 | 25 | 19 | |
+ | | 2 | Tageszeitung | 0.80 | 15 | 16 | |
+ | | 3 | Pflaster | 2.39 | 14 | 22 | |
+ | | 4 | Mehl | 0.79 | 32 | 58 | |
+ | | 5 | Seife | 1.80 | 27 | 49 | |
+ | | 6 | Weinbrand | 12.75 | 24 | 41 | |
+ | | 7 | Zigaretten | 4 +------------+--------+ | |
+ | | 8 | Brot | 2 | Auskunft drucken ?| | |
+ | | 9 | EMMA | 3 | | | |
+ | | 10 | Schallplatte | 19 | Ja     Nein | | |
+ | | 11 | Geodreieck | 2 +---------------------+ | |
+ | | | | | | |
+ | | | | | | |
+ | | | | | | |
+ |----------------------------------------------------------------------- |
+ | | Ändern: <Pfeile>   Bestätigen: <RETURN> |
+ + -----------------------------------------------------------------------+
+
+#off("b")#
+
+ Hinweis: Nur die zu den jeweils mittleren Codenummern gehörigen Aus­
+ kunftsfunktionen arbeiten mit Daten, die in der eigenen Task
+ gespeichert sind. Bei den übrigen Auskünften müssen Daten aus
+ anderen Filialverwaltungs-Tasks oder der Zentrale geholt werden,
+ so daß die Erstellung solch einer Auskunft recht zeitaufwendig ist.
+ Um zu lange Wartezeiten zu vermeiden, sollten nicht mehrere
+ Filialen gleichzeitig Auskünfte dieser Art einholen.
+#page#
+#on("b")#n Nachbestellen#off("b")#
+
+ Auf dem Bildschirm wird eine Bestelliste ausgegeben, die alle Artikel enthält,
+ deren Bestand innerhalb der Filiale den Mindestbestand unterschritten hat.
+
+ Die Nachbestellung ist so bemessen, daß diese Artikel wieder mit ihrem
+ doppelten Mindestbestand vorrätig sind. Die neuen Bestände werden auto­
+ matisch in die Warendatei der Filiale eingetragen.
+
+ Auf Wunsch kann die Bestelliste ausgedruckt werden.
+
+
+#on("b")#d Dezimalwert lesen#off("b")#
+
+ Der aktuelle Wert, der vom Codekartenleser gelesen wird, wird (ähnlich wie bei
+ 'Bitmuster lesen', s.u.) auf dem Bildschirm ausgegeben, bis <ESC><q>
+ gedrückt wird. Mit Hilfe dieses Kommandos kann man z.B. die Funktion des
+ Codekartenlesers testen und den Zusammenhang zwischen Bitmuster und
+ Dezimalwert klären.
+
+ Dieser Menupunkt ist (ebenso wie der nächste) nur dann aufrufbar, wenn
+ unter #on("b")#Eingabeart#off("b")# der #on("b")#Kartenleser#off("b")# eingestellt ist.
+
+
+#on("b")#b Bitmuster lesen#off("b")#
+
+ Dieser Menupunkt ist nur dann aufrufbar, wenn unter #on("b")#Eingabeart#off("b")# der
+ #on("b")#Kartenleser#off("b")# eingestellt ist (vgl. Kapitel 5.3).
+
+ Ist das der Fall, so wird hier das aktuelle Bitmuster, das vom Codekartenleser
+ gelesen wird, auf dem Bildschirm ausgegeben, bis <ESC><q> gedrückt
+ wird.
+#on("b")#
++-------------------------------------------------------------------------+
+| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
+|-----------------------------------+-------------------------------------|
+| | |
+| | |
+| | Bitmuster :    0I00III0 |
+| | |
+| | |
+| | |
+| | |
+| | |
+| | |
+| | |
+| | |
+| | |
+| | Lesen beenden mit <ESC><q> |
+| +-------------------------------------|
+| |
+| Bitmuster lesen |
++-------------------------------------------------------------------------+
+#off("b")#
+
+ Ein Bitmuster besteht aus 8 Zeichen (z.B. 'OIOOIIIO'). Dabei zeigt jedes 'I' ein
+ Loch an der entsprechenden Stelle der Codekarte an, die sich gerade im
+ Kartenlesegerät befindet. Dieses Bitmuster entspricht der Dualzahl 01001110
+ (im 'Zweiersystem'); zu ihr gehört die Dezimalzahl
+#on("b")#
+
+ 0 * 128 + 1 * 64 + 0 * 32 + 0 * 16 + 1 * 8 + 1 * 4 + 1 * 2 + 0 * 1 = 78.
+#off("b")#
+
+ Mit Hilfe dieses Kommandos können Sie z.B. die Funktion des Codekarten­
+ lesers testen. Bei voller Beleuchtung aller 8 Sensoren muß das Bitmuster
+ 'IIIIIIII' geliefert werden. Decken Sie einige Sensoren mit den Fingern oder
+ einer Lochkarte ab, so muß sich das Bitmuster auf dem Bildschirm ent­
+ sprechend verändern. Ist das nicht der Fall, so liegt ein Fehler vor.
+
+ Prüfen Sie dann erst einmal, ob der Steckplatz mit Strom versorgt wird (Netz­
+ kabel in der Steckdose? Compact-Box mit Netzteil richtig verbunden?) Ist dort
+ alles in Ordnung, so könnte der Fehler noch in der Verbindung zum Adapter
+ liegen. (Steckplatz ordnungsgemäß mit Adapter verbunden? Richtiges Kabel
+ verwendet?)
+#page#
+ Sollten Sie auf diese Weise nicht zum Erfolg kommen, so verlassen Sie diesen
+ Menupunkt und wählen noch einmal den Oberbegriff 'Eingabeart' an. Stellen
+ Sie dort die Eingabeart zunächst auf 'Tastatur um' und dann wieder auf
+ 'Kartenleser'. Treten hier Fehlermeldungen auf, so lesen Sie in Kapitel 5.3
+ nach. Läßt sich die Umstellung dagegen problemlos vornehmen, so müßte nun
+ auch das 'Bitmuster lesen' wieder funktionieren.
+
+
+#on("b")#5.5  Menufunktionen zum Oberbegriff 'Programme'#off("b")#
+
+#on("b")#
++-------------------------------------------------------------------------+
+| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
+|---------------------+----------------------+----------------------------|
+| | n  Neu erstellen | |
+| | a  Ansehen/Ändern | |
+| | ------------------ | |
+| | s  Starten | |
+| | w  Wiederholen | |
+| | ------------------ | |
+| | v  Verzeichnis | |
+| | ------------------ | |
+| | l  Löschen | |
+| | d  Drucken | |
+| | ------------------ | |
+| | k  Kopieren | |
+| | u  Umbenennen | |
+| +----------------------+ |
+|-------------------------------------------------------------------------|
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
++-------------------------------------------------------------------------+
+#off("b")#
+
+#on("b")#n Neu erstellen#off("b")#
+
+ Mit dieser Funktion können Sie eine neue Programmdatei anlegen und
+ beschreiben.
+
+ Sie werden zunächst nach einem Namen für die #on("b")#neue#off("b")# Programmdatei gefragt.
+ Geben Sie einen beliebigen Namen (#on("b")#ohne Anführungszeichen (!)#off("b")#) ein und
+#page#
+ schließen Sie die Eingabe durch <RETURN> ab. Daraufhin wird Ihnen auf
+ dem Bildschirm eine neue Datei zum Beschreiben angeboten.
+
+ Sollte schon eine Programmdatei mit diesem Namen in der Task vorhanden
+ sein, so werden Sie darauf aufmerksam gemacht.
+
+ Sie können sich während des Schreibens die wichtigsten Tastenfunktionen des
+ Editors einblenden lassen. Tippen Sie dazu die Tastenfolge <ESC><?>. Es
+ erscheint dann das folgende Angebot aus dem Sie auswählen können:
+
+#on("b")#
+ +-----------------------------------------------------+
+ | Der EUMEL - Editor |
+ | |
+ | b ... Beschreibung desEditors |
+ | w ... Wichtige Tasten |
+ | p ... Positionieren der Schreibmarke |
+ | k ... Korrigieren im Text (Einfügen/Löschen) |
+ | m ... Markierte Textpassagen bearbeiten |
+ | l ... Lernen im Editor |
+ | a ... Anweisungen im Editor (Kommandodialog) |
+ | |
+ | z ... Zurück in den Schreibmodus |
+ | |
+ | b   w   p   k   m   l   a   z |
+ | |
+ +-----------------------------------------------------+
+#off("b")#
+ Fehlerfälle:
+ - Eine Programm-Datei mit dem vorgeschlagenen Namen existiert schon.
+
+
+#on("b")#a Ansehen/ändern#off("b")#
+
+ Mit dieser Funktion können Sie sich Dateien, die schon in Ihrer Task
+ existieren, ansehen oder auch verändern.
+
+ Sie werden zunächst gefragt, ob Sie #on("b")#die zuletzt bearbeitete Programmdatei#off("b")#
+ ansehen bzw. verändern möchten (sofern Sie schon vorher mit #on("b")#gs-Warenhaus#off("b")#
+ in der Task gearbeitet haben).
+#page#
+ Bejahen Sie diese Frage, dann wird Ihnen diese Programmdatei zur Bear­
+ beitung angeboten. Verneinen Sie die Frage dagegen, so gelangen Sie in die
+ 'Auswahl' (d.h es werden Ihnen alle Programmdateien in der Task zur Auswahl
+ angeboten). Nachdem Sie einen der Namen angekreuzt haben, wird Ihnen die
+ ausgewählte Programmdatei zur Bearbeitung auf dem Bildschirm angeboten.
+
+ Fehlerfälle:
+ - In der Task existiert noch keine Programmdatei.
+
+
+#on("b")#s Starten#off("b")#
+
+ Mit dieser Menufunktion können Sie ein fertiggestelltes Programm übersetzen
+ und ausführen lassen.
+
+ Sie werden zunächst gefragt, ob #on("b")#das zuletzt bearbeitete Programm#off("b")# ausgeführt
+ werden soll. Bejahen Sie die Frage, so wird dieses Programm gestartet; ver­
+ neinen Sie die Frage dagegen, so gelangen Sie in die 'Auswahl'. Nach An­
+ kreuzen des gewünschten Programmnamens wird das ausgewählte Programm
+ ausgeführt.
+
+ Sind im Programm noch Fehler enthalten, so werden das Programm und die
+ Fehlermeldungen gleichzeitig auf dem Bildschirm dargestellt (Paralleleditor)
+ und zur Korrektur angeboten. Für die Programmkorrektur stehen ebenfalls alle
+ Editorfunktionen zur Verfügung.
+
+ Sollte Ihnen beim Programmieren ein Fehler unterlaufen sein (z.B. eine
+ Endlosschleife), so kann mit der Tastenfolge <ESC><h> der Programm­
+ ablauf abgebrochen werden ("Notbremse").
+#page#
+#on("b")#w Wiederholen#off("b")#
+
+ Mit dieser Funktion können Sie den Ablauf des zuletzt ausgeführten
+ Programms wiederholen, ohne daß das Programm neu übersetzt wird.
+
+ Beachten Sie aber bitte, daß Veränderungen am Programmtext, die seit dem
+ letzten Programmlauf vorgenommen wurden, #on("b")#nicht#off("b")# berücksichtigt werden;
+ dazu muß das Programm erneut mit der Menufunktion 'Starten' übersetzt
+ werden.
+
+ Ist die Wiederholung eines Programmlaufs nicht möglich, so erfolgt ein Hin­
+ weis darauf.
+
+
+#on("b")#v Verzeichnis#off("b")#
+
+ Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task
+ vorhandenen Programmdateien verschaffen.
+
+ Nach Aufruf dieser Funktion wird eine Liste der Programmdateien auf dem
+ Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste selbst
+ eine Text-Datei ist, kann Sie mit der Tastenkombination <ESC><q> ver­
+ lassen werden - hierauf wird auch in der letzten Bildschirmzeile hingewiesen.
+ Falls nicht alle Namen auf den Bildschirm passen, können Sie das Fenster mit
+ <HOP><runter> und <HOP><hoch> verschieben.
+
+
+#on("b")#Löschen#off("b")#
+
+ Mit dieser Funktion können Sie Programmdateien, die Sie nicht mehr
+ benötigen, die unnötig Platz belegen, löschen. Aber Vorsicht! Die Dateien
+ verschwinden durch diese Funktion unwiederbringlich!
+
+ Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
+ Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
+ <ESC><q> verlassen.
+#page#
+ Für jede einzelne Programmdatei wird noch einmal zur Sicherheit gefragt, ob
+ sie auch tatsächlich gelöscht werden soll. Zur Bestätigung tippen Sie bitte die
+ Taste <j> ('ja') - zur Verhinderung <n> ('nein').
+
+ Fehlerfälle:
+ - In der Task exsitiert noch keine Programmdatei
+
+
+#on("b")#d Drucken#off("b")#
+
+ Mit dieser Funktion können Sie Programmdateien über einen angeschlossenen
+ Drucker ausgeben lassen.
+
+ Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
+ Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
+ <ESC><q> verlassen.
+
+ Die angekreuzten Programmdateien werden anschließend zum Drucker ge­
+ schickt. Der Vorgang wird auf dem Bildschirm protokolliert.
+
+ Fehlerfälle:
+ - In der Task existiert noch keine Programmdatei.
+ - Der Drucker ist nicht funktionsbereit.
+ - Der Drucker wird nicht über die Task 'PRINTER' betrieben.
+ - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich
+ mit einer Codenummer identifizieren.
+
+
+#on("b")#k Kopieren#off("b")#
+
+ Mit dieser Funktion können Sie sich eine Kopie einer bereits in der Task
+ vorhandenen Programmdatei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich
+ einen bestimmten 'Stand' aufbewahren wollen oder wenn Sie ein Programm
+ schreiben wollen, das einem bereits vorhandenen ähnelt.
+#page#
+ Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
+ wird die Auswahl automatisch verlassen.
+
+ Anschließend wird der angekreuzte Name angezeigt und der Name für die
+ Kopie erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch
+ nicht für eine Programmdatei vergeben wurde; ansonsten erfolgt ein Hinweis
+ darauf und es wird nicht kopiert!
+
+ Da man aber oft für die Kopie einen ähnlichen Namen wie für das Original
+ wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
+ aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
+ funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
+ eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
+ Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der
+ Task.
+
+
+#on("b")#u Umbenennen#off("b")#
+
+ Mit dieser Funktion können Sie einer bereits vorhandenen Programmdatei
+ einen neuen Namen geben.
+
+ Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
+ wird die Auswahl automatisch verlassen.
+
+ Anschließend wird dieser Name angezeigt und der zukünftige Name für die
+ Programmdatei erfragt. Es muß ein Name eingetragen werden, der in dieser
+ Task noch nicht für eine Programmdatei vergeben wurde - ansonsten erfolgt
+ ein Hinweis darauf und die Programmdatei wird nicht umbenannt!
+#page#
+ Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen
+ wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
+ aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
+ funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
+ eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
+ Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der
+ Task.
+
+
+
+#on("b")#5.6  Menufunktionen zum Oberbegriff 'Filialdaten'#off("b")#
+#on("b")#
++-------------------------------------------------------------------------+
+| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
+|---------------------------------------+--------------------------+------|
+| | e   Eintragen/ergänzen | |
+| | z   Zusammenstellen | |
+| | ----------------------- | |
+| | v   Verzeichnis | |
+| | ----------------------- | |
+| | l   Löschen | |
+| | u   Umbenennen | |
+| +--------------------------+ |
+| |
+| |
+|-------------------------------------------------------------------------|
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>|
++-------------------------------------------------------------------------+
+
+#off("b")#
+
+#on("b")#e Eintragen/ergänzen#off("b")#
+
+ Mit diesem Menupunkt können Sie Filialdaten-Dateien, die Sie z.B. von der
+ Vatertask oder von der Diskette geholt haben, in Ihrer Task laden.
+#page#
+ Ihnen werden zunächst alle vorhandenen Filialdaten-Dateien zur Auswahl
+ angeboten. Anschließend werden die angekreuzten Dateien in der Reihenfolge,
+ in der sie angekreuzt wurden, zur Filialverwaltung geschickt und die Daten
+ dort zu den bereits vorhandenen hinzugefügt. Gegebenenfalls wird auch die
+ zentrale Kundendatei ergänzt. Der Vorgang wird auf dem Bildschirm
+ protokolliert.
+
+ Beachten Sie bitte, daß in der Filiale etwa vorhandene Daten dadurch nicht
+ überschrieben, sondern lediglich ergänzt werden. Ein gänzliches Beseitigen von
+ alten Daten gelingt nur durch Löschen der Filialtask.
+
+ Fehlerfälle:
+ - In der Task exsitieren noch keine Filialdaten-Dateien.
+
+
+#on("b")#z Zusammenstellen#off("b")#
+
+ Mit dieser Funktion können Sie eine Datei anlegen, in der die aktuell in der
+ Filiale gehaltenen Daten zusammengestellt werden. Solch eine Datei kann man
+ sich jedoch nicht ansehen!
+
+ Zunächst wird der Name der Datei erfragt, in die die Filialdaten geschrieben
+ werden sollen. Danach werden darin die aktuellen Daten gespeichert und es
+ wird eine 'Vollzugsmeldung' ausgegeben.
+
+ Die Daten können dann später mit Hilfe der Archiv-Funktionen (vgl. Kapitel
+ 5.7) z.B. auf einer Diskette gespeichert werden, damit Sie beim eventuellen
+ Löschen der Filialtask nicht verlorengehen. Eine Verwechselung mit
+ Programmdateien ist nicht möglich, da Namen für Filialdaten-Dateien (intern)
+ automatisch mit dem Präfix 'Filialdaten:' versehen werden.
+
+ Fehlerfälle:
+ - Eine Filialdaten-Datei mit dem gewünschten Namen existiert bereits in der
+ Task.
+#page#
+#on("b")#v Verzeichnis#off("b")#
+
+ Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task
+ vorhandenen Filialdaten-Dateien verschaffen.
+
+ Nach Aufruf dieser Funktion wird eine Liste der Filialdaten-Dateien auf dem
+ Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste eine
+ Text-Datei ist, kann Sie mit der Tastenkombination <ESC><q> verlassen
+ werden - hierauf wird auch in der letzten Bildschirmzeile hingewiesen. Falls
+ nicht alle Namen auf den Bildschirm passen, können Sie das Fenster mit
+ <HOP><runter> und <HOP><hoch> verschieben.
+
+
+#on("b")#l Löschen#off("b")#
+
+ Mit dieser Funktion können Sie Filialdaten-Dateien, die Sie nicht mehr
+ benötigen und die unnötig Platz belegen, löschen. Aber Vorsicht! Die Dateien
+ verschwinden durch diese Funktion unwiederbringlich!
+
+ Nach Aufruf dieser Funktion werden Ihnen alle Filialdaten-Dateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
+ Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
+ <ESC><q> verlassen.
+
+ Für jede einzelne Datei wird nachgefragt, ob sie auch tatsächlich gelöscht
+ werden soll. Zur Bestätigung tippen Sie bitte die Taste <j> ('ja') - zur Ver­
+ hinderung <n> ('nein').
+
+ Fehlerfälle:
+ - In der Task exsitiert noch keine Filialdaten-Datei.
+#page#
+#on("b")#u Umbenennen#off("b")#
+
+ Mit dieser Funktion können Sie einer bereits vorhandenen Filialdaten-Datei
+ einen neuen Namen geben.
+
+ Nach Aufruf dieser Funktion werden Ihnen alle Filialdaten-Dateien, die sich in
+ Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
+ wird die Auswahl automatisch verlassen.
+
+ Anschließend wird dieser Name angezeigt und der zukünftige Name für die
+ Datei erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch
+ nicht für eine Filialdaten-Datei vergeben wurde - ansonsten erfolgt ein Hinweis
+ darauf und die Datei wird nicht umbenannt!
+
+ Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen
+ wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
+ aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
+ funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
+ eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
+ Namen nur an einer Stelle ändern wollen.
+
+ Fehlerfälle:
+ - Eine Filialdaten-Datei mit dem gewünschten Namen existiert bereits in der
+ Task.
+#page#
+#on("b")#5.7  Menufunktionen zum Oberbegriff 'Archiv'#off("b")#
+#on("b")#
++--------------------------------------------------------------------------+
+| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
+|---------------------------------------------+------------------------+---|
+| | r  Reservieren | |
+| | -  Neue Diskette | |
+| | -------------------- | |
+| | -  Schreiben | |
+| | -  Checken | |
+| | -  Kombination | |
+| | -  Holen/Lesen | |
+| | -  Löschen | |
+| | -------------------- | |
+| | -  Verzeichnis | |
+| | -  Drucken | |
+| | -------------------- | |
+| +-----------------------+ | i  Initialisieren | |
+| | Dateiaustausch mit: | | z  Zieltask einstellen| |
+| | Archiv | +------------------------+ |
+| | Archivname: | |
+| | gs-Warenhaus | |
+| +-----------------------+ |
+|--------------------------------------------------------------------------|
+| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
++--------------------------------------------------------------------------+
+#off("b")#
+
+In diesem Kapitel werden alle die Menufunktionen beschrieben, die Ihnen unter dem
+Oberbegriff 'Archiv' im Menu angeboten werden. Mit den Funktionen in diesem Menu
+können Sie aber nicht nur Dateien auf dem Archiv behandeln, sondern auch in
+anderen Tasks im Multi-User-System oder über das EUMEL-Netz sogar auf anderen
+Rechnern!
+
+Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen haben, sind nicht alle
+Funktionen aktivierbar! Um weitere Funktionen zu aktivieren, muß erst einer der
+aktivierbaren Menupunkte gewählt werden.
+
+Bei der Archivbehandlung werden Ihnen jeweils alle in der Task vorhandenen Dateien
+zur Auswahl angeboten. Das System unterscheidet nicht von sich aus - wie unter den
+#page#
+Oberbegriffen 'Programme' und 'Filialdaten' - zwischen Programm- und Filial­
+daten-Dateien. In den hier gezeigten Listen können Sie aber Filialdaten-Dateien
+daran erkennen, daß ihnen das Präfix 'Filialdaten:' vorangestellt ist.
+
+
+#on("b")#r Reservieren#off("b")# (des Archivlaufwerks)
+
+ Im EUMEL-Multi-User-System haben normalerweise mehrere Personen das
+ Zugriffsrecht auf das Archivlaufwerk. Allerdings muß der Zugriff so geregelt
+ werden, daß sich die Beteiligten dabei nicht gegenseitig "in die Quere
+ kommen". Ein Zugriff auf das Archivlaufwerk erfordert zunächst eine An­
+ meldung. Ist diese Anmeldung erfolgt, kann von den anderen Beteiligten so
+ lange nicht mehr auf das Laufwerk zugegriffen werden, bis es wieder freige­
+ geben worden ist.
+
+ Diese Anmeldung des Archivlaufwerkes erfolgt über die Menufunktion 'r Reser­
+ vieren'. Greift bereits eine andere Task auf das Laufwerk zu, so erhalten Sie
+ darüber einen Hinweis auf dem Bildschirm. Ansonsten wird an Sie die Frage
+ gestellt, ob die Diskette eingelegt und das Laufwerk geschlossen ist.
+
+ Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie den alleinigen Zugriff auf
+ das Laufwerk haben. Deshalb sollten Sie, wenn Sie mit mehreren Personen am
+ Computer arbeiten, erst zum Zeitpunkt der Fragestellung die Diskette ins Lauf­
+ werk einlegen.
+
+ Nachdem Sie die Diskette eingelegt und die Frage bejaht haben, ermittelt das
+ System selbständig den Namen der eingelegten Diskette, zeigt den Namen auf
+ dem Bildschirm (im kleinen Kasten links unten) an und aktiviert die anderen
+ Menupunkte des Pull-Down-Menus.
+
+ Beim Verlassen des Pull-Down-Menus, wenn eine andere Zieltask eingestellt
+ wird oder wenn das Menu gänzlich verlassen wird, wird die Reservierung
+ automatisch aufgehoben!
+#page#
+ Fehlerfälle:
+ - Das Laufwerk ist von einer anderen Task belegt.
+ - Die Diskette ist falsch eingelegt oder das Laufwerk ist nicht richtig ge­
+ schlossen.
+ - Die Diskette ist nicht formatiert bzw. initialisiert.
+ - Die Diskette kann nicht gelesen werden (keine EUMEL-Diskette, Diskette
+ hat ein falsches Format, Diskette ist verschmutzt...).
+
+
+#on("b")#n Neue Diskette#off("b")# (anmelden)
+
+ Der Dateiaustausch mit einer Diskette ist nur dann möglich, wenn der im
+ System eingestellte Diskettenname (auf dem Bildschirm im kleinen Kasten
+ unten links sichtbar) mit dem tatsächlichen Namen der Diskette überein­
+ stimmt. Nach einem Diskettenwechsel ist das aber in der Regel nicht mehr der
+ Fall. Greift man dann auf die neu eingelegte Diskette zu, so erscheint die
+ Fehlermeldung: 'Falscher Archivname! Bitte neue Diskette anmelden!'.
+
+ Das Anmelden einer neuen Diskette - ohne einen neuen Reservierungsvorgang
+ - wird durch diese Menufunktion ermöglicht. Nach Aktivieren dieses Menu­
+ punktes wird der Name der eingelegten Diskette ermittelt, im System eingestellt
+ und auf dem Bildschirm angezeigt.
+
+ Im Gegensatz zur Menufunktion 'r Reservieren' greift das System ohne Anfrage
+ an den Benutzer auf das Archivlaufwerk zu (die Reservierung bleibt ja be­
+ stehen). Ist das Archivlaufwerk reserviert, so ist die Neuanmeldung einer Dis­
+ kette über diese Menufunktion weniger zeitaufwendig.
+
+ Fehlerfälle:
+ - wie unter 'r Reservieren'.
+#page#
+#on("b")#s Schreiben#off("b")# (Kopieren)
+
+ Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die
+ Auswahl durch die Tastenfolge <ESC><q> verlassen, überprüft das System
+ zunächst, ob die Dateien in der eingestellten Zieltask schon vorhanden sind. Ist
+ das der Fall, wird erfragt, ob die dort vorhandenen Dateien überschrieben, d.h.
+ gelöscht werden dürfen (s.u.). Anschließend werden alle angekreuzten Dateien
+ in der Reihenfolge, in der Sie sie angekreuzt haben, in die eingestellte Zieltask
+ kopiert. Der Vorgang wird auf dem Bildschirm protokolliert. Die Original­
+ dateien in der eigenen Task bleiben dabei erhalten.
+
+ Wenn in der Zieltask schon eine Datei existiert, die den gleichen Namen hat
+ wie eine Datei, die Sie dorthin kopieren möchten, so wird angefragt, ob die
+ vorher schon existierende Datei überschrieben (gelöscht!) werden soll. Bejahen
+ Sie diese Frage, so wird die bereits in der Zieltask existierende Datei (un­
+ wiederbringlich) gelöscht und die gewünschte Datei dorthin transportiert. Ein
+ Überschreiben aus Versehen ist nicht möglich, wenn Sie die an Sie gestellte
+ Frage sorgfältig beantworten.
+
+ Verneinen Sie die Frage, so wird die Datei auch nicht hinübertransportiert! Sie
+ können die Datei aber umbenennen (Menufunktion 'u Umbenennen' unter
+ den Oberbegriffen 'Programme' bzw. 'Filialdaten') und anschließend mit
+ anderem Namen hinüberschreiben.
+
+ Beachten Sie, daß beim Überschreiben einer Datei auf einer Archivdiskette der
+ Speicherplatz der alten (überschriebenen) Version im allgemeinen nicht
+ wiederverwendet werden kann. In einem solchen Fall könnte die Diskette voll
+ geschrieben werden, obwohl eigentlich genügend Platz vorhanden wäre. Zur
+ Optimierung wird deshalb zuerst überprüft, ob die angekreuzten Dateien
+ schon in der Zieltask vorhanden sind und löscht diese, wenn Sie Ihr Einver­
+ ständnis geben. Erst anschließend werden die Dateien insgesamt kopiert.
+#page#
+ Normalerweise ist als Zieltask das Archivlaufwerk der eigenen Station einge­
+ stellt. Mit der Menufunktion 'z Zieltask einstellen' kann diese Einstellung aber
+ verändert werden.
+
+ Fehlerfälle:
+ - Die Diskette ist falsch eingelegt oder beschädigt.
+ - Die Diskette kann nicht beschrieben werden (Schreibfehler).
+ - Die Diskette ist voll.
+ - Sehen Sie auch unter 'r Reservieren'
+ 'z Zieltask einstellen'.
+
+
+#on("b")#c Checken#off("b")#
+
+ Diese Menufunktion kann nur ausgeführt werden, wenn der Dateiaustausch
+ mit einem Archiv(manager) erfolgt - ansonsten ist diese Menufunktion auch
+ nicht aktivierbar. Die Menufunktion dient dazu, auf Diskette geschriebene
+ Dateien auf Lesefehler hin zu prüfen. Es empfiehlt sich, diese Prüfroutine auf
+ neu auf die Diskette geschriebene Dateien anzuwenden. Sehen Sie dazu auch
+ 'k Kombination'.
+
+ Alle Dateien der eingestellten Zieltask (Archiv) werden zur Auswahl angeboten.
+ Wenn Sie die Auswahl durch die Tastenfolge <ESC><q> verlassen, werden
+ alle angekreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben,
+ "gecheckt", d.h. auf Lesefehler hin überprüft. Der Vorgang wird auf dem Bild­
+ schirm protokolliert.
+
+ Fehlerfälle:
+ - Lesefehler auf dem Archiv.
+ - Sehen Sie auch unter 'r Reservieren'.
+#page#
+#on("b")#k Kombination#off("b")#
+
+ Diese Menufunktion ist eine Kombination aus den beiden Menufunktionen 's
+ Schreiben' und 'c Checken' (Sehen Sie weitere Informationen auch dort!).
+
+ Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die
+ Auswahl durch die Tastenfolge <ESC><q> verlassen, werden alle ange­
+ kreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, in die
+ eingestellte Zieltask kopiert (gegebenenfalls müssen bereits vorhandene
+ Dateien gleichen Namens in der Zieltask gelöscht werden). Anschließend
+ werden alle Dateien, die gerade geschrieben wurden, gecheckt, d.h. auf Lese­
+ fehler hin untersucht. Beide Vorgänge werden auf dem Bildschirm
+ protokolliert.
+
+ Da die 'Check' - Operation nur bei Archivmanagern zulässig ist, ist diese Menu­
+ funktionen ebenfalls nur bei Archivmanagern aktivierbar. Zur Erläuterung
+ sehen Sie bitte auch unter 'z Zieltask einstellen'.
+
+
+#on("b")#h Holen/Lesen#off("b")#
+
+ Die Menufunktion dient dazu, Dateien, die bereits auf einer Archivdiskette oder
+ in einer anderen Task existieren, in die eigene Task zu kopieren.
+
+ Alle Dateien der eingestellten Zieltask werden zur Auswahl angeboten. An­
+ schließend werden Kopien der angekreuzten Dateien in der Reihenfolge des
+ Ankreuzens in die eigene Task geholt. Das Original in der Zieltask bleibt dabei
+ unverändert! Der Vorgang wird auf dem Bildschirm protokolliert.
+
+ Sind in der eigenen Task schon Dateien mit gleichem Namen vorhanden, so
+ wird gefragt, ob die 'alten' Dateien überschrieben (gelöscht) werden dürfen.
+ Nur wenn Sie zustimmen, werden die in Ihrer Task existierenden Dateien
+ (unwiederbringlich!) gelöscht und Kopien der gleichnamigen Dateien aus der
+ Zieltask angefertigt.
+#page#
+ Stimmen Sie dem Löschvorgang nicht zu, dann bleiben die bisherigen Dateien
+ in Ihrer Task erhalten - die Dateien aus der Zieltask werden dann aber auch
+ nicht in Ihre Task kopiert! Um dennoch die Kopien zu erhalten, können Sie die
+ namensgleichen Dateien in Ihrer Task umbenennen und dann erst die Dateien
+ aus der anderen Task anfordern.
+
+ Normalerweise werden die Dateien vom Archiv der eigenen Station geholt. Mit
+ dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert
+ werden.
+
+ Fehlerfälle:
+ - Lesefehler auf dem Archiv.
+ - Sehen Sie auch unter 'r Reservieren'
+ 's Schreiben'
+ 'z Zieltask einstellen'.
+
+
+#on("b")#l Löschen#off("b")#
+
+ Die Menufunktion dient dazu, Dateien in der Zieltask (unwiederbringlich!) zu
+ löschen. Dazu werden alle Dateien der eingestellten Zieltask zur Auswahl ange­
+ boten. Anschließend werden die angekreuzten Dateien in der Reihenfolge ihres
+ Ankreuzens gelöscht. Zur Sicherheit muß noch einmal für jede einzelne Datei
+ bestätigt werden, daß sie auch tatsächlich gelöscht werden soll.
+
+ Beachten Sie, daß beim Löschen einer Datei auf einer Archivdiskette der
+ Speicherplatz im allgemeinen nicht wieder verwendet werden kann. In einem
+ solchen Fall könnte die Diskette voll geschrieben werden, obwohl eigentlich
+ genügend Platz vorhanden wäre. Diese Probleme treten bei anderen Tasks, die
+ keine Archivmanager sind, nicht auf, da deren Speicherplatz intelligenter
+ verwaltet wird.
+#page#
+ Normalerweise ist als Zieltask das Archiv der eigenen Station eingestellt. Mit
+ dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert
+ werden.
+
+ Fehlerfälle:
+ - Sehen Sie auch unter 'r Reservieren'
+ 's Schreiben'
+ 'z Zieltask einstellen'.
+
+
+#on("b")#v Verzeichnis#off("b")#
+
+ Mit dieser Menufunktion können Sie sich einen Überblick über die in der
+ Zieltask (z.B. auf dem Archiv) vorhandenen Dateien verschaffen.
+
+ Nach Aufruf der Funktion wird eine Liste der Dateien auf dem Bildschirm
+ ausgegeben, die sich in der Zieltask (z.B. auf dem Archiv) befinden. Ist die
+ Zieltask ein Archiv(manager), so wird auch angezeigt, wieviel Platz auf der
+ Diskette belegt ist. Da die Liste selbst eine Datei ist, kann sie mit der Tasten­
+ kombination <ESC><q> verlassen werden. Falls nicht alle Dateinamen auf
+ den Bildschirm passen, können Sie das Fenster mit <HOP><hoch> und
+ <HOP><runter> verschieben.
+
+ Fehlerfälle:
+ - Sehen Sie unter 'z Zieltask einstellen'.
+
+
+#on("b")#d Drucken#off("b")#
+
+ Das Verzeichnis der Dateien in der Zieltask, das man mit der Menufunktion 'v
+ Verzeichnis' auf dem Bildschirm angezeigt bekommt, kann mit dieser Menu­
+ funktion ausgedruckt werden.
+#page#
+ Zur Sicherheit wird angefragt, ob wirklich ein solches Dateiverzeichnis der
+ Zieltask gedruckt werden soll. Bejaht man die Frage, so wird ein Dateiver­
+ zeichnis erstellt und zum Drucker geschickt.
+
+ Fehlerfälle:
+ - Der Drucker ist nicht funktionsbereit.
+ - Der Drucker wird nicht über die Task 'PRINTER' betrieben.
+ - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich
+ mit einer Codenummer identifizieren.
+
+
+#on("b")#i Initialisieren#off("b")#
+
+ Diese Menufunktion gestattet es, frische Disketten zu formatieren, zu initiali­
+ sieren bzw. beschriebene Disketten vollständig zu löschen und ggf. dabei
+ umzubenennen. Bei Aufruf dieser Menufunktion wird - sofern noch nicht
+ geschehen - das Archivlaufwerk automatisch reserviert.
+
+ Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen, müssen Sie
+ diese zunächst #on("b")#formatieren#off("b")#. Dabei wird die Diskette auf ein festgelegtes
+ physikalisches Format eingestellt. Ohne daß diese Operation vorausgegangen
+ ist, kann eine Diskette weder beschrieben noch gelesen werden.
+
+ Prinzipiell braucht eine Diskette nur ein einziges Mal formatiert zu werden. Sie
+ können Sie jedoch jederzeit wieder formatieren - z.B. wenn Sie Disketten
+ haben, von denen Sie nicht genau wissen, für welche Zwecke sie zuvor ver­
+ wendet wurden.
+
+ Wenn Sie diese Menufunktion aktivieren, werden Sie so zunächst gefragt, ob Sie
+ die Diskette auch formatieren wollen. Bejahen Sie die Frage, so werden Ihnen
+ mehrere Formate zur Auswahl angeboten:
+#page#
+#on("b")#
+ +----------------------------------------+
+ | Formatieren einer Diskette |
+ | |
+ | Dies sind die möglichen Formate: |
+ | |
+ | 1 .... 40 Spur - 360 KB |
+ | 2 .... 80 Spur - 720 KB |
+ | 3 .... 5 1/4" - 1,2 MB |
+ | 4 .... 3 1/2" - 1,4 MB |
+ | s .... Standard - Format |
+ | |
+ | |
+ | 1   2   3   4   s |
+ +----------------------------------------+
+
+#off("b")#
+
+ Erkundigen Sie sich bei Ihrem Händler, welches Format Sie bei Ihrem Rechner
+ und den von Ihnen verwendeten Disketten einstellen müssen. Manche Rechner
+ unterstützen diese Operation innerhalb des EUMEL-Systems auch gar nicht,
+ das Formatieren muß dann irgendwie anders außerhalb des EUMEL-Systems
+ geschehen.
+
+ Wenn Sie die Formatierung abgeschlossen oder auch übersprungen haben,
+ beginnt die eigentliche Initialisierung der Diskette. Dabei wird als erstes der
+ Archivname auf die Diskette geschrieben. Alle alten Daten, die sich ggf. auf der
+ Diskette befinden, werden bei diesem Vorgang unwiederbringlich (!) gelöscht.
+
+ Zur Sicherheit überprüft das System in jedem Falle, ob es sich um eine EUMEL
+ - Diskette handelt, und erfragt Ihr Einverständnis, ob die Diskette wirklich
+ initialisiert werden soll. Geben Sie hierzu Ihr Einverständnis, dann wird noch
+ der (neue) Archivname erfragt. Hatte die Diskette schon einen Namen, dann
+ wird dieser zum Überschreiben angeboten. Wollen Sie den alten Archivnamen
+ beibehalten, so brauchen Sie nur die <RETURN>-Taste zu tippen, ansonsten
+ können Sie den Namen auch zuvor verändern oder einen ganz neuen Namen
+ hinschreiben. Anhand des ausgegebenen Namens können Sie auch über­
+ prüfen, ob Sie die richtige Diskette eingelegt haben.
+#page#
+ Das Initialisieren funktioniert natürlich nur, wenn Sie als Zieltask einen
+ Archivmanager eingestellt haben - ansonsten ist diese Menufunktion gesperrt
+ (nicht aktivierbar!).
+
+ Fehlerfälle:
+ - Formatieren ist nicht auf dem System möglich.
+ - Sehen Sie auch unter 'r Reservieren'
+ 'z Zieltask einstellen'.
+
+
+#on("b")#z Zieltask einstellen#off("b")#
+
+ Mit dieser Menufunktion können Sie festlegen, mit welcher Zieltask Sie
+ kommunizieren, d.h. z.B. Dateien austauschen möchten. Normalerweise ist
+ hier das Archiv am eigenen Rechner eingestellt. Das wird auch nach Auf­
+ klappen des Pull-Down-Menus im Kasten links unten angezeigt.
+
+ Diese Menufunktion kann im Unterricht z.B. dazu genutzt werden, um fertig­
+ gestellte Hausaufgaben in eine bestimmte Task zu schicken (Vatertask) oder
+ um von dort z.B. vorgefertigte Programme und/oder Filialdaten-Dateien abzu­
+ holen.
+
+ Sie können aber auch eine andere Task einstellen (z.B. die Vatertask oder die
+ Task 'PUBLIC'), um mit diesen Dateien auszutauschen oder um sich auch nur
+ einen Überblick über die dort vorhandenen Dateien zu verschaffen. Wenn Sie
+ mit Ihrem Rechner in ein EUMEL-Netz integriert sind, können Sie auch auf
+ Tasks anderer Rechner zugreifen oder auch Disketten von Laufwerken anderer
+ Rechner einlesen (z.B. wenn Sie Disketten anderer Formate haben, die von
+ Ihrem Rechner nicht gelesen werden können).
+
+ Dabei werden zwei Anforderungen an die Zieltask gestellt: Sie muß existieren
+ und bereit für den Dateiaustausch sein, d.h es muß eine Managertask sein, auf
+ die Sie Zugriff haben. Versuchen Sie auf andere Tasks zuzugreifen, so erhalten
+ Sie entsprechende (Fehler-)Meldungen.
+#page#
+ Zu beachten ist noch, daß es im EUMEL-System verschiedene Arten von
+ Managertasks gibt - Archivmanager und normale Dateimanager. Der Unter­
+ schied besteht darin, daß ein Archivmanager vom Benutzer vor dem Zugriff
+ reserviert werden muß - anschließend hat nur dieser Benutzer (bis zur Aufga­
+ be der Reservierung) ein Zugriffsrecht auf den Manager. Normale Datei­
+ manager können dagegen von mehreren Benutzern in beliebiger Reihenfolge
+ angesprochen werden.
+
+ Ein Archivmanager kann auch auf bestimmte Diskettenformate spezialisert
+ sein (z.B. auf das Lesen von DOS-Disketten). Manche Rechner haben auch
+ mehrere Archivmanager für verschiedene Laufwerke etc. Durch Einstellen
+ unterschiedlicher Archivmanager können Sie dann auf verschiedenen Lauf­
+ werken archivieren.
+
+ Nach Aktivieren dieses Menupunktes werden Ihnen die folgenden Alternativen
+ angeboten:
+#on("b")#
+ +-------------------------------------------+
+ | Dateiaustausch gewünscht mit: |
+ | |
+ | a ...    Archiv (Eigene Station) |
+ | |
+ | v ...   Vatertask |
+ | |
+ | p ...   'PUBLIC' (Eigene Station) |
+ | |
+ | s ...   Sonstige Task |
+ | |
+ | Archiv   Vatertask   PUBLIC   Sonstige |
+ +-------------------------------------------+
+#off("b")#
+
+ Da der Dateiaustausch mit dem Standardarchiv der eigenen Station (Task:
+ 'ARCHIVE'), mit der Vatertask und der Task 'PUBLIC' recht häufig in Anspruch
+ genommen wird, sind diese drei Optionen unter den Alternativen direkt ange­
+ geben. Entscheiden Sie sich für eine dieser drei Tasks, so nimmt das System
+ alle notwendigen Einstellungen vor. Möchten Sie dagegen in Kontakt mit einer
+#page#
+ anderen Task treten, so wählen Sie die Alternative 's ... Sonstige Task'.
+ In diesem Falle haben Sie noch 3 Angaben zu machen:
+
+ - Zunächst werden Sie nach dem Namen der Zieltask gefragt. Geben Sie den
+ Namen der Zieltask - ohne Anführungsstriche (!) - ein und schließen Sie
+ die Eingabe mit der <RETURN>-Taste ab. (Den ausgegebenen Namen der
+ z.Z. eingestellten Task können Sie dabei verändern bzw. überschreiben.)
+
+ - Dann wird die Nummer der Station im EUMEL-Netz erfragt, auf der sich
+ die Zieltask befindet. Die Nummer Ihrer Station wird als Vorschlag ausge­
+ geben. Wollen Sie mit einer Task auf Ihrem Rechner kommunizieren, so
+ brauchen Sie diesen Vorschlag nur durch Drücken der <RETURN>-Taste
+ bestätigen - ansonsten tragen Sie zuvor die entsprechende Stationsnummer
+ ein. Ist Ihr Rechner nicht in ein EUMEL-Netz integriert, so wird die
+ Stationsnummer 0 (Null) ausgegeben. Bitte bestätigen Sie diese Stations­
+ nummer durch Tippen der <RETURN>-Taste.
+
+ - Zum Abschluß müssen Sie noch angeben, ob die eingestellte Zieltask ein
+ Archivmanager ist oder nicht.
+
+ Das System versucht dann den Kontakt herzustellen. Je nachdem, welche
+ Einstellung Sie vorgenommen haben, sind bestimmte Funktionen innerhalb
+ des Menus nicht aktivierbar. Das System läßt nur die Funktionen zu, die
+ aufgrund Ihrer Einstellungen zulässig sind.
+
+ Im Kasten links unten auf dem Bildschirm wird jeweils angezeigt, welche
+ Zieltask eingestellt ist. Erscheint in diesem Kasten auch ein Hinweis auf den
+ Archivnamen, so haben Sie einen Archivmanager eingestellt. Ist dagegen vor
+ dem Namen der Zieltask noch eine Zahl und ein Schrägstrich angegeben, so
+ haben Sie eine Zieltask auf einem anderen Rechner eingestellt.
+
+ Bedenken Sie, daß Operationen mit Tasks auf anderen Stationen länger an­
+ dauern können - werden Sie nicht ungeduldig!
+#page#
+ Sie können die Einstellung der Zieltask jederzeit wieder verändern!
+
+ Fehlerfälle:
+ - Die eingestellte Zieltask existiert nicht.
+ - Die eingestellte Zieltask existiert zwar, ist aber nicht empfangsbereit, d.h.
+ ein Zugriff von Ihrer Task aus ist nicht möglich!
+ - Das Netz ist nicht funktionsbereit (Collector-Task fehlt).
+ - Die Kommunikation war nicht erfolgreich.
+ - Die gewünschte Operation kann mit der eingestellten Zieltask nicht ausge­
+ führt werden (Zieltask ist z.B. gar kein Archivmanager - Sie aber ver­
+ suchen, das Laufwerk zu reservieren).
+
+
+
+
+
+
+
+
+
diff --git a/doc/warenhaus/gs-Warenhaus-6 b/doc/warenhaus/gs-Warenhaus-6
new file mode 100644
index 0000000..3edf312
--- /dev/null
+++ b/doc/warenhaus/gs-Warenhaus-6
@@ -0,0 +1,589 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (61)#
+#headodd#
+#center#gs-Warenhaus#right#%
+
+#end#
+#headeven#
+%#center#gs-Warenhaus
+
+#end#
+#center#1
+
+#center##on("b")#6  Beschreibung der Programmierschnittstelle#off("b")#
+
+
+In allen GRIN-Projekten soll - zumindest als Erweiterung - der Aspekt des
+"algorithmischen Problemlösens" mit in den Unterricht eingebracht werden. Deshalb
+ist auch in dem Soester Programm zum Projekt WARENHAUS eine Programmier­
+schnittstelle realisiert, die es erlaubt, mit Hilfe eines eng begrenzten Befehlssatzes
+kleine Programme zur Steuerung der Abläufe im Modell-Warenhaus zu schreiben.
+
+Wir haben lange überlegt, ob wir diese Programmierschnittstelle überhaupt nach­
+bilden sollten, weil wir der Meinung sind, daß beim Projekt WARENHAUS das
+algorithmische Problemlösen, wenn überhaupt, nur eine sehr untergeordnete Rolle
+spielt. Als Randproblematik kann man hier vielleicht untersuchen, wie die Menu-
+Funktionen unter dem Oberbegriff 'Kommandos' (vgl. Kapitel 5.4) aufgebaut sind,
+und man kann versuchen, diese in eigenen kleinen Programmen nach- oder umzu­
+bilden.
+
+Unser zweites Problem war, ob wir uns bei einer eventuellen Nachbildung der
+Programmierschnittstelle auch wirklich streng an die Soester Vorgaben halten sollten,
+auch wenn sie unseren Vorstellungen und Konzepten teilweise zuwiderlaufen. Eigent­
+lich sind wir der Meinung, daß uns mit der Programmiersprache ELAN bereits ein
+ausgezeichnetes Hilfsmittel zur Verfügung steht, um auch in der Sekundarstufe I in
+das algorithmische Problemlösen einzuführen. Gerade das Refinementkonzept - die
+Methode der 'schrittweisen Verfeinerung' / der "Modularisierung im Kleinen" -
+scheint uns besonders geeignet, typische Denkweisen des algorithmischen Problem­
+lösens offenzulegen. Lediglich die Konstruktion einer Zählschleife und den Umgang
+mit den Fehlermeldungen des ELAN-Compilers halten wir bei Anfängern für etwas
+problematisch.
+
+Wir haben uns deshalb entschlossen, Ihnen die Programmierschnittstelle in zwei
+Versionen zur Verfügung zu stellen: In der 'ELAN-Version' können Sie in der üblichen
+#page#
+ELAN-Umgebung programmieren; das bietet sich z.B. an, wenn Sie #on("b")#gs-Warenhaus#off("b")#
+im Wahlpflichtbereich bzw. im Differenzierungsbereich 9/10 einsetzen möchten. Es
+ist dann dort nicht nötig, erst eine neue, weniger komfortable "Programmiersprache"
+zu erlernen.
+
+Für den GRIN-Bereich enthält #on("b")#gs-Warenhaus#off("b")# eine weitere Programmierebene
+('GRIN-Version'), die an die Soester Vorgaben angelehnt ist, und die es erlaubt, die
+dort benutzten Schreibweisen von Befehlen und Kontrollstrukturen zu übernehmen.
+Allerdings haben wir dabei eine grundsätzliche Änderung bezüglich der Modularisie­
+rungsmöglichkeit von 'GRIN-Programmen' vorgenommen, auf die wir in Kapitel 6.1
+näher eingehen werden.
+
+Ein 'GRIN-Programm' wird bei der Ausführung des Menupunktes 's Starten' (vgl.
+Kapitel 5.5) zunächst in ein ELAN-Programm übersetzt und dabei auf formale
+Korrektheit überprüft. Werden keine Fehler festgestellt, so wird nun seinerseits das
+ELAN-Programm vom Compiler übersetzt und anschließend ausgeführt. Als Benutzer
+werden Sie dabei nicht mit Fehlermeldungen des Compilers konfrontiert, da der
+#on("b")#gs-Warenhaus#off("b")#-Übersetzer vorher alle formalen Fehler abfängt und zum Korrigieren
+anbietet.
+
+Sollte das System nach erfolgreicher Übersetzung und/oder Compilation bei der
+Ausführung des Programms einen Fehler "bemerken" (z.B. falscher Aufruf eines
+Befehles), so wird das Programm automatisch abgebrochen und die entsprechende
+Fehlermeldung mit der Nummer der Programmzeile, in der der Fehler bemerkt
+wurde, im unteren Teil des Bildschirmes in einem 'notebook' gezeigt. Im oberen Teil
+wird das Programm zum Verbessern angeboten, wobei der Cursor am Anfang der
+fehlerhaften Zeile steht (gilt auch für die 'ELAN-Version').
+
+In beiden Versionen der Programmierschnittstelle ist die Schreibweise der Befehle bis
+auf die Groß- und Kleinschreibung identisch. Folgende Befehle stehen zu Verfügung:
+#page#
+ GRIN-Version | ELAN-Version
+------------------------+------------------------------
+ Artikelnummer lesen | artikelnummer lesen
+ Artikeldaten eingeben | artikeldaten eingeben
+ Kundennummer lesen | kundennummer lesen
+ Kundendaten eingeben | kundendaten eingeben
+ neues Blatt | neues blatt
+ Rechnungskopf | rechnungskopf
+ Artikel kaufen | artikel kaufen
+ Abrechnung | abrechnung
+ Auskunft | auskunft
+ Bildschirm neu | bildschirm neu
+ | nachbestellen
+ | dezimalwert lesen
+ | bitmuster lesen
+ |
+
+
+Die drei letzten Befehle der ELAN-Version haben wir in den GRIN-Befehlssatz nicht
+mit aufgenommen, weil wir hier den Befehlssatz möglichst klein (und damit über­
+sichtlich) halten wollten und diese Befehle bereits unter dem Oberbegriff
+'Kommandos' als Menu-Funktionen zur Verfügung stehen. (Ebenso könnte man bei
+dem Befehl 'Auskunft' argumentieren. Die entsprechende Menu-Funktion 'Auskunft
+einholen' liefert bei jeder Anwahl jedoch immer nur #on("b")#eine#off("b")# Auskunft; in einem
+Programm kann man nun die Ausgabe mehrerer Auskünfte hintereinander
+realisieren.)
+
+Die genaue Wirkung der Befehle werden wir in Kapitel 6.3 noch detailliert
+beschreiben. Sie entsprechen im wesentlichen den Soester Befehlen, die im
+WARENHAUS-Begleitheft des LSW (siehe Anhang) auf den Seiten 99/100 aufgelistet
+sind. (Die anderen dort zu findenden Befehle gehören eigentlich nicht in die Befehls­
+liste der Programmierschnittstelle, weil sie nicht von Programmen aus sondern nur in
+einem 'Direktbefehgs-Modus' als Kommando aufrufbar sind! Diese Befehle sind auch
+#page#
+#on("b")#keine#off("b")# Programmierbefehle im eigentlichen Sinne, sondern entweder "Macros" zum
+"Handling" des Warenhausmodells oder Systemkommandos. #on("b")#gs-Warenhaus#off("b")# stellt
+diese Befehle unter ähnlichen Namen als Menu-Funktionen zur Verfügung.)
+
+
+
+#on("b")#6.1  Schreibweisen und Syntaxregeln in GRIN-Programmen#off("b")#
+
+Die Regeln, die beim Schreiben eines ELAN-Programms zu beachten sind, werden im
+EUMEL/ELAN-Benutzerhandbuch beschrieben; wir werden uns daher hier auf die
+GRIN-Version konzentrieren.
+
+Beginnen wir mit einem Beispiel aus dem WARENHAUS-Begleitheft des LSW. Dort
+finden Sie auf Seite 70 (unten) das folgende Programm:
+
+#on("b")#
+ PROGRAMM Rechnung schreiben
+ neues Blatt
+ Kundennummer lesen
+ WENN nicht Stoptaste gedrückt
+ Rechnungskopf
+ WIEDERHOLE
+ Artikelnummer lesen
+ WENN nicht Stoptaste gedrückt
+ Artikel kaufen
+ ENDE WENN
+ BIS Stoptaste gedrückt
+ Abrechnung
+ ENDE WENN
+ ENDE PROGRAMM #off("b")#
+
+Sie können dieses Programm ohne Änderungen übernehmen und starten,
+#on("b")#gs-Warenhaus#off("b")# wird es ohne Beanstandungen ausführen. Bezüglich der Übersicht­
+lichkeit und des Programmierstils kann man hier sicher geteilter Meinung sein,
+darauf gehen wir später noch ein.
+#page#
+Wir möchten Ihnen zunächst einige Regeln zur Schreibweise und Syntax in 'GRIN-
+Programmen' aufzeigen, die sich im obigen Beispiel-Programm beobachten lassen:
+
+- In jeder Zeile darf nur #on("b")#ein#off("b")# Befehl stehen; Befehgs-Trennzeichen (wie etwa das
+ Semikolon in ELAN) werden deshalb nicht verwendet. Leerzeichen können
+ beliebig gesetzt werden, auch leere Zeilen sind zulässig, nicht jedoch
+ Kommentare.
+
+- Das Arbeiten mit Variablen (gleich welcher Art) ist #on("b")#nicht#off("b")# möglich; alle Befehle
+ sind datentypfrei.
+
+- Schlüsselworte für Kontrollstrukturen (wie z.B. WIEDERHOLE, WENN etc.)
+ werden in GROSSBUCHSTABEN geschrieben, Ausführungsbefehle und
+ Bedingungen hingegen klein und gemäß den Regeln der deutschen Sprache mit
+ großem Anfangsbuchstaben bei Substantiven. Diese Festlegung bezüglich der
+ Groß- und Kleinschreibung ist bei den von #on("b")#gs-Warenhaus#off("b")# zur Verfügung ge­
+ stellten Befehlen #on("b")#verbindlich#off("b")#, d.h. alle Warenhaus-#on("b")#Grund#off("b")#befehle und Kontroll­
+ strukturen müssen (bis auf Leerzeichen) genauso geschrieben werden, wie sie in
+ den Kapiteln 6.2 und 6.3 vorgegeben werden! (In der Soester Software können
+ dagegen Groß- und Kleinbuchstaben beliebig verwendet werden, sodaß dort z.B.
+ neben 'neues Blatt' auch 'neues blatt', "NEueS BlaTT" u.ä. als identisch ange­
+ sehen werden.)
+
+- Jedes 'GRIN-Programm' beginnt mit dem 'Schlüsselwort' <PROGRAMM>,
+ gefolgt von einem Programmnamen, der beliebig gewählt werden kann, jedoch
+ noch in diese Zeile passen muß. Sinnvoll ist es, hier z.B. den Namen der
+ Programmdatei einzutragen.
+
+- Jedes 'GRIN-Programm' endet mit der Zeile <ENDE PROGRAMM>. Nach dieser
+ Zeile dürfen nur noch leere Zeilen folgen, es sei denn zwischen <PROGRAMM
+ Programmname> und <ENDE PROGRAMM> wurden Befehle benutzt, die
+ nicht zum Warenhaus-Grundbefehlssatz gehören. Solche Befehle müssen in einer
+ 'Befehlserklärung' nach Programmende definiert werden.
+#page#
+Das obige Programm befriedigt vom äußeren Erscheinungbild her einen PASCAL-
+Programmierer wahrscheinlich völlig, einen ELAN-Verwöhnten jedoch sicher nicht.
+Die Soester WARENHAUS-Software bietet keinerlei Möglichkeit der Modularisierung
+#on("b")#innerhalb#off("b")# eines Programms (Refinement-/Prozedurkonzept o.ä.). Es gibt dort nur die
+Möglichkeit, fertiggestellte Programme unter dem Programmnamen dem Basis­
+befehlssatz "hinzuzufügen" - ein Vorgang, der dem Insertieren unter EUMEL/ELAN
+ähnelt. Obwohl es unter EUMEL/ELAN ein leichtes gewesen wäre, diese Möglichkeit
+ebenfalls zu realisieren, haben wir davon Abstand genommen, weil auf diese Weise an
+jedem Arbeitsplatz eine "eigene" Programmierumgebung entstehen würde. Wir sind
+der Meinung, daß für Schüler der Sekundarstufe I eine #on("b")#feste Modellumgebung als
+Basis#off("b")# vorhanden sein muß. Außerdem erscheint uns bei der Programmierung "im
+Kleinen" die "Bottom-Up"-Technik unangemessen und für den Anfänger viel zu
+unübersichtlich zu sein; viel eher wäre hier die "Top-Down"-Methode angebracht. Wir
+haben daher die Programmierumgebung in anderer Richtung erweitert und eine
+Modularisierungsmöglichkeit realisiert, die dem Refinementkonzept nachempfunden
+ist und damit unseren didaktisch-methodischen Vorstellungen viel eher entspricht.
+
+Bei #on("b")#gs-Warenhaus#off("b")# werden etwa benutzte 'eigene' Befehle #on("b")#innerhalb derselben#off("b")#
+Programmdatei 'erklärt' und zwar #on("b")#nach#off("b")# dem Ende des eigentlichen 'Haupt­
+programms', d.h. also nach der Zeile <ENDE PROGRAMM>. Mit Hilfe dieser Mög­
+lichkeit könnte das obige Programm besser strukturiert etwa so aussehen:
+
+#on("b")#
+ PROGRAMM Rechnung schreiben
+ neues Blatt
+ Kundennummer lesen
+ WENN nicht Stoptaste gedrückt
+ einkaufen mit Rechnung
+ ENDE WENN
+ ENDE PROGRAMM
+
+ einkaufen mit Rechnung:
+ Rechnungskopf
+ WIEDERHOLE
+ Artikelnummer lesen
+ Artikel eventuell kaufen
+ BIS Stoptaste gedrückt
+ Abrechnung
+#page#
+ Artikel eventuell kaufen:
+ WENN nicht Stoptaste gedrückt
+ Artikel kaufen
+ ENDE WENN
+#off("b")#
+
+
+Sie sehen, das Programm ist so zwar etwas länger, aber erheblich übersichtlicher
+geworden. Für 'neue Befehle' und die zugehörigen 'Befehlserklärungen' gelten
+folgende Grundsätze:
+
+- Die 'Befehlserklärungen' müssen #on("b")#nach#off("b")# <ENDE PROGRAMM> aufgelistet
+ werden. Die Reihenfolge ist beliebig.
+
+- Eine 'Befehlserklärung' besteht aus dem zu erklärenden Befehl in (bis auf Leer­
+ zeichen) völlig identischer Schreibweise (!) und einem nachfolgenden Doppel­
+ punkt (:).
+
+- Ein 'neuer Befehl' darf alle möglichen Zeichen enthalten außer einem Doppel­
+ punkt (:). Außerdem darf solch ein Befehl #on("b")#nicht#off("b")# mit einem 'Schlüsselwort'
+ beginnen (vgl. Kapitel 6.2).
+
+- In 'Befehlserklärungen' können neben den Grundbefehlen auch wieder 'neue
+ Befehle' benutzt werden, die dann wiederum erklärt werden müssen.
+
+- Befehle dürfen nur #on("b")#einmal#off("b")# erklärt werden, auch wenn sie mehrfach benutzt
+ werden.
+
+- Es dürfen nur Befehle erklärt werden, die irgendwo auch wirklich benutzt
+ werden.
+
+- Befehlserklärungen sind nur möglich für #on("b")#Ausführungs-Befehle#off("b")#. Es lassen sich
+ also z.B. keine neuen Bedingungen oder Kontrollstrukturen erklären!
+
+- Es dürfen innerhalb eines Programms maximal 20 verschiedene 'neue Befehle'
+ verwendet werden. (Diese Grenze dürfte in Warenhaus-Programmen kaum ein­
+ mal erreicht werden!)
+#page#
+Formale Verstöße gegen diese Regeln werden bei dem Übersetzungsvorgang sofort
+beim Auftauchen des ersten Fehlers zur Korrektur angeboten. Dabei wird in der
+oberen Bildschirmhälfte das Programm editiert, wobei der Cursor an den Anfang der
+Zeile gesetzt wird, in der sich der (erste) Fehler befindet. In der unteren Bildschirm­
+hälfte wird über den Paralleleditor in einem 'notebook' die Art des Fehlers mit An­
+gabe der Zeilennummer genauer beschrieben.
+
+In der Regel wird hier nur auf #on("b")#einen#off("b")# (nämlich den ersten auftauchenden) Fehler
+hingewiesen, so daß Sie das Programm evtl. mehrfach starten müssen, bis alle Fehler
+erkannt und beseitigt sind. Manchmal tauchen im Fehler-'notebook' aber auch
+mehrere Fehlermeldungen auf (z.B. wenn 'neue Befehle' nicht erklärt oder erklärte
+Befehle nicht benutzt wurden). In Extremfällen kann es dabei dazu kommen, daß
+nicht mehr das ganze Fehler-'notebook' auf dem Bildschirm sichtbar ist. In diesem
+Fall können Sie mit der Tastenfolge <ESC><w> den Cursor zwischen den beiden
+Bildschirmhälften hin- und herschalten und mit den Pfeiltasten evtl. nicht-sichtbare
+Teile des 'notebooks' oder der Programmdatei auf den Bildschirm holen. (Für
+genauere Informationen über den Umgang mit dem EUMEL-Editor lesen Sie bitte im
+EUMEL-Benutzerhandbuch nach.)
+
+
+#on("b")#6.2  Kontrollstrukturen#off("b")#
+
+Sowohl in ELAN-Programmen, als auch in GRIN-Programmen werden Kontroll­
+strukturen durch 'Schlüsselworte' gekennzeichnet, die grundsätzlich in
+GROSSBUCHSTABEN geschrieben werden müssen, um sie deutlich gegenüber Aus­
+führungsbefehlen und Bedingungen abzuheben. In GRIN-Programmen gibt es
+Schlüsselworte für den Anfang und das Ende eines Programms sowie für Schleifen
+und einseitige Abfragen. Wir notieren hier nur die in GRIN-Programmen möglichen
+Kontrollstrukturen und geben, wenn vorhanden, die zugehörige ELAN-Übersetzung in
+Klammern an.
+
+
+#on("b")#Programm-Anfang/Ende:#off("b")#
+
+ #on("b")#PROGRAMM#off("b")# <Programmname>
+ <Anweisung 1>
+ <Anweisung 2>
+ .
+ .
+ #on("b")#ENDE PROGRAMM#off("b")#
+
+
+Jedes GRIN-(Haupt-)Programm beginnt mit dem Schlüsselwort 'PROGRAMM', gefolgt
+von einem frei wählbaren Programmnamen, der jedoch in dieselbe Zeile passen
+muß. Die Zeile 'ENDE PROGRAMM' zeigt das Ende eines GRIN-(Haupt-)Programms
+an. Sowohl 'PROGRAMM', als auch 'ENDE PROGRAMM' dürfen in einer Programm­
+datei nur #on("b")#einmal#off("b")# verwendet werden. Entsprechende Schlüsselworte in ELAN-
+Programmen gibt es nicht.
+
+
+#on("b")#Schleifen:#off("b")#
+
+Schleifen müssen innerhalb des Hauptprogramms oder der Befehlserklärung, in der
+sie geöffnet werden, auch wieder geschlossen werden. Schachtelungen sind zwar
+zulässig, sollten aber aus Gründen der Übersichtlichkeit vermieden werden. Soll
+dennoch innerhalb einer Schleife eine weitere Schleife verwendet werden, so sollte die
+innere Schleife über einen 'neuen Befehl' in eine Befehlserklärung 'ausgelagert'
+werden. Folgende Schleifenarten sind möglich:
+
+a) Zählschleife:
+
+ #on("b")#WIEDERHOLE#off("b")# <n> #on("b")#MAL#off("b")# (ELAN: INT VAR i;
+ <Anweisung 1> FOR i FROM 1 UPTO n REPEAT
+ <Anweisung 2> .
+ . .
+ . .
+ #on("b")#ENDE WIEDERHOLE#off("b")# END REPEAT)
+
+
+Die Anweisungen innerhalb der Schleife werden <n> - mal ausgeführt.
+
+
+b) Schleife mit Ausgangsbedingung:
+
+
+ #on("b")#WIEDERHOLE#off("b")# (ELAN: REPEAT
+ <Anweisung 1> .
+ <Anweisung 2> .
+ . .
+ . .
+ #on("b")#BIS#off("b")# <Bedingung> UNTIL bedingung END REPEAT)
+
+
+Die Anweisungen innerhalb der Schleife werden mindestens einmal ausgeführt und
+dann solange wiederholt, bis die Bedingung erfüllt ist. Bei der Programmierung ist
+darauf zu achten, daß durch die Anweisungen die Bedingung erfüllt werden kann,
+denn sonst ist das Resultat eine 'Endlosschleife', deren Ausführung nur durch einen
+totalen Programmabbruch (<ESC><h>) beendet werden kann.
+
+
+c) Zählschleife mit Ausgangsbedingung:
+
+
+ #on("b")#WIEDERHOLE#off("b")# <n> #on("b")#MAL#off("b")# (ELAN: INT VAR i;
+ <Anweisung 1> FOR i FROM 1 UPTO n REPEAT
+ <Anweisung 2> .
+ . .
+ . .
+ #on("b")#BIS#off("b")# <Bedingung> UNTIL bedingung END REPEAT)
+
+
+Die Anweisungen innerhalb der Schleife werden <n>-mal ausgeführt. Im Gegensatz
+zur reinen Zählschleife können die Wiederholungen jedoch vorzeitig abgebrochen
+werden, nämlich dann, wenn nach irgendeinem Schleifendurchlauf die Bedingung
+erfüllt ist.
+
+
+d) Endlosschleife:
+
+
+ #on("b")#WIEDERHOLE#off("b")# (ELAN: REPEAT
+ <Anweisung 1> .
+ <Anweisung 2> .
+ . .
+ . .
+ #on("b")#ENDE WIEDERHOLE#off("b")# END REPEAT)
+
+
+Die Anweisungen innerhalb der Schleife werden immer wieder ausgeführt. Da keine
+begrenzte Anzahl von Durchläufen und auch keine Abbruchbedingung angegeben ist,
+kann diese Schleife nur durch einen totalen Programmabbruch (<ESC><h>)
+beendet werden.
+
+(Die Schleifenarten c) und d) sind in der Soester WARENHAUS-Software nicht vor­
+ handen, ergaben sich bei der Konstruktion des #on("b")#gs-Warenhaus#off("b")#-Übersetzers wegen
+ der analogen Strukturen in ELAN jedoch quasi "von selbst", so daß wir sie auch
+ zugelassen haben. Schleifen mit Eingangsbedingung (ELAN: WHILE bedingung
+ REPEAT ... END REPEAT) sind für GRIN-Programme jedoch nicht realisiert.)
+
+
+#on("b")#Einseitige Abfragen:#off("b")#
+
+
+ #on("b")#WENN#off("b")# <Bedingung> (ELAN: IF bedingung
+ <Anweisung 1> THEN anweisung 1;
+ <Anweisung 2> anweisung 2;
+ . .
+ . .
+ #on("b")#ENDE WENN#off("b")# END IF)
+
+
+Die Anweisungen werden nur ausgeführt, wenn die Bedingung erfüllt ist. (Eine Ent­
+sprechung zu der in ELAN möglichen 'zweiseitigen Abfrage' (IF ... THEN ... ELSE ...
+END IF) gibt es in der GRIN-Version nicht!)
+
+Eine im Hauptprogramm oder in einer Befehlserklärung begonnene Abfrage ('WENN
+...') muß auch im selben Programmteil wieder beendet werden. Ähnlich wie bei
+Schleifen ist die Schachtelung von Abfragen innerhalb des Hauptprogramms oder
+einer Befehlserklärung zwar zulässig, führt aber zu unübersichtlichen Programmen.
+Auch hier sollte man innerhalb einer Abfrage eventuell notwendige weitere Abfragen
+durch 'neue Befehle' in Befehlserklärungen auslagern.
+
+
+#on("b")#Zulässige Bedingungen:#off("b")#
+
+#on("b")#Stoptaste gedrückt#off("b")# (ELAN: stoptaste gedrückt)
+
+ Die Bedingung ist erfüllt (d.h. liefert den Wert 'wahr'), wenn während des bis­
+ herigen Programmablaufs die Tastenfolge <ESC><q> getippt worden ist;
+ sonst ist sie nicht erfüllt (Wahrheitswert 'falsch'). (Das Tippen von <ESC><q>
+ beim Verlassen einer Datei hat jedoch #on("b")#keinen#off("b")# Einfluß auf den Wahrheitswert der
+ Bedingung!)
+
+ Bei jeder Ausführung der Befehle 'Artikelnummer lesen', 'Kundennummer lesen'
+ und 'Auskunft' wird der Wahrheitswert der Bedingung zunächst immer auf
+ 'falsch' gesetzt (siehe 6.3), so daß die Abfrage der Bedingung nach einem dieser
+ Befehle nur dann 'wahr' liefert, wenn #on("b")#während#off("b")# oder #on("b")#nach#off("b")# der letztmaligen Aus­
+ führung eines der drei Befehle <ESC><q> getippt wurde; ein etwa vorher
+ erfolgtes Tippen dieser Tastenfolge ist somit wirkungslos!
+
+
+#on("b")#nicht Stoptaste gedrückt#off("b")# (ELAN: NOT stoptaste gedrückt)
+
+ Dieses ist das logische Gegenteil von 'Stoptaste gedrückt': 'nicht Stoptaste ge­
+ drückt' ist erfüllt, wenn 'Stoptaste gedrückt' #on("b")#nicht#off("b")# erfüllt ist und umgekehrt.
+
+Um Probleme bei der Arbeit mit Terminals zu vermeiden, die nicht über den
+deutschen Zeichensatz verfügen (Umlaute!), ist bei beiden Bedingungen auch die
+Schreibweise 'gedrueckt' erlaubt.
+
+
+
+#on("b")#6.3  Detailbeschreibung der Warenhaus-Grundbefehle#off("b")#
+
+Wie bereits in 6.1 erwähnt, ist die im folgenden vorgegebene Schreibweise der Grund­
+befehle bezüglich Groß- und Kleinschreibung verbindlich; Leerzeichen dagegen
+können beliebig eingefügt oder auch weggelassen werden. Fett gedruckt steht immer
+der GRIN-Befehl, in Klammern dahinter der zugehörige ELAN-Befehl.
+
+
+#on("b")#Artikelnummer lesen#off("b")# (ELAN: artikelnummer lesen)
+
+ - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf
+ 'falsch' gesetzt.
+ - Der Benutzer wird aufgefordert, eine Artikelnummer einzugeben. Je nach
+ Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein­
+ tippen einer Zahl über die Tastatur oder durch Einschieben einer Warenkarte
+ in das Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzu­
+ schließen. Akzeptiert werden nur Werte von 1 bis 15, ansonsten erfolgt eine
+ Warnung, und die Eingabe wird wiederholt.
+ - Durch Tippen der Tastenfolge <ESC><q> kann dieser Befehl abgebrochen
+ werden, ohne daß eine Artikelnummer eingelesen wird. In diesem Falle wird
+ der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst
+ bleibt der Wert auf 'falsch'.
+ - Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des
+ gesamten Programms abgebrochen.
+
+
+#on("b")#Artikeldaten eingeben#off("b")# (ELAN: artikeldaten eingeben)
+
+ - Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen wurde,
+ ansonsten erfolgt eine entsprechende Fehlermeldung.
+ - Die Angaben zu einem Artikel (Name, Preis, Mindestbestand, Bestand) können
+ eingegeben bzw. verändert werden.
+ - Alle Eingaben sind mit <RETURN> oder der Tastenfolge <ESC><q>
+ abzuschließen. Durch <ESC><q> wird der Wahrheitswert der Bedingung
+ 'Stoptaste gedrückt' auf 'wahr' gesetzt.
+ - Nach Abschluß der Eingaben werden die Artikeldaten in der Filial-Verwaltung
+ gespeichert, worauf auch kurz hingewiesen wird.
+ - Durch Tippen der Tastenfolge <ESC><h> während der Eingaben wird die
+ Ausführung des gesamten Programms abgebrochen.
+
+
+#on("b")#Kundennummer lesen#off("b")# (ELAN: kundennummer lesen)
+
+ - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf
+ 'falsch' gesetzt.
+ - Der Benutzer wird aufgefordert, eine Kundennummer einzugeben. Je nach
+ Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein­
+ tippen einer Zahl über die Tastatur oder durch Einschieben einer Kundenkarte
+ in das Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzu­
+ schließen. Akzeptiert werden nur Werte von 129 bis 159, ansonsten erfolgt eine
+ Warnung, und die Eingabe wird wiederholt.
+ - Durch Tippen der Tastenfolge <ESC><q> kann dieser Befehl abgebrochen
+ werden, ohne daß eine Kundennummer eingelesen wird. In diesem Falle wird
+ der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst
+ bleibt der Wert auf 'falsch'.
+ - Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des
+ gesamten Programms abgebrochen.
+
+
+#on("b")#Kundendaten eingeben#off("b")# (ELAN: kundendaten eingeben)
+
+ - Der Befehl setzt voraus, daß zuvor eine Kundennummer eingelesen wurde,
+ ansonsten erfolgt eine entsprechende Fehlermeldung.
+ - Die Angaben zu einem Kunden (Name, Vorname, Geschlecht) können einge­
+ geben bzw. verändert werden.
+ - Alle Eingaben sind mit <RETURN> oder der Tastenfolge <ESC><q>
+ abzuschließen. Durch <ESC><q> wird der Wahrheitswert der Bedingung
+ 'Stoptaste gedrückt' auf 'wahr' gesetzt.
+ - Nach Abschluß der Eingaben werden die Kundendaten sowohl in der Filial-
+ Verwaltung als auch in der Zentrale gespeichert, worauf auch kurz hingewiesen
+ wird.
+ - Durch Tippen der Tastenfolge <ESC><h> während der Eingaben wird die
+ Ausführung des gesamten Programms abgebrochen.
+
+
+#on("b")#neues Blatt#off("b")# (ELAN: neues blatt)
+
+ - Das Rechnungsfenster auf dem Bildschirm wird gelöscht.
+ - Für die Ausgabe der nächsten Rechnung auf dem Drucker wird eine neue
+ Rechnungsdatei bereitgestellt.
+
+
+#on("b")#Rechnungskopf#off("b")# (ELAN: rechnungskopf)
+
+ - Ein Rechnungskopf wird auf dem Bildschirm ausgegeben. Falls zuvor eine
+ Kundenummer eingelesen worden ist, unter der bereits Kundendaten einge­
+ geben wurden, erscheint der Name des betreffenden Kunden im Rechnungs­
+ kopf.
+ - Der Rechnungskopf wird für einen eventuellen späteren Ausdruck in die
+ Rechnungsdatei geschrieben.
+
+
+#on("b")#Artikel kaufen#off("b")# (ELAN: artikel kaufen)
+
+ - Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen worden ist,
+ ansonsten erfolgt eine entsprechende Fehlermeldung.
+ - Artikelname und -preis werden auf den Bildschirm und in die Rechnungsdatei
+ geschrieben.
+ - Der Kauf wird intern in den entsprechenden Filial-Dateien registriert.
+
+
+#on("b")#Abrechnung#off("b")# (ELAN: abrechnung)
+
+ - Die Preise der gekauften Artikel werden addiert.
+ - Die Summe wird auf dem Bildschirm angezeigt und in die Rechnungsdatei
+ geschrieben.
+ - Der Benutzer wird gefragt, ob die Rechnung ausgedruckt werden soll.
+
+
+#on("b")#Auskunft#off("b")# (ELAN: auskunft)
+
+ - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf
+ 'falsch' gesetzt.
+ - Der Benutzer wird aufgefordert, eine Codenummer einzugeben. Je nach Ein­
+ stellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Eintippen
+ einer Zahl über die Tastatur oder durch Einschieben einer Codekarte in das
+ Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzuschließen.
+ Akzeptiert werden nur zulässige Werte, ansonsten erfolgt eine Warnung, und
+ die Eingabe wird wiederholt. Die Bedeutungen der einzelnen Auskunftscodes
+ sind in Kapitel 5.4 unter der Menufunktion 'Auskunft einholen' beschrieben.
+ - Durch Tippen der Tastenfolge <ESC><q> kann der Befehl abgebrochen
+ werden, ohne daß eine Codenummer eingelesen wird. In diesem Falle wird der
+ Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst
+ bleibt der Wert auf 'falsch'.
+ - Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des
+ gesamten Programms abgebrochen.
+
+
+#on("b")#Bildschirm neu#off("b")# (ELAN: bildschirm neu)
+
+ - Der Programm-Eingangsbildschirm wird neu aufgebaut. Der Befehl wird
+ benötigt, wenn die Fenstereinteilung auf dem Bildschirm wiederhergestellt
+ werden soll (z.B. nach Ausgabe einer Liste bei dem Befehl 'Auskunft').
+ - Der Befehl wird beim Starten eines GRIN-Programms automatisch ausgeführt;
+ bei ELAN-Programmen wird er automatisch am Anfang eines jeden Programms
+ eingefügt, wenn das Programm nicht mit diesem Befehl beginnt.
+
+
+Neben diesen Befehlen stehen für ELAN-Programme noch drei weitere zur Verfügung,
+die nicht zum GRIN-Befehlssatz gehören:
+
+ nachbestellen,
+ dezimalwert lesen,
+ bitmuster lesen.
+
+Diese Befehle entsprechen in ihrer Wirkung den gleichnamigen Menufunktionen
+unter dem Oberbegriff 'Kommandos', die in Kapitel 5.4 beschrieben sind.
+
+
+
diff --git a/doc/warenhaus/gs-Warenhaus-7 b/doc/warenhaus/gs-Warenhaus-7
new file mode 100644
index 0000000..3a55dfe
--- /dev/null
+++ b/doc/warenhaus/gs-Warenhaus-7
@@ -0,0 +1,235 @@
+#limit (11.0)##pagelength (16.5)##block#
+#start (2.0,0.0)#
+#page (69)#
+#headodd#
+#center#gs-Warenhaus#right#%
+
+#end#
+#headeven#
+%#center#gs-Warenhaus
+
+#end#
+#center#1
+
+#center##on("b")#7  Weitere Kommandos (für Systembetreuer)#off("b")#
+
+
+Wenn Sie #on("b")#gs-Warenhaus#off("b")# installiert haben und mit dem Aufbau des Systems nach
+der automatischen Generierung zufrieden sind, dann ist dieses Kapitel nicht wichtig
+für Sie. Wir erklären Ihnen hier die Befehle, mit denen Sie die Einstellungen, die bei
+der Installation vorgenommen wurden, auch nachträglich noch ändern können.
+Beachten Sie bitte, daß aus Sicherheitsgründen eine Einstellungs#on("b")#änderung#off("b")# i.a. nur in
+der Task möglich ist, in der die entsprechende Einstellung vorgenommen wurde, es
+sei denn, dort wurde eine Einstellung gänzlich aufgehoben. Außerdem werden Ein­
+stellungsänderungen stets nur an Sohntasks weitergegeben ("vererbt"), die #on("b")#nach#off("b")# der
+Änderung angemeldet werden!
+
+Die Standard-Installation sieht z.B. nur die Einrichtung #on("b")#einer#off("b")# Warenhaus-Hauptstelle
+vor. Wenn Sie tatsächlich nur eine Hauptstelle eingerichtet haben, nun aber doch
+mehrere Hauptstellen (für verschiedene Lerngruppen) betreiben wollen, so brauchen
+Sie das Programm nicht erneut zu insertieren! Machen Sie besser in der bisherigen
+Hauptstellen-Task den Hauptstellenstatus mit dem Kommando 'warenhaus haupt­
+stelle (FALSE)' rückgängig und richten Sie in Sohntasks mit dem Kommando 'waren­
+haus hauptstelle (TRUE)' wieder neue Hauptstellen ein. Außerdem können Sie in
+Hauptstellen-Tasks die Version für die Programmierschnittstelle umstellen ('grin
+(TRUE)' bzw. 'grin (FALSE)').
+
+Ähnlich verhält es sich mit dem Betrieb eines Adapters für das Kartenleser-Interface.
+Auch hier ist die Standard-Einstellung u.U. nur für den Betrieb #on("b")#eines#off("b")# Adapters ausge­
+legt. Möchten Sie mehrere Kartenleser anschließen, so sind bei der Verwendung von
+MUFIs im Terminalkanal keine Änderungen nötig, da hier jede Filialtask sowieso nur
+auf das MUFI zugreifen kann, das in den Kanal des Terminals geschaltet ist, an das
+die Task gekoppelt ist. Möchten Sie jedoch mehrere Kartenleser über Adapter an
+separaten seriellen Schnittstellen ansprechen, so müssen Sie dem System mehrere
+Kanalnummern mitteilen, die für verschiedene Filialtasks ja durchaus unterschied­
+lich sein können. Am geschicktesten erscheint es in diesem Fall, unter einer Haupt­
+stelle mehrere "Zwischentasks" einzurichten, in diesen jeweils die Interface-
+Kanalnummern festzulegen und die Filialtasks als Söhne dieser "Zwischentasks"
+anzumelden. Benennen Sie die "Zwischentasks" so, daß die eingestellte Kanal­
+nummer aus dem Namen ersichtlich ist, so ist gleich bei der Anmeldung einer Filial­
+task klar, welcher Kartenleser von dieser Task aus angesprochen werden kann.
+
+Um diesen Aufbau zu realisieren, sollten Sie zunächst in der entsprechenden Haupt­
+stellentask einen etwa eingerichteten Direktstart mit dem Kommando 'warenhaus
+direktstart (FALSE)' aufheben. Ebenfalls in der Hauptstellentask wird dann mit dem
+Kommando 'init interface channel' eine etwa vorhandene Kanaleinstellung gelöscht,
+wenn Sie bei der Aufforderung 'Gib Interface-Kanal:' eine '0' eingeben. Nun richten
+Sie für jeden vorhandenen Adapter (natürlich müssen auch entsprechend viele freie
+serielle Schnittstellen zur Verfügung stehen!) eine "Zwischentask" als Sohn der
+Hauptstellentask ein (z.B. 'Kanal 5', 'Kanal 6' etc.) und geben dort jeweils wieder das
+Kommando 'init interface channel'. Bei der Abfrage 'Gib Interface-Kanal:' geben Sie
+dann die entsprechende Kanalnummer ein (in unserem Beispiel 5 oder 6 etc.). Alle
+Söhne der Zwischentask 'Kanal 5' z.B. können dann (abwechselnd) den Kartenleser
+benutzen, der an den Adapter an Kanal 5 angeschlossen ist. In diesen Zwischentasks
+können Sie, wenn Sie möchten, mit dem Kommando 'warenhaus direktstart (TRUE)'
+einen Direktstart für die neu anzumeldenden Sohntasks (Filialen) einrichten.
+Ansonsten wird #on("b")#gs-Warenhaus#off("b")# in den Sohntasks aus der 'gib Kommando' - Ebene
+mit dem Befehl 'warenhaus' gestartet (vgl. Kapitel 3.3).
+
+Sollten Sie beim Betrieb eines Codekartenlesers feststellen, daß die Wartezeit beim
+Einlesen einer Codekarte zu kurz oder zu lang ist, so können Sie auch diese ändern.
+Da die Wartezeit durch eine Schleife realisiert ist, in der laufend Werte vom Interface
+gelesen werden, ist sie abhängig von der Geschwindigkeit des verwendeten Rechners
+und von der gewählten Interface-Anpassung. Die Veränderung der Wartezeit erfolgt
+mit dem Kommando 'eingabesicherheit (n)', wobei n eine 'Integer'-Zahl sein muß.
+Bei sehr langsamen Systemen hat sich ein Wert von 3 als sinnvoll herausgestellt; bei
+schnellen Rechnern muß n etwa 10 oder noch größer sein. Ermitteln Sie den für
+Ihren Rechner geeigneten Wert bitte durch Ausprobieren. (Standardmäßig eingestellt
+ist n = 5.)
+
+Mit Hilfe von drei Informationsprozeduren können Sie Informationen über den
+Systemzustand einholen: 'put (hauptstellenname)' liefert den Namen der zu­
+ständigen Hauptstellen-Task, 'put (interface anpassung)' zeigt den Namen der bei
+der Installation gewählten Interfaceanpassung für den Kartenleser, und 'put (inter­
+face channel)' liefert die Nummer des Kanals, über den ein Interface an separater
+serieller Schnittstelle angesprochen wird.
+
+
+
+#on("b")#Detailbeschreibung der Befehle#off("b")#:
+
+
+#on("b")#PROC eingabesicherheit (INT CONST n):#off("b")#
+
+ - stellt die Wartezeit beim Einlesen einer Artikel-, Kunden- oder Auskunfts­
+ codenummer in Abhängigkeit vom Absolutbetrag von n ein. Bei langsamen
+ Rechnern sollte abs(n) klein (ca. 3), bei schnellen Rechnern größer (ca. 10)
+ sein.
+ - Standardeinstellung ist 5.
+ - Der Befehl kann in jeder Task gegeben werden, in der #on("b")#gs-Warenhaus#off("b")#
+ insertiert ist.
+
+
+#on("b")#PROC grin (BOOL CONST entscheidung):#off("b")#
+
+ - ist nur in Hauptstellentasks aufrufbar und in Tasks, die keiner Hauptstellen­
+ task untergeordnet sind.
+ - stellt die Version für die Programmierschnittstelle gemäß der 'entscheidung'
+ ein:
+ TRUE ---> GRIN-Version, FALSE ---> ELAN-Version.
+
+ Fehlerfälle:
+ - Dieser Befehl darf nur von der Task '...' aus gegeben werden!
+
+
+#on("b")#TEXT PROC hauptstellenname:#off("b")#
+
+ - liefert den Namen der zuständigen Hauptstellentask.
+ - liefert 'niltext' (""), wenn in diesem Zweig des Taskbaumes noch keine
+ Hauptstelle existiert; es ist dann kein Warenhaus-Betrieb möglich! (vgl.
+ 'PROC warenhaus hauptstelle')
+
+
+#on("b")#PROC init interfacechannel:#off("b")#
+
+ - initialisiert eine unbenannte Sohntask ("-") zum Ansprechen des Interface­
+ systems über eine separate serielle Schnittstelle und existiert deshalb nur bei
+ den Anpassungen für 'MUFI als Endgerät' und 'AKTRONIK-Adapter'.
+ - erfragt zunächst eine Kanalnummer ('Gib Interface-Kanal:'); zulässig sind
+ Eingaben von 0 bis 24.
+ - löscht eine evtl. bereits vorhandene unbenannte Sohntask ("-").
+ - richtet bei Eingabe einer Kanalnummer > 0 eine neue unbenannte Sohntask
+ ein und sperrt dieses Kommando für Sohntasks, die danach angemeldet
+ werden.
+ - hebt eine etwa gesetzte Sperrung bei Eingabe von 0 als Kanalnummer wieder
+ auf.
+
+ Fehlerfälle:
+ - Dieses Kommando kann nur von der Task '...' aus gegeben werden!
+ - Unzulässige Kanalnummer!
+
+
+#on("b")#TEXT PROC interface anpassung:#off("b")#
+
+ - liefert den Namen der bei der Installation ausgewählten Anpassung. Möglich
+ sind zur Zeit:
+
+ "ohne Kartenleser",
+ "mit Kartenleser an AKTRONIC-Adapter",
+ "mit Kartenleser an MUFI als Endgerät",
+ "mit Kartenleser an MUFI im Terminalkanal".
+
+
+#on("b")#INT PROC interface channel:#off("b")#
+
+ - existiert nur bei den Anpassungen für den AKTRONIC-Adapter und MUFI als
+ Endgerät.
+ - liefert die Kanalnummer der seriellen Schnittstelle, über die das Interface­
+ system angesprochen wird.
+ - wird der Wert 0 geliefert, so kann in der Task keine Eingabe über einen
+ Kartenleser erfolgen (siehe 'PROC init interfacechannel').
+
+
+#on("b")#PROC warenhaus:#off("b")#
+
+ - ist nicht in Hauptstellentasks aufrufbar.
+ - startet #on("b")#gs-Warenhaus#off("b")# aus der 'gib Kommando' - Ebene oder wird bei einge­
+ richtetem Direktstart automatisch aufgerufen.
+ - richtet eine Sohntask als Filialverwaltung ein und kennzeichnet damit die
+ eigene Task für das System als 'aktive' Filiale. Der Name dieser Sohntask
+ enthält den Namen der zuständigen Hauptstellentask und die Filialnummer,
+ unter der die Filiale geführt wird. Diese Filialnummer ist identisch mit der
+ Kanalnummer des angekoppelten Terminals.
+ - löscht die Filialverwaltungstask, wenn das Warenhaus-Menu geregelt mit
+ <ESC><q> verlassen wird. Zu Kollisionen bezüglich der Filialnummer
+ kann es somit nur kommen, wenn an einem Arbeitsplatz das WARENHAUS-
+ Menu ungeregelt verlassen wird (z.B. durch Tippen der SV-Taste) und dann
+ an demselben Arbeitsplatz eine neue Filiale angemeldet werden soll. In
+ diesem Fall erhält die neue Task #on("b")#keine#off("b")# Filialverwaltung als Sohntask und ist
+ damit für den Warenhaus-Betrieb nicht brauchbar. Deshalb wird hier nach
+ Ausgabe einer Fehlermeldung sofort gefragt, ob die Task gelöscht werden soll.
+
+ Fehlerfälle:
+ - Dieser Befehl darf nur von Söhnen dieser Task aus gegeben werden!
+ - Keine uebergeordnete Task ist 'warenhaus hauptstelle'!
+ - Filiale <n> ist bereits besetzt durch TASK '...'!
+ Es ist so kein geregelter Warenhaus-Betrieb möglich!
+
+
+#on("b")#PROC warenhaus direktstart (BOOL CONST entscheidung):#off("b")#
+
+ - richtet gemäß dem Wahrheitswert der 'entscheidung' einen Direktstart ein
+ oder hebt ihn wieder auf.
+ Hat 'entscheidung' den Wert 'TRUE', so wird ein Direktstart eingerichtet. Es
+ erscheint zunächst die Frage 'Mit automatischem Löschen (j/n)?'. Durch den
+ Direktstart gelangt man beim Anmelden einer Sohntask nicht in die 'gib
+ Kommando' - Ebene, sondern sofort in das WARENHAUS-Menu. Wird die
+ obige Frage mit <j> beantwortet, so werden Sohntasks nach dem Ausstieg
+ aus dem WARENHAUS-Menu sofort gelöscht; andernfalls wird erst noch ge­
+ fragt, ob gelöscht werden soll. Bei Verneinung erfolgt ein 'break'. Die Ein­
+ richtung eines Direktstarts wird vom System vermerkt und der Befehl darauf­
+ hin in allen untergeordneten Tasks gesperrt. Sowohl der Direktstart als auch
+ die Sperrung sind nur wirksam für Sohntasks, die #on("b")#nach#off("b")# Ausführung dieses
+ Befehls angemeldet werden.
+ Hat 'entscheidung' den Wert 'FALSE', so wird ein etwa eingerichteter Direkt­
+ start und die damit verbundene Sperrung des Befehls für neue Sohntasks
+ wieder aufgehoben. Die Aufhebung ist nur möglich in der Task, von der aus
+ der Direktstart eingerichtet wurde.
+
+ Fehlerfälle:
+ - Der Direktstart kann nur aus der Task '...' geaendert werden!
+
+
+#on("b")#PROC warenhaus hauptstelle (BOOL CONST entscheidung):#off("b")#
+
+ - macht je nach Wahrheitswert der 'entscheidung' eine Task zur Hauptstellen­
+ task ('TRUE') bzw. hebt diesen Status wieder auf ('FALSE'). Eine Task kann
+ nur Hauptstelle werden, wenn noch keine übergeordnete Task Hauptstelle ist.
+ Der Hauptstellenstatus kann danach auch nur in dieser Task wieder aufge­
+ hoben werden.
+ - löscht bei der Einrichtung der Hauptstelle eine etwa bereits vorhandene
+ "Zentrale" und richtet automatisch eine neue "Zentrale" in Form einer Sohn­
+ task ein, die den Namen der Vatertask mit dem Zusatz ".Zentrale" erhält und
+ in der später die zentrale Kundendatei gespeichert wird. Bei Aufhebung des
+ Hauptstellenstatus wird diese Task wieder gelöscht.
+ - fragt bei Einrichtung der Hauptstelle nach, ob ein Direktstart eingerichtet
+ werden soll ('Mit Direktstart (j/n)?') und ruft die Prozedur 'warenhaus
+ direktstart' entsprechend auf.
+ - Hebt bei Löschen des Hauptstellenstatus einen in der Task etwa einge­
+ richteten Direktstart automatisch auf.
+
+ Fehlerfälle:
+ - Hauptstelle ist bereits die Task '...'!
+ - Dieses Kommando darf nur in der Task '...' gegeben werden!
+
+