\section Die Konstruktion mit Doppelpunkt detaillierter Einige Einzelheiten der Syntax des Doppelpunkt-Aufbaus wurden bis zum jetzigen Zeitpunkt noch recht stiefm\"utterlich behandelt. Die Idee eines Doppelpunkt-Aufbaus ist im Grunde einfach: der Doppelpunkt wird durch den Zweig || ersetzt und nachdem ein paar Dinge verarbeitet wurden, wird |^| eingef\"ugt. Jedoch mu\ss\/ pr\"azisiert werden, an welcher Stelle das Einf\"ugen von |^| stattfindet. Zum Beispiel: Wo wird in der folgenden Darstellung |^| eingef\"ugt? \medskip \qquad |:{a} [labelgap=0] @AA !a @BB {c}| \medskip Die Regel ist diese: Das untenstehende Template wird so weit wie m\"oglich ausgef\"ullt. Anschlie\ss\/end wird |:| durch || ersetzt und |^| nach dem Zielbereich (target) eingef\"ugt. \def\\#1{\psframebox[framesep=1pt]{\vrule height8.4pt depth2.5pt width0pt #1}}% \setbox\tmpbox=\hbox{$|{«stuff\/»}|\quad |[|{\sl pars\/}|]|\quad @tag\quad \left(\matrix{|(|\;\ldots\;|)|\cr \noalign{\smallskip}\hbox{\sl !tag}\cr}\right)$} \ex \quad $\sl |:|\quad |[|{\sl pars\/}|]|\quad \underbrace{\vrule width0pt depth1.5em\box\tmpbox}_{\textstyle\rm target}$ \xe Es gibt zwei Beschr\"ankungen. Erstens kann der Zielbereich nicht vollkommen leer sein. |:|\dots\ oder |::|\dots, z.B. ist nicht m\"oglich. Zweitens sind Parameter immer Parameter von etwas; daher kann der |[«pars\/»]|-Terminus im Zielbereich nur bestehen, wenn ein |{«stuff\/»}|-Terminus vorhanden ist. \medskip Schauen Sie sich die folgenden Beispiele an: \pex \a \CLboxed \jtree \! = :[scaleby=2]{a} {b}. \endjtree |endCLboxed \hfill \hbox{\jtree \! = :[scaleby=2]{a} {b}. \endjtree} \kern1em % \a \CLboxed \jtree \! = :{a} [scaleby=2]{b}. \endjtree |endCLboxed \hfill \jtree \! = :{a} [scaleby=2]{b}. \endjtree \kern1em \xe Man k\"onnte meinen, da\ss\/ der rechte Zweig in (\lastx b) skaliert wurde. Aufgrund von |[scaleby=2]|, welches in den Zielbereich geht, ist er es aber nicht. Wie in (\blastx) zu sehen, ist er so zergliedert, da\ss\/ der Labelparameter und || nach dem Zielbereich eingef\"ugt werden. Als Labelparameter hat es keine Auswirkung. Die folgende Redewendung in Kapitel 14 wird fortw\"ahrend benutzt, um sicherzustellen, da\ss\/ die Parameter nicht mit den Labelparametern verwechselt werden. \pex \CLboxed \jtree \! = :{a}() [scaleby=2]{b}. \endjtree |endCLboxed \hfil \jtree \! = :{a}() [scaleby=2]{b}. \endjtree \xe Das Template (\bblastx) ist hier ausgef\"ullt mit dem Zielbereich |{a}()|, so da\ss\/ || vor |[scaleby=2]| eingef\"ugt wird. \medskip Der folgende Kontrast ist interessant. In (\nextx a) ist der Zielbereich |{a}(:{b}{c})|, soda\ss\/ die innerlineare Adjunktion am linken Zweig auftritt. In (\nextx b) allerdings, besetzt |!a| den Adjunktions-Slot im Template, so da\ss\/ |{a}!a| der Zielbereich ist und die Abzweigung am rechten Zweig erfolgt. \pex[interpartskip=1em] \a \CLboxed \jtree \! = :{a} (:{b}{c}) {d}. \endjtree |endCLboxed \hfill \jtree \! = :{a}(:{b}{c}){d}. \endjtree\kern2em % \a \CLboxed \jtree \! = :{a}!a (:{b}{c}){d}. \endjtree |endCLboxed \hfill \jtree \! = :{a}!a (:{b}{c}){d}. \endjtree \kern2em % \xe Zu bemerken ist, da\ss\/ in (\lastx b) die innerlineare Adjunktion den aktuellen Punkt \Pcurr\ unver\"andert l\"a\ss\/t. Dieser wird vom folgenden Label \"uberschrieben. %Note in (\lastx b) that the inline adjunction leaves the current %point \Pcurr\ unchanged, so it is overwritten by the label which %follows. \medskip Ein Zielbereich kann vollst\"andig aus einem @tag bestehen. \ex % \CLboxed \jtree \! = :@A @B . \nccurve[angleA=-60, angleB=240]{->}{A}{B} \endjtree |endCLboxed \hfill \jtree \! = :@A @B . \nccurve[angleA=-60,angleB=240]{->}{A}{B} \endjtree\kern3em \xe Der Vollst\"andigkeit halber, folgt ein kompletter Bericht der Grammatik zur Beschreibung von B\"aumen. \subsection Die Syntax der Sprache zur Beschreibung von B\"aumen \ftagpage[syntaxpage]% Die Beschreibung der B\"aume wird im Folgenden spezifiziert durch eine kontextfreie Grammatik und einige Vermutungen wie sie funktioniert. Zun\"achst zur Grammatik. Der Terminus {\sl string\/}, der in einigen Erl\"auterungen auftaucht, ist ein Strang (engl. string) von Zeichen, der in eine TeX-Kontrollsequenz eingespeist wird. Die verschiedenen Zust\"ande an den strings, die sich in unterschiedlichen Kontexten bemerkbar machen k\"onnen, sind wie folgt. \begingroup \def\ttbox{\ttverbatim \spaceskip=.5em \ttboxA} \def\ttboxA#1{\psframebox[framesep=1pt]{\vrule height8.4pt depth2.5pt width0pt #1}\endgroup} \def\plus{+} \catcode`\+=\active \let+=\ttbox \def\TTbox{\setbox\tmpbox\hbox\bgroup} \def\endTTbox{\egroup \psframebox[framesep=1pt]{\vrule height8.4pt depth2.5pt width0pt \box\tmpbox}} \leftskip=2em \edef\normalspaceskip{\noindent\spaceskip=\the\spaceskip} \spaceskip=1.6ex \jot=.7ex \openup\jot \catcode`_=\active \def\TO{ $\to$ }% \def\opt#1{\hbox{$(\,\sl #1\,)$}}% \def\optpars{\opt{+[\,pars\,+]}}% \def\dagnote{\hskip1ex$^{\dag}$} \sl \medskip tree\_description\TO simple\_tree\_description \opt{tree\_description} {\sl simple\_tree\_description\/}\TO \TTbox|\!|\kern-1pt\endTTbox {\sl string\/}\TTbox\kern.5em\endTTbox\kern1pt += \opt{tree\_body} +. tree\_body\TO tree\_item \opt{tree\_body} tree\_item\TO sprout, target, vartri\_group, colon\_group, operator\kern1em sprout\TO +<{\sl string\/}+> \optpars target\TO $\sl \pmatrix{label\cr \hbox{\sl @tag}\cr}$ $\sl \pmatrix{\hbox{\sl !tag}\cr \hbox{\sl inline\_adjunction}\cr}$ \smallskip label\TO $\sl +{\,stuff\,+}$ \optpars\ \opt{@tag} inline\_adjunction\TO $\sl +(\,tree\_body\,+)$ vartri\_group\TO +<{\sl string\/}+> \opt{parameters} {\sl label} colon\_group\TO +: \optpars\ target \optpars @tag\TO +@{\sl string\/}+ \relax !tag\TO +!{\sl string\/}+ \relax operator\TO +^ pars\TO {\rm\normalspaceskip valid PSTricks parameter settings}, $\emptyset$ \bigskip \endgroup %„ Die umrahmten Zeichen oben sind Symbole der Sprache zur Beschreibung von B\"aumen, nicht der Sprache zur Beschreibung der Grammatik. ``Stuff'' ist alles, was in eine \TeX\/|\hbox| hineingeht. Ein leeres K\"astchen ist ebenso m\"oglich (eine Erweiterung, die das PSTricks-Parametersystem nicht bietet). Note that an empty parameter specification |[]| is permitted, and is actually useful at times. This is an extension of the PSTricks parameter system, which disallows empty parameters. \medskip Der string, der |\!| folgt, muss so sein, dass {\sl !string\/} der Name eines Adjunktionspunkt ist, der schon definiert wurde; entweder durch |\jtree| oder durch ein !tag in einem vorhergegangenem geparsten Zielbereich. Der |<«\sl string\/»>|, der in einem Spross auftaucht, muss den Namen eines Zweiges oder Dreiecks tragen, und der |<«\sl string\/»>|, der in einer vartri group (Gruppe von variablen Triangeln) auftaucht, muss den Namen einer varTriangel tragen. Ein Name mit einem leeren string oder einem string, welcher Leerstellen enth\"alt, ist m\"oglich, aber nicht ratsam. Der string, der in einem @tag auftaucht, muss einen g\"ultigen PSTricks-node-Namen tragen, und der zus\"atzlichen Restriktion, dass er keine Leerstellen aufweisen darf. Der string, der in einem !tag auftaucht (man achte auf das |!|, statt @), wird zum Namen des Verbindungspunktes. Auch er darf keine Leerstellen enthalten! Es ist zu bemerken, dass ein Leerzeichen nach !tags und @tags folgen muss. Davon abgesehen, ist \jTree\ tolerant, was Leerzeichen oder deren Abwesenheit zwischen Einheiten (items) betrifft. \medskip Parsing ist insofern einzigartig, da Zielbereiche und Label immer in Links-zu-Rechts-Aufteilung maximiert werden und nie leer sind. Da Labels in jedem Fall |{| und |}| enthalten, sind sie nie leer. \endinput Note: It is likely that there are some errors or inconsistencies in the description of the grammar and/or its implementation. If you find any, I would greatly appreciate it if you let me know at {\sl j.frampton@neu.edu}.