% Dieses File ist dazu gedacht, im Vorspann von LaTeX Dokumenten vermittels
% \include{syntax.tex} eingebunden zu werden. Es stellt dann die Umgebung
% syntaxdiagramm zur Verfuegung, mit deren Hilfe Syntaxdiagramme fuer
% z.B. Pascal erzeugt werden koennen. 
%
% syntax.tex benoetigt nur noch folgendes LaTeX Paket:
%   - fancybox.sty
% (Es muss im Vorspann des aufrufenden Dokumentes eingebunden werden.) 
%
% Beispiele zur Verwendung siehe: syntaxtest.tex 
% zur naeheren Dokumentation siehe: syntaxintro.tex
% zur Entwicklung des Codes siehe: syntaxdevel.tex
%
% Bernd Worsch 29.6.97 
%
% 05.07.97  \Leer als vertikale Stuetze
%           groessere Abstaende in Alternativen-Umgebung 
%
% to-do-list:
%   -- Oval fuer SynVar ueber picture erzeugen -> fancybox unnoetig
%   -- Alternativen-Parameter automatisch bestimmen
%   -- Dokumentation (syntaxuse.tex)
%   -- Kommentare im Quelltext
%   -- Als sty-File implementieren



\typeout{Verwende: 'syntax.tex' v0.02 von Bernd Worsch}



%%%% Anlegen der benoetigten Laengen und Boxen 

\newlength{\breite}
\newlength{\hoehe}
\newlength{\tiefe}
\newlength{\gesamthoehe}
\newlength{\tmpLength}

\newsavebox{\Messbox}

\newlength{\LineLengStan}
\newlength{\LineThikStan}
\setlength{\LineLengStan}{4mm}
\setlength{\LineThikStan}{\fboxrule}

\newsavebox{\Centerbox}
\newlength{\Centercor}

\newlength{\VertSkipStan}
\setlength{\VertSkipStan}{3mm}

\newsavebox{\upperbox}
\newsavebox{\lowerbox}
\newsavebox{\togetherbox}
\newlength{\VertLineLength}
\newlength{\VertSkip}

\newlength{\upperVertLineLength}
\newlength{\lowerVertLineLength}

\newlength{\tabulcor}

%%%%% Beginn Syntaxdiagramm Befehle und Umgebungen

