diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dbtex |
Initial commit
Diffstat (limited to 'support/dbtex')
-rw-r--r-- | support/dbtex/dbtex.awk | 246 | ||||
-rw-r--r-- | support/dbtex/dbtex.dvi | bin | 0 -> 73432 bytes | |||
-rw-r--r-- | support/dbtex/dbtex.tex | 1024 | ||||
-rw-r--r-- | support/dbtex/dbtexsrc.tex | 249 | ||||
-rw-r--r-- | support/dbtex/germtex.tbl | 8 | ||||
-rw-r--r-- | support/dbtex/read.me | 18 | ||||
-rw-r--r-- | support/dbtex/refman.sty | 492 | ||||
-rw-r--r-- | support/dbtex/tex.tbl | 10 | ||||
-rw-r--r-- | support/dbtex/tgrindn.sty | 179 | ||||
-rw-r--r-- | support/dbtex/verbatim.sty | 42 |
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 Binary files differnew file mode 100644 index 0000000000..7d76b0631e --- /dev/null +++ b/support/dbtex/dbtex.dvi 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 +} |