%% Package für ER-Modelle
%%
%% (c) Paul Ebermann (Paul-Ebermann@gmx.de)
%%
%% Verwendung frei gestattet, bei Änderungen,
%% die nicht durch mich (P.E.) erfolgen, ist der
%% Dateiname zu ändern und die Änderung als solche
%% zu kennzeichnen (am Anfang und an der
%% entsprechenden Stelle).


\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{ermodel}[2002/11/18 v1.0 Entity-Relationship-Modelle]

\RequirePackage{pst-node}
\RequirePackage{subfigure}
\RequirePackage{ifthen}


\newcommand{\gridOrNotGrid}{\typeout{^^J kein Grid ^^J}}


\DeclareOption{showgrid} {
  \renewcommand{\gridOrNotGrid}{\showgrid\typeout{^^J Grid wird angezeigt! ^^J}}
  \typeout{^^J showgrid wurde aktiviert! ^^J}
}

\ProcessOptions



%%%
%%% Bilder sollten in einer ER-Diagramm-Umgebung
%%% enthalten sein.
%%%
\newenvironment{erdiagram}[1]
{
  \renewcommand{\nodeprefix}{#1}
  \begin{pspicture}
}
{
  \gridOrNotGrid
  \renewcommand{\nodeprefix}{}
  \end{pspicture}
}


%%% Zu Debug-Zwecken: Gitter für die Positionierung der Figuren
\newpsobject{showgrid}{psgrid}{subgriddiv=1,griddots=10,gridlabels=6pt}

\newcommand{\nodeprefix}{}




%%%
%%% Attribut einer Entity.
%%%
%%% \attribut{Name}{rep}
%%% \attribut[iso]{ISO-Code}{Land}
%%%
%%% Das erste (optionale) Argument darf nur
%%% aus Zahlen und Buchstaben bestehen -
%%% sonst nichts. Falls es weggelassen wird,
%%% gilt dies für das zweite Argument, welches
%%% (immer) die Beschriftung angibt.
%%%
%%% Das dritte Argument gibt die Entity an,
%%% zu der das Attribut gehört.
%%%
\newcommand{\attribut}[3][]
{
   \ifthenelse{\equal{#1}{}}
   {\attrImpl{#2}{#2}{#3}}
   {\attrImpl{#1}{#2}{#3}}
}


%%%
%%% Schlüsselattribut (wird unterstrichen gezeichnet).
%%%
%%% \keyAttribut{Name}{rep}
%%% \keyAttribut[iso]{ISO-Code}{Land}
%%%
%%% Das erste (optionale) Argument darf nur
%%% aus Zahlen und Buchstaben bestehen -
%%% sonst nichts. Falls es weggelassen wird,
%%% gilt dies für das zweite Argument, welches
%%% (immer) die Beschriftung angibt.
%%%
%%% Das dritte Argument gibt die Entity an,
%%% zu der das Attribut gehört.
%%%
\newcommand{\keyAttribut}[3][]
{
   \ifthenelse{\equal{#1}{}}
   {\attrImpl{#2}{\underline{#2}}{#3}}
   {\attrImpl{#1}{\underline{#2}}{#3}}
}


%%%
%%% Generalisierung.
%%%
%%%  \generalisierung{<generell>}{<speziell1>}{<spezielle2>}{<constr>}
%%%
\newcommand{\generalisierung}[4]
{
   \begin{pspicture}(0,0)(0,0)
      %% Eckpunkte anlegen
      \pnode(0,0){\nodeprefix#1genNord}
      \pnode(-0.7,-0.7){\nodeprefix#1genSuedwest}
      \pnode(0.7,-0.7){\nodeprefix#1genSuedost}
      \pnode(0,-0.7){\nodeprefix#1genSued}
      %% Dreieck malen:
      \ncline{\nodeprefix#1genNord}{\nodeprefix#1genSuedwest}
      \ncline{\nodeprefix#1genSuedwest}{\nodeprefix#1genSuedost}
      \ncline{\nodeprefix#1genSuedost}{\nodeprefix#1genNord}
      %% Beschriftung (constraints):
      \Bput{\{#4\}}
      %% Verbindungen zu den Entities
%      \typeout{\\ ncline{\nodeprefix#1genNord}{#1}}
      \ncline{\nodeprefix#1genNord}{\nodeprefix#1}
      \ncline{\nodeprefix#1genSuedost}{\nodeprefix#2}
      \ncline{\nodeprefix#1genSuedwest}{\nodeprefix#3}
   \end{pspicture}
}



%%%
%%% Malt ein Rechteck für eine Entity
%%% mit Namen #1
%%%
\newcommand{\entity}[2][]{
   \ifthenelse{\equal{#1}{}}
   {\sEntity{#2}{#2}}{\sEntity{#1}{#2}}
}

%%%
%%% Relationship zwischen mehreren Entities -
%%% wird als Rhombus mit Text drin gezeichnet.
%%%
\newcommand{\relationship}[2][]
{
   \ifthenelse{\equal{#1}{}}
   {\relationshipBasis{#2}{#2}}
   {\relationshipBasis{#1}{#2}}
}

%%%
%%% Verbindet (z.B.) eine Relationship und
%%% eine Entity mit einer Linie.
%%%
%%%  \verbinde{<nodeA>}{<nodeB>}{<Kard>}{<total>}
%%%
%%%  <nodeA> der erste der zu verbindenden Knoten
%%%  <nodeB> der zweite der zu verbindenden Knoten
%%%  <Kard> Kardinalitätseinschränkungen, meist 1
%%%         oder ein Großbuchstabe aus der Mitte
%%%         des Alphabets. Wird
%%%  <total> Die Totalitätseinschränkung - entweder
%%%       total  (wird mit | gekennzeichnet), partiell
%%%       (wird mit O gekennzeichnet) oder etwas
%%%       anderes (wird direkt auf den Strich draufgemalt).
%%%
\newcommand{\verbinde}[4]
{
   \ncline{\nodeprefix#1}{\nodeprefix#2}\Bput{#3}
   \ifthenelse {\equal{#4}{total}}
   {
      \lput{:U}{$|$}
   }
   {
      \ifthenelse{\equal{#4}{partiell}}
      {\mput*{\cnode{.13}{\nodeprefix#1vv#2}}}
      {\mput{\small{#4}}}
   }
}
%%%
%%% Eine Relationship, die mit bis zu 4 Entities
%%% an den Ecken verbunden wird.
%%%
\newcommand{\relationshipMitEntities}[6][]{
   \ifthenelse{\equal{#1}{}}
   {\relationshipImpl{#2}{#2}{#3}{#4}{#5}{#6}}
   {\relationshipImpl{#1}{#2}{#3}{#4}{#5}{#6}}
}


%%%%%%%%%%%%%%%% Implementation %%%%%%%%%%%%%%

\newcommand{\relationshipImpl}[6]
{
   \relationshipBasis{#1}{#2}
   \ifthenelse{\equal{#3}{}}{}{\ncline{#1nord}{#3}}
   \ifthenelse{\equal{#4}{}}{}{\ncline{#1ost}{#4}}
   \ifthenelse{\equal{#5}{}}{}{\ncline{#1west}{#5}}
   \ifthenelse{\equal{#6}{}}{}{\ncline{#1sued}{#6}}
}

%%%
%%% Malt einen Rhombus für eine Beziehung
%%% mit Text #2 und legt 4 Anknüpfpunkte
%%% an: #1nord, #1sued #1ost und #1west.
%%%
\newcommand{\relationshipBasis}[2]
{
   \settowidth{\rWidth}{#2}
   \settoheight{\rHeight}{#2}
   \begin{pspicture}(-1.1\rWidth,-1.3\rHeight)(1.1\rWidth,1.3\rHeight)

      \rput(0,0) {#2}
      \pnode(-0.8\rWidth,0){\nodeprefix#1west}
      \pnode(0,2.0\rHeight){\nodeprefix#1nord}
      \pnode(0.8\rWidth,0){\nodeprefix#1ost}
      \pnode(0,-2.0\rHeight){\nodeprefix#1sued}
      \ncline{-}{\nodeprefix#1ost}{\nodeprefix#1nord}
      \ncline{-}{\nodeprefix#1ost}{\nodeprefix#1sued}
      \ncline{-}{\nodeprefix#1west}{\nodeprefix#1nord}
      \ncline{-}{\nodeprefix#1west}{\nodeprefix#1sued}
   \end{pspicture}
}


%%%
%%% Entity mit Node-Name und Text.
%%%
\newcommand{\sEntity}[2]{\rnode{\nodeprefix#1}{\psframebox[framesep=1em]{#2}}}
\newcommand{\attrImpl}[3]{\ovalnode{\nodeprefix#3qp#1}{#2}\ncline{\nodeprefix#3qp#1}{\nodeprefix#3}}

%%% wird von \relationship verwendet.   
\newlength{\rWidth} \newlength{\rHeight}


\endinput


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "DBS1-S01-PE.tex"
%%% End: 