\newenvironment{Syntaxdiagramm}[1][\PfeilR]%
 {%
%
%%%% Befehl zum Vermessen von TeX-Strukturen
%
%\newcommand{\Messe}[1]
% {
%  \sbox{\Messbox}{##1}
%
%  \setlength{\breite}{\wd\Messbox}
%  \setlength{\hoehe}{\ht\Messbox}
%  \setlength{\tiefe}{\dp\Messbox}
%  \setlength{\gesamthoehe}{\hoehe}
%  \addtolength{\gesamthoehe}{\tiefe}
%  \setlength{\tmpLength}{\hoehe}
%  \addtolength{\tmpLength}{-\tiefe}
%  \setlength{\tmpLength}{-0.5\tmpLength} 
%
%  \fbox
%   {
%    \begin{tabular}{ll}
%      Breite:      & \the\breite      \\
%      Hoehe:       & \the\hoehe       \\
%      Tiefe:       & \the\tiefe       \\
%      Gesamthoehe: & \the\gesamthoehe \\
%      CenterCor:   & \the\tmpLength
%    \end{tabular}
% 
%    \usebox{\Messbox}
%   }
% }
%
%%%% Befehl zum Justieren von Boxen 
%
\newcommand{\CenterToBaseLine}[1]
  {%
   \sbox{\Centerbox}{##1}%
   \setlength{\Centercor}{\ht\Centerbox}%
   \addtolength{\Centercor}{-\dp\Centerbox}%
   \setlength{\Centercor}{-0.5\Centercor}%
   \addtolength{\Centercor}{0.5\LineThikStan}%
   \raisebox{\Centercor}{\usebox{\Centerbox}}%
  }%
%
%%%% Grundelemente eines Syntaxdiagramms
%
\newcommand{\Leer}%
  {\rule[-1.3ex]{0pt}{2.5ex}}%
%
\newcommand{\Linie}%
  {\rule{\LineLengStan}{\LineThikStan}}%
%
\newcommand{\KurzeLinie}%
  {\rule{0.5\LineLengStan}{\LineThikStan}}%
%
\newcommand{\Tri}
  {%
   \CenterToBaseLine
   {%
     \setlength{\unitlength}{1pt}%
     \begin{picture}(0,0)%
       \put(0,0){\vector(0,1){0}}%
     \end{picture}%
   }%
  }%
%
\newcommand{\TriR}
  {%
   \CenterToBaseLine
    {%
     \setlength{\unitlength}{1pt}%
     \begin{picture}(0,0)%
       \put(0,0){\vector(1,0){0}}%
     \end{picture}%
    }%
  }%
%
\newcommand{\TriD}
  {%
   \CenterToBaseLine
    {%
     \setlength{\unitlength}{1pt}%
     \begin{picture}(0,0)%
       \put(0,0){\vector(0,-1){0}}%
     \end{picture}%
    }%
  }%
%
\newcommand{\TriL}
  {%
   \CenterToBaseLine
    {%
     \setlength{\unitlength}{1pt}%
     \begin{picture}(0,0)%
       \put(0,0){\vector(-1,0){0}}%
     \end{picture}%
    }%
  }%
%
\newcommand{\Dots}
  {%
   \CenterToBaseLine
    {%
     ...%
    }%
  }%
%
\newcommand{\SynVar}[1]%
  {%
   \CenterToBaseLine%
    {%
     \fbox%
      {%
       \rule{0.1em}{0pt}%
       \rule[-0.3ex]{0pt}{2ex}%
       ##1%
       \rule{0.1em}{0pt}%
      }%
    }%
  }%
%
\newcommand{\TerSym}[1]%
  {%
   \CenterToBaseLine%
    {%
     \ovalbox%
      {%
       \rule{0.2em}{0pt}%
       \rule[-0.2ex]{0pt}{1.8ex}%
       ##1%
       \rule{0.2em}{0pt}%
      }%
    }%
  }%
%
%%%% Kombinierte Grafische Elemente
%
\newcommand{\Ellipse}%
 {%
  \Linie\ \Dots\ \Linie%
 }%
%
\newcommand{\PfeilR}%
 {%
  \Linie\TriR%
 }%
%
\newcommand{\PfeilL}%
 {%
  \TriL\Linie%
 }%
%
\newcommand{\SynVarR}[1]%
 {%
  \PfeilR\SynVar{##1}\Linie%
 }%
%
\newcommand{\SynVarL}[1]%
 {%
  \Linie\SynVar{##1}\PfeilL%
 }%
%
\newcommand{\TerSymR}[1]%
 {%
  \PfeilR\TerSym{##1}\Linie%
 }%
%
\newcommand{\TerSymL}[1]%
 {%
  \Linie\TerSym{##1}\PfeilL%
 }%
%
%%%% Vertikale grafische Elemente
%
\newcommand{\LinieO}[1]%
 {%
  \CenterToBaseLine%
   {%
    \raisebox{0pt}[0pt][0pt]%
     {%
      \makebox[0mm][c]{\rule{\LineThikStan}{##1}}%
     }%
   }%
 }%
%
\newcommand{\LinieU}[1]%
 {%
  \CenterToBaseLine%
   {%
    \raisebox{0pt}[0pt][0pt]%
     {%
      \makebox[0mm][c]{\rule[-##1]{\LineThikStan}{##1}}%
     }%
   }%
 }%
%
\newcommand{\PfeilO}[1]%
 {%
  \CenterToBaseLine%
   {%
    \raisebox{0pt}[0pt][0pt]%
     {%
      \makebox[0mm][c]{\TriD}%
      \makebox[0mm][c]{\rule{\LineThikStan}{##1}}%
     }%
   }%
 }%
%
\newcommand{\PfeilU}[1]%
 {%
  \CenterToBaseLine%
   {%
    \raisebox{0pt}[0pt][0pt]%
     {%
      \makebox[0mm][c]{\Tri}%
      \makebox[0mm][c]{\rule[-##1]{\LineThikStan}{##1}}%
     }%
   }%
 }%
%
%%%% Strukturen
%
%%% Wiederholung
%
\newcommand{\Wiederholung}[2]%
 {%
  \sbox{\upperbox}{##1}%
  \sbox{\lowerbox}{##2}%
  \setlength{\VertLineLength}{\dp\upperbox}%
  \addtolength{\VertLineLength}{\ht\lowerbox}%
  \addtolength{\VertLineLength}{\VertSkipStan}%
  \addtolength{\VertLineLength}{0.5\LineThikStan}%
  \setlength{\VertSkip}{\VertSkipStan}%
  \addtolength{\VertSkip}{\dp\upperbox}%
%
  \Linie%
  \PfeilU{\VertLineLength}%
% 
  \renewcommand{\arraystretch}{0}%
  \begin{tabular}[t]%              % Zwei Eintraege
   {%
    @{\hrulefill}%                 % Verbindungslinie 1
    c%                             % Eintraege Zentrieren
    @{\hrulefill}%                 % Verbindungslinie 2
   }%
   \PfeilR\usebox{\upperbox}\Linie\\[\VertSkip]  % Dies wiederholen
   \Linie\usebox{\lowerbox}\PfeilL%              % Dies in Gegenrichtung
  \end{tabular}%
%
  \LinieU{\VertLineLength}%
  \Linie%
 }%
%
%%% Alternative
%
\newcommand{\Alternative}[2]%
 {%
  \sbox{\upperbox}{##1}%
  \sbox{\lowerbox}{##2}%
%
  \setlength{\upperVertLineLength}{\dp\upperbox}%
  \addtolength{\upperVertLineLength}{0.5\VertSkipStan}%
  \addtolength{\upperVertLineLength}{0.5\LineThikStan}%
%
  \setlength{\lowerVertLineLength}{\ht\lowerbox}%
  \addtolength{\lowerVertLineLength}{0.5\VertSkipStan}%
  \addtolength{\lowerVertLineLength}{0.5\LineThikStan}%
%
  \setlength{\VertSkip}{\VertSkipStan}%
  \addtolength{\VertSkip}{\dp\upperbox}%
%
  \Linie%
  \LinieO{\upperVertLineLength}%
  \LinieU{\lowerVertLineLength}%
% 
  \renewcommand{\arraystretch}{0}%
  \addtolength{\upperVertLineLength}{-0.5\LineThikStan}%
  \raisebox{\upperVertLineLength}%
   {% 
    \begin{tabular}[t]%                 % Zwei Eintraege
     {%
      @{\hrulefill}%                 % Verbindungslinie 1
      c%                             % Eintraege Zentrieren
      @{\hrulefill}%                 % Verbindungslinie 2
     }%
     \PfeilR\usebox{\upperbox}\Linie\\[\VertSkip]  % Weg1
     \PfeilR\usebox{\lowerbox}\Linie%              % Weg2
    \end{tabular}%
   }%
  \renewcommand{\arraystretch}{1}%
  \addtolength{\upperVertLineLength}{0.5\LineThikStan}%
%
  \LinieO{\upperVertLineLength}%
  \LinieU{\lowerVertLineLength}%
  \Linie%
 }%
%
%%% Stapel
%
\newcommand{\Stapel}[2]%
 {%
  \sbox{\upperbox}{##1}%
  \sbox{\lowerbox}{##2}%
%
  \setlength{\upperVertLineLength}{\dp\upperbox}%
  \addtolength{\upperVertLineLength}{0.5\VertSkipStan}%
  \addtolength{\upperVertLineLength}{0.5\LineThikStan}%
%
  \setlength{\lowerVertLineLength}{\ht\lowerbox}%
  \addtolength{\lowerVertLineLength}{0.5\VertSkipStan}%
  \addtolength{\lowerVertLineLength}{0.5\LineThikStan}%
%
  \setlength{\VertSkip}{0.5\VertSkipStan}%
  \addtolength{\VertSkip}{\dp\upperbox}%
  \addtolength{\VertSkip}{-1\LineThikStan}% 
%
  \Linie%
  \LinieO{\upperVertLineLength}% 
  \addtolength{\lowerVertLineLength}{-0.5\LineThikStan}%
  \raisebox{\upperVertLineLength}{\KurzeLinie}%
  \addtolength{\lowerVertLineLength}{0.5\LineThikStan}%
  \LinieU{\lowerVertLineLength}%
%
  \renewcommand{\arraystretch}{0}%
  \addtolength{\upperVertLineLength}{-0.5\LineThikStan}%
  \raisebox{\upperVertLineLength}%
   {% 
    \addtolength{\upperVertLineLength}{0.5\LineThikStan}%
    \begin{tabular}[t]%              % Zwei Eintraege
     {%
      @{\hrulefill}%   % Verbindungslinie 1
      c%               % Eintraege Zentrieren
      @{\hrulefill}%   % Verbindungslinie 2
     }%
     \PfeilR\usebox{\upperbox}\Linie\\[\VertSkip]  % oberer Eintrag
     \PfeilL\\[0.5\VertSkipStan]%
     \PfeilR\usebox{\lowerbox}\Linie%              % unterer Eintrag
    \end{tabular}%
   }%
  \renewcommand{\arraystretch}{1}%
  \addtolength{\upperVertLineLength}{0.5\LineThikStan}%
%
  \LinieO{\upperVertLineLength}%
  \addtolength{\lowerVertLineLength}{-0.5\LineThikStan}%
  \raisebox{-\lowerVertLineLength}{\KurzeLinie}%
  \addtolength{\lowerVertLineLength}{0.5\LineThikStan}%
  \LinieU{\lowerVertLineLength}%
  \Linie%
 }%
%
%%%% Die Alternativen-Umgebung
%
\newenvironment{Alternativen}[2]%
 {%
  \renewcommand{\arraystretch}{2}%
  \setlength{\tabulcor}{9.3pt}%
  \sbox{\upperbox}{##1}%
  \sbox{\lowerbox}{##2}%
%
  \begin{lrbox}{\togetherbox}% 
    \begin{tabular}[t]%              % Zwei Eintraege
     {%
      @{\hrulefill}%                 % Verbindungslinie 1
      c%                             % Eintraege Zentrieren
      @{\hrulefill}%                 % Verbindungslinie 2
     }%
     \PfeilR\usebox{\upperbox}\Linie\\             % erster Weg 
 }%
%                                                  % weitere Wege
 {%
     \PfeilR\usebox{\lowerbox}\Linie%              % letzter Weg
    \end{tabular}%
  \end{lrbox}% 
%
  \setlength{\upperVertLineLength}{0.5\dp\togetherbox}%
  \addtolength{\upperVertLineLength}{0.5\ht\togetherbox}%
  \addtolength{\upperVertLineLength}{-\ht\upperbox}%
  \addtolength{\upperVertLineLength}{0.5\LineThikStan}%
  \addtolength{\upperVertLineLength}{-\tabulcor}%
%
  \setlength{\lowerVertLineLength}{0.5\dp\togetherbox}%
  \addtolength{\lowerVertLineLength}{0.5\ht\togetherbox}%
  \addtolength{\lowerVertLineLength}{-\dp\lowerbox}%
%
  \Linie%
  \LinieO{\upperVertLineLength}%
  \LinieU{\lowerVertLineLength}%
% 
  \CenterToBaseLine{\usebox{\togetherbox}}%
%  
  \LinieO{\upperVertLineLength}%
  \LinieU{\lowerVertLineLength}%
  \Linie%
 }%
%
%%%%% Ende Syntaxdiagramm Befehle und Umgebungen
%
  \providecommand{\ContSym}{#1}
  \renewcommand{\ContSym}{#1}
  \begin{lrbox}{\Messbox}%
 }%
 {%
  \end{lrbox}%
  \setlength{\hoehe}{\ht\Messbox}%
  \addtolength{\hoehe}{\VertSkipStan}%
  \setlength{\tiefe}{\dp\Messbox}%
  \addtolength{\tiefe}{\VertSkipStan}%
  \raisebox{0pt}[\hoehe][\tiefe]%
   {%
    \Linie%
    \usebox{\Messbox}%
    \ContSym%
   }%
 }%
%
%%%%% --Und Schluss--

