  Benutzerhandbuch fr LPU
  John R. Schrader jrschrader@mainz-online.de
  v0.9-24, 21. August 2000

  Dieses Dokument beschreibt die Anwendung von LPU.
  ______________________________________________________________________

  Inhaltsverzeichnis


  1. Einfhrung

  2. Allgemeines

     2.1 Einige Definitionen
     2.2 Die Funktionsweise
     2.3 Die Aufruf-Syntax
     2.4 Die DEV-Datei
     2.5 Die PAR-Datei
     2.6 Die TAB-Datei

  3. Der Referenzteil

     3.1 Die LPU-Anweisungen
        3.1.1 Sprungziele
        3.1.2 Die Punkt-Anweisungen
        3.1.3 Zitatzeilen
        3.1.4 Die Datenbank-Anbindung
        3.1.5 Untersttzung fr EPS-Files
        3.1.6 Prprozessor-Anweisungen
     3.2 Textuelle Ersetzung
     3.3 Auswertung von Ausdrcken

  4. Sonstiges

     4.1 Der Debugger
     4.2 Tracing

  5. Schlubemerkungen



  ______________________________________________________________________

  11..  EEiinnffhhrruunngg

  Das Label Printing Utility (LPU) ist ein Programm fr die Erzeugung
  von Formularen, Etiketten etc.

  Es wurde zu Anfang auf einem Atari ST mit einem K&R-C-Compiler
  entwickelt.  Zu einem relativ frhen Zeitpunkt erfolgte dann die
  Portierung auf ANSI-C unter QNX (dies ist ein POSIX-zertifiziertes
  Echtzeit-UNIX), und dann die bertragung auf Linux.

  Aktuelle Entwicklungsplattform ist Linux.

  Es sollte derzeit auf praktisch jedem UNIX-System, sowie - mit
  minimalen Anpassungen - auch auf vielen anderen Systemen, die ber
  einen ANSI-C-Compiler verfgen, bersetzbar sein.  Konkrete
  Informationen liegen jedoch nur bzgl. Linux und QNX vor.

  Primrer Einsatzzweck ist derzeit die Erstellung von einfachen
  Etiketten und Formularen in reiner Textform.

  Dabei knnen entweder einzelne Etiketten, eine grere Stckzahl von
  identischen Etiketten (z.B. Visitenkarten), oder eine Folge von
  hnlichen, aber jeweils variierenden Etiketten (z.B. Videokassetten-
  Aufkleber) erstellt werden.  Letzteres wird durch eine einfache
  Importschnittstelle fr Textdaten erreicht.

  22..  AAllllggeemmeeiinneess

  22..11..  EEiinniiggee DDeeffiinniittiioonneenn

  Im Verlaufe dieser Beschreibung werden bestimmte Schlsselworte
  verwendet, die auerhalb von LPU nicht unbedingt bekannt (oder evtl.
  mit einer anderen Bedeutung belegt) sind.  Deshalb werden sie hier
  kurz erklrt:


     DDOOTT
        Alle internen Positionen und Abstnde werden in LPU in der
        neutralen Einheit DOT berechnet.  Ein DOT ist derzeit als ein
        Dezipunkt, also 1/720" definiert.

        Alle reinen Zahlenwerte, die bei Parametern fr eine Koordinate
        oder eine Strecke auf dem Label angegeben werden, besitzen
        implizit die Einheit DOT.


     UUNNIITT
        Eine UNIT ist eine Fliekommazahl mit einer optionalen
        Maeinheit.  Als Einheiten sind derzeit erlaubt:


       `c' fr Zentimeter

       `i' fr Inch

       `m' fr Millimeter

       `p' fr Punkt

       `r' fr Zeilen (rows)

        Der angegebene Wert wird sofort in DOT umgerechnet.

        Im Prinzip darf berall dort, wo ein DOT-Wert erwartet wird,
        auch ein UNIT-Wert angegeben werden.


     NNUUMM
        Datentyp T_NUM, numerisch.

        Dabei handelt sich sich um einen 32Bit Integerwert.


     FFLLTT
        Datentyp T_FLT, float.

        Es handelt sich hier um eine Fliekommazahl als 64bit
        Doublewert.


     SSTTRR
        Datentyp T_STR, string.

        Es handelt sich um einen Textstring mit einer derzeit nicht
        nher festgelegten maximalen Lnge.



  22..22..  DDiiee FFuunnkkttiioonnsswweeiissee

  LPU liest eine oder mehrere Dateien mit Anweisungen, interpretiert
  diese, und erzeugt daraus PostScript-Code fr die Erzeugung der
  gewnschten Etiketten.

  Sind keine Anweisungsdateien angegeben, so werden die Anweisungen
  statt dessen von STDIN gelesen.

  Zur Untersttzung werden ferner zwei besondere Dateien bentigt:

  1. Eine Datei mit gertebezogenen Informationen (siehe ``Die DEV-
     Datei'').

  2. Eine Datei mit Formulardefinitionen (siehe ``Die TAB-Datei'').

  Weiterhin kann man eine Datei mit allgemeinen Parameterdefinitionen
  angeben (siehe ``Die PAR-Datei'').


  22..33..  DDiiee AAuuffrruuff--SSyynnttaaxx

  Der Aufruf von LPU erfolgt in der Form



         lpu { OPTION } { SOURCEFILE }




  Wobei derzeit folgende Optionen erkannt werden:


     ---- Dies ist eine Dummy-Option fr die Umleitung des Befehlskanals
        von STDIN.  Sie wird nur bentigt, wenn keine anderen Optionen
        angegeben sind.


     --bb legt fest, da LPU im sogenannten _B_a_t_c_h_m_o_d_e ausgefhrt wird.

        In diesem Modus ndern einige Anweisungen ihr Verhalten.  Ferner
        kann man durch die Systemvariable _$_b_a_t_c_h_m_o_d_e abfragen, ob sich
        LPU in diesem Modus befindet, und entsprechend anders reagieren.


     --ddDDEEVVFFIILLEE
        Hiermit kann ein anderes Devicefile spezifiziert werden.  Der
        Defaultname ist `lpu.dev'.


     --ff erzeugt automatisch einen Rahmen um jeden generierten Label.
        Dies kann entweder zu Testzwecken verwendet werden, oder als
        Schablone zum Ausschneiden der Label aus einem Blankoformular.


     --hh Gibt eine Liste aller zur Verfgung stehenden Optionen aus.


     --jjCCOOUUNNTT
        gibt an, wieviele Label zu Beginn bersprungen werden.

        Dies dient dazu, bereits teilweise bedruckte Seiten mit
        Etiketten weiter bedrucken zu knnen.


     --ooOOUUTTFFIILLEE
        spezifiziert eine Ausgabedatei. Fehlt diese Option, so erfolgt
        die Ausgabe nach STDOUT.


     --ppPPAARRFFIILLEE
        Definiert einen alternativen Namen fr das Parameterfile.  Der
        Default lautet `lpu.par'.


     --ssSSYYMMBBOOLL==[[VVAALLUUEE]]
        erzeugt eine globale Variable SYMBOL mit dem optionalen Wert
        VALUE.

        Der Typ des Symbols ist STR.

        Fehlt die Angabe von VALUE, so wird die Variable mit dem
        Leerstring vorbesetzt.


     --ttTTAABBFFIILLEE
        Spezifiziert ein anderes Tablefile.  Der Defaultname lautet
        `lpu.tab'.


     --vv[[LLEEVVEELL]]
        Spezifiziert einen Debuglevel. LEVEL kann zwischen `0' und `9'
        liegen, `1' ist der Default.  Ohne diese Option bzw. bei Level
        `0' werden keine Debug-Informationen ausgegeben, bei `1' wenige,
        bei `2' mehr usw.  Alle Debugausgaben gelangen - ebenso wie alle
        Fehlermeldungen - nach STDERR.

  Fr SOURCEFILE knnen beliebige Dateinamen angegeben werden; fehlt die
  Extension, so wird `.lpu' angenommen.  Die angegebenen Dateien werden
  nacheinander in genau der vorgegebenen Reihenfolge abgearbeitet.

  Werden keine SOURCEFILEs angegeben, so werden die Anweisungen statt
  dessen von STDIN gelesen; ggf mu dazu die Option `--' angegeben
  werden.

  Die beiden Konfigurationsdateien `lpu.dev' und `lpu.tab' - bzw. die
  mit `-d' und `-t' zugewiesenen alternativen Namen - werden zuerst im
  aktuellen Verzeichnis, danach im Unterverzeichnis `.lpu' des
  Heimatverzeichnisses des Aufrufers ($HOME/.lpu/), und dann - falls
  angegeben - im Verzeichnis `$LPUDIR' gesucht.

  22..44..  DDiiee DDEEVV--DDaatteeii

  In dieser Datei sind Informationen ber das verwendete Ausgabemedium
  enthalten. Hier finden sich vor allem Definitionen fr die verwendeten
  Papierformate und Zeichenstze.

  Es handelt sich um eine reine Textdatei, die zeilenorientiert ist.
  Leerzeilen, und Zeilen, die mit einem Semikolon als erstem sichtbarem
  Zeichen beginnen, werden ignoriert.  Anweisungen beginnen mit einem
  Prozentzeichen, gefolgt vom Schlsselwort und den zugehrigen
  Parametern

  Folgende Anweisungen sind definiert:


     %%DDeevviiccee IIDD TTYYPP KKOOMMMMEENNTTAARR
        Hiermit wird das verwendete Ausgabegert genau spezifiziert.

        ID ist ein beliebiger Bezeichner.

        TYP gibt den Typ des Gerts an. Derzeit sind definiert:


        SSEEQQ
           Sequentielle Ausgabe.


        RRAANN
           Wahlfreie Ausgabe.


        Fr LPU sind nur Ausgabegerte vom Typ RAN erlaubt.


        KOMMENTAR ist ein beliebiger Text, der das Gert nher
        beschreibt.


     %%AAddjjuusstt XXNNUULLLL YYNNUULLLL
        Gibt eine Korrektur an, mit der die Ausgabe genau justiert
        werden kann.

        XNULL ist ein Offset fr die X-Koordinate, und YNULL ein Offset
        fr die Y-Koordinate, beide in DOTs bzw. UNITs.  Beide Werte
        werden zu jeder Koordinate addiert.

        Der LPU-Distribution liegt das Testprogramm `messen.lpu' bei.
        Mit dessen Hilfe kann man den Koordinaten-Nullpunkt in der
        linken oberen Ecke genau ausmessen, und ber die %Adjust-
        Anweisung entsprechend korrigieren.


     %%PPaaggee IIDD XXMMAAXX YYMMAAXX LLMM RRMM TTMM BBMM
        Definiert ein Seitenformat.

        ID gibt dem Format einen Namen.  XMAX und YMAX definieren die
        Grsse des Formats.

        LM, RM, TM und BM definieren den linken, rechten, oberen und
        unteren Rand, der nicht bedruckt werden kann.

        [Anm. d. Verfassers: ich bitte um die Zusendung von erprobten
        Formatdefinitionen fr andere Papierformate; diese werden dann
        in die mitgelieferten Konfigurationsdateien eingefgt.]


     %%PPssFFoonntt IIDD PPOOIINNTTSS AATTTTRR RREELLWWIIDDTTHH FFOONNTTNNAAMMEE

     %%PPssFFoonntt IIDD PPOOIINNTTSS AATTTTRR @@FFOONNTTNNAAMMEE
        Definiert einen neuen PostScript-Font.

        ID ist der interne Name, der auch in LPU-Programmen verwendet
        wird.

        POINTS definiert die Gre in Punkt. Ist keine feste Punktgre
        vorgegeben, dann kann hier statt dessen ein Stern (*) angegeben
        werden.

        ATTR ist eine Liste von Attributen fuer den Font.  Im Einzelnen
        sind definiert:


        NN  Normal. Schaltet alle Attribute ab.  Muss ggf. als
           Platzhalter angegeben werden.


        BB  Fett (Bold).


        II  Kursiv (Italic).


        UU  Unterstrichen.


        RELWIDTH gibt die `relative Breite' der Zeichen dieses Fonts an,
        sofern es sich dabei um einen Font mit fester Zeichenlaenge
        (monospaced) handelt.  Der Wert gibt die Tausendstel der
        Zeichenhhe an.

        FONTNAME ist der Name, den PostScript intern verwenden soll.

        Anstelle von RELWIDTH und FONTNAME kann man sich die bentigten
        Informationen auch aus einer AFM-Datei holen; bei proportionalen
        Fonts mu man dies sogar tun.  In diesem Fall gibt man den Namen
        der AFM-Datei (ohne Pfad und ohne Extension) hinter einem `@'
        an.  Die AFM-Datei wird dann ber den 'AfmPath' gesucht;
        Beschreibung folgt.


     %%AAffmmPPaatthh PPAATTHH--TTOO--AAFFMMFFIILLEE
        Hiermit wird der Pfad zu dem Verzeichnis angegeben, welches die
        ntigen AFM-Dateien enthlt.  Derzeit kann man hier nur einen
        absoluten Pfad angeben.


  Der Distribution liegt eine Beispieldatei `lpu.dev' bei, die fr einen
  HP LaserJet 6L angepat ist.

  22..55..  DDiiee PPAARR--DDaatteeii

  Hier knnen bestimmte hufig bentigte Programmparameter abgelegt
  werden.

  Wie die anderen Konfigurationsdateien auch, handelt es sich hierbei um
  eine ASCII-Datei, die zeilenweise ausgewertet wird.  Leerzeilen, und
  Zeilen, die mit einem Semikolon beginnen, werden ignoriert.
  Anweisungen beginnen mit einem Punkt, gefolgt von einem Schlsselwort
  und den zugehrigen Parametern.


  Folgende Anweisungen sind derzeit in PAR-Dateien erlaubt:


     ..ddeeffiinnkk IIDD IINNKK--DDEEFFIINNIITTIIOONN

     ..ddeeffppeenn IIDD PPEENN--DDEEFFIINNIITTIIOONN

     ..ddeeffssttyyllee IIDD SSTTYYLLEE--DDEEFFIINNIITTIIOONN
        Die Syntax dieser Anweisungen entspricht exakt derjenigen der
        gleichnamigen LPU-Anweisungen, und kann dort nachgelesen werden.

  22..66..  DDiiee TTAABB--DDaatteeii

  LPU arbeitet prinzipiell mit Forms und Labels.  Eine Form ist die
  Beschreibung der Struktur eines Blattes.  Das Blatt enthlt einen oder
  mehrere Label; diese knnen gleich oder unterschiedlich aussehen, und
  gleichmig oder ungleichmig ber das Blatt verteilt sein.


  Bekannte Formulartypen sind in einer Art Datenbank beschrieben, der
  sogenannten TAB-Datei. Dies ist eine normale Textdatei, die die
  Beschreibung von Formularen und Labels in einer bestimmten Syntax
  enthlt.  Jedes Formular wird durch eine FORM-Anweisung definiert.
  Hier werden der Formularname und das verwendete Seitenformat
  festgelegt.  Danach folgen optional eine oder mehrere LABEL-
  Definitionen, die die Aufteilung des Formulars beschreiben.

  Fehlen die LABEL-Definitionen, so wird angenommen, da das Formular
  aus einem einzigen Label besteht, welches die gesamte Seite ausfllt.
  Der Name fr einen solchen Defaultlabel ist `label'.


  Jeder Label wird durch eine LABEL-Anweisung definiert.  Danach folgen
  optionale BASE, XREP und YREP-Anweisungen.  Die LABEL-Definition legt
  den Namen sowie die Gre eines Labels fest.  Wird statt des
  Labelnamens die Form `@name' angegeben, so wird der vordefinierte
  Label mit dem angegebenen Namen verwendet.


  Per Default wird festgelegt, dass es nur genau einen solchen Label auf
  dem Formular gibt, und da er in der linken oberen Ecke angeordnet
  ist.


  Die BASE-Anweisung enthlt eine X- und eine Y-Koordinate; diese geben
  den Offset des ersten Labels vom angegebenen Typ relativ zur linken
  oberen Ecke des Formulars an.


  Die XREP- und YREP-Anweisungen werden verwendet, wenn es mehrere
  gleiche Label in einem Formular gibt. Der Aufbau ist in beiden Fllen
  gleich: es werden ein Faktor und ein Offset angegeben. Der Faktor gibt
  an, wie oft der Label in der jeweiligen Richtung (nach rechts bzw.
  nach unten) wiederholt wird, und der Offset gibt den Abstand zwischen
  zwei benachbarten Labeln an. Grenzen die Label direkt aneinander, so
  ist der Offset 0.

  [Anmerkung: durch die Verwendung von negativen Offsets knnen bei
  Bedarf auch `berlappende' Label erzeugt werden; mir ist jedoch keine
  sinnvolle Anwendung dafr bekannt.]


  Alle absoluten oder relativen Positionen auf den Formularen werden in
  UNITs angegeben.

  Die linke obere Ecke hat die Koordinate (0,0), positive Werte gehen
  nach rechts und nach unten.

  33..  DDeerr RReeffeerreennzztteeiill

  33..11..  DDiiee LLPPUU--AAnnwweeiissuunnggeenn

  Die LPU-Anweisungen werden zeilenweise ausgewertet; dabei besagt das
  erste Zeichen der Zeile, um welche Art von Daten es sich handelt.


    Leerzeilen werden ignoriert.

    Zeilen, die mit einem Semikolon als erstem, sichtbarem Zeichen
     beginnen, sind Kommentarzeilen.

    Zeilen, die mit einem `#' beginnen und unmittelbar danach ein
     syntaktisch korrektes Schlsselwort aufweisen, sind Prprozessor-
     Anweisungen.

     Jede andere Zeile, die mit einem `#' beginnt, wird als Kommentar
     betrachtet.
     Es wird empfohlen, Kommentare dieser Form immer mit `##' oder '#!'
     zu beginnen, um Verwechslungen zu vermeiden.

     Ferner erlaubt diese Definition, die erste Zeile mit `#!' zu
     beginnen, und damit durch Aufruf einer LPU-Datei als Kommando in
     einer UNIX-Umgebung ein externes Programm zu starten.

    Zeilen, die mit einem Doppelpunkt in der ersten Spalte beginnen,
     sind Sprungziele.  Dies knnen entweder lokale Label oder
     Einsprungpunkte von Prozeduren sein.

    Zeilen, die durch einen Punkt eingeleitet werden, sind
     Befehlszeilen.  Deshalb ist auch manchmal von Punktbefehlen die
     Rede.

    Zeilen, die mit dem Anfhrungszeichen `"' in Spalte 1 beginnen,
     sind sogenannte Zitatzeilen.



  33..11..11..  SSpprruunnggzziieellee




     :: LLAABBEELL
        hiermit wird ein Label definiert.  Dieser dient als Sprungziel
        fr diverse Verzweigungsbefehle.

        Label sind immer nur lokal innerhalb der aktuellen Prozedur
        gltig.


     :::: PPRROOCCNNAAMMEE
        an dieser Stelle beginnt eine neue Prozedur.  Sie erstreckt sich
        bis zum nchsten Prozedurbeginn oder bis zum Modulende.

        Eine Prozedur wird mit `do' aufgerufen und mit `return' wieder
        verlassen.



  33..11..22..  DDiiee PPuunnkktt--AAnnwweeiissuunnggeenn

  Folgende Punktbefehle sind derzeit definiert:



     ..bbaassee XXPPOOSS,, YYPPOOSS
        definiert einen neuen Referenzpunkt auf dem aktuellen Label.
        Per Default ist dieser Referenzpunkt (0, 0), wodurch alle
        relativen Koordinaten im aktuellen Ausgabefenster zugleich
        absoluten Positionen auf dem aktuellen Fenster entsprechen.

        Durch die BASE-Anweisung wird dieser Referenzpunkt verschoben;
        alle Ausgaben werden entsprechend versetzt.


     ..bboorrddeerr TTOOPP,, BBOOTTTTOOMM,, LLEEFFTT,, RRIIGGHHTT
        Diese Anweisung definiert neue Rnder fr das aktuelle Fenster.
        Wird fr eine Seite kein Rand bentigt, so mu dort der Wert `0'
        angegeben werden.


     ..cceenntteerr
        stellt die Standard-Textausrichtung auf `zentriert' ein.  Die
        gewhlte Einstellung gilt ab der nchsten, neu begonnenen Zeile.

        Diese Anweisung wirkt nur auf direkte Textzeilen, bzw. auf die
        Anweisung `text'.


     ..ccoonntt
        Schaltet den Einzelschrittmodus wieder aus.


     ..ccrr
        Setzt den Cursor an den linken Rand des aktuellen Labels in der
        aktuellen vertikalen Position.  Dabei wird ein eventuell
        gesetzter linker Rand beachtet.


     ..cctteexxtt ::SSTTRRIINNGG
        Entspricht der Anweisung `text', die Ausgabe erfolgt hier jedoch
        immer zentriert.


     ..ddbb ......
        Befehle, die mit dem Schlsselwort `db' eingeleitet werden, sind
        Datenbankbefehle. Diese werden im Abschnitt
        ``Datenbankanbindung'' gesondert behandelt.


     ..ddeebbuugg EEXXPPRR {{,, EEXXPPRR }}
        Gibt die angegebenen Ausdrcke nach STDERR aus.  Dies kann z.B.
        fr Hinweise an den Anwender, oder zur Fehlersuche genutzt
        werden.


     ..ddeeffiinnkk IINNKKNNAAMMEE IINNKKDDEEFF
        definiert eine neue Farbe unter dem angegebenen Namen.  Das
        Format von INKDEF lautet


          ( [cVALUE] [mVALUE] [yVALUE] [kVALUE] )


     Dabei steht VALUE jeweils fr eine Prozentzahl zwischen 0 und 100.
     `c', `m', `y' und `k' stehen fr die Farbkomponenten `cyan',
     `magenta', `yellow' und `black'.

     Nicht angefhrte Komponenten werden mit 0 Prozent gewichtet.

     Alternativ kann man auch eine bereits zuvor definierte Farbe
     verwenden, wenn man INKDEF in der Form `@INKNAME' verwendet.


     ..ddeeffppeenn PPEENNNNAAMMEE PPEENNDDEEFF
        definiert einen neuen Stift unter dem angegebenen Namen.  Das
        Format von PENDEF lautet



            linewidth




     Alternativ kann man auch einen bereits zuvor definierten Stift
     verwenden, wenn man PENDEF in der Form `@PENNAME' verwendet.


     ..ddeeffssttyyllee SSTTYYLLEENNAAMMEE SSTTYYLLEEDDEEFF
        definiert einen neuen Style unter dem angegebenen Namen.  Das
        Format von STYLEDEF lautet



            basename size { attr }




     Dabei steht `basename' fr den Basisnamen der Fontfamilie, `size'
     fr die Zeichengroesse in Punkt, und `attr' steht fr jeweils eines
     der Attribute `N' (normal), `B' (bold, fett), `I' (italic, kursiv)
     und `U' (underlined, unterstrichen).  Fehlen die Attributangaben,
     so wird `normal' angegeben.

     Alternativ kann man auch einen bereits zuvor definierten Style
     verwenden, die Syntax von STYLEDEF lautet dann `@STYLENAME'.


     ..ddoo PPRROOCCNNAAMMEE [[ PPAARRAAMM {{ ,, PPAARRAAMM }} ]]
        hiermit wird eine Prozedur aufgerufen.  Nach der Rckkehr aus
        dieser Prozedur (`return'-Anweisung) wird die Ausfhrung mit der
        nchsten Anweisung nach dem `do' fortgesetzt.

        Optional knnen durch Komma getrennte Parameter angegeben
        werden.  Innerhalb der Prozedur kann man die Anzahl der
        bergebenen Parameter mit `$parcnt' abfragen. Einzelne Parameter
        knnen mit `$param(N)' geholt werden; dabei luft `N' von `0'
        bis `$parcnt'.  `$param(0)' liefert den Namen der Prozedur.


     ..eejjeecctt
        beendet das aktuelle Formular, auch wenn hier noch unbenutzte
        Label vorhanden sind.

        Die nchste `label'-Anweisung beginnt auf jeden Fall ein neues
        Formular.

        Nach dem `eject' und vor dem nchsten `label' kann bei Bedarf
        ein neuer Formulartyp selektiert werden.


     ..eeppss ......
        Befehle, die mit dem Schlsselwort `eps' eingeleitet werden,
        gehren zum Komplex ``EPS-Support'' und werden dort gesondert
        behandelt.


     ..eexxiitt MMEESSSSAAGGEE
        bricht die Ausfhrung ab und verlt LPU.

        Es wird die angegebene MESSAGE nach STDERR ausgegeben, der
        Returncode ist 9.


     ..eexxiittiiff EEXXPPRR MMEESSSSAAGGEE
        bricht die Ausfhrung ab und verlt LPU, wenn EXPR einen Wert
        ungleich Null ergibt.

        Es wird die angegebene MESSAGE nach STDERR ausgegeben, der
        Returncode ist 9.



     ..ffoorrmm IIDD
        selektiert den angegebenen Formulartyp.  Die ID mu dabei in der
        verwendeten TAB-Datei im Rahmen einer `form'-Anweisung definiert
        worden sein.


     ..ffrraammee
        zeichnet einen Rahmen um das aktuelle Ausgabefenster


     ..ggbbooxx [[@@((XXPPOOSS,, YYPPOOSS))]] WWIIDDTTHH,, HHEEIIGGHHTT [[..ffiillll]] [[..ppeenn PPEENNDDEEFF]] [[..iinnkk
        IINNKKDDEEFF]] [[..ddaasshheedd]] [[..ddootttteedd]]
        zeichnet ein Rechteck der Breite WIDTH und der Hhe HEIGHT.
        Wird der `@'-Ausdruck mit angegeben, so wird das Rechteck an der
        angegebenen Koordinate ausgegeben, ansonsten an der aktuellen
        Position.

        Die Option `.pen' whlt einen anderen Stift aus.

        Die Option `.ink' selektiert eine andere Farbe.

        Die Option `.fill' besagt, da der Kreis in der aktuellen Farbe
        und mit dem aktuellen Muster gefllt wird.

        Die Optionen `.dashed' und `.dotted' bzw. deren Kombination
        whlen die Art der Linien aus, die durch das Kommando gezeichnet
        werden: `solid', `dashed', `dotted' oder `dashed dotted'.


     ..ggcciirrccllee [[@@ XX,, YY]] RRAADD [[..ffiillll]] [[..ppeenn PPEENNDDEEFF]] [[..iinnkk IINNKKDDEEFF]]
        zeichnet einen Kreis mit dem Mittelpunkt an der aktuellen bzw.
        der angegebenen Koordinate mit dem angegebenen Radius.

        Die Option `.pen PENDEF' whlt fr dieses Objekt einen anderen
        Stift aus.

        Die Option `.ink' selektiert eine andere Farbe.

        Die Option `.fill' definiert, da der Kreis in der aktuellen
        Farbe und mit dem aktuellen Muster gefllt wird.


     ..gglliinnee [[@@((XXPPOOSS,, YYPPOOSS))]] XXOOFFFF,, YYOOFFFF [[..ppeenn PPEENNDDEEFF]] [[..iinnkk IINNKKDDEEFF]]
        [[..ddaasshheedd]] [[ddootttteedd]]
        zeichnet eine Linie mit dem relativen Endpunkt (XOFF, YOFF),
        entweder ab der aktuellen Position, oder - sofern der
        `@'-Ausdruck angegeben ist - ab der Koordinate (XPOS, YPOS).

        Die Option `.pen' whlt einen anderen Stift aus.

        Die Option `.ink' selektiert eine andere Farbe.

        Die Optionen `.dashed' und `.dotted' bzw. deren Kombination
        whlen die Art der Linien aus, die durch das Kommando gezeichnet
        werden: `solid', `dashed', `dotted' oder `dashed dotted'.


     ..ggoottoo LLAABBEELL
        springe zum angegebenen lokalen Label.


     ..hhlliinnee WWIIDDTTHH [[..ppeenn PPEENNDDEEFF]] [[..cceenntteerr || ..lleefftt || ..rriigghhtt]]
        erzeugt eine horizontale Linie mit der Breite WIDTH.

        Durch Angabe der Option `.pen PENDEF' kann eine Linienstrke
        abweichend von der Standardeinstellung gewhlt werden.
        Die Angabe von `.left', `.right' bzw. `.center' berschreibt die
        aktuelle Einstellung fr die Ausrichtung.


     ..hhoommee
        Setzt den Cursor in die linke obere Ecke des aktuellen Labels.
        Dabei werden eventuell gesetzte Rnder links und oben beachtet.


     ..hhsskkiipp WWIIDDTTHH
        verschiebt den Cursor um WIDTH DOTs nach rechts (bzw. bei
        negativem Wert fr WIDTH nach links). Die vertikale Position
        wird nicht verndert.


     ..iiff EEXXPPRR SSTTAATTEEMMEENNTT
        der logische Ausdruck EXPR wird berechnet.  Ist das Ergebnis
        `wahr', so wird die danach genannte Anweisung ausgefhrt,
        anderenfalls wird sie bersprungen.

        Derzeit sind fr STATEMENT nur `goto', `do', `return' und `exit'
        erlaubt.


     ..iinnkk IINNKKDDEEFF
        selektiert eine neue Farbe.  Die Syntax von INKDEF kann man beim
        Befehl `.defink' nachlesen.


     ..iinnppuutt [[##]]VVAARRNNAAMMEE ::PPRROOMMPPTT
        gibt den Prompt aus, liest dann eine Zeile von STDIN ein und
        speichert sie in der angegebenen Variable.

        Standardmig wird die Eingabe als Text abgespeichert; wird
        jedoch `#' mit angegeben, so wird die Eingabe als Zahl
        interpretiert, und die Variable bekommt den Typ `numerisch'.
        Wird in diesem Fall die Eingabe nicht als Zahl erkannt, so
        erfolgt eine Fehlermeldung nach STDERR, und die Eingabe mu
        wiederholt werden.


     ..llaabbeell [[IIDD || ==]]
        selektiert den ersten/nchsten Label.  Es wird auf den nchsten
        Label auf dem aktuellen Formular weitergeschaltet.  Wurde `ID'
        angegeben, so wird der nchste Label mit dieser ID verwendet.

        Sind auf dem aktuellen Formular keine Label (mit der angegebenen
        ID) mehr vorhanden, wird das nchste Formular begonnen.

        Die Angabe von `=' bestimmt, da innerhalb des aktuellen
        Formulars nur noch Label vom aktuellen Typ verwendet werden,
        auch wenn fr das Formular noch andere Typen definiert sind.
        Der Default fr `=' ist die erste LABEL-Definition fr das
        Formular.

        Durch diesen Befehl wird die gesamte Flche des Labels als
        Ausgabebereich definiert, und die Schreibposition wird in die
        linke obere Ecke gesetzt.


     ..lleefftt
        stellt die Standard-Textausrichtung auf `linksbndig' ein.  Die
        gewhlte Einstellung gilt ab der nchsten, neu begonnenen Zeile.

        Diese Anweisung wirkt nur auf direkte Textzeilen, bzw. auf die
        Anweisung `text'.
     ..lleett VVAARR == EEXXPPRR
        hiermit wird ein Ausdruck berechnet, und das Ergebnis einer
        Variablen zugewiesen


     ..lltteexxtt ::SSTTRRIINNGG
        entspricht der Anweisung `text', die Ausgabe erfolgt hier jedoch
        immer linksbndig.


     ..nnll [[NN]]
        setzt die Schreibposition an den Anfang der Zeile, und schaltet
        danach `N' Zeilen weiter; fehlt `N', so wird `1' angenommen.
        Fr den Vorschub in Y-Richtung wird die Hhe eines Zeichens des
        aktuellen Fonts verwendet.


     ..nnooeejjeecctt
        wie _e_j_e_c_t, jedoch wird keine neue Seite begonnen.  Vielmehr
        werden die folgenden Ausgaben bis zum nchsten `.eject' ber die
        bisherigen Ausgaben geschrieben.



     ..ppeenn PPEENNDDEEFF
        selektiert einen neuen Stift.  Die Syntax von PENDEF kann man
        beim Befehl `.defpen' nachlesen.


     ..pprriinntt [[@@((XXPPOOSS,, YYPPOOSS))]] TTEEXXPPRR {{,, TTEEXXPPRR }}
        Gibt die angegebenen Textausdrcke ab der aktuellen Position,
        oder ab der angegebenen Koordinate (XPOS, YPOS) aus.

        Fehlt der `@'-Ausdruck, so wird der Text ab der aktuellen
        Position ausgegeben, und die Schreibposition wird entsprechend
        aktualisiert.


     ..rreeppeeaatt CCOOUUNNTT PPRROOCCNNAAMMEE
        Hier wird die angegebene Prozedur sooft ausgefhrt, wie der Wert
        COUNT angibt.  Beim ersten Durchlauf hat die Systemvariable
        `$count' dabei den Wert `1', dann `2' usw.


     ..rreeqquuiirreess VVEERRSSIIOONN
        fordert eine bestimmte `Mindest-Version' von LPU. Ist die
        aktuelle LPU-Version kleiner als die angegebene VERSION, so wird
        das Programm mit einer entsprechenden Fehlermeldung abgebrochen.

        Die Version mu im Format V.R-S angegeben werden (V=Version,
        R=Release, S=Subrelease), z.B. als `0.9-23' (ohne die
        Anfhrungszeichen).


     ..rreettuurrnn EEXXPPRR
        verlt das aktuelle Modul und kehrt zum aufrufenden Modul
        zurck.  Dabei bildet EXPR den Returncode des Moduls.


     ..rriigghhtt
        stellt die Standard-Textausrichtung auf `rechtsbndig' ein.  Die
        gewhlte Einstellung gilt ab der nchsten, neu begonnenen Zeile.

        Diese Anweisung wirkt nur auf direkte Textzeilen, bzw. auf die
        Anweisung `text'.

     ..rrtteexxtt ::SSTTRRIINNGG
        entspricht der Anweisung `text', die Ausgabe erfolgt hier jedoch
        immer rechtsbndig.


     ..sseettxxyy XXPPOOSS,, YYPPOOSS
        setzt die aktuelle Schreibposition auf die angegebene Koordinate
        innerhalb des aktuellen Fensters.


     ..ssttoopp
        Schaltet in den Singlestep-Modus um.  Danach wird vor der
        Ausfhrung jeder einzelnen Zeile die Anweisung sowie ein Prompt
        ausgegeben, und eine Bedienereingabe erwartet.

        Die Leereingabe (nur ENTER) fhrt die nchste Zeile im
        Singlestep- Modus aus.

        Eine ausfhrlichere Beschreibung findet sich im Abschnitt `Der
        Debugger'.


     ..ssttyyllee SSTTYYLLEEDDEEFF
        selektiert einen neuen Schriftstil.  Die Bedeutung von STYLEDEF
        ist beim Befehl `.defstyle' nachzulesen.


     ..tteexxtt ::SSTTRRIINNGG
        gibt den angegebenen String in der aktuellen Zeile aus.  Die
        Ausrichtung ist standardmig zentriert, sie wird jedoch doch
        die Anweisungen `left', `right' bzw. `center' verndert.

        Es erfolgt hier keine automatische Zeilenfortschaltung!


     ..ttrrooffff
        Schaltet die Ausgabe von Trace-Informationen wieder ab.


     ..ttrroonn
        Schaltet die Ausgabe von Trace-Informationen ein. Danach wird
        jede einzelne Anweisungszeile vor der Ausfhrung nach STDERR
        ausgegeben.


     ..uupprriinntt [[@@((XXPPOOSS,, YYPPOOSS))]] TTEEXXPPRR {{,, TTEEXXPPRR }}
        verhlt sich exakt wie `.print', jedoch werden alle erzeugten
        Texte unterstrichen.


     ..uussee DDBBNNUUMM PPRROOCCNNAAMMEE
        die angegebene Prozedur wird solange immer wieder ausgefhrt,
        bis die angesprochene Datenbank `EOF' meldet.  DBNUM ist Null
        fuer die aktuelle Datenbank, und grer Null fr eine bestimmte
        Datenbank.


     ..vvaarr IIDD {{,, IIDD }}
        definiert eine oder mehrere Variablen mit den angegebenen IDs.

        Variablen mssen definiert worden sein, bevor man sie verwenden
        kann.  Der Gltigkeitsbereich einer Variablen ergibt sich aus
        dem Ort und Zeitpunkt der Definition.

        Eine Variable `lebt' ab dem Moment der Definition, bis zum
        Verlassen der Prozedur, in der sie definiert wurde.
        Wird auf eine Variable referiert, so wird sie zuerst in den
        lokalen Variablen der aktuellen Prozedur gesucht, und dann
        rckwaerts in den bergeordneten Prozeduren bis hin zu `main'.


     ..vvsskkiipp HHEEIIGGHHTT
        verschiebt den Cursor um HEIGHT DOTs nach unten (bzw. bei
        negativem Wert fr HEIGHT nach oben). Die horizontale Position
        wird nicht verndert.


     ..wwaattcchh EEXXPPRR {{,, EEXXPPRR }}
        Definiert eine Liste von Ausdrcken, die im Trace- oder
        Singlestep-Modus jeweils vor der Ausfhrung einer Anweisung
        berechnet und ausgegeben werden sollen.  Diese Anweisung ist vor
        allem dazu geeignet, die Vernderung von Variablen whrend der
        Programmausfhrung zu beobachten.


     ..wwhhiillee EEXXPPRR ddoo PPRROOCCNNAAMMEE
        Hier wird wiederholt der Ausdruck EXPR ausgewertet. Liefert
        dieser den Wert `wahr', so wird die angegebene Prozedur
        ausgefhrt, und die Auswertung beginnt von vorne.

        Liefert EXPR dagegen den Wert `falsch', so wird die Auswertung
        agbebrochen, und mit der nchsten Anweisung fortgefahren.


     ..wwiinnddooww [[@@((XXPPOOSS,, YYPPOOSS)) [[ ..ffrraammee ]] WWIIDDTTHH,, HHEEIIGGHHTT]]
        Definiert ein Ausgabefenster innerhalb des aktuellen Labels.
        Nach der Selektion eines neuen Labels ist dessen gesamte Flche
        als Ausgabefenster definiert. Das Gleiche wird durch den Befehl
        `.window' ohne weitere Parameter erreicht.

        Anderenfalls wird ein Fenster mit der Breite WIDTH und der Hhe
        HEIGHT definiert, entweder ab der aktuellen Position, oder -
        wenn der Ausdruck `@(XPOS, YPOS)' angegeben ist - ab der
        angegebenen Position.

        Wird die Option `.frame' angegeben, so wird zustzlich ein
        dnner Rahmen um das eben definierte Fenster gezogen.

        Alle folgenden Koordinaten beziehen sich dann auf dieses neu
        definierte Fenster.

        Diese Einstellung kann jederzeit durch eine neue
        `.window'-Anweisung berschrieben werden.

        Zu Beginn hat das Fenster keinerlei Rnder. Diese knnen dann
        bei Bedarf durch die `.border'-Anweisung nachtrglich gesetzt
        werden.


  33..11..33..  ZZiittaattzzeeiilleenn

  Eine Zeitatzeile beginnt mit einem `"' in der ersten Spalte.

  Der angegebene Textstring (alles hinter dem `"') wird im aktuellen
  Stil ab der aktuellen Schreibposition ausgegeben.  Die Schreibposition
  wird anschlieend auf den Anfang der nchsen Zeile gesetzt.  Dies wird
  erreicht, indem die X-Koordinate auf Null gesetzt, und die Y-
  Koordinate um die Hhe eines Zeichens des aktuellen Fonts erhht wird.

  Somit entspricht die Zeile


           "TEXTZEILE




  einer Kurzform fr die beiden Punktanweisungen



           .text :TEXTZEILE
           .nl




  Innerhalb des Textes knnen bestimmte Ersetzungen durchgefhrt werden;
  siehe hierzu den entsprechenden Abschnitt.


  33..11..44..  DDiiee DDaatteennbbaannkk--AAnnbbiinndduunngg

  Fr die serienmige Erstellung von Formularen, Etiketten etc.  wird
  eine Importmglichkeit fr externe Daten bentigt.  Dies wird bei LPU
  durch die Datenbankschnittstelle TDB erreicht.

  Dabei handelt es sich um eine einfache Datenbank, speziell fr die
  sequentielle Verarbeitung von textuellen Daten.  Derzeit wird nur der
  Typ `TDB' untersttzt.  Die Dateiendung dafr lautet `.tdb'.

  Weitere Datenbanktypen sind geplant.

  Eine TDB-Datei ist eine normale Textdatei, bei der jede Textzeile
  einen Datensatz darstellt.  Innerhalb einer Zeile werden Felder durch
  ein spezielles Trennzeichen abgegrenzt.  Das Trennzeichen ist per
  Default das Nullbyte, so da die ganze Zeile als ein Feld angesehen
  wird; dies kann jedoch beim ffnen der Datei mit der Option `/' durch
  ein beliebiges, druckbares Zeichen ersetzt werden.

  Folgende Punktbefehle realisieren die Datenbank-Schnittstelle in LPU:


     ..ddbb ooppeenn [[##NN]] [[//TT]] DDBBNNAAMMEE
        Hiermit wird eine Datenbank mit dem angegebenen Namen erffnet.
        Der Typ ist `TDB'.

        Wird die Option `#N' angegeben, so wird die Datenbank nicht im
        aktuellen, sondern im angegebenen Bereich erffnet, und dieser
        Bereich wird zum aktuellen Bereich.  Der erste Satz dieser
        Datenbank wird zum aktuellen Datensatz.

        Wird die Option `/T' verwendet, so wird der Feldtrenner <NUL>
        durch den Trenner `T' ersetzt.  Fuer `T' kann dabei jedes
        beliebige, druckbare Zeichen eingesetzt werden.


     ..ddbb cclloossee
        Hiermit wird die Datenbank im aktuellen Bereich wieder
        geschlossen.


     ..ddbb uussee ##NN
        setzt den aktuellen Bereich auf den angegebenen Wert.


     ..ddbb ttoopp
        setzt den Datensatzzeiger der Datenbank im aktuellen Bereich auf
        den ersten Satz.


     ..ddbb nneexxtt
        springt in der aktuellen Datenbank auf den nchsten Datensatz.


     ..ddbb ffiinndd NN PPAATTTTEERRNN
        durchsucht die aktuelle Datenbank ab dem aktuellen Datensatz
        sequentiell bis zum Ende nach dem Eintrag PATTERN im Feld `N'.

        Der gefundene Datensatz wird zum aktuellen Datensatz.

  33..11..55..  UUnntteerrssttttzzuunngg ffrr EEPPSS--FFiilleess

  Ab der Version 0.9-23 ist in LPU experimentelle Untersttzung fr
  `Embedded Postscript' Files (EPS) integriert.

  Der Inhalt einer EPS-Datei wird als `Black Box' ausgegeben; lediglich
  die Lage auf dem Label und die Gre der Ausgabebox knnen beeinflusst
  werden.

  Es gibt die einfache Mglichkeit, die EPS-Datei mit einer einzigen
  Anweisung (eps insert) auszugeben, oder die Datei zu ffnen,
  Informationen ber die Datei (derzeit nur die Gre) zu ermitteln, die
  Gre zu modifizieren, und den Inhalt dann an einer bestimmten Stelle
  auszugeben. Im zweiten Fall kann die Datei auch mehrfach ausgegeben
  werden (auch in verschiedenen Gren); dies erhht die Performance
  etwas, aber nicht entscheidend.

  Der zweite Anwendungsfall ist aufwendiger, aber auch flexibler.
  Insbesondere stehen nur hier die Dateiinformationen _v_o_r der Ausgabe
  zur Verfgung.

  Wie bereits gesagt ist die Untersttzung fr EPS-Dateien derzeit noch
  experimentell; es mu insbesondere noch mit nderungen an der
  Programmier-Schnittstelle gerechnet werden.

  Es folgt eine Liste der derzeit verfgbaren Anweisungen.



     ..eeppss iinnsseerrtt FFIILLEENNAAMMEE {{ OOPPTTIIOONN }}
        Diese Anweisung gibt eine EPS-Datei an einer bestimmten Stelle
        des aktuellen Labels in einer bestimmten Gre aus.

        FILENAME ist der Name der Datei als absoluter oder relativer
        Pfad in Unix-Notation; die Extension der Datei mu ebenfalls mit
        angegeben werden.

        Ohne die Angabe von Optionen wird die Datei an der aktuellen
        Position in der durch die EPS-Datei vorgegebenen Gre
        ausgegeben.

        Folgende Optionen sind erlaubt:


       _@_(_X_P_O_S_,_Y_P_O_S_)

        legt eine neue Ausgabeposition fest.  XPOS und YPOS geben dabei
        die Position auf dem Label in DOT an.

        Ohne diese Option erfolgt die Ausgabe bezogen auf die aktuelle
        Cursorposition.


       _._s_i_z_e_(_X_S_I_Z_E_,_Y_S_I_Z_E_)

        legt eine neue Gre fr das EPS-Bild fest.  Die Werte XSIZE und
        YSIZE geben die absolute Gre in DOT an.

       _._s_c_a_l_e_(_X_S_C_A_L_E_,_Y_S_C_A_L_E_)

        skaliert das EPS-Bild um die angegebenen Faktoren in X- und Y-
        Richtung.

       _._f_u_l_l

        skaliert das EPS-Bild so, da es die gesamte Flche des
        aktuellen Ausgabefensters ausfllt.

       _._h_c_e_n_t_e_r

        bestimmt, da nicht der linke Rand, sondern die Mitte des Bildes
        als Ankerpunkt in X-Richtung fr die Ausgabe verwendet wird.

       _._v_c_e_n_t_e_r

        bestimmt, da nicht der obere Rand, sondern die Mitte des Bildes
        als Ankerpunkt in Y-Richtung fr die Ausgabe verwendet wird.

       _._c_e_n_t_e_r

        ist eine Kombination aus `.hcenter' und `.vcenter': das EPS-Bild
        wird mit seinem Mittelpunkt an der angegebenen Koordinate
        ausgegeben.

       _._h_s_k_i_p

        Nach der Ausgabe des Bildes wird der Cursor um die exakte
        Bildbreite nach rechts bewegt. Normalerweise wird der Cursor
        nicht bewegt.

       _._v_s_k_i_p

        Nach der Ausgabe des Bildes wird der Cursor um die exakte
        Bildhhe nach unten bewegt. Normalerweise wird der Cursor nicht
        bewegt.


     ..eeppss ooppeenn FFIILLEENNAAMMEE
        Diese Anweisung ffnet die angegebene EPS-Datei.

        FILENAME ist der Name der Datei als absoluter oder relativer
        Pfad in Unix-Notation; die Extension der Datei mu ebenfalls mit
        angegeben werden.

        Anschlieend knnen weitere `eps'-Anweisungen auf die Datei
        angewendet werden, bis die Datei mit 'eps close' (siehe unten)
        wieder geschlossen wird.  Es kann zu einer Zeit immer nur eine
        EPS-Datei offen sein.

        Whrend die EPS-Datei offen ist, kann man unter Verwendung der
        Systemfunktion `$eps{ATTR}' auf die Dateiattribute zugreifen;
        Nheres dazu im Abschnitt ber die Systemfunktionen.


     ..eeppss rreessiizzee XXSSIIZZEE,, YYSSIIZZEE
        Gibt der offenen EPS-Datei eine neue Gre. Die Parameter XSIZE
        und YSIZE besitzen die Einheit DOT.


     ..eeppss rreessccaallee XXSSCCAALLEE,, YYSSCCAALLEE
        Auch hiermit wird der offenen EPS-Datei eine neue Gre gegeben.
        Im Unterschied zu `eps resize' wird hier keine absolute Gre
        festgelegt, sondern es werden Skalierungsfaktoren fr beide
        Richtungen angegeben.  `1.0' fr beide Werte lt die Gre
        unverndert.  `0.5' staucht die Datei in der angegebenen
        Richtung auf die Hlfte zusammen.

        Der Skalierungsfaktor bezieht sich immer auf die Originalgre
        der Datei; dadurch wirkt sich bei mehrfacher Anwendung dieser
        Funktion immer nur der jeweils letzte Aufruf aus.

        Ebenso beeinflussen sich Aufrufe von `eps resize' und `eps
        rescale' nicht, nur der jeweils letzte Aufruf wirkt sich auf die
        Gre aus.


     ..eeppss sshhooww {{ OOPPTTIIOONN }}
        Diese Anweisung gibt die offene EPS-Datei einmalig aus. Dabei
        wird die zuvor durch die Anweisungen `eps resize' bzw. `eps
        rescale' festgelegte Gre (bzw. bei Fehlen dieser Anweisungen
        die Originalgre) verwendet.

        `eps show' kann beliebig oft hintereinander ausgefhrt werden,
        wobei jeweils neue Positionen und (durch Anwendung von `eps
        resize' oder `eps rescale') Gren zur Anwendung kommen knnen.

        Die Ausgabe erfolgt an der aktuellen Cursorposition, es sei denn
        die Position wird durch die '@'-Option berschrieben.

        Als Ankerpunkt fr die EPS-Datei wird normalerweise die linke
        obere Ecke der BoundingBox verwendet; dies kann durch die
        Optionen `.hcenter', `.vcenter' und `.center' verndert werden.

        Es folgt eine vollstndige Liste der verfgbaren Optionen fr
        diese Anweisung.


       _@_(_X_P_O_S_,_Y_P_O_S_)

        legt eine neue Ausgabeposition fest.  XPOS und YPOS geben dabei
        die Position auf dem Label in DOT an.

        Ohne diese Option erfolgt die Ausgabe bezogen auf die aktuelle
        Cursorposition.

       _._h_c_e_n_t_e_r

        bestimmt, da nicht der linke Rand, sondern die Mitte des Bildes
        als Ankerpunkt in X-Richtung fr die Ausgabe verwendet wird.

       _._v_c_e_n_t_e_r

        bestimmt, da nicht der obere Rand, sondern die Mitte des Bildes
        als Ankerpunkt in Y-Richtung fr die Ausgabe verwendet wird.

       _._c_e_n_t_e_r

        ist eine Kombination aus `.hcenter' und `.vcenter': das EPS-Bild
        wird mit seinem Mittelpunkt an der angegebenen Koordinate
        ausgegeben.

       _._h_s_k_i_p

        Nach der Ausgabe des Bildes wird der Cursor um die exakte
        Bildbreite nach rechts bewegt. Normalerweise wird der Cursor
        nicht bewegt.

       _._v_s_k_i_p

        Nach der Ausgabe des Bildes wird der Cursor um die exakte
        Bildhhe nach unten bewegt. Normalerweise wird der Cursor nicht
        bewegt.


     ..eeppss cclloossee
        Diese Anweisung schliet eine offene EPS-Datei.  Erst danach
        kann wieder eine neue EPS-Datei verwendet werden.


  33..11..66..  PPrrpprroozzeessssoorr--AAnnwweeiissuunnggeenn

  Zeilen, die mit einem `#' beginnen, sind Prprozessoranweisungen.  Sie
  werden direkt beim Einlesen des Quelltextes ausgefhrt.

  Derzeit sind folgende Prprozessoranweisungen definiert:


     ##iinncclluuddee FFIILLEENNAAMMEE[[..EEXXTT]]
        Fgt die angegebene Datei an der aktuellen Stelle in den
        Quelltext ein.  Fehlt die Erweiterung, so wird implizit `.lpi'
        angenommen.

  33..22..  TTeexxttuueellllee EErrsseettzzuunngg

  Jede Zeile der Eingabedatei wird vor der Interpretation auf darin
  enthaltene Ersetzungsmarken untersucht.  Werden solche Marken
  gefunden, so wird eine entsprechende Ersetzung durchgefhrt, d.h. jede
  Marke wird durch jeweils aktuell gltigen Text ersetzt.  Die
  Ersetzungsmarke wird durch den Backslash `\' eingeleitet.

  Folgende Ersetzungen sind derzeit definiert:


     ``\\\\''
        erzeugt einen einzelnen Backslash.


     ``\\00''
        liefert den Namen des aktuellen Moduls.


     ``\\NN'',, mmiitt NN==``11''....``99''
        liefert den Parameter `N' des aktuellen Moduls.


     ``\\##''
        liefert die Anzahl der Parameter.


     ``\\??''
        liefert den Returncode des letzten Moduls.


     ``\\@@NN'',, mmiitt NN==``00''....``99''
        liefert Feld `N' aus dem aktuellen Datensatz.


     ``\\@@##''
        liefert die Anzahl der Felder im aktuellen Datensatz.


     ``\\@@$$''
        liefert die Datensatznummer der aktuellen Datenbank.


     ``\\@@??''
        liefert den EOF-Status der aktuellen Datenbank.


     ``\\((IIDD))''
        liefert den Inhalt des Symbols ID.


     ``\\{{EEXXPPRR}}''
        liefert das Resultat des angegebenen Ausdrucks.


     ``\\[[EENNVV]]''
        liefert den Inhalt der Environmentvariable ENV.

  33..33..  AAuusswweerrttuunngg vvoonn AAuussddrrcckkeenn

  An vielen Stellen innerhalb der Punktanweisungen ist ein Ausdruck
  erlaubt.  Dieser besteht aus Operanden, die durch Operatoren
  miteinander verknpft werden.

  Als Operanden sind Textkonstanten, numerische Konstanten, Symbole,
  Systemvariablen und Systemfunktionen erlaubt.  Verknpft werden diese
  durch arithmetische, logische oder Vergeichsoperatoren.

  Jeder Ausdruck liefert als Ergebnis einen Wert und einen Typ, Text
  oder numerisch.

  Man unterscheidet normale, logische, numerische und Text-Ausdrcke:


    Normale Ausdrcke drfen einen beliebigen Typ liefern.

    Textausdrcke mssen einen String als Ergebnis liefern.

    Numerische Ausdrcke mssen eine Zahl als Ergebnis liefern.

    Logische Ausdrcke sind numerische Ausdrcke, bei denen der Wert
     Null als logisch `falsch', und alle anderen Werte als logisch
     `wahr' betrachtet werden.


  Hier eine Liste der z.Z. definierten Operatoren, deren Bedeutung
  weitgehend denjenigen der gleichlautenden C-Operatoren entspricht:

  Vergleich: `=', `<>', `<', `<=', `>', `>='

  Numerisch: `+', `-', `*', `/', `%'

  Logisch: `&', `|', `&&', `||', `!'

  Sonstiges: `#' wandelt den folgenden Faktor, soweit mglich, in eine
  Zahl um.

  Folgende Systemvariablen und -funktionen sind derzeit definiert:



     $$bbaasseelliinnee
        liefert den Abstand der Baseline zur Oberkante der `bounding
        box' des derzeit selektierten Font in DOT.

     $$bbaattcchhmmooddee
        liefert die Information, ob LPU aktuell in Batchmode lft.


     $$ccoonnccaatt((SSTTRRIINNGG,, SSTTRRIINNGG {{,, SSTTRRIINNGG}}))
        haengt zwei oder mehr Strings aneinander.


     $$ccoouunntt
        liefert innerhalb von `.repeat'-Anweisungen einen
        Schleifenzhler.


     $$ddbbfflldd((DDBB,, FFLLDD))
        liefert den Inhalt von Feld FLD des aktuellen Datensatzes von
        Datenbank DB.


     $$ddbbffllddss((DDBB))
        liefert die Anzahl der Felder im aktuellen Datensatz der
        Datenbank DB.


     $$ddoottss((EEXXPPRR))
        wertet einen Ausdruck vom Typ `UNIT' aus, und liefert dessen
        Wert in DOTs zurck.

        Der Ausdruck kann vom Typ INT oder FLOAT sein, und eine
        nachgestellte Einheit besitzen.  Als Ergebnis wird in jedem Fall
        ein INT-Wert mit der entsprechenden Anzahl DOTs geliefert.


     $$eeoodd((DDBB))
        liefert den Status `Dateiende' fr die angegebene Datenbank.


     $$eeppss{{AATTTTRR}}
        liefert einen Attributwert fr die derzeit offene EPS-Datei.

        Derzeit sind folgende Attribute definiert:


       _x_s_i_z_e

        liefert die Originalbreite des EPS-Datei in DOT.

       _y_s_i_z_e

        liefert die Originalhhe des EPS-Bildes in DOT.


     $$ffllooaatt((EEXXPPRR))
        wertet den Ausdruck EXPR aus, und wandelt das Ergebnis in einen
        Wert vom Typ T_FLT um.  Kann der Resultattyp nicht umgewandelt
        werden, tritt ein Fehler auf.


     $$ffoonntthheeiigghhtt
        liefert die Hhe des derzeit selektierten Font in DOT.


     $$ffoorrmmccnntt
        liefert die Anzahl der in der TAB-Datenbank definierten
        Formtypen.


     $$ffoorrmmiidd((FFNNRR))
        liefert den Namen der Form mit der Nummer FNR.

        FNR luft von 0 bis `$formcnt-1'. Die spezielle Angabe `.'
        bezieht sich auf die aktuell selektierte Form.


     $$ggeennddaattee
        liefert einen String-Wert mit dem Datum der Generierung von LPU.


     $$iissnnuumm((VVAARR))
        testet, ob die angegebene Variable vom Typ `numerisch' ist.


     $$iissssttrr((VVAARR))
        testet, ob die angegebene Variable vom Typ `text' ist.


     $$iissvvaarr((VVAARR))
        testet, ob eine Variable mit dem angegebenen Namen existiert.


     $$llbbllccnntt((FFNNRR))
        liefert die Anzahl der _v_e_r_s_c_h_i_e_d_e_n_e_n Labeltypen, die in der
        angegebenen Form definiert sind.

        Zu FNR siehe bei $formid.


     $$llbblliidd((FFNNRR,, LLNNRR))
        liefert den Namen von Labeltyp LNR in Form FNR.

        Zu FNR siehe bei $formid.

        LNR luft von 0 bis `$lblcnt(FNR)-1'. Die spezielle Angabe `.'
        bezieht sich auf den aktuell selektierten Labeltyp.


     $$llbbllxxccnntt((FFNNRR,, LLNNRR))
        liefert die Anzahl von identischen Labeln von Typ LNR in Form
        FNR, die innerhalb einer Form _n_e_b_e_n_e_i_n_a_n_d_e_r liegen.

        Zu FNR siehe bei $formid.  Zu LNR siehe bei $lblid.


     $$llbbllyyccnntt((FFNNRR,, LLNNRR))
        liefert die Anzahl von identischen Labeln von Typ LNR in Form
        FNR, die innerhalb einer Form _u_n_t_e_r_e_i_n_a_n_d_e_r liegen.

        Zu FNR siehe bei $formid.  Zu LNR siehe bei $lblid.


     $$llttrriimm((SSTTRR))
        entfernt alle fhrenden Blanks aus dem String STR.


     $$nnooww
        liefert die aktuelle Zeit als ANSI-Timestamp.  (Integerwert, der
        die seit Beginn der `Epoche' (01.01.1970, 00:00 GMT) vergangene
        Zeit in Sekunden enthlt).


     $$oodddd((EEXXPPRR))
        liefert die Information, ob das Ergebnis der Auswertung von EXPR
        ungerade ist. Diese Funktion ist nur fr Ausdrcke vom Typ T_NUM
        definiert, und liefert anderenfalls einen Fehler.


     $$ppaarraamm((NN))
        liefert den aktuellen Inhalt von Parameter `N'.

        Der Wert von N kann im Bereich 0..$parcnt liegen.  `0' liefert
        dabei den Prozedurnamen, 1..$parcnt den aktuellen Wert des
        angegebenen Parameters.


     $$ppaarrccnntt
        liefert die aktuelle Anzahl von Parametern.


     $$rrcc
        liefert den Status der letzten `return'-Anweisung.


     $$rrttrriimm((SSTTRR))
        entfernt alle folgenden Blanks aus dem String STR.


     $$ssttrr((VVAALL,, LLEENN[[,, DDEECC]]))
        wandelt den Zahlenwert VAL in einen formatierten String der
        Mindestlnge LEN um. Ist der Wert DEC angegeben, und ist er
        grer Null, so wird vor den letzten DEC Stellen ein
        Dezimalpunkt eingefgt.


     $$ssttrrffttiimmee((TTIIMMEE,, FFOORRMMAATT))
        erzeugt einen String mit einer formatierten Zeitangabe.

        Der Parameter TIME enthlt einen ANSI-Timestamp, und in FORMAT
        wird der Formatstring angegeben; dieser entspricht dem
        Formatstring der gleichnamigen C-Funktion.


     $$ssttrrlleenn((SSTTRRIINNGG))
        liefert die Anzahl der Zeichen im angegebenen String.


     $$ssttrrppaadd((SSTTRRIINNGG,, PPAATT,, LLEENN))
        liefert einen String der Lnge LEN, indem der String STRING
        durch wiederholtes Anhaengen des Strings PAT auf die angegebene
        Lnge gebracht wird. Ein zu langer String wird entsprechend
        abgeschnitten.


     $$ssttrrrreepp((SSTTRRIINNGG,, CCOOUUNNTT))
        liefert einen String, der durch die COUNT-malige
        Aneinanderreihung von STRING erzeugt wird.


     $$ssttrrsseegg((SSTTRRIINNGG,, PPOOSS,, LLEENN))
        liefert einen Ausschnitt des angegebenen Strings, beginnend mit
        POS (ab 0), und mit der Lnge LEN Zeichen.

        Ist LEN negativ, so werden die letzten `abs(LEN)' Zeichen des
        Strings geliefert, jedoch keinesfalls vor Zeichen POS des
        Strings beginnend.


     $$ssttrrssttrr((SSTTRRIINNGG,, PPAATT))
        liefert den Offset, an dem der String PAT erstmals in STRING
        vorkommt (>=0), oder -1, falls das Pattern nicht gefunden wird.
     $$ssttrrttookk(([[SSTTRR,,]] LLIIMM))
        liefert das erste bzw. nchste Token aus dem String STR.  Der
        erste Aufruf der Funktion erfolgt in der Form



                $strtok(STR, LIM)





     Damit wird der String STR intern abgelegt, und der Anfang von STR
     bis zum ersten Auftreten eines Zeichens aus dem String LIM wird
     zurckgegeben.

     Alle folgenden Aufrufe sollten dann in der Form



                $strtok(LIM)





     erfolgen.  Damit wird das nchste Teil des gespeicherten Strings
     STR, diesmal bis zum ersten Auftreten eines Zeichens aus dem
     aktuell bergebenen String LIM, zurckgegeben.

     Dieser Vorgang wiederholt sich solange, bis der gesamte String in
     einzelnen Portionen zurckgegeben wurde.  Alle folgenden Aufrufe
     liefern dann nur noch einen Leerstring zurck.


     $$ssttrrwwiidd((SSTTRR))
        liefert die Breite des angegebenen Strings fuer den aktuellen
        Font in DOTs.


     $$ttrriimm((SSTTRR))
        entfernt alle fhrenden und folgenden Blanks aus dem String STR.


     $$vveerrssiioonn
        liefert die aktuelle LPU-Version als String zurck.


     $$xxbbaassee
        liefert den horizontalen Offset des aktuellen Fensters innerhalb
        des Labels in DOT.


     $$xxppooss
        liefert die horizontale Position des Cursors im aktuellen
        Fenster in DOT.


     $$xxssiizzee
        liefert die Breite des aktuellen Fensters in DOT.


     $$yybbaassee
        liefert den vertikalen Offset des aktuellen Fensters innerhalb
        des Labels in DOT.

     $$yyppooss
        liefert die vertikale Position des Cursors im aktuellen Fenster
        in DOT.


     $$yyssiizzee
        liefert die Hhe des aktuellen Fensters in DOT.


  44..  SSoonnssttiiggeess

  44..11..  DDeerr DDeebbuuggggeerr

  Seit der Version 0.9-15 verfgt LPU ber einen einfachen Debugger.  Er
  dient der Fehlersuche in LPU-Programmen und - zumindest vorerst - auch
  in LPU selbst.

  Der Debugger kann an jeder beliebigen Stelle innerhalb eines LPU-
  Programms aufgerufen werden. Dies geschieht durch Einfgen der
  Anweisung `.stop'.  Zustzlich kann - beginnend mit Version 0.9-23 -
  der Debugger durch drcken von `CTRL-C' bei laufendem LPU-Programm
  aufgerufen werden.

  Von diesem Moment an wird vor der Ausfhrung einer jeden LPU-Anweisung
  die Anweisung selbst, und ein Prompt ausgegeben. Anschlieend wird
  eine Eingabe erwartet, die mit ENTER abgeschlossen werden mu.  Diese
  Eingabe wird als Debugger-Anweisung interpretiert und ausgefhrt.

  Folgende Debugger-Anweisungen sind derzeit definiert:


     ??  Es wird eine Liste aller erlaubten Debugger-Anweisungen
        ausgegeben.


     aa VVAARR == EEXXPPRR
        Berechnet den Ausdruck EXPR und weist das Ergebnis der Variablen
        VAR zu.


     cc  Gibt den aktuellen Aufrufstack aus.


     ee EEXXPPRR
        Berechnet den Ausdruck EXPR und zeigt das Ergebnis an.


     gg  Go. Die normale Programmausfuehrung wird wieder aufgenommen,
        d.h., der Debugger wird ausgeschaltet.


     qq  Quit. Verlt LPU.


     ww  EXPR { , EXPR }

        Watch. Definiert eine Liste von berwachungs-Anweisungen.
        Nheres siehe beim Befehle `.watch'.


     EENNTTEERR
        Die Leereingabe fhrt die nchste LPU-Anweisung aus, und geht
        anschlieend fr die nchste Anweisung wiederum in den Debugger.

  Die LPU-Anweisung `.cont' schaltet ebenfalls wieder in den normalen
  Betriebsmodus, und beendet damit den Debug-Modus.
  44..22..  TTrraacciinngg

  Der oben beschriebene Debugger ist zwar recht gut geeignet, um einen
  konkreten Fehlerfall zu untersuchen, es ist jedoch recht mhsam, sich
  im Einzelschritt ber eine evtl. recht lange Anweisungsfolge bis zur
  eigentlichen Fehlerstelle durchzusteppen.

  Genau diesem Zweck dienen die Trace-Ausgaben. Sie werden mit `.tron'
  ein- und mit `.troff' ausgeschaltet.

  Ist das Tracing aktiviert, so werden alle Anweisungen, die ausgefhrt
  werden, zuvor nach STDERR ausgegeben.  Ist eine sog. `Watchlist'
  definiert (durch das Debugger-Kommando `w' oder den LPU-Befehl
  `.watch'), so werden hier auch die entsprechenden Ausdrcke berechnet
  und ausgegeben.  Dadurch kann man die Stelle, an der ein Fehlverhalten
  auftritt, meist sehr schnell einkreisen.  Anschlieend kann man dann
  z.B. unmittelbar vor der kritischen Stelle ein `.stop' einfgen, und
  die Stelle mit dem Debugger nher untersuchen.

  Auch die Anweisung `.debug' kann in diesem Zusammenhang hilfreich
  sein.

  55..  SScchhlluubbeemmeerrkkuunnggeenn

  LPU befindet sich derzeit in der Entwicklung.  So ist z.B. der genaue
  Sprachumfang noch nicht endgltig definiert.

  Das Programm sollte daher mit der ntigen Vorsicht eingesetzt werden.
  Auch kann es durchaus zu Unterschieden zwischen der Dokumentation und
  dem Verhalten der Software kommen.

  Anregungen, Fehlermeldungen, konstruktive Kritik und sonstiges
  Feedback sind jederzeit willkommen.

  Die Adresse dafr lautet:



           John R. Schrader
           jrschrader@mainz-online.de


























