%July 1995, modified Feb 1996 %Paradigma: line bundle %C.G. van der laan, cgl@rc.service.rug.nl \input blue.tex \loadtocmacros \def\xytxt#1{%Function: place text #1 at x, y \xy{\vbox to0pt{\vss \hbox to0pt{\strut#1\hss}\kern0pt}}} \tolerance500\hbadness=499\hfuzz=8pt %\parindent0pt %=1pc \everyverbatim{\emc} \bluetitle Paradigms: The winds and halfwinds \bluesubtitle Details matter \blueissue \maps{96}1 %\blueauthor Kees van der Laan \bluepictures\pythtreepic\spiralpic\windpic\trimodelpic\tritreepic \bintreepic\rotatedbintreepic\chartpic \beginscript \everyverbatim{\unmc} \bluehead BLUe's Design V Hi folks. How to draw lines at {\oldstyle45}$^\circ$ in \TeX{} is exercised. This simple-looking and innocent problem touches on fundamental issues, such as should we adhere to the Cartesian picture environment approach,\ftn{The \LaTeX{} picture environment for example.} or do we need something else now and then? This work emerged from studying Gurari's approach to graphics incented by a suggestion in Jos Winnink's review, \maps{94}2. The discussion below explains what has been used in BLUe's format system in the turtle graphics\ftn {Knuth already used the `Turtle' idea in his dragon figures. For those interested in turtle graphics consult for example S. Papert: Mindstorms.} macros, especially in the coding of \cs{N}, \cs{E}, \cs{S}, \cs{W}, \cs{NE}, \cs{SE}, \cs{SW}, \cs{NW}, next to \cs{ESE}, and \cs{WSW}. Examples are included which show what can be attained by these basic functionalities. It is also shown how the obtained pictures can be stored in the picture database |pic.dat| for reuse with different scaling or positioning. In the Appendix some tree diversions have been given. \bluehead What is the problem? \TeX's \cs{hrule} and \cs{vrule} primitives are a gem and very powerful. It would be nice to have similar primitives for any direction. In absence of these we can use line pieces provided in fonts. However, the latter approach suffers from the following drawbacks \bitem for a few discrete directions only \bitem line lengths are discrete too \bitem line thickness is inflexible. \smallbreak \bluehead Why? The need for general and flexible line elements arose when I faced the problem how to draw classical fractals.\ftn{Inspired by Gurari's work on \TeX{} and graphics.} The very least is the possibility to draw lines at {\oldstyle45}$^\circ$\Dash the halfwinds. \blueexample Pythagorean tree $$\pythtreepic$$ How to do this in \TeX\ftn {For the coding of \cs{pythtree} see later. Or Macro writing\Dash with confidence.}? Through the picture environment? Too clumsy, and cumbersome when changing the order, for example. Through \PS? This is possible, especially it provides for lines at all orientations.\ftn{J V Romanovsky has provided a concise \PS{} program.} Through \MF? Definitely, see my \MF{} anthology. However, why not go for how far we can get just by \TeX? And what about the relevancy? I'm very pleased by the spin-off how to typeset binary trees or charts, even rotated without the use of \PS. See the Appendix or the Publishing with \TeX{} user's guide. What we need is not the Cartesian picture environment approach, but the good old penplotter \TeX niques, better known in the pedagogical world as `Turtle graphics.' \bluehead Turtle graphics The basic idea is that the position of the turtle is maintained in the dimen variables \cs{x} and \cs{y}, with the reference point left invariant. The accompanying figure shows the effect of \cs{N1}: draw the line (\cs{x}, \cs{y})\dash(\cs{x}, \cs{y}+1), i.e.\ the turtle moves up. After completion \cs{y} has been increased by \cs{unitlength}. %Perhaps I better put it in pic.dat \vskip2.5\bigskipamount $$\unitlength.5ex \y=0pt\x-10\unitlength {\W{4}\E{40}}\S{4}% {\advance\y-2\unitlength\xytxt{ Ref.\ point}}% \N{20}\whiteE{20}\S4\whiteS4\xytxt{ (x,y)}$$ \vskip1.5\bigskipamount The movements\Dash our first steps in the turtle graphics world\Dash can be achieved by the control sequences \bitem \cs{N}, \cs{E}, \cs{S}, \cs{W} mean draw north, east, south and west, similar for \cs{NE}, \cs{SE}, \cs{SW}, and \cs{NW} \bitem \cs{whiteN}, \cs{whiteE}, \cs{whiteS}, \cs{whiteW} mean {\em white}-draw north, east, south and west, i.e., the turtle just moves.\ftn{The halfwinds can be composed from the winds in this case.} \smallbreak \blueexample Spiral To get the flavour another classical picture, which shows that we don't have to worry about coordinates. $$\spiralpic$$ The spiral is marked up essentially as follows\ftn{For the placement within context details consult \cs{spiralpic} in pic.dat.} \beginverbatim \unitlength.5ex \k30 \loop\E{\the\k}\advance\k-1 \S{\the\k}\advance\k-1 \W{\the\k}\advance\k-1 \N{\the\k}\advance\k-1 \ifnum\k>4 \repeat !endverbatim \vskip-\medskipamount \bluehead Basics Essential for the understanding is familiarity with \TeX's {\em boxes of size zero}, to know the effect of \cs{kern}-s and \cs{h/vss}-s inside, and of combinations of these boxes. Before reading on peruse the following. \bluesubhead Kerns and stretchorshrink-s within boxes of size zero. \blueexample With and without boxes of size zero \beginverbatim \newdimen\x \x=4ex \newdimen\y \y=2ex .\hbox to 0pt{\kern\x a\hss}. \kern10ex and \kern10ex .\kern\x a. and .\hbox to0pt{\kern\x\vbox to0pt {\vss\hbox{a}\kern\y}\hss}. \kern10ex and \kern10ex .\kern\x\raise\y\hbox{a}. !endverbatim with result %\newdimen\x \newdimen\y \bgroup \x4ex \y2ex $$.\hbox to0pt{\kern\x a\hss}. \kern10ex and \kern10ex .\kern\x a.$$ and $$.\hbox to0pt{\kern\x\vbox to0pt {\vss\hbox{a}\kern\y}\hss}. \kern10ex and \kern10ex .\kern\x\raise\y\hbox{a}.$$ \egroup By this mechanism we can move to any point on the page and put there what we wish. The essential issue of the box of zero width is that the {\em reference point is left invariant.} It is the same before and after. \bluesubhead Putting it together In vertical mode the \cs{hbox}-es are aligned on the reference point, and when the heights and depths are zero the \cs{hbox}-es overprint, and the order of specification is immaterial. In (restricted) horizontal mode \cs{hbox}-es of width zero overprint and can be given in any order, \TB{} {\oldstyle389}. In math mode the zero size boxes overprint. In display math the invariant reference point is centered horizontally. Coding in \TeX{} simple? Forget it! So unusual, but \dots con\-sequent, utmost consequent, sigh. \bluesubhead Coding flashbacks The codes which follow are the fifth or so version. The zeroeth version was there to please me, excited me. Recursive programming worked as I expected. Then I had a version which served to try out as many examples as I could think of. During the process of collecting examples I strove after consistency of the codes. Why did I use integer arithmetic anyway? I had no good reason and I decided to use dimensions and do the arithmetic through the dimensions, and widened en-passant the allowed arguments of the winds and halfwinds to expand to `factor'-s. And what about the context? It seemed necessary to abstract from the multitude of boxes and to come up with an enveloping hbox of width zero. Finally, details were taken care of, such as how do the macros behave in the various contexts. Do the winds and halfwinds behave the same? It turned out that they did not. So I had to go back from where I started. I considered the early versions as prototypes and started anew guided by specs, with simplicity and robustness as yardsticks, stating precisely how the elements should behave. By all means no sinecure, but IMHO with all respect, a must in software engineering.\ftn{In fact I had this article nearly finished when I realized that the vertical rules induce a vbox of the size of the rules, while other directions when boxed yielded a box of size zero. Not nice and confusing, although for the article and in my hands it was ok. Nevertheless, I decided to go for a uniform approach. When boxed the dimensions of the box should be zero.} Indeed, a superficially, simple problem. Is that all? Essentially yes, but \dots details matter. \bluehead The winds and halfwinds The intuitive idea is to compose lines out of elements, from what I call atoms. I used squares, casu quo rectangles, as atoms, and stacked these as follows.\ftn{In order to make it visible \cs{linethickness} has been set to 1ex. Experiments with bullets and \LaTeX's line fonts did not yield the pleasing exact results.} Essential is how lines leave a mathematical point. The accompanying model picture is obtained through the following macros. \beginverbatim \let\0\N \let\1\NE \let\2\E \let\3\SE \let\4\S \let\5\SW \let\6\W \let\7\NW \linethickness1ex \setbox\hlfwndelm=\hbox{\vrule width\the\linethickness height\the\linethickness depth0pt} \unitlength10ex \def\draw{\csname\the\dir\endcsname1} $$\loop\ifnum\dir<8{\draw}\advance\dir1\repeat$$ !endverbatim \thispicture{\linethickness1ex} $$\windpic$$ Remarks. \cs{N} etc.\ draw in the implied directions with length of the argument and \cs{unitlength} as scaling. \bluehead Pondering aloud Can we attain compatibility with \TeX's rules primitives? I don't think so, alas. On the other hand we have to reconsider the leaving of the rules from a point. \bluesubhead Thickness What is meant by thickness if we stack instead of tile? What is the perceived blackness? I presumed that stacking with square elements of size \cs{linethickness}${\times}$\cs{linethickness}\Dash like in the example figure\Dash yields the same blackness as a rule of thickness \cs{linethickness}.\ftn{I also supplied macros\Dash tiled variants\Dash for \cs{NW} and \cs{NE}.} \bluesubhead Size Usually the size along the x-axis must be provided. I prefer to have the real size specified independently from the orientation of the line. However, the resulting size is not necessarily \#1${\times}$\cs{unitlength}.\ftn{To put it in another way: the required length must be a multiple of the atom size.} In general the result differs at most by half the atom size, because it is composed of a multiple of the atomic element. We have to correct by $\sqrt2$ to compensate for the direction, when we pace along one of the axes. In the example the required length is {\oldstyle10}ex, with as result the stacking of {\oldstyle7} atoms of size {\oldstyle1}ex. For large lines one could think of combining \LaTeX's line{\oldstyle10} line elements with the smaller elements. I refrained from that for two reasons. Firstly, the \LaTeX's NW line element\Dash the |\char'145|\Dash did not fit exactly in the box, and secondly, the inflexibility of the thickness of the font elements. \bluehead Design specs With awareness of the above I specified the following for the microscopic level\Dash the wind and halfwind commands proper\Dash and for the macroscopic level\Dash the placement within context. \bluesubhead Microscopics The functionality is to draw a line of the specified length in the direction as implied by the control sequence name. The general specifications read as follows. \bitem as argument a `factor' is expected, to yield the required length \#1${\times}$\cs{unitlength}\ftn{The idea is that not only integer values can be specified but also decimal fractions.} \bitem parameterization is by \cs{linethickness} \bitem after drawing, the position of the turtle is at the end of each line, the reference point has been left invariant, and all the boxes have zero width, height and depth. \smallbreak Extra for the four halfwinds the following. \bitem parameterization is by \cs{hlfwndelm} and \cs{linethickness} in there \bitem draw a line of $\approx$ the specified size \bitem the atoms are stacked diagonally, at the corners. \smallbreak \bluesubhead Macroscopics The placement within context is the concern of the user. Because of the zero dimensions of the boxes it is a nuisance to skip or kern when using a picture to create the open space, the niche for the picture. Moreover, when the picture does not take dimensions we are in trouble at page breaks. Therefore assistance is badly needed. The picture environment idea combined with databases come to rescue. The {\it use\/} of prefab pictures has been simplified in this way, while there is flexibility via \cs{thispicture} to override the defaults. Pictures can be stored in BLUe's format pic.dat database. Within each database element the default placement within context can be povided for. Through the use of \cs{everypicture} and/or \cs{thispicture} the defaults can be overriden. This approach complies with the general principles adopted in BLUe's format system. \bluehead Coding the winds and halfwinds In the fourth version, where emphasis was put on that all boxes have zero dimensions, I also decided to separate to get at the (x, y) position from what is put there. This is much in the spirit of the second \cs{point} macro of \TB{} {\oldstyle389}, and adheres to the {\it separation of concerns\/} adage.\ftn{IMHO it makes the code more trustworthy and circumvents pitfalls. Especially, the mixing up of the kerns needed to get at (x, y) with the kerns to position what has to be put at (x, y).} The dimension variables \cs{x} and \cs{y} have after completion the values of the coordinates of the end of the line. \beginverbatim \newbox\hlfwndelm \newdimen\linethickness \linethickness1ex%.2pt \newdimen\auxdim %linesize % \def\xy#1{%Function: place #1 at x, y \vbox to0pt{\kern-\y \hbox to0pt{\kern\x#1\hss}\vss}} % \def\xytxt#1{%Function: place text #1 at x, y \xy{\vbox to0pt{\vss \hbox to0pt{\strut#1\hss}\kern0pt}}} % \def\N#1{\xy{\kern-.5\linethickness \vbox to0pt{\vss \hrule height#1\unitlength width\linethickness}}% \advance\y#1\unitlength} % \def\S#1{\advance\y-#1\unitlength{\N{#1}}} % \def\E#1{\xy{\vbox to0pt{\vss \hrule width#1\unitlength height\linethickness depth0pt\vss }}\advance\x#1\unitlength} % \def\W#1{\advance\x-#1\unitlength{\E{#1}}} % \def\NE#1{\auxdim#1\unitlength\correction \loop\advance\auxdim-\wd\hlfwndelm \ifdim\auxdim>-.5\wd\hlfwndelm \xy{\vbox to0pt{\vss\copy\hlfwndelm}}% \advance\x\wd\hlfwndelm \advance\y\ht\hlfwndelm \repeat} % \def\NW#1{\auxdim#1\unitlength\correction \loop\advance\auxdim-\wd\hlfwndelm \ifdim\auxdim>-.5\wd\hlfwndelm \advance\x-\wd\hlfwndelm \xy{\vbox to0pt{\vss\copy\hlfwndelm}}% \advance\y\ht\hlfwndelm \repeat} % \def\SW#1{\auxdim#1\unitlength\correction \loop\advance\auxdim-\wd\hlfwndelm \ifdim\auxdim>-.5\wd\hlfwndelm \advance\x-\wd\hlfwndelm \advance\y-\ht\hlfwndelm \xy{\vbox to0pt{\vss\copy\hlfwndelm}}% \repeat} % \def\SE#1{\auxdim#1\unitlength\correction \loop\advance\auxdim-\wd\hlfwndelm \ifdim\auxdim>-.5\wd\hlfwndelm \advance\y-\ht\hlfwndelm \xy{\vbox to0pt{\vss\copy\hlfwndelm}}% \advance\x\wd\hlfwndelm \repeat} %For \NE and \NW the titled variants read \def\NE#1{\auxdim#1\unitlength\correction \loop\advance\auxdim-.5\wd\hlfwndelm \ifdim\auxdim>-.25\wd\hlfwndelm \xy{\vbox to0pt{\vss\copy\hlfwndelm}}% \advance\x.5\wd\hlfwndelm \advance\y.5\ht\hlfwndelm \repeat} % \def\NW#1{\auxdim#1\unitlength\correction \loop\advance\auxdim-.5\wd\hlfwndelm \ifdim\auxdim>-.25\wd\hlfwndelm \xy{\vbox to0pt{\vss \llap{\copy\hlfwndelm}}}% \advance\x-.5\wd\hlfwndelm \advance\y.5\ht\hlfwndelm \repeat} !endverbatim \bluehead Coding a database element As promised in the Macroscopics section the visibility of the picture\Dash that is the size\Dash has to be added when the picture is stored in the database for (re)use. In order to do so I added two extra layers. The structure of a pic.dat database element, and a picture environment on top of for example gkp's environment to allow user flexibility. If we assume that the picture proper has been created within gkp's \beginverbatim \def\gkpbeginpicture(#1,#2)(#3,#4)% %#1, #2 xsize, ysize (dimensionless) %#3, #4 xshift, yshift (dimensionless) {...} \def\gkpendpicture{...} !endverbatim then the flexibility layer reads \thispicture{\emc} \beginverbatim \def\beginpicture{\bgroup \the\everypicture\the\thispicture \gkpbeginpicture(\the\xdim,\the\ydim)% (\the\xoffset,\the\yoffset)% } \def\endpicture{...} !endverbatim A pic.dat database entry consists of a quadruple: \cs{lst} list element tag, \cs{pic} the name, a group with defaults,\ftn{Demarcated by explicit braces.} and the picture proper enclosed by \cs{beginpicture} and \cs{endpicture}. \beginverbatim \lst\pic{} \beginpicture \endpicture !endverbatim \blueexample Coding the database element bintreepic The \cs{bintreepic} element of the pic.dat database reads as follows.\ftn{Note that there is much flexibilty here. Also the \cs{bintree} macros can be reused as such. \cs{bintreepic} comes down to an invoke of this macro with some flexibilty added.} \beginverbatim \lst\bintreepic{\bgroup \unitlength.5ex\kk32 \xoffset{-32} \yoffset{-2}% \xdim{66}\ydim{5}% \def\eertnib##1\bintree{\fi} \beginpicture\bintree\endpicture\egroup} %with in the kernel blue.tex \def\bintree{\S1\ifnum\kk=2 \eertnib\fi \divide\kk2 {\W{\the\kk}\bintree}% \E{\the\kk}\bintree} %and accounting for the leaves \def\eertnib#1\bintree{\fi\global\advance\k1 \whiteS1\xytxt{ \csname\the\k\endcsname}} !endverbatim \bluehead Coding recursion Long I believed that tail recursion\Dash as used for example in the \cs{loop} \dots \cs{repeat}\Dash is not sufficient. We also have to cope with `Ackermann-like splittings' of the recursion. For the case of the Pythagorean tree for example, this means that at each recursion level we have to take care of the left branch and the right branch, i.e.\ two invocations must be done. This interferes with how to handle the termination of the recursion. A problem? \TeX{} too difficult? Hang on there are at least two elegant and general solutions. \bluesubhead Recursion termination \blueexample $n$! As pedagogical example the calculation of $n$! \beginverbatim \n=... %counter var \nfac=1 %default \def\fac{\ifnum\n=1 \caf\fi \multiply\nfac\n \advance\n-1 \fac} \def\caf#1\fac{\fi} !endverbatim The termination is obtained because \cs{fac} is used as end terminator in the definition of \cs{caf}. \cs{fac} is implicitly gobbled, and the process backtracks, resulting finally in termination. \blueexample Pythagorean tree Without explanation the Pythagorean tree recursive macro is given below.\ftn {Hopefully, it is self-explanatory, at least with respect to the main flow. By the way in what order is the tree drawn?} At each level we have two invocations\Dash the branching\Dash to take care of the left and right branch. \beginverbatim \def\pythtree{\ifnum\level=1 \eerthtyp\fi \advance\level-1 \multiply\kk23\divide\kk32%\sqrt2 {\leftbranch\draw\pythtree}% \rightbranch\draw\pythtree} \def\eerthtyp#1\pythtree{\fi} !endverbatim No build up of \cs{fi}-s, no use of \cs{expandafter} nor \cs{let}. The \cs{let} mechanism has been used throughout in \TB. \bluesubhead A la Knuth In the coding of \cs{squine}\Dash a quadratic spline\Dash Knuth showed how to terminate (tail) recursions in \TeX. For \cs{fac} this results in the following. \beginverbatim \def\fac{\ifnum\n>1 \expandafter\dofac\fi} \def\dofac{\multiply\nfac\n \advance\n-1 \fac} !endverbatim For the Pythagorean tree the result reads as follows. \beginverbatim \def\pythtree{\ifnum\level>1 \expandafter\dopyth\fi} \def\dopyth{\advance\level-1 \multiply\kk23\divide\kk32 {\leftbranch\draw\pythtree}% \rightbranch\draw\pythtree} !endverbatim Earlier I noticed the elegance of introducing an extra level, especially to circumvent too many \cs{expandafter}-s in a row. As an aside the use reads \beginverbatim \let\0\N \let\1\NE \let\2\E \let\3\SE \let\4\S \let\5\SW \let\6\W \let\7\NW \def\leftbranch{\advance\dir7 \ifnum\dir>7 \advance\dir-8 \fi}%mod 8 \def\rightbranch{\advance\dir1 \ifnum\dir>7 \advance\dir-8 \fi}%mod 8 \def\draw{\csname\the\dir\endcsname{\the\kk}} \def\pythtree{\ifnum\level>1 \expandafter\dopyth\fi} \def\dopyth{\advance\level-1 \multiply\kk23\divide\kk32 {\leftbranch\draw\pythtree}% \rightbranch\draw\pythtree} $$\unitlength0.1pt\kk128 %Size \level5%Order \N{\the\kk} %Trunk \pythtree$$ \tracingstats1 \bye !endverbatim \bluehead Trinaries For {\oldstyle45}$^\circ$ lines I used square elements. Why not use a rectangular element for {\oldstyle30}$^\circ$ lines in conformance to the direction? {\catcode`\^=7 \blueexample Lines at {\oldstyle30}$^\circ$ } $$\trimodelpic$$ This model is obtained by \beginverbatim $$\x0pt\y0pt {\N{10}}{\ESE{10}}{\WSW{10}}$$ %with initializations \linethickness1ex \setbox\trielm=\hbox{\vrule width1.74\linethickness height\linethickness\relax} %To account for element in 30 degrees direction \unitlengthy\ht\trielm %default.2pt \unitlengthx\wd\trielm %default.3482pt \unitlength\unitlengthy%default.2pt %and the macros \def\WSW#1{\auxdim#1\unitlength\divide\auxdim2 \loop\advance\auxdim-\unitlengthy \ifdim\auxdim>-.5\unitlengthy \advance\x-\unitlengthx \advance\y-\unitlengthy \xy{\vbox to0pt{\vss\copy\trielm}}% \repeat} % \def\ESE#1{\auxdim#1\unitlength\divide\auxdim2 \loop\advance\auxdim-\unitlengthy \ifdim\auxdim>-.5\unitlengthy \advance\y-\unitlengthy \xy{\vbox to0pt{\vss\copy\trielm}}% \advance\x\unitlengthx \repeat} !endverbatim \blueexample Trinary tree $$\N{128}\tritreepic$$ \beginverbatim $$\x0pt\y0pt\level6 \kk128\N{128}\tritree$$ %with trinary tree macro \def\tritree{\ifnum1=\level \eertirt\fi \advance\level-1 \divide\kk2 {\N{\the\kk}\tritree}% {\ESE{\the\kk}\tritree}% \WSW{\the\kk}\tritree} \def\eertirt#1\tritree{\fi} !endverbatim Remark. The \cs{unitlength}-s are default equal to the sides of the elementary rectangular block. The size of the tree can be controlled by \cs{kk}. \bluehead Epilogue The lines at {\oldstyle45}$^\circ$ have little compatibility with \TeX's rules, alas, especially with non-neglible thickness. I was surprised to realize that \TeX's defaults for rules are not symmetric around their axes in relation to the reference point. \medskip\noindent Have fun, and all the best. \makesignature\let\makesignature\relax \bluehead Appendix: Binary tree and chart \blueexample Binary tree \beginverbatim \bluepictures\bintreepic\par $$\bintreepic$$ !endverbatim with result $$\bintreepic$$ How can we add leaves\ftn{See the PWT user guide for the answer.}? \bluesubhead Rotated tree Once we understand turtle graphics, rotating a tree can be done easily by shifting the meaning of the directions, and adjusting the positioning of the leaves.\ftn{A white lie. The tree is actually mirrored because I like the leaves to be numbered from the top. In general we can rotate via \PS.} \blueexample Rotated tree \begindemo \thispicture{\def\1{cgl} \def\2{PWT}\def\3{July} \def\4{1995}\def\5{\dots} \yoffset{-16}\ydim{28}} $$\rotatedbintreepic$$ !yields \thispicture{\def\1{cgl}\def\2{PWT} \def\3{July}\def\4{1995} \def\5{\dots}\def\6{}\def\7{} \yoffset{-16}\ydim{28}} $$\rotatedbintreepic$$ \enddemo \cs{bintree} and \cs{eertnib} come with blue.tex, and \cs{rotatedtreepic} is included in pic.dat. The \cs{rotatedtreepic} entry reads as follows. \beginverbatim \lst\rotatedbintreepic{%July 1995, cgl \bgroup\unitlength1ex% \let\W\N \let\exchange\E \let\E\S \let\S\exchange \def\1{x}\def\2{y}\def\3{a}\def\4{b}% \def\5{piet}\def\6{hans}\def\7{etc.}% \k0\kk16\xdim{10}\ydim{30}% \beginpicture\bintree\endpicture\egroup \thispicture{}} !endverbatim \bluesubhead Chart Through the \cs{bintree} macro we can also obtain charts elegantly. \blueexample Chart, \TB{} ex{\oldstyle22}.{\oldstyle14} {\oldstyle248} $$\chartpic$$ obtained via \beginverbatim %labels in preorder (default in \chartpic) \def\1{LMB, 1912} \def\2{MJHB, 1882}\def\5{PAME, 1884} \def\3{JHB, 1838} \def\4{MDB, 1840} \def\6{EFE, 1845} \def\7{CLW, 1850} \ekk8 \k0\unitlength2ex\x0pt\y0pt\kk8 \hbox{\bintree} %with auxiliaries \let\Eold\E \def\E{\global\advance\k1 \xytxt{ \csname\the\k\endcsname}\Eold} !endverbatim Remark. An aid in finding the numbers of the branches is to delete \cs{csname} and \cs{endcsname} in \cs{E} . The way of traversal at hand is called preorder. When using \cs{chartpic} from |pic.dat| the texts along the branches \Dash |\def\1{...} etc.|\Dash have to be supplied within a \cs{thispicture}, to override the defaults. \medbreak \makesignature \pasteuptoc \endscript