diff options
Diffstat (limited to 'macros/latex209/contrib/misc/db.sty')
-rw-r--r-- | macros/latex209/contrib/misc/db.sty | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/macros/latex209/contrib/misc/db.sty b/macros/latex209/contrib/misc/db.sty new file mode 100644 index 0000000000..983152823f --- /dev/null +++ b/macros/latex209/contrib/misc/db.sty @@ -0,0 +1,236 @@ + +%%%%%%%%%%%%%%% DATABASE STYLE %%%%%%%%%%%%%%%%%% + +% db.sty +% +% Style to generate listings, to send out letters, etc. using +% a database. +% +% Version 2.1 (11/20/91) +% +% Written by George Panagopoulos (georgios@umiacs.umd.edu) + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\long\def\DOCCOMMENT#1\ENDDOCCOMMENT{} + +\DOCCOMMENT + +%%%%%%%%%%%% SAMPLE DATABASE FILE mydb.tdb: + +% Schema definition + +\fields{FName, LName, + Email, Addr, + local} + +% Database + +\tuple{FName= George, + LName= Panagopoulos, + Addr= {CS Dept., U of MD, College Park 20742}, + Email= {\tt georgios@umiacs.umd.edu}, + local= 1} + +\tuple{FName= Somebody, + LName= Else, + Email= {\tt sb@elsewhere}} % all other fields empty + +\tuple{FName= Ten, + LName= \FirstName} + +%%%%%%%%%%%%% SAMPLE USE FILE mydb.tex: + +\documentstyle[db]{article} + +\begin{document} + +% List 1 + +\newcommand{\tupletext}{\thetuplectr & \FName\ \LName & \Email \\} +\begin{tabular}{rll} + \db{mydb} % Lists all +\end{tabular} +=== +\thetuplectr\ person(s) listed + +% List 2 + +\renewcommand{\tupletext}{\FName\ (\Email)} +\ref{num:tuples} local person(s): + +\begin{enumerate} + \db{mydb}[local] % lists all that have nonempty \local + \label{num:tuples} +\end{enumerate} + +\end{document} + +%%%%%%%%%%%%% OUTPUT of mydb.tex: + +1 George Panagopoulos georgios@umiacs.umd.edu +2 Somebody Else sb@elsewhere +3 Ten Ten +=== +3 person(s) listed + +1 person(s) below: + +1. George (georgios@umiacs.umd.edu) + +%%%%%%%%%%%%%% NOTES (refer to example above) + +Database files have the extension ".tdb". + +Field order is irrelevant. + +A subset of the fields may be given as argument in the \tuple command. +The rest become empty. + +TeX/LaTeX commands are valid inside field values. + +Other fields are valid inside field values. + +A field value must not contain a comma, unless the comma is enclosed +in braces. + +White space is insignificant outside \fields and \tuple commands in +the database file. + +White space is insignificant inside a \fields or a \tuple command, +except between the first letter of a field name and the following +equal sign, and between the first letter of a field value and the +following comma or closing brace. +Therefore: + In a \fields command, *there must be no space between the field name + and the following comma or closing brace*: + \fields{ Name, Addr} + is valid, but + \fields{Name ,Addr} + is invalid, and so is + \fields{Name,Addr } + In a \tuple command, *there must be no space between the field name + and the equal sign, and no unwanted spaces between the field value + and the following comma or closing brace*: + \tuple{ Name= x xx , Addr= yy y } + is equivalent to + \tuple{Name={x xx },Addr={yy y }}, + but + \tuple{Name =xxx,Addr=yyy} + is invalid. + +Beware of conflicts between field names and other TeX macros. The +\fields command issues a warning if your field name conflicts with an +already defined macro, but goes on to redefine it anyway. + +The field macros become undefined after the execution of the the \db +command. The old values (if applicable) are NOT restored. + +The same database and more than one databases may be included in the +same document. + +The counter {tuplectr} is used to count tuples. The macro \thetuplectr +may be used and/or modified at wish. The value of the counter is saved +in the \ref variable in the end of the \db command. + +\ENDDOCCOMMENT + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcounter{tuplectr} + +%%%%%%%%%%%% USEFUL MACROS + +\def\ignorewhitespace{\catcode`\ =9\catcode`\^^M=9} +\def\noignorewhitespace{\catcode`\ =10\catcode`\^^M=5} + +\ignorewhitespace + +\def\db@ifb#1{ % trim one space from #1, if needed + \ifx \space #1 + \else #1 \fi} + +%%%%%%%%%%%% SCHEMA READING + +\def\chk@fld@name#1{ % check fldname #1 for conflict with other macros + \expandafter\ifx \csname#1\endcsname \relax % if undefined + \else + \global\expandafter\let\csname#1\endcsname\relax % undefine macro + \typeout{Warning: \space field \space name \space + \expandafter\string\csname#1\endcsname + \space redefines \space a \space TeX \space macro} + \fi} + +\def\@field#1,{ % expand \init@fields with: \gdef\#1{} (#1=fldname) + % and \undef@fields with: \global\let\#1\relax + \edef\fld@name{\db@ifb#1} + \chk@fld@name{\fld@name} + \xdef\init@fields{ + \init@fields + \expandafter\gdef\csname\fld@name\endcsname{}} + \xdef\undef@fields{ + \undef@fields + \global\expandafter\let\csname\fld@name\endcsname\relax}} + +\def\parse@fld@names#1{ % set \init@fields to clear all fields + % and \undef@fields to undef all field macros + \@for\@args:=#1 + \do {\expandafter\@field\@args,}} + +\def\fields#1{ % read field names (keeps ignoring whitespace) + \xdef\init@fields{} + \xdef\undef@fields{} + \parse@fld@names{#1}} + +%%%%%%%%%%%% TUPLE PARSING + +\def\@setfield#1=#2,{ + \expandafter\xdef\csname\db@ifb#1\endcsname{#2}} + +\def\parse@fields#1{ + \@for\@args:=#1 + \do {\expandafter\@setfield\@args,}} + +\def\print@tuple{ % print tuple value as requested + % \db@flag is not expanded and contains the name of a field + \edef\db@flag@val{\db@flag} % eval \db@flag + \ifx \db@flag@val \empty % ignore tuple if \db@flag=\empty + \else + \refstepcounter{tuplectr} + \tupletext + \fi} + +%%%%%%%%%%%% TUPLE READING + +\def\@tuple#1{ % parse tuple and call \print@tuple + \init@fields % empty field values + \parse@fields{#1} + \print@tuple + \ignorewhitespace} + +\def\tuple{ % read tuple, print \tupletext if \db@flag not empty + \noignorewhitespace % will be restored by \@tuple + \@tuple} + +\def\notuple#1{} % ignore entry + +%%%%%%%%%%%% DB READING + +\def\@db#1[#2]{ % #1=file, #2=field not to be empty for \tupletext + \ifx . #2 + \gdef\db@flag{1} % always nonempty + \else + \xdef\db@flag{\csname#2\endcsname} + \fi + \setcounter{tuplectr}{0} + \ignorewhitespace + \@input{#1.tdb} + \undef@fields + \noignorewhitespace} + +\def\db#1{ % read database, print \tupletext for each included tuple + \@ifnextchar [ + {\@db#1} + {\@db#1[.]}} + +\noignorewhitespace |