\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 []} \item[] Eine Zahl, die auch in der Form {\tt \%n\%} geschrieben sein kann. Sie bezieht sich auf das Feld {\tt } des zu inkludierenden Datenfiles. \item[] Name des Templates, das in die Ausgabe eingef"ugt werden soll, wenn sich der Inhalt von Feld {\tt } "andert. \item[] 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 } \item[] 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[] 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 } \item[] Die Datei namens {\tt } 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 [ []]} \item[] 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[] 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[] 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 [