summaryrefslogtreecommitdiff
path: root/support/dbtex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dbtex
Initial commit
Diffstat (limited to 'support/dbtex')
-rw-r--r--support/dbtex/dbtex.awk246
-rw-r--r--support/dbtex/dbtex.dvibin0 -> 73432 bytes
-rw-r--r--support/dbtex/dbtex.tex1024
-rw-r--r--support/dbtex/dbtexsrc.tex249
-rw-r--r--support/dbtex/germtex.tbl8
-rw-r--r--support/dbtex/read.me18
-rw-r--r--support/dbtex/refman.sty492
-rw-r--r--support/dbtex/tex.tbl10
-rw-r--r--support/dbtex/tgrindn.sty179
-rw-r--r--support/dbtex/verbatim.sty42
10 files changed, 2268 insertions, 0 deletions
diff --git a/support/dbtex/dbtex.awk b/support/dbtex/dbtex.awk
new file mode 100644
index 0000000000..9f6666cc7f
--- /dev/null
+++ b/support/dbtex/dbtex.awk
@@ -0,0 +1,246 @@
+# dbTeX.awk - a simple preprocessor for generating TeX output from
+# database files
+# Version 1.1.beta (1991-02-12) dr. w. kraml, KPMG Alpen-Treuhand Wien
+# see dbTeX.tex for documentation!
+
+
+BEGIN { console_msg("This is dbTeX Version 1.1.beta (1991-02-12)")
+ printf("%% dbTeX (1.1.beta) Output generated " ctime() "\n")
+ # ^ PolyAwk specific!
+ printf("%% dbTeX Input file: %s\n", ARGV[1])
+# a number of initialisations and defs follow here:
+ FieldS = FS
+ RecordS = RS
+ NRincluded = 0
+ example_flag = 0
+ buffer = ""
+ STANDARD = 0
+ STRING = 1
+ TEMPLATE = 2
+ ID = 3
+ USER = 1
+ }
+
+
+# main loop - do this for each line in script
+
+{ if ($0 ~ /^%!/) { # embedded dbTeX-command
+ in_template = 0
+ buffer = substr($0,3)
+ print $0 # output for reference
+ dbTeX_command()
+ }
+ else if ($0 ~ /^%_/) { # template contin. line
+ print $0
+ if (in_template) { # start cont. with newlines
+ nl = length(template[t_name]) ? "\n" : ""
+ template[t_name] = template[t_name] nl substr($0,3)
+ }
+ else error_msg("INVALID CONTINUATION")
+ }
+ else if (example_flag) { # embedded examples
+ in_template = 0
+ print "%" $0
+ }
+ else {
+ in_template = 0
+ print $0 # original TeX line
+ }
+}
+
+END { s = NR " line(s) input, " NRincluded " record(s) included, "
+ s = s (errors+0) " error(s)"
+ info_msg(s)
+ }
+
+
+
+# functions performing helpful tasks with various messages
+
+function console_msg(s) { # output to console
+ print s > "/dev/tty"
+ }
+
+function error_msg(msg, s) { # print error on console
+ s = "% (dbTeX) Error: " msg "!" # and in output file
+ ++errors
+ print s
+ console_msg(s " -> line " NR ":")
+ console_msg($0)
+}
+
+function info_msg(msg, s) { # print info on console
+ s = "% (dbTeX) Info: " msg "." # and in output file
+ print s
+ console_msg(s)
+}
+
+
+# dbTeX functions
+
+function dbTeX_command() { # the dbTeX main function
+ advance(ID)
+ example_flag = 0
+ if (tok == "examples") example_flag = 1 # %! examples
+ else if (tok == "record") { # %! record <id> <FS> [<RS>]
+ if (advance(ID)) {
+ if (tok ~ /^%[0-9]+%$/) { # data-named template
+ templ_typ = 1
+ templ_field = substr(tok,2,length(tok)-2)
+ }
+ else { # script-named template
+ templ_typ = 0
+ templ_name = tok
+ }
+ }
+ FieldS = advance(STRING) ? tok : FS
+ RecordS = advance(STRING) ? tok : RS
+ }
+ else if (tok=="template") { # %! template <id> <template>
+ in_template = 1
+ if (advance(ID)) # get name
+ t_name = tok
+ if (advance(TEMPLATE))
+ template[t_name] = tok
+ }
+ else if (tok=="break") { # %! break %f% <id>
+ if (advance(ID)) {
+ if (tok ~ /^%[0-9]+%$/)
+ breakfield = substr(tok,2,length(tok)-2)
+ else
+ breakfield = tok
+ }
+ if (advance(ID))
+ breaktemplate[breakfield] = tok
+ if (advance(ID))
+ breakmode[breakfield] = 1
+ else breakmode[breakfield] = 0
+ }
+ else if (tok=="clearbreaks") { # %! clearbreaks
+ for (i in oldvalue)
+ delete oldvalue[i]
+ for (i in breaktemplate)
+ delete breaktemplate[i]
+ for (i in breakmode)
+ delete breakmode[i]
+ }
+ else if (tok=="translate") { # %! translate <id>
+ if (advance(ID))
+ set_translation(tok)
+ }
+ else if (tok=="change") { # %! change <s1> <s2>
+ add_trtbl(USER)
+ }
+ else if (tok=="include") { # %! include <filename>
+ if (advance(ID))
+ do_include(tok)
+ }
+ else error_msg("UNKNOWN COMMAND")
+}
+
+
+function advance(type, sep,pos) { # get next token of type
+ sub(/^[ \t]+/, "", buffer) # remove white space
+ if (type == ID) {
+ match(buffer, /^[^ \t]+/) # all up to white space
+ tok = tolower(substr(buffer, 1, RLENGTH)) # tolower(): PolyAwk & GNU only!
+ buffer = substr(buffer, RLENGTH+1)
+ return RLENGTH
+ }
+ else if (type == TEMPLATE) { # rest of line
+ tok = buffer
+ buffer = ""
+ return length(tok)
+ }
+ else if (type == STRING) { # string delimited by
+ sep = substr(buffer,1,1) # unique character
+ buffer = substr(buffer,2)
+ pos = index(buffer, sep)
+ if (pos) {
+ tok = substr(buffer,1,pos-1)
+ buffer = substr(buffer, pos+1)
+ return pos
+ }
+ else {
+ tok = ""
+ return 0
+ }
+ }
+ else return 0
+}
+
+
+function add_trtbl(tbl) { # add an entry to tr table
+ if (advance(STRING)) {
+ tmp = tok
+ if (advance(STRING))
+ tbl==USER ? (usr_tbl[tmp] = tok) : (std_tbl[tmp] = tok)
+ else
+ tbl==USER ? (usr_tbl[tmp] = "") : (std_tbl[tmp] = "")
+ }
+}
+
+
+function set_translation(id) { # install translation table
+ if (toupper(id) == "OFF") {
+ for (i in std_tbl)
+ delete std_tbl[i]
+ for (i in usr_tbl)
+ delete usr_tbl[i]
+ }
+ else { # read translation table
+ while ((status = getline line < id) > 0) {
+ buffer = line
+ if (buffer !~ /^#/)
+ add_trtbl(STANDARD)
+ }
+ if (status == -1)
+ error_msg("TRANSLATION TABLE " id " NOT FOUND")
+ }
+}
+
+
+function do_include(file) { # include records of <file>
+ old_FS = FS; old_RS = RS
+ FS = FieldS; RS = RecordS
+ inc = 0
+ while (getline < file > 0) {
+ for (i in breaktemplate) # check for breaks
+ if (oldvalue[i] != $i) {
+ oldvalue[i] = $i
+ if (inc || breakmode[i]) # no break before 1st rec.,
+ incl_(template[breaktemplate[i]])
+ } # if not explicitly wanted!
+
+ if (templ_typ)
+ incl_(template[$templ_field])
+ else incl_(template[templ_name])
+ ++NRincluded; ++inc
+ }
+ FS = old_FS; RS = old_RS
+ close(file)
+ if (!inc) error_msg("FILE " file " NOT FOUND OR NOT ACCESSIBLE!")
+ info_msg(inc " record(s) included from " file)
+}
+
+
+function incl_(t) { # include record with template t
+ s = ""
+ while (match(t, /%[0-9]+%/)) {
+ l = RSTART-1
+ s = s substr(t,1,l) txlate($(substr(t,RSTART+1,RLENGTH-2)))
+ # translated data field
+ t = substr(t,l+RLENGTH+1)
+ }
+ print s t
+}
+
+
+function txlate(s) { # perform translations on string s
+ for (target in std_tbl)
+ gsub(target, std_tbl[target], s)
+ for (target in usr_tbl)
+ gsub(target, usr_tbl[target], s)
+ return s
+}
+
diff --git a/support/dbtex/dbtex.dvi b/support/dbtex/dbtex.dvi
new file mode 100644
index 0000000000..7d76b0631e
--- /dev/null
+++ b/support/dbtex/dbtex.dvi
Binary files differ
diff --git a/support/dbtex/dbtex.tex b/support/dbtex/dbtex.tex
new file mode 100644
index 0000000000..744d9c35a6
--- /dev/null
+++ b/support/dbtex/dbtex.tex
@@ -0,0 +1,1024 @@
+\documentstyle[11pt,german,verbatim,tgrindn,refman]{article}
+\frenchspacing\tolerance 2000\setcounter{tocdepth}{2}
+\title{db\TeX{}\\Ein Pr"aprozessor f"ur den \TeX-Satz von Datenbanken\\
+{\it Reference Manual, Tutorial \& Programmdokumentation\\
+V.1.1 (Februar 1991)}}
+\author{W. Kraml\and KPMG Alpen-Treuhand Gesellschaft mbH\and
+Kolingasse 19, A-1090 Wien}
+
+\newcommand{\makelbl}[1]{\bf #1\hfil}
+\newcommand{\makelbli}[1]{\tt #1\hfil}
+\newcommand{\rahmen}[1]{\fbox{\parbox[t]{0.77\hsize}{\large\tt #1\hfil}}}
+
+\newcommand{\eintrag}[1]{\newpage\parindent 0pt\vspace*{10mm}%
+%\thispagestyle{headings}%
+%\sbox{\lauftitel}{\usebox{\logo} {\sl ATOM\/} {\tt Programmdokumentation}}%
+%\markboth{\mbox{\usebox{\lauftitel}}}{\mbox{\usebox{\lauftitel}}}
+{\Large\bf #1\par}\index{#1}\addcontentsline{toc}{subsection}{#1}\vspace{5mm}}
+
+\newenvironment{syntax}[1]{\vspace{3ex}\begin{list}{---}{\leftmargin 2.5cm\labelwidth 2.2cm
+\let\makelabel=\makelbl \labelsep 3mm \rightmargin 0pt \topsep 2ex \itemsep 4ex
+\parsep 0pt plus 0.2ex} % Ende der Listendeklaration
+\item[Syntax:] \rahmen{#1}\begin{list}% Listendef. f. Parameter
+{--}{\leftmargin 3.3cm \labelwidth 3.1cm
+\let\makelabel=\makelbli \labelsep 2mm\rightmargin 0pt \topsep 3ex \itemsep 3ex
+\parsep 0pt plus 0.1ex}}{\end{list}}
+
+\newenvironment{programm}{\begin{trivlist}\item[]\tt\obeylines\obeyspaces}%
+{\end{trivlist}}
+\newcommand{\beispiel}{\item[Beispiel:]}
+\newcommand{\hinweise}{\item[Hinweise:]}
+\newcommand{\siehe}{\item[Siehe auch:]}
+\setcounter{tocdepth}{1}
+%
+%
+\pagestyle{headings}
+%
+\begin{document}
+\maketitle
+\makeauthor
+\vfil
+\tableofcontents
+\newpage
+\section{Vorbemerkungen}
+
+Will man Daten aus einer Datenbank in ansprechender Form
+mit \TeX{} setzen (z.B. ein Telefonverzeichnis), so steht
+man vor der Wahl, diese Daten entweder manuell mit einem
+Texteditor mit den notwendigen \TeX-Kommandos zu versehen,
+oder ein Programm zu schreiben, welches die Daten liest und
+die Kommandos einf"ugt (eine besonders empfehlenswerte
+Programmiersprache f"ur solche Zwecke ist AWK, vgl. E.
+Neuwirth, Quick and Dirty Databases with Nice Output: AWK
+and \TeX, TUGboat 11(1990), No.~3 -- 1990 Conference
+Proceedings).
+
+W"ahrend die erste Methode bei gr"o"seren Datenmenge wohl sofort
+ausscheidet, hat auch die zweite einen gravierenden Nachteil: das Layout des
+Dokuments liegt quasi im Programm-Sourcecode verborgen. Sowohl
+die Erstellung des Layouts (in der Regel eine Reihe von
+Trial-and-Error-Zyklen von Editor, \TeX{} und Previewer bzw.
+Ausdruck) als auch sp"ater eventuell notwendige "Anderungen
+werden dadurch erschwert.
+
+Mit db\TeX{} wird ein dritter Weg vorgeschlagen. Ausgangspunkt
+ist ein Skript, welches seinerseits ein normales \TeX-Inputfile
+darstellt. Dieses Skript ist das Resultat der Layouterstellung
+und wird daher in der Regel auch einige Testdatens"atze enthalten.
+Innerhalb von \TeX-Kommentaren werden nun spezielle
+db\TeX-Befehle eingestreut, die unter anderem das Auskommentieren
+der urspr"unglichen Testdatens"atze und das Inkludieren der echten
+Datens"atze betreffen.
+
+Dieses Skript wird anschlie"send vom db\TeX-Pr"aprozessor
+abgearbeitet; dabei werden die speziellen db\TeX-Befehle
+interpretiert (also Musterdaten auskommentiert und echte Daten
+eingef"ugt), der Rest des Skriptfiles jedoch nicht ver"andert.
+Das Resultat ist die endg"ultige \TeX-Eingabedatei.
+
+Das Einf"ugen der Datens"atze geschieht unter Zuhilfenahme
+von "`Templates"', so da"s je nach Wunsch auch nur einzelne
+Datenfelder verwendet oder zus"atzliche Informationen
+innerhalb der Daten (z.B. \TeX-Makroaufrufe) eingef"ugt
+werden k"onnen.
+
+Ein kurzes db\TeX-Skript k"onnte etwa folgenderma"sen aussehen:
+
+\begin{verbatim}
+\documentstyle[12pt,german,a4]{article}
+\begin{document}
+normaler Text und TeX-Definitionen ...
+%! template %2%: %1% %2%, Tel. %3% %4% %5% %6% %7%\\
+%! examples
+Bauer: Fritz Bauer, Tel. 12 34 55\\
+Brown: Charly Brown, Tel. 34 55 66\\
+Becker: Biggy Becker, Tel. 56 77 88\\
+%! include adr.dat
+ev.weiterer Text hier ...
+\end{document}
+\end{verbatim}
+
+Nach Bearbeitung durch den db\TeX-Pr"aprozessor sieht die Datei
+dann so aus:
+
+\begin{verbatim}
+% dbTeX (1.1) Output generated Tue Nov 13 19:27:05 1990
+\documentstyle[12pt,german,a4]{article}
+\begin{document}
+normaler Text und TeX-Definitionen ...
+%! template %2%: %1% %2%, Tel. %3% %4% %5% %6% %7%\\
+%! examples
+%Bauer: Fritz Bauer, Tel. 12 34 55 \\
+%Brown: Charly Brown, Tel. 34 55 66 \\
+%Becker: Biggy Becker, Tel. 56 77 88 \\
+%! include adr.dat
+Alteisen: Richi Alteisen, Tel. 99 80 70 \\
+Artmann: Robby Artmann, Tel. 12 12 22 \\
+Brown: Conny Brown, Tel. 14 14 09 \\
+Lang: Fritz Lang, Tel. 77 66 55 \\
+Mayer: Rudi Mayer, Tel. 88 99 00 \\
+ev.weiterer Text hier ...
+\end{document}
+\end{verbatim}
+
+Das hier gezeigte Beispiel ist etwas vereinfacht, da man in
+der Praxis noch weitere db\TeX-Befehle ben"otigen wird.
+Die inkludierte Datei hat f"ur dieses Beispiel folgendes Aussehen:
+
+\begin{verbatim}
+Richi Alteisen 99 80 70
+Robby Artmann 12 12 22
+Conny Brown 14 14 09
+Fritz Lang 77 66 55
+Rudi Mayer 88 99 00
+\end{verbatim}
+
+
+F"ur die Realisierung einer ersten Version von db\TeX{} wurde die
+Sprache AWK verwendet, die sowohl f"ur einfache
+Datenmanipulationen als auch f"ur die Implementation von einfachen
+Interpretersprachen wie dem vorgestellten Pr"aprozessor ein sehr
+gut geeignetes Werkzeug ist. Im speziellen Fall wurde unter MS-DOS auf
+PolyAWK (von Sage Software, vormals Polytron)
+zur"uckgegriffen; da es f"ur diesen Implementation auch einen
+Compiler gibt, konnte das Programm auch problemlos als
+Stand-Alone-Version aufbereitet werden. Es sollte ohne
+wesentliche "Anderungen m"oglich sein, das Programm auch mit anderen
+AWK-Versionen zum Laufen zu bringen (z.B. mit GNU-AWK, das
+im Rahmen der Free Software Foundation erh"altlich ist).
+
+{\sl F"ur das vorliegende Programm und seine Dokumentation
+wird kein Copyright beansprucht; es soll im Gegenteil als
+Ausgangspunkt f"ur eigene Verbesserungen, Erg"anzungen,
+Erweiterungen und Experimente betrachtet werden. Aus diesem
+Grunde werden allerdings auch keine Verpflichtungen (zur
+Wartung, Fehlerbehebung oder Weiterentwicklung) "ubernommen.
+Der Autor ist allerdings sehr an Verbesserungsvorschl"agen
+oder Weiterentwicklungen interessiert und entweder
+schriftlich (unter der im Titel angegebenen Adresse) oder
+mit E-Mail (EARN: {\tt A7511daa @ awiuni11}) erreichbar.}
+
+\newpage
+\section{db\TeX -Aufruf}
+Der Programmaufruf ist davon abh"angig, ob der
+AWK-Interpreter aufgerufen wird oder eine kompilierte Form
+des Programms. Im ersten Fall lautet der Aufruf so:
+\begin{syntax}{awk -fdbtex.awk {\it input-file} > {\it output-file}}
+\item[{\it input-file}] Die Eingabedatei (db\TeX -Skript)
+\item[{\it output-file}] Die Ausgabedatei (sollte die Extension
+.tex aufweisen. da diese Datei mit \TeX{} gesetzt wird)
+\end{list}
+\end{syntax}
+Der Aufruf der kompilierten Form sieht folgenderma"sen aus:
+\begin{syntax}{dbtex {\it input-file} > {\it output-file}}
+\item[{\it input-file}] Die Eingabedatei (db\TeX -Skript)
+\item[{\it output-file}] Die Ausgabedatei (sollte die Extension
+.tex aufweisen, da diese Datei mit \TeX{} gesetzt wird)
+\end{list}
+\end{syntax}
+
+\newpage
+\section{db\TeX -Befehle}
+
+Jeder db\TeX -Befehl beginnt mit der Sequenz {\tt \%!};
+diese mu"s am Zeilenanfang stehen. Anschlie"send steht ein
+Schl"usselwort, das auch durch ein oder mehrere Blanks von
+der Anfangssequenz getrennt sein kann. In weiterer Folge
+k"onnen noch Argumente zu stehen kommen, die ebenfalls durch
+Blanks getrennt sind.
+
+Alle db\TeX -Befehle mit einer Ausnahme k"onnen nur eine Zeile lang
+sein; die Ausnahme ist der {\tt \%! template}-Befehl, bei
+dem auch Fortsetzungszeilen erlaubt sind. Diese
+Fortsetzungszeilen beginnen mit der Sequenz {\tt \%\_}.
+
+Da die db\TeX -Anfangssequenzen mit einem Prozentzeichen
+beginnen, wird eine solche Zeile von \TeX{} als Kommentar
+behandelt; es sind also sowohl das db\TeX-Skript als auch
+der von db\TeX{} erzeugte Output g"ultige \TeX-Eingabedateien.
+
+
+\eintrag{\%! break}
+Befehl zum Einf"ugen von Daten anl"a"slich eines
+Gruppenwechsels ("Anderung des Inhalts eines Feldes der zu
+inkludierenden Datei).
+\begin{syntax}{\%! break <num> <template-name> [<flag>]}
+\item[<num>] Eine Zahl, die auch in der Form {\tt \%n\%}
+geschrieben sein kann. Sie bezieht sich auf das Feld {\tt <num>}
+des zu inkludierenden Datenfiles.
+\item[<template-name>] Name des Templates, das in die
+Ausgabe eingef"ugt werden soll, wenn sich der Inhalt von
+Feld {\tt <num>} "andert.
+\item[<flag>] Beliebiges Symbol bzw. beliebige Zeichenkette; wenn dieses Flag
+vorhanden ist, wird schon {\em vor} dem ersten einzuf"ugenden Datensatz
+das Template eingef"ugt (z.B. als "Uberschrift etc.).
+\end{list}
+\beispiel
+\begin{programm}
+\%! break 2 tabellenende
+\end{programm}
+Falls sich der Inhalt des zweiten Feldes "andert, soll das
+Template {\tt tabellenende} benutzt werden (da kein Flag vorhanden ist,
+wird vor dem ersten Datensatz kein Template eingef"ugt).
+\siehe clearbreaks, record, template
+\end{syntax}
+
+\eintrag{\%! change}
+Dieser Befehl dient zur Spezifikation einer
+Zeichenkettenersetzung. Es ist damit m"oglich, bestimmte
+Zeichenketten der Eingabedatei durch andere Zeichenketten
+zu ersetzen. Es k"onnen auf diese Weise z.B. bestimmte
+Zeichen, die in \TeX{} eigens kodiert werden m"ussen,
+"ubersetzt werden.
+\begin{syntax}{\%! change <string1> <string2>}
+\item[<string1>] Der zu ersetzende String. Er mu"s zwischen
+zwei Zeichen, die sonst nicht im String vorkommen und nicht
+Blank sein d"urfen, begrenzt werden.
+\item[<string2>] Der String, womit ersetzt werden soll. Die
+formalen Regeln sind analog zum vorhergehenden.
+\end{list}
+\beispiel
+\begin{programm}
+\%! change /TeX/ /$\backslash$TeX\{\}/
+\end{programm}
+Die Zeichenkette TeX in der Datenbankdatei soll durch das
+entsprechende \TeX -Makro ersetzt werden
+\siehe translate; Abschnitt \ref{idio}
+\end{syntax}
+
+\eintrag{\%! clearbreaks}
+Mit diesem Befehl werden die bisher spezifizierten
+Gruppenwechsel wieder gel"oscht.
+\begin{syntax}{\%! clearbreaks}
+\item (Dieser Befehl verwendet keine Argumente.)
+\end{list}
+\siehe break
+\end{syntax}
+
+\eintrag{\%! examples}
+Mit diesem Befehl wird db\TeX{} angezeigt, da"s die folgenden
+Zeilen im Skript als Beispielrecords zu verstehen sind: bei
+der Bearbeitung durch den Pr"aprozessor werden die folgenden
+Zeilen solange (durch ein Prozentzeichen am Zeilenanfang)
+auskommentiert, bis wieder ein db\TeX
+-Kommando erkannt wird. Dies wird in der Praxis meist ein
+{\tt \%!~include}-Kommando sein.
+\begin{syntax}{\%! examples}
+\item (Dieser Befehl verwendet keine Argumente.)
+\end{list}
+\siehe include
+\end{syntax}
+
+\eintrag{\%! include}
+Dieser Befehl veranla"st db\TeX{}, Datens"atze aus einer
+Datendatei zu lesen und in die Outputdatei einzuf"ugen.
+Dabei werden die einzelnen Felder der Datens"atze
+entsprechend einem Template eingef"ugt, dessen Name in einem
+{\tt \%! record}-Befehl angegeben und das in einem {\tt \%!
+template}-Befehl definiert wurde. Au"serdem werden eventuell
+Zeichenkettenersetzungen durchgef"uhrt, wenn mittels des
+{\tt \%! translate}-Befehls eine Ersetzungstabelle geladen
+wurde und/oder einzelne Ersetzungen in einem {\tt \%!
+change}-Befehl verlangt wurden. Der Wechsel im Inhalt eines
+Datenfeldes f"uhrt zur Ausgabe eines eigenen Templates, wenn
+dieses Datenfeld in einem {\tt \%! break}-Befehl
+referenziert wurde; damit lassen sich spezielle Aktionen
+anl"a"slich eines Gruppenwechsels steuern.
+
+\begin{syntax}{\%! include <filename>}
+\item[<filename>] Die Datei namens {\tt <filename>} enth"alt
+die zu inkludierenden Datens"atze.
+\end{list}
+\beispiel
+Im ersten Beispiel wird f"ur jeden Datensatz das Template
+{\tt t1} verwendet und die Datei {\tt xyz.dat} verwendet:
+\begin{programm}
+\%! record t1
+\%! template t1 $\backslash$datensatz\{Name: \%1\% \%3\%\}\{\%2\%\}
+\%! include xyz.dat
+\end{programm}
+
+Das zweite Beispiel zeigt, wie die Auswahl des Templates
+auch durch den Inhalt der Datei selbst bestimmt werden kann:
+\begin{programm}
+\%! record \%4\%
+\%! template name $\backslash$inclname\{\%1\%\}\{\%2\% \%3\%\}
+\%! template adr $\backslash$incladr\{\%3\% \%2\% \%1\%\}
+\%\_ \{\%4\% (Firma)\}
+\%! include adressen.dat
+\end{programm}
+\siehe record, template, translate, change, break
+\end{syntax}
+
+\eintrag{\%! record}
+Der {\tt \%! record}-Befehl spezifiziert, wie die S"atze aus
+der Datendatei einzulesen und in die Ausgabedatei zu
+inkludieren sind. Es wird damit festgelegt, welches
+Template und welcher Field-
+bzw. Record-Separator (entsprechend den AWK-Variablen
+FS und RS) zu verwenden ist.
+
+Das erste Argument ist entweder ein Name (der Name eines
+Templates oder eine Zahl n zwischen Prozentzeichen; in
+letzterem Fall wird erwartet, da"s in dem Feld n der
+Datendatei (vgl. AWK's {\tt \$n}) ein Name
+eines Templates steht. Damit ist es m"oglich, das zu verwendende
+Template durch die Daten zu definieren.
+
+\begin{syntax}{\%! record <id> [<field-sep> [<record-sep>]]}
+\item[<id>] Dies ist entweder ein Name, der einem
+Template-Namen entspricht, oder ein Verweis auf ein
+Datenfeld in der Form {\tt \%n\%}. In diesem Fall wird der
+Name des Templates f"ur den aktuellen Datensatz aus der
+Datei selbst, und zwar durch den Inhalt von Feld Nr. {\tt
+n} bestimmt.
+\item[<field-sep>] Dies ist ein String, der zwischen zwei
+Zeichen eingeschlossen sein mu"s, die nicht im String selbst
+enthalten sein und nicht Blank sein d"urfen. Er dient zur
+Festlegung jener Zeichen, die als Feldseparatoren dienen.
+Der Defaultwert ist (wie in AWK) Blank und Tab.
+\item[<record-sep>] Dieser String, f"ur den bez"uglich seines
+Aufbaus dasselbe gilt wie im vorigen Absatz, definiert den
+Recordseparator. Defaultwert ist Newline.
+\end{list}
+\beispiel
+Im folgenden Beispiel wird ein Feld der Datendatei
+spezifiziert, welches den Namen des Templates zu enthalten
+hat, und ein vom Default abweichender Feldseparator.
+\begin{programm}
+\%! record \%1\% /:::/
+\end{programm}
+\siehe include
+\end{syntax}
+
+\eintrag{\%! template}
+Mit diesem Befehl kann eine beliebige Anzahl von Templates
+definiert werden, die entweder als Schema zum Einf"ugen von
+Datens"atzen dienen oder anl"a"slich eines Gruppenwechsels
+verwendet werden. Die Positionen, an denen Daten aus dem
+aktuellen Satz der Datendatei stehen sollen, werden durch
+Platzhalter der Form {\tt \%n\%} markiert; es wird dort das
+Feld Nr. {\tt n} eingef"ugt.
+\begin{syntax}{\%! template <name> [<template>]}
+\item[<name>] Ein Name, "uber welchen das betreffende
+Template identifiziert wird.
+\item[<template>] Das Textmuster, welches Platzhalter
+der Form {\tt \%n\%} enthalten kann, und das f"ur jeden
+gelesenen Datensatz in die Ausgabedatei geschrieben wird,
+wobei die Platzhalter durch die aktuellen Werte aus der
+Datendatei ersetzt werden. Dieses Template kann auch
+mithilfe von Fortsetzungszeilen "uber mehrere Zeilen gehen.
+\end{list}
+\end{syntax}
+Die Fortsetzungszeilen haben folgende Struktur:
+\begin{syntax}{\%\_ <template>}
+\item[<template>] Textmuster mit Platzhaltern, siehe oben.
+\end{list}
+\beispiel
+Der im folgende Beispiel vorkommende Platzhalter {\tt
+\%0\%} bezieht sich auf den ganzen Datensatz (analog zu den
+Konventionen f"ur \$0 in AWK):
+\begin{programm}
+\%! template adresse Adresse: \%0\%
+\%\_ $\backslash$hline
+\end{programm}
+\siehe break, record, include
+\end{syntax}
+
+\eintrag{\%! translate}
+
+Mit diesem Befehl wird eine "Ubersetzungstabelle geladen,
+mit deren Hilfe Zeichenkettenersetzungen beim Einlesen des
+Datenfiles durchgef"uhrt werden. Zus"atzlich k"onnen einzelne
+Ersetzungen durch den {\tt \%! change}-Befehl spezifiziert
+werden.
+\begin{syntax}{\%! translate <tr-filename>}
+\item[<tr-filename>] Der Name der Datei, die die
+Ersetzungstabelle enth"alt. Diese Datei enth"alt Eintr"age
+entsprechend der Syntax des {\tt \%! change}-Befehls,
+allerdings ohne das Befehlswort selbst (die einzelnen
+Zeilen haben also die Struktur\\
+{\tt <string1> <string2>}\\
+wobei der erste String die zu ersetzende Kette und der
+zweite die Ersatzzeichenkette repr"asentiert). Wird anstelle eines
+Dateinamens das Schl"usselwort {\tt OFF} bzw. {\tt off}
+verwendet, so werden alle bisher geladenen
+"Ubersetzungstabellen gel"oscht.
+\end{list}
+\beispiel
+Das folgende Beispiel spezifiziert, da"s die Datei {\tt
+ascii.tbl} als "Ubersetzungstabelle verwendet werden soll.
+\begin{programm}
+\%! translate ascii.tbl
+\end{programm}
+\siehe change, include; Abschnitt \ref{idio}
+\end{syntax}
+
+\newpage
+\section{Besonderheiten, Probleme und Fehler}\label{idio}
+
+\subsection{AWK's Erbe}
+
+Die zur Implementation benutzte Sprache AWK liegt vielen
+Besonderheiten zugrunde; dies sind vor allem:
+\begin{itemize}
+\item Die Angabe von Feldern der einzuf"ugenden Datens"atze
+ist "ahnlich wie bei AWK: \%0\% bezieht sich auf den
+vollst"andigen Datensatz, \%1\%, \%2\% usw. beziehen sich
+auf die Felder 1, 2 etc. Dies ist mit den AWK-Konstrukten
+\$0, \$1, \$2 usw. zu vergleichen.
+\item Die Definitionen von "`Fieldseparator"' und
+"`Recordseparator"' entsprechen denen von AWK; dies hei"st
+insbesondere, da"s diese Zeichen(ketten) als (dynamische)
+regul"are Ausdr"ucke interpretiert werden.
+\item Das zuvor gesagte bezieht sich auch auf die
+Zeichenkettenersetzungen; die zu ersetzende Zeichenkette
+ist als regul"arer Ausdruck aufzufassen, und das Zeichen \&
+hat im Ersetzungtext die Funktion eines Platzhalters f"ur
+den gesamten Teilstring, der durch diesen regul"aren
+Ausdruck repr"asentiert wird, und ist deshalb als
+$\backslash$\& zu schreiben, wenn das \&-Zeichen selbst
+gemeint ist.
+\end{itemize}
+
+Diese "`ererbten Features"' sind allerdings keineswegs
+negativ zu verstehen; regul"are Ausdr"ucke etwa sind so
+m"achtige Formulierungsmechanismen, da"s man nur ungern auf
+sie verzichten will, wenn man sich einmal mit ihrer etwas
+willk"urlichen Syntax vertraut gemacht hat (und es liegt
+eben in der Natur von metasprachlichen Beschreibungen, da"s
+sie manchmal etwa kryptisch anmuten).
+
+\subsection{Zeichenkettenersetzungen}
+
+Die Ersetzungen werden als globales Suchen und Ersetzen
+hintereinander durchgef"uhrt; das hei"st, das das Ergebnis
+einer Ersetzung m"oglicherweise durch eine nachfolgende
+Ersetzung weiter ver"andert wird. Vor allem beim Ersetzen
+von ganzen Zeichenketten ist entsprechende Vorsicht geboten und
+aus diesem Grund k"onnen derzeit keine Backslashes ersetzt werden!
+
+Es werden zuerst die Ersetzungen aus den geladenen
+Tabellen und anschlie"send die des {\tt \%! change}-Befehls
+durchgef"uhrt.
+
+\subsection{Gruppenwechsel}
+Der derzeit vorhandene Mechanismus zur speziellen
+Behandlung von Gruppenwechsel ist ziemlich ad hoc
+entstanden; so wird z.B. nicht zwischen "`break before"'
+und "`break after"' unterschieden. Auch gibt es keine
+Mechanismen zur Erzeugung von Zwischensummen und "ahnlichem.
+
+\subsection{Robustheit}
+
+Der vorliegenden Version mangelt es sicherlich noch an
+Robustheit; so sind auch die Fehlermeldungen eher sp"arlich
+und vielleicht nicht immer sehr hilfreich. Manche Fehler
+werden "uberhaupt stillschweigend ignoriert, so z.B. Strings
+mit falschen oder fehlenden Delimitern, die zu h"ochst
+merkw"urdigen Resultaten f"uhren k"onnen.
+
+In der derzeitigen Form ist db\TeX{} "uberhaupt mehr als
+Prototyp zu verstehen; auch in bezug auf
+die eingebauten Features bzw. auf die Syntax sind mit
+Sicherheit Verbesserungen und Erweiterungen m"oglich bzw.
+w"unschenswert. db\TeX{} (bzw. seine Implementierung in AWK)
+l"adt zu Experimenten geradezu ein!
+
+\subsection{Bugs und ernste Probleme}
+
+Die mithilfe des PolyAWK Compilers Version 1.0 (von
+Sage-Polytron) "ubersetzte Version des Programms hat
+Probleme beim Inkludieren von etwas umfangreicheren
+Datenfiles (Fehlermeldung: "`out of memory"'); dies d"urfte
+an einer mangelhaften Implementierung der Garbage
+Collection in der Runtime-Library liegen, bei der
+Interpreter-Version wurde dieser Fehler nicht beobachtet.
+
+\subsection{Desiderata}
+
+Der Mechanismus zur Zeichenersetzung und derjenige f"ur den
+Gruppenwechsel sollte einer eingehenden Revision unterzogen
+werden!
+
+Eventuell sollte die Syntax etwas anders aussehen; es w"are
+z.B. durchaus m"oglich, den {\tt \%!~record}- und den {\tt
+\%!~include}-Befehl in einen einzigen Befehl zu integrieren!
+
+Umfassendere und genauere Fehlermeldungen!
+
+Es gibt derzeit keine M"oglichkeit, Suchpfade f"ur Daten-
+oder Tabellenfiles anzugeben; dies k"onnte eventuell "uber
+das Environment gesteuert werden oder "uber einen Aufrufparameter!
+
+\newpage
+\section{db\TeX -Fehlermeldungen}
+Alle Fehlermeldungen wie auch informative Meldungen werden
+sowohl direkt auf der Konsole ausgegeben als auch an der
+betreffenden Stelle als
+Kommentar in die Ausgabedatei "ubernommen.
+\subsubsection{Error: FILE \dots\ NOT FOUND OR NOT ACCESSIBLE!}
+Es wurde die in einem {\tt \%! include}-Befehl angegebene Datei
+entweder nicht gefunden oder sie konnte nicht zum Lesen
+ge"offnet werden.
+\subsubsection{Error: INVALID CONTINUATION}
+Es wurde eine Fortsetzungszeile ({\tt \%\_ \dots}) angetroffen, die nicht {\em
+unmittelbar nach} einem {\tt \%! template}-Befehl steht.
+\subsubsection{Error: TRANSLATION TABLE \dots\ NOT FOUND}
+Die spezifizierte Ersetzungstabelle wurde nicht gefunden
+und konnte daher nicht geladen werden.
+\subsubsection{Error: UNKNOWN COMMAND}
+Nach der db\TeX -Startsequenz {\tt \%!} steht ein
+unbekanntes Befehlswort.
+
+\newpage
+\section{Ein kurzes db\TeX-Tutorial}
+\subsection{Aufgabenstellung}
+Ausgehend von einer Adressendatei soll ein Adre"sbuch mit
+\TeX{} gesetzt werden; die Adressen kommen aus einer
+Datenbank und liegen im ASCII-Format vor, wobei jeder
+Datensatz aus mehreren Zeilen besteht und die einzelnen
+Datens"atze durch Leerzeilen getrennt sind. Die Datens"atze
+sind bereits richtig sortiert und haben folgende Struktur:
+\begin{verse}\tt
+Initialbuchstabe\\
+Sortierbegriff\\
+Name\\
+Adresse\\
+Postleitzahl und Ort\\
+Land\\
+Telefonnummer(n)
+\end{verse}
+
+Die ersten Datens"atze dieser Datei k"onnten etwa so aussehen:
+\begin{verbatim}
+A
+Alpen-Treuhand
+KPMG Alpen-Treuhand Ges.m.b.H
+Kolingasse 19
+1090 Wien
+Oesterreich
+34 36 45
+
+A
+Andersen
+Bente Gaarder Andersen
+The Norwegian Institute of Technology
+N-7034 Trondheim
+Norwegen
++47 7 59 26 95
+\end{verbatim}
+
+Das Adressenverzeichnis soll dann etwa folgenderma"sen aussehen:
+\newcommand{\aeintrag}[5]{\begin{minipage}{10cm}\begin{flushleft}
+{\bf #1}\\
+{#2}\\
+{#3 (#4)}\\
+{\small Tel:} #5\\\vspace{4mm}\end{flushleft}\end{minipage}\par}
+
+\pagebreak[3]\vspace{5mm plus 4mm}{\Huge $\cal A$}%
+ \nopagebreak\par\vspace{5mm plus 2mm}\nopagebreak
+\aeintrag{KPMG Alpen-Treuhand Ges.m.b.H}{Kolingasse 19}%
+ {1090 Wien}{"Osterreich}{34 36 45}
+\aeintrag{Bente Gaarder Andersen}{The Norwegian Institute of Technology}%
+ {N-7034 Trondheim}{Norwegen}{+47 7 59 26 95}
+
+\subsection{1. Schritt: Entwurf des Layouts in \TeX}
+Mithilfe von einigen Testdaten wird zuerst ein
+\TeX-Dokument erzeugt und das endg"ultige Layout festgelegt.
+Dies k"onnte in unserem einfachen Fall etwa so aussehen:
+
+{\small\begin{verbatim}
+\documentstyle[12pt,german]{article}
+\title{Meine wichtigsten Adressen von $\cal A-\cal Z$}
+\author{}\date{}
+\newcommand{\eintrag}[5]{\begin{minipage}{10cm}\begin{flushleft}
+{\bf #1}\\
+{#2}\\
+{#3 (#4)}\\
+{\small Tel:} #5\\\vspace{4mm}\end{flushleft}\end{minipage}\par}
+\begin{document}\parindent 0pt\raggedbottom
+\maketitle
+\vspace{5mm}{\Huge A}\par\vspace{5mm}
+\eintrag{Name}{Adresse}%
+{Ort}{Land}{Telefon}
+\eintrag{KPMG Alpen-Treuhand Ges.m.b.H}{Kolingasse 19}%
+{1090 Wien}{"Osterreich}{34 36 45}
+\end{document}
+\end{verbatim}
+}
+
+Dieses File wird nun gesetzt und eventuell so lange
+ge"andert, bis das Layout den W"unschen entspricht.
+
+\subsection{2. Schritt: db\TeX-Kommandos einf"ugen}
+db\TeX-Kommandos beginnen immer mit einem Prozentzeichen in
+der ersten Zeile, gefolgt von einem Ausrufzeichen (oder
+einem Underline im Falle von Fortsetzungszeilen). Damit
+sind sie f"ur \TeX{} nur gew"ohnliche Kommentare; jedes
+db\TeX-Skript ist daher auch ein syntaktisch korrektes
+\TeX-Inputfile.
+
+\subsubsection{Musterdaten wegkommentieren}
+Zuerst wollen wir angeben, welche Datens"atze nur als Muster
+in unserem Skript stehen; dazu f"ugen wir vor diesen den
+Befehl {\tt \%!~examples} ein.
+
+\subsubsection{Festlegen der Dateistruktur}
+db\TeX{} mu"s wissen, wie die einzulesende Datei in
+Datens"atze und jeder Datensatz wiederum in einzelne Felder
+aufzugliedern ist. Diese Angaben werden mit dem {\tt
+\%!~record}-Befehl gemacht, wobei ein Name f"ur den
+Datensatz definiert wird und weiters Zeichenketten, die als
+Trennung f"ur Datenfelder (in unserem Fall {\tt \dq$\backslash$n\dq} f"ur
+Newline) und Datens"atze dienen. Der vorliegende (Sonder-)Fall von
+Datens"atzen, die durch eine Leerzeile getrennt sind, wird
+durch den "`leeren"' String {\tt \dq\dq} festgelegt.
+Ganz allgemein gilt, da"s f"ur die Definition von Feld- und
+Record-Separatoren die selben Konventionen wie in der
+Sprache AWK gelten; es handelt sich dabei also jeweils um
+dynamische regul"are Ausdr"ucke, so da"s auch ziemlich
+komplexe Trennangaben definiert werden k"onnen. F"ur beide
+Delimiter gibt es auch Defaultwerte, und zwar {\tt
+\dq$\backslash$n\dq} (Zeilenende) f"ur den Recorddelimiter und
+{\tt \dq\ \dq} (Leerzeichen oder Tab) f"ur den
+Felddelimiter.
+
+\subsubsection{Erstellung eines Templates (Einf"ugeschablone)}
+Nun wei"s db\TeX{} zwar, wie die einzulesende Datei zu
+gliedern ist, aber noch nicht, in welcher Form diese Daten
+in die Ausgabedatei zu stellen sind. Daf"ur mu"s nun eine
+Schablone definiert werden, wozu der {\tt
+\%!~template}-Befehl dient. Dies ist eine beliebige
+Zeichenkette, die f"ur jeden Datensatz in die Ausgabedatei
+gestellt wird. Innerhalb dieses Templates k"onnen nun
+Platzhalter der Form {\tt \%\it n\tt\%} stehen. Diese
+Platzhalter werden durch die entsprechenden Datenfelder
+ersetzt, wobei {\it n} der Nummer des Datenfeldes
+entspricht. Ein Sonderfall ist die Nummer 0, die f"ur den
+{\it gesamten} Datensatz (inkl. der Feldtrennzeichen)
+steht. Diese Feldnumerierungskonventionen entsprechen
+wiederum der Sprache AWK (dort wird mit {\tt \$\it n} auf
+die Felder zugegriffen).
+
+Da Einf"ugemuster unter Umst"anden l"anger sein k"onnen und
+mehrere Zeilen beanspruchen k"onnen, sind daf"ur in db\TeX{}
+auch Fortsetzungszeilen vorgesehen, die mit der Sequenz
+{\tt \%\_} beginnen m"ussen.
+
+\subsubsection{Angabe der zu inkludierenden Datei}
+An der richtigen Stelle im Skript (meist nach den
+Musterdaten) ist nun anzugeben, welche Datei die zu
+inkludierenden Daten enth"alt, wobei hierf"ur der {\tt
+\%!~include}-Befehl verwendet wird.
+
+\subsubsection{Der Stand der Dinge bis hierher}
+Unser Skript sieht nun nach dem Einf"ugen der bisher
+besprochenen Kommandos folgenderma"sen aus:
+
+{\small\begin{verbatim}
+\documentstyle[12pt,german]{article}
+\title{Meine wichtigsten Adressen von $\cal A-\cal Z$}
+\author{}\date{}
+\newcommand{\eintrag}[5]{\begin{minipage}{10cm}\begin{flushleft}
+{\bf #1}\\
+{#2}\\
+{#3 (#4)}\\
+{\small Tel:} #5\\\vspace{4mm}\end{flushleft}\end{minipage}\par}
+\begin{document}\parindent 0pt\raggedbottom
+\maketitle
+% Struktur von Datei "`adressen": 7 Zeilen pro Record
+% 1. Initiale
+% 2. Sortierwort
+% 3. Name
+% 4. Adresse
+% 5. PLZ und Ort
+% 6. Land
+% 7. Telefon
+%! record adresse ''\n'' ''''
+%! template adresse \eintrag{%3%}{%4%}%
+%_ {%5%}{%6%}{%7%}
+%! examples
+\vspace{5mm}{\Huge A}\par\vspace{5mm}
+\eintrag{Name}{Adresse}%
+{Ort}{Land}{Telefon}
+\eintrag{KPMG Alpen-Treuhand Ges.m.b.H}{Kolingasse 19}%
+{1090 Wien}{"Osterreich}{34 36 45}
+%! include adressen
+\end{document}
+\end{verbatim}
+}
+
+Wird diese Datei mit db\TeX{} bearbeitet, so werden wir als
+Resultat folgende Datei erhalten:
+
+{\small\begin{verbatim}
+% dbTeX (1.1.beta) Output generated Tue Feb 12 12:27:11 1991
+% dbTeX Input file: adrex1.tex
+\documentstyle[12pt,german]{article}
+\title{Meine wichtigsten Adressen von $\cal A-\cal Z$}
+\author{}\date{}
+\newcommand{\eintrag}[5]{\begin{minipage}{10cm}\begin{flushleft}
+{\bf #1}\\
+{#2}\\
+{#3 (#4)}\\
+{\small Tel:} #5\\\vspace{4mm}\end{flushleft}\end{minipage}\par}
+\begin{document}\parindent 0pt\raggedbottom
+\maketitle
+% Struktur von Datei "`adressen": 7 Zeilen pro Record
+% 1. Initiale
+% 2. Sortierwort
+% 3. Name
+% 4. Adresse
+% 5. PLZ und Ort
+% 6. Land
+% 7. Telefon
+%! record adresse ''\n'' ''''
+%! template adresse \eintrag{%3%}{%4%}%
+%_ {%5%}{%6%}{%7%}
+%! examples
+%\vspace{5mm}{\Huge A}\par\vspace{5mm}
+%\eintrag{Name}{Adresse}%
+%{Ort}{Land}{Telefon}
+%\eintrag{KPMG Alpen-Treuhand Ges.m.b.H}{Kolingasse 19}%
+%{1090 Wien}{"Osterreich}{34 36 45}
+%! include adressen
+\eintrag{KPMG Alpen-Treuhand Ges.m.b.H}{Kolingasse 19}%
+ {1090 Wien}{"Osterreich}{34 36 45}
+\eintrag{Bente Gaarder Andersen}{The Norwegian Institute of Technology}%
+ {N-7034 Trondheim}{Norwegen}{+47 7 59 26 95}
+\end{verbatim}
+\dots
+\begin{verbatim}
+% (dbTeX) Info: 17 record(s) included from adressen.
+\end{document}
+% (dbTeX) Info: 29 line(s) input, 17 record(s) included, 0 error(s).
+\end{verbatim}
+}
+
+\subsection{3. Schritt: Weitere db\TeX-Kommandos einf"ugen}
+\subsubsection{Gruppenwechsel bzw. "Uberschriften}
+In unserem Beispiel soll vor jedem neuen Anfangsbuchstaben
+eine Initiale gedruckt werden. Dies k"onnen wir mit dem in
+db\TeX{} vorhandenen Mechanismus zur Behandlung eines
+Gruppenwechsels bewerkstelligen. Falls ein {\tt
+\%!~break}-Kommando spezifiziert wurde, "uberpr"uft
+db\TeX{}, ob sich der Inhalt des dabei spezifizierten
+Feldes ge"andert hat. Wenn ja, dann wird dieses Template in
+die Ausgabedatei gestellt, wobei Ersetzungen wie bei
+gew"ohnlichen Datensatztemplates vorgenommen werden. Bei
+diesem Befehl gibt es auch ein optionales Argument; wenn es
+(mit einem beliebigen Zeichen) vorhanden ist, dann wird das
+"`Breaktemplate"' in jedem Fall auch schon vor dem ersten
+Datensatz eingef"ugt (wie es f"ur "Uberschriften auch richtig
+ist). Sollen damit aber nur zwischen verschiedenen Gruppen
+von Datens"atzen spezielle Einsch"ube erzeugt werden, wird
+dieser optionale Parameter einfach ausgelassen.
+
+Im {\tt \%!~break}-Befehl wird neben der Nummer des zu
+beobachtenden Datenfeldes auch der Name des zu verwendenden
+Templates spezifiziert; es ist daher auch dieses
+entsprechende Template im Skript zu definieren.
+
+Die entsprechenden Befehlszeilen, die vor dem {\tt
+\%!~include}-Kommando stehen m"ussen, lauten f"ur unser Beispiel:
+
+{\small\begin{verbatim}
+%! break 1 initiale +
+%! template initiale \pagebreak[3]\vspace{5mm plus 4mm}{\Huge $\cal %1%$}%
+%_ \nopagebreak\par\vspace{5mm plus 2mm}\nopagebreak
+\end{verbatim}
+}
+
+\subsubsection{Zeichenersetzungen}
+Ein letztes Problem soll im Rahmen unseres Beispiels noch
+behandelt werden: \TeX{} verlangt, da"s gewisse
+Sonderzeichen mit einer speziellen Kodierung eingegeben
+werden, da diese Zeichen sonst als spezielle Kommandos
+interpretiert werden. Dies gilt z.B. f"ur das Dollarzeichen
+(Mathematikmodus), das Prozentzeichen (Kommentarbeginn),
+Zirkumflex und Unterstreichungsstrich (Hoch- bzw.
+Tiefstellung) und so weiter.
+
+Kommen solche Zeichen in den einzuf"ugenden Daten vor,
+ergeben sich nat"urlich alle m"oglichen Fehlerquellen. Aus
+diesem Grund sind in db\TeX{}
+Zeichenersetzungsm"oglichkeiten vorgesehen, und zwar auf
+zweierlei Art: zum einen gibt es den {\tt
+\%!~change}-Befehl, der ein Zeichen (oder auch eine ganze
+Zeichenkette) durch eine andere Zeichenkette ersetzt. Zum
+anderen ist es m"oglich, mehrere solcher Ersetzungen in eine
+Datei zu schreiben und dann mit dem {\tt
+\%!~translate}-Befehl zu veranlassen, da"s eine solche
+Ersetzungstabelle geladen wird.
+
+Mit demselben Mechanismus kann man auch 8-bit-ASCII-Zeichen
+in die entsprechende \TeX-Konventionen "ubersetzen (also
+etwa die deutschen Sonderzeichen im IBM-PC-Zeichensatz).
+
+F"ur unser Beispiel wollen wir zum Ersatz der deutschen
+Sonderzeichen die Tabelle {\tt germtex.tbl} laden, die
+folgenden Inhalt hat:
+
+{\small\verbatimfile{germtex.tbl}}
+
+Und weiters laden wir eine Tabelle {\tt tex.tbl} folgenden Inhalts:
+
+{\small\verbatimfile{tex.tbl}}
+
+Man beachte, da"s Zeilen, die mit einem {\tt \#}-Zeichen beginnen, als Kommentar
+behandelt werden!
+
+Die (vor dem {\tt \%!~include}-Kommando) noch einzuf"ugenden
+Zeilen sind daher:
+\begin{verbatim}
+%! translate germtex.tbl
+%! translate tex.tbl
+\end{verbatim}
+
+Nach der Bearbeitung mit db\TeX{} sieht dann die Datei
+folgenderma"sen aus (und man erzielt mit ihr das gew"unschte Ergebnis):
+{\small\begin{verbatim}
+% dbTeX (1.1.beta) Output generated Tue Feb 12 15:59:00 1991
+% dbTeX Input file: adrex3.tex
+\documentstyle[12pt,german]{article}
+\title{Meine wichtigsten Adressen von $\cal A-\cal Z$}
+\author{}\date{}
+\newcommand{\eintrag}[5]{\begin{minipage}{10cm}\begin{flushleft}
+{\bf #1}\\
+{#2}\\
+{#3 (#4)}\\
+{\small Tel:} #5\\\vspace{4mm}\end{flushleft}\end{minipage}\par}
+\begin{document}\parindent 0pt\raggedbottom
+\maketitle
+% Struktur von Datei "adressen": 7 Zeilen pro Record
+% 1. Initiale
+% 2. Sortierwort
+% 3. Name
+% 4. Adresse
+% 5. PLZ und Ort
+% 6. Land
+% 7. Telefon
+%! record adresse "\n"' "`"'
+%! template adresse \eintrag{%3%}{%4%}%
+%_ {%5%}{%6%}{%7%}
+%! break 1 initiale +
+%! template initiale \pagebreak[3]\vspace{5mm plus 4mm}{\Huge $\cal %1%$}%
+%_ \nopagebreak\par\vspace{5mm plus 2mm}\nopagebreak
+%! examples
+%\vspace{5mm}{\Huge A}\par\vspace{5mm}
+%\eintrag{Name}{Adresse}%
+%{Ort}{Land}{Telefon}
+%\eintrag{KPMG Alpen-Treuhand Ges.m.b.H}{Kolingasse 19}%
+%{1090 Wien}{"Osterreich}{34 36 45}
+%! translate germtex.tbl
+%! translate tex.tbl
+%! include adressen
+\pagebreak[3]\vspace{5mm plus 4mm}{\Huge $\cal A$}%
+ \nopagebreak\par\vspace{5mm plus 2mm}\nopagebreak
+\eintrag{KPMG Alpen-Treuhand Ges.m.b.H}{Kolingasse 19}%
+ {1090 Wien}{"Osterreich}{34 36 45}
+\eintrag{Bente Gaarder Andersen}{The Norwegian Institute of Technology}%
+ {N-7034 Trondheim}{Norwegen}{+47 7 59 26 95}
+\end{verbatim}
+\dots
+\begin{verbatim}
+\eintrag{Atominstitut d. "Ost. Hochsch.}{Sch"uttelstra"se}%
+ {1020 Wien}{"Osterreich}{72 51 36}
+\pagebreak[3]\vspace{5mm plus 4mm}{\Huge $\cal B$}%
+ \nopagebreak\par\vspace{5mm plus 2mm}\nopagebreak
+\eintrag{Gwen Bagshaw}{20 Heatherlands, Vicarage Road}%
+ {Sunbury-on-Thames, Middx TWI6 7QU}{United Kingdom}{0932 -- 787026 }
+\eintrag{Nicola Barr}{The Rectory, Cross Ave.}%
+ {Blackrock, Co.Dublin}{Irland}{00353-1-88 71 18}
+\eintrag{Nicola Barr, A.\&L. Goodbody}{1 Earlsfort Centre, Lr. Hatch Street}%
+ {Dublin 2}{Irland}{(Fax) 00353-1-61 32 78}
+\eintrag{Weinschank Binder}{Speckbachergasse}%
+ {1160 Wien}{"Osterreich}{46 02 30}
+\end{verbatim}
+\dots
+\begin{verbatim}
+% (dbTeX) Info: 17 record(s) included from adressen.
+\end{document}
+% (dbTeX) Info: 34 line(s) input, 17 record(s) included, 0 error(s).
+\end{verbatim}
+}
+
+\subsection{In diesem Beispiel nicht behandelte Features}
+
+Neben der M"oglichkeit, Zeichenersetzungen "uber Tabellen zu
+spezifizieren, kann man ad hoc zu bestimmten
+Anwendungsf"allen einzelne Ersetzungen auch "uber den
+{\tt \%!~change}-Befehl veranlassen.
+
+Wird beim {\tt \%!~translate}-Befehl anstelle eines
+Dateinamens der Parameter {\tt OFF} angegeben, werden alle
+zu diesem Zeitpunkt g"ultigen Ersetzungen gel"oscht; damit
+ist es m"oglich, in einem Job mehrere unterschiedliche
+Ersetzungen zu verwenden.
+
+Beim {\tt \%! record}-Befehl gibt es auch die M"oglichkeit,
+anstelle des Identifiers, der das zu verwendende Template
+bestimmt, eine numerische Gr"o"se zwischen Prozentzeichen
+anzugeben. Dann wird erwartet, da"s in dem Datenfeld mit der
+betreffenden Nummer ein String enthalten ist, welcher das
+zu verwendende Template angibt. Man kann damit auf
+verh"altnism"a"sig einfache Weise datengesteuert verschiedene
+Muster innerhalb einer Datei verwenden.
+
+
+
+\newpage
+\section{Programmdokumentation}
+
+\subsection{Kurzbeschreibung der einzelnen Funktionen}
+
+\subsubsection{Oberste Ebene -- l. 25-49}
+ Eingabezeilen werden auf eingestreute db\TeX-Kommandos
+hin untersucht und ausgegeben; falls es sich um Zeilen nach
+einem {\tt \%!~examples}-Befehl handelt, wird ein
+Prozentzeichen vorgesetzt, um diese Zeilen auszukommentieren.
+
+\subsubsection{add\_trtbl() -- l. 171-181}
+
+ Ein Eintrag wird in eine der beiden intern vorhandenen
+Tabellen f"ur die Zeichenersetzung geschrieben: {\tt
+std\_tbl} ist die Tabelle f"ur Ersetzungen mittels
+entsprechender Tabellendateien, und {\tt usr\_tbl} enth"alt
+die mit dem {\tt \%!~change}-Befehl spezifizierten "Ubersetzungen.
+
+\subsubsection{advance() -- l. 140-170}
+
+Diese Funktion ist der Tokenizer des db\TeX-Interpreters;
+ihm wird als Argument der erwartete Tokentyp "ubergeben (ID
+f"ur Identifier, TEMPLATE f"ur Muster oder STRING f"ur
+Zeichenketten). Falls ein entsprechendes Token als n"achstes
+in der Variablen {\tt buffer} steht (f"uhrende Leerzeichen
+oder Tabs werden "ubersprungen), wird es daraus
+entfernt, der Variablen {\tt tok} zugewiesen und die L"ange
+des Tokens als R"uckkehrwert zur"uckgeliefert. Wird kein
+passendes Token gefunden, wird 0 zur"uckgeliefert.
+
+\subsubsection{console\_msg() -- l. 59-62}
+
+Diese Funktion gibt ihr Argument auf der Konsole aus.
+
+\subsubsection{dbTeX\_command() -- l. 80-140}
+
+Diese Funktion ist daf"ur zust"andig, die einzelnen
+db\TeX-Kommandos auszuf"uhren und ist somit die oberste
+Ebene f"ur den Fall, da"s ein db\TeX-Befehl erkannt wurde.
+F"ur jeden Befehl existiert ein {\tt if}-Block, der die
+zu dem entsprechenden Befehl geh"origen Aktionen enth"alt.
+
+\subsubsection{do\_include() -- l. 200-224}
+
+Diese Funktion sit in gewisser Weise die wichtigste; mit
+ihrer Hilfe werden die Datens"atze in den Ausgabestrom
+"ubernommen. Dabei wird darauf geachtet, ob eine {\tt
+break-}Bedingung eintritt (also die Notwendigkeit f"ur einen
+Gruppenwechsel) und gegebenenfalls ein entsprechendes
+Gruppenwechselmuster geschrieben. Das eigentliche
+Inkludieren der Datens"atze wird von {\tt incl\_()} durchgef"uhrt.
+
+\subsubsection{error\_msg() -- l. 63-69}
+
+Diese Funktion schreibt das ihr "ubergebene Argument als
+Fehlermeldung sowohl auf die Konsole als auch in die Ausgabedatei.
+
+\subsubsection{incl\_() -- l. 225-236}
+
+Diese Funktion schreibt den aktuellen Datensatz
+entsprechend dem Template, welches ihr als Argument
+"ubergeben wurde, in den Ausgabestrom.
+
+\subsubsection{info\_msg() -- l. 71-76}
+
+Eine informative Nachricht wird mit dieser Funktion sowohl
+auf die Konsole als auch in die Ausgabedatei geshrieben.
+
+\subsubsection{set\_translation() -- l. 181-200}
+
+Mithilfe dieser Funktion wird eine "Ubersetzungstabellendatei
+eingelesen und jede darin spezifizierte Ersetzung in die Tabelle {\tt
+std\_tbl} aufgenommen; Zeilen, die mit {\tt \#} beginnen,
+werden dabei ignoriert, k"onnen also als Kommentar benutzt werden.
+
+Falls anstelle eines Dateinamens {\tt OFF} spezifiziert
+wurde, werden alle derzeit g"ultigen Ersetzungen gel"oscht.
+
+\subsubsection{txlate() -- l. 238-245}
+
+Mit dieser Funktion, die von {\tt incl\_} aus aufgerufen
+wird, werden die in den Ersetzungtabellen spezifizierten
+Zeichenersetzungen auf den "ubergebenen String ausgef"uhrt,
+der in enbtsprechend ver"anderter Form schlie"slich wieder
+zur"uckgeliefert wird.
+
+%% source code, formatted with TGRIND
+\begin{fullpage}
+\subsection{AWK-Source von db\TeX}
+%{\scriptsize \verbatimfile{dbtex.awk}}
+\tgrindfile{dbtexsrc.tex}
+\end{fullpage}
+\end{document}
diff --git a/support/dbtex/dbtexsrc.tex b/support/dbtex/dbtexsrc.tex
new file mode 100644
index 0000000000..de161bdf9a
--- /dev/null
+++ b/support/dbtex/dbtexsrc.tex
@@ -0,0 +1,249 @@
+{
+\File{dbtex.awk},{17:51},{Apr 08 1991}
+\L{\LB{\C{}\# dbTeX.awk \- a simple preprocessor for generating TeX output from}}
+\CE{}\L{\LB{\C{}\# }\Tab{8}{database files}}
+\CE{}\L{\LB{\C{}\# Version 1.1.beta (1991\-02\-12) dr. w. kraml, KPMG Alpen\-Treuhand Wien}}
+\CE{}\L{\LB{\C{}\# see dbTeX.tex for documentation!}}
+\CE{}\L{\LB{}}
+\L{\LB{}}
+\L{\LB{\K{BEGIN} \{ console\_msg(\S{}\"This is dbTeX Version 1.1.beta (1991\-02\-12)\"\SE{})}}
+\L{\LB{ \K{printf}(\S{}\"\%\% dbTeX (1.1.beta) Output generated \"\SE{} ctime() \S{}\"\!n\"\SE{})}}
+\L{\LB{}\Tab{52}{\C{}\# \^ PolyAwk specific!}}
+\CE{}\L{\LB{ \K{printf}(\S{}\"\%\% dbTeX Input file: \%s\!n\"\SE{}, \K{ARGV}[1])}}
+\L{\LB{\C{}\# a number of initialisations and defs follow here:}}
+\CE{}\L{\LB{ FieldS = \K{FS}}}
+\L{\LB{ RecordS = \K{RS}}}
+\L{\LB{ NRincluded = 0}}
+\L{\LB{ example\_flag = 0 }}
+\L{\LB{ buffer = \S{}\"\"\SE{}}}
+\L{\LB{ STANDARD = 0}}
+\L{\LB{ STRING = 1}}
+\L{\LB{ TEMPLATE = 2}}
+\L{\LB{ ID = 3 }}
+\L{\LB{ USER = 1 }}
+\L{\LB{ \}}}
+\L{\LB{}}
+\L{\LB{ }}
+\L{\LB{\C{}\# main loop \- do this for each line in script}}
+\CE{}\L{\LB{}}
+\L{\LB{\{ \K{if} (\$0 \~ \/\^\%!\/) \{}\Tab{44}{\C{}\# embedded dbTeX\-command}}
+\CE{}\L{\LB{ in\_template = 0}}
+\L{\LB{ buffer = \K{substr}(\$0,3)}}
+\L{\LB{ \K{print} \$0}\Tab{44}{\C{}\# output for reference}}
+\CE{}\L{\LB{ dbTeX\_command()}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (\$0 \~ \/\^\%\_\/) \{}\Tab{44}{\C{}\# template contin. line}}
+\CE{}\L{\LB{ \K{print} \$0}}
+\L{\LB{ \K{if} (in\_template) \{}\Tab{44}{\C{}\# start cont. with newlines}}
+\CE{}\L{\LB{ nl = \K{length}(template[t\_name]) ? \S{}\"\!n\"\SE{} : \S{}\"\"\SE{}}}
+\L{\LB{ template[t\_name] = template[t\_name] nl \K{substr}(\$0,3)}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} error\_msg(\S{}\"INVALID CONTINUATION\"\SE{})}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (example\_flag) \{}\Tab{44}{\C{}\# embedded examples}}
+\CE{}\L{\LB{ in\_template = 0}}
+\L{\LB{ \K{print} \S{}\"\%\"\SE{} \$0}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \{}}
+\L{\LB{ in\_template = 0}}
+\L{\LB{ \K{print} \$0 }\Tab{44}{\C{}\# original TeX line}}
+\CE{}\L{\LB{ \}}}
+\L{\LB{\}}}
+\L{\LB{}}
+\L{\LB{\K{END} \{ s = \K{NR} \S{}\" line(s) input, \"\SE{} NRincluded \S{}\" record(s) included, \"\SE{}}}
+\L{\LB{ s = s (errors+0) \S{}\" error(s)\"\SE{} }}
+\L{\LB{ info\_msg(s)}}
+\L{\LB{ \}}}
+\L{\LB{}}
+\L{\LB{}}
+\L{\LB{}}
+\L{\LB{\C{}\# functions performing helpful tasks with various messages}}
+\CE{}\L{\LB{}}
+\L{\LB{\Proc{console\_msg}\K{function} console\_msg(s) \{ }\Tab{44}{\C{}\# output to console}}
+\CE{}\L{\LB{ \K{print} s \> \S{}\"\/dev\/tty\"\SE{}}}
+\L{\LB{ \}}}
+\L{\LB{ }}
+\L{\LB{\Proc{error\_msg}\K{function} error\_msg(msg, s) \{}\Tab{44}{\C{}\# print error on console}}
+\CE{}\L{\LB{ s = \S{}\"\% (dbTeX) Error: \"\SE{} msg \S{}\"!\"\SE{}}\Tab{44}{\C{}\# and in output file}}
+\CE{}\L{\LB{ ++errors}}
+\L{\LB{ \K{print} s }}
+\L{\LB{ console\_msg(s \S{}\" \-\> line \"\SE{} \K{NR} \S{}\":\"\SE{})}}
+\L{\LB{ console\_msg(\$0)}}
+\L{\LB{\}}}
+\L{\LB{}}
+\L{\LB{\Proc{info\_msg}\K{function} info\_msg(msg, s) \{}\Tab{44}{\C{}\# print info on console}}
+\CE{}\L{\LB{ s = \S{}\"\% (dbTeX) Info: \"\SE{} msg \S{}\".\"\SE{}}\Tab{44}{\C{}\# and in output file}}
+\CE{}\L{\LB{ \K{print} s }}
+\L{\LB{ console\_msg(s)}}
+\L{\LB{\}}}
+\L{\LB{}}
+\L{\LB{}}
+\L{\LB{\C{}\# dbTeX functions}}
+\CE{}\L{\LB{}}
+\L{\LB{\Proc{dbTeX\_command}\K{function} dbTeX\_command() \{}\Tab{44}{\C{}\# the dbTeX main function}}
+\CE{}\L{\LB{ advance(ID)}}
+\L{\LB{ example\_flag = 0}}
+\L{\LB{ \K{if} (tok == \S{}\"examples\"\SE{}) example\_flag = 1}\Tab{44}{\C{}\# \%! examples}}
+\CE{}\L{\LB{ \K{else} \K{if} (tok == \S{}\"record\"\SE{}) \{ }\Tab{44}{\C{}\# \%! record \<id\> \<FS\> [\<RS\>]}}
+\CE{}\L{\LB{ \K{if} (advance(ID)) \{}}
+\L{\LB{ \K{if} (tok \~ \/\^\%[0\-9]+\%\$\/) \{}\Tab{44}{\C{}\# data\-named template}}
+\CE{}\L{\LB{ templ\_typ = 1}}
+\L{\LB{ templ\_field = \K{substr}(tok,2,\K{length}(tok)\-2)}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \{ }\Tab{44}{\C{}\# script\-named template}}
+\CE{}\L{\LB{ templ\_typ = 0}}
+\L{\LB{ templ\_name = tok}}
+\L{\LB{ \}}}
+\L{\LB{ \}}}
+\L{\LB{ FieldS = advance(STRING) ? tok : \K{FS}}}
+\L{\LB{ RecordS = advance(STRING) ? tok : \K{RS}}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (tok==\S{}\"template\"\SE{}) \{ }\Tab{44}{\C{}\# \%! template \<id\> \<template\>}}
+\CE{}\L{\LB{ in\_template = 1}}
+\L{\LB{ \K{if} (advance(ID)) }\Tab{44}{\C{}\# get name}}
+\CE{}\L{\LB{ t\_name = tok}}
+\L{\LB{ \K{if} (advance(TEMPLATE)) }}
+\L{\LB{ template[t\_name] = tok}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (tok==\S{}\"break\"\SE{}) \{ }\Tab{44}{\C{}\# \%! break \%f\% \<id\>}}
+\CE{}\L{\LB{ \K{if} (advance(ID)) \{}}
+\L{\LB{ \K{if} (tok \~ \/\^\%[0\-9]+\%\$\/)}}
+\L{\LB{ breakfield = \K{substr}(tok,2,\K{length}(tok)\-2)}}
+\L{\LB{ \K{else}}}
+\L{\LB{ breakfield = tok}}
+\L{\LB{ \}}}
+\L{\LB{ \K{if} (advance(ID))}}
+\L{\LB{ breaktemplate[breakfield] = tok}}
+\L{\LB{ \K{if} (advance(ID))}}
+\L{\LB{ breakmode[breakfield] = 1}}
+\L{\LB{ \K{else} breakmode[breakfield] = 0}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (tok==\S{}\"clearbreaks\"\SE{}) \{ }\Tab{44}{\C{}\# \%! clearbreaks}}
+\CE{}\L{\LB{ \K{for} (i \K{in} oldvalue)}}
+\L{\LB{ \K{delete} oldvalue[i] }}
+\L{\LB{ \K{for} (i \K{in} breaktemplate)}}
+\L{\LB{ \K{delete} breaktemplate[i]}}
+\L{\LB{ \K{for} (i \K{in} breakmode)}}
+\L{\LB{ \K{delete} breakmode[i]}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (tok==\S{}\"translate\"\SE{}) \{ }\Tab{44}{\C{}\# \%! translate \<id\>}}
+\CE{}\L{\LB{ \K{if} (advance(ID))}}
+\L{\LB{ set\_translation(tok)}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (tok==\S{}\"change\"\SE{}) \{ }\Tab{44}{\C{}\# \%! change \<s1\> \<s2\>}}
+\CE{}\L{\LB{ add\_trtbl(USER)}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (tok==\S{}\"include\"\SE{}) \{ }\Tab{44}{\C{}\# \%! include \<filename\>}}
+\CE{}\L{\LB{ \K{if} (advance(ID))}}
+\L{\LB{ do\_include(tok)}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} error\_msg(\S{}\"UNKNOWN COMMAND\"\SE{})}}
+\L{\LB{\}}}
+\L{\LB{}}
+\L{\LB{}}
+\L{\LB{\Proc{advance}\K{function} advance(type, sep,pos) \{ }\Tab{44}{\C{}\# get next token of type}}
+\CE{}\L{\LB{ \K{sub}(\/\^[ \!t]+\/, \S{}\"\"\SE{}, buffer) }\Tab{44}{\C{}\# remove white space}}
+\CE{}\L{\LB{ \K{if} (type == ID) \{}}
+\L{\LB{ \K{match}(buffer, \/\^[\^ \!t]+\/) }\Tab{44}{\C{}\# all up to white space}}
+\CE{}\L{\LB{ tok = tolower(\K{substr}(buffer, 1, \K{RLENGTH})) \C{}\# tolower(): PolyAwk \& GNU only!}}
+\CE{}\L{\LB{ buffer = \K{substr}(buffer, \K{RLENGTH}+1)}}
+\L{\LB{ \K{return} \K{RLENGTH}}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (type == TEMPLATE) \{ }\Tab{44}{\C{}\# rest of line}}
+\CE{}\L{\LB{ tok = buffer}}
+\L{\LB{ buffer = \S{}\"\"\SE{}}}
+\L{\LB{ \K{return} \K{length}(tok)}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{if} (type == STRING) \{ }\Tab{44}{\C{}\# string delimited by}}
+\CE{}\L{\LB{ sep = \K{substr}(buffer,1,1) }\Tab{44}{\C{}\# unique character}}
+\CE{}\L{\LB{ buffer = \K{substr}(buffer,2)}}
+\L{\LB{ pos = \K{index}(buffer, sep)}}
+\L{\LB{ \K{if} (pos) \{}}
+\L{\LB{ tok = \K{substr}(buffer,1,pos\-1)}}
+\L{\LB{ buffer = \K{substr}(buffer, pos+1)}}
+\L{\LB{ \K{return} pos}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \{}}
+\L{\LB{ tok = \S{}\"\"\SE{}}}
+\L{\LB{ \K{return} 0}}
+\L{\LB{ \}}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \K{return} 0}}
+\L{\LB{\}}}
+\L{\LB{}}
+\L{\LB{}}
+\L{\LB{\Proc{add\_trtbl}\K{function} add\_trtbl(tbl) \{ }\Tab{44}{\C{}\# add an entry to tr table}}
+\CE{}\L{\LB{ \K{if} (advance(STRING)) \{}}
+\L{\LB{ tmp = tok}}
+\L{\LB{ \K{if} (advance(STRING))}}
+\L{\LB{ tbl==USER ? (usr\_tbl[tmp] = tok) : (std\_tbl[tmp] = tok)}}
+\L{\LB{ \K{else} }}
+\L{\LB{ tbl==USER ? (usr\_tbl[tmp] = \S{}\"\"\SE{}) : (std\_tbl[tmp] = \S{}\"\"\SE{})}}
+\L{\LB{ \}}}
+\L{\LB{\}}}
+\L{\LB{}}
+\L{\LB{}}
+\L{\LB{\Proc{set\_translation}\K{function} set\_translation(id) \{}\Tab{44}{\C{}\# install translation table}}
+\CE{}\L{\LB{ \K{if} (toupper(id) == \S{}\"OFF\"\SE{}) \{}}
+\L{\LB{ \K{for} (i \K{in} std\_tbl)}}
+\L{\LB{ \K{delete} std\_tbl[i]}}
+\L{\LB{ \K{for} (i \K{in} usr\_tbl)}}
+\L{\LB{ \K{delete} usr\_tbl[i]}}
+\L{\LB{ \}}}
+\L{\LB{ \K{else} \{}\Tab{44}{\C{}\# read translation table}}
+\CE{}\L{\LB{ \K{while} ((status = \K{getline} line \< id) \> 0) \{}}
+\L{\LB{ buffer = line}}
+\L{\LB{ \K{if} (buffer !\~ \/\^\C{}\#\/)}}
+\CE{}\L{\LB{ add\_trtbl(STANDARD)}}
+\L{\LB{ \} }}
+\L{\LB{ \K{if} (status == \-1) }}
+\L{\LB{ error\_msg(\S{}\"TRANSLATION TABLE \"\SE{} id \S{}\" NOT FOUND\"\SE{})}}
+\L{\LB{ \}}}
+\L{\LB{\}}}
+\L{\LB{}}
+\L{\LB{}}
+\L{\LB{\Proc{do\_include}\K{function} do\_include(file) \{}\Tab{44}{\C{}\# include records of \<file\>}}
+\CE{}\L{\LB{ old\_FS = \K{FS}; old\_RS = \K{RS}}}
+\L{\LB{ \K{FS} = FieldS; \K{RS} = RecordS}}
+\L{\LB{ inc = 0}}
+\L{\LB{ \K{while} (\K{getline} \< file \> 0) \{}}
+\L{\LB{ \K{for} (i \K{in} breaktemplate)}\Tab{44}{\C{}\# check for breaks}}
+\CE{}\L{\LB{ \K{if} (oldvalue[i] != \$i) \{ }}
+\L{\LB{ oldvalue[i] = \$i}}
+\L{\LB{ \K{if} (inc \|\| breakmode[i])}\Tab{44}{\C{}\# no break before 1st rec.,}}
+\CE{}\L{\LB{ incl\_(template[breaktemplate[i]]) }}
+\L{\LB{ \} }\Tab{44}{\C{}\# if not explicitly wanted!}}
+\CE{}\L{\LB{}}
+\L{\LB{ \K{if} (templ\_typ) }}
+\L{\LB{ incl\_(template[\$templ\_field])}}
+\L{\LB{ \K{else} incl\_(template[templ\_name])}}
+\L{\LB{ ++NRincluded; ++inc}}
+\L{\LB{ \}}}
+\L{\LB{ \K{FS} = old\_FS; \K{RS} = old\_RS}}
+\L{\LB{ \K{close}(file)}}
+\L{\LB{ \K{if} (!inc) error\_msg(\S{}\"FILE \"\SE{} file \S{}\" NOT FOUND OR NOT ACCESSIBLE!\"\SE{})}}
+\L{\LB{ info\_msg(inc \S{}\" record(s) included from \"\SE{} file)}}
+\L{\LB{\}}}
+\L{\LB{}}
+\L{\LB{}}
+\L{\LB{\Proc{incl\_}\K{function} incl\_(t) \{}\Tab{44}{\C{}\# include record with template t}}
+\CE{}\L{\LB{ s = \S{}\"\"\SE{}}}
+\L{\LB{ \K{while} (\K{match}(t, \/\%[0\-9]+\%\/)) \{}}
+\L{\LB{ l = \K{RSTART}\-1}}
+\L{\LB{ s = s \K{substr}(t,1,l) txlate(\$(\K{substr}(t,\K{RSTART}+1,\K{RLENGTH}\-2)))}}
+\L{\LB{}\Tab{44}{\C{}\# translated data field}}
+\CE{}\L{\LB{ t = \K{substr}(t,l+\K{RLENGTH}+1)}}
+\L{\LB{ \}}}
+\L{\LB{ \K{print} s t }}
+\L{\LB{\}}}
+\L{\LB{}}
+\L{\LB{}}
+\L{\LB{\Proc{txlate}\K{function} txlate(s) \{}\Tab{44}{\C{}\# perform translations on string s}}
+\CE{}\L{\LB{ \K{for} (target \K{in} std\_tbl) }}
+\L{\LB{ \K{gsub}(target, std\_tbl[target], s)}}
+\L{\LB{ \K{for} (target \K{in} usr\_tbl) }}
+\L{\LB{ \K{gsub}(target, usr\_tbl[target], s)}}
+\L{\LB{ \K{return} s}}
+\L{\LB{\}}}
+\L{\LB{ }}
+}
diff --git a/support/dbtex/germtex.tbl b/support/dbtex/germtex.tbl
new file mode 100644
index 0000000000..063983483e
--- /dev/null
+++ b/support/dbtex/germtex.tbl
@@ -0,0 +1,8 @@
+# standard translation table for german characters (needs german.sty)
+"" /"A/
+"" /"O/
+"" /"U/
+"" /"a/
+"" /"o/
+"" /"u/
+"" /"s/
diff --git a/support/dbtex/read.me b/support/dbtex/read.me
new file mode 100644
index 0000000000..b610eec9b0
--- /dev/null
+++ b/support/dbtex/read.me
@@ -0,0 +1,18 @@
+* READ.ME
+* dbTeX
+* 1991-12-20
+* w. kraml
+
+Folgende Files gehren zu dbTeX:
+
+ 7402 4-08-91 5:58p dbtex.awk dbTeX Sourcecode
+ 73432 12-20-91 4:34p dbtex.dvi dbTeX Handbuch druckfertig
+135684 12-20-91 4:41p dbtex.exe dbTeX kompiliert
+ 39852 12-20-91 4:34p dbtex.tex dbTeX Handbuch Source
+ 11896 4-08-91 5:58p dbtexsrc.tex dbTeX Source formatiert f. Handbuch
+ 142 4-08-91 3:48p germtex.tbl dbTeX Ersetzungstabelle dt. Zeichen
+ 874 12-20-91 4:45p read.me diese Datei
+ 22037 4-08-91 6:00p refman.sty H. Partls Style f. Manuals
+ 184 4-08-91 3:48p tex.tbl dbTeX Ersetzungstabelle TeX-Zeichen
+ 5920 4-08-91 5:59p tgrindn.sty Style z. Drucken v. Sourcecode
+ 1715 4-08-91 6:01p verbatim.sty Style zum Inkludieren (verbatim)
diff --git a/support/dbtex/refman.sty b/support/dbtex/refman.sty
new file mode 100644
index 0000000000..ba28ac699b
--- /dev/null
+++ b/support/dbtex/refman.sty
@@ -0,0 +1,492 @@
+% This is REFMAN.STY by H.Partl, TU Wien, Version 1.1 of 4 Oct 1989.
+% Document Style Option to `article' and `report',
+% for technical reference manuals, users' guides and articles,
+% with a design similar to that of the PostScript Reference Manual:
+% All pages have a wide left margin and no right margin, and section
+% headings and other `guiding' material appear in that margin.
+% Supports one-column only. REFMAN should be specified as the LAST
+% optional argument of the \documentstyle command, e.g.
+% \documentstyle[11pt,twoside,german,refman]{article}
+%
+% It CAN be used with twoside, fleqn and others.
+% It can NOT be used with twocolumn, titlepage, fullpage, a4, a4wide
+% and others.
+%
+% +-----------------------------------------------------------------+
+% ! This style file has been designed for reference manuals, users' !
+% ! guides, short instants, and related papers at the EDP centre of !
+% ! the Technical University of Vienna. It must be re-designed and !
+% ! changed before application at any other institution or for any !
+% ! other purpose. !
+% +-----------------------------------------------------------------+
+% Copyright H.Partl TU Wien 1988.
+
+% Process this file only once:
+\@ifundefined{leftmarginwidth}{}{\endinput}
+
+\typeout{ TU Wien Refman Style - Version 1.1 as of 4 Oct 1989}
+
+\newdimen\leftmarginwidth % value of odd & evensidemargin, set below.
+\newdimen\fullwidth % = \textwidth + \leftmarginwidth
+\newdimen\emptyheadtopmargin % used by some pagestyles
+\newdimen\emptyfoottopmargin % dto.
+
+% \longhrule and \longthickhrule are defined for \hrule's of width \fullwidth
+
+\def\longhrule{\par\hbox to \linewidth{\hss
+ \vrule width \fullwidth height 0.4pt depth 0pt}\par}
+\def\longthickhrule{\par\hbox to \linewidth{\hss
+ \vrule width \fullwidth height 1.0pt depth 0pt}\par}
+
+% Re-definitions of the \section commands to use \fullwidth and smaller
+% vertical skips and smaller fonts.
+% (Note that the afterskip must be >zero, not =zero)
+
+\def\secshape{\leftskip=-\leftmarginwidth % use \fullwidth
+ \rightskip=\@flushglue % raggedright
+ \hyphenpenalty=2000} % no hyphenation
+
+\def\section{\@startsection {section}{1}{\z@}{-2ex plus -1ex minus
+ -.2ex}{0.5ex plus .2ex}{\secshape\large\bf}}
+\def\subsection{\@startsection{subsection}{2}{\z@}{-1.5ex plus -.5ex minus
+ -.2ex}{0.5ex plus .2ex}{\secshape\normalsize\bf}}
+\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-1.5ex plus
+-.5ex minus -.2ex}{0.5ex plus .2ex}{\secshape\normalsize\rm}}
+\def\paragraph{\@startsection
+ {paragraph}{4}{\z@}{2ex plus 1ex minus .2ex}{-1em}{\normalsize\bf}}
+\def\subparagraph{\@startsection
+ {subparagraph}{4}{\parindent}{2ex plus 1ex minus
+ .2ex}{-1em}{\normalsize\bf}}
+
+% For ARTICLE:
+% Re-definitions of \maketitle and \part (\clearpage, \fullwidth, \hrules).
+% This \maketitle prints the \title only.
+% A \makeauthor command is defined to print the \author (to be used either
+% just after \maketitle or at the end of the article, without \thanks).
+
+\def\@redefinemaketitle{
+
+\def\maketitle{\par
+ \begingroup
+ \if@twocolumn
+ \twocolumn[\@maketitle]
+ \else \newpage
+ \global\@topnum\z@ % Prevents figures from going at top of page.
+ \@maketitle \fi\thispagestyle{plain}
+ \endgroup
+ \setcounter{footnote}{0}}
+
+\def\@maketitle{\clearpage
+ \longthickhrule\bigskip
+ {\secshape\parskip\z@\parindent\z@ \Large\bf \@title\par}
+ \bigskip\longthickhrule\bigskip}
+
+\def\makeauthor{\par\nopagebreak\vskip 2ex plus 1ex minus 1ex
+ \begin{flushright}\normalsize\sl \@author \end{flushright}\par
+ \vskip 2ex plus 1ex minus 1ex\relax }
+
+\def\and{\\*}
+\def\thanks{\footnote}
+
+% In \part, only \thepart (the Roman part number) is printed, without
+% the word `Part' in front of it, and \markboth is replaced by \@mkboth
+% to preserve the marks with the myheadings and myfootings page styles.
+
+\def\part{\par \clearpage \thispagestyle{plain}
+ \@afterindentfalse \secdef\@part\@spart}
+
+\def\@part[##1]##2{\ifnum \c@secnumdepth >\m@ne \refstepcounter{part}
+ \addcontentsline{toc}{part}{\thepart \hspace{1em}##1}\else
+ \addcontentsline{toc}{part}{##1}\fi
+ \longhrule\medskip
+ {\secshape\parskip\z@\parindent\z@ \Large\rm
+ \ifnum \c@secnumdepth >\m@ne \thepart.\quad \fi ##2\par}
+ \medskip\longhrule\bigskip \@mkboth{}{}\@afterheading }
+
+\def\@spart##1{\longhrule\medskip
+ {\secshape\parskip\z@\parindent\z@ \Large\rm ##1\par}
+ \medskip\longhrule\bigskip \@afterheading }
+
+} % end of \@redefinemaketitle
+
+% For REPORT:
+% Re-definition of \chapter (\clearpage, \fullwidth, \hrules).
+% However, \maketitle and \part remain unchanged.
+
+\def\@redefinechapter{
+
+\def\@makechapterhead##1{\longthickhrule\bigskip
+ {\secshape\parskip\z@\parindent\z@ \Large\bf
+ \ifnum \c@secnumdepth >\m@ne \@chapapp{} \thechapter.\quad \fi
+ ##1\par}
+ \bigskip\longthickhrule\bigskip}
+
+\def\@makeschapterhead##1{\longthickhrule\bigskip
+ {\secshape\parskip\z@\parindent\z@ \Large\bf ##1\par}
+ \bigskip\longthickhrule\bigskip}
+
+% No word `Chapter'/`Kapitel' before the chapter number, but the word
+% `Appendix'/`Anhang' will still be inserted after \appendix !
+\def\@chapapp{}
+
+% Note that \chapter itself is defined like this:
+% \def\chapter{\clearpage \thispagestyle{plain} \global\@topnum\z@
+% \@afterindentfalse \secdef\@chapter\@schapter}
+% This definition and those of \@chapter and \@schapter remain unchanged.
+
+} % end of \@redefinechapter
+
+% Now, do either the first one or the second one, depending on the main
+% document style (article= \chapter undefined, or report= \chapter defined).
+% (Note that \par must not appear inside \@ifundefined, therefore this
+% indirect approach is taken.)
+
+\@ifundefined{chapter}{\@redefinemaketitle}{\@redefinechapter}
+
+% Re-defintion of the \marginpar command to use always the left margin
+% (never the right margin). Be careful that Marginpars do not come to
+% near to each other!
+
+\def\@addmarginpar{\@next\@marbox\@currlist{\@cons\@freelist\@marbox
+ \@cons\@freelist\@currbox}\@latexbug\@tempcnta\@ne
+%- \if@twocolumn
+%- \if@firstcolumn \@tempcnta\m@ne \fi
+%- \else
+%- \if@mparswitch
+%- \ifodd\c@page \else\@tempcnta\m@ne \fi
+%- \fi
+%- \if@reversemargin \@tempcnta -\@tempcnta \fi
+%- \fi
+ \@tempcnta\m@ne % always to left margin <---
+ \ifnum\@tempcnta <\z@ \global\setbox\@marbox\box\@currbox \fi
+ \@tempdima\@mparbottom \advance\@tempdima -\@pageht
+ \advance\@tempdima\ht\@marbox \ifdim\@tempdima >\z@
+ \@warning{Marginpar on page \thepage\space moved}\else\@tempdima\z@ \fi
+ \global\@mparbottom\@pageht \global\advance\@mparbottom\@tempdima
+ \global\advance\@mparbottom\dp\@marbox
+ \global\advance\@mparbottom\marginparpush
+ \advance\@tempdima -\ht\@marbox
+ \global\ht\@marbox\z@ \global\dp\@marbox\z@
+ \vskip -\@pagedp \vskip\@tempdima\nointerlineskip
+ \hbox to\columnwidth
+ {\ifnum \@tempcnta >\z@
+ \hskip\columnwidth \hskip\marginparsep
+ \else \hskip -\marginparsep \hskip -\marginparwidth \fi
+ \box\@marbox \hss}
+ \vskip -\@tempdima
+ \nointerlineskip
+ \hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}}
+
+% Special Marginpars:
+% \marginlabel{X} puts X into a flushright Marginpar.
+% To be used like description-items or short
+% \subsubsection* headings.
+% \attention puts ! --> to the left of the text.
+% To mark an important piece of text.
+% \seealso{X} puts a small ---> X to the very left.
+% To mark a reference within the text.
+% These three commands start with an empty \mbox, i.e. they can be used
+% before the first word of a paragraph and still have the desired
+% effect, namely that the marginal stuff appears next to the first
+% line of this paragraph, not at the last line of the previous one.
+% They end with \ignorespaces, i.e. blanks (spaces) after the argument's
+% } are allowed and do NOT appear in the printed text.
+% Like all \marginpar's, they cannot be used in math mode or inside boxes.
+
+\def\marginlabel#1{\mbox{}\marginpar{\raggedleft #1}\ignorespaces}
+\def\attention{\mbox{}\marginpar{\raggedleft \large\bf ! $\rightarrow$}}
+\def\seealso#1{\mbox{}\marginpar{\small $\rightarrow$ #1}\ignorespaces}
+
+% The description environment is redefined such that the item labels use
+% the whole left margin (and are in roman, right bound, with colon).
+% \labelwidth = \leftmarginwidth + previous\@totalleftmargin +
+% + new\leftmargin - \labelsep
+% \descriptioncolontrue and -false can be used to select whether a colon
+% is added to the item label.
+% \descriptionlefttrue and -false can be used to select whether the item labels
+% are set left bound or right bound.
+
+\newif\ifdescriptioncolon \descriptioncolontrue
+\newif\ifdescriptionleft \descriptionleftfalse
+\def\descriptionlabel#1{\ifdescriptionleft\else \hfil \fi
+ \rm #1\ifdescriptioncolon :\fi
+ \ifdescriptionleft \hfil \fi}
+\def\description{\list{}{\labelsep=\marginparsep
+ \labelwidth=\leftmarginwidth \advance\labelwidth by \@totalleftmargin
+ \advance\labelwidth by \leftmargin \advance\labelwidth by -\labelsep
+ \let\makelabel=\descriptionlabel}}
+\let\enddescription=\endlist
+
+% The maxipage environment is a minipage that uses the \fullwidth,
+% with \hrules above and below. Marginpars are not allowed.
+% To be used for wide tables, long math equations, and the like.
+% It cannot be split across pages.
+% It can be used in floats, e.g. like
+% \begin{table}\begin{maxipage}
+% ... a wide table ... \caption{the caption}
+% \end{maxipage}\end{table}
+% \maxipageruletrue and -false can be used to select whether \hrule's are
+% added to the minpage.
+
+\newif\ifmaxipagerule \maxipageruletrue
+\def\maxipage{\par % (here a \vskip\parskip will happen by the final \par)
+ \mbox{}\kern-\leftmarginwidth \kern-\@totalleftmargin
+ \begin{minipage}{\fullwidth}
+ \medskip \ifmaxipagerule \hrule\medskip \fi
+ \parskip = 0.5\baselineskip % <--- same as outside minipage
+ \def\marginpar{\typeout{Marginpar not allowed within Maxipage.}}}
+\def\endmaxipage{\par \vskip\parskip
+ \medskip \ifmaxipagerule \hrule\medskip \fi
+ \end{minipage}\par}
+
+% The fullpage environment changes the page layout such that normal text
+% and all environments use the \fullwidth. Marginpars are not allowed.
+% Both \begin{fullpage} and \end{fullpage} start a new page before switching
+% to the other layout.
+% To be used for one or several special pages where the full line length is
+% needed.
+
+\def\fullpage{\clearpage \leftmarginwidth\z@ \textwidth=\fullwidth
+ \oddsidemargin=\z@ \evensidemargin\z@
+ \hsize=\fullwidth \linewidth=\fullwidth \columnwidth=\fullwidth
+ \def\marginpar{\typeout{Marginpar not allowed within Fullpage.}}}
+\def\endfullpage{\clearpage}
+
+% The example environment is a verse enironment with \tt font and with
+% trying to avoid page breaks at the \begin{example}. Lines in the example
+% should be separated by \\*.
+
+\def\example{\@beginparpenalty=\@highpenalty \verse \tt }
+\let\endexample=\endverse
+
+% Page Styles:
+% The pagestyles plain, headings and myheadings are redefined and new
+% pagestyles footings and myfootings are defined, which all use the
+% \fullwidth, with \thepage on the outer side of the (odd/even) page
+% and some with a \hrule below the head line or above the foot line.
+% My favourite is
+% \pagestyle{myfootings}
+% \markboth{the title of the paper}{the title of the paper}
+% (Note that the \markboth is not destroyed by the new \part command.)
+
+% The pagestyles headings and myheadings set \topmargin to \emptyfoottopmargin.
+% The pagestyles footings and myfootings set \topmargin to \emptyheadtopmargin.
+% The pagestyles empty and plain do not change \topmargin.
+% Therefore, within one document,
+% - you may switch between headings, myheadings, empty, and plain,
+% - or you may switch between footings, myfootings, empty, and plain,
+% - but you should not mix (my)headings with (my)footings pages.
+
+% As a compromise between article (section+subsection) and report
+% (chapter+section), \sectionmark (without uppercase) will be put on
+% both side pages in the headings and footings style (neither chapter
+% nor subsection).
+
+\def\ps@plain{\let\@mkboth\@gobbletwo
+ \def\@oddhead{}\def\@evenhead{}%
+ \def\@oddfoot{\rm\hfil\thepage}%
+ \def\@evenfoot{\hss \hbox to \fullwidth{\normalsize\rm\thepage\hfil}}}
+
+\if@twoside % If two-sided printing.
+\def\ps@headings{\let\@mkboth\markboth \topmargin\emptyfoottopmargin
+\def\@oddfoot{}\def\@evenfoot{}% No feet.
+\def\@evenhead{\hss\vbox to 0pt{\vss \hsize=\fullwidth
+ \hbox to \fullwidth{\normalsize\rm\thepage \hfil
+ \small\sl \leftmark}%
+ \vskip 3pt \hrule}}%
+\def\@oddhead{\hss\vbox to 0pt{\vss \hsize=\fullwidth
+ \hbox to \fullwidth{\small\sl \rightmark \hfil
+ \normalsize\rm\thepage}%
+ \vskip 3pt \hrule}}%
+\def\sectionmark##1{\markboth
+ {{\ifnum \c@secnumdepth >\z@ \thesection\hskip 1em\relax \fi ##1}}%
+ {{\ifnum \c@secnumdepth >\z@ \thesection\hskip 1em\relax \fi ##1}}}%
+\def\subsectionmark##1{}}
+\else % If one-sided printing.
+\def\ps@headings{\let\@mkboth\markboth \topmargin\emptyfoottopmargin
+\def\@oddfoot{}\def\@evenfoot{}% No feet.
+\def\@oddhead{\hss\vbox to 0pt{\vss \hsize=\fullwidth
+ \hbox to \fullwidth{\small\sl \rightmark \hfil
+ \normalsize\rm\thepage}%
+ \vskip 3pt \hrule}}%
+\def\sectionmark##1{\markright {{\ifnum \c@secnumdepth >\z@
+ \thesection\hskip 1em\relax \fi ##1}}}}
+\fi
+
+\if@twoside % If two-sided printing.
+\def\ps@footings{\let\@mkboth\markboth \topmargin\emptyheadtopmargin
+\def\@oddhead{}\def\@evenhead{}% No heads.
+\def\@evenfoot{\hss\vbox to 0pt{\vss \hsize=\fullwidth \hrule \vskip 3pt
+ \hbox to \fullwidth{\normalsize\rm\thepage \hfil
+ \small\sl\leftmark}}}%
+\def\@oddfoot{\hss\vbox to 0pt{\vss \hsize=\fullwidth \hrule \vskip 3pt
+ \hbox to \fullwidth{\small\sl\rightmark \hfil
+ \normalsize\rm\thepage}}}%
+\def\sectionmark##1{\markboth
+ {{\ifnum \c@secnumdepth >\z@ \thesection\hskip 1em\relax \fi ##1}}%
+ {{\ifnum \c@secnumdepth >\z@ \thesection\hskip 1em\relax \fi ##1}}}%
+\def\subsectionmark##1{}}
+\else % If one-sided printing.
+\def\ps@footings{\let\@mkboth\markboth \topmargin\emptyheadtopmargin
+\def\@oddhead{}\def\@evenhead{}% No heads.
+\def\@oddfoot{\hss\vbox to 0pt{\vss \hsize=\fullwidth \hrule \vskip 3pt
+ \hbox to \fullwidth{\small\sl\rightmark \hfil
+ \normalsize\rm\thepage}}}%
+\def\sectionmark##1{\markright {{\ifnum \c@secnumdepth >\z@
+ \thesection\hskip 1em\relax \fi ##1}}}}
+\fi
+
+\def\ps@myheadings{\let\@mkboth\@gobbletwo \topmargin\emptyfoottopmargin
+\def\@evenhead{\hss\vbox to 0pt{\vss \hsize=\fullwidth
+ \hbox to \fullwidth{\normalsize\rm\thepage \hfil
+ \small\sl\leftmark}%
+ \vskip 3pt \hrule}}%
+\def\@oddhead{\hss\vbox to 0pt{\vss \hsize=\fullwidth
+ \hbox to \fullwidth{\small\sl\rightmark \hfil
+ \normalsize\rm\thepage}%
+ \vskip 3pt \hrule}}%
+\def\@oddfoot{}\def\@evenfoot{}\def\sectionmark##1{}\def\subsectionmark##1{}}
+
+\def\ps@myfootings{\let\@mkboth\@gobbletwo \topmargin\emptyheadtopmargin
+\def\@evenfoot{\hss\vbox to 0pt{\vss \hsize=\fullwidth \hrule \vskip 3pt
+ \hbox to \fullwidth{\normalsize\rm\thepage \hfil
+ \small\sl\leftmark}}}%
+\def\@oddfoot{\hss\vbox to 0pt{\vss \hsize=\fullwidth \hrule \vskip 3pt
+ \hbox to \fullwidth{\small\sl\rightmark \hfil
+ \normalsize\rm\thepage}}}%
+\def\@oddhead{}\def\@evenhead{}\def\sectionmark##1{}\def\subsectionmark##1{}}
+
+% The \condbreak{length} command is defined for conditional pagebreaks:
+% If less then length vertical space remains on the current page, then
+% a new page is started. This means that the following stuff remains
+% together (either on the current or the next page).
+
+\def\condbreak#1{\vskip 0pt plus #1\pagebreak[3]\vskip 0pt plus -#1\relax}
+
+% The \noparskip command is defined to take away the vertical Parskip,
+% just like \noindent takes away the horizontal Parindent.
+
+\def\noparskip{\vskip-\parskip}
+
+% Correction of a LaTeX bug that occurs when marginpars and footnotes
+% appear on the same page (by Chris Rowley, TUGboat 9/2 Aug.88)
+
+\def\@specialoutput{\ifnum\outputpenalty > -\@Mii
+ \@doclearpage
+ \else
+ \ifnum \outputpenalty <-\@Miii
+ \ifnum\outputpenalty<-\@MM \deadcycles\z@\fi
+ \global\setbox\@holdpg\vbox{\unvbox\@cclv}
+ \else \setbox\@tempboxa\box\@cclv
+ \@pagedp\dp\@holdpg \@pageht\ht\@holdpg
+ \unvbox\@holdpg
+%- \ifvoid\footins\else\advance\@pageht\ht\footins
+%- \advance\@pageht\skip\footins \advance\@pagedp\dp\footins
+%- \insert\footins{\unvbox\footins}\fi
+ \@next\@currbox\@currlist{\ifnum\count\@currbox >\z@
+% moved --->
+ \ifvoid\footins\else\advance\@pageht\ht\footins
+ \advance\@pageht\skip\footins \advance\@pagedp\dp\footins
+ \insert\footins{\unvbox\footins}\fi
+ \@addtocurcol\else
+% moved and changed --->
+ \ifvoid\footins\else
+ \insert\footins{\unvbox\footins}\fi
+ \@addmarginpar\fi}\@latexbug
+ \ifnum \outputpenalty <\z@ \penalty \z@ \fi
+ \fi\fi}
+
+
+% Setting of the Layout Parameters and Dimensions:
+% ------------------------------------------------
+
+% Switch to \onecolumn and disable \twocolumn.
+\onecolumn
+\let\onecolumn=\relax
+\def\twocolumn{\typeout{Twocolumn not allowed with Refman.}}
+
+% Horizontal Layout:
+% \fullwidth = \leftmarginwidth + \textwidth
+% \odd&evensidemargin = \leftmarginwidth - 3mm
+% (DIN-A4 paper is about 6mm narrower than 8.5 Inch.)
+% \marginparwidth = \leftmarginwidth - \marginparsep
+
+% \textwidth, \columnwidth, \linewidth remain unchanged from art10...rep12
+\fullwidth=6.5in
+\leftmarginwidth=\fullwidth \advance\leftmarginwidth by -\textwidth
+\oddsidemargin=\leftmarginwidth \advance\oddsidemargin by -3mm
+\evensidemargin=\oddsidemargin
+\marginparwidth=\leftmarginwidth \advance\marginparwidth by -\marginparsep
+
+% The horizontal layout can be changed in the preamble with the command
+% \setleftmarginwidth{length}
+% This sets \leftmarginwidth=length and \textwidth=\fullwidth-<length> .
+% Example: \setleftmarginwidth{2.5in} ---> 2.5 : 4 = 4 : 6.5
+
+\newdimen\templength@
+\def\setleftmarginwidth#1{\templength@=#1\relax
+ \leftmarginwidth=\templength@
+ \textwidth=\fullwidth \advance\textwidth by -\templength@
+ \oddsidemargin=\leftmarginwidth \advance\oddsidemargin by -3mm
+ \evensidemargin=\oddsidemargin
+ \marginparwidth=\leftmarginwidth \advance\marginparwidth by -\marginparsep
+ \hsize=\textwidth \linewidth=\textwidth \columnwidth=\textwidth }
+
+% Vertical Layout (for DIN-A4 paper):
+% The Top Margin is made smaller by 4.5 baselineskips,
+% the Head and Foot separations are increased by 0.5 baselineskips each,
+% the Textheight is increased by 10 lines.
+% On DIN-A4 paper (which is about 2 lines higher than 11 Inch), this
+% makes the Bootom Margin equal to the Top Margin.
+% \raggedbottom is switched on (even for twoside).
+% With some pagestyles, the page contents are shifted up or down a bit,
+% by using \emptyheadtopmargin or \emptyfoottopmargin, respectively.
+
+\advance\topmargin by -4.5\baselineskip
+\advance\headsep by 0.5\baselineskip
+\advance\footskip by 0.5\baselineskip
+\advance\textheight by 10\baselineskip
+\@colht=\textheight \@colroom=\textheight
+\emptyheadtopmargin=\topmargin \advance\emptyheadtopmargin by -1\baselineskip
+\emptyfoottopmargin=\topmargin \advance\emptyfoottopmargin by 1\baselineskip
+\raggedbottom
+
+% Zero minimal vertical separation between Marginpars (because we use a lot
+% of them, and all must find room above each other).
+
+\marginparpush=\z@
+
+% Paragraph Layout:
+% Zero Parindent and non-zero Parskip. The stretchable glue in \parskip
+% helps LaTeX in finding the best place for page breaks.
+
+\parskip=0.5\baselineskip \advance\parskip by 0pt plus 2pt
+\parindent=\z@
+
+% Redefinition of the vertical spacing in the list environments
+% to use the same as \parskip in all relevant places (normalsize only):
+% \parsep = \parskip
+% \itemsep = \z@ % add nothing to \parskip between items
+% \topsep = \z@ % add nothing to \parskip before first item
+
+\def\@listI{\leftmargin\leftmargini
+ \topsep\z@ \parsep\parskip \itemsep\z@}
+\let\@listi\@listI
+\@listi
+
+\def\@listii{\leftmargin\leftmarginii
+ \labelwidth\leftmarginii\advance\labelwidth-\labelsep
+ \topsep\z@ \parsep\parskip \itemsep\z@}
+
+\def\@listiii{\leftmargin\leftmarginiii
+ \labelwidth\leftmarginiii\advance\labelwidth-\labelsep
+ \topsep\z@ \parsep\parskip \itemsep\z@}
+
+% Note that listiv, listv and listvi don't change vertical parameters.
+
+
+% Switch on the new version of the plain pagestyle.
+\pagestyle{plain}
+
+% This is the end of REFMAN.STY.
+\endinput
diff --git a/support/dbtex/tex.tbl b/support/dbtex/tex.tbl
new file mode 100644
index 0000000000..1b7d8d6171
--- /dev/null
+++ b/support/dbtex/tex.tbl
@@ -0,0 +1,10 @@
+# translation table for some ASCII characters that are special in TeX
+"\%" "\%"
+"&" "\\&"
+"\$" "\$"
+"#" "\#"
+"_" "\_"
+"{" "\{"
+"}" "\}"
+"~" "\verb?~?"
+"\^" "\verb?^?"
diff --git a/support/dbtex/tgrindn.sty b/support/dbtex/tgrindn.sty
new file mode 100644
index 0000000000..3759085dea
--- /dev/null
+++ b/support/dbtex/tgrindn.sty
@@ -0,0 +1,179 @@
+% LaTeX tgrind environment
+% hacked version (W. Kraml) for AWK
+% Based on Van Jacobson's ``tgrindmac'', a macro package for TeX grinding
+% Our job here is to simplify it quite a bit and make it conform to LaTeX
+
+\newif\ifcomment\newif\ifstring
+\newcount\linecount\newcount\linenext
+\newbox\linesofar
+\newdimen\TBwid
+\newdimen\ts
+\newbox\tbox
+
+\def\tgrind{%
+% Stuff we ignore for right now.
+\let\Head=\@gobble
+\def\File##1,##2,##3{}
+% changes: w. kraml
+%\let\Proc=\@gobble
+\let\ProcCont=\@gobble
+%
+\def\Proc##1{\global\def\Procname{##1}%
+\global\setbox\procbox=\hbox{\small\bf ##1()\rlap{~$\Leftarrow$}}}
+\newbox\procbox
+\newbox\linesetbox
+\def\Procname{\null}
+% Each formfeed in the input is replaced by a "\NewPage" macro. If
+% you really want a page break here, define this as "\vfill\eject".
+\def\NewPage{\filbreak\bigskip}
+%
+% Each line of the program text is enclosed by a "\L{...}". We turn
+% each line into an hbox of size hsize. If we saw a procedure name somewhere
+% in the line (i.e., "procbox" is not null), we right justify "procbox"
+% on the line. Every 10 lines we output a small, right justified line number.
+\def\L##1{%
+\global\setbox\linesetbox=\hbox to\hsize{\CF\strut\global\advance\linecount by1
+##1\hss\linebox}
+\ifvoid\procbox\else\par\hbox to\hsize{\hss\strut\box\procbox}\fi
+\par\box\linesetbox
+}
+%
+\linecount=0
+\linenext=9
+\def\linebox{\ifnum\linecount>\linenext\global\advance\linenext by10
+\hbox{\sevrm\the\linecount}\fi}
+%
+% The following weirdness is to deal with tabs. "Pieces" of a line
+% between tabs are output as "\LB{...}". E.g., a line with a tab at
+% column 16 would be output as "\LB{xxx}\Tab{16}\LB{yyy}". (Actually, to
+% reduce the number of characters in the .tex file the \Tab macro
+% supplies the 2nd & subsequent \LB's.) We accumulate the LB stuff in an
+% hbox. When we see a Tab, we grab this hbox (using "\lastbox") and turn
+% it into a box that extends to the tab position. We stash this box in
+% "\linesofar" & use "\everyhbox" to get \linesofar concatenated onto the
+% front of the next piece of the line. (There must be a better way of
+% doing tabs [cf., the Plain.tex tab macros] but I'm not not enough of a
+% TeX wizard to come up with it. Suggestions would be appreciated.)
+\def\LB{\CF\hbox}
+\setbox\linesofar=\null
+\everyhbox={\box\linesofar}
+\def\Tab##1{\setbox\tbox=\lastbox\TBwid=1\wd\tbox\advance\TBwid by 1\ts
+\ifdim\TBwid>##1\ts
+\setbox\linesofar=\hbox{\box\tbox\space}\else
+\setbox\linesofar=\hbox to ##1\ts{\box\tbox\hfil}\fi\LB}
+%
+% A normal space is too thin for code listings. We make spaces & tabs
+% be in "\ts" units (which are the width of a "0" in the current font).
+\setbox\tbox=\hbox{0} \ts=1\wd\tbox \setbox\tbox=\hbox{\hskip 1\ts}
+\def\space{\hskip 1\ts\relax}
+%
+% Font changing stuff for keywords, comments & strings. We put keywords
+% in boldface, comments in text-italic & strings in typewriter. Since
+% we're usually changing the font inside of a \LB macro, we remember the
+% current font in \CF & stick a \CF at the start of each new box.
+% Also, the characters " and ' behave differently in comments than in
+% code, and others behave differently in strings than in code.
+\let\CF=\rm
+\def\K##1{{\bf ##1}} % Keyword
+\def\C{\it\global\let\CF=\it\global\commenttrue\relax} % Comment Start
+\def\CE{\rm\global\let\CF=\rm\global\commentfalse\relax}% Comment End
+\def\S{\tt\global\let\CF=\tt\global\stringtrue\relax} % String Start
+\def\SE{\rm\global\let\CF=\rm\global\stringfalse\relax} % String End
+%
+% Special characters.
+\def\{{\ifmmode\lbrace\else\ifstring{\char'173}\else$\lbrace$\fi\fi}
+\def\}{\ifmmode\rbrace\else\ifstring{\char'175}\else$\rbrace$\fi\fi}
+\def\!{\ifmmode\backslash\else\ifstring{\char'134}\else$\backslash$\fi\fi}
+\def\|{\ifmmode|\else\ifstring{\char'174}\else$|$\fi\fi}
+\def\<{\ifmmode<\else\ifstring<\else$<$\fi\fi}
+\def\>{\ifmmode>\else\ifstring>\else$>$\fi\fi}
+\def\/{\ifmmode/\else\ifstring/\else$/$\fi\fi}
+\def\-{\ifmmode-\else\ifstring-\else$-$\fi\fi}
+\def\_{\ifstring{\char'137}\else\underbar{\ }\fi}
+\def\&{{\char'046}}
+\def\#{{\char'043}}
+\def\%{{\char'045}}
+\def\~{{\char'176}}
+\def\"{\ifcomment''\else{\tt\char'042}\fi}
+\def\'{\ifcomment'\else{\tt\char'047}\fi}
+\def\^{{\char'136}}
+\def\${{\rm\char'044}}
+%
+\raggedright\obeyspaces%\let =\space%
+}
+
+% \tagrind*[FLOAT]{FILE}{CAPTION}{LABEL}
+% * optional
+% FLOAT float options
+% FILE reads LaTeXgrind input in file FILE
+% CAPTION for list of figures
+% LABEL for \ref and \pageref
+\def\tagrind{\@ifstar{\@stagrind}{\@tagrind}}
+
+\def\@tagrind{\@ifnextchar[{\@@tagrind}{\@@tagrind[t]}}
+\def\@stagrind{\@ifnextchar[{\@@stagrind}{\@@stagrind[t]}}
+
+\def\@@tagrind[#1]#2#3#4{%
+ \begin{figure}[#1]
+ \hrule
+ \vskip .5\baselineskip
+ \begin{minipage}\columnwidth\small
+ \begin{tgrind}
+ \input #2\relax
+ \end{tgrind}
+ \end{minipage}
+ \vskip .5\baselineskip plus .5\baselineskip
+ \begingroup
+ \setbox\z@=\hbox{#4}%
+ \ifdim\wd\z@>\z@
+ \caption{#3}%
+ \label{#4}%
+ \else
+ \captcont{#3}%
+ \fi
+ \endgroup
+ \vskip 2pt
+ \hrule
+ \end{figure}
+}
+
+\def\@@stagrind[#1]#2#3#4{%
+ \begin{figure*}[#1]
+ \hrule
+ \vskip .5\baselineskip
+ \begin{minipage}\textwidth\small
+ \begin{tgrind}
+ \input #2\relax
+ \end{tgrind}
+ \end{minipage}
+ \vskip .5\baselineskip plus .5\baselineskip
+ \begingroup
+ \setbox\z@=\hbox{#4}%
+ \ifdim\wd\z@>\z@
+ \caption{#3}%
+ \label{#4}%
+ \else
+ \captcont{#3}%
+ \fi
+ \endgroup
+ \vskip 2pt
+ \hrule
+ \end{figure*}
+}
+
+
+\def\tgrindfile#1{%
+ \par\addvspace{0.1in}
+ \hrule
+ \vskip .5\baselineskip
+% \begin{footnotesize}
+ \begin{small}
+ \begin{tgrind}
+ \input #1\relax
+ \end{tgrind}
+% \end{footnotesize}
+ \end{small}
+ \vskip .5\baselineskip
+ \hrule
+ \addvspace{0.1in}
+}
diff --git a/support/dbtex/verbatim.sty b/support/dbtex/verbatim.sty
new file mode 100644
index 0000000000..5882017b7d
--- /dev/null
+++ b/support/dbtex/verbatim.sty
@@ -0,0 +1,42 @@
+% Here is a version of Adrian's VERBATIM.STY, for inputting whole files
+% verbatim, which is "more LaTeX-like" in that it uses the actual LaTeX
+% macros which set up the `verbatim' environment.
+%
+% As a matter of interest, it is much nicer for TeX if you input large
+% quantities of "verbatim material" from an "external file" rather than by use
+% of the `verbatim' environment (i.e. putting the material in the main input
+% file. This is because this environment, in common with most (but not all)
+% other "verbatim macros", makes the whole of the "vebatim material" a macro
+% argument and therefore eats up TeTeX's internal memory.
+%
+% Chris Rowley
+%
+
+% --- V E R B A T I M F I L E S . S T Y
+%
+% --- This LaTeX style-file defines two user-callable macros:
+% --- \verbatimfile{<filename>} for verbatim inclusion of a file
+% --- \verbatimlisting{<filename>} for verbatim inclusion with line numbers
+%
+% --- The macros are based on those distributed with Sunil Podar's
+% --- `EPIC.STY' macro package, attributed to Tim Morgan,
+% --- modified to keep internal macros internal by Adrian F. Clark,
+% --- alien@uk.ac.essex.ese
+% --- ---and further latexification by Chris Rowley,
+% --- ca_rowley@uk.ac.open.acs.vax.
+%
+% --- Note that the precise layout of line breaks in this file is important!
+%
+
+\def\verbatimfile#1{\begingroup
+ \@verbatim \frenchspacing \@vobeyspaces
+ \input#1 \endgroup
+}
+
+\newcounter{lineno}
+
+\def\verbatimlisting#1{\setcounter{lineno}{0}%
+ \begingroup \@verbatim \frenchspacing \@vobeyspaces \parindent=20pt
+ \everypar{\stepcounter{lineno}\llap{\thelineno\ \ }}\input#1
+ \endgroup
+}