diff options
author | Karl Berry <karl@freefriends.org> | 2007-01-10 23:29:34 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2007-01-10 23:29:34 +0000 |
commit | 3c5a9cf8c246db8ac28a55b88dc0f876d470c2f6 (patch) | |
tree | 89b614ed8d60021ae583e867c3da812b6dcf1a7a /Master/texmf-dist/source/generic/pst-dbicons | |
parent | fc8eb0e4ec334c2b5c3dde3c930dd973edf2b05d (diff) |
new pstricks package pst-dbicons (27nov06)
git-svn-id: svn://tug.org/texlive/trunk@3319 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/generic/pst-dbicons')
4 files changed, 1175 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/generic/pst-dbicons/Makefile b/Master/texmf-dist/source/generic/pst-dbicons/Makefile new file mode 100644 index 00000000000..08da3af84d7 --- /dev/null +++ b/Master/texmf-dist/source/generic/pst-dbicons/Makefile @@ -0,0 +1,48 @@ + +# `Makefile' for `pst-dbicons.pdf', hv, 2006/08/11 + +.SUFFIXES : .tex .ltx .dvi .ps .pdf .eps + +MAIN = pst-dbicons + +LATEX = latex + +ARCHNAME = $(MAIN)-$(shell date +%y%m%d) + +ARCHFILES = $(MAIN).dtx $(MAIN).ins Makefile + +all : $(MAIN).sty doc clean + +$(MAIN).sty : $(MAIN).dtx +%.sty : %.dtx + tex $(basename $<).ins + +doc: $(MAIN).pdf + +$(MAIN).pdf : $(MAIN).ps + GS_OPTIONS=-dAutoRotatePages=/None ps2pdf $< + +$(MAIN).ps : $(MAIN).dvi + dvips $< + +$(MAIN).dvi : $(MAIN).dtx + $(LATEX) $< + if ! test -f $(basename $<).glo ; then touch $(basename $<).glo; fi + if ! test -f $(basename $<).idx ; then touch $(basename $<).idx; fi + makeindex -s gglo.ist -t $(basename $<).glg -o $(basename $<).gls \ + $(basename $<).glo + makeindex -s gind.ist -t $(basename $<).ilg -o $(basename $<).ind \ + $(basename $<).idx + $(LATEX) $< + +clean : + $(RM) $(addprefix $(MAIN), .log .aux .glg .glo .gls .ilg .idx .ind .tmp .toc .out) + $(RM) $(addprefix $(MAIN), .dvi .ps) + +veryclean : clean + $(RM) $(MAIN).pdf + +arch : + zip $(ARCHNAME).zip $(ARCHFILES) + +# EOF diff --git a/Master/texmf-dist/source/generic/pst-dbicons/pst-dbicons.drv b/Master/texmf-dist/source/generic/pst-dbicons/pst-dbicons.drv new file mode 100644 index 00000000000..8fe99595502 --- /dev/null +++ b/Master/texmf-dist/source/generic/pst-dbicons/pst-dbicons.drv @@ -0,0 +1,52 @@ +%% +%% This is file `pst-dbicons.drv', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% pst-dbicons.dtx (with options: `driver') +%% +%% IMPORTANT NOTICE: +%% +%% For the copyright see the source file. +%% +%% Any modified versions of this file must be renamed +%% with new filenames distinct from pst-dbicons.drv. +%% +%% For distribution of the original source see the terms +%% for copying and modification in the file pst-dbicons.dtx. +%% +%% This generated file may be distributed as long as the +%% original source files, as listed above, are part of the +%% same distribution. (The sources need not necessarily be +%% in the same archive or directory.) +\def\filedate{2006/11/26} +\def\docdate{2006/11/26} +\def\fileversion{0.2} +\def\basename{pst-dbicons} +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\documentclass{ltxdoc} +\usepackage[dvips]{geometry} +\usepackage{latexsym} +\usepackage{pst-dbicons,lscape} +\parindent0pt\hfuzz2pt +\begin{document} + \DocInput{pst-dbicons.dtx} +\end{document} +\endinput +%% +%% End of file `pst-dbicons.drv'. diff --git a/Master/texmf-dist/source/generic/pst-dbicons/pst-dbicons.dtx b/Master/texmf-dist/source/generic/pst-dbicons/pst-dbicons.dtx new file mode 100644 index 00000000000..a2d49316cb1 --- /dev/null +++ b/Master/texmf-dist/source/generic/pst-dbicons/pst-dbicons.dtx @@ -0,0 +1,1058 @@ +\def\filedate{2006/11/26} +\def\docdate{2006/11/26} +\def\fileversion{0.2} +\def\basename{pst-dbicons} +% +% \iffalse meta-comment +% +% Package 'pst-dbicons to use with LaTeX2e and PSTricks +% Copyright 1997-2006 by Wolfgang May. +% may@informatik.uni-goettingen.de +% +% This program can be redistributed and/or modified under the terms +% of the LaTeX Project Public License Distributed from CTAN archives +% in directory macros/latex/base/lppl.txt. +% +% \fi +% +% \changes{v0.20}{2006/11/26}{First CTAN release (hv)} +% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +% +% \RecordChanges +% +% \MakeShortVerb{\|} +% \makeatletter +% \def\Codelabel#1{\@bsphack +% \protected@write\@auxout{}{\string\newlabel{#1}{{\number\the +% \c@CodelineNo}{\thepage}}}\@esphack} +% \newcounter{tmpcount} +% \def\Coderef#1#2{\setcounter{tmpcount}{0}\@ifundefined{r@#1}\relax +% {\setcounter{tmpcount}{\ref{#1}}}\relax +% \addtocounter{tmpcount}{#2}\arabic{tmpcount}} +% \makeatother +% +% \title{PSTricks Macros for Databases\thanks{This +% file has version number \fileversion{}, last revised \filedate.}} +% \author{Wolfgang May\thanks{\texttt{may@informatik.uni-goettingen.de}}} +% \date{\filedate} +% \maketitle +% +% \begin{abstract} +% \noindent +% The \emph{pst-dbicons} package provides some useful macros in the +% database area. It focusses on typesetting ER-Diagrams in a +% declarative style, i.e., by positioning some nodes and defining +% the position of all other nodes relative to them by using the +% standard database terminology. +% The PSTricks package is required for using pst-dbicons, but +% there is no deep knowledge of PSTricks commands required +% (although this is useful for exploiting the full functionality). +% \end{abstract} +% +% \section{Commands} +% +% \subsection{ER-Diagrams} +% +% ER-Diagrams are a widely used graphical representation +% formalism for conceptual modeling; especially used in the +% database community. Their main notions are \emph{entities} +% (e.g., persons, cities, or countries), \emph{attributes} of +% entities (e.g., name, id-number, age), and relationships +% between entities (e.g., belongs\_to, is\_capital\_of). +% +% \DescribeMacro\seticonparams +% With +% \begin{quote} +% |\seticonparams{|\meta{icon-type}|}{|\meta{graphics parameters}|}| +% \end{quote} +% the graphical layout of icons (entities, relationships, and attributes) +% can be specified (by giving the optional argument for PSTricks' +% boxes). Default is +% |[fillstyle=none]| for all of them. +% in this documentation, we modify it to +% +%\begin{verbatim} +%\seticonparams{entity}{shadow=true,fillcolor=lightgray,fillstyle=solid} +%\seticonparams{attribute}{fillcolor=lightgray,fillstyle=solid} +%\seticonparams{relationship}{shadow=true,fillcolor=lightgray,fillstyle=solid}\end{verbatim} +%\seticonparams{entity}{shadow=true,fillcolor=lightgray,fillstyle=solid} +%\seticonparams{attribute}{fillcolor=lightgray,fillstyle=solid} +%\seticonparams{relationship}{shadow=true,fillcolor=lightgray,fillstyle=solid} +% +% From the user's point of view, every ER-icon (entities, relationships, +% attributes) +% has a name which should be typeset in the respective box. Additionally, +% there are \emph{internal} identifiers of the boxes/nodes to allow for +% referencing by graphics commands in the standard PSTricks way. +% These \emph{internal id}'s must start with a letter and must contain +% only letters +% and digits. In general, id's must be unique on every +% page.\footnote{people who are familiar with PSTricks know under which +% conditions non-unique node identifiers can be used.} +% Often, the \emph{name} of the entity/relationship/attribute satisfies +% these conditions; in these cases, the name is also used as id. +% in other cases, name and id must be specified. +% +% Thus, for all commands for typesetting ER-icons, the node id +% \emph{must} be given, whereas the name to be typeset in the box +% is optional; if no name is specified, the id is typeset as the name. +% +% +% \subsection{Entities and Attributes} +% \DescribeMacro\entity +% With +% \begin{quote} +% |\entity[|\meta{property}|]{|\meta{id}|}[|\meta{text}|]| +% \end{quote} +% an entity type is set as a rectangular node. +% If the optional argument \meta{text} is not given, \meta{id} also +% provides the entity's text. \meta{property} is used for \emph{weak} +% entitiy types which are denoted by double lines: +% +% Here is a simple entity |\entity{Person}| \quad\entity{Person}\quad where +% |Person| serves also as node text; |\entity[weak]{cty}[City]| +% \entity[weak]{cty}[City] makes up a weak entity type where the +% displayed name is different from the internal name. +% +% +% \DescribeMacro\attribute +% Attribute icons are set as an oval nodes by +% \begin{quote} +% |\attribute[|\meta{property}|]{|\meta{id}|}[|\meta{text}|]| +% \end{quote} +% Here, the optional argument \meta{property} can take the +% values |mv| (multivalued; resulting in a double-lined oval) or +% |key| (key attribute; resulting in underlining the attribute name). +% Here are three attributes: +% \begin{itemize} +% \item an ordinary one, |\attribute{phone}[phone\_no]| +% \quad\attribute{phone}[phone\_no]\quad, +% \item a multivalued attribute, |\attribute[mv]{nickname}| +% \quad\attribute[mv]{nickname}\quad, +% \item a key attribute, |\attribute[key]{pid}[person\_id]| +% \quad\attribute[key]{pid}[person\_id]\quad. +% \end{itemize} +% Note that with \emph{phone\_no}, the optional argument is +% used for the node text (in case that the node text contains +% stuff that is not allowed in internal postscript ids -- +% as a rough rule, only characters (and since dbicons 1.14, +% underscores) are allowed in ids). +% +% In Section~\ref{sec-relationships}, relationship nodes are defined +% analogously. +% \DescribeMacro\attributeof +% \DescribeMacro\attrdist +% At first, it is described how to attach attributes with entities: +% +% \begin{quote} +% |\attributeof{|\meta{id}|}[|\meta{dist}|]{|\ignorespaces +% \meta{angle}|}[|\meta{property}|]{|\meta{id$_2$}|}[|\meta{text}|]| +% \end{quote} +% typesets an attribute node at angle \meta{angle} in distance +% \meta{dist} from the node which is identified by \meta{id} +% (which can be either an entity node or a relationship node). +% The attribute is made a node named \meta{id$_2$}. +% \meta{id$_2$} and \meta{text} work as for |\entity|. +% The argument \meta{dist} is optional, it has not to be given +% with \emph{every} attribute. By |\attrdist{|\meta{dist}|}|, this +% value can be set to a default (as startup default, 2em is set). +% +% +% \attrdist2.5em +% \hspace*{0.5cm}\entity{Person}\hspace*{2cm} +% \attributeof{Person}{30}[key]{Name} +% \attributeof{Person}{90}[mv]{Nickname} +% \attributeof{Person}[4em]{150}{phone}[phone\_no] +% \attributeof{Person}[2em]{270}[mv]{wt}[weight\_at] +% \attributeof{wt}{240}{date} +% \attributeof{wt}{300}{weight} +% \begin{tabular}{p{8.2cm}} +% \attrdist2.5em +% |\entity{Person}| \\ +% |\attributeof{Person}{30}[key]{Name}| \\ +% |\attributeof{Person}{90}[mv]{Nickname}| \\ +% |\attributeof{Person}[4em]{150}| \\ +% | {phone}[phone\_no]| \\ +% |\attributeof{Person}{270}[mv]{wt}[weight\_at]| \\ +% |\attributeof{wt}{220}{date}| \\ +% |\attributeof{wt}{300}{weight}| \bigskip\\ +% +% Note that \emph{phone\_no} is set with a bigger distance to +% \emph{person}. +% Additionally, the example shows how complex attributes can be set +% with these commands. +% \end{tabular} +% +%\subsection{Relationships}\label{sec-relationships} +% \DescribeMacro\relationship +% With |\relationship[|\meta{property}|]{|\meta{id}|}[|\meta{text}|]|, a relationship +% type is set as a diamond-shaped node. +% Here, the optional argument \meta{property} is used to represent +% \emph{identifying} relationships, used for \emph{weak} entities -- +% thus \meta{property} can be equivalently |weak| or |ident| which +% results in a double-lined relationship type. +% +% \DescribeMacro\relationshipbetween +% For declaratively specifying nodes representing relationships +% between entities, +% \begin{quote} +% |\relationshipbetween[|\meta{property}|]{|\meta{entity-is$_1$}|}{|\meta{entity-id$_2$}|}|\\ +% | {|\meta{relationship-id}|}[|\meta{relationship-name}|]| +% \end{quote} +% is used (which can be augmented with several optional arguments). +% In the simplest version, as given above, a relationship node is set +% in-between two entity nodes: +% +% \begin{quote} +% | \entity{Person} \hspace*{6cm} \entity{Company}| \\ +% | \relationshipbetween{Person}{Company}{worksat}[works\_at]| +% \bigskip \\ +% \entity{Person} \hspace*{6cm} \entity{Company} +% \relationshipbetween{Person}{Company}{worksat}[works\_at] +% \end{quote} +% +% Additionally, the \emph{roles} of the entities in the relationship, +% and the cardinalities can be given (both as independent optional +% arguments): +% \begin{quote} +% |\relationshipbetween[|\meta{property}|]|\\ +% | {|\meta{entity-id$_1$}|}(|\ignorespaces +% \meta{role$_1$}|)[|\meta{card$_1$}|]|\\ +% | {|\meta{entity-id$_2$}|}(|\ignorespaces +% \meta{role$_2$}|)[|\meta{card$_2$}|]|\\ +% | {|\meta{relationship-id}|}[|\meta{relationship-name}|]| +% \end{quote} +% +% \begin{quote} +% |\entity{Country} \hspace*{6cm} \entity{City}| \\ +% |\relationshipbetween{Country}(of)[1:1]{City}(is)[0:1]{capital}| +% \bigskip \\ +% \entity{Country} \hspace*{6cm} \entity{City} +% \relationshipbetween{Country}(of)[1:1]{City}(is)[0:1]{capital} +% \end{quote} +% +% Moreover, the placement of the relationship node wrt.\ the +% entities can be specified: above, the relationship node was +% put in the middle of an imaginary line in-between the entity +% nodes. +% +% As a first, small, extension, the placement ratio of the +% diamond between the entities can be changed (default: 0.5): +% \begin{quote} +% |\relationshipbetween[|\meta{property}|]{|\meta{entity-id$_1$}|}...{|\ignorespaces +% \meta{entity-id$_2$}|}...|\\ +% | {|\meta{relationship-id}|}[|\ignorespaces +% \meta{relationship-name}|](|\meta{placement-ratio}|)| +% \end{quote} +% +% \begin{quote} +% |\entity{Country} \hspace*{6cm} \entity[weak]{City}| \\ +% |\relationshipbetween[ident]{Country}[0:n]{City}[1:1]{in}(0.8)| +% \bigskip \\ +% \entity{Country} \hspace*{6cm} \entity[weak]{City} +% \relationshipbetween[ident]{Country}[0:n]{City}[1:1]{in}(0.8) +% \end{quote} +% +% If this is still not enough, instead of an imaginary straight line, +% any other PSTricks node connection command can be used, most +% likely |\ncarc[...]| with suitable optional arguments: +% +% \begin{quote} +% |\relationshipbetween[|\meta{property}|]| \\ +% | {|\meta{entity-id$_1$}|}...{|\ignorespaces +% \meta{entity-id$_2$}|}...|\\ +% | {|\meta{relationship-id}|}[|\ignorespaces +% \meta{relationship-name}|]|\\ +% | /|\meta{connection}|/(|\meta{placement-ratio}|)| +% \end{quote} +% \begin{quote} +% |\entity{Country} \hspace*{6cm} \entity{City}| \\ +% |\relationshipbetween{Country}[0:n]{City}[1:1]|\\ +% | {in}/\ncarc[arcangle=20]/(0.4)| +% \vspace*{1cm} \\ +% \entity{Country} \hspace*{6cm} \entity{City} +% \relationshipbetween{Country}[0:n]{City}[1:1]{in}/\ncarc[arcangle=20]/(0.4) +% \end{quote} +% +% For \TeX-insiders: Note that the use of |/.../| as argument delimiter +% avoids collisions with the delimiters used by PSTricks which +% thus can be used inside |/.../|. +% +% In the above example, although the relationship is placed on an +% imaginary arc, the \emph{connections} are straight lines. +% For these lines, PSTricks commands can be given, too. +% With this, the \emph{full} syntax is +% \begin{quote} +% |\relationshipbetween[|\meta{property}|]|\\ +% | {|\meta{entity-id$_1$}|}(|\ignorespaces +% \meta{role$_1$}|)[|\meta{card$_1$}|]/|\meta{connection$_1$}|/|\\ +% | {|\meta{entity-id$_2$}|}(|\meta{role$_2$}|)[|\ignorespaces +% [\meta{card$_2$}|]/|\meta{connection$_2$}|/|\\ +% | {|\meta{relationship-id}|}[|\meta{relationship-name}|]/|% +% \meta{connection}|/(|\meta{placement-ratio}|)| +% \end{quote} +% +% where all arguments embraced with |(...)|, |[...]|, or |/.../| are +% optional. +% +% With this, an example can be given where two different relationships +% can hold between a pair of entity types: +% +% \begin{quote} +% |\entity{Country} \hspace*{6cm} \entity{City}| \\ +% |\relationshipbetween{Country}[0:n]{City}[1:1]{in}|\\ +% |/\ncarc[arcangle=20]/(0.4)|\\ +% |\relationshipbetween{Country}[1:1]/\ncarc[arcangle=-18]/|\\ +% | {City}[0:1]/\ncarc[arcangle=-12]/|\\ +% | {Capital}/\ncarc[arcangle=-30]/(0.6)| +% \vspace*{1cm} \\ +% \entity{Country} \hspace*{6cm} \entity{City} +% \relationshipbetween{Country}[0:n]{City}[1:1]{in}/\ncarc[arcangle=20]/(0.4) +% \relationshipbetween{Country}[1:1]/\ncarc[arcangle=-18]/ +% {City}[0:1]/\ncarc[arcangle=12]/ +% {Capital}/\ncarc[arcangle=-30]/(0.6) +% \vspace*{1.2cm} +% \end{quote} +% Note that for \emph{capital}, |\ncarc| is used for the lines, +% where the |arcangle| of the whole arc is divided suitably +% to the placement ratio of the diamond node, and that the +% |arcangle| of the second entity is negative (since the connection +% always points from the entity to the relationship). +% +% There is one more interesting special case of binary relationships: +% recursive relationships. There, the entity node cannot be set +% ``between'' the nodes -- it has to be placed relative to the +% entity type which is involved in the relationship. +% +% In this case, the argument \meta{connection} has no effect, and last +% argument (\meta{placement ratio}) has the syntax +% |(|\meta{distance},\meta{angle}|)|: the relationship node is set +% at angle \meta{angle} in distance \meta{dist} from the entity node. +% The default for \meta{connection$_1$} and \meta{connection$_2$} +% is set to |\ncarc[arcangleA=10,arcangleB=45]}| and \\ +% |\ncarc[arcangleA=-10,arcangleB=-45]|, +% respectively. +% \begin{quote} +% |\hspace*{6cm}\entity{Country}|\\ +% |\relationshipbetween{Country}(A)[0:n]{Country}(B)[0:n]|\\ +% | {Neighbor}(8em,180)| +% \vspace*{0.8cm}\\ +% \hspace*{6cm}\entity{Country} +% \relationshipbetween{Country}(A)[0:n]{Country}(B)[0:n]{Neighbor}(8em,180) +% \bigskip +% \end{quote} +% +% With the above commands, only binary relationships can be +% represented. Thus, there is one more macro, relating +% entity nodes with already existing relationship nodes: +% +% \DescribeMacro\inrelationship +% \begin{quote} +% |\inrelationship[|\meta{property}|]{|\meta{entity-id}|}(|\meta{role}|)[|\ignorespaces +% \meta{card}|]|\\ +% | /|\meta{connection}|/{|\meta{relationship-id}|}| +% \end{quote} +% +% With this, n-ary relations can be represented: +% \begin{quote} +% |\begin{tabular}{c}| \\ +% |\entity{Person} \hspace*{6cm} \entity{Project} \\[2cm]| \\ +% |\entity{Machine}| \\ +% |\end{tabular}| \\ +% |\relationshipbetween{Person}{Project}{worksatwith}|\ignorespaces +% |[works\_at\_with]|\\ +% | /\ncarc[arcangle=-20]/|\\ +% |\inrelationship{Machine}{worksatwith}| +% \bigskip\\ +% \begin{tabular}{c} +% \entity{Person} \hspace*{6cm} \entity{Project} \\[2cm] +% \entity{Machine} +% \end{tabular} +% \relationshipbetween{Person}{Project}{worksatwith}[works\_at\_with] +% /\ncarc[arcangle=-20]/ +% \inrelationship{Machine}{worksatwith} +% \end{quote} +% +% Additionally, there is a straightforward extension of +% |\inrelationship| to relationship +% nodes which do not already exist but are set by the command: +% +% \begin{quote} +% |\inrelationship{|\meta{entity-id}|}(|\meta{role}|)|\ignorespaces +% |[|\meta{card}|]/|\meta{connection}|/|\\ +% | {|\meta{relationship-id}|}[|\meta{relationship-name}|]|\ignorespaces +% |(|\meta{distance},\meta{angle}|)| +% \end{quote} +% +% \begin{quote} +% |\begin{tabular}{c}| \\ +% |\entity{Person} \hspace*{6cm} \entity{Project} \\[2cm]| \\ +% |\entity{Machine}| \\ +% |\end{tabular}| \\ +% |\inrelationship{Machine}{worksatwith}[works\_at\_with](4em,90)| \\ +% |\inrelationship{Person}{worksatwith}| \\ +% |\inrelationship{Project}{worksatwith}| +% \bigskip \\ +% \begin{tabular}{c} +% \entity{Person} \hspace*{6cm} \entity{Project} \\[2cm] +% \entity{Machine} +% \end{tabular} +% \inrelationship{Machine}{worksatwith}[works\_at\_with](4em,90) +% \inrelationship{Person}{worksatwith} +% \inrelationship{Project}{worksatwith} +% \end{quote} +% +% \DescribeMacro\rolepos +% The position where roles and cardinalities are placed on the +% node connection is determined by |\rolepos| and |\cardpos| which +% \DescribeMacro\cardpos +% can be set by |\rolepos{|\meta{number}|}| and +% |\cardpos{|\meta{number}|}|, where number underlies the same +% constraints as for |npos| in PSTricks (i.e., for |\ncline| and +% |\ncarc|, it has to be between 0 and 1, other values are allowed +% e.g.\ for |\ncbar|). The default setting is |\cardpos{0.5}| and +% |\rolepos{0.85}|. +% +% \subsection{Annotations to Objects} +% \DescribeMacro\annote +% With +% \begin{quote} +% |\annote{|\meta{id}|}{|\meta{text}|}(|\meta{distance},\meta{angle}|)| +% \end{quote} +% a node \meta{id} can be annoted with a comment \meta{text}. +% +% \subsection{Usage} +% +% The package is intended to be used for two purposes: +% \begin{itemize} +% \item Typesetting small fragments of ER-diagrams, e.g., for +% lecture notes and slides: as shown in the above +% documentation, fragments of ER-diagrams can easily be integrated +% with the running text. +% \item Typesetting ER-Diagrams for project documentation: +% here the standard procedure is to design the ER-diagram based +% on a |tabular| environment in which the entity nodes are positioned; +% Then, attributes and relationships are positioned in the above +% declarative way. Using basic PSTricks commands, additional +% entity nodes can also be placed declaratively. +% \end{itemize} +% +% There are the following advantages compared to using graphics tools, +% e.g., xfig: +% \begin{itemize} +% \item the source code of the diagrams is written into the running +% source code of the document, thus there is no need for a bunch +% of separate |.fig| and |.eps| files. +% \item more flexibility wrt.\ renaming and layout changes. +% \item given the positions of some basic objects, the other +% objects are set with declarative commands, i.e.\ they +% automatically adjust when the positions change. +% \end{itemize} +% +% \subsection{Example} +% +% \begin{landscape} +% \newcommand*{\Mondial}{\textsc{Mondial}} +% \newif\ifblackwhite +% \blackwhitefalse +% \ifblackwhite +% \definecolor{verylightgray}{gray}{0.95} +% \seticonparams{entity}{shadow=true,fillcolor=lightgray,fillstyle=solid} +% \seticonparams{attribute}{fillcolor=lightgray,fillstyle=solid} +% \seticonparams{relationship}{shadow=true,fillcolor=lightgray,fillstyle=solid} +% \else +% \definecolor{lightblue}{rgb}{0.68, 0.85, 0.95} +% \definecolor{verylightblue}{rgb}{0.34, 0.42, 0.5} +% \definecolor{lightgreen}{rgb}{0.00, 0.98, 0.60} +% \definecolor{verylightgreen}{rgb}{0.00, 0.5, 0.30} +% \definecolor{lightred}{rgb}{1.00, 0.71, 0.76} +% \definecolor{verylightred}{rgb}{0.50, 0.351, 0.38} +% \seticonparams{entity}{shadow=true,fillcolor=lightred,fillstyle=solid} +% \seticonparams{attribute}{fillcolor=lightblue,fillstyle=solid} +% \seticonparams{relationship}{shadow=true,fillcolor=lightgreen,fillstyle=solid} +% \fi +% +% \psset{nodesep=0pt} +% \resizebox{1.25\textheight}{!}{% +% \begin{tabular}{ccc} +% \begin{tabular}{c} +% \entity{Language} \\[12em] +% \entity{EthnicGrp}[Ethnic Grp] \\[12em] +% \entity{Religion} +% \end{tabular} +% \hspace{10em} +% \begin{tabular}{c@{\hspace{10em}}c} +% &\entity[weak]{City} \\[2em] +% \entity{Organization}\\[12em] +% \entity{Country} \\[12em] +% \entity{Continent}\\[2em] +% &\entity[weak]{Province} +% \end{tabular} +% \hspace{10em} +% \begin{tabular}{c} +% \entity{Lake} \\[5em] +% \entity{River} \\[5em] +% \entity{Sea}\\[9em] +% \entity{Mountain}\\[7em] +% \entity{Island}\\[7em] +% \entity{Desert} +% \end{tabular} +% \end{tabular} +% \nodeconnections{\small +% \relationshipbetween{Country}{City}{capital}[is\_capital] +% \relationshipbetween{Province}{City}{capital}[is\_capital](0.4) +% \relationshipbetween[ident]{Province}{City}{in}/\ncarc[arcangle=-30]/ +% \relationshipbetween[weak]{Province}{Country}{of} +% \relationshipbetween{Country}{Organization}{ismember}[is\_member](0.6) +% \relationshipbetween{Organization}{City}{hashqin}[has\_hq\_in] +% \relationshipbetween{Country}{Continent}{encompasses}(0.8) +% \relationshipbetween{Country}(A) +% /\ncline[nodesepB=-1cm,offsetA=0.1em,offsetB=0.4cm]/ +% {Country}(B) +% /\ncline[nodesepB=-1cm,offsetA=-0.1em,offsetB=-0.4cm]/ +% {borders}(7em,0) +% \relationshipbetween{Province}{Lake}{in} +% \relationshipbetween{Province}{River}{in} +% \relationshipbetween{Province}{Sea}{in} +% \relationshipbetween{Province}{Mountain}{in} +% \relationshipbetween{Province}{Island}{in} +% \relationshipbetween{Province}{Desert}{in} +% \relationshipbetween{City}{Lake}{at} +% \relationshipbetween{City}{River}{at} +% \relationshipbetween{City}{Sea}{at} +% \inrelationship{River}(main)/\ncarc[arcangle=30]/{flows into} +% [flows into](4em,0) +% \inrelationship{River}(trib.)/\ncarc[arcangle=-30]/{flowsinto} +% \inrelationship{Lake}{flowsinto} +% \inrelationship{Sea}{flowsinto} +% \relationshipbetween{Sea}(A){Sea}(B){merges}(4em,270) +% \relationshipbetween{EthnicGrp}{Country}{belong}(0.3) +% \relationshipbetween{Religion}{Country}{believe}(0.3) +% \relationshipbetween{Language}{Country}{speak}(0.4) +% \attributeof{City}{90}[key]{name} +% \attributeof{City}{45}{pop.} +% \attributeof{City}{0}{longitude} +% \attributeof{City}{-45}{latitude} +% \attributeof{Organization}{70}[key]{abbrev} +% \attributeof{Organization}{130}{name} +% \attributeof{Organization}[4em]{1800}{establ.} +% \attributeof{ismember}{40}{type} +% \attributeof{borders}{60}{length} +% \attributeof{Country}[3em]{30}{name} +% \attributeof{Country}{70}[key]{code} +% \attributeof{Country}{130}{pop.} +% \attributeof{Country}[3em]{190}{area} +% \attributeof{Country}{230}{gov.} +% \attributeof{Country}{280}{infl.} +% \attributeof{Country}[3em]{330}{gdp} +% \attributeof{Country}[4em]{100}{pop.grw} +% \attributeof{Country}[5em]{160}{inf.mort} +% \attributeof{Country}[6.5em]{-30}{gdp.agr} +% \attributeof{Country}[5.5em]{-50}{gdp.serv} +% \attributeof{Country}[5em]{-80}{gdp.ind} +% \attributeof{Country}[5em]{-120}{governm.} +% \attributeof{Continent}{-60}[key]{name} +% \attributeof{Continent}{-120}{area} +% \attributeof{Language}{90}[key]{name} +% \attributeof{speak}{60}{percent} +% \attributeof{EthnicGrp}{90}[key]{name} +% \attributeof{belong}{-90}{percent} +% \attributeof{Religion}{90}[key]{name} +% \attributeof{believe}{-90}{percent} +% \attributeof{encompasses}[4em]{-160}{percent} +% \attributeof{Province}[4em]{180}[key]{name} +% \attributeof{Province}{225}{pop.} +% \attributeof{Province}{270}{area} +% \attributeof{Lake}{0}[key]{name} +% \attributeof{Lake}{180}{area} +% \attributeof{River}{90}[key]{name} +% \attributeof{River}{180}{length} +% \attributeof{Sea}{0}[key]{name} +% \attributeof{Sea}{180}{depth} +% \attributeof{Mountain}{135}[key]{name} +% \attributeof{Mountain}{45}{height} +% \attributeof{Mountain}{-90}{mtcoord}[geo coord] +% \attributeof{mtcoord}[3em]{20}{longitude} +% \attributeof{mtcoord}[3em]{-20}{latitude} +% \attributeof{Island}{90}[key]{name} +% \attributeof{Island}{40}{islands} +% \attributeof{Island}{-90}{islcoord}[geo coord] +% \attributeof{islcoord}[3em]{20}{longitude} +% \attributeof{islcoord}[3em]{-20}{latitude} +% \attributeof{Desert}{90}[key]{name} +% \attributeof{Desert}{0}{area} +% }} +% \end{landscape} +% +% \subsection{Miscellaneous} +% +% \DescribeMacro\nodeconnections +% With |\nodeconnections{|\meta{PSTricks-node-connections}|}|, +% the PSTricks-node connections and label commands do not require any +% extra horizontal or vertical space. +% +% \DescribeMacro\database +% The command +% \begin{quote} +% |\database[|\meta{pos}|]{|\meta{width}|}{|\ignorespaces +% \meta{height}|}[|\meta{graph\_params}|]{|\ignorespaces +% \meta{text}|}[|\meta{id}|]| +% \end{quote} +% defines a database barrel as a tabular which is vertically +% centered as given in the optional argument \meta{pos} (Default: |[c]|). +% \meta{text} is the text to be written on the front of the barrel, +% \meta{width} and \meta{height} give the width and height of the +% barrel; both must be a dimension, e.g., {2cm}. With the optional +% graphics parameter \meta{graph\_params}, the pstricks parameters +% \textsf{fillstyle} and +% \textsf{fillcolor} for the database can be set (see example below). +% The optional argument \meta{id} is used as an internal name, +% it must start with a letter and must contain only letters and +% digits. \meta{id} is used for |\rnode| definitions: +% \meta{id} is the whole barrel +% |lu|\meta{id}, |ru|\meta{id}, |mu|\meta{id}, and |muf|\meta{id} +% denote the points at the upper left corner, upper right corner, +% upper middle behind and aupper middle in front of the barrel. +% Analogously, |ll|\meta{id}, |rl|\meta{id}, and |ml|\meta{id}, +% denote the lower left and lower right corner and lower middle in +% front of the barrel. \medskip +% +% \begin{tabular}{lc} +% |\psset{nodesep=2pt}|\\ +% |\begin{tabular}{lc}| \\ +% | &\rnode{lu}{lu}\quad\rnode{mu}{mu}\quad| \\ +% | \rnode{muf}{muf}\quad\rnode{ru}{ru}\\[1em]| \\ +% | \rnode{db}{database}|\\ +% | &\database[t]{2cm}{1cm}| \\ +% | [fillstyle=solid,fillcolor=red]| \\ +% | {database}[example] \\[5em]| \\ +% | &\rnode{ll}{ll}\qquad\rnode{ml}{ml}|\\ +% | \qquad\rnode{rl}{rl}| \\ +% |\end{tabular}| \\ +% |\nodeconnections{%| \\ +% |\ncline{->}{lu}{luexample}| \\ +% |\ncline{->}{mu}{muexample}| \\ +% |\ncline{->}{muf}{mufexample}| \\ +% |\ncline{->}{ru}{ruexample}| \\ +% |\ncline{->}{ll}{llexample}| \\ +% |\ncline{->}{ml}{mlexample}| \\ +% |\ncline{->}{db}{example}| \\ +% |\ncline{->}{rl}{rlexample}}| +% \end{tabular} +% \hspace*{-1.5cm} +% \psset{nodesep=2pt} +%\begin{tabular}{lc} +% &\rnode{lu}{lu}\quad\rnode{mu}{mu}\quad +% \rnode{muf}{muf}\quad\rnode{ru}{ru}\\[1em] +% \rnode{db}{database} +% &\database[t]{2cm}{1cm} +% [fillstyle=solid,fillcolor=red] +% {database}[example] \\[5em] +% &\rnode{ll}{ll}\qquad\rnode{ml}{ml}\qquad\rnode{rl}{rl} +% \end{tabular} +% \nodeconnections{% +% \ncline{->}{lu}{luexample} +% \ncline{->}{mu}{muexample} +% \ncline{->}{muf}{mufexample} +% \ncline{->}{ru}{ruexample} +% \ncline{->}{ll}{llexample} +% \ncline{->}{ml}{mlexample} +% \ncline{->}{db}{example} +% \ncline{->}{rl}{rlexample}} +% +% \section{Code Documentation}\label{sec:code} +% \iffalse +% \subsection{The documentation driver file} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you are +% currently reading. It will be extracted from this file by the +% \texttt{docstrip} program. Since it is the first code in the file +% one can alternatively process this file directly with \LaTeXe{} to +% obtain the documentation. +% +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\usepackage[dvips]{geometry} +\usepackage{latexsym} +\usepackage{pst-dbicons,lscape} +\parindent0pt\hfuzz2pt +\begin{document} + \DocInput{pst-dbicons.dtx} +\end{document} +%</driver> +% \end{macrocode} +%\fi +% \setcounter{CodelineNo}{0} +%\iffalse +%<*package>\fi +% +% Required packages from the PSTricks bundle +% +% \begin{macrocode} +\RequirePackage{pstricks} +\RequirePackage{pst-node} +% \end{macrocode} +% +% \begin{macrocode} +\typeout{Style `\basename', Version \fileversion\space <\filedate>} +\ProvidesPackage{pst-dbicons}[\filedate \space\fileversion] +% \end{macrocode} +% +% \begin{macro}{\seticonparams} +% |\seticonparams{#1}{#2}| +% \Codelabel{seticonparams} +% \begin{macrocode} +\def\seticonparams#1#2{\expandafter\def\csname #1@parm\endcsname{[#2]}} +\seticonparams{entity}{fillstyle=none} +\seticonparams{relationship}{fillstyle=none} +\seticonparams{attribute}{fillstyle=none} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\purifylabel} +% \changes{v0.14}{02/11/21}{macro added} +% Macro |\@purifylabel| expands the string given in |#2| +% and stores the result in command given in |#1|. +% Supported TeX commands in string |#2|: +% |\_|, |\textunderscore| +% Example: |\@purifylabel{\templabel}{has\_hq\_in}|, then use +% |\templabel| as nodelabel for pstricks. +% \Codelabel{purifylabel} +% \begin{macrocode} +\def\dbi@purifylabel#1#2{% + \begingroup + \edef\_{\string_}% + \edef\textunderscore{\string_}% + \edef\x{\endgroup + \def\noexpand#1{#2}% + }% + \x +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\entity} +% \changes{v0.11}{98/10/15}{added optional property of entities} +% |\entity[#1a]{#1b}[#2]| +% \Codelabel{entity} +% \begin{macrocode} +\def\entity{% + \@ifnextchar[{\entity@i}{\entity@i[normal]}} +\def\entity@i[#1]#2{% + \@ifnextchar[{\entity@ii{#1}{#2}}{\entity@ii{#1}{#2}[#2]}} +\def\entity@ii#1#2[#3]{\csname entity@#1\endcsname{#2}{#3}} +\def\entity@normal#1#2{% + \dbi@purifylabel{\dbi@prfd@nodename}{#1}% + \rnode{\dbi@prfd@nodename}{\expandafter\psframebox\entity@parm{\strut#2}}} +\def\entity@weak#1#2{% + {\psset{doubleline=true}% + \dbi@purifylabel{\dbi@prfd@nodename}{#1}% + \rnode{\dbi@prfd@nodename}{\expandafter\psframebox\entity@parm{\strut#2}}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\attribute} +% |\attribute[#1]{#2}[#3]| +% \Codelabel{attribute} +% \begin{macrocode} +\def\attribute{% + \@ifnextchar[{\attribute@i}{\attribute@i[sv]}} +\def\attribute@i[#1]#2{% + \@ifnextchar[{\attribute@ii{#1}{#2}}{\attribute@ii{#1}{#2}[#2]}} +\def\attribute@ii#1#2[#3]{\csname attribute@#1\endcsname{#2}{#3}} +\def\attribute@mv#1#2{{\psset{doubleline=true}% + \dbi@purifylabel{\dbi@prfd@nodename}{#1}% + \expandafter\ovalnode\attribute@parm{\dbi@prfd@nodename}{#2}}} +\def\attribute@sv#1#2{% + \dbi@purifylabel{\dbi@prfd@nodename}{#1}% + \expandafter\ovalnode\attribute@parm{\dbi@prfd@nodename}{#2}} +\def\attribute@key#1#2{ + \dbi@purifylabel{\dbi@prfd@nodename}{#1}% + \expandafter\ovalnode\attribute@parm{\dbi@prfd@nodename}{\underline{#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\attributeof} +% |\attributeof{#1}[#2]{#3}[#4]{#5}[#6]| +% \begin{macrocode} +\newdimen\@attrdist +\@attrdist2em % Default value for distance of attribute from entity +\def\attrdist#1{\@attrdist#1} % set default distance +% \end{macrocode} +% +% \Codelabel{attributeof} +% \begin{macrocode} +\def\attributeof#1{% + \@ifnextchar[{\attributeof@i{#1}}{\attributeof@i{#1}[\attrdist]}} +\def\attributeof@i#1[#2]#3{% + \@ifnextchar[{\attributeof@ii{#1}[#2]{#3}}{\attributeof@ii{#1}[#2]{#3}[sv]}} +\def\attributeof@ii#1[#2]#3[#4]#5{% + \@ifnextchar[{\attributeof@iii{#1}[#2]{#3}[#4]{#5}}% + {\attributeof@iii{#1}[#2]{#3}[#4]{#5}[#5]}} +\def\attributeof@iii#1[#2]#3[#4]#5[#6]{% + \SpecialCoor + \dbi@purifylabel{\dbi@prfd@nodename}{#1}% + \uput{#2}[#3]{0}(\dbi@prfd@nodename){\attribute[#4]{#5}[#6]}% + \NormalCoor + \ncline{-}{#1}{#5}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\relationship} +% \changes{v0.11}{98/10/15}{added optional property of relationships} +% |\relationship[#1a]{#1b}[#2]| +% \Codelabel{relationship} +% \begin{macrocode} +\def\relationship{% + \@ifnextchar[{\relationship@i}{\relationship@i[normal]}} +\def\relationship@i[#1]#2{% + \@ifnextchar[{\relationship@ii{#1}{#2}}{\relationship@ii{#1}{#2}[#2]}} +\def\relationship@ii#1#2[#3]{\csname relationship@#1\endcsname{#2}{#3}} +\def\relationship@normal#1#2{% + \dbi@purifylabel{\dbi@prfd@nodename}{#1}% + \expandafter\dianode\relationship@parm{\dbi@prfd@nodename}{#2}} +\def\relationship@weak#1#2{% + {\psset{doubleline=true}% + \dbi@purifylabel{\dbi@prfd@nodename}{#1}% + \expandafter\dianode\relationship@parm{\dbi@prfd@nodename}{#2}}} +\let\relationship@ident\relationship@weak +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\relationshipbetween} +% \changes{v0.11}{98/10/15}{added optional property of relationships} +% |\relationshipbetween[#1a]{#1b}(#2)[#3]/#4/{#5}(#6)[#7]/#8/{#9}[#10]/#11/(#12)| +% \Codelabel{relationshipbetween} +% \begin{macrocode} +\newtoks\rolepos +\rolepos{0.85}% +\newtoks\cardpos +\cardpos{0.5}% +\newif\ifdbi@recursive +\def\relationshipbetween{% + \@ifnextchar[{\relationshipbetween@type}{\relationshipbetween@type[normal]}} +\def\relationshipbetween@type[#1]#2{\dbi@recursivefalse% + \def\relationtype{#1}% + \@ifnextchar({\relationshipbetween@i@role{#2}}% + {\relationshipbetween@i@role{#2}(\relax)}} +\def\relationshipbetween@i@role#1(#2){% + \@ifnextchar[{\relationshipbetween@i@card{#1}{#2}}% + {\relationshipbetween@i@card{#1}{#2}[\relax]}} +\def\relationshipbetween@i@card#1#2[#3]{% + \@ifnextchar/{\relationshipbetween@i@linetype{#1}{#2}{#3}}% + {\relationshipbetween@i@linetype{#1}{#2}{#3}/\relax/}}% +\def\relationshipbetween@i@linetype#1#2#3/#4/#5{% + \def\dbi@linecmd@i{#4}% + \def\dbi@tempa{#1}\def\dbi@tempb{#5}% + \ifx\dbi@tempa\dbi@tempb\dbi@recursivetrue\fi + \ifx#4\relax + \ifdbi@recursive + \def\dbi@linecmd@i{\ncarc[arcangleA=10,arcangleB=45]}% + \else\def\dbi@linecmd@i{\ncline}\fi\fi + \@ifnextchar({\relationshipbetween@ii@role{#1}{#2}{#3}{#5}}% + {\relationshipbetween@ii@role{#1}{#2}{#3}{#5}(\relax)}}% +\def\relationshipbetween@ii@role#1#2#3#4(#5){% + \@ifnextchar[{\relationshipbetween@ii@card{#1}{#2}{#3}{#4}{#5}}% + {\relationshipbetween@ii@card{#1}{#2}{#3}{#4}{#5}[\relax]}} +\def\relationshipbetween@ii@card#1#2#3#4#5[#6]{% + \@ifnextchar/{\relationshipbetween@ii@linetype{#1}{#2}{#3}{#4}{#5}{#6}}% + {\relationshipbetween@ii@linetype{#1}{#2}{#3}{#4}{#5}{#6}% + /\relax/}}% +\def\relationshipbetween@ii@linetype#1#2#3#4#5#6/#7/#8{% + \def\dbi@linecmd@ii{#7}% + \ifx#7\relax + \ifdbi@recursive + \def\dbi@linecmd@ii{\ncarc[arcangleA=-10,arcangleB=-45]}% + \else\def\dbi@linecmd@ii{\ncline}\fi\fi + \@ifnextchar[{\relationshipbetween@optname{#1}{#2}{#3}{#4}{#5}{#6}{#8}}% + {\relationshipbetween@optname{#1}{#2}{#3}{#4}{#5}{#6}{#8}[#8]}}% +\def\relationshipbetween@optname#1#2#3#4#5#6#7[#8]{% + \@ifnextchar/{\relationshipbetween@linetype{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}% + {\relationshipbetween@linetype{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}% + /\ncline/}}% +\def\relationshipbetween@linetype#1#2#3#4#5#6#7#8/#9/{% + \def\dbi@linecmd{#9}% + \@ifnextchar({\relationshipbetween@pos{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}% + {\relationshipbetween@pos{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}(0.5)}}% +\def\relationshipbetween@pos#1#2#3#4#5#6#7#8(#9){% + \ifdbi@recursive + \relationshipbetween@rec{#1}{#2}{#3}{#5}{#6}{#7}{#8}(#9)\else + \relationshipbetween@nonrec{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}(#9)\fi} +% \end{macrocode} +% +% \Codelabel{relationshipbetweennonrec} +% \begin{macrocode} +\def\relationshipbetween@nonrec#1#2#3#4#5#6#7#8(#9){% + \dbi@purifylabel{\dbi@prfd@nodename@i}{#1}% + \dbi@purifylabel{\dbi@prfd@nodename@ii}{#4}% + \dbi@purifylabel{\dbi@prfd@nodename@iii}{#7}% + {\psset{linestyle=none}% + \dbi@linecmd{-}{\dbi@prfd@nodename@i}{\dbi@prfd@nodename@ii}}% + \ncput[npos=#9]{\relationship[\relationtype]{#7}[#8]}% + \dbi@linecmd@i{-}{\dbi@prfd@nodename@i}{\dbi@prfd@nodename@iii}% + \ifx#3\relax\else\ncput*[npos=\the\cardpos]{#3}\fi + \ifx#2\relax\else\ncput*[npos=\the\rolepos]{#2}\fi + \dbi@linecmd@ii{-}{\dbi@prfd@nodename@ii}{\dbi@prfd@nodename@iii}% + \ifx#6\relax\else\ncput*[npos=\the\cardpos]{#6}\fi + \ifx#5\relax\else\ncput*[npos=\the\rolepos]{#5}\fi} +% \end{macrocode} +% +% \Codelabel{relationshipbetweenrec} +% \begin{macrocode} +\def\relationshipbetween@rec#1#2#3#4#5#6#7(#8,#9){% + \dbi@purifylabel{\dbi@prfd@nodename@i}{#1}% + \dbi@purifylabel{\dbi@prfd@nodename@ii}{#6}% + \SpecialCoor + \uput{#8}[#9]{0}(\dbi@prfd@nodename@i)% + {\relationship[\relationtype]{#6}[#7]}% + \NormalCoor + \dbi@linecmd@i{-}{\dbi@prfd@nodename@i}{\dbi@prfd@nodename@ii}% + \ifx#3\relax\else\ncput*[npos=\the\cardpos]{#3}\fi + \ifx#2\relax\else\ncput*[npos=\the\rolepos]{#2}\fi + \dbi@linecmd@ii{-}{\dbi@prfd@nodename@i}{\dbi@prfd@nodename@ii}% + \ifx#5\relax\else\ncput*[npos=\the\cardpos]{#5}\fi + \ifx#4\relax\else\ncput*[npos=\the\rolepos]{#4}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\inrelationship} +% \changes{v0.11}{98/10/15}{added optional property of relationships} +% |\inrelationship[#1a]{#1b}(#2)[#3]/#4/{#5}[#6](#7,#8)| +% \Codelabel{inrelationship} +% \begin{macrocode} +\def\inrelationship{% + \@ifnextchar[{\inrelationship@type}{\inrelationship@type[normal]}} +\def\inrelationship@type[#1]#2{% + \def\relationtype{#1}% + \@ifnextchar({\inrelationship@role{#2}}% + {\inrelationship@role{#2}(\relax)}} +\def\inrelationship@role#1(#2){% + \@ifnextchar[{\inrelationship@card{#1}{#2}}% + {\inrelationship@card{#1}{#2}[\relax]}} +\def\inrelationship@card#1#2[#3]{% + \@ifnextchar/{\inrelationship@linetype{#1}{#2}{#3}}% + {\inrelationship@linetype{#1}{#2}{#3}/\ncline/}}% +\def\inrelationship@linetype#1#2#3/#4/#5{% + \dbi@purifylabel{\dbi@prfd@nodename@i}{#1}% + \dbi@purifylabel{\dbi@prfd@nodename@ii}{#5}% + \def\dbi@linecmd{#4}% + \@ifnextchar[{\inrelationship@newrel{#1}{#2}{#3}{#5}}% + {\@ifnextchar({% + \inrelationship@newrel{#1}{#2}{#3}{#5}[#5]}% + {\dbi@linecmd{-}{\dbi@prfd@nodename@i}{\dbi@prfd@nodename@ii} + \ifx#3\relax\else\ncput*[npos=\the\cardpos]{#3}\fi + \ifx#2\relax\else\ncput*[npos=\the\rolepos]{#2}\fi}}}% +% \end{macrocode} +% +% \Codelabel{inrelationshipnewrel} +% \begin{macrocode} +\def\inrelationship@newrel#1#2#3#4[#5]{% + \@ifnextchar({\inrelationship@newrel@pos{#1}{#2}{#3}{#4}{#5}}% + {\PackageError{\basename}{Position of relationship #4 + undefined.}\@eha}} +\def\inrelationship@newrel@pos#1#2#3#4#5(#6,#7){% + \SpecialCoor + \dbi@purifylabel{\dbi@prfd@nodename@i}{#1}% + \dbi@purifylabel{\dbi@prfd@nodename@ii}{#4}% + \uput{#6}[#7]{0}(\dbi@prfd@nodename@i){\relationship[\relationtype]{#4}[#5]}% + \NormalCoor + \dbi@linecmd{-}{\dbi@prfd@nodename@i}{\dbi@prfd@nodename@ii} + \ifx#3\relax\else\ncput*[npos=\the\cardpos]{#3}\fi + \ifx#2\relax\else\ncput*[npos=\the\rolepos]{#2}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\annote} +% \setcounter{CodelineNo}{0} +% \changes{v0.11}{98/09/24}{added annote} +% \begin{macrocode} +\def\annote#1#2(#3,#4){% + \dbi@purifylabel{\dbi@prfd@nodename}{#1}% + \SpecialCoor + \uput{#3}[#4]{0}(\dbi@prfd@nodename){#2}% + \NormalCoor} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nodeconnections} +% \setcounter{CodelineNo}{0} +% \begin{macrocode} +\def\nodeconnections#1{\hbox to 0cm{\vbox to 0cm {#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\database} +% \changes{v0.13}{98/11/22}{added graphics parameters to database} +% \changes{v0.15}{05/09/09}{debugged vertical placement} +% |\database[#1]{#2}{#3}[#4]{#5}[#6]| +% \Codelabel{database} +% \begin{macrocode} +\def\database{\@ifnextchar[{\database@i}{\database@i[c]}} +\def\database@i[#1]#2#3{% + \@ifnextchar[{\database@ii{#1}{#2}{#3}}% + {\database@ii{#1}{#2}{#3}[fillstyle=none]}} +\def\database@ii#1#2#3[#4]#5{% + \@ifnextchar[{\database@iii{#1}{#2}{#3}{#4}{#5}}% + {\database@iii{#1}{#2}{#3}{#4}{#5}[#5]}} +\def\database@iii#1#2#3#4#5[#6]{% + \psset{nodesep=0pt}% + \dbi@purifylabel{\dbi@prfd@nodename}{#6}% + \rnode{\dbi@prfd@nodename}{% + \begin{tabular}[#1]{c}% + \rnode{lu\dbi@prfd@nodename}{}\hspace{#2}\rnode{ru\dbi@prfd@nodename}{}\\[#3] + \rnode{ll\dbi@prfd@nodename}{}\hspace{#2}\rnode{rl\dbi@prfd@nodename}{}% + \end{tabular}}% + \nodeconnections{% + \ncbar[linestyle=none,#4, + angleA=180,angleB=180,armB=0]{ru\dbi@prfd@nodename}{ll\dbi@prfd@nodename} + \ncbar[linestyle=none,#4, + angleA=0,angleB=0,armA=0]{ru\dbi@prfd@nodename}{ll\dbi@prfd@nodename} + \nccurve[#4,angleA=90,angleB=90,ncurv=.6]{lu\dbi@prfd@nodename}{ru\dbi@prfd@nodename}% + \ncput{\rnode{mu\dbi@prfd@nodename}{}}% + \nccurve[angleA=-90,angleB=-90,ncurv=.6]{lu\dbi@prfd@nodename}{ru\dbi@prfd@nodename}% + \ncput{\rnode{muf\dbi@prfd@nodename}{}}% + \nccurve[#4,angleA=-90,angleB=-90,ncurv=.6]{ll\dbi@prfd@nodename}{rl\dbi@prfd@nodename}% + \ncput{\rnode{ml\dbi@prfd@nodename}{}}% + \ncline{lu\dbi@prfd@nodename}{ll\dbi@prfd@nodename}% + \ncline{ru\dbi@prfd@nodename}{rl\dbi@prfd@nodename}% + \ncline[linestyle=none]{muf\dbi@prfd@nodename}{ml\dbi@prfd@nodename}\ncput[npos=0.4]{#5}}} +% \end{macrocode} +% \end{macro} +% +%\iffalse +%</package> +%\fi +% \GlossaryPrologue{} +% +% \IfFileExists{pst-dbicons.gls}{\PrintChanges} +% {\begin{quote}You should create the list of changes by +% +% ~~~ \texttt{makeindex -s gglo.ist -o dbicons.gls dbicons.glo} +% +% and running \texttt{latex pst-dbicons.drv} again.\end{quote}} +% +% +% \subsection{Acknowledgements} +% +% Thanx to Heiko Oberdiek for adding the handling of ids for +% internal use in postcsript (used in the |purifylabel| macro). +% +% \Finale +\endinput + diff --git a/Master/texmf-dist/source/generic/pst-dbicons/pst-dbicons.ins b/Master/texmf-dist/source/generic/pst-dbicons/pst-dbicons.ins new file mode 100644 index 00000000000..411e431cf8a --- /dev/null +++ b/Master/texmf-dist/source/generic/pst-dbicons/pst-dbicons.ins @@ -0,0 +1,17 @@ +\def\filedate{2006/11/26} +\def\batchfile{pst-dbicons.ins} +\input docstrip.tex +\generateFile{pst-dbicons.drv}{t}{\from{pst-dbicons.dtx}{driver}} +\generateFile{pst-dbicons.sty}{t}{\from{pst-dbicons.dtx}{package}} +% +\Msg{***************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* All the files with the extension '.sty'} +\Msg{*} +\Msg{* To produce the documentation run the .drv File through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***************************************************************} |