[Tustep-Liste] TUSTEP erweitern, vereinfachen

Kuno Sch�lkle Schaelkle at zdv.uni-tuebingen.de
Di Nov 30 12:01:06 CET 2004


Lieber TUSTEPler,

vor laengerer Zeit schrieb Herr Stahl:

> ich habe mehrere gro^se TeX-Dateien, die ich
> nach Tustep importieren m^ochte und deren
> TeX-Befehle in Tustep/Html-Tags ausgetauscht
> werden sollen. Nun ist das Austauschen von
> Befehlen wie
>
>   "\par" zu "<p>"
>
> kein Problem. Schwierigkeiten habe ich jedoch
> mit den geschweiften Klammern, die den Text
> durchsetzen:
>
>   {\it kursiver Text {\bf eingeschobener fett
>   gedruckter Text} Kursive endet mit Klammer}.
>
> Das kann dann auch z.B. so aussehen:
>
>   {\it kk {\bf ff} kk {\bf ff}}. nnn {\it kkk}.
>
> und soll werden zu
>
>   <i>kk <b>ff</b> kk <b>ff</b></i>. nnn <i>kkk</i>.

Ich antwortete ihm:

> folgende Parameter sollten das Problem l^osen.
>
> #ko,d,h,,+,*
> >0z       <%><{}
> xx    1   :{\it <>>0}:<<i>> >=06 <</i>>:
> xx    1   :{\bf <>>0}:<<b>> >=06 <</b>>:
> xx    2 = xx    1
> *eof
>
> Voraussetzung ist jedoch, dass zusammengeh^orende
> Klammern innerhalb der gleichen Texteinheit stehen.
> Ggf. muss z.B. der Parameter AA erg^anzt werden.
>
> Falls die Schachtelungstiefe mehr als zwei ist, m^ussen
> entsprechend weitere Parameter angegeben werden:
>
> xx    3 = xx    1
> xx    4 = xx    1
> ...

An dieser Loesung wurde auf der letzten ITUG-Tagung
bemaengelt, dass die Schachtelungstiefe in den
Parametern beruecksichtig werden muesse. Deshalb
hier eine modifizierte Loesung, bei der die Schachtelungs-
tiefe keine Rolle spielt:

#ko,q,zz,,+,*
>0z       <%><{}
zf+       :{\it <>>0}:
zf+       :{\bf <>>0}:
spn        3
xx        :{\it <>>0}:<<i>> >=06 <</i>>:
xx        :{\bf <>>0}:<<b>> >=06 <</b>>:
sp2       11
*eof

Stehen zusammengehoerende Klammern nicht im gleichen
Satz sind die Parameter AA / AE erforderlich.
Muss dann die Satznummerierung und Zeileneinteilung
beibehalten werden, wird es etwas aufwendiger.
Fuer diesen Fall eine ganz andere Loesung, mit der vielleicht
auch Script-Sprachen-Fans etwas anfangen koennen:

Im folgenden Makro werden die Daten portionsweise
eingelesen. Eine neue Portion beginnt jeweils
1) mit jedem neuen Satz
2) vor jeder Anfangskennung
3) nach jeder Endekennung

Beispiel:
Anfangskennung sei [a], Endekennung sei [e].
Dann ergeben sich aus den Eingabedaten
   eins [a] zwei [e] drei [a] vier [a] fuenf [e] sechs
   sieben [e] acht
folgende Portionen:
  eins
  [a] zwei [e]
  drei
  [a] vier
  [a] fuenf [e]
  sechs
  sieben [e]
  acht

Als Anfangskennung und Endekennung koennen jeweils
mehrere Zeichenfolgen definiert werden. Im Makro
geschieht dies mit den Tabellen atab und etab.
Die Anfangskennung, der Text und die Endekennung
werden jeweils in eine eigene Variable abgespeichert.
Im Makro sind dies die Varialben aken, text und eken.
Die Variablen typ und anz sind syntaktisch erforderlich,
werden aber in diesem Makro nicht weiter benoetigt.

01: $$! quelle, ziel
02: $$=- []
03: MODE VARIABLE

04: SET status = CHECK (quelle, READ, TUSTEP)
05: ERROR/STOP status
06: SET status = CHECK (ziel, WRITE, TUSTEP)
07: ERROR/STOP status

08: BUILD S_TABLE atab = ":{\it :{\bf :"
09: BUILD S_TABLE etab = ":}:"
10: BUILD X_TABLE xtab = ":{\it :<<i>>:{\bf :<<b>>:"

11: ACCESS q: READ/STREAM/RECORDS "[quelle]" s.z/u, aken/atab+txt+eken/etab, typ
12: ACCESS z: WRITE/ERASE/STREAM "[ziel]" s.z/u, aken+txt+eken, anz

13: SET tags = ""

14: LOOP
15:    READ q
16:    IF (EOF)  EXIT
17:    IF (aken.NE."")  THEN
18:       SET aken = EXCHANGE (aken, xtab)
19:       SET tags = INSERT (tags, 1, aken)
20:    ENDIF
21:    IF (eken.NE."")  THEN
22:       SET tags = REMOVE (tags, 1, tag)
23:       SET eken = END_TAG (tag)
24:    ENDIF
25:    WRITE z
26: ENDLOOP

27: ENDACCESS q
28: ENDACCESS z

04: Quelldatei prüfen
05: Makro ggf. mit Fehlermeldung beenden
06: Zieldatei prüfen
07: Makro ggf. mit Fehlermeldung beenden
08: Tabelle mit den Anfangskennungen
09: Tabelle mit den Endekennungen
10: Tabelle Anfangskennungen --> Anfangstags
11: Quelldatei öffnen
12: Zieldatei öffnen
13: Variable tags = "", d.h. keine Tags offen
15: aken+text+eken einlesen
16: Wenn Dateiende erreicht: fertig
17: Wurde eine Anfangskennung gelesen?
18: Anfangskennung gegen entspr. Tag austauschen
19: Tag in der Variablen tags merken
21: Wurde eine Endekennung gelesen?
22: Jeweils aktuelles Tag nach tag und in tags löschen
23: Aus dem Tag entspr. Endetag bilden
25: eken+text+eken ausgeben
27: Quelldatei schließen
28: Zieldatei schließen

Dieses Makro laeuft mit der Version 2005 leider so noch nicht,
sondern nur mit einer Testversion, die fuer Interessierte zum
Testen und Fehlerfinden zur Verfuegung steht.

Mit freundlichen Gruessen
Kuno Schaelkle


Mehr Informationen über die Mailingliste Tustep-Liste