% \iffalse % % Copyright (C) 1998 by Jochen R"utschlin. All rights reserved. % % This file is part of the `jrsyntax' package. % % IMPORTANT NOTICE: % % You are not allowed to change this file. % % You are NOT ALLOWED to distribute this file alone. You are NOT % ALLOWED to take money for the distribution or use of this file (or % a changed version). % % If you receive only some of these files from someone, complain! % % \fi % % \CheckSum{100} % % \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 \~} % % \iffalse %<*driver> \documentclass[a4paper,11pt]{ltxdoc} \DisableCrossrefs \OnlyDescription \pagestyle{empty} \usepackage[german]{babel} \usepackage{typearea} \typearea{15} \usepackage{multicol,amssymb} \renewcommand{\meta}[1]{{\normalfont\textit{#1}}} \renewcommand{\DescribeMacro}[1]{\relax} \renewcommand{\DescribeEnv}[1]{\relax} \newcommand*{\Describe}[1]{% \bigskip\noindent\fbox{\footnotesize\texttt{\bslash{}#1}}\par\smallskip} \newcommand*{\DescribE}[1]{% \bigskip\noindent\fbox{\parbox{,96\hsize}{\footnotesize\texttt{\bslash{}#1}}}\par\smallskip} \begin{document} \DocInput{jrsyntax.dtx} \end{document} % % \fi % % \title{Das \textsf{jrsyntax} Paket v1.0a} % \author{Jochen R"utschlin} % \date{3.\ Juni 1998} % \maketitle % % \thispagestyle{empty} % % \begin{abstract} % Dieses Paket stellt einen ersten Versuch dar, Syntaxdiagramme zu % erzeugen. Noch ist die \glqq{}Benutzerschnittstelle\grqq{} recht % unkomfortabel -- Zeileneinz"uge m"ussen teilweise noch von Hand mit % L"angenangaben eingeben werden. Sie stellt jedoch einige Basisbefehle % zur Verf"ugung, mit denen durch etwas Probieren recht ansprechende % Ergebnisse erzielt werden k"onnen. % % Kern des Pakets ist eine |picture|-Umgebung, an der ich einige % zweckm"a"sige Ver"anderungen vorgenommen habe. % \end{abstract} % % \noindent\rule{\hsize}{.4pt} % % % % \begin{multicols}{2} % \DescribE{begin\{syntaxdiagram$\ast$\}\marg{Anzahl}\\ % \hspace*{2em}\textnormal{\ldots}\\ % \bslash{}end\{syntaxdiagram$\ast$\}} % \DescribeEnv{syntaxdiagram}% % \DescribeEnv{syntaxdiagram*}% % Erzeugt ein Syntaxdiagramm mit \meta{Anzahl} Zeilen. Die erste Zeile % beginnt mit der Befehlsanfangssequenz % ($\blacktriangleright\!\blacktriangleright$). Ab der zweiten Zeile sind % alle Zeilen etwas einger"uckt. % % Zeilenumbr"uche m"ussen mit |\\| von Hand vorgenommen werden. % % \DescribE{begin\{syntaxdiagram\}\marg{Anzahl}\marg{"Uberschrift}\\ % \hspace*{2em}\textnormal{\ldots}\\ % \bslash{}end\{syntaxdiagram\}} % \DescribeEnv{syntaxdiagram}% % \DescribeEnv{syntaxdiagram*}% % Erzeugt ein Syntaxdiagramm f"ur Teilausdr"ucke mit \meta{Anzahl} Zeilen % und einer \meta{"Uberschrift} (i.\,A.\ der Text, der durch eine % |\Expression|-Anweisung referenziert wurde). Die erste Zeile beginnt % mit der Befehlsanfangssequenz f"ur Teilausdr"ucke. Ab der zweiten Zeile % sind alle Zeilen etwas einger"uckt. % % Zeilenumbr"uche m"ussen mit |\\| von Hand vorgenommen werden. % % \Describe{\bslash\oarg{L"ange}}% % Erzeugt einen Zeilenumbruch und f"angt die neue Zeile mit dem % Fortsetzungssymbol ($\blacktriangleright$) an. "Uber das optionale % Argument kann die Einr"ucktiefe der neuen Zeile gesteuert werden. % % \Describe{Line\oarg{L"ange}}% % Dieser Befehl erzeugt den waagerechten Strich zwischen % Befehlskomponenten. "Uber das optionale Argument kann man die % Strichl"ange variieren. % % \Describe{LineEnd\textrm{ und }\bslash{}LineEnd*} % Erzeugt einen waagrechten Strich und kennzeichnet ihn am Ende entweder % mit dem Fortsetzungssymbol (|\LineEnd|; $\blacktriangleright$), % oder aber -- je nach Umgebung -- mit der Befehlsendmarkierung % (|syntaxdiagram*|; $\blacktriangleright\!\blacktriangleleft$) oder mit % der Endmarkierung f"ur Teilausdr"ucke (|syntaxdiagram|). % % Beachte: der Zeilenumbruch mu"s mit |\\| von Hand durchgef"uhrt % werden. % % \Describe{LineEndFill\textrm{ und }\bslash{}LineEndFill*} % Wie |\LineEnd| bzw.\ |\LineEnd*|, nur wird der Strich bis zum Ende der % Zeile gezogen. % % \Describe{KeyWord\marg{Befehl}}% % Erzeugt den Text \meta{Befehl} in der Schreibmaschinenschrift und % kennzeichnet damit die \glqq{}Schl"usselw"orter\grqq{} des Befehls. % % \Describe{MetaWord\marg{Variable}}% % Erzeugt den Text \meta{Variable} in Kursivschrift und kennzeichnet % damit die durch eigene Werte zu ersetzenden Stellen innerhalb des % Befehls. % \end{multicols} % \newpage % \begin{multicols}{2} % \Describe{Expression\marg{Syntaxdiagramm}}% % Erzeugt eine Kennzeichnung f"ur einen Teilausdruck, der an anderer % Stelle (mittels \texttt{syn"-tax"-dia"-gram}\footnote{Beachte den % fehlenden Stern.}) aufgezeigt wird. % % \Describe{Connect}% % Erzeugt durch einen senkrechten Strich eine Verbindung zu der % vorhergehenden Zeile. % % \Describe{ConnectUp}% % Erzeugt durch einen senkrechten Strich eine Verbindung zu der % vorhergehenden Zeile; der Strich enth"alt ein nach oben gerichtetes % Dreieck (Pfeil) und markiert somit einen Flu"s nach oben. % \end{multicols} % \StopEventually{\Finale} % % \iffalse %<*package> % \fi % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{jrsyntax} [1998/06/03 v1.0a syntax diagram package (jr)] % \end{macrocode} % % \begin{macrocode} \RequirePackage{amssymb} \long\gdef\jr@put(#1,#2)#3{% \@killglue\raise#2% \hb@xt@\z@{\kern#1 #3\hss}% \ignorespaces} % \end{macrocode} % % \begin{macrocode} \def\jr@makebox(#1,#2){% \@ifnextchar[{\@iMakepicbox(#1,#2)}{\@iMakepicbox(#1,#2)[]}} \long\def\@iMakepicbox(#1,#2)[#3]#4{% \vbox to#2% {\let\mb@b\vss\let\mb@l\hss\let\mb@r\hss% \let\mb@t\vss% \@tfor\reserved@a :=#3\do{% \if s\reserved@a% \let\mb@l\relax\let\mb@r\relax% \else% \expandafter\let\csname mb@\reserved@a\endcsname\relax% \fi}% \mb@t% \hb@xt@ #1{\mb@l #4\mb@r}% \mb@b% \kern\z@}} % \end{macrocode} % % \begin{macrocode} \gdef\jr@line(#1,#2)#3{% \@xarg#1\relax% \@yarg#2\relax% \@linelen=#3% \ifdim\@linelen<\z@% \@badlinearg% \else% \ifnum\@xarg=\z@% \@vline% \else% \ifnum\@yarg=\z@% \@hline% \else% \@sline% \fi% \fi% \fi} % \end{macrocode} % % \begin{macrocode} \long\gdef\jr@picture#1{\jr@pictur@#1} \gdef\jr@pictur@(#1){% \@ifnextchar({\jr@@picture(#1)}{\jr@@picture(#1)(0pt,0pt)}} \gdef\jr@@picture(#1,#2)(#3,#4){% \@picht#2% \setbox\@picbox\hb@xt@#1\bgroup% \hskip -#3% \lower #4\hbox\bgroup% \ignorespaces} \gdef\endjr@picture{% \egroup\hss\egroup% \ht\@picbox\@picht\dp\@picbox\z@% \mbox{\box\@picbox}} % \end{macrocode} % % \begin{macrocode} \newlength{\Ordinate} \newlength{\Abscissa} \newlength{\OrdinateWidth} % \end{macrocode} % % \begin{macrocode} \def\LineEndO{\@ifstar{\jr@end}{\jr@continue}} \def\LineEndFillO{% \@tempdima\hsize% \advance\@tempdima-\Abscissa% \advance\@tempdima-3\fboxsep% \@ifstar{\jr@end[\@tempdima]}{\jr@continue[\@tempdima]}} % \end{macrocode} % % \begin{macrocode} \def\LineEndE{\@ifstar{\jr@Eend}{\jr@continue}} \def\LineEndFillE{% \@tempdima\hsize% \advance\@tempdima-\Abscissa% \advance\@tempdima-3\fboxsep% \@ifstar{\jr@Eend[\@tempdima]}{\jr@continue[\@tempdima]}} % \end{macrocode} % % \begin{macrocode} \def\jr@begin{ \jr@put(\Abscissa,\Ordinate){\jr@makebox(0pt,0pt)[l]{% \raise1pt\hbox{$\!\blacktriangleright\!\blacktriangleright$}}}% \Line} % \end{macrocode} % % \begin{macrocode} \def\jr@end{\@ifnextchar[{\@jr@end}{\@jr@end[\OrdinateWidth]}} \def\@jr@end[#1]{% \Line[#1]% \jr@put(\Abscissa,\Ordinate){\jr@makebox(0pt,0pt)[r]{% \raise1pt\hbox{$\blacktriangleright\!\blacktriangleleft\!$}}} } % \end{macrocode} % % \begin{macrocode} \def\jr@continue{\@ifnextchar[{\@jr@continue}{\@jr@continue[\OrdinateWidth]}} \def\@jr@continue[#1]{% \Line[#1]% \addtolength{\Abscissa}{-.5\OrdinateWidth}% \jr@put(\Abscissa,\Ordinate){\jr@makebox(0pt,0pt){% \raise1pt\hbox{$\blacktriangleright$}}}% \addtolength{\Abscissa}{.5\OrdinateWidth} } % \end{macrocode} % % \begin{macrocode} \def\jr@Eend{\@ifnextchar[{\@jr@Eend}{\@jr@Eend[\OrdinateWidth]}} \def\@jr@Eend[#1]{% \Line[#1]% \jr@expression% } % \end{macrocode} % % \begin{macrocode} \newcommand{\Line}{\@ifnextchar[{\@Line}{\@Line[\OrdinateWidth]}} \def\@Line[#1]{% \jr@put(\Abscissa,\Ordinate){\jr@line(1,0){#1}} \addtolength{\Abscissa}{#1}} % \end{macrocode} % % \begin{macrocode} \def\jr@expression{% \addtolength{\Ordinate}{-.5\baselineskip} \jr@put(\Abscissa,\Ordinate){\jr@line(0,1){\baselineskip}} \addtolength{\Ordinate}{.5\baselineskip} } % \end{macrocode} % % \begin{macrocode} \newcommand{\KeyWord}[1]{\@word{\texttt{#1}}} \newcommand{\MetaWord}[1]{\@word{\textit{#1}}} \newcommand{\Expression}[1]{% \jr@expression% \jr@put(\Abscissa,\Ordinate){\jr@makebox(\@tempdima,0pt)[l]{\,#1\,}}% \settowidth{\@tempdima}{\,#1\,}% \addtolength{\Abscissa}{\@tempdima}% \jr@expression% } % \end{macrocode} % % \begin{macrocode} \def\@word#1{% \settowidth{\@tempdima}{\,#1\,}% \jr@put(\Abscissa,\Ordinate){\jr@makebox(\@tempdima,0pt)[l]{\,#1\,}}% \addtolength{\Abscissa}{\@tempdima}% } % \end{macrocode} % % \begin{macrocode} \def\Connect{% \jr@put(\Abscissa,\Ordinate){\jr@line(0,1){\OrdinateWidth}}} % \end{macrocode} % % \begin{macrocode} \def\ConnectUp{% \@tempdima\OrdinateWidth\divide\@tempdima by 2\advance\@tempdima\Ordinate% \jr@put(\Abscissa,\@tempdima){\makebox(0.00,0.00){$\blacktriangle$}}% \jr@put(\Abscissa,\Ordinate){\jr@line(0,1){\OrdinateWidth}}} % \end{macrocode} % % \begin{macrocode} \def\jr@newline[#1]{% \setlength{\Abscissa}{#1}% \addtolength{\Abscissa}{\fboxsep}% \addtolength{\Ordinate}{-\OrdinateWidth}% \@tempdima=#1% \ifnum\@tempdima=\OrdinateWidth% \jr@continue% \fi} % \end{macrocode} % % \begin{macrocode} \def\syntaxdiagram#1{% \let\LineEnd\LineEndE% \let\LineEndFill\LineEndFillE% \@ifnextchar[{\@syntaxdiagram{#1}{\jr@expression\Line}}% {\@syntaxdiagram{#1}{\jr@expression\Line}[\@empty]}% } \@namedef{syntaxdiagram*}#1{% \let\LineEnd\LineEndO% \let\LineEndFill\LineEndFillO% \@ifnextchar[{\@syntaxdiagram{#1}{\jr@begin}}% {\@syntaxdiagram{#1}{\jr@begin}[\@empty]}% } \def\@syntaxdiagram#1#2[#3]{% \setlength{\OrdinateWidth}{2em}% \setlength{\Abscissa}{\fboxsep}% \bgroup% \def\\{\@ifnextchar[{\jr@newline}{\jr@newline[\OrdinateWidth]}} \setlength{\Ordinate}{#1\OrdinateWidth}% \ifx\@empty#3 \else \addtolength{\Ordinate}{\OrdinateWidth} \fi \@tempdima=\hsize\advance\@tempdima-\fboxsep% \begin{list}{}{\leftmargin0pt\parindent0pt\rightmargin0pt\labelsep0pt\labelwidth0pt\itemindent0pt}\item[]% \begin{jr@picture}(\hsize,\Ordinate)(0pt,0pt)% \jr@put(0pt,\Ordinate){\jr@line(1,0){\hsize}}% \jr@put(0pt,0pt){\jr@line(1,0){\hsize}}% \jr@put(0pt,0pt){\jr@line(0,1){\Ordinate}}% \jr@put(\@tempdima,0pt){\jr@line(0,1){\Ordinate}}% \ifx\@empty#3 \else \addtolength{\Ordinate}{-.5\OrdinateWidth} \jr@put(\fboxsep,\Ordinate){\jr@makebox(0pt,0pt)[l]{\textbf{#3}}}% \addtolength{\Ordinate}{-.5\OrdinateWidth} \fi \addtolength{\Ordinate}{-.5\OrdinateWidth}% \thicklines% #2} \def\endsyntaxdiagram{\@ifstar{}{}% \end{jr@picture}% \end{list}% \egroup} \expandafter\let\csname endsyntaxdiagram*\endcsname=\endsyntaxdiagram % \end{macrocode} % \iffalse % % \fi % \Finale