summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/adrlist
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/adrlist
Initial commit
Diffstat (limited to 'macros/latex/contrib/adrlist')
-rw-r--r--macros/latex/contrib/adrlist/README12
-rw-r--r--macros/latex/contrib/adrlist/adrlist.dtx227
-rw-r--r--macros/latex/contrib/adrlist/adrlist.ins4
-rw-r--r--macros/latex/contrib/adrlist/adrlist.pdfbin0 -> 53674 bytes
4 files changed, 243 insertions, 0 deletions
diff --git a/macros/latex/contrib/adrlist/README b/macros/latex/contrib/adrlist/README
new file mode 100644
index 0000000000..32f914e5be
--- /dev/null
+++ b/macros/latex/contrib/adrlist/README
@@ -0,0 +1,12 @@
+AdrList - Using Adresslists in LaTeX
+------------------------------------
+
+To produce the adrlist.sty macro file, just run
+ latex adrlist.ins
+
+To obtain the documentation, say
+ latex adrlist.dtx
+
+Any comments, bug reports or suggestions how to improve
+the macro, please send to:
+Tobias.Spribille@studbox.uni-stuttgart.de
diff --git a/macros/latex/contrib/adrlist/adrlist.dtx b/macros/latex/contrib/adrlist/adrlist.dtx
new file mode 100644
index 0000000000..6eff936666
--- /dev/null
+++ b/macros/latex/contrib/adrlist/adrlist.dtx
@@ -0,0 +1,227 @@
+% \title{Addresslists with \LaTeX}
+% \author{Tobias Spribille}
+% \maketitle
+%\iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\begin{document} \DocInput{adrlist.dtx} \end{document}
+%</driver>
+%\fi
+% \section{User's Guide} \DescribeMacro{\ForEachAdress}
+% The package |adrlist| provides the macro |ForEachAddress| as follows:
+%
+% |\ForEachAdress{|\meta{addressfile}|}{|\meta{commands}|}|
+%
+% \noindent The parameters are:
+% \begin{description}
+% \item[addressfile] Name of a file containing the addresses in the
+% following structure: \label{fileformat}
+%
+% \DeleteShortVerb{\|}\MakeShortVerb{\!}
+% \begin{tabular}{|l|l|}
+% \hline
+% !<title>! & Title, degree, e.g. "Dipl.-Inf."\\ \hline
+% !<opening>! & how to address the person \\ \hline
+% !<sex>! & the sex, for grammatical correctness \\ \hline
+% !<first name>! & First name \\ \hline
+% !<name>! & Name \\ \hline
+% !-- begin address --! & delimiter \\ \cline{2-2}
+% n lines of address & address with variable length\\ \cline{2-2}
+% !-- end address --! & delimiter, to be typed exactly this way \\ \hline
+% Telephone: !<telephone number>! & These entries may appear \\ \cline{1-1}
+% Telefax: !<telefax number>! & in any order. They are \\ \cline{1-1}
+% EMail: !<eMail address>! & distinguished through the \\ \cline{1-1}
+% Private number: !<private number>! & keywords before the colon ":".\\
+% \hline
+% \end{tabular}
+% \DeleteShortVerb{\!}\MakeShortVerb{\|}
+% \item[commands] \LaTeX-commands to typeset the read data. You can use these
+% commands defined by the package in order to access the address data:
+%
+% \DeleteShortVerb{\|}\MakeShortVerb{\!}
+% \begin{tabular}{|l|l|}
+% \hline
+% !\Title! & Title \\ \hline
+% !\Opening! & Opening \\ \hline
+% !\Sex! & Sex \\ \hline
+% !\Firstname! & First name \\ \hline
+% !\Name! & Name\\ \hline
+% !\Address! & Address. The lines are separated by !\\! \\ \hline
+% !\Telephone! & Telephone number \\ \hline
+% !\Telefax! & Telefax number \\ \hline
+% !\EMail! & EMail address \\ \hline
+% !\PrivateNumber! & Private telephone number \\
+% \hline
+% \end{tabular}
+% \DeleteShortVerb{\!}\MakeShortVerb{\|}
+% \end{description}
+% \section{The Macros}
+% \subsection{Declarations}
+% This file provides the macro package |adrlist|. For various loops and conditions
+% we require the |ifthen|-package.
+% \begin{macrocode}
+\ProvidesPackage{adrlist}[1995/12/21]
+\RequirePackage{ifthen}
+% \end{macrocode}
+% Declare some variables: |Rest| controls the outer loop, which reads several
+% entries out of the address database. If there are lines left in the file, it is true.
+% |AddressLoop| is used for reading the adresses with variable
+% length. |Communication| is a counter to repeat four times the recognition of the
+% keywords for phone number, email etc.
+% \begin{macrocode}
+\newboolean{AddressLoop}
+\newboolean{Rest}\setboolean{Rest}{true}
+\newcounter{Communication}
+% \end{macrocode}
+% \subsection{Helper macros}
+% \begin{macro}{\ifstringcompare}
+% Compare two entire strings, given in the two parameter variables, and not only
+% tokens, like \TeX{} does.
+% \begin{macrocode}
+\newcommand{\ifstringcompare}[4]{%
+ \begingroup
+ \let\protect=\noexpand
+ \edef\0{#1}\edef\1{#2}%
+ \expandafter\endgroup\ifx\0\1#3\else#4\fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\concat}
+% Concatenate two lines of the address, with |\\| as a delimiter, as it is required
+% by e.g. the |letter| style.
+% \begin{macrocode}
+\newcommand{\concat}[2]{#1\\#2}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\keyword}
+% Extract the keyword out of a line of the form \meta{keyword}|:|\meta{contents},
+% i.e. the part before the colon. The pipe symbol may be replaced by any other
+% character that won't appear in the address data.
+% \begin{macrocode}
+\def\keyword#1:#2|{#1}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\contents}
+% Like |\keyword|. Extracts the contents of the line, e.g. the phone number.
+% \begin{macrocode}
+\def\contents#1:#2|{#2}
+% \end{macrocode}
+% \end{macro}
+% \newpage
+% \subsection{The user macro}
+% \begin{macro}{\ForEachAddress}
+% This macro is the one the user directly calls. It opens the file given in |#1| and
+% reads all the addresses in a loop. For each address the \LaTeX-commands in |#2|
+% are executed to typeset the address in the document. After the whole file is read,
+% it is closed again.
+% \begin{macrocode}
+\newcommand{\ForEachAddress}[2]
+{
+ \newread\File \openin\File=#1
+ \whiledo{\boolean{Rest}}
+ { \ReadNextAddress{\File}
+ \ifthenelse{\boolean{Rest}}{#2}{}
+ }
+ \closein\File
+}
+% \end{macrocode}
+% \end{macro}
+% \subsection{Main macrocode}
+% \begin{macro}{\ReadNextAddress}
+% Here we read the next address out of the file given as |#1| and save the read data
+% into the respective variables. For the structure of the address file and
+% the variable names, confer to section \ref{fileformat}.
+% \begin{macrocode}
+\newcommand{\ReadNextAddress}[1]{
+ \ifthenelse{\boolean{Rest}}{
+ \read#1 to \Title
+ \ifeof#1\setboolean{Rest}{false}
+ \else % If last address already is read, EOF should appear here
+ \ifthenelse{\boolean{Rest}}
+ {\read#1 to \Opening
+ \ifeof#1\setboolean{Rest}{false}\fi
+ }{}
+ \ifthenelse{\boolean{Rest}}
+ {\read#1 to \Sex
+ \ifeof#1\setboolean{Rest}{false}\fi
+ }{}
+ \ifthenelse{\boolean{Rest}}
+ {\read#1 to \Firstname
+ \ifeof#1\setboolean{Rest}{false}\fi
+ }{}
+ \ifthenelse{\boolean{Rest}}
+ {\read#1 to \Name
+ \ifeof#1\setboolean{Rest}{false}\fi
+ }{}
+ \ifthenelse{\boolean{Rest}}
+ {\read#1 to \Dummy
+ \ifeof#1\setboolean{Rest}{false}\fi
+ }{}
+ \setboolean{AddressLoop}{true}
+ \def\Emptystring{} \let\Address=\Emptystring
+ \def\Delimiter{-- end address -- }
+% \end{macrocode}
+% Read Address, until |-- end address --| appears.
+% \begin{macrocode}
+ \whiledo{\boolean{AddressLoop}}
+ {
+ \ifRest \read#1 to \Buffer \fi
+ \ifeof#1\setboolean{Rest}{false}\fi
+ \ifstringcompare{\Buffer}{\Delimiter}
+ {\setboolean{AddressLoop}{false}}{}
+ \ifthenelse{\boolean{AddressLoop}}
+ {
+ \ifstringcompare{\Emptystring}{\Address}
+ {
+ \let\Address=\Buffer % Don't add delimiters the first time
+ }
+ {
+ \begingroup % keep redefinition of \\ local
+ \let\protect=\noexpand
+ \def\\{\noexpand\\}% make \\ not expandable
+ \edef\x{\endgroup
+ \def\noexpand\Address{\concat\Address\Buffer}%
+ }\x
+ }
+ }{}
+ }
+% \end{macrocode}
+% Four informations are left. The keyword is extracted from |\Buffer| and compared
+% with the defined keywords. If the comparison succeeds, the correct variable is set.
+% \begin{macrocode}
+ \def\KeyWTelephone{Telephone}
+ \def\KeyWTelefax{Telefax}
+ \def\KeyWEMail{EMail}
+ \setcounter{Communication}{0}
+ \whiledo{\value{Communication}<4}%
+ {
+ \ifthenelse{\boolean{Rest}}{
+ \read#1 to \Buffer
+ \edef\KeyW{\expandafter\keyword\Buffer|}
+ \ifstringcompare{\KeyW}{\KeyWTelephone}
+ {
+ \edef\Telephone{\expandafter\contents\Buffer|}
+ }
+ {
+ \ifstringcompare{\KeyW}{\KeyWTelefax}
+ {
+ \edef\Telefax{\expandafter\contents\Buffer|}
+ }
+ {
+ \ifstringcompare{\KeyW}{\KeyWEMail}
+ {
+ \edef\EMail{\expandafter\contents\Buffer|}
+ }
+ {
+ \edef\PrivateNumber{\expandafter\contents\Buffer|}
+ }
+ }
+ }
+ \ifeof#1\setboolean{Rest}{false}\fi
+ }{}
+ \stepcounter{Communication}
+ }
+ \fi
+ }{}
+}
+% \end{macrocode}
+% \end{macro} \ No newline at end of file
diff --git a/macros/latex/contrib/adrlist/adrlist.ins b/macros/latex/contrib/adrlist/adrlist.ins
new file mode 100644
index 0000000000..1de62fe15d
--- /dev/null
+++ b/macros/latex/contrib/adrlist/adrlist.ins
@@ -0,0 +1,4 @@
+\def\batchfile{adrlist.ins}
+\input docstrip.tex
+\Msg{Creating Style-File}
+\generateFile{adrlist.sty}{t}{\from{adrlist.dtx}{}}
diff --git a/macros/latex/contrib/adrlist/adrlist.pdf b/macros/latex/contrib/adrlist/adrlist.pdf
new file mode 100644
index 0000000000..f02ac105e3
--- /dev/null
+++ b/macros/latex/contrib/adrlist/adrlist.pdf
Binary files differ