diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /info/laan |
Initial commit
Diffstat (limited to 'info/laan')
51 files changed, 19633 insertions, 0 deletions
diff --git a/info/laan/bridge/bridge.tex b/info/laan/bridge/bridge.tex new file mode 100644 index 0000000000..e90050f007 --- /dev/null +++ b/info/laan/bridge/bridge.tex @@ -0,0 +1,415 @@ + +\documentstyle[twocolumn]{article} +% +\setlength{\textwidth}{7in} +\setlength{\textheight}{9in} +\setlength{\oddsidemargin}{-.4in} +\setlength{\topmargin}{-.5in} +\newlength{\br} +\setlength{\br}{8em} +% +\renewcommand{\c}{\(\clubsuit\)} +\renewcommand{\d}{\(\diamondsuit\)} +\newcommand{\h}{\(\heartsuit\)} +\newcommand{\s}{\(\spadesuit\)} +% +\newcommand{\hand}[4]{ + \begin{minipage}[t]{\br}%I chose \br=8em + \begin{tabbing} + %width of parbox depends on the parameters: + %min{\br, max{string #1, ..., string #4}} + \(\spadesuit\) \= #1 \\ + \(\heartsuit\) \> #2 \\ + \(\diamondsuit\)\> #3 \\ + \(\clubsuit\) \> #4 + \end{tabbing} + \end{minipage} }%end \hand +% +\newsavebox{\NESW} +\savebox{\NESW}[4em]{% +\raisebox{-1.5\baselineskip}% +{\fbox{\small W + \raisebox{2.6ex}{N} + \hspace*{-1em} + \raisebox{-2.6ex}{S} + {E} + } +} }%end \NESW +% +\newcommand{\crdima}[6]{% +\begin{tabular}[t]{lll} + #1 & #3 & #2\\ + #4 & \usebox{\NESW} & #5\\ + & #6 & +\end{tabular} +}%end \crdima +% +\newenvironment{bidding}% +{\begin{tabbing} + xxxxxx\=xxxxxx\=xxxxxx\=xxxxxx \kill + West \>North \>East \> South\\ +}{\end{tabbing} }%end bidding +% +\begin{document} +\title{Typesetting Bridge\\ + via \LaTeX} +\author{C.G. van der Laan\\ +Rekencentrum RUG\\ +9700 AV Groningen\\ +The Netherlands\\ +Earn/Bitnet: cgl@hgrrug5\\ +\date{}} +\maketitle +\begin{abstract} +\LaTeX\ macros and a bidding environment +for typesetting bridge card distributions and bidding +sequences are given. +Examples borrowed from bridge literature are supplied. +\end{abstract} +% +\section{Card deals} +In bridge literature diagrams of distribution of cards over +the hands are often given in order to demonstrate bidding +sequences or to explain play technique. +In order to do this systematically and to abstract from layout details +I wrote a macro --- \verb=crdima= --- with six parameters +\begin{description} +\item[first parameter:] text, especially who is the dealer and what is the + vulnerability. For example: N/None, for North dealer and + vulnerability none. +\item[second parameter:] text, for example indication of play, + e.g., number \verb=Play 1= or otherwise, e.g., \\ + \verb=\begin{minipage}[t]{\br}=\\ + \verb= Play:\\demo=\\ + \verb=\end{minipage}= +\item[next four parameters:] the four hands in the sequence N, W, E, S. + Each hand is a call of the \verb=hand= macro +with four parameters: the \s, \h, \d, \c\ cards. +\end{description} +Example +\begin{quote} +\begin{verbatim} +\crdima{N/None}{% + \begin{minipage}[t]{\br} + Play:\\demo + \end{minipage}}% + {\hand{J74}{AJ}{QJT2}{Q874}}% + {\hand{A3}{K76}{963}{KJ952}}% + {\hand{K86}{T9542}{874}{T3}}% + {\hand{QT952}{Q83}{AK5}{A6}}% +\end{verbatim} +\end{quote} +yields +\begin{quote} +\crdima{N/None}{% + \begin{minipage}[t]{\br} + Play:\\demo + \end{minipage}}% + {\hand{J74}{AJ}{QJT2}{Q874}}% + {\hand{A3}{K76}{963}{KJ952}}% + {\hand{K86}{T9542}{874}{T3}}% + {\hand{QT952}{Q83}{AK5}{A6}}% +\end{quote} +% +{\bf Remarks}\\ +By this levelling I circumvented the limit of the +number of parameters. Because +parameter substitution is done by `text' +replacement there is no `(strong) type checking' +as in modern high-level programming languages. \\ +There is no check on the correctness of the cards (correct number, +distribution, multiple occurrence or omission), nor on the correct sequence +of the parameters. In SGML compliance with the input syntax can be +imposed with enhanced user convenience and alleviated proofreading, but +at the expense of elaborate coding, \cite{JG}. +No test on the +correctness of the sequence of the hands is ever possible, however.\\ +The \verb=crdima= macro can be used +to display all phases of the play. +Hands can be suppressed at discretion of the user +by empty actual parameters. +A renounce can be supplied via \verb=--=. +In the listings of the commands used for the examples +the \verb=quote= environment command is omitted. +\\[1ex] +For tournaments (bridge) plays are often dealt by computer. +At the end of tournaments players appreciate prints +of the deals. For that purpose my (Pascal) deal program +generates ASCII output --- for simple display on the PC --- +as well as \LaTeX\ input, optionally. This input is printed +with the aid of \verb=crdima=. Parameter testing is superfluous +for \LaTeX\ input generated this way. +% +\section{Bidding} +In the context of bidding theory I use a bidding environment. +The given card deal takes the following ACOL bidding +\begin{quote} +\begin{bidding} +-- \> 1\c\> no \> 1\s\\ +no \> 2\s\> no \> 4\s\\ +a.p. +\end{bidding} +\end{quote} +obtained via +\begin{quote} +\begin{verbatim} +\begin{bidding} +-- \> 1\c\> no \> 1\s\\ +no \> 2\s\> no \> 4\s\\ +a.p. +\end{bidding} +\end{verbatim} +\end{quote} +{\bf Remark} The bidding environment is independent of the language +of the bidding (West etc.\ can easily be adapted), +the bidding system as well as the number of bid +rounds. +\section{Macro texts} +% +%\verbinput{tcmac.tex} +% +\begin{verbatim} +\newcommand{\hand}[4]{ + \begin{minipage}[t]{\br}%I chose \br=8em + \begin{tabbing} + %width of parbox depends on the parameters: + %min{\br, max{string #1, ..., string #4}} + \(\spadesuit\) \= #1 \\ + \(\heartsuit\) \> #2 \\ + \(\diamondsuit\)\> #3 \\ + \(\clubsuit\) \> #4 + \end{tabbing} + \end{minipage} }%end \hand +% +\newsavebox{\NESW} +\savebox{\NESW}[4em]{% +\raisebox{-1.5\baselineskip}% +{\fbox{\small W + \raisebox{2.6ex}{N} + \hspace*{-1em} + \raisebox{-2.6ex}{S} + {E} + } +} }%end \NESW +% +\newcommand{\crdima}[6]{% +\begin{tabular}[t]{lll} + #1 & #3 & #2\\ + #4 & \usebox{\NESW} & #5\\ + & #6 & +\end{tabular} +}%end \crdima +% +\newenvironment{bidding}% +{\begin{tabbing} + xxxxxx\=xxxxxx\=xxxxxx\=xxxxxx \kill + West \>North \>East \> South\\ +}{\end{tabbing} }%end bidding +% +\end{verbatim}% +% +To eliminate data integrity errors +the listings of the above macros and +the listings of the commands used in the examples are `included' +via a transparent verbatim like environment, \cite{HM}; +so the same files were used for execution and listing. +% +\section{Some more examples} +In order to illustrate general bidding theory +from the point of view of one hand only, +the \verb=hand= macro can be used. +The following layout, heavily used in \cite{EC}, +\begin{quote} +\hand{AKJ42}{AK9}{T832}{T}\hspace{.5\br} +\begin{minipage}[t]{\br} +\begin{bidding} +-- \> 1\s\> no \> 1NT \\ +2\c\> ? +\end{bidding} +\end{minipage} +\end{quote} +is obtained via +\begin{quote} +\begin{verbatim} +\hand{AKJ42}{AK9}{T832}{T}\hspace{.5\br} +\begin{minipage}[t]{\br} +\begin{bidding} +-- \> 1\s\> no \> 1NT \\ +2\c\> ? +\end{bidding} +\end{minipage} +\end{verbatim} +\end{quote} +For issues related to defense play one often displays +only the dummy hand and your own hand. +The following example --- layout and text --- +is from \cite{Br}. +\begin{quote} +\crdima{}{}{}{\hand{AJ632}{43}{KQ7}{A85}}% + {}{\hand{985}{852}{AJ5}{KQT3}}\\ +\begin{bidding} +1\s\> no \> 2\h \> no\\ +2NT\> no \> 4\h \> a.p. +\end{bidding} +\end{quote} +\begin{quote} +Against 4\h\ South starts \c K, taken +with \c A. Leader continues \h AKQ. On the third +round of \h's, partner discards \d 9 (indicates +interest in \s). Leader continues with \d 2, +how do you continue? +\end{quote} +The example is obtained via +\begin{quote} +\begin{verbatim} +\crdima{}{}{}{\hand{AJ632}{43}{KQ7}{A85}}% + {}{\hand{985}{852}{AJ5}{KQT3}}\\ +\begin{bidding} +1\s\> no \> 2\h \> no\\ +2NT\> no \> 4\h \> a.p. +\end{bidding} +\end{verbatim} +\end{quote} +{\bf Remark} In a similar way W--N, N--E, E--S hands, +or W--E, N--S hands, or one hand only, with NESW diagram, +can be displayed simply by a suitable call of \verb=crdima=. \\[2ex] +% +Finally, an endplay --- positional squeeze --- +from \cite{HWK}\ is given. +\begin{quote} +\crdima{}{S leads \c A}% + {\hand{AJ}{K}{--}{--}}% + {\hand{KQ}{A}{--}{--}}% + {\hand{7}{9}{T}{--}}% + {\hand{2}{4}{--}{A}} +\end{quote} +The example is obtained via +\begin{quote} +\begin{verbatim} +\crdima{}{S leads \c A}% + {\hand{AJ}{K}{--}{--}}% + {\hand{KQ}{A}{--}{--}}% + {\hand{7}{9}{T}{--}}% + {\hand{2}{4}{--}{A}} +\end{verbatim} +\end{quote} +% +\section{Variation} +An elementary, and in a sense more general, crdima macro is +\begin{quote} +\begin{verbatim} +\newcommand{\crdimaele}[9]{% +\begin{tabular}[t]{lll} +#1 & #2 & #3\\ +#4 & #5 & #6\\ +#7 & #8 & #9 +\end{tabular}}%end crdimaele +\end{verbatim} +\end{quote} +All the given examples can be handled with \verb=crdimaele=. +\verb=crdimaele= applied to +the original deal without NESW diagram reads +\begin{quote} +\begin{verbatim} +\crdimaele{N/None}% + {\hand{J74}{AJ}{QJT2}{Q874}}% + {\begin{minipage}[t]{\br} + Play: demo; no NESW diagram + \end{minipage}}% + {\hand{A3}{K76}{963}{KJ952}}% + {}% + {\hand{K86}{T9542}{874}{T3}}% + {}% + {\hand{QT952}{Q83}{AK5}{A6}}% + {} +\end{verbatim} +\end{quote} +with result +\begin{quote} +\newcommand{\crdimaele}[9]{% +\begin{tabular}[t]{lll} +#1 & #2 & #3\\ +#4 & #5 & #6\\ +#7 & #8 & #9 +\end{tabular}}%end crdimaele +\crdimaele{N/None}% + {\hand{J74}{AJ}{QJT2}{Q874}}% + {\begin{minipage}[t]{\br} + Play: demo; no NESW diagram + \end{minipage}}% + {\hand{A3}{K76}{963}{KJ952}}% + {}% + {\hand{K86}{T9542}{874}{T3}}% + {}% + {\hand{QT952}{Q83}{AK5}{A6}}% + {} +\end{quote} +{\bf Remarks} \\ +A NESW diagram is obtained with +\verb=\usebox{\NESW}= --- or something +you have designed yourself --- +as fifth parameter.\\ +An elegant solution to the problem of having a default +NESW figure which could be overruled by another figure +is the optional parameter mechanism, which --- helas --- +is lacking in the macro facility of \LaTeX. The same applies +to the bidding environment with the default bid sequence +N E S W. Again via the mechanism of optional parameters +one could provide another bid sequence order or +abbreviations suited for other languages. +For the hand parameters one could think of the mechanism of named +parameters with complete freedom of the sequence order +of the parameters: one could easily provide the hands +in the order N E S W, the deal order. +% +\section*{Conclusions} +The author claims that bridge publications can be typeset easily +with high quality via \LaTeX\ and the given macros. +Proofreading of deals not generated by computer remains +tiresome.\\ +The lack of the facility of optional parameters in the +\verb=\newcommand= command and the \verb=newenvironment= +environment is felt as an understandable inelegancy. +% +\section*{Acknowledgements} +The author is grateful to Victor Eijkhout and Nico Poppelier +for their suggested improvements. +% +\begin{thebibliography}{99} +\bibitem{Br} BRIDGE. Monthly of the NBB (Dutch +Bridge Union). +\bibitem{EC} Crowhurst, E.\ (1986): +ACOL in competition. Pelham. London. +\bibitem{JG}Grootenhuis, J.\ (priv.\ comm.): +Kaartverdelingen en biedverloop bij bridgen +--- Een SGML tutorial. (Dutch). +\bibitem{HWK}Kelder, J., B.\ van der Velde (1986): +Dwangposities tegen \'e\'en tegenstander. Becht. A'dam. (Dutch). +Translated from:\\ +Kelsey, H.W.\ (1985, paperback):\\ +Simple squeezes. Gollancz. London. +\bibitem{LL} Lamport, L.\ (1986): +\LaTeX, a document preparation system. Addison-Wesley. +\bibitem{HM}Mulders, H.P.A.\ (priv.\ comm.): +\verb=\verbinput=. +\end{thebibliography} +{\bf P.S.} \ Dear Ron,\\ +I hope you are not too annoyed with my polishing of the article. +Agreed, I should have done that before submitting the paper. +Sorry once again. +But now the good news. At this moment --- the really (sic!) end of my +polishing process ---I asked myself the questions: `Is this article +worth publishing?', `Isn't it so that the macros are that simple such that +everybody not only could but would write them from scratch?'. +I for myself wouldn't and certainly didn't. +I polished and polished and paid attention to as much details as I +could think of under guidance of: abstraction, adaptability, +beauty, clearity, compactness, completeness, correctness, efficiency, +elegance, flexibility, modularity, modesty, relevance, robustness, +simplicity, transparency, and usefulness. \\ +Best wishes, +Kees (I wouldn't mind publishing this note as well). +\end{document} +% + + diff --git a/info/laan/paradigm/baker.eps b/info/laan/paradigm/baker.eps new file mode 100644 index 0000000000..60dc0b457e --- /dev/null +++ b/info/laan/paradigm/baker.eps @@ -0,0 +1,40 @@ +%!PS +%%BoundingBox: -80 -80 80 80 +%%Creator: cgl (inspired by Woody Baker) +%%CreationDate: 1996.05.21:1858 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%200 500 translate +% +4{%one quarter +-15 25 moveto +0 -10 rlineto +60 0 rlineto +0 -30 rlineto +10 0 rlineto +0 40 rlineto +-70 0 rlineto +0 10 rlineto +80 0 rlineto +0 -60 rlineto +-30 0 rlineto +0 10 rlineto +10 0 rlineto +% +35 -25 moveto +0 -10 rlineto +20 0 rlineto +10 10 rlineto +% +45 15 moveto +10 10 rlineto +90 rotate +}repeat +% +stroke +% +/Courier findfont 10 scalefont setfont +-55 -75 moveto +(Courtesy Woody Baker)show +showpage diff --git a/info/laan/paradigm/barnwindowii.eps b/info/laan/paradigm/barnwindowii.eps new file mode 100644 index 0000000000..a5fe8a57d9 --- /dev/null +++ b/info/laan/paradigm/barnwindowii.eps @@ -0,0 +1,38 @@ +%!PS Barn Window II +%%BoundingBox: -40 -40 40 40 +%%Creator: cgl +%%CreationDate: May 29 1996 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%300 500 translate +% +/l 36 def +/r {l 22.5 sin mul} def +/m {l 22.5 cos mul} def +8{r .5 mul 0 moveto + l 0 lineto + currentpoint %begin circular arc + 22.5 rotate m 0%center + r %radius + -90 90 arc + 22.5 rotate +}repeat +%inner circle +/rin {r .5 mul} def +rin 0 moveto +0 0 rin 0 360 arc +%outer circle +/rout {r m add} def +rout 0 moveto +0 0 rout 0 360 arc +%extra circles +/rin {r .25 mul} def +22.5 rotate +8{m rin add 0 moveto + m 0 rin 0 360 arc + 45 rotate +}repeat +stroke +showpage +%end diff --git a/info/laan/paradigm/bentley.eps b/info/laan/paradigm/bentley.eps new file mode 100644 index 0000000000..40af96a287 --- /dev/null +++ b/info/laan/paradigm/bentley.eps @@ -0,0 +1,15 @@ +%!PS EPSF +%%Title: Bentley's double loop +%%Creator: cgl (inspired by Bentleyj) +%%CreationDate: May 30 1996 +%%BoundingBox: -100 -105 100 105 +%%EndProlog +10{1 1 10{100 0 moveto + gsave + dup 36 mul rotate + 100 0 lineto stroke + grestore + } for + 36 rotate +} repeat +showpage
\ No newline at end of file diff --git a/info/laan/paradigm/eschera.eps b/info/laan/paradigm/eschera.eps new file mode 100644 index 0000000000..ad36e3f510 --- /dev/null +++ b/info/laan/paradigm/eschera.eps @@ -0,0 +1,17 @@ +%!PS Escher's impossible triangle +%%BoundingBox: -40 -40 40 40 +%%Creator: cgl (inspired by Guy Shaw) +%%CreationDate: 1996.05.23:1858 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%100 500 translate +3{25 34 moveto + 25 -34 lineto + 17 -38.2 lineto + 17 20 lineto + -17.6 0 lineto +120 rotate +}repeat +stroke +showpage
\ No newline at end of file diff --git a/info/laan/paradigm/escherb.eps b/info/laan/paradigm/escherb.eps new file mode 100644 index 0000000000..5a3ea87dd9 --- /dev/null +++ b/info/laan/paradigm/escherb.eps @@ -0,0 +1,25 @@ +%!PS +%%BoundingBox: -40 -40 40 40 +%%Creator: cgl (inspired by Guy Shaw) +%%CreationDate: 1996.05.23:1858 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%Essential part +%300 500 translate +25 34 moveto currentpoint +0 -68 rlineto currentpoint%down + -120 rotate +25 34 lineto%preserve symmetry + 120 rotate currentpoint +17 20 lineto currentpoint +-17.6 0 lineto currentpoint +%labels +/Courier findfont 8 scalefont setfont +moveto -5 -3 rmoveto (5) show +moveto 1 1 rmoveto (4) show +moveto 2 -5 rmoveto (3) show +moveto 2 0 rmoveto (2) show +moveto 2 0 rmoveto (1) show +stroke +showpage diff --git a/info/laan/paradigm/escherknotiii.epsabr b/info/laan/paradigm/escherknotiii.epsabr new file mode 100644 index 0000000000..31946a9aae --- /dev/null +++ b/info/laan/paradigm/escherknotiii.epsabr @@ -0,0 +1,25 @@ +%!PS EPSF +%%BoundingBox: -40 -31 40 43 +%%Creator: MetaPost and JJW, CGL +%%CreationDate: June 17 1996 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +3{-21.6507 12.5 moveto +-21.6507 27.74551 -13.78212 42.5003 + 0 42.5003 curveto +13.78212 42.5003 21.6507 27.74551 + 21.6507 12.5 curveto +21.6507 -0.24506 16.04897 -12.19249 + 6.58395 -20.3313 curveto +% +-14.3152 15.86746 moveto +-12.43301 23.58928 -7.45113 29.75021 + 0 29.75021 curveto +9.64748 29.75021 15.15549 19.42186 + 15.15549 8.75 curveto +15.15549 -2.07904 9.37823 -12.08548 + 0 -17.5 curveto +120 rotate +}repeat stroke showpage +%%EOF
\ No newline at end of file diff --git a/info/laan/paradigm/escherknotmf.eps b/info/laan/paradigm/escherknotmf.eps new file mode 100644 index 0000000000..32370ae4f3 --- /dev/null +++ b/info/laan/paradigm/escherknotmf.eps @@ -0,0 +1,20 @@ +%!PS EPSF +%%Title: Escher knot (mf prompted) +%%Creator: cgl (inspired Knotplot) +%%CreationDate: June 1996 +%%BoundingBox: -80 -80 80 80 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%150 650 translate +3{-43.30139 25 moveto + -43.30139 55.49103 -27.56424 85.00061 + 0 85.00061 curveto + 27.56424 85.00061 43.30139 55.49103 + 43.30139 25 curveto + 43.30139 -5.94014 26.79497 -34.5299 + 0 -50 curveto +120 rotate +}repeat +%pathbox = = = = ???p +stroke showpage diff --git a/info/laan/paradigm/flower.eps b/info/laan/paradigm/flower.eps new file mode 100644 index 0000000000..cd39433b4b --- /dev/null +++ b/info/laan/paradigm/flower.eps @@ -0,0 +1,17 @@ +%!PS EPSF +%%Title: flower.eps +%%Creator: cgl +%%CreationDate: June 4 1996 +%%BoundingBox: -50 -50 50 50 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +/r 36 def +10{r r moveto%begin drawing point + r 0 r 90 180 arc + currentpoint%origin + 0 r r 270 360 arc + 36 rotate +}repeat +stroke +showpage diff --git a/info/laan/paradigm/gurariabc.eps b/info/laan/paradigm/gurariabc.eps new file mode 100644 index 0000000000..979f573bca --- /dev/null +++ b/info/laan/paradigm/gurariabc.eps @@ -0,0 +1,20 @@ +%!PS EPS +%%Title: Guarai's ABC +%%BoundingBox: 0 -45 100 90 +%%Creator: Gurari +%%CreationDate: copied June 17 1996 +%%Pages: 1 +%%EndComments +%%EndProlog +%%Page: 1 1 +%300 500 translate +/Times-Bold findfont 45 scalefont setfont +-40 rotate +1 -.03 0{setgray + 0 0 moveto + (ABC) show + 3 rotate + } for +0 0 moveto -4 rotate +1 setgray (ABC) show +showpage diff --git a/info/laan/paradigm/gurarisq.eps b/info/laan/paradigm/gurarisq.eps new file mode 100644 index 0000000000..d95dfe63a7 --- /dev/null +++ b/info/laan/paradigm/gurarisq.eps @@ -0,0 +1,15 @@ +%!PS Gurari squares +%%BoundingBox: -200 -40 200 125 +%%Creator: cgl +%%CreationDate: June 20 1996 +%%EndProlog +%300 500 translate +/r 50 def +0 0 moveto 90 rotate +50{r 0 rmoveto + 1 1 4{0 r rlineto + 90 rotate}for + -30 rotate + .9 .9 scale +}repeat +stroke showpage diff --git a/info/laan/paradigm/jvr.eps b/info/laan/paradigm/jvr.eps new file mode 100644 index 0000000000..5273a7e86f --- /dev/null +++ b/info/laan/paradigm/jvr.eps @@ -0,0 +1,44 @@ +%!PS +%%Creator: J.V. Romanovsky +%%CreationDate: 1996? +%%BoundingBox: -200 -200 200 200 +%%EndProlog +%%Page: 0 1% +/rl{rlineto}def % to reduce the code +/FS {gsave setgray fill grestore stroke}def + % gsave ... grestore are used to save the graphic environment + % it is necessary if you want to use the current path several + % times, as here: to fill and to stroke +/s3 0.75 sqrt def /unit 40 def + % Two constants, 'unit' defines the size of construction +/U { unit mul 0 exch rl} def + % Verical line for several units +/R { unit mul % Transfer the number of units to length + dup % Copy it + s3 mul % Calculate X-offset + exch % Hide it + 0.5 mul % Calculate Y-offset + rl} def % Draw the line with the given offset pair +/L { unit mul dup s3 mul neg % neg is the only modificaion + exch 0.5 mul rl}def + % Right and left lines for several lines +/M{ s3 unit mul 0.5 unit mul translate -120 rotate} def + % Rotation of the picture to scan the vertices of the central + % triangle +%200 400 translate +/P1{ 0 0 moveto 2 R -1 L -2 U 4 R -1 U -9 R 4 U -1 L -2 U + 3 R 4 U -4 R 3 U -1 L -2 U -1 L} def + % Sorry, only copying the source Escher draft + % and no own imagination + % Three parts of the picture are made with the same procedure +%mark origin +%0 10 moveto +%0 -10 lineto +%10 0 moveto +%-10 0 lineto +%stroke +P1 0.6 FS M +P1 0.8 FS M +P1 0.95 FS M +showpage +% End diff --git a/info/laan/paradigm/linebundle.eps b/info/laan/paradigm/linebundle.eps new file mode 100644 index 0000000000..95f30d401a --- /dev/null +++ b/info/laan/paradigm/linebundle.eps @@ -0,0 +1,15 @@ +%!PS +%%Title: linebundle.eps +%%Creator: cgl +%%CreationDate: June 4 1996 +%%BoundingBox: -40 -40 40 40 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +/r 36 def +10{0 0 moveto + r 0 lineto + 36 rotate +}repeat +stroke +showpage
\ No newline at end of file diff --git a/info/laan/paradigm/malbork.eps b/info/laan/paradigm/malbork.eps new file mode 100644 index 0000000000..ec53c48c44 --- /dev/null +++ b/info/laan/paradigm/malbork.eps @@ -0,0 +1,28 @@ +%!PS +%%BoundingBox: -40 -40 40 40 +%% +%%Creator: cgl +%%CreationDate: 1996.05.21:1858 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 + +%100 400 translate + +% +45 rotate +10 0 moveto +4{20 0 37.5 12.5 25 25 curveto + 12.5 37.5 0 20 0 10 curveto + 90 rotate}repeat + +%inside lops +5 0 moveto +4{5 35 35 5 0 5 curveto + 90 rotate}repeat + +%circle +36 0 moveto +0 0 36 0 360 arc +stroke +showpage diff --git a/info/laan/paradigm/paradigm.gam b/info/laan/paradigm/paradigm.gam new file mode 100644 index 0000000000..b22198c1e0 --- /dev/null +++ b/info/laan/paradigm/paradigm.gam @@ -0,0 +1,431 @@ +%August 1995, C.G. van der laan, cgl@rc.service.rug.nl +\input blue.tex +\loadtocmacros +%\tolerance500\hbadness=499\hfuzz=5pt +\parindent=1pc +\everyverbatim{\unmc} + +\bluetitle Paradigms: It's all in the game + +\bluesubtitle Dialogue with \TeX + +\blueissue \maps{96}1 + +\beginscript + +\bluehead BLUe's Design VI + +Hi folks. +In {\oldstyle1989} Greene contributed +`Playing in \TeX's mind' to TUG {\oldstyle89}. +Having fun with \TeX{} has been on my mind all the time. +Of late, I thought of tic-tac-too as an exercise in programming +dialogues in \TeX, in a simple and elegant way, with hopefully +some paradigms emerging, suited for educational purposes. +The play is simple but nevertheless entails essential aspects +of having a dialogue with \TeX. +Below I first strip the play to the essentials and +from there build the user-friendly, but otherwise modest, code. +At the end the \TeX ing peculiarities are summarized. + +\bluehead The play + +Tic-tac-too is played by two persons on a board with $3{\times}3$ fields. +Each player marks a field in turn and the one who has first +three marks in a row has won. +\def\data{+\cs o\cs+\rs \cs o\cs+\rs o\cs \cs +} +$$\ruled\btable\data$$ + +\bluehead Prototyping + +The dialogue with \TeX{} goes through the log file, also called transcript. + +The board is represented by the defs \cs{1}, \dots\cs{9} row-wise. +Each player owns a mark called \cs{markplayer} and \cs{markopponent}. +A user is prompted to input a value\Dash 1, 2, ... or 9\Dash +which indicates the field where to put his mark. +The program keeps track of the kind of mark, via a toggle. +To end the game the user can input 0. + +The above resulted in the following bare-to-the-bones +implementation of tic-tac-too. +\beginverbatim +\def\showboard{\immediate\write0{\1\2\3} + \immediate\write0{\4\5\6} + \immediate\write0{\7\8\9}} +\def\initialize{\def\1{-}\def\2{-}\def\3{-} + \def\4{-}\def\5{-}\def\6{-} + \def\7{-}\def\8{-}\def\9{-}} +\def\play{\initialize \loop\showboard + \ifx\mark\markplayer + \let\mark\markopponent\else + \let\mark\markplayer\fi + \immediate\write0{Supply index for \mark:} + \read0to\index \expandafter + \xdef\csname\index\endcsname{\mark} +\ifnum\index>0 \repeat}%end \play +\def\markplayer{+}\def\markopponent{o} +\endlinechar-1 %TB20.18 +\play \bye +!endverbatim +Remarks. +Because of the toggling of the \cs{mark} an \cs{xdef} was needed. + +One could code that the player and opponent are both +taking care of during each traversal of the loop. +However, apart from that it makes the code longer it is also clumsy, and +if careless one has to account for multiple exits of the loop. +I assumed states in which the loop is traversed. +The next steps are not for the faint of heart. + +\bluehead Real-life version + +Given the above prototype implementation we can refine, +add more bells-and-whistles. Basically these add-ons are in two directions +\bitem improve the user interface +\bitem let the program do more, such as deciding who has won. +\smallbreak + +\bluesubhead Improving the user interface + +Explain the conventions adopted, especially what the indices stand for. + +Always nice is to allow for personalization, i.e.\ the system prompt asks for +YOU, with your name. +This entails that the players must be asked to identify themselves and that +the toggling must be extended. + +Another feature is that the program prompts the remaining indices to choose from. + +And what about robustness? I decided not to implement robustness with respect +to lowercase or uppercase y or n, for example. +I also refrained from checking whether the supplied index is allowed.\ftn +{Not that difficult, actually, + because the set of allowed indices is maintained.} + +\bluesubhead Let the program do more + +The most important aspect is to add intelligence to the program to check +for a winner. + +The play restarts automatically + +\bluesubhead The code + +The board is represented by the defs +\cs{1}, \cs{2}, \dots \cs{9}, the $3{\times}3$ board row-wise. + + +The structure of the program is similar to the prototype, +with \cs{play} elaborated and the check \cs{checkforgameend} added. +\beginverbatim +\immediate\write0{Tic-tac-too + Aug 1995, cgl@rc.service.rug.nl} +\let\ea\expandafter +\newcount\k\newcount\value\newcount\checksum +\newif\ifsol +\newtoks\set %Index set +\def\del#1{\def\lop##1#1##2\pol{\set{##1##2}} + \ea\lop\the\set\pol} +% +\def\showboard{\immediate\write0{} +\immediate\write0{\1\2\3} +\immediate\write0{\4\5\6} +\immediate\write0{\7\8\9}} +% +%Initialization +\def\initialize{\set{123456789}\solfalse + \immediate\write0{New names of players? + (default \player\space and \opponent)} + \read0to\yorn + \if y\yorn + \immediate\write0{Name player} + \read0to\player + \immediate\write0{Name opponent} + \read0to\opponent + \fi\k0 + \loop\advance\k1 + \ea\def\csname\the\k\endcsname{-} + \ifnum\k<10 + \repeat + \immediate\write0{Empty board} +}%end initialization +%Test for solution +\def\sol#1#2#3{{\advance\count#1\count#2 + \advance\count#1\count#3 + \ifnum\count#1=\checksum \global\soltrue\fi}} +\def\checkforgameend{% +\sol123\ifsol\message{\who\space won}\k0 \else +\sol456\ifsol\message{\who\space won}\k0 \else +\sol789\ifsol\message{\who\space won}\k0 \else +\sol147\ifsol\message{\who\space won}\k0 \else +\sol258\ifsol\message{\who\space won}\k0 \else +\sol369\ifsol\message{\who\space won}\k0 \else +\sol159\ifsol\message{\who\space won}\k0 \else +\sol357\ifsol\message{\who\space won}\k0 \else +\fi\fi\fi\fi\fi\fi\fi\fi} +%Play +\def\play{\initialize\begingroup +\loop\showboard + \ifx\who\player\value-1 \checksum-3 + \let\who\opponent + \let\mark\markopponent + \else\value1 \checksum3 + \let\who\player + \let\mark\markplayer + \fi + \immediate\write0{\who, supply index + for \mark:} + \immediate\write0{Choose from: \the\set. + (0 terminates)} + \read0t\ea o\csname\who\endcsname + \k\csname\who\endcsname + \ea\xdef\csname\the\k\endcsname{\mark} + \count\k\value + \checkforgameend +\ifnum\k>0 \ea\del\ea{\the\k} +\repeat\endgroup +\immediate\write0{Play another game?} +\read0to\newplayyorn +\if y\newplayyorn\ea\play\fi}%end Play +% +%Defaults +\def\player{Kees} \def\opponent{Ina} +\def\markplayer{+} \def\markopponent{o} +% +\immediate\write0{} +\immediate\write0{Board numbering} +\immediate\write0{123} +\immediate\write0{456} +\immediate\write0{789} +% +\play \bye +!endverbatim +Remark. In order to get the personalized prompts \cs{Kees}, or \cs{Ina} +the following coding was needed. +\beginverbatim +\read0t\ea o\csname\who\endcsname +!endverbatim +The few lines that follow look unnecessary complex +but are entailed by the above. + +\bluehead What more? + +It is intrigueing to ponder about adding even more intelligence. +For example to let the game prompt for obligatory moves, +or to let the program terminate when draw is inevitable, that is when there +is no possible solution left. +In order to achieve this I chose to +\bitem maintain the set of possible solutions, instead of checking all possible + solutions\ftn{This entails that non-feasible candidates are eliminated + from the set of candidate solutions.} +\bitem update the set of solutions after each move, and + look for a solution or a draw +\bitem look for obligatory moves. +\smallbreak +With respect to robustness the input can be checked for whether the index +is allowed, casu quo a y(es) or n(o). + +\beginverbatim +\immediate\write0{Tic-tac-too + Aug 1995, cgl@rc.service.rug.nl} +\let\ea\expandafter \let\nx\noexpand +\newcount\k\newcount\kk +\newcount\value\newcount\checksum +\newcount\feasible\newcount\prompt +%Solution lines +\newcount\hi\newcount\hii\newcount\hiii +\newcount\vi\newcount\vii\newcount\viii +\newcount\di\newcount\dii +\newif\ifsol +\newif\ifnotfound +%Index set and deletion from index set +\newtoks\set %Index set +\def\del#1{\def\lop##1#1##2\pol{\set{##1##2}} + \ea\lop\the\set\pol} +% +\def\showboard{\immediate\write0{} +\immediate\write0{\1\2\3} +\immediate\write0{\4\5\6} +\immediate\write0{\7\8\9}} +% +%Initialization +\def\initialize{\set{123456789}\solfalse + \hi0 \hii0 \hiii0 \vi0 \vii0\viii0 + \di0 \dii0 \feasible8 \prompt0 +%Cell no associated with solution subsets +\ea\def\csname solset1\endcsname{% + \ls\hi\ls\vi\ls\di} +\ea\def\csname solset2\endcsname{% + \ls\hi\ls\vii} +\ea\def\csname solset3\endcsname{% + \ls\hi\ls\viii\ls\dii} +\ea\def\csname solset4\endcsname{% + \ls\hii\ls\vi} +\ea\def\csname solset5\endcsname{% + \ls\hii\ls\vii\ls\di\ls\dii} +\ea\def\csname solset6\endcsname{% + \ls\hii\ls\viii} +\ea\def\csname solset7\endcsname{% + \ls\hiii\ls\vi\ls\dii} +\ea\def\csname solset8\endcsname{% + \ls\hiii\ls\vii} +\ea\def\csname solset9\endcsname{% + \ls\hiii\ls\viii\ls\di} + \immediate\write0{New names of players? + (default \player\space and \opponent)} + \read0to\yorn + \if y\yorn + \immediate\write0{Name player} + \read0to\player + \immediate\write0{Name opponent} + \read0to\opponent + \fi\k0 + \loop\advance\k1 + \ea\def\csname\the\k\endcsname{-} + \ifnum\k<10 + \repeat + \immediate\write0{Empty board} +}%end initialization +% +%Test for solution +\def\ls#1{%#1 is a solution counter + \ifnum#1=0 \advance#1\value + \else\ifnum\sign#1=\value \advance#1\value + \else\advance\feasible-1 + \delete#1 %from solution sets + \ifnum\feasible=0 \showboard + \message{***Draw***}\k0 + \fi + \fi + \fi + %Check for solution + \ifnum#1=\checksum \showboard + \message{***\who*** won}\k0 + \fi} +% +\def\sign#1{\ifnum#1>0 1\else -1\fi} +\def\solsetk{\csname solset\the\k\endcsname} +% +\def\delete#1{%#1 is a solution counter to be + %deleted from all solution sets +{\kk0 +\def\ls##1{\ifx#1##1\else\nx\ls\nx##1\fi} +\loop\advance\kk1 +\ifnum\kk<10 +\ea\xdef\csname solset\the\kk\endcsname + {\csname solset\the\kk\endcsname} +\repeat}}%end \delete +% +\def\fifo#1{\ifx#1\ofif\ofif\fi + \process#1\fifo} +\def\ofif#1\fifo{\fi} +\def\lstry#1{%#1 is a counter denoting + %a solution + \ifnum#1=0 + \else\ifnum\sign#1=\value + \advance#1\value + %Check for solution + \ifnum#1=\checksum \global\prompt\k + \fi\fi + \fi} +\def\process#1{\ifnum\prompt=0 + {\k=#1 \let\ls\lstry \solsetk}\fi} +% +\def\readprocess#1{\if#1\csname\who\endcsname + \notfoundfalse\fi} +% +\def\readindex{{\let\process\readprocess + \loop\read0t\ea o\csname\who\endcsname + %\who value in \set? + \notfoundtrue\ea\fifo\the\set0\ofif + \ifnotfound + \immediate\write0{Please supply index + from \the \set} + \repeat + \global\k\csname\who\endcsname}} +% +%Play +\def\play{\initialize\begingroup +\loop\showboard%\show\ the\solset + \ifx\who\player\value-1 \checksum-3 + \let\who\opponent + \let\mark\markopponent + \else\value1 \checksum3 + \let\who\player + \let\mark\markplayer + \fi + %Is there a winning move? + %(Prefails obligatory move) + {\prompt0 \ea\fifo\the\set\ofif + \ifnum\prompt>0 \global\prompt0 \fi} + %The idea is that the player must see it + %him/herself. Of course the program knows + %about the winning move. + %Obligatory move? (criterion 0<\prompt (<10) + \ifnum\prompt>0 \immediate\write0{Sorry \who, + obligatory move \the\prompt}\k\prompt + \else + \immediate\write0{\who, supply index + for \mark:} + \immediate\write0{Choose from: \the\set. + (0 terminates)} + \readindex + \fi + %put mark on board + \ea\xdef\csname\the\k\endcsname{\mark} + %update solutions associated with \k + \solsetk +%k=0 is stopping criterion +\ifnum\k>0 \ea\del\ea{\the\k}% + %Look ahead for obligatory move: + % Can \who gain in next turn? + \prompt0 \ea\fifo\the\set\ofif +\repeat\endgroup +\immediate\write0{Play another game?} +\read0to\newplayyorn +\if y\newplayyorn\ea\play\fi}%end Play +% +%Defaults +\def\player{Kees} \def\opponent{Ina} +\def\markplayer{+} \def\markopponent{o} +%And off we go +\immediate\write0{} +\immediate\write0{Board numbering} +\immediate\write0{123} +\immediate\write0{456} +\immediate\write0{789} +\immediate\write0{} +\play \bye +!endverbatim + +\bluehead Is this all? + +Especially the code in the last section has become complex. Should we make it more complex? +For the moment I stopped. +However, it is tempting to increase the order to {\oldstyle4}, +and to extend the play to {\oldstyle3} dimensions. +My case rest. + +\bluehead Paradigms + +The following functionalites have been encountered and a way how to code +these in \TeX{} have been worked out. +\bitem loop traversal in various states +\bitem global Boolean, \cs{global}\cs{soltrue} +\bitem maintaining an index set, + deleting an element from a set +\bitem test for an empty set +\bitem high-level parameterization, for example + a personalized prompt within a state-dependent loop +\bitem \cs{read} with a {\em reference\/} to a prompt through\\ + |\read0t\ea o\csname\who\endcsname| +\bitem check on what is read is allowed. +\smallbreak +Starting from the bare-to-bones prototype it is quite something to arrive +at a solution, which carries some intelligence and robustness \smiley. +\medskip +Have fun, and all the best. +\makesignature +\pasteuptoc +\endscript diff --git a/info/laan/paradigm/paradigm.hea b/info/laan/paradigm/paradigm.hea new file mode 100644 index 0000000000..f4d52bde07 --- /dev/null +++ b/info/laan/paradigm/paradigm.hea @@ -0,0 +1,587 @@ +%November 1994, Aug 1995, March 1996 +%Paradigm: Headache? +%C.G. van der Laan, cgl@rc.service.rug.nl +\input blue.tex \loadtocmacros +\tolerance500\hbadness=499\hfuzz=5pt +\parindent=1pc +\everyverbatim{\emc} + +\bluetitle Paradigms: Headache? + +\blueissue \maps{94}2 (revision March\on1996) + +\beginscript + +\bluehead BLUe's Design II + +Hi folks. When using \LaTeX{} +I was plagued in the past by the little glob of white space +on the first line after a head. +It made me clear that `spaces are harmful,' to paraphrase Dijkstra. +When designing \bluetex{} I had to look at the problem again +among other things, and to +\bitem provide a simple suite, with hardly no knowledge of the user + assumed about parameter separators +\bitem gobble redundant spaces as much as possible +\bitem allow also processing on the fly of the title +\bitem choose a coding style, and +\bitem choose a `markup language.' +\smallbreak + +My starting point was \cs{beginsection} \TB~\on355. +I chose |head| as root name conform to TUGboat. + +\bluesubhead The revision + +is about the superfluousness of the \# +as last element of a parameter specification, +from a functional point of view. + +The treatment of \cs{chapterhead} from BLUe's Reports +has been appended of August \on1995. + +A quick and dirty LP functionality to exhibit a ToC +has been added of August \on1995. +This ToC is not meant to be published but just + to assist developing notes, + to keep track of the structure, the setup, +which\Dash as reality taught me\Dash +develops too while writing. + +Really handy, believe me\winksmiley. + +\bluehead Headers + +I will design \cs{beginhead} and \cs{endhead}, +next to the minimal markup variant |\head{ ...}|.\ftn +{The subhead variants are similar but different in detail. + Especially in undoing glue when heads follow-up + each other without intervening text. Beware!} + +\bluesubhead Design goals + +From a typography point of view I would like to +\bitem discourage to set the title alone at the end of a page +\bitem typeset (flexible) vertical space (big) before and after (med) the title +\bitem gobble spaces at the beginning of the title +\bitem set the title in bold face (and the current size) unindented +\bitem don't indent the first line of the text after. +\smallbreak + +\bluesubhead What are the problems? + +The markup language constructs have to be chosen. +In macro expansion the two-part macro +\TeX nique should be the basis. In blue's format I adopted +the pairs |\begin<tag>| and |\end<tag>|. + +In order to set the title loose from the context +we have to determine values for the glue, +and be sure that it disappears at the top of a page. +The coding solution below has different values for the +parameters as supplied in \cs{beginsection}. +From experiments it turned out that the values supplied by Knuth +don't give nice results with blue.fmt. +Too much glue was inserted for my taste. + +Another problem is to prevent the head title +to be printed at the bottom of a page on its own. +The latter is related to the `widow-orphan' phenomenon. + +The coding of the minimal markup variant without parsing +but with processing of the fly of +`the argument' has to be resolved in some elegant way. + +The idea of a |\pre<tag>| and |\post<tag>| is general. +It parameterizes the placement of a document element +within context. Important! Whether you talk about titles, +displays, tables, graphs, or you name it. Perhaps +this should be generalized in something like +|\pasteup<tag>|. + +\beginverbatim +\def\beginhead{\the\prehead\bgroup\headfont} +\def\endhead{\egroup\the\posthead} +%with auxiliaries +\prehead{\vskip0pt plus2ex + \penalty-250\vskip0pt plus1ex + \bigskip\noindent} +\posthead{\medskip\nobreak + \noindent\ignorewhitespace}%Mod Nov 94 +!endverbatim + +\bluesubhead Take a deep breath + +The minimal markup form, {\em with the same functionality}, reads + +\beginverbatim +\def\head{\beginhead\bgroup + \aftergroup\endhead + \afterassignment\ignorespaces + \let\dummy=} +!endverbatim + +Explanation. +The replacement text starts \cs{beginhead} and a group. +Immediately after the opening of the group \cs{aftergroup} +takes care that the second part of the two-part macro will be invoked +at the right place. +The opening brace after the invocation of \cs{head} +is read away by assigning it to \cs{dummy}. +Spaces after the opening brace are ignored, due to +\cs{afterassignment}\cs{ignorespaces}. +The \TeX nique---moving the group opening---has been +borrowed from plain's \cs{footnote}, \TB~\on363. +There it is used at the end of the replacement text of \cs{fo@t}. +\beginquote +What is the difference with the macro with a \# as last element of the +parameter specification?\ftn +{The \# as last character of the parameter text makes that + the opening brace and what follows + is placed after the replacement text of \cs{head}, \TB~\on204.} +\endquote +At first sight it looks identical. However, the difference is twofold. +The situation with the \# at the end of the parameter text differs +because +\bitem an opening brace after the invocation of \cs{head} is syntactically required +\bitem no braces are needed for the last argument, because $\{$ is + a parameter separator.\ftn{The example, \TB~\on204, + used the invocation + |\a3pt{x}|, while without \# as last element of the parameter list + the markup would have read |\a{3pt}{x}|.} +\smallbreak + +Because of these extra safeguards, +I stayed with the \# as end of the parameter list, +for building one-part macros on top of two-part macros. +Quite something isn't it? + +\bluesubhead Paradigm + +We should build upon two-part macros. +In order to add the short variant to {\em similar\/} two-part +macros the following template can be used. + +\beginverbatim +\def\<tag>#{\begin<tag>\bgroup + \aftergroup\end<tag> + \afterassignment\ignorespaces + \let\dummy=} +!endverbatim + +\bluesubhead Take a deeper breath + +When using the above template in practice, +it occurred to me that \TeX{} could handle that too. +For \cs{head} the desired functionality is that + +\beginverbatim +\onepartmacro{head} +!endverbatim + +will build the macro \cs{head} based upon +the two-part macros \cs{beginhead} and \cs{endhead}. + +The naive coding\Dash which does not work, but makes +the purpose quite clear\Dash reads + +\beginverbatim +\def\onepartmacro#1{\def\#1##{\begin#1 + \bgroup\aftergroup\end#1 + \afterassignment\ignorespaces + \let\dummy=}} +!endverbatim + +Several desired functionalities have to be coded +in \TeX's peculiar way, with as result + +\beginverbatim +\def\onepartmacro#1{{ +\ea\let\csname begin#1\endcsname=\relax +\ea\let\csname end#1\endcsname=\relax +\toks0={\bgroup\aftergroup} +\toks1={\afterassignment\ignorespaces + \let\dummy=} +\ea\xdef\csname#1\endcsname##{% + \csname begin#1\endcsname + \the\toks0 \csname end#1\endcsname + \the\toks1 }}} +!endverbatim + +Explanation. +A lot of the trickery about partial expansion, \TB~\on216, has been applied. + +First a \cs{csname} is used to compose the names from the root name. + +Second the one-part macro is defined via an \cs{xdef} +with suppression of the expansion of the +|\begin<name>|, |\end<name>|, and the other tags. +It is an \cs{xdef} to keep the auxiliaries used local. +The first is handled via the property that a control sequence +equal to a character, and in general to an unexpandable token, is not expanded. +The second is handled by the property that a \cs{the} +on a token list is a one-step expansion. + +\bluesubhead Some remarks + +Note that I did not gobble spaces at the end of the title argument. +In the headtitle they won't harm because +the title is set on a line of its own.\ftn +{In the other heads the space at the end of the argument can be there on purpose. + Watch out!} + +Processing a title on the fly is needed for verbatims +and in general when we don't like the `eyes' of \TeX{} +to set catcodes differently from those the script expects +when digested in the `stomach.' + +\bluesubsubhead The bad news + +Minimal markup for \cs{head} and the like can be +felt as an anachronism. +With \AllTeX{} intelligent editors we don't need minimal markup anymore. + +\bluesubsubhead Disclaimer + +The above template does not work for all two-part macros, +for example not for my btable (or any \cs{halign}).\ftn +{See however, `Paradigms: Two-part macros.'} + +\bluesubsubhead The good news + +Via this mechanism we can abstract +at the {\em user level\/} from token variables and definitions. +The user can supply the information as if it was a token variable. +The using of the long form or the minimal form has been reduced +to a matter of taste. And that is a good thing. + +\def\head{\beginhead\bgroup + \aftergroup\endhead + \let\dummy=} + +\bluehead Tests? + +This note itself contains examples of use in its original form. + +\thisverbatim{\catcode`\|=12 } +\beginverbatim +\beginhead|Head text + in verbatim|\endhead + Text after\\next line + +\head{Head text, with |this| + in verbatim} + Text after\\next line +!endverbatim + + with results +\medskip +\beginlines +\kern-\medskipamount + +\beginhead|Head text in verbatim|\endhead +%\head{{\tt Head text in verbatim}} + Text after\\next line + +\head{Head text, with |this| in verbatim} + Text after\\next line +\medskip +\endlines +\medbreak +Run it,\ftn{blue.tex is available form the CTAN, + as is the accompanying article BLUe's Format.} +and have fun. All the best. + +\bluehead Note added in proof + +In order to allow blank lines after the heading in the script, +I replaced \cs{ignorespaces} in \cs{endhead} by +\cs{ignorewhitespace}.\ftn{Due to Phil Taylor. + TUG's \cs{ignorespacesandpars} would probably do too.} + +A blank line after a heading is natural for a text without explicit markup. +Knuth started from natural markup and stayed close to that, IMHO. +His markup tags to format the chapter (titles and contents) in \TB{} +file are + +\beginverbatim +\beginchapter +\endchapter +!endverbatim + +Imagine ASCII text with visual layout, and in order to markup +the title {\em and text\/} insert the above commands, with the natural +blank line already there to end the arguments of \cs{beginchapter}. +Knuth's \cs{beginchapter} not only takes care of the title but also +handles the chapter contents {\em on the fly\/} until \cs{endchapter} +is encountered. +Really much different from \LaTeX's approach, to name but +one general set of markup tags. + +\bluesubhead Knuth and natural markup + +Imagine that the ASCII text of a section reads +\beginverbatim +Section 1. Title + +Now starts the section text +proper... +And this is the last line of it. +!endverbatim + +What is the simplest and most natural markup for this? +First the requirements +\bitem section should be flexible towards language variation +\bitem title should be processed on the fly. +\smallbreak + +A solution is the following extension heavily inspired by +\cs{beginchapter} of manmac. + +\beginverbatim +\def\beginsection#1 #2#3. {\bgroup + \def\par{\egroup\endhead}% + \beginhead#1 #2#3. } +\posthead{\nobreak\medskip + \noindent\ignorewhitespace} +% +\let\endsection\relax%or forget about it +% +\def\ignorewhitespace{\begingroup +%Due to Phil Taylor EuroTeX 94 +\catcode`\ =9 +\catcode`\^^I=9 +\catcode`\^^L=9 +\catcode`\^^M=9 +\futurelet\dummy\endgroup} +!endverbatim + +The marked up script is obtained by only inserting \cs{beginsection}! + +\beginverbatim +\beginsection Section 1. Title + +Now starts the section text +proper... +And this is the last line of it. +!endverbatim + +The beauty of the above approach, Knuth's IMHO, is that the total section +is handled, the title as well as the contents part, with the title +proper part processed on the fly. +Moreover, it is as close to natural markup as I can think of. +(trivial) Language problems are absent. +One can abstract from `Section' via a toks variable \cs{sectionname}. +Automatic numbering can be inserted too, but the question is +whether it is really handy, especially in view of subsections and the +like. + +\bluehead Copied from BLUe's Report + +In BLUe's Report I have dealt with more complicate header matters, +which show up when we like to reuse the title for inclusion in +the ToC, ToE and ilks. It turns out that `\cs{bluechapter}' +is much more complicated than `\cs{bluehead}.' +Below the storing of titles and their reuse is dealt with among other things. +Because of storing\Dash which fixes the catcodes\Dash +the titles are not processed on the fly. + +\bluesubhead Chapter head matters + +The required functionalities\Dash the specs so to say\Dash are to +\bitem start a new page +\bitem store the title for reuse (running head, table of contents) +\bitem maintain and store the chapter counter (for use with the exercises, + table of contents, and the like) +\bitem write the title and title counter value to the contents file +\bitem typeset the title on a new page with some white space after +\bitem reset counters which start anew per chapter (headings, exercise number, + and the like) +\bitem provide the right \cs{headline} and \cs{footline} with the title, + chapter title, and page number +\bitem suppress the headline on the first page of a chapter (or supply for + an otherwise special headline) +\bitem process the title on the fily to allow for example verbatim +\bitem condition the writing of the title and title counter value + to the examples file. +\smallbreak + +Quite something, isn't? +That is why title matters are not trivial. +The conditioning of writing the title to the examples file is there, +because we don't like the title etc. to appear in that file if the chapter +lacks examples. + +\beginverbatim +\def\beginchapterhead{\the\prechapterhead + \storechaptertitle} +% +\def\storechaptertitle#1\endchapterhead{% + \global\chaptertitle={#1}\endchapterhead} +% +\def\endchapterhead{\centerline{\chapterfont + \the\chapternumbering\the\chaptertitle} + \the\postchapterhead\ignorewhitespace} +!endverbatim + +This approach looks promising. +What has to be done before is the concern of \cs{prechapterhead}. +\cs{storechaptertitle} does what its name suggests. +The formatting of the number of the chapter is the concern +of \cs{chapternumbering}. +\cs{postchapterhead} takes care of leftovers. +Default \cs{chapternumbering} is empty, that is, no number will be typeset. + +Undoubtedly, the careful reader would object that the title is stored +and that the catcodes are set before processing. +That is right, of course, but via \cs{everychapterhead}\Dash in +\cs{prechapterhead}\Dash +we can guarantee that symbols will have the right catcodes. +\cs{storechaptertitle} is there to allow the short variant +|\chapterhead{...}|. +The combination of storing and in-line verbatim does not work. Beware.\ftn +{For me this does not hinder because I don't like these kinds of font changes + in a chapter header.} + +\beginverbatim +\prechapterhead{\newpage\null\vskip4pc + \bgroup\catcode`\^=7 + \the\everychapterhead\the\thischapterhead + \global\advance\chaptercnt1 } +% +\postchapterhead{\egroup + \headcnt0 \exercisecnt0 \examplecnt0 + \write\toc{\nx\separator + {\alfanum\the\chaptercnt} + {\the\chaptertitle}} + %suppress headline first page chapter + \headline{\global\headline + {\hbox to\pagewd + {\sl\the\chaptertitle\hfill + \the\title}}}% + \footline{\hbox to\pagewd{\small + \rlap{Draft \today}\hfill\dash + {\oldstyle\the\pagenumber}\dash + \hfill\llap{\copyright + \the\crowner}}}% +%Example is redefined here such that on +%first use if ever in the chapter, it +%redefines itself into the regular macro, +%while writing the chapter titles to the +%table-of-examples, ToE, file. +%In this way chapter titles of chapters +%without examples will not be written to +%the ToE. + \def\example{\write\toe{\nx\separator + {\alfanum\the\chaptercnt} + {\the\chaptertitle}} + \let\example\regularexample + \example} + \thischapterhead{}\vskip3pc} +!endverbatim + +The material is enclosed within a group to keep the effect +of \cs{thischapter} local. + +\cs{example} is defined such that only when it is used +the title and number of the chapter will be written to the file +associated with \cs{toe}. \cs{regularexample} writes the example title +and number to the file associated with \cs{toe}. + +Intriguing is \cs{alfanum}. The purpose is to control whether a number +or a letter should appear. This is particularly useful with appendices. +\beginverbatim +\def\setupappendices{\thischapterhead= + {\chaptercnt64 \gdef\alfanum{\char}% + \global\chapternumbering= + {\alfanum\the\chaptercnt: }}} +!endverbatim + +And what about the one-part macro on top? +The above was already complicated. +What is the problem for a one-part macro? +For most of the cases we can do with a simple variant. +However, when we like to process math, especially the circumflex, +as part of the title more work has to be done. The mechanism has been +explained in `Paradigm: Two-part macros.' + +\beginverbatim +\def\chapterhead{\bgroup + \def\storechaptertitle##1{\egroup + \global\chaptertitle{##1}% + \endchapterhead}\beginchapterhead} +!endverbatim + +As a tribute to manmac I also defined the following limited variant.\ftn +{The circumflex in math in the title will hiccup. Most of the time we + don't need that.} + +\beginverbatim +\def\bluechapter#1\par{\beginchapterhead + #1\unskip\endchapterhead} +!endverbatim + +A trivial user interface on top which counteracts the curly braces mania +at the expense of processing on the fly.\ftn +{What does on-the-fly mean anyway, when we have to store the title for multiple use? + The answer is that we would like to allow for math too. No verbatims however.} + +\bluehead A little LP functionality + +Of late with notes I needed to generate automatically a small rudimentary +ToC to assist my writing and developing notes. Just quick and dirty. +For that purpose I provided the following for the |\blue(sub(sub))head|-s.\ftn +{Be aware that these head titles are not processed on the fly. + In March \on1996 I replaced writing to a file by maintaing the toc in a toks variable, + because in general it is not a mouth-only process the writing can go astray. + It did with |$\longrightarrow$|. Actually, for this toc assitant I did not need + the output functionality of adding page numbers.} + +\beginverbatim +\newtoks\tocvar +\let\bh\bluehead +\long\def\bluehead#1\par{\bh#1\par +\tocvar\ea{\the\tocvar\par#1}} +\let\bsh\bluesubhead +\long\def\bluesubhead#1\par{\bsh#1\par +\tocvar\ea{\the\tocvar\par\quad#1}} +\let\bssh\bluesubsubhead +\long\def\bluesubsubhead#1\par{\bssh#1\par +\tocvar\ea{\the\tocvar\par\qquad#1}} +\let\be\blueexample +\long\def\blueexample#1\par{\be#1\par +\tocvar\ea{\the\tocvar\par\qquad ex: #1}} +!endverbatim + +For pasting up the ToC I supplied. +\beginverbatim +\long\def\pasteuptoc{\newcol + \bluehead Contents\par + \the\tocvar + \let\makesignature\relax} +!endverbatim + +Finally, I merged the above into BLUe's format system. +The toks storage allocation for \cs{tocvar} +and \cs{loadtocmacros} in blue.tex, and +the rest in tools.dat. + +The user can supply +\cs{loadtocmacros} at the beginning after |\input blue.tex|, and +\cs{pasteuptoc} just before \cs{endscript}. + +In this way these macros don't conflict, just an extra +to support your notes with a ToC at the end, to maintain +the overview.\ftn{Note that \cs{report} already provides for a ToC.} + +\bluehead Acknowledgements + +Phil Taylor is kindly acknowledged for his \cs{ignorewhitespace} +as generalization of \cs{ignorespaces}, and his suggestion to assign +\cs{relax} to tokens to inhibit expansion instead of a number. +The latter is done on \TB~\on216. + +Have fun, and all the best. +\makesignature +\pasteuptoc +\endscript
\ No newline at end of file diff --git a/info/laan/paradigm/paradigm.itm b/info/laan/paradigm/paradigm.itm new file mode 100644 index 0000000000..e3e25928b9 --- /dev/null +++ b/info/laan/paradigm/paradigm.itm @@ -0,0 +1,216 @@ +%November 1994, +%Paradigm: plain's item extended +%C.G. van der laan, cgl@rc.service.rig.nl +\input blue.tex \loadtocmacros +\loadindexmacros\preindex{\head{Index}} +\tolerance500\hbadness=499\hfuzz=5pt +\parindent=1pc +\everyverbatim{\emc} + +\bluetitle Paradigms: Plain's \cs{item}-s extended + +\blueissue \maps{94}2 {\small revision March \on1996} + +\beginscript + +\bluehead A new series + +Hi folks. After having given birth to BLUe's Format\Dash yes YAF, +yet another format, to paraphrase YACC\Dash I considered it of +general interest to spread gems to the world outside +via MAPS and hopefully via TTN's `Hey \Dash{} It works' column. + +The reason for me doing so is that apparently trivial +design aspects need careful attention in this macro +expansion branch of software engineering. +We have to start allover from the basics---slowly and +carefully---and end up with paradigms of macro expansion +coding. + +I intend a series of backside of the envelope contributions. + +\bluehead BLUe's Design I + +^^|\item| +When you like plain's \cs{item}-s so much as I do then this is for you. +Hang on! +In practice we all like bulleted \cs{item}-s and +\cs{item}-s with automatic numbering and lettering. +It looks like---biased by \LaTeX---that we need some +|\begin<tag>| and |\end<tag>| to begin and end. +Not so! + +It can be done simpler, with nearly the same +minimal markup as with \cs{item}. +The extra is to end the list by \cs{smallbreak}, +which is nearly natural.\ftn{I use \cs{smallskip} after \cs{item}-s + for setting the list slightly apart from what follows. + When a header follows, or you just like to + end the list, say \cs{endlist} which \TeX nically ends + the group.} + +Remember \TB~\on102, where Knuth states +\beginquote +`It is customary to put \cs{medskip} before and after + a group of of itemized paragraphs, and to say \cs{noindent} +before any closing remarks that apply to all of the cases.' +\endquote +I decided not to include \cs{noindent} because +the list is set apart already. + +\bluesubhead Appetizer + +The coding of the bulleted item reads\ftn{\TB, exercise \on14.\on20.} + +\beginverbatim +\def\bitem{\item{$\bullet$}} +!endverbatim + +\bluesubhead Coding AN-items + +^^|\Aitem| +With automatic numbering and lettering we have +to stop the automatism of increasing the counter and +to reset the counter for subsequent use +at the end of the list. + +In \cs{item} nothing special had to be done. +Ending the paragraph via a blank line (or \cs{par}) +was enough. +We cannot modify \cs{par} locally +because \cs{par} starts the replacement text of +\cs{item} (and \cs{itemitem} as well). +So the natural markup to let a blank line (or \cs{par}) +end the list is not possible. + +I could not work along the remark made in \TB{} ex\on14.\on29{} either, +because this goes wrong with nesting, read with the use of \cs{itemitem}. + +My solution is a mixture of coding borrowed from +\cs{item} page \on355, +\cs{beginchapter} \on418, and of +\cs{d@nger} \on419{} of \TB.\ftn +{The more I come to think of it the more ways of doing boil up. + How to decide which one is the best?} + +\def\ftntxt{{\rm Do you see the extension for \cs{Aitem}?}} +\beginverbatim +\newcount\itemno +\def\nitem{\bgroup + \def\nitem{\advance\itemno1 + \item{\the\prenum + {\oldstyle\the\itemno + }\the\postnum}} + \def\smallbreak{\endgraf\egroup + \smallbreak} + \let\smallskip\smallbreak\nitem} +\def\aitem{\bgroup\itemno96!ftn!ftntxt + \def\aitem{\advance\itemno1 + \item{\char\itemno.}} + \def\smallbreak{\endgraf\egroup + \smallbreak} + \let\smallskip\smallbreak + \aitem} +\def\endlist{\endgraf\egroup} +%and the defaults +\prenum{(}\postnum{)} +!endverbatim + +We not only have to end the paragraph(s) but also to end the scope. + +\blueexample Numbered and nested items + +\prenum{}\postnum{.} +\beginverbatim +Text preceding\\next line +\prenum{}\postnum{.} +\nitem first numbered item\\next line +\itemitem- sublist\\next line +\nitem second numbered item\\next line +\itemitem- sublist\\next line +\smallbreak +Text in between\\next line +\aitem first lettered item\\next line +\aitem second lettered item\\next line +\smallbreak +Text after\\next line. +!endverbatim +with result +\medskip +Text preceding\\next line +\nitem first numbered item\\next line +\itemitem- sublist\\next line +\nitem second numbered item\\next line +\itemitem- sublist\\next line +\smallbreak +Text in between\\next line +\aitem first lettered item\\next line +\aitem second lettered item\\next line +\smallbreak +Text after\\ +next line. + +\bluesubhead Enumerated items + +Along the same line we can add an enumerated item as follows. + +\beginverbatim +\def\eitem{\bgroup + \def\eitem##1{\item{##1}}% + \def\smallbreak{\endgraf + \egroup\smallbreak}% + \let\smallskip\smallbreak + \eitem} +!endverbatim + +\bluesubhead Verbatim items + +Of late\ftn{In my tutorial flyer `Macro writing,' \on1995.} +I needed a list of items with each item only verbatim texts. + +To use \vrt{} at the end and the beginning of each line +and to add |\\| or so at the end is +in the spirit of \TB, as done with \cs{displaylines}. +Not bad but a nuisance to insert all those \vrt s. + +Another modular solution was to use \cs{bitem} and after that + +\beginverbatim +\preverbatim{}\postverbatim{}\beginverbatim +!endverbatim + +and to end each item entry by + +\thisverbatim{\catcode`\!=12 \catcode`\*=0 } +\beginverbatim +!endverbatim +*endverbatim + +The minimal markup solution is to provide a \cs{verbitem} tag which +assumes only verbatim text as entry. + +Pitfalls. +The second and so on tag must begin with !verbitem.\\ +The tag must appear on a line of its own.\\ +End with !smallbreak. + +\beginverbatim +\def\bitem{\begingroup + \def\bitem{\item{$\bullet$}}% + \def\smallbreak{\endverbatim + \endgraf\endgroup\smallbreak}% + \let\smallskip\smallbreak + \bitem + \def\item{\endverbatim%to close + \par\hang\textindent}% +} +\def\verbitem{\bitem +\preverbatim{}\postverbatim{}% +\beginverbatim} +!endverbatim + +Have fun, and all the best +\makesignature +\pasteuptoc +\sortindex\pasteupindex +\endscript diff --git a/info/laan/paradigm/paradigm.lin b/info/laan/paradigm/paradigm.lin new file mode 100644 index 0000000000..332b591ad8 --- /dev/null +++ b/info/laan/paradigm/paradigm.lin @@ -0,0 +1,755 @@ +%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)% + <pictureproper>} +\def\endpicture{...} +!endverbatim +A pic.dat database entry consists of a quadruple: +\cs{lst} list element tag, +\cs{<name>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\<name>pic{<defaults>} +\beginpicture +<pictureproper> +\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 diff --git a/info/laan/paradigm/paradigm.lps b/info/laan/paradigm/paradigm.lps new file mode 100644 index 0000000000..8f8ad6666d --- /dev/null +++ b/info/laan/paradigm/paradigm.lps @@ -0,0 +1,566 @@ +%Paradigm: Loops. Aug 1995, revised Feb 1996 +%C.G. van der laan, cgl@rc.service.rig.nl +\input blue.tex \loadtocmacros %\tolerance500\hbadness=499\hfuzz=5pt +\everyverbatim{\emc} + +\bluetitle Paradigms: Loops + +\blueissue \maps{96}2 + +\bluepictures\flowchartlooppic\pythpic + +%And to test van der Goot's variant it is supplied here +\def\loop#1\repeat{\def\body{#1}\doloop} +\def\doloop{\body\else\poolod\fi\doloop} +\def\poolod#1\doloop{\fi} +\beginscript + +\bluehead BLUe's Design VII + +Hi folks. +When you like plain's \cs{loop}-s so much as I do then this is for you. +Hang on! +\DeK's loop implements the flow, \TB{} \on219{} + +\begindemo +\def\loop#1\repeat{% + \def\body{#1}\iterate} +\def\iterate{\body + \let\next\iterate + \else\let\next\relax + \fi\next} +!yields +\flowchartlooppic +\enddemo + +with as pseudosyntax for the tags + +\cs{loop}$\langle pretst\rangle$\cs{if...}% +$\langle posttst\rangle$\cs{repeat}. + +Special cases result when either +$\langle pretst\rangle$, or +$\langle posttst\rangle$ is empty. +The former is equivalent to for example +PASCAL's {\bf while} \dots {\bf do} \dots, and the latter to +{\bf repeat}\dots {\bf until}. +From this I conclude that all those \cs{while} casu quo \cs{repeat} flavors +are not needed. +Syntactic sugar? Yes, IMHO, with all respect. + +In practice we all need repetitions either via a loop or +via tail recursion, which by the way are equivalent. +The loop notation is simpler to use than tail recursion, I guess. + +\bluehead Van der Goot's loop + +Van der Goot implemented the loop construction as a straight tail recursion. +An eye-opener! I have simplified it into the following.\ftn{The unusual in the coding + is the infinite loop. I have to unlearn much. In the old days of ALGOL \on60{} + I was taught to avoid side-effects and infinite loops of course. + With the expression language ALGOL \on68{} all storing was a side-effect. + Now with the interpretive languages it is beneficial to think in infinite loops.} + +\beginverbatim +\def\Loop#1\Pool{#1\Loop#1\Pool} +\def\Break#1\Pool{} +%a trivial example of use +\count0=10 +\Loop a \advance\count0 by-1 + \ifnum\count0=0 \expandafter\Break\fi +\Pool +\end +!endverbatim + +For more details see his Midnight suite, |loop.doc| and |loop.tex|.\ftn{Available + on the \TeX-Alive TUG CD.} + +Remark. Either \cs{expandafter} is needed or the \cs{Break} should take +\cs{fi} as replacement text. +The above with \cs{expandafter} is convenient with nesting of loops. + +\bluehead Loops in markup + +I used a loop in the markup for turtle graphics, especially for the +stochastic Sierpi\'nski carpets\Dash to throw the dice repeatedly\Dash +and for a spiral. In the markup for the spiral below +\cs{E}, \dots \cs{N} mean draw in the directions east, \dots north. + +\blueexample Spiral + +$$\vbox to3cm{\vss + \hsize0pt \offinterlineskip + \unitlength.5ex \y0pt \x0pt + \loop\N{\the\k}\advance\k+1 + \W{\the\k}\advance\k+1 + \S{\the\k}\advance\k+1 + \E{\the\k}\advance\k+1 + \ifnum\k<30 \repeat +\vss}$$ + +\thisverbatim{\unmc} +\beginverbatim +$$\vbox to3cm{\vss + \hsize0pt \offinterlineskip + \unitlength.5ex \y0pt \x0pt + \loop\N{\the\k}\advance\k+1 + \W{\the\k}\advance\k+1 + \S{\the\k}\advance\k+1 + \E{\the\k}\advance\k+1 + \ifnum\k<30 \repeat +\vss}$$ +!endverbatim + +Remark. One can also start at a corner. However, for reuse of these kinds of pictures +I consider it more convenient to start at the center of symmetry. + +Most of the time I use the tail recursion via my FIFO or (binary) +tree macros. +My favorite FIFO example is the outline exercise +\TB{} ex{\oldstyle11}.{\oldstyle5}. +I solved this via nested FIFO + processing +\item{-} words via \cs{fifow}, and +\item{-} characters via \cs{fifo}. +\smallbreak + +\blueexample Outlines + +\beginverbatim +\fifow Tough exercise \wofif \unskip. +%with +\def\fifow#1 {\ifx\wofif#1\wofif\fi + \processw{#1}\fifow} +\def\processw#1{\fifo#1 \ofif\ } +\def\process#1{\boxit#1} +\def\boxit#1{\setbox0=\hbox{#1}% + \hbox{\lower\dp0\vbox{\hrule + \hbox{\vrule\phantom#1\vrule}% + \hrule}}} +!endverbatim +\def\fifow#1 {\ifx\wofif#1\wofif\fi + \processw{#1}\fifow} +\def\processw#1{\fifo#1\ofif\ } +\def\process#1{\boxit#1} +\def\boxit#1{\setbox0=\hbox{#1}% + \hbox{\lower\dp0\vbox{\hrule + \hbox{\vrule\phantom#1\vrule}% + \hrule}}} +\qquad\qquad\qquad +\fifow Tough exercise \wofif \unskip. + +Another nice example is writing lines verbatim to a file, that is manmac's +\cs{copytoblankline} recast in FIFO terms.\ftn{See FIFO and LIFO sing the BLUes.} + +\blueexample Sorting citation lists + +Suppose, we have +\beginverbatim +\def\lst{\\\ia\\\ib\\\ic} +\def\ia{314}\def\ib{27}\def\ic{1} +!endverbatim +{%scope for \\ +\newif\ifnoe +\def\ia{314}\def\ib{27}\def\ic{1} +\def\lst{\\\ia\\\ib\\\ic} +\def\\{ } \immediate\write16{Numbers unsorted \lst} +% +\def\dblbsl#1{\ifnum#1<\min\let\min=#1\fi} +% +then sorting \cs{lst} yields +\loop\ifx\empty\lst\noefalse + \else\noetrue\fi +\ifnoe\def\\{\let\\=\dblbsl\let\min=} + \lst%find true minimum + \min%typeset minimum + {\def\\##1{\ifx\min##1\else + \noexpand\\\noexpand##1\fi}% + \xdef\lst{\lst}}%delete minimum +\repeat. +}%end scope for \\ + +The above is obtained as follows. + +\thisverbatim{\unmc} +\beginverbatim +\def\dblbsl#1{\ifnum#1<\min\let\min=#1\fi} +% +\Loop\ifx\empty\lst\expandafter\break\fi + \def\\{\let\\=\dblbsl\let\min=} %space + \lst%find minimum + \min%typeset minimum + {\def\\#1{\ifx#1\min \else\nx\\% + \nx#1\fi}\xdef\lst{\lst}}% +\Pool +%with auxiliaries +\def\Loop#1\Pool{#1\Loop#1\Pool} +\def\break#1\Pool{} +!endverbatim + +The coding implements the looping of the basic steps +\item- find minimum (via \cs{lst}, + and suitable definition of \DeK's active list separator |\\|) +\item- typeset minimum (via \cs{min}) +\item- delete minimum from the list (via another appropriate + definition of the list element tag). +\smallbreak + +Remarks. +\cs{dblbsl} is mnemonics for double backslash. +The deletion of elements from the list works with \cs{ifx}. +The variant with \cs{ifnum} does not work as such (!) +because a \cs{relax} is inserted by \TeX.\ftn +{The \cs{relax} can be suppressed by inserting an unexpandable token + like \cs{noexpand} \cs{empty}. Courtesy Bernd Raichle.} + +The problem occurred in sorting citation lists of bibliography references +which are specified by their symbolic names.\ftn +{In BLUe's bibliography I have explained how to circumvent + the sorting of citation lists of references.} + +\blueexample Reading a file line by line + +\beginverbatim +\Loop\ifeof\readfile\Break\fi + \read\readfile to\inputline + <process \inputline> +\Pool +%with auxiliary +\def\Break#1\Pool{\fi} +!endverbatim + +This use occurred in the Convertor Assistant BLUe-2-\LaTeX, +well \dots it is the main loop. + +\bluesubhead Relevancy + +From my experience as exemplified above, +I conclude that loops are mainly of interest for macro writers and +not so much for the casual \AllTeX{} user. + +\bluehead Macro writers attention + +Knuth's loop does not allow for the use of \cs{else} in the exit code +because it is already part of the macro \cs{loop}. +Kabelschacht \on1987\Dash and Spivak \on1989\Dash needed the use of \cs{else}. + +\blueexample Kabelschacht's loop + +Kabelschacht removed the \cs{else} from the loop code as follows. + +\beginverbatim +\def\loop#1\repeat{\def\iterate{#1\ea + \iterate\fi}\iterate} +%a trivial example of use +\count0=10 +\loop\advance\count0 by-1 + \ifnum\count0=0 + \else do what has to be done +\repeat +!endverbatim + +Remarks. +The exit is via the then-branche in contrast with Knuth's loop. +Suppressed are some efficiency aspects with respect to storage. +Kabelschacht's claim that his +loop is a {\em generalization\/} of plain's loop must be seen +in the light of not being restricted to quit a loop via the else-branch. + +The reason, I can think of, +for introducing another loop macro, while the most +general form has been implemented already, +is the existence of commands like \cs{ifvoid}, and \cs{ifeof}, and +the absence of their negatives \cs{ifnonvoid}, respectively \cs{ifnoneof}. +In those cases we like to continue the loop via the \cs{else} branch. +For the latter case this means to continue +the loop when the file is {\em not\/} ended. +This can be obtained via modifying the loop \`a la Kabelschacht or more elegantly +via van der Goot's macro. + +Another approach is to use a \cs{newif} parameter, +better known as `boolean' or `logical' in other programming languages, +together with Knuth's loop. +A \cs{newif} parameter, \cs{ifneof}, +can be used to test for an end of file or casu quo, an end of a list. + +\beginverbatim +\ifx\lst\empty\neofalse\else\noetrue\fi\ifneo +!endverbatim + +\blueexample Reading a list via Knuth's loop + +\beginverbatim +\newif\ifneo +\def\lst{a b c}\neotrue +\loop\ifx\lst\empty\neofalse\fi + \ifneo \def\lst{} +\repeat +!endverbatim + +Related to the above coding of the logical $\neg$, are the codings +of the logical and, $\wedge$, and or, $\vee$, via + +$$\vbox{\offinterlineskip\halign{#\enspace\hfil\vrule&\enspace#\hfil\strut\cr +\strut Functional code&\TeX\ coding\cr +\noalign{\hrule} +$\neg$|\if...| + &|\if...\notfalse\else|\cr + &|\nottrue\fi\ifnot|\cr +|\if...|$\wedge$|\if...| + &|\andtrue\if...\if...| \cr + &|\else\andfalse| \cr + &|\else\andfalse\fi\fi| \cr + &|\ifand| \cr +|\if...|$\vee$|\if...| + &|\ortrue| \cr + &|\if...\else\if...\else| \cr + &|\orfalse\fi\fi \ifor| \cr + &|%alternative| \cr + &|\orfalse| \cr + &|\if...\ortrue\fi| \cr + &|\if...\ortrue\fi| \cr + &|\ifor| \cr +}}$$ +with the \cs{newif}-s: \cs{ifnot}, \cs{ifand}, and \cs{ifor}.\ftn +{By the way, now I have you on the line about Booleans, + did you ever understand the macro \cs{newif}? + If not let me tell you that \cs{global} |\<name>true| and its false + counterpart make sense, but \cs{global} \cs{newif} |\if<name>| does not. + \TeX{} {\em does not\/} complain but the `allocation' remains non-global. + A bit inconsistent with the global allocations of other data like + counters\smiley.} + + +\bluehead Nesting of loops + +My favorite example of nesting of loops is the bubble sort.\ftn{\cs{cmp} + stands for comparison. \cs{xch} stands for exchange. + For a pseudocode see Paradigms: Sorting.} + +\thisverbatim{\unmc} +\beginverbatim +\def\bubblesort{%Data in defs \1, \2,...\<n>. +{\loop\ifnum1<\n{\k\n + \loop\ifnum1<\k \advance\k-1 + \cmp{\deref\k}{\deref\n}% + \ifnum1=\status\xch\k\n\fi + \repeat}\advance\n-1 + \repeat}}%end \bubblesort +%with auxiliary +\def\deref#1{\csname\the#1\endcsname} +\let\cmp\cmpn %from blue.tex or provide +%\def\cmp#1#2{%Yields +% status=0, 1, 2 for =, >, < +%{...} +!endverbatim + +\bluesubhead Inconsistency pitfall + +I experience the non-expansion of a counter variable\Dash + or the non-dereference of it as you wish\Dash +within a \cs{csname} counter-intuitive. +The counter must be preceded by \cs{the}, see \cs{deref}. +I understand the difference with the situation +that a value might be assigned but in this constructs this is out of order. + +Another nesting of `loops' is in the earlier mentioned linear sorting fo citation lists, +where the inner loop is the \cs{xdef}. + +\bluesubhead Braces around inner loops are mandatory + +Pittman argued that there is a need for other loop codings. +\beginquote +`Recently, I encountered an application that required a set of nested loops +and local-only assignments and definitions. +\TeX's \cs{loop} \dots \cs{repeat} con\-struc\-tion proved to be +inadequate because of the requirement +that the inner loop be grouped.' +\endquote +In `Syntactic Sugar' I have shown that his problem can be solved +from a table point of view.\ftn{It is also in the tables chapter of PWT.} + +However, Pittman was definitely right with respect to bracing the inner loop, +because of the parameter separator \cs{repeat}. +If braces are omitted, the first \cs{repeat} is mistaken for the outer one, +with the result that the text of the outer loop will +{\em not\/} become the first \cs{body}. +The good way is, to make the inner \cs{repeat} invisible for the +outer loop level, by enclosing the inner loop in braces. + +With non-explicit nesting\Dash for example the inner loop is the +replacement text of a macro\Dash we still need scope braces, +because otherwise the \cs{body} of the outer loop +will be silently redefined by the body of the inner loop. + +\bluesubhead Dialogue with \TeX + +Nestings of loops occur when in dialogue with \TeX{} only certain answers +are allowed. + +\blueexample Checking user input + +\beginverbatim +%Insist on allowed answers only +\def\iw{\immediate\write0} +\def\readyesornotoanswer{{% + \def\yes{yes}\def\no{no} + \Loop\iw{Please provide yes or no:} + \read-1 to\answer + \ifx\answer\yes\ea\Break\fi + \ifx\answer\no \ea\Break\fi + \Pool\xdef\answer{\answer}}} +% +\let\yes\Break\let\no\relax +\endlinechar-1 %TB20.18 +\Loop\message{Are you happy? } + \readyesornotoanswer + \ea\csname\answer\endcsname + \iw{Too bad, I insist...} +\Pool +\bye +!endverbatim +Remarks. The \cs{xdef} makes the answer globally available. +En-passant a little `switch functionality in \TeX' is realized via \cs{csname}. + +\bluehead Hidden counter + +I like a hidden counter very much.\ftn{As in ALGOL \on68{}, METAFONT/MetaPost, or PostScript.} +In \TeX{} we don't have a garbage collector and therefore +there is no gains in storage. However, to alleviate +the user from the details of the allocation of +storage of the counter I provided the following.\ftn{Bernd Raichle has implemented local + storage allocation macros. Although I can see the benefits of his robust approach especially + together with push-the-button packages like \LaTeX, I refrained from it, because + for my applications I know that the bounds\Dash only {\oldstyle 256} locations are + available\Dash are not severe. Moreover, intelligibility is hampered, and I like to add + just a little to \TeX, as little as possible.} +\beginverbatim +\def\preloop{%To create loopcnt, a + %local loopcounter + \bgroup \advance\count10 by 1 + \countdef\loopcnt=\count10 + %Symbolic name + \loopcnt=1 %(default) + }%end \preloop +\def\postloop{\loopcnt=0 %Restore + \egroup}%end \postloop +!endverbatim + +I used the above in the coding of the Tower of Hanoi game. +The paradigm in there is that it is used together with \cs{aftergroup}\Dash shortcut \cs{ag}\Dash +to create {\em dynamically\/} a data structure, i.e.\ the tower of which the size is specified +by the user. +\thisverbatim{\unmc} +\beginverbatim +% \def\I{\disksep\i\disksep\ii +% \disksep\iii...\disksep\`n'} +%next to the defs for \i,\ii,...\`n'. +\preloop\ag\def\ag\I\ag{% + \loop + \ea\xdef\csname\romannumeral\loopcnt + \endcsname{\the\loopcnt} + \ag\disksep\ea\ag\csname + \romannumeral\loopcnt\endcsname + \ifnum\loopcnt<\n + \advance\loopcnt by1 + \repeat \ag} +\postloop +!endverbatim +Note that \cs{disksep} is \DeK's active list separator, which I use abundantly in macro writing. +I call it the list element tag, because it is also needed before the first element.\ftn{I use + them also with more than one argument, + especially in selective loading of entries from a database. + The above construction of a list is also used in my test example for sorting random + words. Each character is obtained randomly and placed after the loop to form words of + random length. Neat.} + +\bluehead Flip-flop traversal + +In programming it occurs that loops are traversed with the first +traversal different from the others. In practice I needed\Dash + well, it was more elegant\Dash +in a play to handle only one player in each traversal but toggle the players: +player, opponent, player, opponent, etc. +\def\data{+\cs o\cs+\rs \cs o\cs+\rs o\cs \cs +} +$$\ruled\btable\data$$ +The play at hand was tic-tac-toe, and the prototype implementation +which demonstrates the toggling reads as follows. +\beginverbatim +\def\play{\initialize +\loop\showboard + \ifx\mark\markplayer\let\mark\markopponent + \else\let\mark\markplayer + \fi\iw{Supply index for \mark:} + \read0to\index + \ea\xdef\csname\index\endcsname{\mark} +\ifnum\index>0 +\repeat} +\def\markplayer{+}\def\markopponent{o} +\endlinechar-1 %TB20.18 +\play \bye +%with auxiliaries +%(\iw is shortcut for \immediate\write0) +\def\showboard{\iw{\1\2\3}...\iw{\7\8\9}} +\def\initialize{\def\1{-}...\def\9{-}} +!endverbatim + +In a general sense I need often in a repetitive situation to do something different +at the beginning or at the end. Examples are my implementation of +\item-\cs{nitem}\Dash +numbered item and ilks +\item-to suppress the first headline of a chapter, and +\item-the |\\| in the linear sorting at the beginning. + +\bluehead Trees + +Another intriguing repetitive or tail-recursive situation occurs when +coding trees in \TeX.\ftn{Well also in METAFONT and PostScript.} +For fun\Dash though the undertone is serious\Dash +I have added a tree from the Pythagorean family, borrowed from |pic.dat|. + +$$\thispicture{\level6 \ydim{70}}\pythpic$$ + +The essence of the implementation in \TeX{} of the repetition is shown below. +For the full coding consult |pic.dat|. +\beginverbatim +\let\drawsq\ldrawsq %left drawing square +\def\pyth{\ifnum\level=1 \htyp\fi + \drawsq\advance\level-1 + \multiply\kk18\divide\kk25 + {\turn7\x\leftx \y\lefty + \let\drawsq\ldrawsq\pyth}% + \turn1\x\rightx \y\righty + \let\drawsq\rdrawsq\pyth} +\def\htyp##1\pyth{\fi} +!endverbatim +\cs{turn} turns over a multiple of {\oldstyle45}$^\circ$. +(\cs{leftx}, \cs{lefty}) and (\cs{rightx}, \cs{righty}) +contain the coordinates to start drawing a left square and +a right square, respectively. + +\bluehead Conclusion + +Many slightly different codings for a loop are around. +This contributes to the reasons why understanding macro collections is so hard. +It is so easy to come up with a variant, inhibiting intelligibility and trustworthyness. + +I consider van der Goot's loop the simplest and most general, +though Knuth's loop is usually sufficient for me. + +\bluehead Looking back + +It is fun to flashback at for example Child's \TeX{} Selftest, \on1989, +and to conclude that much of the perceived important \TeX ing nitty-gritties +is not needed\Dash not to mention all those essential issues which are lacking\Dash +when developing something like BLUe's format system. + +This is precisely the reason why I pay so much attention to flashbacks, +to summarize the paradigms, to bring to light what is needed in practical work, +in such a way that the essence can be reused easily. +Towards a discipline of \TeX ing. +My case rest. +\medbreak +Have fun, and all the best +\makesignature +\pasteuptoc +\endscript
\ No newline at end of file diff --git a/info/laan/paradigm/paradigm.opt b/info/laan/paradigm/paradigm.opt new file mode 100644 index 0000000000..e44d9d414f --- /dev/null +++ b/info/laan/paradigm/paradigm.opt @@ -0,0 +1,463 @@ +%November 1994, March 1996. +%Paradigm: Parameterization---Options +%C.G. van der laan, cgl@rc.service.rug.nl +\input blue.tex \loadtocmacros +\tolerance500\hbadness=499\hfuzz=9pt +\parindent=1pc + +\everyverbatim{\emc} + +\bluetitle Paradigms: Parameterization I + +\bluesubtitle Options + +\blueissue \maps{95}1 + +\beginscript + +\bluehead BLUe's Design IV + +Hi folks. Much parameterization in \TeX{} has already been +taken care of via the various modes of \TeX, that is by the states +script elements can be processed in. +How ingenious and handy that may be, it is not sufficient. + +Knuth also provided switching commands for fonts, formats and +language.\ftn{For example \cs{eightpoint}, \cs{report} (well in + \bluetex), + and \cs{language1}. Similar to the font switching macros I used + \cs{english}, \cs{dutch} and the like, to activate all + language dependent parameters for typesetting bridge + with the right words. Early \LaTeX{} had several + words `hardwired' in the code in English. + The latter was the reason for Johannes Braams to give birth + to Babel, to parameterize and concentrate language specific + issues, and to allow easy switching + from one language to another.} + +Then there are the various parameters\Dash integer, dimen, +glue, muglue\Dash as listed in \TB{} \on272\dash\on274. + +Markup tags can be parameterized via (at most \on9) arguments. +However, there exist also for this purpose (global) token variables\Dash +the |\every<tag>|s\Dash with \cs{output} and \cs{errhelp} as special cases. + +To remind the reader of Knuth's \cs{every}s, I have +enumerated them below. +\beginverbatim +\everypar +\everymath, and \everydisplay +\everyhbox, and \everyvbox +\everyjob +\everycr +!endverbatim +For using them, it is important to know where the token variables are +precisely inserted.\ftn{For example, in a setbox the right-hand + side of \cs{afterassignment} + is inserted after the opening brace of the box and + followed by the tokens of |\everyh/vbox|.} + +For my taste Knuth's |\every<tag>|s +have not been appreciated as they should have been, the more so +when extended by the analogons |\this<tag>|s.\ftn{This functionality of |\this<tag>| + can be obtained via the use of |\every<tag>| within a group. However, readability + of the marked up script is served by the use of |\this<tag>|-s.} +This in contrast with the abundant use of arguments, +especially the so-called optional arguments. + +\bluesubhead Why? + +The purpose of this note is to show that +optional arguments have led to cumbersome \TeX{} coding, while +the same functionality can be attained more easily via the use of +|\this<tag>|s. +In general one can devote a monograph to markup language +parameterization, I guess. + +\bluehead Examples of use of \cs{every}s + +I inspected \TB{} for examples of use by Knuth himself. + +\bluesubhead \cs{everypar} + +An example of use is given in Appendix~D \on381, about +verbatim listings with line numbers. In \bluetex{} I enriched this +approach by allowing selective line numbering. +I mean by the latter that I can number parts, +starting with any suitable number. +This is handy when macro sets are accompanied by a table of contents +(as should always be the case), which contains references to +the line numbers of the macro set. +From \bluetex{} the following. + +\thisverbatim{\catcode`\*=0 + \catcode`\!=12 } +\beginverbatim +\def\setupverbatim{\makeactive\`% + \let\!=!\makeescape\!%Knuth&Levy + \def\par{\leavevmode\endgraf}%381 + \obeylines \uncatcodespecials + \obeyspaces} +% +\def\numvrb{\vrblin0 + \everypar{\advance\vrblin1 + \llap{\sevenrm\the\vrblin\quad}}} +% +\def\nonum{\everypar={}} +*endverbatim + +Note that the line numbers can be adjusted via modifying the counter \cs{vrblin}. + +Another example is provided on \on393, in Paragraph maneuvers. +It is about automatically inserting \cs{hangindent} and \cs{hangafter}. + +In manmac it is used in +\bitem \cs{endchapter}, as |\everypar{\sl}|, to set the quotations slanted. +\bitem \cs{beginlines}, as |\everypar{\strut}|, to insert a strut. +\smallbreak + +\bluesubsubhead A pitfall + +What is the unexpected result of + +\beginverbatim +\par%or other ending of a paragraph +{\bf New paragraph} blah blah +!endverbatim + +with |\everypar{\hang}| active\ftn{Courtesy Alan Reese}? +And why?\ftn{Courtesy Jeremy Henty.} +Note that \cs{bf} is only there to make the pitfall look realistic. + +Answer. +Without braces the text comes out as a block. With the braces at the +beginning there is no effect of the automatically inserted \cs{hang}. +The explanantion reads as follows. +When processing ordinary text, \TeX{} does not enter horizontal mode +until it encounters a letter. In the troublesome paragraph the first +letter is inside a group. When the group ends all local assignments +are undone, and the effect of the \cs{hang} instruction\Dash +the contents of \cs{everypar} is inserted within the group\Dash +is forgotten. +A solution is to precede the group by \cs{leavevmode}, +because the \cs{everypar} will be executed before the group then. + +\bluesubhead \cs{everydisplay} + +This is used in the solution of exercise \on19.\on4 to obtain non-centered displays. + +\beginverbatim +\def\leftdisplay#1$${\leftline + {\indent$\displaystyle{#1}$}$$} +\everydisplay{\leftdisplay} +!endverbatim + +This is refined in Appendix~D \on376, to allow for equation numbers as well. +In `Math into BLUes' I have worked on the Appendix~D version, and also indicated how +a single formula can be non-centered. +This is also included in \bluetex. + +\bluesubhead \cs{everyjob} + +The example is exercise \on24.\on5. +In Salomon's courseware an example is given to open automatically +files at the beginning of each \TeX{} job. + +\bluesubhead \cs{everycr} + +A practical example is given in \TB~\on140, to inhibit a page break. + +\beginverbatim +$$\everycr{\noalign{\penalty10000}} +\halign{\indent#\hfil\qquad&...\cr +If a letter is in style&then...\cr +\noalign{\vskip 2pt} +$D,D',T,T'$&text size&\cr +$S,S'$&script size&\sevenrm\cr +$\SS,\SS'$&scriptscript size& + \fiverm\cr}$$ +!endverbatim + +It is also used in plain, Appendix~B \on362, in the macro \cs{displ@y}. + +In \TB{} file I did not find examples of use of +\cs{everymath}, +\cs{everyhbox}, and +\cs{everyvbox}. + +In \bluetex{} I introduced \cs{everyscript}. +My use is to allow for more than one script to be processed, +via |\everyscript{\notlastscript}|. +I also introduced \cs{everyverbatim}, and some more. + +\head{Options via |\this<tag>|s}%Needed processing on the fly, so no \bluehead +First an example. I used it for the first time with verbatims. + +\thisverbatim{\emc\catcode`\*=0 + \catcode`\!=12 } +\beginverbatim +\thisverbatim{\emc}%enable metacode +\beginverbatim +\def\<tag>{... + ...} +!endverbatim%! is the escape character +*endverbatim + +Not only can metalinguistic variables be handled nicely +within verbatims, but also the changing of catcodes and +file verbatim inclusion go easy with the use of these token variables. + +The verbatim suite of \bluetex{} can be used with \AllTeX, because +the mechanism is simple, and not in conflict. +File verbatim inclusion goes as follows\ftn +{It is true, that I need one escape character.} + +\thisverbatim{\emc\catcode`\*=0 + \catcode`\!=12 } +\beginverbatim +\thisverbatim{\input <file>} +\beginverbatim +Some text after the file. +!endverbatim +*endverbatim + +\bluehead The parsing of options + +Eijkhout in `\TeX{} by Topic' gives a template for coping with +optional parameters.\ftn{I adapted the macros a little.} +The work is done by \cs{OptArgCom}, with as optional +argument either the default or the one supplied. +The markup starts with \cs{Com} followed either +by a left bracket\Dash a convention to start an option\Dash +or the argument. + +\thisverbatim{\emc} +\beginverbatim +\def\Com{\futurelet\testchar\MaybeOptArgCom} +\def\MaybeOptArgCom{\ifx[\testchar + \expandafter\OptArgCom\else + \expandafter\NoOptArgCom\fi} +\def\OptArgCom[#1]#2{...} +\def\NoOptArgCom{\OptArgCom[<default>]} +%with use +\Com[...]{...}!qquad!hbox!bgroup or!egroup!qquad\Com{...} +!endverbatim + +With the concept of \cs{thisCom} the coding template and +markup might look like the following. + +\thisverbatim{\emc} +\beginverbatim +\thisCom{<default>} +\def\Com#1{...\the\thisCom... + \thisCom{<default>}}%restore default +%with use +\thisCom{...}%Provides option(s), if any +\Com{...} +!endverbatim + +Explanation. +The contents of the token variable +is available to the macro. It can be virtually anything. +At the end of the macro the default is restored. +IMHO, with all respect, the latter approach is simpler +than the parsing of optional arguments. + +\bluehead Head example + +\bluetex{} allows as markup + +\beginverbatim +\beginhead...\endhead!qquad !hbox!bgroup or!egroup!qquad\head{ ...} +!endverbatim + +And what about the coding? +In the `Paradigms: Headache?' I have shown the \bluetex{} coding + +\beginverbatim +\def\beginhead{\the\prehead\bgroup\headfont} +\def\endhead{\egroup\the\posthead} +%with auxiliaries +\prehead{\vskip0pt plus2ex + \penalty-250\vskip0pt plus1ex + \bigskip\noindent} +\posthead{\medskip\nobreak + \noindent\ignorewhitespace} +%and minimal variant +\def\head#{\beginhead\bgroup + \aftergroup\endhead + \afterassignment\ignorespaces + \let\dummy=} +!endverbatim + +Note that in \bluetex, I also introduced the token variables +|\pre<tag>|, and |\post<tag>|, to parameterize +the placement within context. The advantage of doing so is +that these tags have only one function and can therefore +be customized easily.\ftn +{A white lie. In \cs{report} format I also reused the headtitle + in the ToC, ToE, and in the running header.} + +\bluesubhead Relation with tugboat.sty + +Submissions for TUGboat need as markup for headings the following. + +\beginverbatim +\head...\endhead!qquad !hbox!bgroup or!egroup!qquad\head*...* +!endverbatim + +where in the short variant the spaces around the *s are neglected. +TUGboat provides as toplevel coding +\beginverbatim +\def\head{\begingroup + \def\CurrentTag{head}% + \@allowindentfalse + \@defaultoptions + \@savingargumenttrue + \def\\{\break}% + \@checkoptions} +\def\endhead{\endgraf + \ifcase\headlevel\or + \@domainhead \or + \@dosubhead \or + \@dosubsubhead\fi + \endgroup\@next} +!endverbatim + +What can be seen from the above is that both codings are based +on two-part macros. The coding for TUGboat uses general +mechanisms not restricted to \cs{head}, +and is therefore difficult to understand.\ftn +{An example is finding the answer to the question whether the `argument' is processed + on the fly. \cs{@savingstrue} suggests that it is stored. Try to confirm + the assumption in the code, and you will agree that even reading + the code is difficult, let alone to adapt it. To borrow + macros for use in other collections is also inhibited, as Wietse + Dol communicated to me. Of course, it is a good thing to go for + general mechanisms in macro writing. But the right balance between + metacodes and single shot coding is the royal road, IMHO, with all respect.} +Especially, when one realizes that next to the parsing of options, +the minimal variant is also handled. (The parsing looks for *s). +Clever, very clever. +But the functionality can be attained simpler, with the extra bonus of +easy maintenance and customization, IMHO, with all respect. + +\bluesubhead Relation with ams.ppt + +Submissions to AMS (in ams.ppt) need as markup for headings + +\beginverbatim +\head...\endhead +!endverbatim + +The coding reads + +\beginverbatim +\outer\def\head#1\endhead{% + \add@missing\endroster + ... + \add@missing\endproclaim + \penaltyandskip@{-200}\aboveheadskip + {\headfont@\raggedcenter@ + \interlinepenalty\@M + #1\endgraf}\headmark{#1}% + \nobreak\vskip\belowheadskip} +% +\let\headmark\eat@ +!endverbatim + +The \cs{end@missing} checks whether the head occurs within the environment. +\cs{eat@} gobbles its argument. +There is no \cs{nofrillscheck}. This is done, however, in \cs{subhead}. +The coding of the check is difficult to understand, not in the least because it +allows for options.\ftn +{I was told that AMS considers to abandon \cs{nofrills} altogether.} + +\bluesubhead \LaTeX's \cs{section} + +The style defines \cs{section} as an invocation to \cs{@startsection}. +From latex.doc the following. + +\beginverbatim +%\@startsection{name}{level}{indent} +% {beforeskip}{afterskip}{style} +% optional * [altheading]% +% {heading} +%Generic command to start a section. +%Name : e.g. subsection +%Level : a number, denoting depth of +% section e.g., chapter=1, +% section=2 etc. +%Indent: Indentation of heading from +% left margin +%Beforeskip: Absulute value is skip to +% leave above the heading. +% If negative, then paragraph +% indent of text following +% heading is suppressed. +%Afterskip : if positive then skip to leave +% below heading, else negative of +% skip to right +% of run-in heading. +%Style : commands to set style. +%If * missing then increments the counter. If +%it is present, then there should be no +%[altheading] argument. Use the counter +%`secnumdepth' whose value is the highest +%section level that is to be numbered. +!endverbatim + +This is just the top of the iceberg, but generic it is for sure. +My choice would be the following. +To go first for making it as simple as possible, +and perhaps if the need is still there, +use generic coding in order to save on development and maintenance costs. + +\bluehead Knuth's options after an opening tag + +There is a beautiful example of allowing for options in manmac. +It is used in \TB~\on29. +All what follows after the opening tag \cs{begindisplay} up to the end-of-line +is taken as (optional) argument, and inserted in the +alignment display between \$\$ and \cs{halign}.\ftn +{No curly braces nor other opening and closings like [ and ]. + And when you don't need the option functionalty you won't notice. + It does not hinder or impose on you. + Minimal markup? Yes, definitely.} + +\beginverbatim +\begindisplay\hbadness10000 +\hbox spread-.666667em{The badness + of this line is 100.}& + \quad(very tight)\cr +... +\enddisplay +!endverbatim + +This example shows what Knuth had on his mind with respect to +options and explains why he did not introduce |\this<tag>|s. +The coding is a litlle more complicated but systematic. + +Can it be applied applied throughout a format? +With \cs{beginverbatim} I stumbled upon problems in +applying options to the in-line verbatim \vrt\dots\vrt. + +\bluehead Epilogue + +The paradigm is that too general, monolithic, codes are difficult +to understand and to maintain. +Borrowing macros from these collections is near to impossible. +|\this<tag>| is a simple alternative for +coping with optional arguments, and is used in \bluetex. + +Knuth suggested a solid naming convention for two-part macros: +|\begin<tag>|, |\end<tag>|, and +for the second step macro |\start<tag>|, if any. + +This naming convention has been adopted in \bluetex, +next to |\<tag>| for one-part minimal variants. + +Have fun, and all the best. +\makesignature +\pasteuptoc +\endscript
\ No newline at end of file diff --git a/info/laan/paradigm/paradigm.postscript b/info/laan/paradigm/paradigm.postscript new file mode 100644 index 0000000000..c92955bf0c --- /dev/null +++ b/info/laan/paradigm/paradigm.postscript @@ -0,0 +1,1483 @@ +%Started May 1996, C.G. van der laan, cgl@rc.service.rug.nl +%Version June 1996 +\newif\ifdraft\drafttrue +\draftfalse +\ifdraft\else\input psfig \fi +%Watch out for double ! in verbatim, especially with %!!PS +\input blue.tex \loadtocmacros\tolerance500\hbadness=499\hfuzz=5pt + \parindent=1pc\everyverbatim{\unmc} +%Needed EPS files: baker.eps, barnwindowii.eps, bentley.eps, +% eschera.eps, escherb.eps, escherknotmf.eps, +% escherknotiii.epsabr, flower.eps, +% gurariabc.eps, gurarisq.eps +% jvr.eps, linebundle.eps, malbork.eps, +% polygon.eps, polygonii.eps, prpie.eps, +% sine.eps, sinedisks.eps, seal.eps, +% textalongarc.eps, textalongspiral.eps. + +\bluetitle Paradigms: Just a little bit of PostScript + +\blueissue \maps{96}2 + +\bluepictures\metapostpic\pstexpic + +\blueabstract It is all about creating EPS\Dash with graphics\Dash + to be merged with \AllTeX{} scripts. + The emphasis is on creating raw PostScript for simple symmetrical pictures. + Asides, like + incorporating accurate graphs of math functions, + typesetting text along curved paths, or + tables set sideways have been addressed. + A poor man's mftoeps approach is touched upon: + (declarative) METAFONT into (imperative) PostScript. + +\bluekeywords Declarative program, education, EPS, Escher, graphics, + imperative code, \AllTeX, + math graphs, METAFONT, merging EPS and \AllTeX, + MetaPost, mftoeps, PostScript, + sideways tables, text along curved paths. + +\beginscript + +\bluehead BLUe's Design X + +Hi folks. +The user's guide which comes with BLUe's format system\Dash +Publishing with \TeX, PWT for short\Dash +is processed {\em completely\/} by \TeX, {\em no\/} other tools such as +\PS{} are needed.\ftn{Nobody knows what the future has in store, but for + the moment I consider it a good thing that the PWT guide can be processed + just by \TeX, well \dots with BLUe's format.} +However, of late I exercised \MF +\Dash well, eventually MetaPost with the help of Jos Winnink\Dash +for graphics to be included in \TeX{} documents, and finally embarked PostScript +straightaway to create EPS pictures. + +$$\metapostpic$$ + +\PS{} is involuntary needed to (electronically) paste up the graphics, and +as resulting file format.\ftn{For exchange the {\tt.tex} and + (hand-coded) {\tt.eps} files are much better suited + because of their conciseness. This can't be beaten, not even by + Adobe's PDF\Dash Portable Document Format.} + +If we come to think of graphics as +$$\vbox{\hbox{just doing the `right' strokes or fills}}$$ +then \PS{} provides the means for this: + lines, splines and circular arcs, +to be drawn or filled.\ftn{PostScript II also provides for colors and + processing in a network.} +I use the sidestep +$$\vbox{\hbox{\MF{} $\rightarrow $MetaPost $\rightarrow$ EPS}}$$ +for general pictures but also for obtaining the right (control) points +explicitly from a decalarative specification in \MF, +as shown by Escher's knot at the end.\ftn{Another way + for arriving at the EPS code is + to use Jackowski's |mftoeps| package or to use MetaPost.} + +$$\pstexpic$$ + +With respect to graphics \PS{} can be seen as a {\em little\/} language +in the UNIX tradition.\ftn{See Bentley's Little languages in + `More programming pearls\Dash\-Confes\-sions from a coder.' Addison-Wesley.} +A little bit of \PS{} adheres the 80\%--20\% adage: +80\% of the effects (or more) with +20\% of the energy (or less). + +One can with a little knowledge of \PS{} code graphics immediately +and {\em completely\/} in \PS. +The more so because of the ubiquitous public domain GhostScript +previewers to verify the result, +next to of course the \PS{} laser printers. + +Furthermore, text is just a special case of graphics, and merging +just a little bit of text\Dash malenki Russians would say\Dash +with the graphics goes equally simple at first glance. + +And to end the lovesong the inclusion of accurate graphs of mathematical functions +goes well via coding these in \PS{} and including these as figures. +(Of course Hobby's graph extension could be used as well, or other advanced + graphics packages.) +This is illustrated by a graph of the sine function to convey the idea. + +PStricks is about {\em interfacing}. Not assuming knowledge of \PS. +This note discusses mainly {\em merging}. +Is about extending your \TeX pertise +with just a little\Dash tsjut-tsjut Russians would say\Dash +knowledge of \PS{} rewarded by high returns. + +Below I'll summarize what is needed from \PS, and illustrate the use of it +with a few examples, introducing en route the operators we need given the example. + +\bluehead PostScript + +\bluesubhead Processing + +\PS{} comes with a user's guide (cookbook) and reference manual, +the so-called blue and red books in the Adobe \PS{} series. +For processing \PS{} an interpreter is needed, such as +a \PS{} laser printer or a GhostScript previewer. +For inclusion in \AllTeX{} I use the psfig macros.\ftn{Courtesy Trevor J. Darrell.} +Goossens in his PostScript and \AllTeX, \maps{92}1, nicely details about +inclusion of PostScript.\ftn{See also the \LaTeX{} Companion.} + +As with PDF I consider the post-processing capability {\em independently\/} from +the tool which created the \PS{} source, very powerful and flexible. + +\bluesubhead Subset 0 from the language + +\PS{} is stack-oriented. +This means that operations are prescribed in polish-reverse notation, +also known as prefix notation, +similar to the HP pocket calculators. +Addition\Dash use of operator |add|\Dash for example is notated as follows. + +\beginverbatim +2 3 add%yields 5 on the stack, 2 3 consumed +!endverbatim + +\PS{} is artificially structured via structure information in +comments, double \%-ed comments. Programs which obey the Adobe +structure are called conforming and this is usually needed for inclusion +within \AllTeX, especially the BoundingBox line is required. + +\blueexample Conforming EPS structure + +\beginverbatim +%!!PS EPS +%%Title: <name> +%%Creator: <name> +%%CreationData: <date> +%%BoundingBox: <llx> <lly> <urx> <ury> +%%DocumentFonts: (atend) +%%EndComments +<prolog> +%%EndProlog +%%Page: 0 1 +<page 1> +%%Page: 1 2 +<page 2> +%%Trailer +<...> +%%DocumentFonts: Times-Roman ... +%%Pages: 3 +%%EOF +!endverbatim + +Creating and drawing paths is done by separate operators. +For creating paths operations like +|moveto| are provided while drawing goes via |stroke|. + +\beginverbatim +0 0 moveto 0 10 lineto%create path +stroke%draw a v-line of 10pt height +!endverbatim + +Variables\Dash names to be associated with their values\Dash +are handled via the so-called dictionaries. +The functionality can also be obtained via procedures. + +\beginverbatim +/size {10} def +!endverbatim + +The so-called literal name is preceded by a slash to distinguish the declaration +from its invoke. The invoke is done by just the name, also called executable name. +The procedure text is surrounded by curly braces. +Parameters are absent too. The (operand) stack is used. + +For graphics we have a CurrentTransformMatrix\Dash CTM\Dash which maps the +user space on the device space, the printer or screen. +Equally powerful is the concept of encapsulating graphics via +|gsave| and |grestore|, that is the graphics state is local\Dash encapsulated\Dash +after |gsave| until |grestore|. + +Next to the CTM \PS{} maintains the currentpoint and currentpath. + +Batagelj, \maps{95}1\Dash Combining \TeX{} and \PS\Dash +provides an in a nutshell overview.\ftn + {Nice are the hints to remove repeated parts from files which are + generated by CorelDRAW and Mathematica, in order to reduce the size + of the automatically generated and to be included files. + (The idea is to remove duplicate `dictionaries' which are included with each result.) + The example of how to include graphs of math functions in a document is + {\em very\/} useful. + However, with respect to his first picture I would prefer to use the + inherent symmetry in the data as opposed to providing all the data.} +Another introduction is in Fokker en van Oostrum's `Plaatjes in een tekst,' +\maps{94}2, next to a survey of drawing software. +\bluesubhead Summary of (graphics) commands + +The following snapshot is borrowed from Gurari, well \dots a little modified.\ftn{% + Gurari E.M (1994): + \TeX{} \& \LaTeX\Dash Drawing \& Literate Programming. + McGraw Hill. ISBN 0-07-025208-4.} +Its main purpose is to show that the number of relevant graphics primitives +is low. +The functionalities will be dealt with along the way in the examples. +For the details of the commands or the list of operators +see the red book.\ftn{A complete list with functional summaries is + in the red book section 6.2 Operator summary.} + +$$\everyverbatim{\emc} +\vbox{\halign{\hfil#\cr +\bf Arithmetic and math operators\hfill\cr +|<num>| |<num>| mul $num$ \cr +|<num>| sine $num$ \cr +% +\bf Path construction operators\hfill\cr +currentpoint $x$ $y$ \cr +|<x>| |<y>| moveto \cr +|<dx>| |<dy>| rmoveto \cr +|<x>| |<y>|lineto \cr +|<dx>| |<dy>| rlineto \cr +$\langle q_{1x}\rangle$ $\langle q_{1y}\rangle$ $\langle q_{2x}\rangle$ + $\langle q_{2y}\rangle$ $\langle p_{2x}\rangle$ $\langle p_{2y}\rangle$ + curveto \cr +$\langle c_x\rangle$ $\langle c_y\rangle$ $\langle r\rangle$ + $\langle ang_1\rangle$ $\langle ang_2\rangle$ arc \cr +% +\bf String operators\hfill\cr +|<string>| |<num>| |<num>| getinterval \cr +% +\bf Character and font operators\hfill\cr +{\tt\char92}|<fontname>| findfont \cr + \ |<fontsize>| scalefont setfont \cr +|<string>| show \cr +|{<body>}| |<string>| kshow \cr +% +\bf Graphics state operators\hfill\cr +|<num>| setgray \cr +|<num>| setlinewidth \cr +% +\bf Dictionary operators\hfill\cr +/|<defname> {<body>}| def \cr +% +\bf Coordinate system and matrix operators\hfill\cr +|<num>| |<num>| translate \cr +|<num>| |<num>| scale \cr +|<num>| rotate \cr +% +\bf Relational, boolean, and bitwise operators\hfill\cr +|<num>|\||<string>| |<num>|\||<string>| le $bool$\cr +% +\bf Control operators\hfill\cr +|<bool> {<truepart>} {<falsepart>}| ifelse \cr +|<num> {<body>}| repeat \cr +|<from> <step> <to>{<body>}| for \cr } +}$$ + +With prefix + $\langle in\rangle\> \langle operator\rangle\>\langle result\rangle$ +is elegant. + +\bluesubhead What is not allowed as EPS? + +I'm not knowledgeable enough to answer that question, nor do I know of +a full-blown definition of EPS. +For the moment it is some subset which works with all interpretors, +with my subset 0 in there. +When one restricts oneself to the basics of graphics, arithmetic and similar +operations then the boundary area between EPS and full \PS\Dash +or its various implementations\Dash is not in sight. + +\bluesubhead Documentation + +The red book\Dash the reference manual\Dash is generally recommended, though +the blue book\Dash the tutorial and cookbook\Dash is also nice.\ftn{I used the + \PS I red book and this is well-suited to get the flavour. + For \TeX{} and METAFONT %\MF{} %font not available + this is similar. To grasp the basic ideas + Knuth's first book is a more concise survey of the main lines of thought than + \TB{} and {\sl The METAFONTbook}.} + +\blueexample Pie chart from the blue book + +$$\ifdraft\vbox to3in{\vss\hbox{Pie chart}\vss} +\else\psfig{file=prpie.eps,height=3in} +\fi$$ + +The invoke is essentially as follows and shows that the codes can be used +straightforwardly.\ftn{It is not standard \PS. We have to construct some kind of + library to use the PostScript programs from. + Maybe the CTAN as global network library? + Copied on the various CD-ROMS?} +It is no longer necessary to mesh around with the picture environment or so, +to achieve the effect. + +\beginverbatim +%preliminary matter +(January Pie Sales) + 24 12 %... array size + [ [(Blueberry) .12 ] + [(Cherry) .30 ] + [(Apple) .26 ] + [(Boston Cream) .16 ] + [(Other) .04 ] + [(Vanilla Cream) .12 ] + ] 306 396%translate center to + 140 %size + DrawPieChart +showpage +!endverbatim + +There is also a \PS-FAQ, consult + +|ftp wilma.cs.brown.edu:|\\ +\null\qquad \qquad |pub/comp.lang.postscript|. + +It contains an annotated bibliography as well. + +The examples from Adobe's blue book are available on the net. + +\bluesubhead Proofing + +For previewing or printing, {\em as such\/} +I have to include a shift to move the picture away from the lower left corner, +say + +\beginverbatim +300 500 translate +!endverbatim + +\bluesubhead Inclusion + +I usually build a figure symmetrically around the origin and then include +it via + +\beginverbatim +$$\psfig{file=<name>,height=<number><unit>}$$ +!endverbatim + +A unit can be |in|(ch), |cm|, and ilks. \cs{psfig} is very vulnerable to + spaces because of \TeX's parsing. So no spaces in there. +Now and then I forget to inactivate the |translate| needed while previewing. +No real problem. + +\bluesubsubhead BoundingBox + +Providing the right BoundingBox coordinates has all to do with +proper placement within context, the look-and-feel. +Default \PS{} assumes the origin\Dash in user space\Dash +at the lower left corner of the paper\Dash in device space. + +Surround the picture by as-if lines and supply the coordinates, in points as units +in user space coordinates, +of the lower left corner and the upper right corner in the +BoundingBox specification. +Simple is to build a picture around its symmetry point\Dash +and let this coincide with the origin\Dash +with as pleasing result that the horizontal positioning comes out centered, +when used within math display. +Vertically, I add a 10 or so +extra on either side in the BoundingBox specification, +but that depends on the character of the picture. + +Some preview systems can measure the BoundingBox and allow adjustment +interactively.\ftn{For a summary of tools to assist finding the BoundingBox + coordinates see, Reckdahl K (1995): Using EPS graphics in \LaTeX{} + documents. reckdahl@leland.stanford.edu.} + +\bluesubhead Writing PostScript + +A line bundle and a variant of it are introduced to +show how to create simple EPS. + +\bluesubsubhead A line bundle + +$$\ifdraft\vbox to1in{\vss\hbox{Line bundle}\vss} +\else\psfig{file=linebundle.eps,height=1in} +\fi$$ + +How to do this in \PS? A line as such is simple. +First a |moveto| and then a |lineto|. So a way is to create a loop and repeatedly +draw from the origin to the end of the various lines. +This can be done elegantly by using appropriately the CTM. + +\beginverbatim +%!!PS EPS +%%Title: Line bundle +%%Creator: cgl +%%CreationDate: June 4 1996 +%%BoundingBox: -40 -45 40 45 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +/r 36 def +10{0 0 moveto r 0 lineto + 36 rotate +}repeat stroke showpage +!endverbatim + +Explanation. +The idea is that first a simple line is draw, for example along the x-axes. +What happens if after that we rotate? Right, the mapping is changed. +And what happens if we supply the {\em same\/} line after this? +Indeed, it will show up rotated. Because \PS{} is an interpretive +language we can realize this specification after the rotate via a loop, +which for this simple case reads |10{...}repeat|.\ftn{Do you see the variant + for drawing a polygon? This duality linebundle and polygon has been used + by Gabo and is about what he called stereometry versus perimetry, + the structure versus the surface} + +\beginquote +Appropriately maintaining the CTM for symmetrical pictures can yield simple +looking \PS{} programs. +\endquote + +\bluesubsubhead A flower + +$$\ifdraft\vbox to1in{\vss\hbox{Flower}\vss} +\else\psfig{file=flower.eps,height=1in} +\fi$$ + +This exercises the use of |arc|. + +\beginverbatim +%!!PS EPS +%%Title: Flower +%%Creator: cgl (Courtesy Papert) +%%CreationDate: June 4 1996 +%%BoundingBox: -40 -45 40 45 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +/r 36 def +10{r r moveto%begin drawing point + r 0 r 90 180 arc + currentpoint%origin + 0 r r 270 360 arc + 36 rotate +}repeat stroke showpage +!endverbatim + +Explanation. +We have the same structure as the previous program but the `line' is now +a little more elaborated: two arcs of a circle. +\PS{} provides an operator for drawing circular arcs, called arc. +The arc has $(x,y)$ as centre, r as radius, +$ang_1$ the angle of a vector from $(x,y)$ of length $r$ +to the first endpoint of the arc, and +$ang_2$ the angle of a vector from $(x,y)$ of length $r$ +to the second endpoint of the arc.\ftn{The arc is drawn counter clockwise. + |arcn| draws clockwise.} +These arguments are expected to be on the stack. + +\beginverbatim +x y r ang1 ang2 !bf arc +!endverbatim + +Important is to realize that arc {\em counts\/} its angle from (x, 0) and that +the {\em drawing\/} starts from the point on the stack + +The specification of the flower in \MF/\MP{} reads essentially as follows. + +\beginverbatim +for k:= 1 upto 10: +draw(origin{up}..{right}(up+right){down}.. + {left}origin) rotated 36k; +endfor +!endverbatim + +Explanantion. +\MF{} allows for specification of the directions\ftn{There is also a + quartercircle which apart from orientation is drawn similarly.} +$up =(0,1), right=(1,0)$. + +IMHO, with all respect the \MF{} and \PS{} programs are similar +modulo some syntactic sugar. +However, the extra possibility of specifying the directions is more convenient +than using control points. +But perhaps that is a matter of taste, although the handling of control points +is powerful as B\'ezier himself has shown in the past. +From this I conclude that for these simple kinds of pictures we can as well use +\PS{} straightaway. + +\bluehead Some more Graphics + +\blueexample Malbork window + +This is all about using |curveto|, especially choosing suitable control points. + +$$\ifdraft\vbox to1in{\vss\hbox{Malbork window}\vss} +\else\psfig{file=malbork.eps,height=1in} +\fi$$ + +\beginverbatim +%!!PS EPS +%%Title: Malbork Window +%%Creator: cgl +%%CreationDate: May 21 1996 +%%BoundingBox: -40 -40 40 40 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +45 rotate 10 0 moveto +4{20 0 37.5 12.5 25 25 curveto + 12.5 37.5 0 20 0 10 curveto + 90 rotate +}repeat%inside lops next +5 0 moveto +4{5 35 35 5 0 5 curveto + 90 rotate +}repeat%enclosing circle next +36 0 moveto +0 0 36 0 360 arc +stroke showpage +!endverbatim + +Explanation. +|translate| changes the CTM, +with the effect that the device coordinates are shifted. (Useful for +use of \PS{} alone out of context.) + +|rotate| changes the CTM, and because of being an interpretive language +the various loop traversals map the {\em same\/} user coordinates on the +rotated device coordinates. + +$\langle number\rangle \{\dots\}$ |repeat| is a loop to be traversed +$\langle number\rangle$ of times. + +|curveto| adds a spline to the current path +from the currentpoint to the last point on the stack. +The first two points are the so-called control points of the spline.\ftn{Much similar + as in METAFONT. Choosing for the inner lop the control + points in this way is borrowed from + Haralambous Y (1995): Some METAFONT techniques. + \tubissue{16}(1), 46\dash53. It is also supplied in the description + of |curveto| in the red book.} + +|arc| adds a circular arc to the current path from the currentpoint. + +The details of the arguments for the operators are nicely documented in the +red book. + +\blueexample Escher's impossible triangle + +This is all about {\em wrong\/} projections. +However, these kinds of pictures are intriguing and fun. +I consider them well-suited to illustrate \PS's drawing capabilities. + +$$\ifdraft\vbox to1in{\vss\hbox{Escher's impossible triangle}\vss} +\else\psfig{file=eschera.eps,height=1in} +\fi$$ + +\beginverbatim +%!!PS EPS +%%Title: Escher's impossible triangle +%%Creator: cgl (inspired by Guy Shaw) +%%CreationDate: May 23 1996 +%%BoundingBox: -40 -40 40 40 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +3{25 34 moveto + 25 -34 lineto + 17 -38.2 lineto + 17 20 lineto + -17.6 0 lineto +120 rotate +}repeat stroke showpage +!endverbatim + +\on5{} points, the right stroke and a rotation or two, that's it. +End of story. + +However, it is all about finding those \on5{} points. + +$$\ifdraft\vbox to1in{\vss\hbox{the 5 points}\vss} +\else\psfig{file=escherb.eps,height=1in} +\fi$$ + +\beginverbatim +%!!PS EPS +%%Title: Essential stroke +%%Creator: cgl (inspired by Guy Shaw) +%%CreationDate: May 23 1996 +%%BoundingBox: -40 -40 40 40 +%%Pages: 1 +%%EndProlog +%%Page: 0 1 +25 34 moveto currentpoint +0 -68 rlineto currentpoint%down + -120 rotate +25 34 lineto%preserve symmetry + 120 rotate currentpoint +17 20 lineto currentpoint +-17.6 0 lineto currentpoint +%labels +/Courier findfont 8 scalefont setfont +moveto -5 -3 rmoveto (5) show +moveto 1 1 rmoveto (4) show +moveto 2 -5 rmoveto (3) show +moveto 2 0 rmoveto (2) show +moveto 2 0 rmoveto (1) show +stroke showpage +!endverbatim + +Explanation. +The essential stroke figure also illustrates the integration +of text in this case digits. +|currentpoint| pushes the point on the stack. +The last |moveto|-s pop these coordinates up. +|rmoveto| moves {\em relatively.} + +\smallbreak +And what about their relationships, and +what about the minimal information to be prescribed? + +Looking more closely it turns out that {\em only\/} the first point is all +that is needed. +The rest is implicit to the nature of the figure.\ftn{Of course + one can also think of other equivalent parameters like size and thickness.} + +\beginverbatim +%!!PS EPS +%%Title: Escher's Impossible triangle II +%%Creator: cgl +%%CreationDate: May 23 1996 +%%BoundingBox: -40 -40 40 40 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%Parameterized over p1 +/point {25 34} def%note x<y +% +3{point moveto +currentpoint neg lineto%down + -120 rotate +point lineto%preserve symmetry + 120 rotate +currentpoint 2 div neg lineto +currentpoint 3 sqrt mul sub 0 lineto +120 rotate +}repeat stroke showpage +!endverbatim + +Explanation. +|currentpoint| yields the coordinates of the current point of the path on the stack. +The other operations do what their names suggest. +The temporarily change of the CTM within the loop expresses the +rotation symmetry relation between points \on1{} and \on3. + +\blueexample Bentley's polygon + +This code is all about a double loop and using the loop variable from the stack, +next to using the |gsave| and |grestore| advantageously. + +$$\ifdraft\vbox to1in{\vss\hbox{Bentley's polygon}\vss} +\else\psfig{file=bentley.eps,height=1in} +\fi$$ + +\beginverbatim +%!!PS EPS +%%Title: Bentley's double loop +%%Creator: cgl +%%CreationDate: May 30 1996 +%%BoundingBox: -100 -105 100 105 +%%EndProlog +10{1 1 9{100 0 moveto + gsave + 36 mul rotate%loopcount*36 + 100 0 lineto stroke + grestore + } for + 36 rotate +}repeat showpage +!endverbatim + +Explanantion. +|gsave| and |grestore| are needed to draw locally, that is at the end +the graphics state\Dash currentpoint, currentpath and CTM\Dash +is restored with the values at the beginning. +\on1{} \on1{} \on9{} stand for beginvalue step and endvalue of the |for| counter. + +\blueexample Another double loop + +A set of nested polygons provide also a double loop situation. + +$$\ifdraft\vbox to1in{\vss\hbox{Polygons}\vss} +\else\psfig{file=polygon.eps,height=1in} +\fi$$ + +\beginverbatim +%!!PS EPS Nested pentagons +%%Title: Pentagons +%%Creator: cgl +%%CreationDate: June 17 1996 +%%BoundingBox: -100 -100 100 100 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +10 10 100{dup 0 moveto + 5{72 rotate + dup 0 lineto + }repeat +}for stroke showpage +!endverbatim + +\blueexample Polygons with splines as sides + +This generalization of polygons was introduced by Jackowski at Euro\TeX{} \on95. +A special case of \MF's interpath functionality is shown en-passant. + +$$\ifdraft\vbox to1in{\vss\hbox{flexess}\vss} +\else\psfig{file=polygonii.eps,height=1in} +\fi$$ + +\beginverbatim +%!!PS EPS Nested `squares' +%%Title: polygon.eps II +%%Creator: cgl +%%CreationDate: June 17 1996 +%%BoundingBox: -100 -100 100 100 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +/r 100 def +/r1 {r .25 mul} def +/r3 {r .75 mul} def +25{r 0 moveto + 4{r3 r3 r1 r1 0 r curveto + 90 rotate + }repeat + .9 .9 scale +}repeat stroke showpage +!endverbatim + +\blueexample Barn window + +This is all about playing with circles and circular arcs.\ftn{The first example + in the blue book collection provides a similar picture with gradually + changing scales of grey.} + +$$\ifdraft\vbox to1in{\vss\hbox{Barn window}\vss} +\else\psfig{file=barnwindowii.eps,height=1in} +\fi$$ + +\beginverbatim +%!!PS EPS +%%Title: Barn Window II +%%Creator: cgl +%%CreationDate: May 29 1996 +%%BoundingBox: -45 -45 45 45 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +/l 36 def +/r {l 22.5 sin mul} def +/m {l 22.5 cos mul} def +8{r .5 mul 0 moveto + l 0 lineto + currentpoint %begin circular arc + 22.5 rotate m 0%center + r %radius + -90 90 arc + 22.5 rotate +}repeat +%inner circle +/rin {r .5 mul} def +rin 0 moveto +0 0 rin 0 360 arc +%outer circle +/rout {r m add} def +rout 0 moveto +0 0 rout 0 360 arc +%extra circles +/rin {r .25 mul} def +22.5 rotate +8{m rin add 0 moveto + m 0 rin 0 360 arc + 45 rotate +}repeat stroke showpage +!endverbatim + +I'm sure I'll come back some day and look again through this window, +but then pastel colored. + +\blueexample Baker's inspiration + +$$\ifdraft\vbox to1in{\vss\hbox{Woody Baker's picture}\vss} +\else\psfig{file=baker.eps,height=1in} +\fi$$ + +This example is similar to Escher's impossible triangle. +Find the essential stroke and rotate. + +\beginverbatim +%!!PS EPS +%%Creator: cgl (inspired by Woody Baker) +%%CreationDate: May 1996 +%%BoundingBox: -80 -80 80 80 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +4{-15 25 moveto + 0 -10 rlineto + 60 0 rlineto + 0 -30 rlineto + 10 0 rlineto + 0 40 rlineto + -70 0 rlineto + 0 10 rlineto + 80 0 rlineto + 0 -60 rlineto + -30 0 rlineto + 0 10 rlineto + 10 0 rlineto +% + 35 -25 moveto + 0 -10 rlineto + 20 0 rlineto + 10 10 rlineto +% + 45 15 moveto + 10 10 rlineto +90 rotate +}repeat stroke +% +/Courier findfont 10 scalefont setfont +-55 -75 moveto +(Courtesy Woody Baker)show +showpage +!endverbatim + +\blueexample Romanovsky's real Escher + +$$\ifdraft\vbox to1in{\vss\hbox{JVR's picture}\vss} +\else\psfig{file=jvr.eps,height=1in} +\fi$$ + +Grey scales can be obtained simply via $\langle number\rangle$ |setgray|, +with $\langle number\rangle \in [0, 1]$. +0 denotes black and 1 is white. +The idea is to construct the essential path\Dash + the stroke denoted by a grey scale\Dash +and to use this \on3{} times. + +\bluehead Math graphs + +In \AllTeX{} documents it is a problem\ftn{Communicated by Nico Temme. + He solved the problem by doing the calculations in PASCAL. + For advanced manipulations Mathematica or Mapple + are generally used where the resulting EPS is pasted up in the + \AllTeX{} script as usual.} +how to include accurate graphs of mathematical functions. +Because of \PS's arithmetic and graphics capabilities it is +handy to use \PS. + +\blueexample Sine function + +$$\ifdraft\vbox to1in{\vss\hbox{sine function}\vss} +\else\psfig{file=sine.eps,height=1in} +\fi$$ + +\beginverbatim +%!!PS EPS +%%Title: Sine function +%%Creator: cgl (inspired by Batagelj) +%%CreationDate: May 27 1996 +%%BoundingBox: -200 -110 200 110 +%%EndProlog +/Courier findfont 15 scalefont setfont +%figure scaled by 100 +%x-axes and label +-200 0 moveto 200 0 lineto +-15 -15 rmoveto (x) show +%y-axes and label +0 -110 moveto 0 110 lineto +-35 -10 rmoveto (sin) show +%function +-180 0 moveto +-180 10 180{%from step to + dup sin 100 mul%(x, 100sin x) + lineto +}for stroke showpage +!endverbatim + +The invoke might read as follows. + +\beginverbatim +$$\psfig{file=sine.eps,height=1in}$$ +!endverbatim + +\bluehead Text set along curved paths + +A teaser. With the advent of scalable and rotationable outline fonts +this is possible too. + +\blueexample Along a circle + +$$\ifdraft \vbox to 1in{\vss\hbox{text along an arc}\vss} +\else \psfig{file=textalongarc.eps,height=1in} +\fi$$ + +\beginverbatim +%!!PS EPS +%%Title: Typesetting along arcs +%%Creator: cgl +%%CreationDate: June 4 1996 +%%BoundingBox: -100 50 100 125 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +/Courier findfont 10 scalefont setfont +/text (happybirthday) def +50 rotate +0 1 12{0 100 moveto + text exch 1 getinterval show + -10 rotate +}for stroke showpage +!endverbatim + +Joseph Romanovsky communicated that |kshow|\Dash kerning (and more general +positioning) under user control\Dash +is available which allows a general +def to be executed between two characters of a string. + +\blueexample Along a spiral + +The blue book provides an example of typesetting along a path\Dash + a quotation of Woody Allen\Dash +where the path accentuates his filmmaker profession. +The example below shows a nice effect with little knowledge of \PS, +essentially the use of |kshow|. + +$$\ifdraft \vbox to 2in{\vss\hbox{text along spiral}\vss} +\else \psfig{file=textalongspiral.eps} +\fi$$ + +\beginverbatim +%!!PS EPS +%%Title: Text along spiral +%%Creator: J.V. Romanovsky +%%BoundingBox: -100 -90 60 70 +%%EndProlog +/Courier findfont 20 scalefont setfont +-100 0 moveto 50 rotate +{-10 rotate 3 0 rmoveto .98 .98 scale} + (Olga Grineva my charming + St Peterburg hostess)kshow +showpage +!endverbatim + +\blueexample Seals + +The problem has been discussed by Hoenig at Euro\TeX{} \on92, +and Zlatu\v{s}ka at Euro\TeX{} \on95, both biased by \MF. +\PS{} alone is suited too with an overall simpler process. +Combining two earlier supplied examples yields Zlatu\v{s}ka's seal +in principle.\ftn{The blue book also provides a seal\Dash +Symphony No.\on9\Dash + but that is more complex and ipso facto requires more knowledge of \PS{} + to understand what is going on, IMHO, with all respect. + To set this poster from the blue book is no more difficult than the + use of |arc|, however. My example gives you the feeling that you + understand what is going on, I hope.} + +\beginverbatim +%!!PS EPS +%%Title: Seal, in principle +%%Creator: cgl +%%CreationDate: June 6 1996 +%%BoundingBox: -110 -45 110 100 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%150 650 translate +/Courier findfont 10 scalefont setfont +/text (happy postscripting to you) def +/r 100 def +gsave + 90 rotate %begin orientation + 0 r moveto%begin point +{-7.04 rotate 0 r moveto} text kshow +grestore%next the central Escher +3{25 34 moveto + 25 -34 lineto + 17 -38.2 lineto + 17 20 lineto + -17.6 0 lineto +120 rotate +}repeat stroke showpage +!endverbatim + +$$\ifdraft \vbox to 1.5in{\vss\hbox{seal}\vss} +\else \psfig{file=seal.eps,height=1.5in} +\fi$$ + +Remark. The difference of fonts in the main text and that used by \PS{} + is no longer there when \PS{} fonts are used throughout, be it + the \PS{} version of the CM family. + +\blueexample Gurari's squares + +$$\ifdraft \vbox to 1in{\vss\hbox{Gurari's squares}\vss} + \else \psfig{file=gurarisq.eps,height=1in} + \fi$$ + +\beginverbatim +%!!PS Gurari squares +%%BoundingBox: -200 -110 200 110 +%%Creator: cgl +%%CreationDate: June 20 1996 +%%EndProlog +/r 22 def +/square {1 1 4{0 r rlineto + 90 rotate}for} def +0 0 moveto 90 rotate +50{r 0 rmoveto square + -30 rotate .9 .9 scale +}repeat stroke showpage +!endverbatim + +\blueexample Gurari's ABC + +Very nice this suggestion of motion. + +$$\ifdraft \vbox to 1.5in{\vss\hbox{Gurari's speedy ABC}\vss} + \else \psfig{file=gurariabc.eps,height=1.5in} + \fi$$ + +\beginverbatim +%!PS EPS +%%Title: Guarai's ABC +%%BoundingBox: 0 -45 100 75 +%%Creator: Gurari +%%CreationDate: copied June 17 1996 +%%Pages: 1 +%%EndComments +%%EndProlog +%%Page: 1 1 +/Times-Bold findfont 45 scalefont setfont +-40 rotate +1 -.03 0{setgray + 0 0 moveto + (ABC) show + 3 rotate + } for +0 0 moveto -4 rotate +1 setgray (ABC) show +showpage +!endverbatim + +\blueexample Walking along the S-curve + +In {\sl The METAFONTbook\/} ex\on13.\on10{} is about drawing overlapping +disks along a path, the S-figure. +How to do this in \PS{} straightaway? +There is no `point of' a path operator so the best we can attain is +to walk along a math function. + +$$\ifdraft \vbox to 1in{\vss\hbox{S-figure}\vss} + \else \psfig{file=sinedisks.eps,height=1in} + \fi$$ + +\beginverbatim +%!PS Sine with overlapping disks +%%BoundingBox: -200 -110 200 110 +%%Creator: cgl (METAFONTbook ex13.10) +%%CreationDate: June 17 1996 +%%EndProlog +newpath +-180 10 180{dup sin 100 mul%(x, 100sin x) + 12.5 0 360 arc + gsave 1 setgray fill grestore + stroke +}for showpage +!endverbatim + +Explanation. |1 setgray fill| is the erase functionality, encapsulated to +yield what we want. + +\bluehead Tables set sideways + +Another teaser is to set tables rotated. +Rokicki provided rotate macros along with his |dvips|, among others. +I have borrowed the essence from his rotate macros +and recast into the following. + +\beginverbatim +\def\rotate#1%stuff + #2%degrees in PS direction +{\setbox\abox=\hbox{#1}% + \adim\ht\abox\advance\adim by\dp\abox + \hbox to\adim{\vbox to\wd\abox + {\vskip\wd\abox + \special{ps: gsave + currentpoint currentpoint translate + #2 neg rotate + neg exch neg exch translate}% + \box\abox\vss}\hss}% + \special{ps: currentpoint + grestore moveto}% +}%end rotate +!endverbatim + +The point is that it is not much. +The |ps:| is dependent on the system still, alas. + +\blueexample Rotated table + +The example works under UNIX with Rokicky's |dvips|. +%under UNIX +\newdimen\adim +\newbox\abox +% +\def\rotate#1%stuff + #2%degrees in PS direction +{\setbox\abox=\hbox{#1}% + \adim\ht\abox\advance\adim by\dp\abox + \hbox to\adim{\vbox to\wd\abox{\vskip\wd\abox + \special{ps: gsave currentpoint currentpoint + translate #2 neg rotate + neg exch neg exch translate}% + \box\abox\vss}\hss}% + \special{ps: currentpoint grestore moveto}% +}%end rotate + +\begindemo +\def\data{1\cs2\rs + 3\cs4 } +pre +\rotate{\framed + \btable\data} + {90} +post +!yields +\def\data{1\cs2\rs 3\cs4 } +pre +\rotate{\framed\btable\data}{90} +post +\enddemo + +Remark. +Gurari (1994) has provided some more examples of \PS$\leftrightarrow$(Al)Dra\TeX{} +interaction. Real interfacing. +Apart from portability problems it gets quite complicated. +For the moment I refrain and code the `pictures' in raw \PS{} +assisted by \MF{} for prompting control points of those curves +which can be specified elegantly in a declarative way. + +\bluehead METAFONT/MetaPost user interface + +Sometimes it is more natural to specify points and {\em directions}. +It is true that specifying a control point along the direction +can yield the same effect but the distance between the point +and its control point influences the shape. + +\blueexample Escher's knot + +This example is all about specifying directions. + +$$\ifdraft\vbox to1in{\vss\hbox{Escher knot II}\vss} +\else\psfig{file=escherknotmf.eps,height=1in} +\fi$$ + +In \MF{} the coding would read as follows. + +\beginverbatim +%Escher's Knot. June 96. cgl@rc.service.rug.nl +def openit = openwindow currentwindow + from origin to (screen_rows,screen_cols) + at (-2r,3r)enddef; +pickup pencircle scaled 1; +tracingstats:=proofing:=1; screenstrokes; +pair p[]; +%parameters +r:=100; alfa=90; +% +p2:=(0,.85r); %independent from p1,3,4 +p4:=(0,-.5r); +%dependent points because of symmetry +p1:=p4 rotated -120; +p3:=p4 rotated 120; +path q; +q=p1{dir alfa}..{(1,0)}p2.. + {dir(-alfa)}p3..{dir(alfa-240)}p4; +draw q; +draw q rotated 120; +draw q rotated-120; +showit; +end +!endverbatim + +By the nature of the figure not only points are related but +also their directions. +How to cope with this in \PS? +It can be done but is not so elegant, honestly speaking cumbersome. +But \dots there is a solution or two, hang on. + +\beginverbatim +%!!PS EPS +%%Title: Escher knot II +%%Creator: cgl (inspired by Knotplot) +%%CreationDate: June 1996 +%%BoundingBox: -95 -95 95 95 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +% +/angle 90 def +/r 100 def +/point {0 -.5 r mul}def +/p1 {-.25 r mul 3 sqrt mul .25 r mul moveto + currentpoint + angle sin 2 mul add exch + angle cos 2 mul add exch + -20 .85 r mul + 0 .85 r mul + curveto stroke} def +/p3 { .25 r mul 3 sqrt mul .25 r mul moveto + %Control point + currentpoint + angle sin -15 mul add exch + angle cos 15 mul add exch + %Control point: + % 58.62 -.5 r mul 5 add%angle 90 + 0 angle -240 add cos -15 mul add + -.5 r mul angle -240 add sin -15 mul add + 0 -.5 r mul + curveto stroke} def +3{p1 + gsave -1 1 scale p1 grestore%reflect + p3 + 120 rotate +}repeat showpage +!endverbatim + +Explanation. +The essential curve is split into \on3{} pieces: p$_1$,\dots p$_3$. +The first two are related by reflection. +The third must properly match. In the Columbus's egg paragraph +the straight |.eps| code is given, +biased by the knowledge of the (control) points. + +\bluesubhead A teaser + +More complicated is when the line is changed into a tube, and +when we have to deal with hidden lines. +In \MF{} the code could read as follows, where use is made of +|intersectiontimes| and of subpaths.\ftn{This code works as such on my Mac + with Bluesky's PD METAFONT. For other environments build a character + from it, or adapt it for use in MetaPost, or even simpler copy the + bread-and-butter EPS code which is appended at the end.} + +\blueexample Escher's knot III + +This example is all about getting from a {\em declarative\/} specification +in \MF{} to a {\em imperative\/} EPS code. + +$$\ifdraft\vbox to1in{\vss\hbox{Escher knot III}\vss} +\else\psfig{file=escherknotiii.epsabr,height=1in} +\fi$$ + +First the declarative \MF{} code. +\beginverbatim +%Escher Knot III. June 96. cgl@rc.service.rug.nl +def openit = openwindow currentwindow + from origin to (screen_rows,screen_cols) + at (-2r,3r)enddef; +pickup pencircle scaled 1; +tracingstats:=proofing:=1; screenstrokes; +numeric t, u, v, w; +pair p[]; path q[]; +def assignpoints= + p2:=(0,.85r); %independent from p1,3,4 + p4:=(0,-.5r); + %dependent points because of symmetry + p1:=p4 rotated -120; + p3:=p4 rotated 120; +enddef; +% +alfa=90;r:=100; assignpoints; +q1:=p1{dir alfa}..{(1,0)}p2.. + {dir(-alfa)}p3..{dir(alfa-240)}p4; +%inside + r:=.75r; assignpoints; +q2:=p1{dir alfa}..{(1,0)}p2.. + {dir(-alfa)}p3..{dir(alfa-240)}p4; +(t,u)= subpath (2.5,3) of q1 + intersectiontimes (q2 rotated -120); +(v,w)= q2 intersectiontimes + (q1 rotated 120); +%showvariable t,u; +draw subpath (0,2.5 + t/2) of q1; +draw subpath (0,2.5 + t/2) of q1 + rotated 120; +draw subpath (0,2.5 + t/2) of q1 + rotated-120; +%showvariable v,w; +draw subpath (v,3) of q2; +draw subpath (v,3) of q2 rotated 120; +draw subpath (v,3) of q2 rotated-120; +showit; +end +!endverbatim + +To give the reader an impression of what \MP{} will yield +|escherknotIII.eps|, the imperative code, is included.\ftn{A white lie. I have edited the file + and reduced the data\Dash and deleted + |dtransform|, |idtransform| and the various |set...|\Dash + for the \on6{} strokes into only \on2{} and rotated these. + METAFONT allowed me to declaratively specify the picture while + MetaPost provided me with the essential path data. + Well\dots even METAFONT can be asked to provide those (control) points.} + +\beginverbatim +%!!PS EPS +%%BoundingBox: -40 -31 40 43 +%%Creator: MetaPost and JJW, CGL +%%CreationDate: June 17 1996 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +3{-21.6507 12.5 moveto +-21.6507 27.74551 -13.78212 42.5003 + 0 42.5003 curveto +13.78212 42.5003 21.6507 27.74551 + 21.6507 12.5 curveto +21.6507 -0.24506 16.04897 -12.19249 + 6.58395 -20.3313 curveto +% +-14.3152 15.86746 moveto +-12.43301 23.58928 -7.45113 29.75021 + 0 29.75021 curveto +9.64748 29.75021 15.15549 19.42186 + 15.15549 8.75 curveto +15.15549 -2.07904 9.37823 -12.08548 + 0 -17.5 curveto +120 rotate +}repeat stroke showpage +!endverbatim + +As can be seen from the last code it is all about finding the right +(control) points and draw the strokes, as remarked at the beginning of this note. +The difference between the declarative \MF{} specification and +the resulting (unedited) \MP{} code is striking. +When the last code is shown first one would say, ah\dots \PS{} +is easy just data and some strokes. +The resulting code is equivalent to Woody Baker's code: +just the right stroke and a rotation or two. + +KnotPlot on the net provides a more complicated version where +the light reflection is emulated by shades of grey. +The gzipped file is \on64KB, however. +A world of difference. + +\bluesubhead Columbus' egg + +Why not use \MF{} to create `the (control) points' from the descriptive picture +and use these in raw \PS{} straightaway? + +After assigning +|precontrol|-s and |postcontrol|-s to pairs and +inserting |show|-s, \MF{} yielded for the simple Escher knot the data +in the transcript file. +A little editing of this log file resulted in the following +imperative EPS code. + +\beginverbatim +%!!PS EPS +%%Title: Escher knot (mf prompted) +%%Creator: cgl +%%CreationDate: June 1996 +%%BoundingBox: -80 -80 80 80 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +3{-43.30139 25 moveto + -43.30139 55.49103 -27.56424 85.00061 + 0 85.00061 curveto + 27.56424 85.00061 43.30139 55.49103 + 43.30139 25 curveto + 43.30139 -5.94014 26.79497 -34.5299 + 0 -50 curveto +120 rotate +}repeat stroke showpage +!endverbatim + +I presume the functionality is similar to Jackowski's |mftoeps|. +The above method is my Poor Man's \MF2EPS, with concise, very concise +and intelligible EPS as result. + +\bluehead Acknowledgements + +First of all Don Knuth and John Hobby thank you. + +Thank you Joseph Romanovsky for +showing by example the power of \PS, and for +your cooperation on the \MF$\leftrightarrow$\PS{} duality. + +Thank you Bogus\l{}aw Jackowski for your `\PS{} for \TeX ies' +at Bacho\TeX{} \on96, suggesting that \PS{} as such is beneficial +for \TeX ies, next to your mftoeps. + +Thank you Eitan Gurari and anonymous \TeX ies of which I borrowed material, +not in the least Adobe for providing \PS{} to start with. + +Piet Tutelaers provided me with a copy of the PSFAQ, and +Erik Frambach traced the file with examples from the blue book, next to KnotPlot. + +As usual Jos Winnink proofed the paper and lend a helping hand in +procrusting towards MAPS inclusion if not for processing |escherknot.mf| +into |escherknot.eps| via \MP. + +\bluehead Conclusion + +To code symmetrical and simple curves in raw \PS{} is fun and yields elegant +scripts and concise files. +To merge text with graphics is fun too, and the teaser to set along curved paths +can be done by \PS{} elegantly. +Another teaser of drawing math curves accurately along with \AllTeX{} is solved also +by means of \PS. +Powerful too is to {\em extend\/} the inclusion of .eps files +at the dvi level by a little more interaction between \AllTeX{} and \PS. +Rotating a box, with as applications for example +typesetting tables in landcape, is possible in \PS, at the expense of system +dependency because of the \cs{special}-s. + +{\em Merging\/} a little knowledge of \PS{} with \TeX pertise is powerful. +PStricks concentrates on {\em interfacing\/} \AllTeX{} with \PS{} at the expense +of burdening \AllTeX{} too much, IMHO, with all respect. +For \cs{rotate} I interfaced too. However, for typesetting along curved +paths I would not think of interfacing via rotated boxes or so. + +Of course, people who do need advanced features or have special wishes +might better use Adobe Illustrator, CorelDRAW, Mathematica, or Adobe Photoshop, +and not to forget the pleasing MetaPost. + +To understand and learn \TeX{} did take me a couple of years. +To acqaint myself with \MF{} did cost me a few months. +Learning just a little bit of \PS{} was a matter of weeks, and +when concentrating +on paths and (control) points the |moveto|, |arc| and |curveto| +can be grasped in a late afternoon. + +Although the blue book contains also examples of typesetting text, +I consider \TeX{} unsurpassed for this. The best of both worlds is to +combine \AllTeX{} and \PS. + +Maybe we should follow Adobe and extend the use of \PS{} by PDF\Dash +or use the alternative HTML\Dash to facilitate WWW surfing. + +\bluehead What more? + +For pictures I use a \TeX{} controlled database with the beneficial side-effect +that I don't have to worry about file systems when using pictures +(tools, references and ilks) on different machines. +I would welcome a similar functionality for my collection of \PS{} +pictures to be used with \cs{psfig}. + +A next step is the manipulation of colors either via \MP{} or \PS{} directly. +Jackowski uses Adobe Illustrator for example to enrich interactively +the systematic EPS pictures created by \MF. +Indeed interesting, very interesting, +but beyond my possibilities for some time to come. +Neither do I have access to color \PS{} printers as yet, alas. +My case rests. + +Have fun, and all the best. +\makesignature +\pasteuptoc +\endscript diff --git a/info/laan/paradigm/paradigm.ps b/info/laan/paradigm/paradigm.ps new file mode 100644 index 0000000000..b36acc71e8 --- /dev/null +++ b/info/laan/paradigm/paradigm.ps @@ -0,0 +1,2751 @@ +%!PS-Adobe-2.0 +%%Creator: dvips 5.47 Copyright 1986-91 Radical Eye Software +%%Title: paradigm.dvi +%%Pages: 13 1 +%%BoundingBox: 0 0 596 843 +%%EndComments +%%BeginProcSet: tex.pro +/TeXDict 200 dict def TeXDict begin /N /def load def /B{bind def}N /S /exch +load def /X{S N}B /TR /translate load N /isls false N /vsize 10 N /@rigin{ +isls{[0 1 -1 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale +Resolution VResolution vsize neg mul TR matrix currentmatrix dup dup 4 get +round 4 exch put dup dup 5 get round 5 exch put setmatrix}N /@letter{/vsize 10 +N}B /@landscape{/isls true N /vsize -1 N}B /@a4{/vsize 10.6929133858 N}B /@a3{ +/vsize 15.5531 N}B /@ledger{/vsize 16 N}B /@legal{/vsize 13 N}B /@manualfeed{ +statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N +/FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin +/FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array +/BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 +array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail} +B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont +setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup +length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{ +ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B +/ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 +N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S +dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 +ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice +ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image} +imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn /base get cc ctr +put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf +div put}if put /ctr ctr 1 add N}B /I{cc 1 add D}B /bop{userdict /bop-hook +known{bop-hook}if /SI save N @rigin 0 0 moveto}N /eop{clear SI restore +showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook +known{start-hook}if /VResolution X /Resolution X 1000 div /DVImag X /IE 256 +array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for}N /p /show load N +/RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X +/rulex X V}B /V statusdict begin /product where{pop product dup length 7 ge{0 +7 getinterval(Display)eq}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 +TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 +-.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /a{ +moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{ +S p tail}B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B +/j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w +}B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p +a}B /bos{/SS save N}B /eos{clear SS restore}B end +%%EndProcSet +%%BeginProcSet: special.pro +TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs +792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP false N /BBcalc false N +/p 3 def}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{ +@scaleunit div /vsc X}B /@hsize{/hs X /CLIP true N}B /@vsize{/vs X /CLIP true +N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{10 div /rwi X} +B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X /BBcalc true N}B +/magscale true def end /@MacSetUp{userdict /md known{userdict /md get type +/dicttype eq{md begin /letter{}N /note{}N /legal{}N /od{txpose 1 0 mtx +defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{ +itransform moveto}}{transform{itransform lineto}}{6 -2 roll transform 6 -2 +roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll +itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array +astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{ +PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR +pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 +get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip +not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if +yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 +rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get +ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not +and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip +not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if} +ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy +TR .96 dup scale neg S neg S TR}if}N /cp{pop pop showpage pm restore}N end}if} +if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{ +DVImag dup scale}if}N /psfts{S 65536 div N}N /startTexFig{/psf$SavedState save +N userdict maxlength dict begin /magscale false def normalscale currentpoint +TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts +/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx +sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx +psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N +/erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{psf$llx psf$lly +psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll +S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end +psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave +normalscale currentpoint TR @SpecialDefaults}N /@setspecial{CLIP{newpath 0 0 +moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR +hsc vsc scale ang rotate BBcalc{rwi urx llx sub div dup scale llx neg lly neg +TR}if /showpage{}N /erasepage{}N /copypage{}N newpath}N /@endspecial{grestore +clear SpecialSave restore end}N /@defspecial{SDict begin}N /@fedspecial{end}B +/li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{/SaveX currentpoint /SaveY X N 1 +setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY +moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix +currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix +setmatrix}N end +%%EndProcSet +TeXDict begin 1000 300 300 @start /Fa 4 117 df<01F800070E000C03001C03803801C0 +7801E07000E0F000F0F000F0F000F0F000F0F000F0F000F0F000F07000E07801E03801C01C0380 +1E0780070E0001F80014157E941A>111 D<FFFC001C0F001C03801C03C01C03C01C03C01C03C0 +1C03C01C03801C0F001FFC001C00001C00001C00001C00001C00001C00001C00001C00001C0000 +FF800012157F9417>I<1F1030F06030C030C010C010C000E0007E003FC01FE003F00078003800 +18801880188010C030F0608FC00D157E9413>115 D<7FFFF06070304070104070108070088070 +088070080070000070000070000070000070000070000070000070000070000070000070000070 +0000700007FF0015157F9419>I E /Fb 13 112 df<000100000300000700000780000B80000B +800013800013800023C00021C00041C00041C00081C00081C00100E001FFE00200E00200E00400 +E00400700800701C0070FE03FE17177F961A>65 D<1FFFFE03C00E038006038006038002038002 +03800203808007010007010007030007FF000703000703000E02040E02040E00040E000C0E0008 +0E00181C00381C0070FFFFF017177F9618>69 D<1FFFFE03C00E03800603800603800203800203 +800203808007010007010007030007FF000703000703000E02000E02000E00000E00000E00000E +00001C00001E0000FFC00017177F9617>I<1FC0003F8003E0005C0002E000780002E000B80002 +E000B8000270013800027001380002700238000470047000043804700004380870000438087000 +0438107000041C107000081C20E000081C40E000081C40E000080E80E000080E80E000080F00E0 +00180E01C000380601C000FE040FF80021177F9620>77 D<1FC01FE001C0038002E0030002E002 +00027002000238020002380200021C0200041C0400040E0400040E040004070400040784000403 +84000801C8000801C8000800E8000800E80008007800080078001800300038001000FE0010001B +177F961A>I<003F0001C1C00300600E00301C003818001830001C70001C70001CE0001CE0001C +E0001CE0001CE00038E00038E00038E00070E000607000E03001C01803000E0E0003F00016177C +961B>I<3FFFFC703C1C60380C403804C038048038048038040038000070000070000070000070 +0000700000700000E00000E00000E00000E00000E00000E00001C00001E0003FFE0016177C9619 +>84 D<0FF83F8001E01C0000E0180000E0100000702000007040000038800000398000001D0000 +001E0000000E0000000E0000001F00000037000000278000004380000083C0000101C0000201E0 +000600E0000400F0001C00F000FF03FE0019177F961A>88 D<7E001E001C001C001C001C001C00 +1C00380039F03E0C3806380738077007700770077007700E700CF018C87087C010177D9614>98 +D<03E00C3018183018701C7FF8E000E000E000E0006008701038600F800E0E7E8D10>101 +D<1F80000780000700000700000700000700000700000700000E00000E3E000EC3000F03800E03 +800E03801C07001C07001C07001C07001C07001C0700380E00380E00FF3FC012177F9614>104 +D<1F80000780000700000700000700000700000700000700000E00000E0FC00E0F000E0C000E10 +000E60001CC0001DE0001CF0001C70001C78001C3800383C00383E00FE7F8012177F9613>107 +D<03F00C18180C300E700E600EE00EE00EE00EE00C601C703838600F800F0E7E8D12>111 +D E /Fc 4 122 df<07001880304060404080FF00C000C000C0008000C040C08043003C000A0E +7B8D10>101 D<38F04518463846308C000C000C000C001800180018001800300030000D0E7D8D +0F>114 D<1C1026184618461886100C100C100C101820182018401840088007000D0E7D8D10> +118 D<1C0826184618461886300C300C300C30186018601860186008C007C000C0008071807300 +66003C000D147D8D11>121 D E /Fd 42 122 df<183C7C340404080810106080060C799C0C> +39 D<000400080030006000C0008001800300060006000C000C00180018003800300030007000 +7000600060006000E000E000E000E000E000E000E000E000600060006000600020003000300018 +0008000C00040002000E2A7C9E10>I<0100008000400060002000300010001800180018001C00 +0C000C000C000C000C000C000C000C001C001C001C0018001800380038003000300070006000E0 +00C001C001800300030006000C0018003000600080000E2A809E10>I<7FF0FFE00C027F890E> +45 D<000020000000300000007000000070000000F0000000F0000001F0000003780000027800 +0006780000047800000C780000087C0000183C0000103C0000203C0000203C0000403C0000403E +0000FFFE0000801E0001001E0001001E0002001E0002000F0004000F0004000F001E001F00FF80 +FFF01C1D7F9C1F>65 D<0FFFFC0000F8070000F0038000F003C000F001C000F001E000F001E001 +E001C001E003C001E003C001E0078001E00F0001E03C0003FFF80003C01E0003C00F0003C00780 +03C0078003C007800780078007800780078007800780078007800F0007801E000F003C000F0078 +00FFFFE0001B1C7E9B1D>I<0007F010001C0C300070026000C001E0038000E0070000E00E0000 +600E0000601C0000403C00004038000040780000007800000078000000F0000000F0000000F000 +0000F0000000F0000000F0000080F0000100700001007000010038000200380004001C0004000C +001800060020000380C000007F00001C1E7C9C1E>I<0FFFFFE000F801E000F000E000F0004000 +F0004000F0004000F0004001E0004001E0404001E0400001E0400001E0C00001E1C00003FF8000 +03C1800003C0800003C0800003C0800003C0808007800080078000800780010007800100078003 +00078006000F000E000F003E00FFFFFC001B1C7E9B1C>69 D<0FFFFFC000F803C000F001C000F0 +008000F0008000F0008000F0008001E0008001E0408001E0400001E0400001E0C00001E1C00003 +FF800003C1800003C0800003C0800003C0800003C0800007800000078000000780000007800000 +07800000078000000F0000000F800000FFF800001A1C7E9B1B>I<0007F010001C0C3000700260 +00C001E0038000E0070000E00E0000600E0000601C0000403C0000403800004078000000780000 +0078000000F0000000F0000000F0000000F000FFF0F0000F80F0000780F0000F0070000F007000 +0F0038000F0038000F001C001F000C001E000600660003818200007E00001C1E7C9C21>I<0FFF +8000F80000F00000F00000F00000F00000F00001E00001E00001E00001E00001E00001E00003C0 +0003C00003C00003C00003C00003C0000780000780000780000780000780000780000F00000F80 +00FFF800111C7F9B0F>73 D<0FF80007FC00F8000FC000BC000F8000BC00178000BC00178000BC +00278000BC002780011E004F00011E004F00011E008F00011E008F00011E010F00010F010F0002 +0F021E00020F021E00020F041E00020F041E000207881E000207901E000407903C000407A03C00 +0407A03C000407C03C000403C03C000403803C000C038078001E03007C00FF8307FF80261C7E9B +26>77 D<0FF807FE00F800F000FC006000BC004000BE0040009E0040009E0040010F0080010F00 +8001078080010780800103C0800103C0800201E1000201E1000200F1000200F1000200F9000200 +790004007E0004003E0004003E0004001E0004001E0004000E000C000C001E000400FF8004001F +1C7E9B1F>I<0007F00000381C0000E00E0001C0030003800380070001C00E0001C01E0001E01C +0000E03C0000E0380000E0780000F0780000F0780000F0F00001E0F00001E0F00001E0F00001E0 +F00003C0F00003C0F00003C0700007807000070078000F0038001E003C001C001C0038000E00E0 +000383800000FE00001C1E7C9C20>I<0FFFFC0000F80F0000F0038000F003C000F001C000F001 +C000F001C001E003C001E003C001E003C001E0038001E0070001E00E0003C03C0003FFE00003C0 +000003C0000003C0000003C000000780000007800000078000000780000007800000078000000F +0000000F800000FFF000001A1C7E9B1C>I<0FFFF80000F80E0000F0078000F003C000F001C000 +F001E000F001E001E003C001E003C001E0038001E0070001E00E0001E03C0003FFE00003C07000 +03C0380003C03C0003C01C0003C01E0007803C0007803C0007803C0007803C0007803C0007803C +080F003C100F801C10FFF01C20000007C01D1D7E9B1F>82 D<003F0400C0CC0180380300380600 +180E00180E00180E00181E00101E00001F00000F80000FF80007FF0003FF8001FFC0003FE00003 +E00001E00000E00000E04000E04000E04000E04000C06001C0E00180F00300CC0E0083F800161E +7E9C17>I<1FFFFFF03C07C0F03007803020078020600780204007802040078020400F0020800F +0020000F0000000F0000000F0000000F0000001E0000001E0000001E0000001E0000001E000000 +1E0000003C0000003C0000003C0000003C0000003C0000003C000000780000007C00001FFFE000 +1C1C7C9B1E>I<FFF0FFE0FF801F001F003C000F001F0018000F000F0010000F001F0010000F00 +1F0020000F002F0020000F002F0060000F804F00400007804F8040000780878080000780878080 +0007810781000007810781000007820782000007C20782000003C407C4000003C403C4000003C8 +03C8000003C803C8000003D803D0000003D003D0000003F003E0000001E003E0000001E001C000 +0001C001C0000001C001800000018001800000018001800000291D7B9B2B>87 +D<07F0001C18001E0C001C0E00180E00000E00000E0001FE000F0E001C1C00301C00701C00E01C +40E01C40E03C40E05C80709D803F0E0012127D9115>97 D<3F00000F00000E00000E00000E0000 +0E00000E00000E00001C00001C00001C00001C78001D86001E03003C03803801803801803801C0 +3801C03801C0700380700380700380700300700700700E00F00C00CC300083C000121D7C9C17> +I<01F8071C0C1E181C38183000700070007000E000E000E000600060047008301018200FC00F12 +7D9112>I<0003F00000F00000E00000E00000E00000E00000E00000E00001C00001C00001C000 +F1C0030DC00C03C01C0380380380300380700380700380700380E00700E00700E0070060070060 +0700700F00301E00186F00078FC0141D7D9C17>I<01F8070C0C061C073803300370037FFF7000 +E000E000E00060006002300430081C3007C010127E9112>I<000F800039C00061C000E3C001C1 +8001C00001C00001C0000380000380000380003FF8000380000380000700000700000700000700 +000700000700000E00000E00000E00000E00000E00000E00001C00001E0000FFC000121D7F9C0D +>I<000038003CCC00C69C018308038380070380070380070380070380070700030600038C0004 +F0000400000C00000C00000FFE0007FF800FFFC01801C02000C06000E0C000C0C000C060018020 +0300180E0007F000161C809215>I<07E00001E00001C00001C00001C00001C00001C00001C000 +038000038000038000038F8003B0C003C0E00780E00780E00700E00700E00700E00700E00E01C0 +0E01C00E01C00E01C00E01C00E01C01C03801E03C0FF9FF0141D7F9C17>I<00C001C001C00180 +00000000000000000000000000001F80078003800700070007000700070007000E000E000E000E +000E000E001C001E00FF800A1D7F9C0C>I<07E00001E00001C00001C00001C00001C00001C000 +01C0000380000380000380000387F80381E003818007020007040007080007100007700007F800 +0F38000E3C000E1C000E1E000E0E000E0F001C07001C0F80FF9FE0151D7F9C16>107 +D<07E001E001C001C001C001C001C001C003800380038003800380038007000700070007000700 +07000E000E000E000E000E000E001C001E00FF800B1D7F9C0C>I<1F8FC0FC00079061060003E0 +7607000780780700078078070007007007000700700700070070070007007007000E00E00E000E +00E00E000E00E00E000E00E00E000E00E00E000E00E00E001C01C01C001E01E01E00FF8FF8FF80 +21127F9124>I<1F8F8007B0C003C0E00780E00780E00700E00700E00700E00700E00E01C00E01 +C00E01C00E01C00E01C00E01C01C03801E03C0FF9FF014127F9117>I<00FC000307000E01801C +01C03800C03000C07000E07000E07000E0E001C0E001C0E001C0600180600380700700380E001C +180007E00013127E9115>I<0FC78003D86001E03003C03803803803801803801C03801C03801C +0700380700380700380700700700700700E00F01C00EC3000E3C000E00000E00000E00001C0000 +1C00001C00001C0000FF8000161A809117>I<00F0400308C00E05C01C03803803803803807003 +80700380700380E00700E00700E00700600700700700700F00301E00186E00078E00000E00000E +00000E00001C00001C00001C00001C0000FF80121A7D9116>I<1F9C07EE03CF078E078C070007 +00070007000E000E000E000E000E000E001C001E00FFC010127F9110>I<03F20C0E1806100430 +0438043E001FE00FF007F8003C401C400C400C6018E010D0608FC00F127F9110>I<0200020002 +00060006000C001C003C00FFE01C001C0038003800380038003800380070007040704070407040 +7080708031001E000B1A7C9910>I<FC1F803C07801C0380380700380700380700380700380700 +380700700E00700E00700E00700E00701E00701E00703C00305E001F9F8011127C9117>I<FF0F +E03C03801C03001C02001C06001C04001E08000E08000E10000E10000E200007200007400007C0 +0007800007000003000002000013127C9116>I<FF3FCFE03C0F038038060300380E02001C0F02 +001C1704001C1704001C2708001C2308001C4310000E4390000E83A0000E83A0000F03C0000F01 +C0000E01800006018000040100001B127C911E>I<0FF0FE03C03801C03001C02001C06001C040 +01E08000E08000E10000E10000E200007200007400007C00007800007000003000002000002000 +004000004000708000F10000F10000E60000780000171A809116>121 D +E /Fe 83 126 df<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0600000000060F0F0600419779816> +33 D<0387000387000387000387000387000387007FFFC0FFFFE0FFFFE0070E00070E00070E00 +0E1C000E1C000E1C000E1C00FFFFE0FFFFE07FFFC01C38001C38001C38001C38001C38001C3800 +13197F9816>35 D<00C00001C00001C00001C00007F0001FFC003FFE007DCF0071C780E1C380E1 +C780E1C780F1C30079C0003FC0001FF00007FC0001FE0001CF0001C70061C380F1C380F1C380E1 +C38071C70079DF003FFE001FF80007E00001C00001C00000C00011207E9C16>I<3801807C0380 +7C0380EE0700EE0700EE0E00EE0E00EE0E00EE1C007C1C007C3800383800007000007000007000 +00E00000E00001C00001C00001C0000380000383800707C00707C00E0EE00E0EE00E0EE01C0EE0 +1C0EE03807C03807C018038013207F9C16>I<30787C3C1C1C1C1C3878F0E040060D789816>39 +D<00E001E0038007000E001C001C0038003800700070007000E000E000E000E000E000E000E000 +E000E000700070007000380038001C001C000E000700038001E000E00B217A9C16>I<C000E000 +700038001C000E000E000700070003800380038001C001C001C001C001C001C001C001C001C003 +8003800380070007000E000E001C0038007000E000C0000A217B9C16>I<01C00001C00001C000 +01C00071C700F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF8071C70001C00001C000 +01C00001C00011127E9516>I<01C00001C00001C00001C00001C00001C00001C00001C000FFFF +80FFFF80FFFF8001C00001C00001C00001C00001C00001C00001C00001C00011137E9516>I<38 +7C7E7E3E0E1E1C78F060070B798416>I<FFFF80FFFF80FFFF8011037E8D16>I<70F8F8F8700505 +788416>I<000180000380000380000700000700000E00000E00001C00001C0000380000380000 +700000700000E00000E00001C00001C0000380000380000700000700000E00000E00001C00001C +0000380000380000700000700000E00000E00000C0000011207E9C16>I<03E0000FF8001FFC00 +1E3C00380E00780F00700700700700E00380E00380E00380E00380E00380E00380E00380E00380 +F00780700700700700780F003C1E001E3C001FFC000FF80003E00011197E9816>I<0180038003 +8007800F807F80FF80738003800380038003800380038003800380038003800380038003800380 +7FF87FFC7FF80E197C9816>I<07E0001FF8003FFC00783E00E00700F00780F003806003800003 +80000380000700000700000E00001C0000380000700000E00001C0000380000F00001E03803803 +807FFF80FFFF807FFF8011197E9816>I<07E0001FF8003FFC00781E0078070030070000070000 +0700000E00003E0007FC0007F00007FC00001E00000700000300000380000380600380F00380E0 +0700781E003FFC001FF80007E00011197E9816>I<007C0000FC0000DC0001DC00039C00039C00 +071C000F1C000E1C001E1C003C1C00381C00781C00F01C00FFFFE0FFFFE0FFFFE0001C00001C00 +001C00001C00001C0001FFC001FFC001FFC013197F9816>I<3FFE003FFE003FFE003800003800 +003800003800003800003800003800003BF0003FFC003FFE003C0F003007000003800003806003 +80F00380F00380E00700781E003FFC001FF80007E00011197E9816>I<00F80003FC0007FE000F +07001C0F00380F00780600700000700000E3F800EFFC00FFFE00F80F00F00700F00380E00380E0 +03807003807003807007803807003C1E001FFC000FF80003E00011197E9816>I<E00000FFFF80 +FFFF80FFFF80E00F00E01E00001C0000380000780000700000E00000E00001C00001C00001C000 +038000038000038000038000070000070000070000070000070000070000070000111A7E9916> +I<07F0001FFC003FFE007C1F00F00780E00380E00380E003807007007C1F001FFC0007F0001FFC +003C1E00700700F00780E00380E00380E00380F007807007007C1F003FFE001FFC0007F0001119 +7E9816>I<03E0000FF8001FFC003C1E00700E00700700E00700E00780E00380E00380E0078070 +0780780F803FFF801FFB800FE380000700000700300700780E00781C007078003FF0001FE0000F +800011197E9816>I<70F8F8F870000000000000000070F8F8F8700512789116>I<387C7C7C3800 +0000000000000038787C7C3C1C1C3870E0400618799116>I<000180000780001F80003E0000F8 +0001F00007C0000F80003E0000FC0000F00000FC00003E00000F800007C00001F00000F800003E +00001F8000078000018011157E9616>I<7FFF00FFFF80FFFF8000000000000000000000000000 +0000FFFF80FFFF807FFF00110B7E9116>I<C00000F00000FC00003E00000F800007C00001F000 +00F800003E00001F80000780001F80003E0000F80001F00007C0000F80003E0000FC0000F00000 +C0000011157E9616>I<00F80003FC0007FE000F07001C3F80387F8078FF8071C3C071C3C0E381 +C0E381C0E381C0E381C0E381C0E381C0E381C071C38071C38078FF00387E001C3C000F03C007FF +C003FF0000FC0012197E9816>64 D<00E00001F00001F00001B00001B00003B80003B80003B800 +031800071C00071C00071C00071C00071C000E0E000E0E000FFE000FFE001FFF001C07001C0700 +1C07007F1FC0FF1FE07F1FC013197F9816>I<7FF800FFFE007FFF001C0F001C07801C03801C03 +801C03801C07801C07001FFF001FFE001FFE001C1F001C03801C03C01C01C01C01C01C01C01C01 +C01C03C01C07807FFF80FFFF007FFC0012197F9816>I<01F18007FB800FFF801F0F803C078038 +0380700380700380F00000E00000E00000E00000E00000E00000E00000E00000F0000070038070 +03803803803C07001F0F000FFE0007FC0001F00011197E9816>I<7FF800FFFE007FFF001C0F00 +1C07801C03C01C01C01C01C01C01E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E0 +1C01C01C01C01C03C01C07801C0F807FFF00FFFE007FF8001319809816>I<7FFFC0FFFFC07FFF +C01C01C01C01C01C01C01C01C01C00001C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C +001C00001C00E01C00E01C00E01C00E01C00E07FFFE0FFFFE07FFFE013197F9816>I<FFFFE0FF +FFE0FFFFE01C00E01C00E01C00E01C00E01C00001C00001C1C001C1C001FFC001FFC001FFC001C +1C001C1C001C00001C00001C00001C00001C00001C0000FF8000FFC000FF800013197F9816>I< +03E30007FF000FFF001E1F003C0F00380700700700700700F00000E00000E00000E00000E00000 +E03F80E07FC0E03F80F00700700700700700380F003C0F001E1F000FFF0007F70003E70012197E +9816>I<FFFEFFFEFFFE0380038003800380038003800380038003800380038003800380038003 +800380038003800380FFFEFFFEFFFE0F197D9816>73 D<07FE07FF07FE00380038003800380038 +003800380038003800380038003800380038003800386038F038F0707FF07FE01F8010197D9816 +>I<7F0FE0FF8FF07F0FE01C07801C0F001C0E001C1C001C3C001C78001CF0001CE0001DF0001F +F0001FF8001F38001E1C001C1C001C0E001C0E001C07001C07001C03807F07E0FF8FF07F07E014 +19809816>I<FFC000FFC000FFC0001C00001C00001C00001C00001C00001C00001C00001C0000 +1C00001C00001C00001C00001C00001C00001C00401C00E01C00E01C00E01C00E0FFFFE0FFFFE0 +FFFFE013197F9816>I<FC07E0FE0FE0FE0FE03A0B803B1B803B1B803B1B803B1B803B1B803BBB +8039B38039B38039B38039B38039F38038E38038E380380380380380380380380380380380FE0F +E0FE0FE0FE0FE013197F9816>I<7E1FC0FF3FE07F1FC01D07001D87001D87001D87001DC7001D +C7001CC7001CC7001CE7001CE7001CE7001C67001C67001C77001C77001C37001C37001C37001C +17007F1F00FF9F007F0F0013197F9816>I<1FFC003FFE007FFF00780F00F00780E00380E00380 +E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380F00780 +F00780780F007FFF003FFE001FFC0011197E9816>I<7FF800FFFE007FFF001C0F801C03801C03 +C01C01C01C01C01C01C01C03C01C03801C0F801FFF001FFE001FF8001C00001C00001C00001C00 +001C00001C00001C00007F0000FF80007F000012197F9816>I<7FE000FFF8007FFC001C1E001C +0F001C07001C07001C07001C07001C0F001C1E001FFC001FF8001FFC001C1C001C0E001C0E001C +0E001C0E001C0E201C0E701C0E707F07E0FF87E07F03C014197F9816>82 +D<07E3001FFF003FFF00781F00F00700E00700E00700E00000F000007800003F80001FF00007FC +0000FE00000F00000700000380000380600380E00380E00700F80F00FFFE00FFFC00C7F0001119 +7E9816>I<7FFFE0FFFFE0FFFFE0E0E0E0E0E0E0E0E0E0E0E0E000E00000E00000E00000E00000 +E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00007FC000FFE0007 +FC0013197F9816>I<FE0FE0FF1FE0FE0FE03803801C07001C07001C07001C07000E0E000E0E00 +0E0E000E0E00060C00071C00071C00071C00071C0003180003B80003B80003B80001B00001F000 +01F00000E00013197F9816>86 D<FC07E0FE0FE0FC07E07001C07001C07001C030018038038038 +038038038038E38039F38039F38039B38019B30019B30019B30019B30019B30019B3001913001B +1B000F1E000F1E000E0E0013197F9816>I<FFF0FFF0FFF0E000E000E000E000E000E000E000E0 +00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000FFF0 +FFF0FFF00C20789C16>91 D<C00000E00000E000007000007000003800003800001C00001C0000 +0E00000E000007000007000003800003800001C00001C00000E00000E000007000007000003800 +003800001C00001C00000E00000E0000070000070000038000038000018011207E9C16>I<FFF0 +FFF0FFF00070007000700070007000700070007000700070007000700070007000700070007000 +7000700070007000700070007000700070FFF0FFF0FFF00C207F9C16>I<FFFF80FFFF80FFFF80 +11037E7E16>95 D<081C3C7870E0E0E0E0F0F87830060D789B16>I<1FE0003FF0007FF800783C +00300E00000E00000E0003FE001FFE003E0E00700E00E00E00E00E00E00E00783E007FFFE03FE7 +E00F83E013127E9116>I<7E0000FE00007E00000E00000E00000E00000E00000E3E000EFF000F +FF800F83C00F00E00E00E00E00700E00700E00700E00700E00700E00700E00E00F01E00F83C00F +FF800EFF00063C001419809816>I<03F80FFC1FFE3C1E780C7000E000E000E000E000E000F000 +700778073E0E1FFC0FF803F010127D9116>I<003F00007F00003F000007000007000007000007 +0003C7000FF7001FFF003C1F00780F00700700E00700E00700E00700E00700E00700E00700700F +00700F003C1F001FFFE00FE7F007C7E014197F9816>I<03E00FF81FFC3C1E780E7007E007FFFF +FFFFFFFFE000E000700778073C0F1FFE0FFC03F010127D9116>I<001F00007F8000FF8001E780 +01C30001C00001C0007FFF00FFFF00FFFF0001C00001C00001C00001C00001C00001C00001C000 +01C00001C00001C00001C00001C0003FFE007FFF003FFE0011197F9816>I<03E3C007F7E00FFF +E01C1CC0380E00380E00380E00380E00380E001C1C000FF8001FF0001BE0003800001800001FFC +001FFF003FFF807803C0E000E0E000E0E000E0E000E07001C07C07C03FFF800FFE0003F800131C +7F9116>I<7E0000FE00007E00000E00000E00000E00000E00000E3C000EFE000FFF000F87800F +03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03807FC7F0FFE7F87F +C7F01519809816>I<018003C003C0018000000000000000007FC07FC07FC001C001C001C001C0 +01C001C001C001C001C001C001C001C07FFFFFFF7FFF101A7D9916>I<00300078007800300000 +0000000000001FF81FF81FF8003800380038003800380038003800380038003800380038003800 +38003800380038003800386070F0F0FFE07FC03F800D237E9916>I<7E0000FE00007E00000E00 +000E00000E00000E00000E7FE00E7FE00E7FE00E0F000E1E000E3C000E78000EF0000FF0000FF8 +000FBC000F1E000E0E000E07000E07807F87F0FFCFF07F87F01419809816>I<FFC000FFC000FF +C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001 +C00001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF8011197E9816>I<F9C380 +FFEFC0FFFFE03C78E03C78E03870E03870E03870E03870E03870E03870E03870E03870E03870E0 +3870E0FE7CF8FE7CF8FE3C781512809116>I<7E3C00FEFE007FFF000F87800F03800E03800E03 +800E03800E03800E03800E03800E03800E03800E03800E03807FC7F0FFE7F87FC7F01512809116 +>I<03E0000FF8001FFC003C1E00780F00700700E00380E00380E00380E00380E00380F0078070 +0700780F003C1E001FFC000FF80003E00011127E9116>I<7E3E00FEFF007FFF800F83C00F00E0 +0E00E00E00700E00700E00700E00700E00700E00700E00E00F01E00F83C00FFF800EFF000E3C00 +0E00000E00000E00000E00000E00000E00007FC000FFE0007FC000141B809116>I<07C7000FE7 +001FF7003C1F00700F00700F00E00700E00700E00700E00700E00700E00700700F00700F003C3F +003FF7001FE70007C700000700000700000700000700000700000700003FE0007FF0003FE0141B +7E9116>I<FF0FC0FF3FE0FF7FE007F04007C00007800007800007000007000007000007000007 +0000070000070000070000FFFC00FFFC00FFFC0013127F9116>I<0FEC3FFC7FFCF03CE01CE01C +70007F801FF007F8003C600EE00EF00EF81EFFFCFFF8C7E00F127D9116>I<0300000700000700 +000700000700007FFF00FFFF00FFFF000700000700000700000700000700000700000700000701 +0007038007038007038007870003FE0001FC0000F80011177F9616>I<7E1F80FE3F807E1F800E +03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E0F800FFFF007 +FBF803E3F01512809116>I<7F1FC0FF1FE07F1FC01C07001E0F000E0E000E0E000E0E00071C00 +071C00071C00071C0003B80003B80003B80001F00001F00000E00013127F9116>I<FF1FE0FFBF +E0FF1FE038038038038038038038038038E38019F30019F30019B3001DB7001DB7001DB7001DB7 +000F1E000F1E000F1E0013127F9116>I<7F1FC07F3FC07F1FC00F1C00073C0003B80003F00001 +F00000E00001E00001F00003B800073C00071C000E0E007F1FC0FF3FE07F1FC013127F9116>I< +7F1FC0FF9FE07F1FC01C07000E07000E0E000E0E00070E00071C00071C00039C00039C00039800 +01B80001B80000F00000F00000F00000E00000E00000E00001C00079C0007BC0007F80003F0000 +3C0000131B7F9116>I<3FFFC07FFFC07FFFC0700780700F00701E00003C0000780001F00003E0 +000780000F00001E01C03C01C07801C0FFFFC0FFFFC0FFFFC012127F9116>I<001F80007F8000 +FF8001E00001C00001C00001C00001C00001C00001C00001C00001C00001C00003C0007F8000FF +0000FF00007F800003C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001 +E00000FF80007F80001F8011207E9C16>I<E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 +E0E0E0E0E0E0E0E0E0E0E00320779C16>I<7C0000FF0000FF800003C00001C00001C00001C000 +01C00001C00001C00001C00001C00001C00001E00000FF00007F80007F8000FF0001E00001C000 +01C00001C00001C00001C00001C00001C00001C00001C00003C000FF8000FF00007C000011207E +9C16>I E /Ff 5 58 df<18F8181818181818FF08097D880F>49 D<7F00C1C0C0C000C0018007 +0018407F80FF800A097E880F>I<20803F003C00200020003F00218000C000C0C0C080C041803E +000A0D7E880F>53 D<0F00118021806000C000DE00E180C0C0C0C0C0C060C021801E000A0D7E8C +0F>I<1E006100C080C0C0C0C0C0C061C01EC000C00080618063003C000A0D7E880F>57 +D E /Fg 8 84 df<40E04003037D8209>46 D<0C001C00EC000C000C000C000C000C000C000C00 +0C000C000C000C000C000C000C000C00FFC00A137D9211>49 D<1F0060C06060F070F030603000 +700070006000C001C00180020004000810101020207FE0FFE00C137E9211>I<0FC03070703870 +3870380038003000E00FC0007000380018001C601CF01CF018E03860701FC00E137F9211>I<00 +3000003000007800007800007800009C00009C00011E00010E00010E0002070002070004038007 +FF800403800801C00801C01000E03800E0FE07FC16147F9319>65 D<FE000FE01E000F00170017 +001700170017001700138027001380270011C0470011C0470010E0870010E0870010E087001071 +070010710700103A0700103A0700101C0700101C0700381C0700FE083FE01B147F931E>77 +D<FFFC001C07001C03801C01C01C01C01C01C01C01C01C01C01C03801C07001FFC001C00001C00 +001C00001C00001C00001C00001C00001C0000FF800012147F9316>80 D<1F1030F06030C030C0 +10C010E00070007F003FC00FF000F000380018801880188018C030F0608FC00D147E9312>83 +D E /Fh 17 121 df<60F0F0600404798312>46 D<3F807FC070E0207000700FF03FF07870E070 +E070E07070F03FFE1F3E0F0E7E8D12>97 D<07F01FF8383870106000E000E000E000E000600070 +3838381FF007E00D0E7E8D12>99 D<00F800F8003800380038003807B81FF8387870386038E038 +E038E038E0386038707838781FFE0FBE0F147F9312>I<07801FE0387070706038E038FFF8FFF8 +E0006000703838381FF007C00D0E7E8D12>I<007E00FF01C70382038003807FFEFFFE03800380 +038003800380038003800380038003803FF83FF81014809312>I<06000F000F00060000000000 +0000FF00FF000700070007000700070007000700070007000700FFF0FFF00C157D9412>105 +D<F71C00FFBE0079E70079E70071C70071C70071C70071C70071C70071C70071C70071C700F9E7 +80F8E380110E808D12>109 D<F9E0FFF03E383C3838383838383838383838383838383838FE3E +FE3E0F0E7F8D12>I<0F803FE038E07070E038E038E038E038E038F078707038E03FE00F800D0E +7E8D12>I<FBE0FFF03C38381C380C380E380E380E380E380C381C3C383FF03BC0380038003800 +38003800FE00FE000F157F8D12>I<FCF8FDFC1F1C1E081E001C001C001C001C001C001C001C00 +FFC0FFC00E0E7E8D12>114 D<1FF03FF06070C070E0007F003FE00FF000786018E018F030FFE0 +DFC00D0E7E8D12>I<06000E000E000E007FF8FFF80E000E000E000E000E000E000E000E380E38 +0E3807F003C00D127F9112>I<F8F8F8F838383838383838383838383838383838383838781FFE +0FBE0F0E7F8D12>I<FC7EFC7E38383C781C701C701C700EE00EE00EE006C007C007C003800F0E +7F8D12>I<7C7C7C7C1CF00EE00FC007C00380078007C00EE01EF01C70FC7EFC7E0F0E7F8D12> +120 D E /Fi 5 59 df<0400FC000C000C000C000C000C000C000C000C000C000C000C00FFC00A +0E7D8D12>49 D<3FC04070E038E0184018003800300060018003080C081FF07FF0FFF00D0E7E8D +12>I<03E00C1018183038203860004000C000C780D860E030E010C018C018C018401860186010 +202018400F800D157E9412>54 D<0F80304060204030C010C018C018C0184038603830580F9800 +1800100030E030E060C04041803E000D147E8D12>57 D<60F0F06004047D830A>I +E /Fj 10 58 df<1F8060604020C030C030C030C030C030402060601F800C0B7E8A10>48 +D<0400FC000C000C000C000C000C000C000C000C00FFC00A0B7D8A10>I<1FC060606030003000 +3000600180061018107FE0FFE00C0B7E8A10>I<1F8020C0606060600060004000800F8000C000 +600030C030C030806060C01F800C107E8A10>I<01800180038005800D801980118021804180C1 +80FFF001800180018001800FF00C107E8A10>I<20403F802E002000200020002F803040206000 +3000300030C030806060C01F000C107E8A10>I<07C01820306060606000C000CF80D0C0E060C0 +30C030C0306030606030C00F800C107E8F10>I<40007FF07FE080408080008001000200040004 +000C000800180018001800180018000C117D8B10>I<0F8030C060606060606038C01D800F0033 +C060E0C070C030C030C02070C01F800C107E8F10>I<1F0030C06060C020C030C030C030607030 +B01F3000300060606060C021801E000C107E8A10>I E /Fk 8 106 df<0003FE0000000FFF8000 +003C01E00000F000780001C0001C00030000060006000003000C0000018018000000C018000000 +C030000000603000000060600000003060000000306000000030C000000018C000000018C00000 +0018C000000018C000000018C000000018C000000018C000000018C00000001860000000306000 +00003060000000303000000060300000006018000000C018000000C00C00000180060000030003 +0000060001C0001C0000F0007800003C01E000000FFF80000003FE000025277E9D2A>13 +D<000000040000000002000000000200000000010000000000800000000040FFFFFFFFF8FFFFFF +FFF8000000004000000000800000000100000000020000000002000000000400250E7E902A>33 +D<020000080004000004000400000400080000020010000001002000000080FFFFFFFFF0FFFFFF +FFF0200000008010000001000800000200040000040004000004000200000800240E7D902A>36 +D<007FF801FFF80780000E0000180000300000300000600000600000C00000C00000C00000FFFF +F8FFFFF8C00000C00000C000006000006000003000003000001800000E000007800001FFF8007F +F8151A7D961C>50 D<003C00E001C0018003800380038003800380038003800380038003800380 +03800380030007001C00F0001C0007000300038003800380038003800380038003800380038003 +8003800380018001C000E0003C0E297D9E15>102 D<F0001C0007000300038003800380038003 +8003800380038003800380038003800380018001C000E0003C00E001C001800380038003800380 +038003800380038003800380038003800380030007001C00F0000E297D9E15>I<008001800300 +030003000600060006000C000C000C00180018001800300030003000600060006000C000C00060 +00600060003000300030001800180018000C000C000C0006000600060003000300030001800080 +092A7C9E10>I<C000C0006000600060003000300030001800180018000C000C000C0006000600 +0600030003000300018001800300030003000600060006000C000C000C00180018001800300030 +003000600060006000C000C000092A7E9E10>I E /Fl 30 124 df<04081030206040C0C0C0C0 +C0C0C0C04060203010080406167D8F0B>40 D<804020301018080C0C0C0C0C0C0C0C0818103020 +408006167E8F0B>I<40E0602020408003077D8208>44 D<40E04003037D8208>46 +D<1E0061804080C0C0C0C0C0C0C0C0C0C0C0C0C0C0408061801E000A0D7E8C0E>48 +D<18F818181818181818181818FF080D7D8C0E>I<3E00418080C0C0C000C000C0018003000400 +084030407F80FF800A0D7E8C0E>I<3E0041806180018003001E00018000C000C0C0C0C0C04180 +3E000A0D7E8C0E>I<0300070007000B00130023006300C300FFC00300030003001FC00A0D7E8C +0E>I<20803F003C00200020003F00218000C000C0C0C080C041803E000A0D7E8C0E>I<0F001180 +21806000C000DE00E180C0C0C0C0C0C060C021801E000A0D7E8C0E>I<40007FE07FC080808100 +02000200040004000C000C000C000C000C000B0E7E8D0E>I<1E0023006180618071003E003F00 +6380C0C0C0C0C0C061803F000A0D7E8C0E>I<1E006100C080C0C0C0C0C0C061C01EC000C00080 +618063003C000A0D7E8C0E>I<FFF000301C003006003003003001003001803001803001803001 +80300100300300300600301C00FFF000110E7E8D15>68 D<3F8006000600060006000600060006 +00060006000600C60084007800090E7D8D0E>74 D<3C00620003001F006300C300C320C3203FC0 +0B097E880E>97 D<1F0021804000C000C000C000400020801F0009097E880D>99 +D<1E0061004180FF80C000C000400020801F0009097E880D>101 D<060B181818FE1818181818 +18187E080E7F8D09>I<1DE022206300630022003C0060003F003F8040C0C0C0C0C061803F000B +0E7E880E>I<207020000000F030303030303030FC060F7F8E08>105 D<F0303030303030303030 +303030FC060E7F8D08>108 D<F78038C030C030C030C030C030C030C0FDF00C097E8810>110 +D<F78038403060303030303030306038C03780300030003000FC000C0D7E8810>112 +D<FE33303030303030FC08097E880B>114 D<7C8484F03C0682C2BC07097E880B>I<08081838FE +181818181919190E080D7F8C0B>I<F3C030C030C030C030C030C030C031C01EF00C097E8810>I< +FFF00C017F850E>123 D E /Fm 4 12 df<F8000000FF80000007E0000000780000001C000000 +070000000380000000C0000000600000003000000018000000180000000C000000060000000600 +000003000000030000000180000001800000018000000180000000C0000000C0000000C0000000 +C0000000C0000000401A1B988132>8 D<00000040000000C0000000C0000000C0000000C00000 +00C0000001800000018000000180000001800000030000000300000006000000060000000C0000 +0018000000180000003000000060000000C0000003800000070000001C00000078000007E00000 +FF800000F80000001A1B989A32>I<40000000C0000000C0000000C0000000C0000000C0000000 +600000006000000060000000300000003000000018000000180000000C00000006000000060000 +00030000000180000000C000000060000000380000001C0000000700000003C0000000F8000000 +3FE0000007E01B1B809A32>I<000007E000003FE00000F8000003C00000070000001C00000038 +00000060000000C00000018000000300000006000000060000000C000000180000001800000030 +00000030000000600000006000000060000000C0000000C0000000C0000000C0000000C0000000 +400000001B1B808132>I E /Fn 34 123 df<07E01C38300C700E60066006E007E007E007E007 +E007E007E007E00760066006700E300C1C3807E010147E9215>48 D<01000F00F7000700070007 +00070007000700070007000700070007000700070007000700FFF80D137C9215>I<0FE0303840 +1C400EC00FE0074007000F000E001C0038007000C00101060108031FFE7FFEFFFE10137E9215> +I<07E01838201C201C781E780E781E301E001C001C0038006007E00030001C001C000E000F000F +600FF00FF00FE00F800E401C201C183007E0101C7E9215>I<000C00000C00001C00003C00003C +00005C00009C00019C00011C00021C00061C00041C00081C00101C00301C00201C00401C00C01C +00FFFFC0001C00001C00001C00001C00001C00001C00001C0001FFC0121B7F9215>I<300C3FF8 +3FF03FC020002000200020002000200023E02C38300C200C000E0006000700076007F007F007E0 +078006400E400C2018183007C0101C7E9215>I<00F0030C06040C0E181E301E300C7000700060 +00E3E0E430E818F00CF00EE006E007E007E007E007E007600760077006300E300C18180C3003E0 +101D7E9B15>I<4000007FFF807FFF007FFF004002008004008004008008000010000010000020 +0000400000400000C00000C0000180000180000380000380000380000380000780000780000780 +00078000078000078000030000111C7E9215>I<07E00C301008300C6006600660066006700638 +0C3C081F300FE003E007F01878303C600E6007C007C003C003C003C00360026006300C1C1807E0 +101D7E9B15>I<07C00C301818300C700C600EE006E006E007E007E007E0076007600F300F1817 +0C2707C700060006000E300C780C78187018203030C00F80101C7E9215>I<60F0F06004047C83 +0C>I<60F0F0701010101020204080040C7C830C>I<01E3000717000C0F00180F00380E00300E00 +700E00700E00E01C00E01C00E01C00E01C00E03880E03880E038806078803199001E0E0011127E +9116>97 D<3F00070007000E000E000E000E001C001C001C001C0039E03A303C1838187018701C +701C701CE038E038E038E030E070E060E0C061C023001E000E1D7E9C12>I<01F0030C0E0C1C1E +383C301870007000E000E000E000E000E000E0046008601030601F800F127E9112>I<0007E000 +00E00000E00001C00001C00001C00001C000038000038000038000038001E7000717000C0F0018 +0F00380E00300E00700E00700E00E01C00E01C00E01C00E01C00E03880E03880E0388060788031 +99001E0E00131D7E9C16>I<01F007080C0818043808300870307FC0E000E000E000E000E000E0 +046008601030600F800E127E9113>I<0001E0000630000E78000CF0001C60001C00001C00001C +00003C0000380000380003FFC000380000380000700000700000700000700000700000E00000E0 +0000E00000E00000E00001C00001C00001C00001C00001C000018000038000038000630000F300 +00F60000E4000078000015257E9C14>I<007180018B800307800607800E07000C07001C07001C +0700380E00380E00380E00380E00381C00381C00381C00183C0008F80007380000380000380000 +7000607000F06000F0E000E180007E0000111A7F9114>I<0FC00001C00001C000038000038000 +0380000380000700000700000700000700000E3E000EC3000F03800E03801E03801C03801C0380 +1C0380380700380700380700380E00700E20700E20701C20701C40E00C80600700131D7E9C18> +I<01C003C003C001800000000000000000000000001C00270047004700870087000E000E001C00 +1C001C003800388038807080710032001C000A1C7E9B0E>I<1F80038003800700070007000700 +0E000E000E000E001C001C001C001C0038003800380038007000700070007000E400E400E400E4 +0064003800091D7E9C0C>108 D<381F81F04E20C6184640E81C4680F01C8F00F01C8E00E01C0E +00E01C0E00E01C1C01C0381C01C0381C01C0381C01C0703803807138038071380380E1380380E2 +700700643003003820127E9124>I<381F004E61804681C04701C08F01C08E01C00E01C00E01C0 +1C03801C03801C03801C0700380710380710380E10380E2070064030038014127E9119>I<00F8 +00030C000E06001C0300180300300300700380700380E00700E00700E00700E00E00E00E00E01C +0060180060300030E0000F800011127E9114>I<07078009C86008D03008E03011C03011C03801 +C03801C0380380700380700380700380600700E00700C00701800783000E86000E78000E00000E +00001C00001C00001C00001C00003C0000FF8000151A819115>I<01C206260C1E181E381C301C +701C701CE038E038E038E038E070E070E07060F023E01CE000E000E001C001C001C001C003C01F +F80F1A7E9113>I<383C4E424687470F8E1E8E0C0E000E001C001C001C001C0038003800380038 +007000300010127E9113>I<01F0060C04040C0E180C1C001F000FE00FF003F80038201C7018F0 +18F010803060601F800F127E9113>I<00C001C001C001C00380038003800380FFF00700070007 +000E000E000E000E001C001C001C001C00382038203840384018800F000C1A80990F>I<1C00C0 +2701C04701C04701C08703808703800E03800E03801C07001C07001C07001C0700180E20180E20 +180E201C1E200C264007C38013127E9118>I<07878008C84010F0C020F1E020E3C040E18000E0 +0000E00001C00001C00001C00001C000638080F38080F38100E5810084C60078780013127E9118 +>120 D<1C00C02701C04701C04701C08703808703800E03800E03801C07001C07001C07001C07 +00180E00180E00180E001C1E000C3C0007DC00001C00001800603800F03000F06000E0C0004180 +003E0000121A7E9114>I<038107C10FE6081C1008001000200040008001000200040008041004 +2C1877F843F081C010127E9113>I E /Fo 7 85 df<03FF000FFFC01E01E03800707000387000 +38700038E0001CE0001CE0001CE0001CE0001CE0001CFFFFFCFFFFFCE0001CE0001CE0001CE000 +1CE0001CE0001CE0001CE0001CE0001CE0001C16197D981C>65 D<7FFFF0FFFFF0E00000E00000 +E00000E00000E00000E00000E00000E00000E00000E00000E00000FFFFC0FFFFC0E00000E00000 +E00000E00000E00000E00000E00000E00000FFFFF07FFFF014197D981A>69 +D<7FFFF0FFFFF0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000 +00FFFFC0FFFFC0E00000E00000E00000E00000E00000E00000E00000E00000E00000E000001419 +7D981A>I<E00000E0E00000E0F00001E0F00001E0F80003E0FC0007E0FC0007E0EE000EE0EE00 +0EE0E7001CE0E7001CE0E38038E0E1C070E0E1C070E0E0E0E0E0E0E0E0E0E071C0E0E071C0E0E0 +3B80E0E01F00E0E01F00E0E00E00E0E00E00E0E00000E0E00000E01B197D9821>77 +D<E0001CE0001CF0001CF8001CFC001CEE001CE7001CE3801CE1C01CE0E01CE0701CE0701CE038 +1CE01C1CE00E1CE0071CE0039CE001DCE000FCE0007CE0003CE0001CE0001CE0001CE0001C1619 +7D981C>I<03FFF0000FFFFC001E001E0038000700700003807000038070000380E00001C0E000 +01C0E00001C0E00001C0E00001C0E00001C0E00001C0E00001C0E00001C0E00001C0E00001C0E0 +0001C07000038070000380380007001F003E000FFFFC0001FFE0001A197F981C>I<FFFFFEFFFF +FE0038000038000038000038000038000038000038000038000038000038000038000038000038 +000038000038000038000038000038000038000038000038000038000038001719809817>84 +D E /Fp 12 122 df<1F0020804040C060C060C060C060C060C060C06060C060C01F000B0D7E8C +11>48 D<0800F8001800180018001800180018001800180018001800FF80090D7D8C11>I<1F80 +20E0707070300030006000E0018003100C101FE07FE0FFE00C0D7F8C11>I<0F8030E070707070 +70700070006000C00F8000E00070003800386038F038F038E07060E01F800D137F8C11>I<00C0 +00C001C002C006C004C008C018C010C020C040C0C0C0FFF800C000C000C000C000C007F80D137F +8C11>I<60C07F807F0048004000400040005F00618040C000C000E000E0E0E0E0E0E0C041C063 +801E000B137E8C11>I<0780086010E020E060004000C000CF00D180E0C0C060C060C060C06040 +60604020C031800F000B137E9211>I<40007FF87FF04020802080400080010001000300020006 +00060006000E000E000E000E000E0004000D147E8D11>I<0F80106020206030603070307C603E +C01F801FE031F060F0C038C018C018C018603030600F800D137F9211>I<1E00318060C040C0C0 +40C060C060C060C06060E031601E600060004000C0E080E18043003C000B137E8C11>I<0E3C13 +CE238E430C43000300030006000608C608E610CA2071C00F0D7F8C13>120 +D<38184C184C188C3098301830183030603060306030E011C00EC000C00080E180E30046003C00 +0D137F8C11>I E /Fq 29 122 df<FFC0FFC0FFC00A037D890F>45 D<3078F06005047C830D>I< +060F0F06000000000000000000003078F06008127C910D>58 D<007FF000078000070000070000 +0700000700000E00000E00000E00000E00001C00001C00001C00001C0000380000380000380000 +380000700000700000700000700060E000E0E000C0C00081C0008380004700003C0000141D7B9B +16>74 D<01FE0007F8003E000780002E000F00002E001700002E001700002E002700004E002E00 +004E004E00004E004E00004E008E00008E011C00008E011C00008E021C00008E021C0001070438 +000107043800010708380001071038000207107000020720700002072070000207407000040740 +E000040780E000040700E0000C0700E0001C0601E000FF861FFC00251C7D9B25>77 +D<01FFFC00003C070000380380003801C0003801C0003801C0007003C0007003C0007003C00070 +038000E0078000E0070000E00E0000E0380001FFE00001C0000001C0000001C000000380000003 +8000000380000003800000070000000700000007000000070000000F000000FFE000001A1C7D9B +1C>80 D<000F8400304C00403C0080180100180300180300180600100600100600000700000700 +0003E00003FC0001FF00007F800007C00001C00001C00000C00000C02000C02000C06001806001 +80600300600200F00400CC180083E000161E7D9C17>83 D<03CC063C0C3C181C38383038703870 +38E070E070E070E070E0E2C0E2C0E261E462643C380F127B9115>97 D<3F00070007000E000E00 +0E000E001C001C001C001C0039C03E60383038307038703870387038E070E070E070E060E0E0C0 +C0C1C0618063003C000D1D7B9C13>I<01F007080C08181C3838300070007000E000E000E000E0 +00E000E008E010602030C01F000E127B9113>I<001F8000038000038000070000070000070000 +0700000E00000E00000E00000E0003DC00063C000C3C00181C00383800303800703800703800E0 +7000E07000E07000E07000E0E200C0E200C0E20061E4006264003C3800111D7B9C15>I<01E007 +100C1018083810701070607F80E000E000E000E000E000E0086010602030C01F000D127B9113> +I<0003C0000670000C70001C60001C00001C0000380000380000380000380000380003FF800070 +0000700000700000700000700000E00000E00000E00000E00000E00001C00001C00001C00001C0 +0001C000038000038000038000030000030000070000C60000E60000CC00007800001425819C0D +>I<00F3018F030F06070E0E0C0E1C0E1C0E381C381C381C381C383830383038187818F00F7000 +70007000E000E0C0C0E1C0C3007E00101A7D9113>I<0FC00001C00001C0000380000380000380 +000380000700000700000700000700000E78000E8C000F0E000E0E001C0E001C0E001C0E001C0E +00381C00381C00381C00383800703880703880707080707100E03200601C00111D7D9C15>I<01 +800380010000000000000000000000000000001C002600470047008E008E000E001C001C001C00 +38003800710071007100720072003C00091C7C9B0D>I<1F800380038007000700070007000E00 +0E000E000E001C001C001C001C0038003800380038007000700070007000E400E400E400E40068 +003800091D7C9C0B>108 D<3C1E0780266318C04683A0E04703C0E08E0380E08E0380E00E0380 +E00E0380E01C0701C01C0701C01C0701C01C070380380E0388380E0388380E0708380E0710701C +0320300C01C01D127C9122>I<3C3C002646004687004707008E07008E07000E07000E07001C0E +001C0E001C0E001C1C00381C40381C40383840383880701900300E0012127C9117>I<01E00718 +0C0C180C380C300E700E700EE01CE01CE01CE018E038E030E06060C031801E000F127B9115>I< +07870004D98008E0C008E0C011C0E011C0E001C0E001C0E00381C00381C00381C0038180070380 +0703000707000706000E8C000E70000E00000E00001C00001C00001C00001C00003C0000FF8000 +131A7F9115>I<3C3C26C2468747078E068E000E000E001C001C001C001C003800380038003800 +7000300010127C9112>114 D<01F006080C080C1C18181C001F001FC00FF007F0007800386030 +E030C030806060C01F000E127D9111>I<00C001C001C001C00380038003800380FFE007000700 +07000E000E000E000E001C001C001C001C00384038403840388019000E000B1A7D990E>I<1E03 +00270700470700470700870E00870E000E0E000E0E001C1C001C1C001C1C001C1C003838803838 +801838801839001C5900078E0011127C9116>I<1E06270E470E4706870287020E020E021C041C +041C041C0818083808181018200C4007800F127C9113>I<1E0183270387470387470383870701 +8707010E07010E07011C0E021C0E021C0E021C0E04180C04181C04181C081C1C100C263007C3C0 +18127C911C>I<070E0019910010E38020E38041C30041C00001C00001C0000380000380000380 +00038000070200670200E70400CB04008B080070F00011127D9113>I<1E03270747074707870E +870E0E0E0E0E1C1C1C1C1C1C1C1C38383838183818381C7007F00070007000E0E0C0E1C0818047 +003C00101A7C9114>I E /Fr 1 66 df<00C00000C00000C00001600001600002300002300002 +3000041800041800080C000FFC00080C00100600100600300700FC1FC012117F9016>65 +D E /Fs 75 125 df<00FC000782000E07001C07001C02001C00001C00001C00001C0000FFFF00 +1C07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C0700FF1FE0 +1317809614>12 D<00FF000707000E07001C07001C07001C07001C07001C07001C0700FFFF001C +07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C07001C0700FFBFE013 +17809614>I<00FC7E000703C1000E0783801C0703801C0701001C0700001C0700001C0700001C +070000FFFFFF801C0703801C0703801C0703801C0703801C0703801C0703801C0703801C070380 +1C0703801C0703801C0703801C070380FF1FCFF01C1780961D>I<01C0000320000610000E1000 +0E10000E10000E20000E40000E80000780FE0700380700200B802013804031C04061E08060E100 +E07100E03A00E01C02700E0238370C0FC1F817177F961B>38 D<60F0F070101020204040040A7D +960A>I<0102040C1818303070606060E0E0E0E0E0E0E0E0E0E060606070303018180C04020108 +227D980E>I<8040203018180C0C0E060606070707070707070707070606060E0C0C1818302040 +8008227E980E>I<60F0F070101020204040040A7D830A>44 D<FF80FF80090280870C>I<60F0F0 +6004047D830A>I<07C018303018701C600C600CE00EE00EE00EE00EE00EE00EE00EE00EE00E60 +0C600C701C30181C7007C00F157F9412>48 D<03000700FF000700070007000700070007000700 +07000700070007000700070007000700070007007FF00C157E9412>I<0F8030E040708030C038 +E0384038003800700070006000C00180030006000C08080810183FF07FF0FFF00D157E9412>I< +0FE030306018701C701C001C00180038006007E000300018000C000E000EE00EE00EC00C401830 +300FE00F157F9412>I<00300030007000F001F001700270047008701870107020704070C070FF +FE0070007000700070007003FE0F157F9412>I<20303FE03FC0240020002000200020002F8030 +E020700030003800384038E038E0388030406020C01F000D157E9412>I<01F00608080C181C30 +1C70006000E000E3E0EC30F018F00CE00EE00EE00E600E600E300C3018183007C00F157F9412> +I<40007FFE7FFC7FF8C008801080200040008000800100010003000200060006000E000E000E00 +0E000E0004000F167E9512>I<07E018302018600C600C700C78183E101F600FC00FF018F8607C +601EC00EC006C006C004600C38300FE00F157F9412>I<07C0183030186018E00CE00CE00EE00E +E00E601E301E186E0F8E000E000C001C70187018603020C01F800F157F9412>I<60F0F0600000 +0000000060F0F060040E7D8D0A>I<1F8060E08070E070E070407000E001C00180030002000200 +020002000200000000000000000006000F000F0006000C177E9611>63 D<00FC000303000C00C0 +10002020781020C410418208438388830384870384870384870384870384870384830384438384 +41838820C5882078F01000000C001C0300F000FF0016177E961B>I<0010000038000038000038 +00005C00005C00005C00008E00008E00008E0001070001070003078002038002038007FFC00401 +C00401C00800E00800E01800E03800F0FE03FE17177F961A>I<FFFE001C03801C00E01C00601C +00701C00701C00701C00701C00E01C01C01FFF801FFFC01C00E01C00701C00301C00381C00381C +00381C00381C00701C00E01C01C0FFFF0015177F9619>I<00FC100383300E00B01C0070380030 +300030700010600010E00010E00000E00000E00000E00000E00000E00010600010700010300020 +3800201C00400E008003830000FC0014177E9619>I<FFFF001C01C01C00E01C00301C00381C00 +181C001C1C000C1C000E1C000E1C000E1C000E1C000E1C000E1C000E1C000C1C001C1C001C1C00 +381C00301C00601C01C0FFFF0017177F961B>I<FFFFE01C00E01C00601C00201C00101C00101C +00101C04001C04001C04001C0C001FFC001C0C001C04001C04081C04081C00081C00181C00101C +00101C00301C00F0FFFFF015177F9618>I<FFFFE01C00E01C00601C00201C00101C00101C0010 +1C04001C04001C04001C0C001FFC001C0C001C04001C04001C04001C00001C00001C00001C0000 +1C00001C0000FFC00014177F9617>I<007E080381980600580C00381800183000187000087000 +08E00008E00000E00000E00000E00000E003FEE000387000387000383000381800380C00380600 +380380D8007F0817177E961C>I<FF83FE1C00701C00701C00701C00701C00701C00701C00701C +00701C00701C00701FFFF01C00701C00701C00701C00701C00701C00701C00701C00701C00701C +0070FF83FE17177F961A>I<FFE00E000E000E000E000E000E000E000E000E000E000E000E000E +000E000E000E000E000E000E000E000E00FFE00B177F960D>I<0FFC00E000E000E000E000E000 +E000E000E000E000E000E000E000E000E000E000E000E0E0E0E0E0C1C061801F000E177E9612> +I<FF80FE1C00781C00601C00401C00801C01001C06001C08001C10001C38001C78001C9C001D0E +001E0E001C07001C03801C01C01C01C01C00E01C00701C00781C007CFF80FF18177F961B>I<FF +C0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C +00001C00201C00201C00201C00601C00601C00401C00C01C03C0FFFFC013177F9616>I<FE0003 +F81E0003C0170005C0170005C0170005C0138009C0138009C011C011C011C011C011C011C010E0 +21C010E021C0107041C0107041C0107041C0103881C0103881C0101D01C0101D01C0100E01C010 +0E01C0380E01C0FE040FF81D177F9620>I<FC00FE1E00381F001017001013801011C01011C010 +10E010107010103810103810101C10100E10100F101007101003901001D01001D01000F0100070 +100030380030FE001017177F961A>I<00FC000303000E01C01C00E03800703000307000386000 +18E0001CE0001CE0001CE0001CE0001CE0001CE0001C7000387000383000303800701C00E00E01 +C003030000FC0016177E961B>I<FFFE001C03801C00C01C00601C00701C00701C00701C00701C +00601C00C01C03801FFE001C00001C00001C00001C00001C00001C00001C00001C00001C00001C +0000FF800014177F9618>I<FFFC001C03801C00C01C00E01C00701C00701C00701C00701C00E0 +1C00C01C03801FFE001C07801C01C01C00E01C00E01C00E01C00E01C00E01C00E11C00E11C0072 +FF803C18177F961A>82 D<0FC4302C601C400CC004C004C004E00070007F003FE00FF801FC001C +000E0006800680068006C004E008D81087E00F177E9614>I<7FFFF86038184038084038088038 +048038048038040038000038000038000038000038000038000038000038000038000038000038 +0000380000380000380000380007FFC016177F9619>I<FF80FE1C00381C00101C00101C00101C +00101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00100E +0020060020030040018180007E0017177F961A>I<FF07FC3F803C01E00E001C00E004001C00E0 +04001C017004000E017008000E017008000E023808000702381000070238100007041C10000384 +1C200003841C200003880E200001C80E400001C80E400001D80F400000F007800000F007800000 +F007800000600300000060030000006003000021177F9624>87 D<FF83FC1F01E00E0080070080 +07810003820001C20001E40000E800007800007800003800007C00005E00008E00018700010780 +0203800601C00401E00C00E01C00F0FF03FE17177F961A>I<FFC03F801E001C000F0008000700 +1000078030000380200001C0400001E0400000E0800000F1800000710000003A0000003E000000 +1C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C000000FF8000 +191780961A>I<202040408080E0F0F060040A7D960A>96 D<1FC0386038301038003803F81E38 +30387038E039E039E07970FF1F1E100E7F8D12>I<FC00001C00001C00001C00001C00001C0000 +1C00001C00001C00001CF8001F06001C03001C03801C01801C01C01C01C01C01C01C01C01C0180 +1C03801C03001B0E0010F8001217809614>I<07F01838303870106000E000E000E000E0006000 +70083008183007C00D0E7F8D10>I<007E00000E00000E00000E00000E00000E00000E00000E00 +000E0007CE001C3E00300E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E00 +182E0007CFC012177F9614>I<0FC0186030307038E018FFF8E000E000E0006000700830101830 +07C00D0E7F8D10>I<03E006700E701C201C001C001C001C001C00FF801C001C001C001C001C00 +1C001C001C001C001C001C001C00FF800C1780960B>I<0F9E18E33060707070707070306018C0 +2F80200060003FE03FF83FFC600EC006C006C006600C38380FE010157F8D12>I<FC00001C0000 +1C00001C00001C00001C00001C00001C00001C00001C7C001D8E001E07001C07001C07001C0700 +1C07001C07001C07001C07001C07001C07001C0700FF9FE01317809614>I<183C3C1800000000 +007C1C1C1C1C1C1C1C1C1C1C1C1CFF081780960A>I<0300078007800300000000000000000000 +001F800380038003800380038003800380038003800380038003800380038003804380E300E700 +7C00091D82960B>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C3F80 +1C1C001C18001C20001C40001CC0001FE0001CF0001C70001C78001C3C001C1E001C1E00FF3FC0 +1217809613>I<FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00 +1C001C001C001C001C001C00FF80091780960A>I<FC7C1F001D8E63801E0781C01C0701C01C07 +01C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C0FF9FE7F81D +0E808D1E>I<FC7C001D8E001E07001C07001C07001C07001C07001C07001C07001C07001C0700 +1C07001C0700FF9FE0130E808D14>I<07C018303018600C600CE00EE00EE00EE00EE00E701C30 +18183007C00F0E7F8D12>I<FCF8001F0E001C03001C03801C01801C01C01C01C01C01C01C01C0 +1C01801C03801C07001F0E001CF8001C00001C00001C00001C00001C0000FF80001214808D14> +I<07C2001C2600381E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E001C2E +0007CE00000E00000E00000E00000E00000E00007FC012147F8D13>I<FCF01D381E381C101C00 +1C001C001C001C001C001C001C001C00FF800D0E808D0E>I<1F4060C0C040C040E000FF007F80 +1FC001E080608060C060E0C09F000B0E7F8D0E>I<080008000800180018003800FF8038003800 +3800380038003800380038403840384038401C800F000A147F930E>I<FC3F001C07001C07001C +07001C07001C07001C07001C07001C07001C07001C07001C0F000E170003E7E0130E808D14>I< +FE1F3C0E3C0C1C081C080E100E100720072003C003C003C001800180100E7F8D13>I<FCFE7C38 +38383838101C3C201C3C201C4C200E4E400E4E400E864007878007878007038003030003030016 +0E7F8D19>I<FE3F3C181C100E20074007C0038001C002E004F008701838383CFC7F100E7F8D13> +I<FE1F3C0E3C0C1C081C080E100E100720072003C003C003C00180018001000100E200E200A400 +780010147F8D13>I<FFF0C0E080E081C08380878007000E001E081C08381870107030FFF00D0E +7F8D10>I<FFFF801101808812>I<FFFFFFFFC02201808823>I E /Ft 14 +122 df<70F8F8F87000000070F8F8F870050D7D8C0B>58 D<001C0000001C0000003E0000003E +0000007F0000006F000000EF800000C7800000C780000183C0000183C0000301E0000301E00007 +FFF00007FFF0000E00F8000C0078000C007800FF01FF80FF01FF8019147F931C>65 +D<FFC0FF00FFC0FF001E0070001E00C0001E0380001E0700001E0E00001E1C00001E3C00001EFE +00001FDE00001F8F00001E0780001E03C0001E01E0001E01F0001E00F0001E007800FFC0FF80FF +C0FF8019147E931D>75 D<1FE078707838783C303C01FC1F3C783CF03CF03CF03C785F3F8F100D +7F8C12>97 D<FC0000FC00003C00003C00003C00003C00003C00003DF8003F0E003C07003C0380 +3C03C03C03C03C03C03C03C03C03C03C03803C07003E0E0031F80012147F9315>I<07F01C3C38 +3C703CF018F000F000F000F0007000380C1C1807F00E0D7F8C11>I<003F00003F00000F00000F +00000F00000F00000F0007EF001C1F00380F00700F00F00F00F00F00F00F00F00F00F00F00700F +00380F001C3FC007EFC012147F9315>I<0FC01C3038387018F01CF01CFFFCF000F0007000380C +1C1807F00E0D7F8C11>I<07E01C38781E700EF00FF00FF00FF00FF00F700E781E3C3C07E0100D +7F8C13>111 D<F8E0F9783A783A783C303C003C003C003C003C003C00FF00FF000D0D7F8C10> +114 D<1FE060E0C060C060FE007FC03FE01FF00070C030C030F060DF800C0D7F8C0F>I<0C000C +000C001C001C003FC0FFC03C003C003C003C003C003C003C603C603C601C400F800B127F910F> +I<FE7F1FFE7F1F3C1C0C3C3E1C1E3E181E3F180F67300F67B00FE7F007C3E007C3E00381C00381 +C0180D7F8C1B>119 D<FE0F80FE0F803E06001E0C001F0C000F18000F980007B00007F00003E0 +0003E00001E00001C00001C000618000F38000F30000E600007C000011137F8C14>121 +D E /Fu 81 125 df<007E1F0001C1B1800303E3C00703C3C00E03C1800E01C0000E01C0000E01 +C0000E01C0000E01C0000E01C000FFFFFC000E01C0000E01C0000E01C0000E01C0000E01C0000E +01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C000 +0E01C0007F87FC001A1D809C18>11 D<007E0001C1800301800703C00E03C00E01800E00000E00 +000E00000E00000E0000FFFFC00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 +C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07F87F8151D809C17>I<007FC001C1C003 +03C00703C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFFFC00E01C00E01C00E01C00E +01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07F +CFF8151D809C17>I<1C1C3C3870C0800607779C15>19 D<C0C061803F000C000A047B9915>I<01 +800E003800C00009047F8F0C>32 D<0F0000C0188000C030600380703807006027FB00E0100600 +E0100C00E0100C00E0101800E0101800E0103000E0106000602060007020C00030418000188180 +000F0303C00006062000060C10000C1C08001818080018380400303804006038040060380400C0 +380400C03804018038040300180803001C0806000C100C000620040003C01E217E9E23>37 +D<60F0F8680808081010204080050C7C9C0C>39 D<004000800100020006000C000C0018001800 +300030007000600060006000E000E000E000E000E000E000E000E000E000E000E000E000600060 +006000700030003000180018000C000C00060002000100008000400A2A7D9E10>I<8000400020 +00100018000C000C000600060003000300038001800180018001C001C001C001C001C001C001C0 +01C001C001C001C001C0018001800180038003000300060006000C000C00180010002000400080 +000A2A7E9E10>I<60F0F0701010101020204080040C7C830C>44 D<FFE0FFE00B0280890E>I<60 +F0F06004047C830C>I<00010003000600060006000C000C000C00180018001800300030003000 +60006000C000C000C0018001800180030003000300060006000C000C000C001800180018003000 +30003000600060006000C000C00010297E9E15>I<03C00C301818300C300C700E60066006E007 +E007E007E007E007E007E007E007E007E007E007E007E00760066006700E300C300C18180C3007 +E0101D7E9B15>I<030007003F00C7000700070007000700070007000700070007000700070007 +0007000700070007000700070007000700070007000F80FFF80D1C7C9B15>I<07C01830201C40 +0C400EF00FF80FF807F8077007000F000E000E001C001C00380070006000C00180030006010C01 +180110023FFE7FFEFFFE101C7E9B15>I<07E01830201C201C781E780E781E381E001C001C0018 +0030006007E00030001C001C000E000F000F700FF80FF80FF80FF00E401C201C183007E0101D7E +9B15>I<000C00000C00001C00003C00003C00005C0000DC00009C00011C00031C00021C00041C +000C1C00081C00101C00301C00201C00401C00C01C00FFFFC0001C00001C00001C00001C00001C +00001C00001C0001FFC0121C7F9B15>I<03E00C301008200C20066006600660067006780C3E08 +3FB01FE007F007F818FC307E601E600FC007C003C003C003C00360026004300C1C1007E0101D7E +9B15>56 D<03C00C301818300C700C600EE006E006E007E007E007E007E0076007700F300F1817 +0C2707C700060006000E300C780C78187010203030C00F80101D7E9B15>I<60F0F06000000000 +00000000000060F0F06004127C910C>I<7FFFFFC0FFFFFFE00000000000000000000000000000 +000000000000000000000000000000000000FFFFFFE07FFFFFC01B0C7E8F20>61 +D<0FE03038401CE00EF00EF00EF00E000C001C0030006000C00080018001000100010001000100 +01000000000000000000000003000780078003000F1D7E9C14>63 D<003F800000C06000030018 +00040004000800020010000100201F00802070808040E0404040C0384041C03840818038208380 +3820838038208380382083803820838038208180382041C0382040C0384040E078402070988020 +1F0F00100000000800000004000000030001E000C01F80003FF0001B1D7E9C20>I<0006000000 +06000000060000000F0000000F0000000F00000017800000178000001780000023C0000023C000 +0023C0000041E0000041E0000041E0000080F0000080F0000180F8000100780001FFF80003007C +0002003C0002003C0006003E0004001E0004001E000C001F001E001F00FF80FFF01C1D7F9C1F> +I<FFFFC00F00F00F00380F003C0F001C0F001E0F001E0F001E0F001E0F001C0F003C0F00780F01 +F00FFFE00F00780F003C0F001E0F000E0F000F0F000F0F000F0F000F0F000F0F001E0F001E0F00 +3C0F0078FFFFE0181C7E9B1D>I<001F808000E0618001801980070007800E0003801C0003801C +00018038000180780000807800008070000080F0000000F0000000F0000000F0000000F0000000 +F0000000F0000000F0000000700000807800008078000080380000801C0001001C0001000E0002 +00070004000180080000E03000001FC000191E7E9C1E>I<FFFFC0000F00F0000F003C000F000E +000F0007000F0007000F0003800F0003C00F0001C00F0001C00F0001E00F0001E00F0001E00F00 +01E00F0001E00F0001E00F0001E00F0001E00F0001C00F0001C00F0003C00F0003800F0007800F +0007000F000E000F001C000F007000FFFFC0001B1C7E9B20>I<FFFFFC0F003C0F000C0F00040F +00040F00060F00020F00020F02020F02000F02000F02000F06000FFE000F06000F02000F02000F +02000F02010F00010F00020F00020F00020F00060F00060F000C0F003CFFFFFC181C7E9B1C>I< +FFFFF80F00780F00180F00080F00080F000C0F00040F00040F02040F02000F02000F02000F0600 +0FFE000F06000F02000F02000F02000F02000F00000F00000F00000F00000F00000F00000F0000 +0F8000FFF800161C7E9B1B>I<001F808000E0618001801980070007800E0003801C0003801C00 +018038000180780000807800008070000080F0000000F0000000F0000000F0000000F0000000F0 +000000F000FFF0F0000F80700007807800078078000780380007801C0007801C0007800E000780 +07000B800180118000E06080001F80001C1E7E9C21>I<FFF3FFC00F003C000F003C000F003C00 +0F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000FFFFC +000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F00 +3C000F003C000F003C000F003C00FFF3FFC01A1C7E9B1F>I<FFF00F000F000F000F000F000F00 +0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F +00FFF00C1C7F9B0F>I<1FFF00F800780078007800780078007800780078007800780078007800 +780078007800780078007800787078F878F878F878F0F040E021C01F00101D7F9B15>I<FFF03F +E00F000F000F000C000F0008000F0010000F0020000F0040000F0080000F0100000F0200000F04 +00000F0E00000F1F00000F2F00000F2780000F4780000F83C0000F01E0000F01E0000F00F0000F +00F8000F0078000F003C000F003C000F001E000F001F000F001F80FFF07FF01C1C7E9B20>I<FF +F8000F80000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F +00000F00000F00000F00000F00000F00080F00080F00080F00180F00180F00100F00300F00700F +01F0FFFFF0151C7E9B1A>I<FF8000FF800F8000F8000F8000F8000BC00178000BC00178000BC0 +01780009E002780009E002780008F004780008F004780008F00478000878087800087808780008 +78087800083C107800083C107800083C107800081E207800081E207800081E207800080F407800 +080F40780008078078000807807800080780780008030078001C03007800FF8307FF80211C7E9B +26>I<FF007FC00F800E000F8004000BC0040009E0040009E0040008F0040008F8040008780400 +083C0400083C0400081E0400080F0400080F0400080784000807C4000803C4000801E4000801E4 +000800F40008007C0008007C0008003C0008003C0008001C0008000C001C000C00FF8004001A1C +7E9B1F>I<003F800000E0E0000380380007001C000E000E001C0007003C000780380003807800 +03C0780003C0700001C0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F0 +0001E0700001C0780003C0780003C0380003803C0007801C0007000E000E0007001C0003803800 +00E0E000003F80001B1E7E9C20>I<FFFF800F00E00F00780F003C0F001C0F001E0F001E0F001E +0F001E0F001E0F001C0F003C0F00780F00E00FFF800F00000F00000F00000F00000F00000F0000 +0F00000F00000F00000F00000F00000F0000FFF000171C7E9B1C>I<003F800000E0E000038038 +0007001C000E000E001C0007003C00078038000380780003C0780003C0700001C0F00001E0F000 +01E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0700001C0780003C0780003C038 +0003803C0E07801C1107000E208E000720DC0003A0F80000F0E020003FE0200000602000007060 +000078E000003FC000003FC000001F8000000F001B257E9C20>I<FFFF00000F01E0000F007800 +0F003C000F001C000F001E000F001E000F001E000F001E000F001C000F003C000F0078000F01E0 +000FFF00000F03C0000F00E0000F00F0000F0078000F0078000F0078000F0078000F0078000F00 +78000F0078100F0078100F0038100F003C20FFF01C20000007C01C1D7E9B1F>I<07E0801C1980 +300580700380600180E00180E00080E00080E00080F00000F800007C00007FC0003FF8001FFE00 +07FF0000FF80000F800007C00003C00001C08001C08001C08001C0C00180C00180E00300D00200 +CC0C0083F800121E7E9C17>I<7FFFFFC0700F01C0600F00C0400F0040400F0040C00F0020800F +0020800F0020800F0020000F0000000F0000000F0000000F0000000F0000000F0000000F000000 +0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000 +001F800003FFFC001B1C7F9B1E>I<FFF07FC00F000E000F0004000F0004000F0004000F000400 +0F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004 +000F0004000F0004000F0004000F0004000F0004000F0004000700080007800800038010000180 +100000C020000070C000001F00001A1D7E9B1F>I<FFE00FF01F0003C00F0001800F0001000F80 +0300078002000780020003C0040003C0040003C0040001E0080001E0080001F0080000F0100000 +F0100000F830000078200000782000003C4000003C4000003C4000001E8000001E8000001F8000 +000F0000000F00000006000000060000000600001C1D7F9B1F>I<FFE0FFE0FF1F001F003C1E00 +1E00180F001F00100F001F00100F001F001007801F00200780278020078027802003C027804003 +C043C04003C043C04003E043C04001E081E08001E081E08001E081E08000F100F10000F100F100 +00F100F100007900FA00007A007A00007A007A00003E007C00003C003C00003C003C00003C003C +00001800180000180018000018001800281D7F9B2B>I<7FF0FFC00FC03E000780180003C01800 +03E0100001E0200001F0600000F0400000788000007D8000003D0000001E0000001F0000000F00 +00000F8000000F80000013C0000023E0000021E0000041F00000C0F8000080780001007C000300 +3C0002001E0006001F001F003F80FFC0FFF01C1C7F9B1F>I<7FFFF07C01F07001E06003C06003 +C0400780400F80400F00401E00001E00003C00007C0000780000F00000F00001E00003E00003C0 +100780100780100F00101F00301E00203C00203C00607800E0F803E0FFFFE0141C7E9B19>90 +D<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 +C0FEFE07297C9E0C>I<FEFE060606060606060606060606060606060606060606060606060606 +06060606060606060606FEFE0729809E0C>93 D<0810204040808080B0F87830050C7D9C0C>96 +D<1FC000307000783800781C00301C00001C00001C0001FC000F1C00381C00701C00601C00E01C +40E01C40E01C40603C40304E801F870012127E9115>I<FC00001C00001C00001C00001C00001C +00001C00001C00001C00001C00001C00001C7C001D86001E03001C01801C01C01C00C01C00E01C +00E01C00E01C00E01C00E01C00E01C00C01C01C01C01801E030019060010F800131D7F9C17>I< +07E00C301878307870306000E000E000E000E000E000E00060007004300418080C3007C00E127E +9112>I<003F0000070000070000070000070000070000070000070000070000070000070003E7 +000C1700180F00300700700700600700E00700E00700E00700E00700E00700E007006007007007 +00300700180F000C370007C7E0131D7E9C17>I<03E00C301818300C700E6006E006FFFEE000E0 +00E000E00060007002300218040C1803E00F127F9112>I<00F8018C071E061E0E0C0E000E000E +000E000E000E00FFE00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 +0E007FE00F1D809C0D>I<00038003C4C00C38C01C3880181800381C00381C00381C00381C0018 +18001C38000C300013C0001000003000001800001FF8001FFF001FFF803003806001C0C000C0C0 +00C0C000C06001803003001C0E0007F800121C7F9215>I<FC00001C00001C00001C00001C0000 +1C00001C00001C00001C00001C00001C00001C7C001C87001D03001E03801C03801C03801C0380 +1C03801C03801C03801C03801C03801C03801C03801C03801C03801C0380FF9FF0141D7F9C17> +I<18003C003C0018000000000000000000000000000000FC001C001C001C001C001C001C001C00 +1C001C001C001C001C001C001C001C001C00FF80091D7F9C0C>I<00C001E001E000C000000000 +000000000000000000000FE000E000E000E000E000E000E000E000E000E000E000E000E000E000 +E000E000E000E000E000E000E060E0F0C0F1C061803E000B25839C0D>I<FC00001C00001C0000 +1C00001C00001C00001C00001C00001C00001C00001C00001C3FC01C0F001C0C001C08001C1000 +1C20001C40001CE0001DE0001E70001C78001C38001C3C001C1C001C0E001C0F001C0F80FF9FE0 +131D7F9C16>I<FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00 +1C001C001C001C001C001C001C001C001C001C001C001C00FF80091D7F9C0C>I<FC7E07E0001C +838838001D019018001E01E01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C00 +1C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C +00FF8FF8FF8021127F9124>I<FC7C001C87001D03001E03801C03801C03801C03801C03801C03 +801C03801C03801C03801C03801C03801C03801C03801C0380FF9FF014127F9117>I<03F0000E +1C00180600300300700380600180E001C0E001C0E001C0E001C0E001C0E001C060018070038030 +03001806000E1C0003F00012127F9115>I<FC7C001D86001E03001C01801C01C01C00C01C00E0 +1C00E01C00E01C00E01C00E01C00E01C01C01C01C01C01801E03001D06001CF8001C00001C0000 +1C00001C00001C00001C00001C0000FF8000131A7F9117>I<03C1000C3300180B00300F007007 +00700700E00700E00700E00700E00700E00700E00700600700700700300F00180F000C370007C7 +00000700000700000700000700000700000700000700003FE0131A7E9116>I<FCE01D301E781E +781C301C001C001C001C001C001C001C001C001C001C001C001C00FFC00D127F9110>I<1F9030 +704030C010C010E010F8007F803FE00FF000F880388018C018C018E010D0608FC00D127F9110> +I<04000400040004000C000C001C003C00FFE01C001C001C001C001C001C001C001C001C001C10 +1C101C101C101C100C100E2003C00C1A7F9910>I<FC1F801C03801C03801C03801C03801C0380 +1C03801C03801C03801C03801C03801C03801C03801C03801C07800C07800E1B8003E3F014127F +9117>I<FF07E03C03801C01001C01000E02000E020007040007040007040003880003880003D8 +0001D00001D00000E00000E00000E00000400013127F9116>I<FF3FCFE03C0F03801C0701801C +0701001C0B01000E0B82000E0B82000E1182000711C4000711C4000720C40003A0E80003A0E800 +03C0680001C0700001C0700001803000008020001B127F911E>I<7F8FF00F03800F0300070200 +03840001C80001D80000F00000700000780000F800009C00010E00020E000607000403801E07C0 +FF0FF81512809116>I<FF07E03C03801C01001C01000E02000E02000704000704000704000388 +0003880003D80001D00001D00000E00000E00000E000004000004000008000008000F08000F100 +00F300006600003C0000131A7F9116>I<7FFC70386038407040F040E041C003C0038007000F04 +0E041C043C0C380870087038FFF80E127F9112>I<FFFFF01401808B15>I<FFFFFFFFFF80290180 +8B2A>I E /Fv 53 122 df<003FC00001F0300003C0380007C07C000F807C000F807C000F8038 +000F8000000F8000000F8000000F800000FFFFFC00FFFFFC000F807C000F807C000F807C000F80 +7C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F +807C007FE1FF807FE1FF80191D809C1B>12 D<003FFC0001F07C0003C07C0007C07C000F807C00 +0F807C000F807C000F807C000F807C000F807C000F807C00FFFFFC00FFFFFC000F807C000F807C +000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F80 +7C000F807C000F807C007FF3FF807FF3FF80191D809C1B>I<78FCFCFEFE7A0202040408083040 +070E7D9C0D>39 D<0020004001800380030006000E001C001C003C0038003800780078007800F8 +00F000F000F000F000F000F000F000F000F000F800780078007800380038003C001C001C000E00 +0600030003800180004000200B297C9E13>I<800040003000380018000C000E00070007000780 +0380038003C003C003C003E001E001E001E001E001E001E001E001E001E003E003C003C003C003 +8003800780070007000E000C00180038003000400080000B297D9E13>I<78FCFCFEFE7A020204 +0408083040070E7D850D>44 D<000180000380000380000700000700000700000E00000E00001C +00001C00001C0000380000380000380000700000700000E00000E00000E00001C00001C00001C0 +000380000380000380000700000700000E00000E00000E00001C00001C00001C00003800003800 +00700000700000700000E00000E00000C0000011297D9E18>47 D<03F8000F1E001C07003C0780 +3803807803C07803C07803C0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0 +F803E0F803E0F803E07803C07803C03803803C07801C07000F1E0003F800131B7E9A18>I<78FC +FCFCFC7800000000000078FCFCFCFC7806127D910D>58 D<0FF0303C601EF01FF81FF81F701F00 +3E003C007000E001C00180018003000300030003000300000000000000000007800FC00FC00FC0 +0FC00780101D7D9C17>63 D<00038000000380000007C0000007C0000007C000000FE000000FE0 +00001FF000001BF000001BF0000031F8000031F8000061FC000060FC0000E0FE0000C07E0000C0 +7E0001803F0001FFFF0003FFFF8003001F8003001F8006000FC006000FC00E000FE00C0007E0FF +C07FFEFFC07FFE1F1C7E9B24>65 D<FFFFF800FFFFFF000FC01F800FC00FC00FC007C00FC007E0 +0FC007E00FC007E00FC007E00FC007E00FC007C00FC00F800FC03F000FFFFE000FC00F800FC007 +C00FC007E00FC003E00FC003F00FC003F00FC003F00FC003F00FC003F00FC007E00FC007E00FC0 +1FC0FFFFFF00FFFFFC001C1C7E9B22>I<001FE02000FFF8E003F80FE007C003E00F8001E01F00 +00E03E0000E03E0000607E0000607C000060FC000000FC000000FC000000FC000000FC000000FC +000000FC000000FC0000007C0000607E0000603E0000603E0000C01F0000C00F80018007C00300 +03F80E0000FFFC00001FE0001B1C7D9B22>I<FFFFF800FFFFFF000FC01FC00FC007E00FC001F0 +0FC001F80FC000F80FC000FC0FC0007C0FC0007C0FC0007E0FC0007E0FC0007E0FC0007E0FC000 +7E0FC0007E0FC0007E0FC0007E0FC0007C0FC0007C0FC0007C0FC000F80FC000F80FC001F00FC0 +07E00FC01FC0FFFFFF00FFFFF8001F1C7E9B25>I<FFFFFF00FFFFFF000FC01F000FC007000FC0 +03000FC003800FC003800FC181800FC181800FC181800FC180000FC380000FFF80000FFF80000F +C380000FC180000FC180000FC180600FC180600FC000E00FC000C00FC000C00FC001C00FC001C0 +0FC003C00FC00F80FFFFFF80FFFFFF801B1C7E9B1F>I<FFFFFF00FFFFFF000FC01F000FC00700 +0FC003000FC003800FC003800FC001800FC181800FC181800FC180000FC180000FC380000FFF80 +000FFF80000FC380000FC180000FC180000FC180000FC180000FC000000FC000000FC000000FC0 +00000FC000000FC00000FFFF0000FFFF0000191C7E9B1E>I<000FF008007FFE3801FC07F807E0 +01F80F8000781F0000783F0000383E0000387E0000187C000018FC000000FC000000FC000000FC +000000FC000000FC000000FC007FFFFC007FFF7C0001F87E0001F83E0001F83F0001F81F0001F8 +0F8001F807E001F801FC07F8007FFE78000FF818201C7D9B26>I<FFFFFFFF07E007E007E007E0 +07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007 +E0FFFFFFFF101C7F9B12>73 D<07FFF007FFF0001F80001F80001F80001F80001F80001F80001F +80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80301F80781F +80FC1F80FC1F80FC1F00783E00387C000FF000141C7F9B19>I<FFFF00FFFF000FC0000FC0000F +C0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000F +C0030FC0030FC0030FC0070FC0070FC0060FC00E0FC01E0FC07EFFFFFEFFFFFE181C7E9B1D>76 +D<FFC00003FFFFE00007FF0FE00007F00DF0000DF00DF0000DF00DF0000DF00CF80019F00CF800 +19F00C7C0031F00C7C0031F00C3E0061F00C3E0061F00C1F00C1F00C1F00C1F00C1F00C1F00C0F +8181F00C0F8181F00C07C301F00C07C301F00C03E601F00C03E601F00C01FC01F00C01FC01F00C +01FC01F00C00F801F00C00F801F0FFC0701FFFFFC0701FFF281C7E9B2D>I<FFE003FFFFE003FF +0FF000300FF800300DFC00300CFE00300C7E00300C3F00300C1F80300C1FC0300C0FE0300C07F0 +300C03F0300C01F8300C01FC300C00FE300C007F300C003F300C001FB00C001FF00C000FF00C00 +07F00C0003F00C0001F00C0000F00C0000F0FFC00070FFC00030201C7E9B25>I<003FE00001F0 +7C0003C01E000F800F801F0007C01E0003C03E0003E07E0003F07C0001F07C0001F0FC0001F8FC +0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F87C0001F07E0003F07E0003F0 +3E0003E03F0007E01F0007C00F800F8003C01E0001F07C00003FE0001D1C7D9B24>I<FFFFF800 +FFFFFE000FC03F800FC00F800FC007C00FC007E00FC007E00FC007E00FC007E00FC007E00FC007 +C00FC007C00FC00F800FC03F000FFFFC000FC000000FC000000FC000000FC000000FC000000FC0 +00000FC000000FC000000FC000000FC000000FC00000FFFC0000FFFC00001B1C7E9B21>I<FFFF +F00000FFFFFE00000FC03F00000FC00F80000FC007C0000FC007E0000FC007E0000FC007E0000F +C007E0000FC007E0000FC007C0000FC00F80000FC03E00000FFFF000000FC07C00000FC03E0000 +0FC03F00000FC01F80000FC01F80000FC01F80000FC01F80000FC01F80000FC01F80000FC01F81 +800FC01F81800FC00FC180FFFC07C300FFFC01FE00211C7E9B24>82 D<07F8201FFEE03C07E078 +01E07000E0F000E0F00060F00060F80000FE0000FFE0007FFE003FFF003FFF800FFFC007FFE000 +7FE00003F00001F00000F0C000F0C000F0C000E0E000E0F001C0FC03C0EFFF0083FC00141C7D9B +1B>I<7FFFFFE07FFFFFE0781F81E0701F80E0601F8060E01F8070C01F8030C01F8030C01F8030 +C01F8030001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80 +00001F8000001F8000001F8000001F8000001F8000001F8000001F800007FFFE0007FFFE001C1C +7E9B21>I<FFFC03FFFFFC03FF0FC000300FC000300FC000300FC000300FC000300FC000300FC0 +00300FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC000300F +C000300FC000300FC0003007C0003007C0006003E000E001F001C000FC0780007FFE00000FF800 +201C7E9B25>I<FFFC7FFE0FFCFFFC7FFE0FFC0FC007E000C00FC007F000C00FE003F001C007E0 +03F0018007E007F8018003F007F8030003F007F8030003F80CFC070001F80CFC060001F81CFE06 +0001FC187E0E0000FC187E0C0000FC387F0C00007E303F1800007E303F1800007F601FB800003F +601FB000003FE01FF000003FC00FF000001FC00FE000001FC00FE000000F8007C000000F8007C0 +00000F0003C0000007000380000007000380002E1C7F9B31>87 D<7FFE1FFE007FFE1FFE0007F0 +01800003F803800001FC07000000FC06000000FE0C0000007F1C0000003F380000003FB0000000 +1FE00000000FE00000000FE000000007F000000003F800000007F80000000FFC0000000CFE0000 +00187E000000387F000000703F800000601F800000C01FC00001C00FE000018007F000030007F0 +00FFF03FFF80FFF03FFF80211C7F9B24>I<0FF8001C1E003E0F803E07803E07C01C07C00007C0 +007FC007E7C01F07C03C07C07C07C0F807C0F807C0F807C0780BC03E13F80FE1F815127F9117> +97 D<FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F3F80 +1FE1E01F80701F00781F003C1F003C1F003E1F003E1F003E1F003E1F003E1F003E1F003C1F003C +1F00781F80701EC1E01C3F00171D7F9C1B>I<03FC000E0E001C1F003C1F00781F00780E00F800 +00F80000F80000F80000F80000F800007800007801803C01801C03000E0E0003F80011127E9115 +>I<000FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F00001F001F9F00F +07F01C03F03C01F07801F07801F0F801F0F801F0F801F0F801F0F801F0F801F07801F07801F03C +01F01C03F00F0FFE03F9FE171D7E9C1B>I<01FC000F07001C03803C01C07801C07801E0F801E0 +F801E0FFFFE0F80000F80000F800007800007C00603C00601E00C00F038001FC0013127F9116> +I<007F0001E38003C7C00787C00F87C00F83800F80000F80000F80000F80000F8000FFF800FFF8 +000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80 +000F80007FF8007FF800121D809C0F>I<03F8F00E0F381E0F381C07303C07803C07803C07803C +07801C07001E0F000E0E001BF8001000001800001800001FFF001FFFC00FFFE01FFFF07801F8F0 +0078F00078F000787000707800F01E03C007FF00151B7F9118>I<FF0000FF00001F00001F0000 +1F00001F00001F00001F00001F00001F00001F00001F0FC01F31E01F40F01F80F81F80F81F00F8 +1F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F8FFE7FFFFE7FF181D7F +9C1B>I<1E003F003F003F003F001E00000000000000000000000000FF00FF001F001F001F001F +001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B1E7F9D0E>I<FF0000FF00001F +00001F00001F00001F00001F00001F00001F00001F00001F00001F0FF81F0FF81F03801F07001F +0C001F18001F70001FF8001FFC001FBC001F3E001F1F001F0F001F0F801F07C01F03E0FFC7FCFF +C7FC161D7F9C19>107 D<FF00FF001F001F001F001F001F001F001F001F001F001F001F001F00 +1F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B1D7F9C0E>I<FF0F +C07E00FF31E18F001F40F207801F80FC07C01F80FC07C01F00F807C01F00F807C01F00F807C01F +00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C0 +FFE7FF3FF8FFE7FF3FF825127F9128>I<FF0FC0FF31E01F40F01F80F81F80F81F00F81F00F81F +00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F8FFE7FFFFE7FF18127F911B>I< +01FC000F07801C01C03C01E07800F07800F0F800F8F800F8F800F8F800F8F800F8F800F87800F0 +7800F03C01E01E03C00F078001FC0015127F9118>I<FF3F80FFE1E01F80F01F00781F007C1F00 +3C1F003E1F003E1F003E1F003E1F003E1F003E1F003C1F007C1F00781F80F01FC1E01F3F001F00 +001F00001F00001F00001F00001F0000FFE000FFE000171A7F911B>I<FE3E00FE47001E8F801E +8F801E8F801F07001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0000FF +F000FFF00011127F9114>114 D<1FD830786018E018E018F000FF807FE07FF01FF807FC007CC0 +1CC01CE01CE018F830CFC00E127E9113>I<0300030003000300070007000F000F003FFCFFFC1F +001F001F001F001F001F001F001F001F001F0C1F0C1F0C1F0C0F08079803F00E1A7F9913>I<FF +07F8FF07F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F +00F81F01F80F01F80786FF01F8FF18127F911B>I<FFC1FCFFC1FC1F00601F80E00F80C00FC0C0 +07C18007C18003E30003E30001F60001F60001FE0000FC0000FC0000780000780000300016127F +9119>I<FF8FF8FEFF8FF8FE1F03E0301F03E0301F83E0700F83F0600F86F06007C6F0C007CEF8 +C007EC79C003EC7D8003F83D8001F83F0001F83F0001F01F0000F01E0000E00E0000E00E001F12 +7F9122>I<FFC7FCFFC7FC1F81800F838007C70003EE0001FC0001F80000F800007C0000FE0001 +DF00039F00070F800607C00C03E0FF07FCFF07FC16127F9119>I<FFC1FCFFC1FC1F00601F80E0 +0F80C00FC0C007C18007C18003E30003E30001F70001F60000FE0000FC0000FC00007800007800 +003000003000007000706000F86000F8C000F980007300003E0000161A7F9119>I +E end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300 +TeXDict begin @a4 +%%EndSetup +%%Page: 1 1 +bop -118 15 1063 2 v -118 81 a Fv(P)o(aradigms:)19 b(Just)c(a)h(little)c(bit) +j(of)g(P)o(ostScript)-68 159 y Fu(Kees)g(v)n(an)e(der)i(Laan)-118 +238 y Ft(Keyw)o(ords:)60 b Fs(Declarativ)o(e)11 b(program,)g(education,)f +(EPS,)j(Esc)o(her,)f(graph-)-118 280 y(ics,)i(imp)q(erativ)o(e)d(co)q(de,)i +(\(L)243 274 y Fr(A)265 280 y Fs(\)T)298 286 y(E)318 280 y(X)q(,)h(math)f +(graphs,)g(MET)m(AF)o(ONT,)j(merging)-118 321 y(EPS)f(and)f(\(L)62 +315 y Fr(A)84 321 y Fs(\)T)117 327 y(E)137 321 y(X)q(,)h(MetaP)o(ost,)g(mfto) +q(eps,)e(P)o(ostScript,)h(sidew)o(a)o(ys)g(tables,)-118 363 +y(text)c(along)g(curv)o(ed)g(paths.)341 421 y Ft(Abstract)-68 +475 y Fs(It)e(is)h(all)f(ab)q(out)f(creating)g(EPS|with)h(graphics|to)e(b)q +(e)j(merged)d(with)-68 516 y(\(L)-43 510 y Fr(A)-21 516 y Fs(\)T)12 +522 y(E)32 516 y(X)15 b(scripts.)22 b(The)14 b(emphasis)e(is)j(on)e(creating) +f(ra)o(w)j(P)o(ostScript)-68 558 y(for)c(simple)f(symmetrical)f(pictures.)14 +b(Asides,)e(lik)o(e)f(incorp)q(oratin)o(g)e(ac-)-68 599 y(curate)g(graphs)g +(of)h(math)g(functions,)e(t)o(yp)q(esetting)g(text)i(along)f(curv)o(ed)-68 +641 y(paths,)17 b(or)g(tables)f(set)g(sidew)o(a)o(ys)h(ha)o(v)o(e)f(b)q(een)g +(addressed.)30 b(A)17 b(p)q(o)q(or)-68 682 y(man's)7 b(mfto)q(eps)g(approac)o +(h)f(is)j(touc)o(hed)d(up)q(on:)13 b(\(declarativ)o(e)o(\))6 +b(MET)m(A-)-68 724 y(F)o(ONT)13 b(in)o(to)d(\(imp)q(erativ)o(e\))e(P)o +(ostScript.)-118 878 y Fv(BLUe's)15 b(Design)f(X)-118 956 y +Fu(Hi)j(folks.)26 b(The)18 b(user's)g(guide)f(whic)o(h)g(comes)g(with)f +(BLUe's)i(for-)-118 1006 y(mat)9 b(system|Publishing)h(with)h(T)448 +1013 y(E)471 1006 y(X,)g(PWT)g(for)g(short|is)g(pro-)-118 1056 +y(cessed)h Fq(c)n(ompletely)i Fu(b)o(y)d(T)282 1063 y(E)305 +1056 y(X,)f Fq(no)k Fu(other)d(to)q(ols)f(suc)o(h)h(as)g(P)o(ostScript)-118 +1105 y(are)20 b(needed.)92 1090 y Fp(1)148 1105 y Fu(Ho)o(w)o(ev)o(er,)h(of)e +(late)g(I)h(exercised)h Fo(MET)o(AF)n(ONT)p Fu(|)-118 1155 +y(w)o(ell,)14 b(ev)o(en)o(tually)g(MetaP)o(ost)h(with)g(the)g(help)g(of)f +(Jos)i(Winnink|)-118 1205 y(for)f(graphics)g(to)g(b)q(e)g(included)h(in)e(T) +461 1213 y(E)484 1205 y(X)h(do)q(cumen)o(ts,)g(and)g(\014nally)-118 +1255 y(em)o(bark)o(ed)e(P)o(ostScript)i(straigh)o(ta)o(w)o(a)o(y)d(to)i +(create)h(EPS)g(pictures.)p 306 1797 215 2 v 305 1851 2 56 +v 520 1851 V 306 1851 215 2 v 388 1828 a(.ps)p 413 1796 1 54 +v 300 1726 a(dvips,)e(or)h Fn(:)7 b(:)g(:)91 1689 y Fm(\013)p +117 1689 297 1 v 414 1689 V 594 w(\010)p 91 1715 1 2 v 735 +1715 V 91 1717 V 735 1717 V 91 1743 a(\012)p 117 1743 297 1 +v 414 1743 V 594 w(\011)p 198 1689 1 54 v 92 1582 215 2 v 91 +1636 2 56 v 305 1636 V 92 1636 215 2 v 164 1613 a Fu(.eps)p +198 1582 1 54 v 112 1515 a(MetaP)o(ost)91 1475 y Fm(\013)p +117 1475 83 1 v 200 1475 V 165 w(\010)p 91 1501 1 2 v 306 1501 +V 91 1503 V 306 1503 V 91 1528 a(\012)p 117 1528 83 1 v 200 +1528 V 165 w(\011)p 198 1474 1 54 v 92 1368 215 2 v 91 1422 +2 56 v 305 1422 V 92 1422 215 2 v 164 1399 a Fu(.mp)p 627 1689 +1 54 v 521 1582 215 2 v 520 1636 2 56 v 734 1636 V 521 1636 +215 2 v 594 1623 a(.dvi)p 627 1582 1 54 v 541 1512 a(\(an)o(y\)T)661 +1519 y(E)684 1512 y(X)520 1475 y Fm(\013)p 546 1475 83 1 v +629 1475 V 165 w(\010)p 520 1501 1 2 v 735 1501 V 520 1503 +V 735 1503 V 520 1528 a(\012)p 546 1528 83 1 v 629 1528 V 165 +w(\011)p 627 1474 1 54 v 521 1368 215 2 v 520 1422 2 56 v 734 +1422 V 521 1422 215 2 v 594 1407 a Fu(.tex)p 687 1362 54 1 +v 740 1415 1 54 v 692 1357 54 1 v 745 1410 1 54 v 757 1367 +a Fl(\(e\)psfig)-68 1921 y Fu(P)o(ostScript)k(is)f(in)o(v)o(olun)o(tary)f +(needed)j(to)f(\(electronically\))f(paste)-118 1971 y(up)k(the)g(graphics,)g +(and)g(as)g(resulting)g(\014le)g(format.)694 1956 y Fp(2)-68 +2022 y Fu(If)f(w)o(e)h(come)f(to)h(think)g(of)f(graphics)h(as)92 +2100 y(just)g(doing)f(the)i(`righ)o(t')d(strok)o(es)j(or)f(\014lls)-118 +2178 y(then)i(P)o(ostScript)h(pro)o(vides)e(the)i(means)d(for)i(this:)21 +b(lines,)15 b(splines)-118 2228 y(and)e(circular)i(arcs,)f(to)f(b)q(e)i(dra)o +(wn)e(or)h(\014lled.)593 2213 y Fp(3)630 2228 y Fu(I)f(use)i(the)f(sidestep) +118 2307 y Fo(MET)o(AF)n(ONT)h Fk(!)p Fu(MetaP)o(ost)f Fk(!)f +Fu(EPS)-118 2385 y(for)c(general)h(pictures)h(but)f(also)f(for)g(obtaining)f +(the)j(righ)o(t)e(\(con)o(trol\))-118 2435 y(p)q(oin)o(ts)j(explicitly)f +(from)f(a)h(decalarativ)o(e)h(sp)q(eci\014cation)h(in)e Fo(MET)o(A)p +Fu(-)-118 2484 y Fo(F)n(ONT)p Fu(,)j(as)g(sho)o(wn)f(b)o(y)h(Esc)o(her's)i +(knot)d(at)h(the)g(end.)700 2469 y Fp(4)p -118 2534 600 2 v +-154 2568 a Fj(1)-118 2580 y Fs(Nob)q(o)q(dy)g(kno)o(ws)g(what)g(the)h +(future)e(has)h(in)h(store,)f(but)g(for)g(the)h(momen)o(t)d(I)-118 +2623 y(consider)f(it)j(a)f(go)q(o)q(d)g(thing)f(that)g(the)h(PWT)i(guide)d +(can)g(b)q(e)i(pro)q(cessed)d(just)-118 2665 y(b)o(y)g(T)-50 +2671 y(E)-30 2665 y(X)q(,)g(w)o(ell)h Fi(:)5 b(:)h(:)g Fs(with)11 +b(BLUe's)h(format.)-154 2697 y Fj(2)-118 2709 y Fs(F)m(or)h(exc)o(hange)e +(the)i Fh(.tex)g Fs(and)f(\(hand-co)q(ded\))e Fh(.eps)j Fs(\014les)g(are)g(m) +o(uc)o(h)f(b)q(etter)-118 2752 y(suited)d(b)q(ecause)f(of)h(their)g +(conciseness.)j(This)f(can't)d(b)q(e)i(b)q(eaten,)e(not)i(ev)o(en)f(b)o(y) +-118 2794 y(Adob)q(e's)h(PDF|P)o(ortable)g(Do)q(cumen)o(t)f(F)m(ormat.)-154 +2826 y Fj(3)-118 2838 y Fs(P)o(ostScript)g(I)q(I)i(also)g(pro)o(vides)e(for)i +(colors)g(and)f(pro)q(cessing)f(in)i(a)h(net)o(w)o(ork.)-154 +2870 y Fj(4)-118 2882 y Fs(Another)18 b(w)o(a)o(y)h(for)g(arriving)e(at)i +(the)g(EPS)g(co)q(de)f(is)i(to)f(use)g(Jac)o(k)o(o)o(wski's)-118 +2924 y Fh(mftoeps)9 b Fs(pac)o(k)n(age)g(or)j(to)f(use)g(MetaP)o(ost.)-118 +-55 y Fg(MAPS)g Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1437 781 y Fu(P/G-script)1428 +745 y Fm(\013)p 1454 745 83 1 v 1537 745 V 164 w(\010)p 1428 +771 1 2 v 1642 771 V 1428 773 V 1642 773 V 1428 798 a(\012)p +1454 798 83 1 v 1537 798 V 164 w(\011)p 1535 744 1 54 v 1428 +638 215 2 v 1427 692 2 56 v 1642 692 V 1428 692 215 2 v 1510 +669 a Fu(.ps)p 1535 637 1 54 v 1487 567 a(dvips)1428 530 y +Fm(\013)p 1454 530 83 1 v 1537 530 V 164 w(\010)p 1428 556 +1 2 v 1642 556 V 1428 558 V 1642 558 V 1428 584 a(\012)p 1454 +584 83 1 v 1537 584 V 164 w(\011)p 1535 530 1 54 v 1428 423 +215 2 v 1427 477 2 56 v 1642 477 V 1428 477 215 2 v 1501 464 +a Fu(.dvi)p 1594 418 54 1 v 1648 471 1 54 v 1600 412 54 1 v +1653 465 1 54 v 1664 423 a Fl(.eps)p 1535 423 V 1448 353 a +Fu(\(an)o(y\)T)1568 360 y(E)1591 353 y(X)1428 316 y Fm(\013)p +1454 316 83 1 v 1537 316 V 164 w(\010)p 1428 342 1 2 v 1642 +342 V 1428 344 V 1642 344 V 1428 369 a(\012)p 1454 369 83 1 +v 1537 369 V 164 w(\011)p 1535 315 1 54 v 1428 209 215 2 v +1427 263 2 56 v 1642 263 V 1428 263 215 2 v 1501 248 a Fu(.tex)p +1594 203 54 1 v 1648 256 1 54 v 1600 198 54 1 v 1653 251 1 +54 v 1664 208 a Fl(\(e\)psfig)p 1535 208 V 1482 142 a Fu(editor)1428 +101 y Fm(\013)p 1454 101 83 1 v 1537 101 V 164 w(\010)p 1428 +127 1 2 v 1642 127 V 1428 129 V 1642 129 V 1428 155 a(\012)p +1454 155 83 1 v 1537 155 V 164 w(\011)p 1643 128 54 1 v 1696 +181 1 54 v 1696 396 1 161 v 1054 875 a Fu(With)k(resp)q(ect)j(to)d(graphics)h +(P)o(ostScript)g(can)g(b)q(e)h(seen)f(as)g(a)1004 925 y Fq(little)15 +b Fu(language)d(in)g(the)i(UNIX)f(tradition.)1684 910 y Fp(5)1720 +925 y Fu(A)g(little)g(bit)f(of)h(P)o(ost-)1004 975 y(Script)i(adheres)i(the)e +(80\045{20\045)e(adage:)20 b(80\045)14 b(of)g(the)i(e\013ects)h(\(or)1004 +1025 y(more\))c(with)h(20\045)e(of)i(the)g(energy)h(\(or)f(less\).)1054 +1077 y(One)25 b(can)h(with)e(a)h(little)f(kno)o(wledge)h(of)f(P)o(ostScript)i +(co)q(de)1004 1127 y(graphics)19 b(immedia)o(tely)d(and)j Fq(c)n(ompletely)j +Fu(in)c(P)o(ostScript.)33 b(The)1004 1177 y(more)8 b(so)i(b)q(ecause)h(of)d +(the)i(ubiquitous)f(public)g(domain)e(GhostScript)1004 1227 +y(preview)o(ers)16 b(to)f(v)o(erify)g(the)g(result,)h(next)f(to)g(of)f +(course)i(the)g(P)o(ost-)1004 1277 y(Script)e(laser)g(prin)o(ters.)1054 +1329 y(F)m(urthermore,)f(text)i(is)f(just)h(a)f(sp)q(ecial)g(case)h(of)f +(graphics,)g(and)1004 1379 y(merging)i(just)h(a)g(little)g(bit)g(of)f +(text|malenki)f(Russians)j(w)o(ould)1004 1429 y(sa)o(y|with)13 +b(the)h(graphics)g(go)q(es)h(equally)e(simple)f(at)i(\014rst)h(glance.)1054 +1482 y(And)c(to)h(end)g(the)g(lo)o(v)o(esong)e(the)i(inclusion)f(of)g +(accurate)i(graphs)1004 1531 y(of)21 b(mathematical)d(functions)j(go)q(es)h +(w)o(ell)e(via)h(co)q(ding)g(these)h(in)1004 1581 y(P)o(ostScript)k(and)g +(including)f(these)i(as)f(\014gures.)54 b(\(Of)26 b(course)1004 +1631 y(Hobb)o(y's)19 b(graph)f(extension)i(could)f(b)q(e)g(used)h(as)f(w)o +(ell,)g(or)g(other)1004 1681 y(adv)n(anced)12 b(graphics)g(pac)o(k)n(ages.\)) +17 b(This)11 b(is)h(illustrated)f(b)o(y)h(a)f(graph)1004 1731 +y(of)i(the)i(sine)f(function)g(to)f(con)o(v)o(ey)h(the)h(idea.)1054 +1783 y(PStric)o(ks)h(is)g(ab)q(out)f Fq(interfacing)p Fu(.)23 +b(Not)16 b(assuming)e(kno)o(wledge)1004 1833 y(of)c(P)o(ostScript.)17 +b(This)10 b(note)h(discusses)h(mainly)c Fq(mer)n(ging)p Fu(.)16 +b(Is)11 b(ab)q(out)1004 1883 y(extending)22 b(y)o(our)f(T)1327 +1890 y(E)1350 1883 y(Xp)q(ertise)i(with)e(just)g(a)g(little|tsjut-tsjut)1004 +1933 y(Russians)13 b(w)o(ould)g(sa)o(y|kno)o(wledge)g(of)f(P)o(ostScript)j +(rew)o(arded)f(b)o(y)1004 1982 y(high)f(returns.)1054 2035 +y(Belo)o(w)19 b(I'll)e(summarize)h(what)h(is)g(needed)h(from)e(P)o +(ostScript,)1004 2085 y(and)11 b(illustrate)g(the)g(use)h(of)f(it)f(with)h(a) +g(few)g(examples,)f(in)o(tro)q(ducing)1004 2135 y(en)k(route)h(the)f(op)q +(erators)h(w)o(e)f(need)h(giv)o(en)e(the)i(example.)1004 2248 +y Fv(P)o(ostScript)1004 2367 y(Pro)q(cessing)54 b Fu(P)o(ostScript)13 +b(comes)f(with)g(a)g(user's)i(guide)e(\(co)q(ok-)1004 2417 +y(b)q(o)q(ok\))21 b(and)h(reference)i(man)o(ual,)c(the)i(so-called)f(blue)h +(and)f(red)1004 2467 y(b)q(o)q(oks)k(in)g(the)h(Adob)q(e)g(P)o(ostScript)g +(series.)53 b(F)m(or)25 b(pro)q(cessing)1004 2517 y(P)o(ostScript)19 +b(an)f(in)o(terpreter)i(is)e(needed,)j(suc)o(h)e(as)f(a)g(P)o(ostScript)1004 +2566 y(laser)f(prin)o(ter)g(or)f(a)h(GhostScript)f(preview)o(er.)27 +b(F)m(or)17 b(inclusion)e(in)1004 2616 y(\(L)1034 2609 y Fg(A)1058 +2616 y Fu(\)T)1097 2624 y(E)1120 2616 y(X)c(I)g(use)h(the)f(ps\014g)g +(macros.)1559 2601 y Fp(6)1594 2616 y Fu(Go)q(ossens)h(in)e(his)h(P)o +(ostScript)1004 2666 y(and)j(\(L)1115 2659 y Fg(A)1139 2666 +y Fu(\)T)1178 2674 y(E)1201 2666 y(X,)g(MAPS)g Fn(92)p Fu(.)p +Fn(1)p Fu(,)e(nicely)i(details)g(ab)q(out)f(inclusion)g(of)1004 +2716 y(P)o(ostScript.)1204 2701 y Fp(7)p 1004 2768 600 2 v +968 2803 a Fj(5)1004 2815 y Fs(See)c(Ben)o(tley's)f(Little)h(languages)e(in)j +(`More)f(programming)d(p)q(earls|Confes-)1004 2859 y(sions)11 +b(from)f(a)h(co)q(der.')j(Addison-W)m(esley)m(.)968 2891 y +Fj(6)1004 2902 y Fs(Courtesy)c(T)m(rev)o(or)h(J.)h(Darrell.)968 +2934 y Fj(7)1004 2946 y Fs(See)f(also)f(the)h(L)1209 2940 y +Fr(A)1227 2946 y Fs(T)1246 2952 y(E)1266 2946 y(X)h(Companion.)-118 +3014 y Fl(Draft)e(June)f Ff(25)p Fl(,)i Ff(1996)818 b Fl({1{)2005 +3013 y(c)1990 3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 2 2 +bop -68 13 a Fu(As)18 b(with)f(PDF)g(I)h(consider)g(the)g(p)q(ost-pro)q +(cessing)h(capabilit)o(y)-118 63 y Fq(indep)n(endently)j Fu(from)15 +b(the)i(to)q(ol)f(whic)o(h)h(created)i(the)e(P)o(ostScript)-118 +113 y(source,)e(v)o(ery)f(p)q(o)o(w)o(erful)f(and)h(\015exible.)-118 +184 y Fv(Subset)26 b(0)i(from)e(the)h(language)68 b Fu(P)o(ostScript)25 +b(is)g(stac)o(k-)-118 234 y(orien)o(ted.)41 b(This)22 b(means)e(that)i(op)q +(erations)g(are)g(prescrib)q(ed)h(in)-118 284 y(p)q(olish-rev)o(erse)12 +b(notation,)d(also)h(kno)o(wn)g(as)h(pre\014x)g(notation,)f(simi-)-118 +333 y(lar)g(to)g(the)h(HP)g(p)q(o)q(c)o(k)o(et)g(calculators.)17 +b(Addition|use)10 b(of)f(op)q(erator)-118 383 y Fe(add)p Fu(|for)j(example)h +(is)h(notated)g(as)g(follo)o(ws.)-68 454 y Fe(2)21 b(3)h(add\045yields)e(5)h +(on)h(the)f(stack,)f(2)i(3)f(consumed)-68 565 y Fu(P)o(ostScript)e(is)f +(arti\014cially)f(structured)j(via)d(structure)k(infor-)-118 +615 y(mation)c(in)i(commen)o(ts,)f(double)h(\045-ed)g(commen)o(ts.)33 +b(Programs)-118 664 y(whic)o(h)13 b(ob)q(ey)g(the)h(Adob)q(e)g(structure)h +(are)f(called)f(conforming)e(and)-118 714 y(this)17 b(is)h(usually)e(needed)j +(for)f(inclusion)e(within)h(\(L)706 707 y Fg(A)730 714 y Fu(\)T)769 +722 y(E)793 714 y(X,)h(esp)q(e-)-118 764 y(cially)12 b(the)j(BoundingBo)o(x)e +(line)h(is)g(required.)-118 835 y(Example)i Fd(\(Conforming)c(EPS)i +(structure\))-68 907 y Fe(\045!PS)21 b(EPS)-68 956 y(\045\045Title:)f(<name>) +-68 1006 y(\045\045Creator:)f(<name>)-68 1056 y(\045\045CreationData:)f +(<date>)-68 1106 y(\045\045BoundingBox:)h(<llx>)h(<lly>)h(<urx>)g(<ury>)-68 +1156 y(\045\045DocumentFonts:)d(\(atend\))-68 1205 y(\045\045EndComments)-68 +1255 y(<prolog>)-68 1305 y(\045\045EndProlog)-68 1355 y(\045\045Page:)i(0)i +(1)-68 1405 y(<page)e(1>)-68 1454 y(\045\045Page:)g(1)i(2)-68 +1504 y(<page)e(2>)-68 1554 y(\045\045Trailer)-68 1604 y(<...>)-68 +1654 y(\045\045DocumentFonts:)e(Times-Roman)i(...)-68 1704 +y(\045\045Pages:)g(3)-68 1753 y(\045\045EOF)-68 1864 y Fu(Creating)15 +b(and)h(dra)o(wing)e(paths)i(is)g(done)g(b)o(y)f(separate)i(op)q(era-)-118 +1914 y(tors.)g(F)m(or)9 b(creating)h(paths)g(op)q(erations)f(lik)o(e)g +Fe(moveto)f Fu(are)i(pro)o(vided)-118 1963 y(while)j(dra)o(wing)g(go)q(es)i +(via)e Fe(stroke)p Fu(.)-68 2035 y Fe(0)21 b(0)h(moveto)e(0)i(10)f +(lineto\045create)e(path)-68 2084 y(stroke\045draw)g(a)j(v-line)e(of)i(10pt)f +(height)-68 2195 y Fu(V)m(ariables|names)16 b(to)j(b)q(e)g(asso)q(ciated)g +(with)g(their)g(v)n(alues|)-118 2245 y(are)10 b(handled)g(via)g(the)g +(so-called)g(dictionaries.)17 b(The)10 b(functionalit)o(y)-118 +2294 y(can)k(also)f(b)q(e)i(obtained)e(via)g(pro)q(cedures.)-68 +2366 y Fe(/size)20 b({10})h(def)-68 2476 y Fu(The)14 b(so-called)g(literal)g +(name)f(is)h(preceded)j(b)o(y)d(a)g(slash)g(to)g(dis-)-118 +2526 y(tinguish)c(the)i(declaration)f(from)e(its)j(in)o(v)o(ok)o(e.)k(The)11 +b(in)o(v)o(ok)o(e)g(is)g(done)-118 2576 y(b)o(y)17 b(just)g(the)h(name,)f +(also)g(called)g(executable)h(name.)27 b(The)18 b(pro-)-118 +2625 y(cedure)e(text)f(is)f(surrounded)i(b)o(y)e(curly)h(braces.)21 +b(P)o(arameters)14 b(are)-118 2675 y(absen)o(t)g(to)q(o.)k(The)d(\(op)q +(erand\))f(stac)o(k)h(is)e(used.)-68 2725 y(F)m(or)c(graphics)g(w)o(e)h(ha)o +(v)o(e)f(a)g(Curren)o(tT)m(ransformMatrix|CTM|)-118 2775 y(whic)o(h)k(maps)f +(the)i(user)g(space)g(on)f(the)h(device)g(space,)g(the)f(prin)o(ter)-118 +2825 y(or)f(screen.)20 b(Equally)11 b(p)q(o)o(w)o(erful)i(is)f(the)h(concept) +h(of)e(encapsulating)-118 2874 y(graphics)f(via)f Fe(gsave)f +Fu(and)i Fe(grestore)p Fu(,)e(that)i(is)g(the)g(graphics)g(state)-118 +2924 y(is)j(lo)q(cal|encapsulated|after)f Fe(gsave)g Fu(un)o(til)g +Fe(grestore)p Fu(.)-118 -55 y Fg(MAPS)e Fn(96)p Fg(.)p Fn(2)1252 +b Fq(Par)n(adigms:)19 b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1054 +35 y Fu(Next)d(to)g(the)h(CTM)f(P)o(ostScript)h(main)o(tains)d(the)j(curren)o +(tp)q(oin)o(t)1004 85 y(and)h(curren)o(tpath.)1054 135 y(Batagelj,)9 +b(MAPS)h Fn(95)p Fu(.)p Fn(1)p Fu(|Com)n(bini)o(ng)c(T)1700 +142 y(E)1723 135 y(X)k(and)f(P)o(ostScript|)1004 184 y(pro)o(vides)15 +b(an)g(in)f(a)h(n)o(utshell)g(o)o(v)o(erview.)1639 169 y Fp(8)1679 +184 y Fu(Another)h(in)o(tro)q(duction)1004 234 y(is)10 b(in)g(F)m(okk)o(er)g +(en)h(v)n(an)e(Oostrum's)h(`Plaatjes)f(in)h(een)h(tekst,')g(MAPS)1004 +284 y Fn(94)p Fu(.)p Fn(2)p Fu(,)h(next)j(to)e(a)h(surv)o(ey)g(of)g(dra)o +(wing)f(soft)o(w)o(are.)1004 359 y Fv(Summary)23 b(of)h(\(graphics\))e +(commands)65 b Fu(The)21 b(follo)o(wing)1004 409 y(snapshot)f(is)f(b)q(orro)o +(w)o(ed)h(from)d(Gurari,)j(w)o(ell)e Fn(:)7 b(:)g(:)e Fu(a)19 +b(little)g(mo)q(di-)1004 459 y(\014ed.)1080 444 y Fp(9)1117 +459 y Fu(Its)14 b(main)d(purp)q(ose)k(is)e(to)g(sho)o(w)h(that)f(the)h(n)o +(um)o(b)q(er)f(of)f(rele-)1004 509 y(v)n(an)o(t)i(graphics)g(primitiv)o(es)f +(is)h(lo)o(w.)k(The)d(functionalities)e(will)g(b)q(e)1004 558 +y(dealt)e(with)g(along)f(the)i(w)o(a)o(y)e(in)h(the)h(examples.)k(F)m(or)11 +b(the)g(details)g(of)1004 608 y(the)j(commands)e(or)i(the)g(list)g(of)f(op)q +(erators)i(see)g(the)f(red)h(b)q(o)q(ok.)2015 593 y Fp(10)1093 +716 y Fv(Arithmetic)e(and)i(math)g(op)q(erators)1534 766 y +Fk(h)p Fn(num)p Fk(i)f(h)p Fn(num)p Fk(i)h Fu(m)o(ul)c Fn(num)1664 +816 y Fk(h)p Fn(num)p Fk(i)j Fu(sine)g Fn(num)1093 866 y Fv(P)o(ath)h +(construction)e(op)q(erators)1665 916 y Fu(curren)o(tp)q(oin)o(t)i +Fn(x)f(y)1695 965 y Fk(h)p Fn(x)p Fk(i)g(h)p Fn(y)q Fk(i)h +Fu(mo)o(v)o(eto)1636 1015 y Fk(h)p Fn(dx)p Fk(i)e(h)p Fn(dy)q +Fk(i)i Fu(rmo)o(v)o(eto)1738 1065 y Fk(h)p Fn(x)p Fk(i)f(h)p +Fn(y)q Fk(i)p Fu(lineto)1665 1115 y Fk(h)p Fn(dx)p Fk(i)f(h)p +Fn(dy)q Fk(i)i Fu(rlineto)1215 1165 y Fk(h)p Fn(q)1250 1171 +y Fg(1)p Fp(x)1287 1165 y Fk(i)f(h)p Fn(q)1352 1171 y Fg(1)p +Fp(y)1388 1165 y Fk(i)g(h)p Fn(q)1453 1171 y Fg(2)p Fp(x)1491 +1165 y Fk(i)g(h)p Fn(q)1556 1171 y Fg(2)p Fp(y)1592 1165 y +Fk(i)g(h)p Fn(p)1659 1171 y Fg(2)p Fp(x)1696 1165 y Fk(i)g(h)p +Fn(p)1763 1171 y Fg(2)p Fp(y)1800 1165 y Fk(i)g Fu(curv)o(eto)1410 +1215 y Fk(h)p Fn(c)1444 1221 y Fp(x)1465 1215 y Fk(i)g(h)p +Fn(c)1529 1221 y Fp(y)1549 1215 y Fk(i)g(h)p Fn(r)q Fk(i)g(h)p +Fn(ang)1728 1221 y Fg(1)1747 1215 y Fk(i)g(h)p Fn(ang)1860 +1221 y Fg(2)1878 1215 y Fk(i)g Fu(arc)1093 1264 y Fv(String)g(op)q(erators) +1349 1314 y Fk(h)p Fn(str)q(ing)q Fk(i)h(h)p Fn(num)p Fk(i)f(h)p +Fn(num)p Fk(i)g Fu(getin)o(terv)n(al)1093 1364 y Fv(Character)i(and)f(fon)o +(t)f(op)q(erators)1567 1414 y Fe(\\)p Fk(h)p Fn(f)t(ontname)p +Fk(i)i Fu(\014ndfon)o(t)1465 1464 y Fk(h)p Fn(f)t(ontsiz)r(e)p +Fk(i)g Fu(scalefon)o(t)e(setfon)o(t)1714 1513 y Fk(h)p Fn(str)q(ing)q +Fk(i)h Fu(sho)o(w)1521 1563 y Fe({)p Fk(h)p Fn(body)q Fk(i)p +Fe(})f Fk(h)p Fn(str)q(ing)q Fk(i)h Fu(ksho)o(w)1093 1613 y +Fv(Graphics)f(state)h(op)q(erators)1703 1663 y Fk(h)p Fn(num)p +Fk(i)f Fu(setgra)o(y)1613 1713 y Fk(h)p Fn(num)p Fk(i)g Fu(setlinewidth)1093 +1762 y Fv(Dictionary)g(op)q(erators)1495 1812 y Fu(/)p Fk(h)p +Fn(def)t(name)p Fk(i)23 b Fe({)p Fk(h)p Fn(body)q Fk(i)p Fe(})14 +b Fu(def)1093 1862 y Fv(Co)q(ordinate)h(system)g(and)g(matrix)f(op)q(erators) +1542 1912 y Fk(h)p Fn(num)p Fk(i)g(h)p Fn(num)p Fk(i)g Fu(translate)1615 +1962 y Fk(h)p Fn(num)p Fk(i)h(h)p Fn(num)p Fk(i)f Fu(scale)1724 +2012 y Fk(h)p Fn(num)p Fk(i)g Fu(rotate)1093 2061 y Fv(Relational,)f(b)q(o)q +(olean,)i(and)h(bit)o(wise)d(op)q(erators)1262 2111 y Fk(h)p +Fn(num)p Fk(i)p Fe(|)p Fk(h)p Fn(str)q(ing)q Fk(i)i(h)p Fn(num)p +Fk(i)p Fe(|)p Fk(h)p Fn(str)q(ing)q Fk(i)g Fu(le)f Fn(bool)1093 +2161 y Fv(Con)o(trol)g(op)q(erators)1230 2211 y Fk(h)p Fn(bool)q +Fk(i)22 b Fe({)p Fk(h)p Fn(tr)q(uepar)q(t)p Fk(i)p Fe(})f({)p +Fk(h)p Fn(f)t(al)q(separ)q(t)p Fk(i)p Fe(})16 b Fu(ifelse)1539 +2261 y Fk(h)p Fn(num)p Fk(i)22 b Fe({)p Fk(h)p Fn(body)q Fk(i)p +Fe(})14 b Fu(rep)q(eat)1391 2310 y Fk(h)p Fn(f)t(r)q(om)p Fk(i)24 +b(h)p Fn(step)p Fk(i)e(h)p Fn(to)p Fk(i)p Fe({)p Fk(h)p Fn(body)q +Fk(i)p Fe(})15 b Fu(for)1054 2386 y(With)e(pre\014x)i Fk(h)p +Fn(in)p Fk(i)9 b(h)p Fn(oper)q(ator)q Fk(i)h(h)p Fn(r)q(esul)q(t)p +Fk(i)15 b Fu(is)e(elegan)o(t.)p 1004 2438 600 2 v 968 2473 +a Fj(8)1004 2484 y Fs(Nice)e(are)g(the)g(hin)o(ts)f(to)h(remo)o(v)o(e)f(rep)q +(eated)f(parts)h(from)h(\014les)f(whic)o(h)h(are)g(gen-)1004 +2526 y(erated)f(b)o(y)h(CorelDRA)l(W)h(and)f(Mathematica,)e(in)j(order)e(to)i +(reduce)e(the)h(size)1004 2567 y(of)k(the)f(automaticall)o(y)e(generated)h +(and)h(to)h(b)q(e)g(included)e(\014les.)25 b(\(The)15 b(idea)1004 +2609 y(is)d(to)f(remo)o(v)o(e)e(duplicate)g(`dictionaries')g(whic)o(h)i(are)g +(included)e(with)i(eac)o(h)g(re-)1004 2651 y(sult.\))19 b(The)13 +b(example)d(of)j(ho)o(w)g(to)f(include)f(graphs)h(of)g(math)g(functions)f(in) +h(a)1004 2692 y(do)q(cumen)o(t)e(is)i Fc(very)17 b Fs(useful.)g(Ho)o(w)o(ev)o +(er,)12 b(with)h(resp)q(ect)d(to)j(his)f(\014rst)g(picture)e(I)1004 +2734 y(w)o(ould)h(prefer)e(to)i(use)g(the)g(inheren)o(t)e(symmetry)f(in)j +(the)g(data)f(as)h(opp)q(osed)f(to)1004 2776 y(pro)o(viding)f(all)i(the)g +(data.)968 2807 y Fj(9)1004 2819 y Fs(Gurari)k(E.M)h(\(1994\):)23 +b(T)1357 2825 y(E)1377 2819 y(X)17 b(&)f(L)1474 2813 y Fr(A)1492 +2819 y Fs(T)1511 2825 y(E)1531 2819 y(X)q(|Dra)o(wing)f(&)i(Literate)d +(Program-)1004 2861 y(ming.)g(McGra)o(w)d(Hill.)16 b(ISBN)11 +b(0-07-025208)o(-4.)952 2893 y Fj(10)1004 2904 y Fs(A)i(complete)c(list)i +(with)h(functional)d(summaries)g(is)j(in)g(the)f(red)g(b)q(o)q(ok)g(section) +1004 2946 y(6.2)g(Op)q(erator)f(summary)m(.)-118 3014 y Fl(Draft)g(June)f +Ff(25)p Fl(,)i Ff(1996)818 b Fl({2{)2005 3013 y(c)1990 3014 +y Fk(\015)p Fl(cgl)p eop +%%Page: 3 3 +bop -118 13 a Fv(What)22 b(is)f(not)g(allo)o(w)o(ed)f(as)j(EPS?)62 +b Fu(I'm)18 b(not)h(kno)o(wledge-)-118 63 y(able)e(enough)h(to)f(answ)o(er)h +(that)g(question,)g(nor)g(do)f(I)g(kno)o(w)g(of)g(a)-118 113 +y(full-blo)o(wn)g(de\014nition)j(of)f(EPS.)h(F)m(or)f(the)i(mom)o(en)o(t)d +(it)h(is)h(some)-118 163 y(subset)f(whic)o(h)f(w)o(orks)g(with)f(all)g(in)o +(terpretors,)j(with)d(m)o(y)f(subset)-118 212 y(0)21 b(in)g(there.)42 +b(When)21 b(one)h(restricts)h(oneself)e(to)h(the)g(basics)f(of)-118 +262 y(graphics,)10 b(arithmetic)f(and)h(similar)d(op)q(erations)k(then)f(the) +h(b)q(ound-)-118 312 y(ary)17 b(area)g(b)q(et)o(w)o(een)i(EPS)e(and)g(full)f +(P)o(ostScript|or)h(its)h(v)n(arious)-118 362 y(implemen)o(tatio)o(ns|is)11 +b(not)j(in)f(sigh)o(t.)-118 445 y Fv(Do)q(cumen)o(tation)49 +b Fu(The)10 b(red)g(b)q(o)q(ok|the)g(reference)i(man)o(ual|)-118 +495 y(is)j(generally)h(recommended,)f(though)g(the)h(blue)g(b)q(o)q(ok|the)g +(tu-)-118 544 y(torial)d(and)g(co)q(okb)q(o)q(ok|is)g(also)h(nice.)495 +529 y Fp(11)-118 625 y Fu(Example)i Fd(\(Pie)f(c)o(hart)f(from)e(the)i(blue)g +(b)q(o)q(ok\))-55 648 y + 14777212 14208860 -14143078 -14143078 14143078 12827443 startTexFig +-55 648 a +%%BeginDocument: prpie.eps + +/PieDict 24 dict def +PieDict begin + /DrawSlice + { /grayshade exch def + /endangle exch def + /startangle exch def + /thelabel exch def + + newpath 0 0 moveto + 0 0 radius startangle endangle arc + closepath + 1.415 setmiterlimit + + gsave + grayshade setgray + fill + grestore + stroke + gsave + startangle endangle add 2 div rotate + radius 0 translate + newpath + 0 0 moveto labelps .8 mul 0 lineto stroke + labelps 0 translate + 0 0 transform + grestore + itransform + /y exch def /x exch def + x y moveto + + x 0 lt + { thelabel stringwidth pop neg 0 rmoveto } + if + y 0 lt { 0 labelps neg rmoveto }if + thelabel show + } def + + /findgray + { /i exch def /n exch def + i 2 mod 0 eq + { i 2 div n 2 div round add n div } + { i 1 add 2 div n div } + ifelse + } def +end + +/DrawPieChart + { PieDict begin + /radius exch def + /ycenter exch def /xcenter exch def + /PieArray exch def + /labelps exch def /titleps exch def + /title exch def + + gsave + xcenter ycenter translate + + /Helvetica findfont titleps scalefont setfont + title stringwidth pop 2 div neg radius neg + titleps 3 mul sub moveto + title show + /Helvetica findfont labelps scalefont setfont + /numslices PieArray length def + /slicecnt 0 def + /curangle 0 def + + PieArray + { /slicearray exch def + slicearray aload pop + /percent exch def + /label exch def + /perangle percent 360 mul def + /slicecnt slicecnt 1 add def + label curangle curangle perangle add + numslices slicecnt findgray DrawSlice + /curangle curangle perangle add def + } forall + grestore + end + } def + +(January Pie Sales) 24 12 + [ [(Blueberry) .12 ] + [(Cherry) .30 ] + [(Apple) .26 ] + [(Boston Cream) .16 ] + [(Other) .04 ] + [(Vanilla Cream) .12 ] + ] 0 0 140 DrawPieChart + +showpage +%%EndDocument + -55 648 a + endTexFig +-68 1623 a Fu(The)j(in)o(v)o(ok)o(e)e(is)i(essen)o(tially)f(as)h(follo)o(ws)e +(and)i(sho)o(ws)g(that)f(the)-118 1673 y(co)q(des)g(can)e(b)q(e)h(used)h +(straigh)o(tforw)o(ardly)m(.)546 1658 y Fp(12)600 1673 y Fu(It)e(is)h(no)f +(longer)g(nec-)-118 1723 y(essary)g(to)g(mesh)f(around)g(with)g(the)h +(picture)g(en)o(vironmen)o(t)f(or)g(so,)-118 1773 y(to)h(ac)o(hiev)o(e)g(the) +g(e\013ect.)-68 1851 y Fe(\045preliminary)19 b(matter)-68 1901 +y(\(January)h(Pie)h(Sales\))-25 1951 y(24)h(12)f(\045...)g(array)g(size)-25 +2001 y([)h([\(Blueberry\))d(.12)i(])19 2051 y([\(Cherry\))f(.30)h(])19 +2100 y([\(Apple\))f(.26)h(])19 2150 y([\(Boston)f(Cream\))h(.16)g(])19 +2200 y([\(Other\))f(.04)h(])19 2250 y([\(Vanilla)f(Cream\))g(.12)i(])-25 +2300 y(])g(306)f(396\045translate)e(center)i(to)19 2350 y(140)86 +b(\045size)19 2399 y(DrawPieChart)-68 2449 y(showpage)-68 2565 +y Fu(There)15 b(is)e(also)h(a)f(P)o(ostScript-F)-5 b(A)o(Q,)15 +b(consult)p -118 2617 600 2 v -170 2651 a Fj(11)-118 2663 y +Fs(I)i(used)f(the)g(P)o(ostScriptI)e(red)i(b)q(o)q(ok)g(and)g(this)g(is)h(w)o +(ell-suited)e(to)i(get)f(the)-118 2706 y(\015a)o(v)o(our.)d(F)m(or)d(T)93 +2712 y(E)113 2706 y(X)h(and)e(MET)m(AF)o(ONT)k(this)d(is)g(similar.)j(T)m(o)e +(grasp)e(the)g(basic)-118 2750 y(ideas)h(Kn)o(uth's)g(\014rst)h(b)q(o)q(ok)f +(is)h(a)h(more)e(concise)f(surv)o(ey)h(of)h(the)g(main)f(lines)g(of)-118 +2794 y(though)o(t)f(than)i Fb(The)g(T)188 2800 y(E)208 2794 +y(X)q(b)q(o)q(ok)f Fs(and)h Fb(The)g(MET)m(AF)o(ONTb)q(o)q(ok)p +Fs(.)-170 2825 y Fj(12)-118 2837 y Fs(It)k(is)h(not)f(standard)f(P)o +(ostScript.)26 b(W)m(e)16 b(ha)o(v)o(e)f(to)g(construct)f(some)h(kind)f(of) +-118 2881 y(library)f(to)h(use)g(the)g(P)o(ostScript)f(programs)f(from.)24 +b(Ma)o(yb)q(e)14 b(the)f(CT)m(AN)k(as)-118 2924 y(global)10 +b(net)o(w)o(ork)g(library?)j(Copied)e(on)g(the)g(v)n(arious)f(CD-R)o(OMS?) +-118 -55 y Fg(MAPS)h Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1054 35 y Fe(ftp)43 +b(wilma.cs.brown.e)o(du:)1170 85 y(pub/comp.lang.pos)o(tscri)o(pt)p +Fu(.)1054 134 y(It)14 b(con)o(tains)g(an)f(annotated)h(bibliograph)o(y)e(as)i +(w)o(ell.)1054 184 y(The)i(examples)f(from)f(Adob)q(e's)i(blue)g(b)q(o)q(ok)f +(are)i(a)o(v)n(ailable)c(on)1004 234 y(the)h(net.)1004 308 +y Fv(Pro)q(o\014ng)57 b Fu(F)m(or)15 b(previewing)g(or)g(prin)o(ting,)g +Fq(as)h(such)j Fu(I)c(ha)o(v)o(e)g(to)1004 358 y(include)d(a)g(shift)g(to)g +(mo)o(v)o(e)e(the)j(picture)g(a)o(w)o(a)o(y)e(from)g(the)h(lo)o(w)o(er)g +(left)1004 408 y(corner,)j(sa)o(y)1054 482 y Fe(300)21 b(500)g(translate)1004 +619 y Fv(Inclusion)54 b Fu(I)13 b(usually)f(build)h(a)g(\014gure)h +(symmetrically)c(around)1004 668 y(the)k(origin)f(and)h(then)g(include)g(it)g +(via)1054 743 y Fe($$\\psfig{file=<n)o(ame>,)o(heigh)o(t=<nu)o(mber>)o(<uni)o +(t>}$$)1054 854 y Fu(A)h(unit)g(can)g(b)q(e)h Fe(in)p Fu(\(c)o(h\),)f +Fe(cm)p Fu(,)g(and)g(ilks.)21 b Fe(\\psfig)14 b Fu(is)h(v)o(ery)h(vul-)1004 +904 y(nerable)c(to)g(spaces)h(b)q(ecause)h(of)d(T)1541 912 +y(E)1564 904 y(X's)h(parsing.)17 b(So)12 b(no)f(spaces)i(in)1004 +954 y(there.)23 b(No)o(w)15 b(and)g(then)h(I)f(forget)g(to)g(inactiv)n(ate)g +(the)h Fe(translate)1004 1004 y Fu(needed)f(while)f(previewing.)k(No)13 +b(real)h(problem.)1054 1066 y Fv(BoundingBo)n(x)55 b Fu(Pro)o(viding)12 +b(the)i(righ)o(t)g(BoundingBo)o(x)f(co-)1004 1116 y(ordinates)j(has)f(all)f +(to)h(do)g(with)g(prop)q(er)i(placemen)o(t)d(within)h(con-)1004 +1166 y(text,)24 b(the)e(lo)q(ok-and-feel.)40 b(Default)20 b(P)o(ostScript)j +(assumes)e(the)1004 1215 y(origin|in)7 b(user)k(space|at)e(the)h(lo)o(w)o(er) +f(left)g(corner)i(of)d(the)i(pap)q(er|)1004 1265 y(in)j(device)i(space.)1054 +1315 y(Surround)f(the)h(picture)g(b)o(y)e(as-if)h(lines)f(and)h(supply)g(the) +h(co)q(or-)1004 1365 y(dinates,)e(in)g(p)q(oin)o(ts)h(as)f(units)h(in)f(user) +h(space)h(co)q(ordinates,)e(of)g(the)1004 1415 y(lo)o(w)o(er)h(left)g(corner) +h(and)f(the)h(upp)q(er)g(righ)o(t)f(corner)h(in)f(the)h(Bound-)1004 +1464 y(ingBo)o(x)h(sp)q(eci\014cation.)29 b(Simple)15 b(is)j(to)f(build)f(a)h +(picture)h(around)1004 1514 y(its)12 b(symmetry)e(p)q(oin)o(t|and)g(let)i +(this)g(coincide)g(with)f(the)i(origin|)1004 1564 y(with)c(as)g(pleasing)g +(result)h(that)g(the)g(horizon)o(tal)e(p)q(ositioning)g(comes)1004 +1614 y(out)14 b(cen)o(tered,)j(when)e(used)g(within)f(math)f(displa)o(y)m(.) +19 b(V)m(ertically)m(,)13 b(I)1004 1664 y(add)19 b(a)g(10)g(or)g(so)g(extra)h +(on)f(either)h(side)g(in)e(the)i(BoundingBo)o(x)1004 1714 y(sp)q +(eci\014cation,)13 b(but)h(that)f(dep)q(ends)h(on)f(the)h(c)o(haracter)g(of)e +(the)i(pic-)1004 1763 y(ture.)1054 1813 y(Some)19 b(preview)i(systems)g(can)g +(measure)f(the)h(BoundingBo)o(x)1004 1863 y(and)14 b(allo)o(w)e(adjustmen)o +(t)h(in)o(teractiv)o(ely)m(.)1642 1848 y Fp(13)1004 1937 y +Fv(W)l(riting)j(P)o(ostScript)56 b Fu(A)16 b(line)g(bundle)g(and)g(a)g(v)n +(arian)o(t)f(of)g(it)1004 1987 y(are)f(in)o(tro)q(duced)h(to)f(sho)o(w)f(ho)o +(w)h(to)g(create)h(simple)d(EPS.)1054 2049 y Fv(A)k(line)e(bundle)1385 +2078 y + 4736286 4736286 -2631270 -2631270 2631270 2631270 startTexFig +1385 2078 a +%%BeginDocument: linebundle.eps +/r 36 def +10{0 0 moveto + r 0 lineto + 36 rotate +}repeat +stroke +showpage +%%EndDocument + 1385 2078 a + endTexFig +1054 2452 a Fu(Ho)o(w)h(to)g(do)g(this)g(in)g(P)o(ostScript?)23 +b(A)15 b(line)g(as)g(suc)o(h)h(is)f(simple.)1004 2502 y(First)20 +b(a)f Fe(moveto)f Fu(and)h(then)h(a)f Fe(lineto)p Fu(.)33 b(So)19 +b(a)g(w)o(a)o(y)g(is)g(to)g(cre-)1004 2552 y(ate)c(a)f(lo)q(op)g(and)g(rep)q +(eatedly)i(dra)o(w)e(from)f(the)i(origin)f(to)g(the)h(end)1004 +2602 y(of)h(the)i(v)n(arious)e(lines.)27 b(This)17 b(can)g(b)q(e)h(done)f +(elegan)o(tly)f(b)o(y)h(using)1004 2652 y(appropriately)c(the)i(CTM.)1054 +2726 y Fe(\045!PS)21 b(EPS)1054 2776 y(\045\045Title:)f(Line)h(bundle)p +1004 2817 600 2 v 952 2852 a Fj(13)1004 2863 y Fs(F)m(or)9 +b(a)g(summary)e(of)i(to)q(ols)f(to)h(assist)g(\014nding)e(the)i(BoundingBo)o +(x)d(co)q(ordinates)1004 2905 y(see,)16 b(Rec)o(kdahl)d(K)j(\(1995\):)22 +b(Using)15 b(EPS)g(graphics)e(in)i(L)1793 2899 y Fr(A)1811 +2905 y Fs(T)1830 2911 y(E)1850 2905 y(X)h(do)q(cumen)o(ts.)1004 +2946 y(rec)o(kdahl@lelan)o(d.st)o(anf)o(ord)o(.ed)o(u.)-118 +3014 y Fl(Draft)10 b(June)f Ff(25)p Fl(,)i Ff(1996)818 b Fl({3{)2005 +3013 y(c)1990 3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 4 4 +bop -68 14 a Fe(\045\045Creator:)19 b(cgl)-68 64 y(\045\045CreationDate:)f +(June)j(4)h(1996)-68 114 y(\045\045BoundingBox:)d(-40)i(-45)g(40)g(45)-68 +164 y(\045\045Pages:)f(1)-68 214 y(\045\045EndProlog)-68 263 +y(\045\045Page:)g(1)i(1)-68 313 y(/r)f(36)g(def)-68 363 y(10{0)g(0)g(moveto)g +(r)g(0)h(lineto)-3 413 y(36)f(rotate)-68 463 y(}repeat)f(stroke)h(showpage) +-68 574 y Fu(Explanation.)16 b(The)d(idea)f(is)h(that)f(\014rst)i(a)e(simple) +f(line)h(is)g(dra)o(w,)-118 624 y(for)d(example)f(along)g(the)j(x-axes.)16 +b(What)9 b(happ)q(ens)i(if)d(after)i(that)g(w)o(e)-118 674 +y(rotate?)18 b(Righ)o(t,)10 b(the)j(mapping)c(is)j(c)o(hanged.)17 +b(And)12 b(what)g(happ)q(ens)-118 723 y(if)i(w)o(e)h(supply)g(the)h +Fq(same)i Fu(line)c(after)i(this?)21 b(Indeed,)16 b(it)e(will)g(sho)o(w)-118 +773 y(up)g(rotated.)k(Because)e(P)o(ostScript)e(is)g(an)f(in)o(terpretiv)o(e) +i(language)-118 823 y(w)o(e)f(can)f(realize)h(this)g(sp)q(eci\014cation)g +(after)f(the)h(rotate)g(via)f(a)g(lo)q(op,)-118 873 y(whic)o(h)h(for)f(this)h +(simple)f(case)h(reads)h Fe(10{...}repeat)p Fu(.)769 858 y +Fp(14)-68 935 y Fu(Appropriately)21 b(main)o(taini)o(ng)d(the)k(CTM)f(for)f +(symmetri-)-68 984 y(cal)15 b(pictures)i(can)g(yield)e(simple)f(lo)q(oking)g +(P)o(ostScript)j(pro-)-68 1034 y(grams.)-68 1108 y Fv(A)f(\015o)o(w)o(er)263 +1112 y + 4736286 4736286 -3289088 -3289088 3289088 3289088 startTexFig +263 1112 a +%%BeginDocument: flower.eps +/r 36 def +10{r r moveto%begin drawing point + r 0 r 90 180 arc + currentpoint%origin + 0 r r 270 360 arc + 36 rotate +}repeat +stroke +showpage +%%EndDocument + 263 1112 a + endTexFig +-68 1478 a Fu(This)d(exercises)k(the)d(use)h(of)e Fe(arc)p +Fu(.)-68 1552 y Fe(\045!PS)21 b(EPS)-68 1602 y(\045\045Title:)f(Flower)-68 +1651 y(\045\045Creator:)f(cgl)j(\(Courtesy)e(Papert\))-68 1701 +y(\045\045CreationDate:)e(June)j(4)h(1996)-68 1751 y(\045\045BoundingBox:)d +(-40)i(-45)g(40)g(45)-68 1801 y(\045\045Pages:)f(1)-68 1851 +y(\045\045EndProlog)-68 1901 y(\045\045Page:)g(1)i(1)-68 1950 +y(/r)f(36)g(def)-68 2000 y(10{r)g(r)g(moveto\045begin)f(drawing)g(point)-3 +2050 y(r)i(0)f(r)h(90)f(180)g(arc)-3 2100 y(currentpoint\045origi)o(n)-3 +2150 y(0)h(r)f(r)h(270)f(360)g(arc)-3 2199 y(36)g(rotate)-68 +2249 y(}repeat)f(stroke)h(showpage)-68 2361 y Fu(Explanation.)15 +b(W)m(e)9 b(ha)o(v)o(e)g(the)i(same)d(structure)k(as)d(the)h(previous)-118 +2410 y(program)i(but)i(the)g(`line')e(is)h(no)o(w)g(a)h(little)f(more)f(elab) +q(orated:)18 b(t)o(w)o(o)-118 2460 y(arcs)11 b(of)f(a)g(circle.)18 +b(P)o(ostScript)11 b(pro)o(vides)f(an)h(op)q(erator)g(for)f(dra)o(wing)-118 +2510 y(circular)16 b(arcs,)g(called)f(arc.)23 b(The)16 b(arc)f(has)h(\()p +Fn(x;)7 b(y)q Fu(\))16 b(as)f(cen)o(tre,)i(r)f(as)-118 2560 +y(radius,)c Fn(ang)84 2566 y Fg(1)116 2560 y Fu(the)h(angle)f(of)h(a)f(v)o +(ector)i(from)d(\()p Fn(x;)c(y)q Fu(\))13 b(of)f(length)h Fn(r)h +Fu(to)-118 2610 y(the)f(\014rst)g(endp)q(oin)o(t)f(of)g(the)h(arc,)f(and)g +Fn(ang)548 2616 y Fg(2)579 2610 y Fu(the)h(angle)e(of)h(a)g(v)o(ector)-118 +2660 y(from)g(\()p Fn(x;)7 b(y)q Fu(\))13 b(of)g(length)h Fn(r)g +Fu(to)f(the)i(second)f(endp)q(oin)o(t)g(of)f(the)h(arc.)909 +2644 y Fp(15)-118 2709 y Fu(These)h(argumen)o(ts)e(are)h(exp)q(ected)i(to)e +(b)q(e)h(on)e(the)i(stac)o(k.)p -118 2754 600 2 v -170 2788 +a Fj(14)-118 2800 y Fs(Do)9 b(y)o(ou)e(see)i(the)f(v)n(arian)o(t)f(for)h(dra) +o(wing)g(a)g(p)q(olygon?)k(This)d(dualit)o(y)e(linebundle)-118 +2841 y(and)16 b(p)q(olygon)e(has)i(b)q(een)g(used)f(b)o(y)h(Gab)q(o)g(and)f +(is)i(ab)q(out)e(what)i(he)f(called)-118 2882 y(stereometry)8 +b(v)o(ersus)j(p)q(erimetry)m(,)d(the)j(structure)e(v)o(ersus)h(the)h(surface) +-170 2914 y Fj(15)-118 2926 y Fs(The)g(arc)g(is)h(dra)o(wn)f(coun)o(ter)e +(clo)q(c)o(kwise.)14 b Fh(arcn)c Fs(dra)o(ws)h(clo)q(c)o(kwise.)-118 +-51 y Fg(MAPS)g Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1054 39 y Fe(x)21 +b(y)h(r)g(ang1)e(ang2)37 b Fv(arc)1054 151 y Fu(Imp)q(ortan)o(t)11 +b(is)h(to)h(realize)g(that)f(arc)h Fq(c)n(ounts)k Fu(its)12 +b(angle)h(from)d(\(x,)1004 201 y(0\))j(and)h(that)f(the)i Fq(dr)n(awing)h +Fu(starts)f(from)d(the)i(p)q(oin)o(t)f(on)g(the)h(stac)o(k)1054 +250 y(The)22 b(sp)q(eci\014cation)g(of)f(the)h(\015o)o(w)o(er)g(in)f +Fo(MET)o(AF)n(ONT)p Fu(/)p Fo(MET)o(A)p Fu(-)1004 300 y Fa(post)14 +b Fu(reads)h(essen)o(tially)e(as)h(follo)o(ws.)1054 375 y Fe(for)21 +b(k:=)g(1)h(upto)f(10:)1054 425 y(draw\(origin{up}.)o(.{rig)o(ht}\(u)o(p+rig) +o(ht\){d)o(own})o(..)1141 474 y({left}origin\))e(rotated)h(36k;)1054 +524 y(endfor)1054 636 y Fu(Explanan)o(tion.)c Fo(MET)o(AF)n(ONT)c +Fu(allo)o(ws)d(for)i(sp)q(eci\014cation)h(of)e(the)1004 686 +y(directions)1179 671 y Fp(16)1229 686 y Fn(up)i Fu(=)f(\(0)p +Fn(;)c Fu(1\))p Fn(;)g(r)q(ig)q(ht)k Fu(=)h(\(1)p Fn(;)7 b +Fu(0\).)1054 736 y(IMHO,)15 b(with)g(all)f(resp)q(ect)j(the)f +Fo(MET)o(AF)n(ONT)g Fu(and)f(P)o(ostScript)1004 786 y(programs)g(are)i +(similar)e(mo)q(dulo)f(some)i(syn)o(tactic)h(sugar.)26 b(Ho)o(w-)1004 +835 y(ev)o(er,)d(the)f(extra)f(p)q(ossibilit)o(y)f(of)g(sp)q(ecifying)h(the)h +(directions)f(is)1004 885 y(more)d(con)o(v)o(enien)o(t)h(than)f(using)h(con)o +(trol)f(p)q(oin)o(ts.)33 b(But)19 b(p)q(erhaps)1004 935 y(that)c(is)g(a)g +(matter)f(of)g(taste,)i(although)e(the)i(handling)e(of)g(con)o(trol)1004 +985 y(p)q(oin)o(ts)g(is)g(p)q(o)o(w)o(erful)f(as)h(B)o(\023)-20 +b(ezier)16 b(himself)c(has)i(sho)o(wn)g(in)f(the)i(past.)1004 +1035 y(F)m(rom)10 b(this)j(I)f(conclude)h(that)f(for)g(these)i(simple)d +(kinds)h(of)g(pictures)1004 1085 y(w)o(e)i(can)g(as)g(w)o(ell)f(use)i(P)o +(ostScript)g(straigh)o(ta)o(w)o(a)o(y)m(.)1004 1184 y Fv(Some)g(more)g +(Graphics)1004 1283 y Fu(Example)h Fd(\(Malb)q(ork)e(windo)o(w\))1004 +1333 y Fu(This)9 b(is)h(all)e(ab)q(out)i(using)f Fe(curveto)p +Fu(,)g(esp)q(ecially)h(c)o(ho)q(osing)f(suitable)1004 1383 +y(con)o(trol)14 b(p)q(oin)o(ts.)1385 1437 y + 4736286 4736286 -2631270 -2631270 2631270 2631270 startTexFig +1385 1437 a +%%BeginDocument: malbork.eps + + +45 rotate +10 0 moveto +4{20 0 37.5 12.5 25 25 curveto + 12.5 37.5 0 20 0 10 curveto + 90 rotate}repeat + +5 0 moveto +4{5 35 35 5 0 5 curveto + 90 rotate}repeat + +36 0 moveto +0 0 36 0 360 arc +stroke +showpage +%%EndDocument + 1385 1437 a + endTexFig +1054 1828 a Fe(\045!PS)21 b(EPS)1054 1878 y(\045\045Title:)f(Malbork)g +(Window)1054 1927 y(\045\045Creator:)f(cgl)1054 1977 y(\045\045CreationDate:) +f(May)k(21)f(1996)1054 2027 y(\045\045BoundingBox:)e(-40)i(-40)g(40)g(40)1054 +2077 y(\045\045Pages:)f(1)1054 2127 y(\045\045EndProlog)1054 +2176 y(\045\045Page:)g(1)i(1)1054 2226 y(45)f(rotate)g(10)g(0)h(moveto)1054 +2276 y(4{20)f(0)g(37.5)g(12.5)g(25)h(25)f(curveto)1097 2326 +y(12.5)g(37.5)g(0)h(20)f(0)h(10)f(curveto)1076 2376 y(90)g(rotate)1054 +2425 y(}repeat\045inside)e(lops)i(next)1054 2475 y(5)g(0)h(moveto)1054 +2525 y(4{5)f(35)g(35)h(5)f(0)h(5)f(curveto)1097 2575 y(90)h(rotate)1054 +2625 y(}repeat\045enclosin)o(g)d(circle)i(next)1054 2675 y(36)g(0)h(moveto) +1054 2724 y(0)f(0)h(36)f(0)h(360)f(arc)1054 2774 y(stroke)f(showpage)p +1004 2863 600 2 v 952 2897 a Fj(16)1004 2909 y Fs(There)14 +b(is)h(also)f(a)g(quartercircle)e(whic)o(h)i(apart)f(from)h(orien)o(tation)d +(is)k(dra)o(wn)1004 2950 y(similarly)m(.)-118 3018 y Fl(Draft)10 +b(June)f Ff(25)p Fl(,)i Ff(1996)818 b Fl({4{)2005 3017 y(c)1990 +3018 y Fk(\015)p Fl(cgl)p eop +%%Page: 5 5 +bop -68 13 a Fu(Explanation.)36 b Fe(translate)18 b Fu(c)o(hanges)j(the)g +(CTM,)f(with)g(the)-118 63 y(e\013ect)f(that)e(the)h(device)f(co)q(ordinates) +h(are)g(shifted.)28 b(\(Useful)17 b(for)-118 113 y(use)e(of)e(P)o(ostScript)i +(alone)e(out)h(of)f(con)o(text.\))-68 163 y Fe(rotate)c Fu(c)o(hanges)i(the)h +(CTM,)e(and)g(b)q(ecause)j(of)d(b)q(eing)g(an)h(in)o(ter-)-118 +212 y(pretiv)o(e)k(language)f(the)h(v)n(arious)f(lo)q(op)g(tra)o(v)o(ersals)h +(map)d(the)k Fq(same)-118 262 y Fu(user)f(co)q(ordinates)f(on)g(the)h +(rotated)f(device)h(co)q(ordinates.)-68 312 y Fk(h)p Fn(number)q +Fk(if)p Fn(:)7 b(:)g(:)n Fk(g)i Fe(repeat)f Fu(is)h(a)g(lo)q(op)g(to)g(b)q(e) +h(tra)o(v)o(ersed)g Fk(h)p Fn(number)q Fk(i)-118 362 y Fu(of)j(times.)-68 +412 y Fe(curveto)e Fu(adds)j(a)f(spline)g(to)g(the)g(curren)o(t)i(path)e +(from)f(the)h(cur-)-118 461 y(ren)o(tp)q(oin)o(t)d(to)g(the)h(last)f(p)q(oin) +o(t)f(on)h(the)h(stac)o(k.)17 b(The)10 b(\014rst)h(t)o(w)o(o)f(p)q(oin)o(ts) +-118 511 y(are)k(the)h(so-called)e(con)o(trol)h(p)q(oin)o(ts)g(of)f(the)h +(spline.)690 496 y Fp(17)-68 561 y Fe(arc)19 b Fu(adds)i(a)f(circular)g(arc)h +(to)f(the)h(curren)o(t)h(path)e(from)e(the)-118 611 y(curren)o(tp)q(oin)o(t.) +-68 661 y(The)12 b(details)g(of)f(the)i(argumen)o(ts)e(for)g(the)i(op)q +(erators)g(are)f(nicely)-118 710 y(do)q(cumen)o(ted)i(in)f(the)i(red)f(b)q(o) +q(ok.)-118 782 y(Example)i Fd(\(Esc)o(her's)g(imp)q(ossible)c(triangle\))-118 +832 y Fu(This)e(is)f(all)g(ab)q(out)h Fq(wr)n(ong)j Fu(pro)r(jections.)18 +b(Ho)o(w)o(ev)o(er,)10 b(these)i(kinds)d(of)-118 882 y(pictures)k(are)g(in)o +(triguing)d(and)i(fun.)18 b(I)12 b(consider)h(them)e(w)o(ell-suited)-118 +931 y(to)j(illustrate)f(P)o(ostScript's)i(dra)o(wing)e(capabilities.)263 +985 y + 4736286 4736286 -2631270 -2631270 2631270 2631270 startTexFig +263 985 a +%%BeginDocument: eschera.eps +3{25 34 moveto + 25 -34 lineto + 17 -38.2 lineto + 17 20 lineto + -17.6 0 lineto +120 rotate +}repeat +stroke +showpage +%%EndDocument + 263 985 a + endTexFig +-68 1373 a Fe(\045!PS)21 b(EPS)-68 1423 y(\045\045Title:)f(Escher's)g +(impossible)g(triangle)-68 1473 y(\045\045Creator:)f(cgl)j(\(inspired)41 +b(by)22 b(Guy)f(Shaw\))-68 1523 y(\045\045CreationDate:)40 +b(May)21 b(23)h(1996)-68 1573 y(\045\045BoundingBox:)d(-40)i(-40)g(40)g(40) +-68 1622 y(\045\045Pages:)f(1)-68 1672 y(\045\045EndProlog)-68 +1722 y(\045\045Page:)g(1)i(1)-68 1772 y(3{25)42 b(34)22 b(moveto)-25 +1822 y(25)g(-34)f(lineto)-25 1871 y(17)h(-38.2)e(lineto)-25 +1921 y(17)i(20)f(lineto)-47 1971 y(-17.6)g(0)h(lineto)-68 2021 +y(120)f(rotate)-68 2071 y(}repeat)f(stroke)h(showpage)-68 2181 +y Fn(5)16 b Fu(p)q(oin)o(ts,)h(the)g(righ)o(t)f(strok)o(e)h(and)g(a)f +(rotation)g(or)h(t)o(w)o(o,)f(that's)-118 2231 y(it.)i(End)c(of)f(story)m(.) +-68 2281 y(Ho)o(w)o(ev)o(er,)h(it)f(is)h(all)e(ab)q(out)i(\014nding)g(those)g +Fn(5)g Fu(p)q(oin)o(ts.)263 2335 y + 4736286 4736286 -2631270 -2631270 2631270 2631270 startTexFig +263 2335 a +%%BeginDocument: escherb.eps +25 34 moveto currentpoint +0 -68 rlineto currentpoint%down + -120 rotate +25 34 lineto%preserve symmetry + 120 rotate currentpoint +17 20 lineto currentpoint +-17.6 0 lineto currentpoint +/Courier findfont 8 scalefont setfont +moveto -5 -3 rmoveto (5) show +moveto 1 1 rmoveto (4) show +moveto 2 -5 rmoveto (3) show +moveto 2 0 rmoveto (2) show +moveto 2 0 rmoveto (1) show +stroke +showpage +%%EndDocument + 263 2335 a + endTexFig +-68 2723 a Fe(\045!PS)21 b(EPS)p -118 2759 600 2 v -170 2793 +a Fj(17)-118 2805 y Fs(Muc)o(h)10 b(similar)g(as)g(in)h(MET)m(AF)o(ONT.)i +(Cho)q(osing)d(for)g(the)g(inner)g(lop)g(the)g(con-)-118 2845 +y(trol)e(p)q(oin)o(ts)g(in)h(this)g(w)o(a)o(y)g(is)h(b)q(orro)o(w)o(ed)d +(from)h(Haralam)o(b)q(ous)f(Y)j(\(1995\):)j(Some)-118 2884 +y(MET)m(AF)o(ONT)i(tec)o(hniques.)h(TUGb)q(oat)c Fi(16)p Fs(,)h +Fi(1)p Fs(,)f(46{53.)17 b(It)c(is)f(also)g(supplied)-118 2924 +y(in)f(the)g(description)d(of)k Fh(curveto)d Fs(in)i(the)g(red)g(b)q(o)q(ok.) +-118 -55 y Fg(MAPS)g Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1054 35 y Fe(\045\045Title:)20 +b(Essential)g(stroke)1054 85 y(\045\045Creator:)f(cgl)j(\(inspired)41 +b(by)22 b(Guy)f(Shaw\))1054 134 y(\045\045CreationDate:)d(May)k(23)f(1996) +1054 184 y(\045\045BoundingBox:)e(-40)i(-40)g(40)g(40)1054 +234 y(\045\045Pages:)f(1)1054 284 y(\045\045EndProlog)1054 +334 y(\045\045Page:)g(0)i(1)1054 383 y(25)43 b(34)21 b(moveto)g(currentpoint) +1054 433 y(0)43 b(-68)21 b(rlineto)g(currentpoint\045dow)o(n)1097 +483 y(-120)g(rotate)1054 533 y(25)43 b(34)21 b(lineto\045preserve)e(symmetry) +1119 583 y(120)i(rotate)g(currentpoint)1054 633 y(17)43 b(20)21 +b(lineto)g(currentpoint)1054 682 y(-17.6)g(0)g(lineto)g(currentpoint)1054 +732 y(\045labels)1054 782 y(/Courier)f(findfont)g(8)i(scalefont)e(setfont) +1054 832 y(moveto)g(-5)i(-3)f(rmoveto)f(\(5\))i(show)1054 882 +y(moveto)e(1)i(1)f(rmoveto)g(\(4\))g(show)1054 931 y(moveto)f(2)i(-5)f +(rmoveto)g(\(3\))g(show)1054 981 y(moveto)f(2)i(0)f(rmoveto)g(\(2\))g(show) +1054 1031 y(moveto)f(2)i(0)f(rmoveto)g(\(1\))g(show)1054 1081 +y(stroke)f(showpage)1054 1190 y Fu(Explanation.)h(The)16 b(essen)o(tial)g +(strok)o(e)g(\014gure)g(also)f(illustrates)1004 1240 y(the)j(in)o(tegration)f +(of)g(text)i(in)e(this)h(case)g(digits.)29 b Fe(currentpoint)1004 +1290 y Fu(pushes)13 b(the)g(p)q(oin)o(t)f(on)g(the)h(stac)o(k.)18 +b(The)12 b(last)g Fe(moveto)p Fu(-s)f(p)q(op)h(these)1004 1340 +y(co)q(ordinates)j(up.)j Fe(rmoveto)12 b Fu(mo)o(v)o(es)h Fq(r)n(elatively.) +1054 1400 y Fu(And)f(what)g(ab)q(out)g(their)g(relationships,)g(and)g(what)f +(ab)q(out)h(the)1004 1449 y(minim)o(al)e(information)h(to)j(b)q(e)h(prescrib) +q(ed?)1054 1499 y(Lo)q(oking)8 b(more)h(closely)h(it)f(turns)i(out)e(that)h +Fq(only)k Fu(the)c(\014rst)g(p)q(oin)o(t)1004 1549 y(is)16 +b(all)f(that)h(is)g(needed.)25 b(The)17 b(rest)g(is)f(implicit)d(to)j(the)h +(nature)f(of)1004 1599 y(the)e(\014gure.)1188 1584 y Fp(18)1054 +1668 y Fe(\045!PS)21 b(EPS)1054 1718 y(\045\045Title:)f(Escher's)g +(Impossible)g(triangle)g(II)1054 1768 y(\045\045Creator:)f(cgl)1054 +1818 y(\045\045CreationDate:)f(May)k(23)f(1996)1054 1868 y +(\045\045BoundingBox:)e(-40)i(-40)g(40)g(40)1054 1918 y(\045\045Pages:)f(1) +1054 1967 y(\045\045EndProlog)1054 2017 y(\045\045Page:)g(1)i(1)1054 +2067 y(\045Parameterized)d(over)i(p1)1054 2117 y(/point)f({25)h(34})h +(def\045note)e(x<y)1054 2167 y(\045)1054 2216 y(3{point)g(moveto)1054 +2266 y(currentpoint)f(neg)i(lineto\045down)1097 2316 y(-120)g(rotate)1054 +2366 y(point)42 b(lineto\045preserve)19 b(symmetry)1119 2416 +y(120)i(rotate)1054 2465 y(currentpoint)e(2)j(div)f(neg)g(lineto)1054 +2515 y(currentpoint)e(3)j(sqrt)f(mul)g(sub)g(0)h(lineto)1054 +2565 y(120)f(rotate)1054 2615 y(}repeat)f(stroke)h(showpage)1054 +2724 y Fu(Explanation.)36 b Fe(currentpoint)18 b Fu(yields)i(the)h(co)q +(ordinates)f(of)1004 2774 y(the)c(curren)o(t)h(p)q(oin)o(t)e(of)g(the)h(path) +f(on)g(the)h(stac)o(k.)23 b(The)16 b(other)g(op-)1004 2824 +y(erations)21 b(do)f(what)g(their)h(names)e(suggest.)39 b(The)21 +b(temp)q(orarily)p 1004 2861 V 952 2895 a Fj(18)1004 2907 y +Fs(Of)13 b(course)e(one)g(can)h(also)f(think)g(of)h(other)f(equiv)n(alen)o(t) +f(parameters)f(lik)o(e)j(size)1004 2946 y(and)f(thic)o(kness.)-118 +3014 y Fl(Draft)f(June)f Ff(25)p Fl(,)i Ff(1996)818 b Fl({5{)2005 +3013 y(c)1990 3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 6 6 +bop -118 13 a Fu(c)o(hange)15 b(of)f(the)h(CTM)g(within)f(the)h(lo)q(op)f +(expresses)j(the)e(rotation)-118 63 y(symmetry)d(relation)h(b)q(et)o(w)o(een) +j(p)q(oin)o(ts)d Fn(1)h Fu(and)g Fn(3)p Fu(.)-118 139 y(Example)i +Fd(\(Ben)o(tley's)f(p)q(olygon\))-118 190 y Fu(This)10 b(co)q(de)i(is)e(all)g +(ab)q(out)g(a)h(double)f(lo)q(op)g(and)g(using)h(the)g(lo)q(op)f(v)n(ari-) +-118 239 y(able)i(from)f(the)i(stac)o(k,)f(next)h(to)g(using)f(the)h +Fe(gsave)e Fu(and)i Fe(grestore)-118 289 y Fu(adv)n(an)o(tageously)m(.)271 +346 y + 4499462 4736286 -6578176 -6907084 6578176 6907084 startTexFig +271 346 a +%%BeginDocument: bentley.eps +10{1 1 10{100 0 moveto + gsave + dup 36 mul rotate + 100 0 lineto stroke + grestore + } for + 36 rotate +} repeat +showpage +%%EndDocument + 271 346 a + endTexFig +-68 740 a Fe(\045!PS)21 b(EPS)-68 789 y(\045\045Title:)f(Bentley's)g(double)g +(loop)-68 839 y(\045\045Creator:)f(cgl)-68 889 y(\045\045CreationDate:)f(May) +k(30)f(1996)-68 939 y(\045\045BoundingBox:)e(-100)i(-105)42 +b(100)21 b(105)-68 989 y(\045\045EndProlog)-68 1038 y(10{1)g(1)g(9{100)g(0)h +(moveto)128 1088 y(gsave)128 1138 y(36)f(mul)g(rotate\045loopcount*36)128 +1188 y(100)g(0)h(lineto)e(stroke)128 1238 y(grestore)-3 1288 +y(})i(for)-3 1337 y(36)f(rotate)-68 1387 y(}repeat)f(showpage)-68 +1500 y Fu(Explanan)o(tion.)d Fe(gsave)c Fu(and)h Fe(grestore)e +Fu(are)j(needed)g(to)f(dra)o(w)-118 1550 y(lo)q(cally)m(,)c(that)j(is)f(at)h +(the)g(end)g(the)g(graphics)g(state|curren)o(tp)q(oin)o(t,)-118 +1600 y(curren)o(tpath)k(and)f(CTM|is)f(restored)j(with)d(the)i(v)n(alues)e +(at)h(the)-118 1650 y(b)q(eginning.)h Fn(1)d(1)f(9)g Fu(stand)h(for)g(b)q +(egin)o(v)n(alue)f(step)h(and)g(endv)n(alue)f(of)-118 1700 +y(the)h Fe(for)g Fu(coun)o(ter.)-118 1776 y(Example)i Fd(\(Another)f(double)f +(lo)q(op\))-118 1826 y Fu(A)h(set)h(of)e(nested)j(p)q(olygons)d(pro)o(vide)h +(also)f(a)h(double)g(lo)q(op)f(situa-)-118 1876 y(tion.)263 +1932 y + 4736286 4736286 -6578176 -6578176 6578176 6578176 startTexFig +263 1932 a +%%BeginDocument: polygon.eps +10 10 100{dup 0 moveto + 5{72 rotate + dup 0 lineto + }repeat +}for stroke +showpage +%%EndDocument + 263 1932 a + endTexFig +-68 2327 a Fe(\045!PS)21 b(EPS)g(Nested)f(pentagons)-68 2376 +y(\045\045Title:)g(Pentagons)-68 2426 y(\045\045Creator:)f(cgl)-68 +2476 y(\045\045CreationDate:)f(June)j(17)h(1996)-68 2526 y +(\045\045BoundingBox:)d(-100)i(-100)g(100)g(100)-68 2576 y(\045\045Pages:)f +(1)-68 2625 y(\045\045EndProlog)-68 2675 y(\045\045Page:)g(1)i(1)-68 +2725 y(10)f(10)g(100{dup)g(0)g(moveto)-3 2775 y(5{72)g(rotate)41 +2825 y(dup)g(0)g(lineto)41 2874 y(}repeat)-68 2924 y(}for)g(stroke)f +(showpage)-118 -55 y Fg(MAPS)11 b Fn(96)p Fg(.)p Fn(2)1252 +b Fq(Par)n(adigms:)19 b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1004 +124 y Fu(Example)h Fd(\(P)o(olygons)e(with)f(splines)h(as)g(sides\))1004 +174 y Fu(This)20 b(generalization)f(of)g(p)q(olygons)h(w)o(as)f(in)o(tro)q +(duced)i(b)o(y)f(Jac)o(k-)1004 224 y(o)o(wski)c(at)g(EuroT)1284 +232 y(E)1308 224 y(X)g Fn(95)p Fu(.)26 b(A)17 b(sp)q(ecial)f(case)i(of)e +Fo(MET)o(AF)n(ONT)p Fu('s)h(in-)1004 274 y(terpath)e(functionalit)o(y)d(is)i +(sho)o(wn)g(en-passan)o(t.)1385 330 y + 4736286 4736286 -6578176 -6578176 6578176 6578176 startTexFig +1385 330 a +%%BeginDocument: polygonii.eps +/r 100 def +/r1 {r .25 mul} def +/r3 {r .75 mul} def +25{r 0 moveto + 4{r3 r3 r1 r1 0 r curveto + 90 rotate + }repeat + .9 .9 scale +}repeat +stroke showpage +%%EndDocument + 1385 330 a + endTexFig +1054 724 a Fe(\045!PS)21 b(EPS)g(Nested)f(`squares')1054 774 +y(\045\045Title:)g(polygon.eps)f(II)1054 824 y(\045\045Creator:)g(cgl)1054 +874 y(\045\045CreationDate:)f(June)j(17)h(1996)1054 924 y +(\045\045BoundingBox:)d(-100)i(-100)g(100)g(100)1054 973 y(\045\045Pages:)f +(1)1054 1023 y(\045\045EndProlog)1054 1073 y(\045\045Page:)g(1)i(1)1054 +1123 y(/r)f(100)g(def)1054 1173 y(/r1)g({r)g(.25)g(mul})g(def)1054 +1222 y(/r3)g({r)g(.75)g(mul})g(def)1054 1272 y(25{r)g(0)g(moveto)1119 +1322 y(4{r3)g(r3)g(r1)h(r1)f(0)h(r)f(curveto)1163 1372 y(90)g(rotate)1163 +1422 y(}repeat)1119 1471 y(.9)h(.9)f(scale)1054 1521 y(}repeat)f(stroke)h +(showpage)1004 1660 y Fu(Example)16 b Fd(\(Barn)f(windo)o(w\))1004 +1711 y Fu(This)f(is)f(all)g(ab)q(out)h(pla)o(ying)e(with)i(circles)h(and)e +(circular)h(arcs.)1995 1696 y Fp(19)1385 1767 y + 4736286 4736286 -2631270 -2631270 2631270 2631270 startTexFig +1385 1767 a +%%BeginDocument: barnwindowii.eps +/l 36 def +/r {l 22.5 sin mul} def +/m {l 22.5 cos mul} def +8{r .5 mul 0 moveto + l 0 lineto + currentpoint %begin circular arc + 22.5 rotate m 0%center + r %radius + -90 90 arc + 22.5 rotate +}repeat +/rin {r .5 mul} def +rin 0 moveto +0 0 rin 0 360 arc +/rout {r m add} def +rout 0 moveto +0 0 rout 0 360 arc +/rin {r .25 mul} def +22.5 rotate +8{m rin add 0 moveto + m 0 rin 0 360 arc + 45 rotate +}repeat +stroke +showpage +%%EndDocument + 1385 1767 a + endTexFig +1054 2161 a Fe(\045!PS)21 b(EPS)1054 2211 y(\045\045Title:)f(Barn)h(Window)f +(II)1054 2261 y(\045\045Creator:)f(cgl)1054 2310 y(\045\045CreationDate:)f +(May)k(29)f(1996)1054 2360 y(\045\045BoundingBox:)e(-45)i(-45)g(45)g(45)1054 +2410 y(\045\045Pages:)f(1)1054 2460 y(\045\045EndProlog)1054 +2510 y(\045\045Page:)g(1)i(1)1054 2560 y(/l)f(36)h(def)1054 +2609 y(/r)f({l)h(22.5)e(sin)i(mul})f(def)1054 2659 y(/m)g({l)h(22.5)e(cos)i +(mul})f(def)1054 2709 y(8{r)g(.5)g(mul)g(0)44 b(moveto)1097 +2759 y(l)22 b(0)g(lineto)1097 2809 y(currentpoint)63 b(\045begin)21 +b(circular)f(arc)p 1004 2858 600 2 v 952 2892 a Fj(19)1004 +2904 y Fs(The)8 b(\014rst)g(example)e(in)i(the)f(blue)g(b)q(o)q(ok)g +(collection)f(pro)o(vides)g(a)i(similar)f(picture)1004 2946 +y(with)k(gradually)e(c)o(hanging)g(scales)i(of)g(grey)m(.)-118 +3014 y Fl(Draft)f(June)f Ff(25)p Fl(,)i Ff(1996)818 b Fl({6{)2005 +3013 y(c)1990 3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 7 7 +bop -25 13 a Fe(22.5)21 b(rotate)g(m)g(0\045center)-25 63 y(r)305 +b(\045radius)-25 113 y(-90)21 b(90)h(arc)-25 163 y(22.5)f(rotate)-68 +212 y(}repeat)-68 262 y(\045inner)f(circle)-68 312 y(/rin)h({r)g(.5)g(mul})g +(def)-68 362 y(rin)g(0)43 b(moveto)-68 412 y(0)21 b(0)h(rin)f(0)h(360)f(arc) +-68 461 y(\045outer)f(circle)-68 511 y(/rout)g({r)i(m)f(add})g(def)-68 +561 y(rout)g(0)43 b(moveto)-68 611 y(0)21 b(0)h(rout)f(0)g(360)h(arc)-68 +661 y(\045extra)e(circles)-68 710 y(/rin)h({r)g(.25)g(mul})g(def)-68 +760 y(22.5)g(rotate)-68 810 y(8{m)g(rin)g(add)g(0)h(moveto)-25 +860 y(m)g(0)f(rin)h(0)f(360)g(arc)-25 910 y(45)h(rotate)-68 +960 y(}repeat)e(stroke)h(showpage)-68 1075 y Fu(I'm)9 b(sure)k(I'll)d(come)h +(bac)o(k)h(some)e(da)o(y)h(and)h(lo)q(ok)e(again)h(through)-118 +1125 y(this)j(windo)o(w,)e(but)j(then)f(pastel)g(colored.)-118 +1205 y(Example)i Fd(\(Bak)o(er's)f(inspiration\))263 1227 y + 4736286 4736286 -5262540 -5262540 5262540 5262540 startTexFig +263 1227 a +%%BeginDocument: baker.eps +4{%one quarter +-15 25 moveto +0 -10 rlineto +60 0 rlineto +0 -30 rlineto +10 0 rlineto +0 40 rlineto +-70 0 rlineto +0 10 rlineto +80 0 rlineto +0 -60 rlineto +-30 0 rlineto +0 10 rlineto +10 0 rlineto +35 -25 moveto +0 -10 rlineto +20 0 rlineto +10 10 rlineto +45 15 moveto +10 10 rlineto +90 rotate +}repeat +stroke +/Courier findfont 10 scalefont setfont +-55 -75 moveto +(Courtesy Woody Baker)show +showpage +%%EndDocument + 263 1227 a + endTexFig +-68 1601 a Fu(This)g(example)g(is)g(similar)f(to)h(Esc)o(her's)j(imp)q +(ossible)c(triangle.)-118 1650 y(Find)f(the)i(essen)o(tial)f(strok)o(e)h(and) +f(rotate.)-68 1729 y Fe(\045!PS)21 b(EPS)-68 1779 y(\045\045Creator:)e(cgl)j +(\(inspired)41 b(by)22 b(Woody)e(Baker\))-68 1828 y(\045\045CreationDate:)e +(May)k(1996)-68 1878 y(\045\045BoundingBox:)d(-80)i(-80)g(80)g(80)-68 +1928 y(\045\045Pages:)f(1)-68 1978 y(\045\045EndProlog)-68 +2028 y(\045\045Page:)g(1)i(1)-68 2078 y(4{-15)e(25)i(moveto)19 +2127 y(0)f(-10)h(rlineto)-3 2177 y(60)f(0)h(rlineto)19 2227 +y(0)f(-30)h(rlineto)-3 2277 y(10)f(0)h(rlineto)19 2327 y(0)f(40)h(rlineto)-25 +2376 y(-70)f(0)h(rlineto)19 2426 y(0)f(10)h(rlineto)-3 2476 +y(80)f(0)h(rlineto)19 2526 y(0)f(-60)h(rlineto)-25 2576 y(-30)f(0)h(rlineto) +19 2625 y(0)f(10)h(rlineto)-3 2675 y(10)f(0)h(rlineto)-68 2725 +y(\045)-3 2775 y(35)f(-25)h(moveto)19 2825 y(0)f(-10)h(rlineto)-3 +2875 y(20)f(0)h(rlineto)-3 2924 y(10)f(10)h(rlineto)-118 -55 +y Fg(MAPS)11 b Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1054 35 y Fe(\045)1119 +85 y(45)22 b(15)f(moveto)1119 134 y(10)h(10)f(rlineto)1054 +184 y(90)g(rotate)1054 234 y(}repeat)f(stroke)1054 284 y(\045)1054 +334 y(/Courier)g(findfont)g(10)h(scalefont)f(setfont)1054 383 +y(-55)h(-75)g(moveto)1054 433 y(\(Courtesy)f(Woody)g(Baker\)show)1054 +483 y(showpage)1004 624 y Fu(Example)c Fd(\(Romano)o(vsky's)c(real)h(Esc)o +(her\))1385 642 y + 4736286 4736286 -13156352 -13156352 13156352 13156352 startTexFig +1385 642 a +%%BeginDocument: jvr.eps +/rl{rlineto}def % to reduce the code +/FS {gsave setgray fill grestore stroke}def + % gsave ... grestore are used to save the graphic environment + % it is necessary if you want to use the current path several + % times, as here: to fill and to stroke +/s3 0.75 sqrt def /unit 40 def + % Two constants, 'unit' defines the size of construction +/U { unit mul 0 exch rl} def + % Verical line for several units +/R { unit mul % Transfer the number of units to length + dup % Copy it + s3 mul % Calculate X-offset + exch % Hide it + 0.5 mul % Calculate Y-offset + rl} def % Draw the line with the given offset pair +/L { unit mul dup s3 mul neg % neg is the only modificaion + exch 0.5 mul rl}def + % Right and left lines for several lines +/M{ s3 unit mul 0.5 unit mul translate -120 rotate} def + % Rotation of the picture to scan the vertices of the central + % triangle +/P1{ 0 0 moveto 2 R -1 L -2 U 4 R -1 U -9 R 4 U -1 L -2 U + 3 R 4 U -4 R 3 U -1 L -2 U -1 L} def + % Sorry, only copying the source Escher draft + % and no own imagination + % Three parts of the picture are made with the same procedure +P1 0.6 FS M +P1 0.8 FS M +P1 0.95 FS M +showpage +%%EndDocument + 1385 642 a + endTexFig +1054 1012 a Fu(Grey)c(scales)h(can)g(b)q(e)g(obtained)f(simply)e(via)h +Fk(h)p Fn(number)q Fk(i)i Fe(setgray)p Fu(,)1004 1062 y(with)h +Fk(h)p Fn(number)q Fk(i)h(2)f Fu([0)p Fn(;)c Fu(1].)15 b(0)c(denotes)h(blac)o +(k)f(and)g(1)g(is)g(white.)17 b(The)1004 1112 y(idea)d(is)g(to)g(construct)i +(the)e(essen)o(tial)h(path|the)f(strok)o(e)h(denoted)1004 1162 +y(b)o(y)f(a)f(grey)h(scale|and)g(to)g(use)h(this)f Fn(3)f Fu(times.)1004 +1266 y Fv(Math)i(graphs)1004 1343 y Fu(In)e(\(L)1085 1336 y +Fg(A)1109 1343 y Fu(\)T)1148 1351 y(E)1172 1343 y(X)g(do)q(cumen)o(ts)g(it)g +(is)g(a)g(problem)1688 1328 y Fp(20)1736 1343 y Fu(ho)o(w)g(to)g(include)g +(ac-)1004 1393 y(curate)i(graphs)f(of)f(mathematical)d(functions.)18 +b(Because)e(of)d(P)o(ost-)1004 1443 y(Script's)i(arithmetic)e(and)h(graphics) +h(capabilities)e(it)i(is)f(handy)g(to)1004 1493 y(use)h(P)o(ostScript.)1004 +1570 y(Example)h Fd(\(Sine)e(function\))1264 1589 y + 8572672 4736286 -13156352 -7235993 13156352 7235993 startTexFig +1264 1589 a +%%BeginDocument: sine.eps +/Courier findfont 15 scalefont setfont +-200 0 moveto 200 0 lineto +-15 -15 rmoveto (x) show +0 -110 moveto 0 110 lineto +-35 -10 rmoveto (sin) show +-180 0 moveto +-180 10 180{%from step to + dup sin 100 mul%(x, 100sin x) + lineto +} for +stroke +showpage +%%EndDocument + 1264 1589 a + endTexFig +1054 1985 a Fe(\045!PS)21 b(EPS)1054 2034 y(\045\045Title:)f(Sine)h(function) +1054 2084 y(\045\045Creator:)e(cgl)j(\(inspired)41 b(by)22 +b(Batagelj\))1054 2134 y(\045\045CreationDate:)c(May)k(27)f(1996)1054 +2184 y(\045\045BoundingBox:)e(-200)i(-110)42 b(200)22 b(110)1054 +2234 y(\045\045EndProlog)1054 2283 y(/Courier)e(findfont)g(15)h(scalefont)f +(setfont)1054 2333 y(\045figure)g(scaled)h(by)g(100)1054 2383 +y(\045x-axes)f(and)h(label)1054 2433 y(-200)g(0)g(moveto)g(200)g(0)h(lineto) +1054 2483 y(-15)f(-15)g(rmoveto)f(\(x\))i(show)1054 2533 y(\045y-axes)e(and)h +(label)1054 2582 y(0)g(-110)g(moveto)g(0)g(110)h(lineto)1054 +2632 y(-35)f(-10)g(rmoveto)f(\(sin\))h(show)1054 2682 y(\045function)1054 +2732 y(-180)g(0)g(moveto)p 1004 2773 600 2 v 952 2807 a Fj(20)1004 +2819 y Fs(Comm)o(unicated)8 b(b)o(y)j(Nico)g(T)m(emme.)j(He)e(solv)o(ed)e +(the)g(problem)f(b)o(y)i(doing)f(the)1004 2861 y(calculations)h(in)j(P)m +(ASCAL.)i(F)m(or)e(adv)n(anced)e(manipulat)o(ion)o(s)g(Mathematica)1004 +2904 y(or)e(Mapple)g(are)g(generally)e(used)h(where)h(the)g(resulting)e(EPS)j +(is)f(pasted)f(up)i(in)1004 2946 y(the)g(\(L)1090 2940 y Fr(A)1112 +2946 y Fs(\)T)1145 2952 y(E)1165 2946 y(X)h(script)f(as)g(usual.)-118 +3014 y Fl(Draft)f(June)f Ff(25)p Fl(,)i Ff(1996)818 b Fl({7{)2005 +3013 y(c)1990 3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 8 8 +bop -68 13 a Fe(-180)21 b(10)g(180{\045from)f(step)h(to)-3 +63 y(dup)g(sin)g(100)h(mul\045\(x,)e(100sin)g(x\))-3 113 y(lineto)-68 +163 y(}for)h(stroke)f(showpage)-68 309 y Fu(The)14 b(in)o(v)o(ok)o(e)f(migh)o +(t)f(read)i(as)g(follo)o(ws.)-68 417 y Fe($$\\psfig{file=si)o(ne.ep)o(s,hei)o +(ght=)o(1in}$)o($)-118 681 y Fv(T)l(ext)i(set)f(along)f(curv)o(ed)h(paths) +-118 806 y Fu(A)20 b(teaser.)40 b(With)20 b(the)h(adv)o(en)o(t)f(of)g +(scalable)g(and)h(rotationable)-118 856 y(outline)13 b(fon)o(ts)h(this)g(is)g +(p)q(ossible)g(to)q(o.)-118 982 y(Example)i Fd(\(Along)e(a)f(circle\))14 +1064 y + 12598512 4736286 -6578176 3289088 6578176 8222720 startTexFig +14 1064 a +%%BeginDocument: textalongarc.eps +/Courier findfont 10 scalefont setfont +/text (happybirthday) def +60 rotate +0 1 12{0 100 moveto + dup%double loop var + text exch 1 getinterval show + -10 rotate +}for +stroke +showpage +%%EndDocument + 14 1064 a + endTexFig +-68 1540 a Fe(\045!PS)21 b(EPS)-68 1590 y(\045\045Title:)f(Typesetting)f +(along)i(arcs)-68 1640 y(\045\045Creator:)e(cgl)-68 1689 y +(\045\045CreationDate:)f(June)j(4)h(1996)-68 1739 y(\045\045BoundingBox:)d +(-100)i(50)g(100)g(125)-68 1789 y(\045\045Pages:)f(1)-68 1839 +y(\045\045EndProlog)-68 1889 y(\045\045Page:)g(1)i(1)-68 1938 +y(/Courier)e(findfont)g(10)h(scalefont)f(setfont)-68 1988 y(/text)g +(\(happybirthday\))f(def)-68 2038 y(50)i(rotate)-68 2088 y(0)g(1)h(12{0)f +(100)g(moveto)-25 2138 y(text)g(exch)g(1)h(getinterval)d(show)-25 +2188 y(-10)i(rotate)-68 2237 y(}for)g(stroke)f(showpage)-68 +2383 y Fu(Joseph)10 b(Romano)o(vsky)d(comm)o(unicated)g(that)i +Fe(kshow)p Fu(|k)o(erning)-118 2433 y(\(and)i(more)e(general)i(p)q +(ositioning\))f(under)h(user)h(con)o(trol|is)e(a)o(v)n(ail-)-118 +2483 y(able)i(whic)o(h)g(allo)o(ws)f(a)h(general)g(def)h(to)f(b)q(e)h +(executed)h(b)q(et)o(w)o(een)f(t)o(w)o(o)-118 2533 y(c)o(haracters)j(of)d(a)g +(string.)-118 2658 y(Example)j Fd(\(Along)e(a)f(spiral\))-118 +2725 y Fu(The)i(blue)g(b)q(o)q(ok)f(pro)o(vides)h(an)f(example)f(of)h(t)o(yp) +q(esetting)i(along)d(a)-118 2775 y(path|a)e(quotation)h(of)f(W)m(o)q(o)q(dy)g +(Allen|where)i(the)g(path)f(accen-)-118 2825 y(tuates)j(his)e(\014lmmak)o(er) +e(profession.)18 b(The)c(example)f(b)q(elo)o(w)g(sho)o(ws)-118 +2875 y(a)g(nice)g(e\013ect)i(with)d(little)g(kno)o(wledge)h(of)f(P)o +(ostScript,)i(essen)o(tially)-118 2924 y(the)g(use)h(of)e Fe(kshow)p +Fu(.)-118 -55 y Fg(MAPS)e Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1140 39 y + 12498534 10525081 -6578176 -6578176 5920358 3946905 startTexFig +1140 39 a +%%BeginDocument: textalongspiral.eps +/Courier findfont 20 scalefont setfont +gsave +-100 0 moveto 50 rotate +{-10 rotate 3 0 rmoveto .98 .98 scale} +(Olga Grineva my charming + St Peterburg hostess)kshow +stroke +grestore +500 100 translate +/l 36 def +/r {l 22.5 sin mul} def +/m {l 22.5 cos mul} def +8{r .5 mul 0 moveto + l 0 lineto + currentpoint %begin circular arc + 22.5 rotate m 0%center + r %radius + -90 90 arc + 22.5 rotate +}repeat +/rin {r .5 mul} def +rin 0 moveto +0 0 rin 0 360 arc +/rout {r m add} def +rout 0 moveto +0 0 rout 0 360 arc +/rin {r .25 mul} def +22.5 rotate +8{m rin add 0 moveto + m 0 rin 0 360 arc + 45 rotate +}repeat +stroke +showpage +showpage +%%EndDocument + 1140 39 a + endTexFig +1054 797 a Fe(\045!PS)21 b(EPS)1054 847 y(\045\045Title:)f(Text)h(along)g +(spiral)1054 897 y(\045\045Creator:)e(J.V.)i(Romanovsky)1054 +947 y(\045\045BoundingBox:)e(-100)i(-90)g(60)g(70)1054 997 +y(\045\045EndProlog)1054 1046 y(/Courier)f(findfont)g(20)h(scalefont)f +(setfont)1054 1096 y(-100)h(0)g(moveto)g(50)g(rotate)1054 1146 +y({-10)g(rotate)f(3)i(0)f(rmoveto)g(.98)g(.98)g(scale})1076 +1196 y(\(Olga)f(Grineva)h(my)g(charming)1097 1246 y(St)h(Peterburg)e +(hostess\)kshow)1054 1295 y(showpage)1004 1433 y Fu(Example)c +Fd(\(Seals\))1004 1482 y Fu(The)k(problem)f(has)h(b)q(een)h(discussed)h(b)o +(y)e(Ho)q(enig)g(at)f(EuroT)2012 1490 y(E)2036 1482 y(X)1004 +1532 y Fn(92)p Fu(,)g(and)f(Zlatu)n(\024)-19 b(sk)n(a)18 b(at)h(EuroT)1501 +1540 y(E)1524 1532 y(X)g Fn(95)p Fu(,)g(b)q(oth)f(biased)h(b)o(y)f +Fo(MET)o(A)p Fu(-)1004 1582 y Fo(F)n(ONT)p Fu(.)10 b(P)o(ostScript)i(alone)e +(is)g(suited)h(to)q(o)f(with)h(an)f(o)o(v)o(erall)f(simpler)1004 +1632 y(pro)q(cess.)35 b(Com)o(bining)16 b(t)o(w)o(o)i(earlier)h(supplied)g +(examples)f(yields)1004 1682 y(Zlatu)n(\024)-19 b(sk)n(a's)13 +b(seal)h(in)g(principle.)1498 1667 y Fp(21)1054 1756 y Fe(\045!PS)21 +b(EPS)1054 1806 y(\045\045Title:)f(Seal,)h(in)g(principle)1054 +1856 y(\045\045Creator:)e(cgl)1054 1906 y(\045\045CreationDate:)f(June)j(6)h +(1996)1054 1956 y(\045\045BoundingBox:)d(-110)i(-45)g(110)g(100)1054 +2006 y(\045\045Pages:)f(1)1054 2055 y(\045\045EndProlog)1054 +2105 y(\045\045Page:)g(1)i(1)1054 2155 y(\045150)f(650)g(translate)1054 +2205 y(/Courier)f(findfont)g(10)h(scalefont)f(setfont)1054 +2255 y(/text)h(\(happy)f(postscripting)f(to)j(you\))f(def)1054 +2304 y(/r)g(100)g(def)1054 2354 y(gsave)1119 2404 y(90)h(rotate)e(\045begin)h +(orientation)1119 2454 y(0)h(r)f(moveto\045begin)f(point)1054 +2504 y({-7.04)g(rotate)h(0)g(r)h(moveto})e(text)h(kshow)1054 +2553 y(grestore\045next)e(the)i(central)f(Escher)1054 2603 +y(3{25)43 b(34)21 b(moveto)1097 2653 y(25)h(-34)f(lineto)p +1004 2692 600 2 v 952 2727 a Fj(21)1004 2738 y Fs(The)c(blue)f(b)q(o)q(ok)g +(also)g(pro)o(vides)f(a)i(seal|Symphon)n(y)d(No.)p Fi(9)p Fs(|but)i(that)g +(is)1004 2780 y(more)c(complex)f(and)h(ipso)h(facto)f(requires)f(more)h(kno)o +(wledge)g(of)g(P)o(ostScript)1004 2821 y(to)g(understand)d(what)j(is)g(going) +f(on,)h(IMHO,)h(with)f(all)g(resp)q(ect.)j(T)m(o)e(set)f(this)1004 +2863 y(p)q(oster)h(from)g(the)h(blue)g(b)q(o)q(ok)f(is)h(no)g(more)g +(di\016cult)f(than)g(the)h(use)g(of)g Fh(arc)p Fs(,)1004 2904 +y(ho)o(w)o(ev)o(er.)f(My)d(example)e(giv)o(es)h(y)o(ou)g(the)g(feeling)f +(that)h(y)o(ou)g(understand)d(what)1004 2946 y(is)11 b(going)g(on,)f(I)i(hop) +q(e.)-118 3014 y Fl(Draft)e(June)f Ff(25)p Fl(,)i Ff(1996)818 +b Fl({8{)2005 3013 y(c)1990 3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 9 9 +bop -25 13 a Fe(17)22 b(-38.2)e(lineto)-25 63 y(17)i(20)f(lineto)-47 +113 y(-17.6)g(0)h(lineto)-68 163 y(120)f(rotate)-68 212 y(}repeat)f(stroke)h +(showpage)33 331 y + 12006484 7104430 -7235993 -2631270 7235993 5920358 startTexFig +33 331 a +%%BeginDocument: seal.eps +/Courier findfont 10 scalefont setfont +/text (happy postscripting to you) def +/r 100 def +gsave + 90 rotate %begin orientation + 0 r moveto%begin point +{-7.04 rotate 0 r moveto} text kshow +grestore +3{25 34 moveto + 25 -34 lineto + 17 -38.2 lineto + 17 20 lineto + -17.6 0 lineto +120 rotate +}repeat +stroke +showpage +%%EndDocument + 33 331 a + endTexFig +-68 850 a Fu(Remark.)28 b(The)18 b(di\013erence)i(of)d(fon)o(ts)h(in)f(the)i +(main)d(text)i(and)-118 900 y(that)13 b(used)g(b)o(y)g(P)o(ostScript)h(is)e +(no)h(longer)g(there)h(when)f(P)o(ostScript)-118 950 y(fon)o(ts)j(are)h(used) +g(throughout,)f(b)q(e)h(it)f(the)h(P)o(ostScript)g(v)o(ersion)f(of)-118 +999 y(the)e(CM)g(family)m(.)-118 1076 y(Example)i Fd(\(Gurari's)e(squares\)) +50 1093 y + 11461808 4736286 -13156352 -2631270 13156352 8222720 startTexFig +50 1093 a +%%BeginDocument: gurarisq.eps +/r 50 def +0 0 moveto 90 rotate +50{r 0 rmoveto + 1 1 4{0 r rlineto + 90 rotate}for + -30 rotate + .9 .9 scale +}repeat +stroke showpage +%%EndDocument + 50 1093 a + endTexFig +-68 1487 a Fe(\045!PS)21 b(Gurari)f(squares)-68 1537 y(\045\045BoundingBox:)f +(-200)i(-110)42 b(200)21 b(110)-68 1586 y(\045\045Creator:)e(cgl)-68 +1636 y(\045\045CreationDate:)f(June)j(20)h(1996)-68 1686 y(\045\045EndProlog) +-68 1736 y(/r)f(22)g(def)-68 1786 y(/square)f({1)h(1)h(4{0)f(r)h(rlineto)128 +1835 y(90)f(rotate}for})f(def)-68 1885 y(0)h(0)h(moveto)e(90)i(rotate)-68 +1935 y(50{r)f(0)g(rmoveto)g(square)-3 1985 y(-30)g(rotate)g(.9)g(.9)h(scale) +-68 2035 y(}repeat)e(stroke)h(showpage)-118 2174 y Fu(Example)16 +b Fd(\(Gurari's)e(ABC\))-118 2224 y Fu(V)m(ery)g(nice)g(this)g(suggestion)g +(of)g(motion.)247 2281 y + 5257277 7104430 0 -2960179 6578176 5920358 startTexFig +247 2281 a +%%BeginDocument: gurariabc.eps +/Times-Bold findfont 45 scalefont setfont +-40 rotate +1 -.03 0{setgray + 0 0 moveto + (ABC) show + 3 rotate + } for +0 0 moveto -4 rotate +1 setgray (ABC) show +showpage +%%EndDocument + 247 2281 a + endTexFig +-68 2825 a Fe(\045PostScript)19 b(EPS)-68 2874 y(\045\045Title:)h(Guarai's)g +(ABC)-68 2924 y(\045\045BoundingBox:)f(0)i(-45)43 b(100)21 +b(75)-118 -55 y Fg(MAPS)11 b Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1054 35 y Fe(\045\045Creator:) +k(Gurari)1054 85 y(\045\045CreationDate:)f(copied)j(June)g(17)g(1996)1054 +134 y(\045\045Pages:)f(1)1054 184 y(\045\045EndComments)1054 +234 y(\045\045EndProlog)1054 284 y(\045\045Page:)g(1)i(1)1054 +334 y(/Times-Bold)d(findfont)h(45)i(scalefont)e(setfont)1054 +383 y(-40)h(rotate)1054 433 y(1)g(-.03)g(0{setgray)1250 483 +y(0)g(0)h(moveto)1250 533 y(\(ABC\))f(show)1250 583 y(3)g(rotate)1228 +633 y(})h(for)1054 682 y(0)f(0)h(moveto)e(-4)i(rotate)1054 +732 y(1)f(setgray)g(\(ABC\))f(show)1054 782 y(showpage)1004 +923 y Fu(Example)c Fd(\(W)m(alking)c(along)h(the)h(S-curv)o(e\))1004 +974 y Fu(In)j Fd(The)g(MET)m(AF)o(ONTb)q(o)q(ok)j Fu(ex)p Fn(13)p +Fu(.)p Fn(10)15 b Fu(is)i(ab)q(out)g(dra)o(wing)f(o)o(v)o(er-)1004 +1023 y(lapping)h(disks)h(along)e(a)i(path,)g(the)h(S-\014gure.)30 +b(Ho)o(w)17 b(to)h(do)g(this)1004 1073 y(in)e(P)o(ostScript)h(straigh)o(ta)o +(w)o(a)o(y?)23 b(There)18 b(is)e(no)g(`p)q(oin)o(t)f(of)s(')g(a)h(path)1004 +1123 y(op)q(erator)e(so)g(the)g(b)q(est)g(w)o(e)g(can)g(attain)f(is)g(to)g(w) +o(alk)g(along)f(a)h(math)1004 1173 y(function.)1264 1231 y + 8572672 4736286 -13156352 -7235993 13156352 7235993 startTexFig +1264 1231 a +%%BeginDocument: sinedisks.eps +newpath +-180 10 180{dup sin 100 mul%(x, 100sin x) + 12.5 0 360 arc + gsave 1 setgray fill grestore + stroke +} for +showpage +%%EndDocument + 1264 1231 a + endTexFig +1054 1627 a Fe(\045PostScript)19 b(Sine)i(with)g(overlapping)f(disks)1054 +1677 y(\045\045BoundingBox:)f(-200)i(-110)42 b(200)22 b(110)1054 +1726 y(\045\045Creator:)d(cgl)j(\(METAFONTbook)d(ex13.10\))1054 +1776 y(\045\045CreationDate:)f(June)j(17)h(1996)1054 1826 y +(\045\045EndProlog)1054 1876 y(newpath)1054 1926 y(-180)f(10)g(180{dup)f(sin) +i(100)f(mul\045\(x,)f(100sin)h(x\))1141 1975 y(12.5)g(0)g(360)h(arc)1141 +2025 y(gsave)f(1)g(setgray)g(fill)g(grestore)1141 2075 y(stroke)1054 +2125 y(}for)g(showpage)1054 2239 y Fu(Explanation.)16 b Fe(1)21 +b(setgray)g(fill)10 b Fu(is)h(the)h(erase)g(functionalit)o(y)m(,)1004 +2289 y(encapsulated)j(to)f(yield)f(what)h(w)o(e)g(w)o(an)o(t.)1004 +2393 y Fv(T)l(ables)h(set)g(sidew)o(a)o(ys)1004 2471 y Fu(Another)j(teaser)h +(is)e(to)g(set)i(tables)e(rotated.)29 b(Rokic)o(ki)16 b(pro)o(vided)1004 +2521 y(rotate)f(macros)f(along)g(with)g(his)h Fe(dvips)p Fu(,)e(among)g +(others.)21 b(I)15 b(ha)o(v)o(e)1004 2570 y(b)q(orro)o(w)o(ed)c(the)g +(essence)i(from)c(his)h(rotate)h(macros)e(and)i(recast)h(in)o(to)1004 +2620 y(the)i(follo)o(wing.)1054 2697 y Fe(\\def\\rotate#1\045st)o(uff)1293 +2747 y(#2\045degrees)20 b(in)i(PS)f(direction)1054 2797 y +({\\setbox\\abox=\\h)o(box{#)o(1}\045)1076 2846 y(\\adim\\ht\\abox\\a)o +(dvanc)o(e\\adi)o(m)e(by\\dp\\abox)1076 2896 y(\\hbox)h(to\\adim{\\vbox)f +(to\\wd\\abox)1076 2946 y({\\vskip\\wd\\abox)-118 3014 y Fl(Draft)10 +b(June)f Ff(25)p Fl(,)i Ff(1996)818 b Fl({9{)2005 3013 y(c)1990 +3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 10 10 +bop -47 13 a Fe(\\special{ps:)20 b(gsave)19 63 y(currentpoint)f(currentpoint) +g(translate)19 113 y(#2)i(neg)g(rotate)19 163 y(neg)g(exch)g(neg)g(exch)g +(translate}\045)-47 212 y(\\box\\abox\\vss}\\hss}\045)-47 262 +y(\\special{ps:)f(currentpoint)106 312 y(grestore)g(moveto}\045)-68 +362 y(}\045end)g(rotate)-68 475 y Fu(The)14 b(p)q(oin)o(t)g(is)g(that)h(it)f +(is)g(not)g(m)o(uc)o(h.)k(The)d Fe(ps:)k Fu(is)14 b(dep)q(enden)o(t)-118 +525 y(on)g(the)g(system)g(still,)e(alas.)-118 602 y(Example)k +Fd(\(Rotated)e(table\))-118 653 y Fu(The)g(example)f(w)o(orks)h(under)g(UNIX) +h(with)e(Rokic)o(ky's)g Fe(dvips)p Fu(.)-68 720 y Fe(\\def\\data{1\\cs2\\)o +(rs)150 770 y(3\\cs4)20 b(})-68 820 y(pre)-68 869 y(\\rotate{\\framed)106 +919 y(\\btable\\data})84 969 y({90})-68 1019 y(post)492 940 +y Fu(pre)15 b + + gsave currentpoint currentpoint translate 90 neg rotate neg exch neg exch translate +564 942 142 2 v 564 1085 2 143 v 586 998 a Fu(1)48 b(2)586 +1069 y(3)41 b(4)p 704 1085 V 564 1087 142 2 v 710 940 a + currentpoint grestore moveto +724 940 a Fu(p)q(ost)-68 1117 y(Remark.)21 b(Gurari)15 b(\(1994\))g(has)h +(pro)o(vided)f(some)g(more)f(exam-)-118 1167 y(ples)f(of)g(P)o(ostScript)p +Fk($)p Fu(\(Al\)DraT)408 1175 y(E)431 1167 y(X)h(in)o(teraction.)j(Real)c(in) +o(terfac-)-118 1217 y(ing.)20 b(Apart)15 b(from)e(p)q(ortabilit)o(y)g +(problems)h(it)g(gets)h(quite)g(compli-)-118 1267 y(cated.)20 +b(F)m(or)14 b(the)h(momen)o(t)d(I)i(refrain)g(and)g(co)q(de)i(the)f +(`pictures')f(in)-118 1316 y(ra)o(w)g(P)o(ostScript)g(assisted)h(b)o(y)f +Fo(MET)o(AF)n(ONT)h Fu(for)f(prompting)e(con-)-118 1366 y(trol)h(p)q(oin)o +(ts)g(of)g(those)h(curv)o(es)h(whic)o(h)f(can)f(b)q(e)h(sp)q(eci\014ed)h +(elegan)o(tly)-118 1416 y(in)e(a)h(declarativ)o(e)g(w)o(a)o(y)m(.)-118 +1519 y Fv(MET)l(AF)o(ONT/MetaP)o(ost)h(user)g(in)o(terface)-118 +1597 y Fu(Sometimes)g(it)i(is)g(more)f(natural)g(to)h(sp)q(ecify)h(p)q(oin)o +(ts)f(and)g Fq(dir)n(e)n(c-)-118 1646 y(tions)p Fu(.)27 b(It)17 +b(is)g(true)h(that)f(sp)q(ecifying)g(a)f(con)o(trol)h(p)q(oin)o(t)f(along)g +(the)-118 1696 y(direction)11 b(can)g(yield)f(the)i(same)e(e\013ect)i(but)f +(the)h(distance)f(b)q(et)o(w)o(een)-118 1746 y(the)j(p)q(oin)o(t)g(and)f(its) +h(con)o(trol)g(p)q(oin)o(t)f(in\015uences)j(the)e(shap)q(e.)-118 +1823 y(Example)i Fd(\(Esc)o(her's)g(knot\))-118 1874 y Fu(This)e(example)e +(is)i(all)f(ab)q(out)g(sp)q(ecifying)h(directions.)263 1931 +y + 4736286 4736286 -5262540 -5262540 5262540 5262540 startTexFig +263 1931 a +%%BeginDocument: escherknotmf.eps +3{-43.30139 25 moveto + -43.30139 55.49103 -27.56424 85.00061 + 0 85.00061 curveto + 27.56424 85.00061 43.30139 55.49103 + 43.30139 25 curveto + 43.30139 -5.94014 26.79497 -34.5299 + 0 -50 curveto +120 rotate +}repeat +stroke showpage +%%EndDocument + 263 1931 a + endTexFig +-68 2300 a Fu(In)g Fo(MET)o(AF)n(ONT)h Fu(the)f(co)q(ding)g(w)o(ould)f(read)h +(as)g(follo)o(ws.)-68 2376 y Fe(\045Escher's)20 b(Knot.)g(June)h(96.)h +(cgl@rc.service.)o(rug.n)o(l)-68 2426 y(def)f(openit)f(=)i(openwindow)e +(currentwindow)-3 2476 y(from)h(origin)g(to)g(\(screen_rows,scre)o(en_co)o +(ls\))-3 2526 y(at)g(\(-2r,3r\)enddef;)-68 2576 y(pickup)f(pencircle)g +(scaled)h(1;)-68 2625 y(tracingstats:=pr)o(oofin)o(g:=1;)d(screenstrokes;)-68 +2675 y(pair)j(p[];)-68 2725 y(\045parameters)-68 2775 y(r:=100;)f(alfa=90;) +-68 2825 y(\045)-68 2874 y(p2:=\(0,.85r\);)f(\045independent)g(from)i(p1,3,4) +-68 2924 y(p4:=\(0,-.5r\);)-118 -55 y Fg(MAPS)11 b Fn(96)p +Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 b(Just)14 b(a)i(little)d(bit)h(of)h +(PostScript)1054 35 y Fe(\045dependent)k(points)i(because)f(of)i(symmetry) +1054 85 y(p1:=p4)e(rotated)h(-120;)1054 134 y(p3:=p4)f(rotated)42 +b(120;)1054 184 y(path)21 b(q;)1054 234 y(q=p1{dir)f(alfa}..{\(1,0\)}p2.)o(.) +1141 284 y({dir\(-alfa\)}p3..{)o(dir\(a)o(lfa-2)o(40\)}p)o(4;)1054 +334 y(draw)h(q;)1054 383 y(draw)g(q)g(rotated)g(120;)1054 433 +y(draw)g(q)g(rotated-120;)1054 483 y(showit;)1054 533 y(end)1054 +649 y Fu(By)9 b(the)h(nature)h(of)d(the)i(\014gure)g(not)g(only)e(p)q(oin)o +(ts)i(are)g(related)g(but)1004 699 y(also)j(their)i(directions.)k(Ho)o(w)13 +b(to)h(cop)q(e)h(with)f(this)g(in)f(P)o(ostScript?)1004 748 +y(It)21 b(can)f(b)q(e)h(done)g(but)g(is)f(not)h(so)f(elegan)o(t,)i(honestly)f +(sp)q(eaking)1004 798 y(cum)o(b)q(ersome.)c(But)d Fn(:)7 b(:)g(:)f +Fu(there)15 b(is)f(a)f(solution)g(or)h(t)o(w)o(o,)f(hang)h(on.)1054 +877 y Fe(\045!PS)21 b(EPS)1054 927 y(\045\045Title:)f(Escher)g(knot)h(II)1054 +977 y(\045\045Creator:)e(cgl)j(\(inspired)41 b(by)22 b(Knotplot\))1054 +1026 y(\045\045CreationDate:)c(June)j(1996)1054 1076 y(\045\045BoundingBox:)e +(-95)i(-95)g(95)g(95)1054 1126 y(\045\045Pages:)f(1)1054 1176 +y(\045\045EndProlog)1054 1226 y(\045\045Page:)g(1)i(1)1054 +1275 y(\045)1054 1325 y(/angle)e(90)i(def)1054 1375 y(/r)f(100)g(def)1054 +1425 y(/point)f({0)i(-.5)f(r)g(mul}def)1054 1475 y(/p1)g({-.25)g(r)g(mul)g(3) +h(sqrt)f(mul)43 b(.25)21 b(r)h(mul)f(moveto)1163 1524 y(currentpoint)1163 +1574 y(angle)f(sin)i(2)f(mul)g(add)h(exch)1163 1624 y(angle)e(cos)i(2)f(mul)g +(add)h(exch)1163 1674 y(-20)f(.85)g(r)h(mul)1163 1724 y(0)f(.85)g(r)h(mul) +1163 1774 y(curveto)e(stroke})g(def)1054 1823 y(/p3)h({)h(.25)f(r)g(mul)g(3)h +(sqrt)f(mul)43 b(.25)21 b(r)h(mul)f(moveto)1163 1873 y(\045Control)f(point) +1163 1923 y(currentpoint)1163 1973 y(angle)g(sin)i(-15)f(mul)g(add)43 +b(exch)1163 2023 y(angle)20 b(cos)43 b(15)22 b(mul)f(add)43 +b(exch)1163 2072 y(\045Control)20 b(point:)1163 2122 y(\045)h(58.62)g(-.5)g +(r)h(mul)f(5)h(add\045angle)e(90)1163 2172 y(0)217 b(angle)21 +b(-240)g(add)g(cos)h(-15)f(mul)g(add)1185 2222 y(-.5)g(r)g(mul)g(angle)g +(-240)g(add)g(sin)h(-15)f(mul)g(add)1163 2272 y(0)g(-.5)g(r)h(mul)1163 +2321 y(curveto)e(stroke})g(def)1054 2371 y(3{p1)1097 2421 y(gsave)h(-1)g(1)h +(scale)f(p1)g(grestore\045reflect)1097 2471 y(p3)1097 2521 +y(120)h(rotate)1054 2571 y(}repeat)e(showpage)1054 2686 y Fu(Explanation.)26 +b(The)17 b(essen)o(tial)g(curv)o(e)h(is)f(split)f(in)o(to)g +Fn(3)h Fu(pieces:)1004 2736 y(p)1027 2742 y Fg(1)1046 2736 +y Fu(,)p Fn(:)7 b(:)g(:)t Fu(p)1135 2742 y Fg(3)1154 2736 y +Fu(.)18 b(The)c(\014rst)g(t)o(w)o(o)f(are)h(related)g(b)o(y)f(re\015ection.) +19 b(The)14 b(third)1004 2786 y(m)o(ust)9 b(prop)q(erly)i(matc)o(h.)16 +b(In)11 b(the)g(Colum)o(bus's)e(egg)h(paragraph)g(the)1004 +2836 y(straigh)o(t)j Fe(.eps)e Fu(co)q(de)j(is)f(giv)o(en,)f(biased)h(b)o(y)f +(the)i(kno)o(wledge)e(of)g(the)1004 2886 y(\(con)o(trol\))i(p)q(oin)o(ts.) +-118 3014 y Fl(Draft)c(June)f Ff(25)p Fl(,)i Ff(1996)811 b +Fl({10{)2005 3013 y(c)1990 3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 11 11 +bop -118 13 a Fv(A)16 b(teaser)57 b Fu(More)15 b(complicated)e(is)h(when)h +(the)g(line)e(is)h(c)o(hanged)-118 63 y(in)o(to)i(a)g(tub)q(e,)h(and)g(when)g +(w)o(e)g(ha)o(v)o(e)f(to)g(deal)h(with)f(hidden)g(lines.)-118 +113 y(In)d Fo(MET)o(AF)n(ONT)i Fu(the)f(co)q(de)g(could)f(read)h(as)g(follo)o +(ws,)d(where)k(use)f(is)-118 163 y(made)f(of)g Fe(intersectiontimes)d +Fu(and)k(of)f(subpaths.)725 147 y Fp(22)-118 243 y Fu(Example)j +Fd(\(Esc)o(her's)g(knot)e(I)q(I)q(I\))-118 294 y Fu(This)g(example)f(is)h +(all)f(ab)q(out)i(getting)f(from)e(a)i Fq(de)n(clar)n(ative)j +Fu(sp)q(eci-)-118 344 y(\014cation)c(in)h Fo(MET)o(AF)n(ONT)h +Fu(to)f(a)f Fq(imp)n(er)n(ative)j Fu(EPS)f(co)q(de.)251 405 +y + 5115182 4736286 -2631270 -2039234 2631270 2828615 startTexFig +251 405 a +%%BeginDocument: escherknotiii.epsabr +3{-21.6507 12.5 moveto +-21.6507 27.74551 -13.78212 42.5003 + 0 42.5003 curveto +13.78212 42.5003 21.6507 27.74551 + 21.6507 12.5 curveto +21.6507 -0.24506 16.04897 -12.19249 + 6.58395 -20.3313 curveto +-14.3152 15.86746 moveto +-12.43301 23.58928 -7.45113 29.75021 + 0 29.75021 curveto +9.64748 29.75021 15.15549 19.42186 + 15.15549 8.75 curveto +15.15549 -2.07904 9.37823 -12.08548 + 0 -17.5 curveto +120 rotate +}repeat stroke showpage + +%%EndDocument + 251 405 a + endTexFig +-68 779 a Fu(First)f(the)g(declarativ)o(e)g Fo(MET)o(AF)n(ONT)h +Fu(co)q(de.)-68 857 y Fe(\045Escher)20 b(Knot)h(III.)g(June)g(96.)g +(cgl@rc.service.rug)o(.nl)-68 907 y(def)g(openit)f(=)i(openwindow)e +(currentwindow)-3 957 y(from)h(origin)g(to)g(\(screen_rows,scre)o(en_co)o +(ls\))-3 1006 y(at)g(\(-2r,3r\)enddef;)-68 1056 y(pickup)f(pencircle)g +(scaled)h(1;)-68 1106 y(tracingstats:=pr)o(oofin)o(g:=1;)d(screenstrokes;)-68 +1156 y(numeric)i(t,)h(u,)h(v,)f(w;)-68 1206 y(pair)g(p[];)g(path)g(q[];)-68 +1255 y(def)g(assignpoints=)-47 1305 y(p2:=\(0,.85r\);)f(\045independent)f +(from)i(p1,3,4)-47 1355 y(p4:=\(0,-.5r\);)-47 1405 y(\045dependent)f(points)h +(because)f(of)h(symmetry)-47 1455 y(p1:=p4)g(rotated)f(-120;)-47 +1505 y(p3:=p4)h(rotated)42 b(120;)-68 1554 y(enddef;)-68 1604 +y(\045)-68 1654 y(alfa=90;r:=100;)e(assignpoints;)-68 1704 +y(q1:=p1{dir)19 b(alfa}..{\(1,0\)}p2..)19 1754 y({dir\(-alfa\)}p3..{)o +(dir\(a)o(lfa-)o(240\)})o(p4;)-68 1803 y(\045inside)106 1853 +y(r:=.75r;)h(assignpoints;)-68 1903 y(q2:=p1{dir)f(alfa}..{\(1,0\)}p2..)-47 +1953 y({dir\(-alfa\)}p3..{dir)o(\(alfa)o(-240)o(\)}p4;)-68 +2003 y(\(t,u\)=)h(subpath)h(\(2.5,3\))f(of)h(q1)-3 2052 y(intersectiontimes)d +(\(q2)k(rotated)e(-120\);)-68 2102 y(\(v,w\)=)g(q2)i(intersectiontime)o(s)411 +2152 y(\(q1)f(rotated)g(120\);)-68 2202 y(\045showvariable)e(t,u;)-68 +2252 y(draw)i(subpath)f(\(0,2.5)h(+)g(t/2\))g(of)g(q1;)-68 +2302 y(draw)g(subpath)f(\(0,2.5)h(+)g(t/2\))g(of)g(q1)520 2351 +y(rotated)f(120;)-68 2401 y(draw)h(subpath)f(\(0,2.5)h(+)g(t/2\))g(of)g(q1) +520 2451 y(rotated-120;)-68 2501 y(\045showvariable)e(v,w;)-68 +2551 y(draw)i(subpath)f(\(v,3\))h(of)g(q2;)-68 2600 y(draw)g(subpath)f +(\(v,3\))h(of)g(q2)h(rotated)e(120;)-68 2650 y(draw)h(subpath)f(\(v,3\))h(of) +g(q2)h(rotated-120;)-68 2700 y(showit;)p -118 2748 600 2 v +-170 2783 a Fj(22)-118 2794 y Fs(This)9 b(co)q(de)g(w)o(orks)g(as)g(suc)o(h)f +(on)h(m)o(y)g(Mac)g(with)g(Bluesky's)f(PD)h(MET)m(AF)o(ONT.)-118 +2838 y(F)m(or)j(other)e(en)o(vironmen)o(ts)f(build)i(a)h(c)o(haracter)d(from) +i(it,)h(or)g(adapt)e(it)i(for)g(use)-118 2881 y(in)j(MetaP)o(ost,)h(or)f(ev)o +(en)g(simpler)f(cop)o(y)g(the)h(bread-and-b)o(utt)o(er)e(EPS)i(co)q(de)-118 +2924 y(whic)o(h)c(is)g(app)q(ended)e(at)i(the)g(end.)-118 -55 +y Fg(MAPS)g Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1054 35 y Fe(end)1054 +149 y Fu(T)m(o)k(giv)o(e)h(the)h(reader)g(an)f(impression)f(of)h(what)g +Fo(MET)o(A)p Fa(post)1004 198 y Fu(will)14 b(yield)h Fe(escherknotIII.eps)p +Fu(,)d(the)k(imp)q(erativ)o(e)f(co)q(de,)h(is)f(in-)1004 248 +y(cluded.)1133 233 y Fp(23)1054 325 y Fe(\045!PS)21 b(EPS)1054 +375 y(\045\045BoundingBox:)e(-40)i(-31)g(40)g(43)1054 424 y(\045\045Creator:) +e(MetaPost)i(and)g(JJW,)g(CGL)1054 474 y(\045\045CreationDate:)d(June)j(17)h +(1996)1054 524 y(\045\045Pages:)e(1)1054 574 y(\045\045EndProlog)1054 +624 y(\045\045Page:)g(1)i(1)1054 674 y(3{-21.6507)d(12.5)i(moveto)1054 +723 y(-21.6507)f(27.74551)g(-13.78212)g(42.5003)1141 773 y(0)i(42.5003)e +(curveto)1054 823 y(13.78212)g(42.5003)g(21.6507)h(27.74551)1119 +873 y(21.6507)f(12.5)h(curveto)1054 923 y(21.6507)f(-0.24506)g(16.04897)g +(-12.19249)1119 972 y(6.58395)g(-20.3313)h(curveto)1054 1022 +y(\045)1054 1072 y(-14.3152)f(15.86746)g(moveto)1054 1122 y(-12.43301)g +(23.58928)g(-7.45113)g(29.75021)1119 1172 y(0)i(29.75021)e(curveto)1054 +1221 y(9.64748)g(29.75021)g(15.15549)g(19.42186)1119 1271 y(15.15549)g(8.75)h +(curveto)1054 1321 y(15.15549)f(-2.07904)g(9.37823)g(-12.08548)1119 +1371 y(0)i(-17.5)e(curveto)1054 1421 y(120)h(rotate)1054 1471 +y(}repeat)f(stroke)h(showpage)1054 1584 y Fu(As)d(can)f(b)q(e)h(seen)h(from)d +(the)i(last)f(co)q(de)h(it)f(is)g(all)g(ab)q(out)g(\014nd-)1004 +1634 y(ing)e(the)i(righ)o(t)e(\(con)o(trol\))h(p)q(oin)o(ts)g(and)f(dra)o(w)h +(the)g(strok)o(es,)h(as)f(re-)1004 1684 y(mark)o(ed)g(at)h(the)h(b)q +(eginning)f(of)g(this)g(note.)29 b(The)18 b(di\013erence)h(b)q(e-)1004 +1734 y(t)o(w)o(een)14 b(the)h(declarativ)o(e)f Fo(MET)o(AF)n(ONT)h +Fu(sp)q(eci\014cation)f(and)g(the)g(re-)1004 1784 y(sulting)i(\(unedited\))h +Fo(MET)o(A)p Fa(post)h Fu(co)q(de)f(is)f(striking.)26 b(When)16 +b(the)1004 1834 y(last)h(co)q(de)g(is)g(sho)o(wn)g(\014rst)h(one)f(w)o(ould)f +(sa)o(y)m(,)h(ah)p Fn(:)7 b(:)g(:)e Fu(P)o(ostScript)18 b(is)1004 +1883 y(easy)j(just)g(data)f(and)h(some)f(strok)o(es.)39 b(The)22 +b(resulting)e(co)q(de)i(is)1004 1933 y(equiv)n(alen)o(t)d(to)g(W)m(o)q(o)q +(dy)g(Bak)o(er's)h(co)q(de:)30 b(just)20 b(the)g(righ)o(t)f(strok)o(e)1004 +1983 y(and)14 b(a)f(rotation)g(or)h(t)o(w)o(o.)1054 2034 y(KnotPlot)c(on)g +(the)g(net)h(pro)o(vides)f(a)g(more)f(complicated)g(v)o(ersion)1004 +2083 y(where)i(the)g(ligh)o(t)d(re\015ection)j(is)f(em)o(ulated)f(b)o(y)h +(shades)h(of)e(grey)m(.)16 b(The)1004 2133 y(gzipp)q(ed)e(\014le)g(is)g +Fn(64)p Fu(KB,)f(ho)o(w)o(ev)o(er.)19 b(A)14 b(w)o(orld)f(of)g(di\013erence.) +1004 2212 y Fv(Colum)o(bus')e(egg)55 b Fu(Wh)o(y)11 b(not)h(use)h +Fo(MET)o(AF)n(ONT)g Fu(to)e(create)j(`the)1004 2261 y(\(con)o(trol\))f(p)q +(oin)o(ts')f(from)f(the)j(descriptiv)o(e)f(picture)h(and)f(use)g(these)1004 +2311 y(in)g(ra)o(w)h(P)o(ostScript)h(straigh)o(ta)o(w)o(a)o(y?)1054 +2362 y(After)10 b(assigning)e Fe(precontrol)p Fu(-s)f(and)j +Fe(postcontrol)p Fu(-s)d(to)i(pairs)1004 2412 y(and)i(inserting)g +Fe(show)p Fu(-s,)f Fo(MET)o(AF)n(ONT)i Fu(yielded)f(for)g(the)g(simple)e(Es-) +1004 2462 y(c)o(her)15 b(knot)f(the)g(data)g(in)g(the)g(transcript)h(\014le.) +k(A)14 b(little)f(editing)g(of)1004 2511 y(this)h(log)f(\014le)h(resulted)h +(in)e(the)i(follo)o(wing)c(imp)q(erativ)o(e)i(EPS)h(co)q(de.)1054 +2588 y Fe(\045!PS)21 b(EPS)1054 2638 y(\045\045Title:)f(Escher)g(knot)h(\(mf) +h(prompted\))p 1004 2688 V 952 2722 a Fj(23)1004 2734 y Fs(A)12 +b(white)e(lie.)15 b(I)c(ha)o(v)o(e)f(edited)g(the)g(\014le)g(and)h(reduced)e +(the)h(data|and)f(deleted)1004 2776 y Fh(dtransform)o Fs(,)j +Fh(idtransfo)o(rm)f Fs(and)h(the)h(v)n(arious)f Fh(set...)p +Fs(|for)f(the)i Fi(6)h Fs(strok)o(es)1004 2819 y(in)o(to)e(only)h +Fi(2)g Fs(and)g(rotated)e(these.)20 b(MET)m(AF)o(ONT)c(allo)o(w)o(ed)d(me)f +(to)h(declara-)1004 2861 y(tiv)o(ely)g(sp)q(ecify)g(the)h(picture)f(while)i +(MetaP)o(ost)e(pro)o(vided)g(me)h(with)h(the)f(es-)1004 2904 +y(sen)o(tial)9 b(path)h(data.)k(W)m(ell)p Fi(:)5 b(:)h(:)g +Fs(ev)o(en)j(MET)m(AF)o(ONT)14 b(can)c(b)q(e)h(ask)o(ed)f(to)g(pro)o(vide) +1004 2946 y(those)g(\(con)o(trol\))f(p)q(oin)o(ts.)-118 3014 +y Fl(Draft)h(June)f Ff(25)p Fl(,)i Ff(1996)811 b Fl({11{)2005 +3013 y(c)1990 3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 12 12 +bop -68 13 a Fe(\045\045Creator:)19 b(cgl)-68 63 y(\045\045CreationDate:)f +(June)j(1996)-68 113 y(\045\045BoundingBox:)e(-80)i(-80)g(80)g(80)-68 +163 y(\045\045Pages:)f(1)-68 212 y(\045\045EndProlog)-68 262 +y(\045\045Page:)g(1)i(1)-68 312 y(3{-43.30139)d(25)j(moveto)-47 +362 y(-43.30139)e(55.49103)h(-27.56424)e(85.00061)-25 412 y(0)j(85.00061)e +(curveto)-25 461 y(27.56424)g(85.00061)h(43.30139)f(55.49103)-25 +511 y(43.30139)g(25)i(curveto)-25 561 y(43.30139)e(-5.94014)h(26.79497)f +(-34.5299)-25 611 y(0)i(-50)f(curveto)-68 661 y(120)g(rotate)-68 +710 y(}repeat)f(stroke)h(showpage)-68 823 y Fu(I)i(presume)h(the)h +(functionalit)o(y)d(is)i(similar)d(to)i(Jac)o(k)o(o)o(wski's)-118 +873 y Fe(mftoeps)p Fu(.)37 b(The)21 b(ab)q(o)o(v)o(e)g(metho)q(d)e(is)i(m)o +(y)e(P)o(o)q(or)i(Man's)f Fo(MET)o(A)p Fu(-)-118 923 y Fo(F)n(ONT)p +Fu(2EPS,)13 b(with)f(concise,)i(v)o(ery)f(concise)h(and)f(in)o(telligible)d +(EPS)-118 973 y(as)k(result.)-118 1074 y Fv(Ac)o(kno)o(wledgemen)o(t)o(s)-118 +1150 y Fu(First)g(of)f(all)g(Don)g(Kn)o(uth)i(and)e(John)h(Hobb)o(y)g(thank)g +(y)o(ou.)-68 1201 y(Thank)e(y)o(ou)g(Joseph)i(Romano)o(vsky)c(for)j(sho)o +(wing)f(b)o(y)g(example)-118 1250 y(the)17 b(p)q(o)o(w)o(er)h(of)e(P)o +(ostScript,)i(and)f(for)g(y)o(our)f(co)q(op)q(eration)h(on)g(the)-118 +1300 y Fo(MET)o(AF)n(ONT)p Fk($)p Fu(P)o(ostScript)e(dualit)o(y)m(.)-68 +1350 y(Thank)f(y)o(ou)f(Bogus )-12 b(la)o(w)14 b(Jac)o(k)o(o)o(wski)f(for)h +(y)o(our)g(`P)o(ostScript)g(for)-118 1400 y(T)-95 1408 y(E)-72 +1400 y(Xies')c(at)g(Bac)o(hoT)208 1408 y(E)231 1400 y(X)g Fn(96)p +Fu(,)g(suggesting)g(that)g(P)o(ostScript)h(as)f(suc)o(h)-118 +1450 y(is)k(b)q(ene\014cial)g(for)g(T)194 1458 y(E)217 1450 +y(Xies,)f(next)i(to)f(y)o(our)f(mfto)q(eps.)-68 1500 y(Thank)c(y)o(ou)g +(Eitan)h(Gurari)f(and)h(anon)o(ymous)d(T)686 1508 y(E)710 1500 +y(Xies)j(of)f(whic)o(h)-118 1550 y(I)16 b(b)q(orro)o(w)o(ed)h(material,)d +(not)i(in)f(the)i(least)g(Adob)q(e)f(for)g(pro)o(viding)-118 +1600 y(P)o(ostScript)f(to)e(start)i(with.)-68 1650 y(Piet)g(T)m(utelaers)h +(pro)o(vided)g(me)e(with)h(a)g(cop)o(y)h(of)e(the)i(PSF)-5 +b(A)o(Q,)-118 1700 y(and)14 b(Erik)g(F)m(ram)o(bac)o(h)f(traced)i(the)g +(\014le)f(with)g(examples)g(from)e(the)-118 1750 y(blue)i(b)q(o)q(ok,)f(next) +h(to)g(KnotPlot.)-68 1800 y(As)d(usual)f(Jos)h(Winnink)e(pro)q(ofed)i(the)g +(pap)q(er)h(and)e(lend)h(a)f(help-)-118 1850 y(ing)21 b(hand)g(in)g(pro)q +(crusting)h(to)o(w)o(ards)g(MAPS)g(inclusion)e(if)h(not)-118 +1900 y(for)h(pro)q(cessing)i Fe(escherknot.mf)d Fu(in)o(to)h +Fe(escherknot.eps)e Fu(via)-118 1949 y Fo(MET)o(A)p Fa(post)p +Fu(.)-118 2051 y Fv(Conclusion)-118 2127 y Fu(T)m(o)15 b(co)q(de)i +(symmetrical)d(and)i(simple)e(curv)o(es)k(in)d(ra)o(w)h(P)o(ostScript)-118 +2177 y(is)c(fun)g(and)h(yields)f(elegan)o(t)g(scripts)i(and)e(concise)i +(\014les.)k(T)m(o)11 b(merge)-118 2227 y(text)17 b(with)g(graphics)g(is)g +(fun)g(to)q(o,)g(and)f(the)i(teaser)g(to)f(set)h(along)-118 +2276 y(curv)o(ed)k(paths)f(can)f(b)q(e)i(done)f(b)o(y)f(P)o(ostScript)i +(elegan)o(tly)m(.)37 b(An-)-118 2326 y(other)15 b(teaser)g(of)f(dra)o(wing)f +(math)g(curv)o(es)i(accurately)g(along)e(with)-118 2376 y(\(L)-88 +2369 y Fg(A)-64 2376 y Fu(\)T)-25 2384 y(E)-2 2376 y(X)19 b(is)f(solv)o(ed)g +(also)f(b)o(y)h(means)g(of)f(P)o(ostScript.)32 b(P)o(o)o(w)o(erful)-118 +2426 y(to)q(o)12 b(is)f(to)h Fq(extend)17 b Fu(the)c(inclusion)e(of)g(.eps)h +(\014les)h(at)f(the)g(dvi)f(lev)o(el)h(b)o(y)-118 2476 y(a)j(little)h(more)e +(in)o(teraction)i(b)q(et)o(w)o(een)h(\(L)528 2468 y Fg(A)553 +2476 y Fu(\)T)592 2483 y(E)615 2476 y(X)f(and)f(P)o(ostScript.)-118 +2525 y(Rotating)f(a)i(b)q(o)o(x,)g(with)f(as)h(applications)f(for)h(example)f +(t)o(yp)q(eset-)-118 2575 y(ting)k(tables)h(in)f(landcap)q(e,)i(is)e(p)q +(ossible)h(in)f(P)o(ostScript,)j(at)d(the)-118 2625 y(exp)q(ense)d(of)d +(system)h(dep)q(endency)i(b)q(ecause)f(of)e(the)i Fe(\\special)p +Fu(-s.)-68 2675 y Fq(Mer)n(ging)e Fu(a)d(little)f(kno)o(wledge)h(of)f(P)o +(ostScript)i(with)e(T)769 2683 y(E)792 2675 y(Xp)q(ertise)-118 +2725 y(is)16 b(p)q(o)o(w)o(erful.)23 b(PStric)o(ks)17 b(concen)o(trates)h(on) +d Fq(interfacing)k Fu(\(L)827 2718 y Fg(A)851 2725 y Fu(\)T)890 +2733 y(E)914 2725 y(X)-118 2775 y(with)e(P)o(ostScript)g(at)g(the)h(exp)q +(ense)h(of)d(burdening)i(\(L)752 2767 y Fg(A)776 2775 y Fu(\)T)815 +2782 y(E)838 2775 y(X)f(to)q(o)-118 2825 y(m)o(uc)o(h,)g(IMHO,)h(with)g(all)e +(resp)q(ect.)32 b(F)m(or)18 b Fe(\\rotate)e Fu(I)i(in)o(terfaced)-118 +2875 y(to)q(o.)24 b(Ho)o(w)o(ev)o(er,)17 b(for)e(t)o(yp)q(esetting)i(along)e +(curv)o(ed)i(paths)g(I)f(w)o(ould)-118 2924 y(not)e(think)f(of)h(in)o +(terfacing)f(via)g(rotated)h(b)q(o)o(xes)h(or)f(so.)-118 -55 +y Fg(MAPS)d Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)1054 35 y Fu(Of)c(course,)h(p) +q(eople)f(who)g(do)f(need)i(adv)n(anced)f(features)h(or)f(ha)o(v)o(e)1004 +85 y(sp)q(ecial)19 b(wishes)g(migh)o(t)d(b)q(etter)k(use)f(Adob)q(e)g +(Illustrator,)g(Corel-)1004 134 y(DRA)-5 b(W,)20 b(Mathematica,)g(or)h(Adob)q +(e)g(Photoshop,)h(and)e(not)h(to)1004 184 y(forget)14 b(the)g(pleasing)g +(MetaP)o(ost.)1054 234 y(T)m(o)i(understand)j(and)e(learn)g(T)1553 +242 y(E)1576 234 y(X)h(did)e(tak)o(e)i(me)e(a)h(couple)g(of)1004 +284 y(y)o(ears.)g(T)m(o)10 b(acqain)o(t)f(m)o(yself)g(with)g +Fo(MET)o(AF)n(ONT)i Fu(did)f(cost)h(me)e(a)h(few)1004 334 y(mon)o(ths.)15 +b(Learning)10 b(just)f(a)h(little)e(bit)i(of)f(P)o(ostScript)h(w)o(as)f(a)h +(matter)1004 383 y(of)17 b(w)o(eeks,)h(and)f(when)h(concen)o(trating)g(on)f +(paths)h(and)f(\(con)o(trol\))1004 433 y(p)q(oin)o(ts)g(the)g +Fe(moveto)p Fu(,)e Fe(arc)h Fu(and)h Fe(curveto)e Fu(can)i(b)q(e)g(grasp)q +(ed)h(in)e(a)1004 483 y(late)e(afterno)q(on.)1054 533 y(Although)f(the)i +(blue)f(b)q(o)q(ok)f(con)o(tains)h(also)f(examples)g(of)h(t)o(yp)q(e-)1004 +583 y(setting)f(text,)h(I)e(consider)i(T)1448 590 y(E)1471 +583 y(X)f(unsurpassed)i(for)e(this.)k(The)d(b)q(est)1004 633 +y(of)f(b)q(oth)h(w)o(orlds)g(is)g(to)f(com)o(bine)g(\(L)1565 +625 y Fg(A)1589 633 y Fu(\)T)1628 640 y(E)1651 633 y(X)h(and)g(P)o +(ostScript.)1054 682 y(Ma)o(yb)q(e)k(w)o(e)h(should)f(follo)o(w)f(Adob)q(e)i +(and)f(extend)h(the)g(use)g(of)1004 732 y(P)o(ostScript)d(b)o(y)f(PDF|or)f +(use)i(the)f(alternativ)o(e)g(HTML|to)g(fa-)1004 782 y(cilitate)e(WWW)g +(sur\014ng.)1004 882 y Fv(What)i(more?)1004 956 y Fu(F)m(or)e(pictures)h(I)g +(use)g(a)f(T)1391 964 y(E)1414 956 y(X)g(con)o(trolled)g(database)h(with)f +(the)g(b)q(en-)1004 1006 y(e\014cial)h(side-e\013ect)j(that)d(I)h(don't)f(ha) +o(v)o(e)g(to)h(w)o(orry)f(ab)q(out)h(\014le)f(sys-)1004 1056 +y(tems)20 b(when)h(using)f(pictures)i(\(to)q(ols,)f(references)j(and)c +(ilks\))g(on)1004 1106 y(di\013eren)o(t)d(mac)o(hines.)25 b(I)17 +b(w)o(ould)e(w)o(elcome)h(a)g(similar)e(functional-)1004 1156 +y(it)o(y)f(for)f(m)o(y)g(collection)h(of)g(P)o(ostScript)h(pictures)g(to)f(b) +q(e)h(used)g(with)1004 1205 y Fe(\\psfig)p Fu(.)1054 1255 y(A)23 +b(next)h(step)g(is)f(the)g(manipulation)d(of)j(colors)g(either)h(via)1004 +1305 y Fo(MET)o(A)p Fa(post)18 b Fu(or)g(P)o(ostScript)g(directly)m(.)29 +b(Jac)o(k)o(o)o(wski)17 b(uses)i(Adob)q(e)1004 1355 y(Illustrator)d(for)g +(example)f(to)i(enric)o(h)g(in)o(teractiv)o(ely)f(the)h(system-)1004 +1405 y(atic)e(EPS)g(pictures)h(created)g(b)o(y)f Fo(MET)o(AF)n(ONT)p +Fu(.)g(Indeed)h(in)o(terest-)1004 1454 y(ing,)e(v)o(ery)h(in)o(teresting,)g +(but)h(b)q(ey)o(ond)f(m)o(y)e(p)q(ossibilities)h(for)h(some)1004 +1504 y(time)e(to)g(come.)18 b(Neither)d(do)e(I)h(ha)o(v)o(e)g(access)i(to)d +(color)h(P)o(ostScript)1004 1554 y(prin)o(ters)h(as)f(y)o(et,)f(alas.)18 +b(My)c(case)g(rests.)1054 1604 y(Ha)o(v)o(e)g(fun,)f(and)g(all)g(the)i(b)q +(est.)1570 1678 y(c)1559 1679 y Fk(\015)41 b Fu(Kees)15 b(v)n(an)e(der)i +(Laan)1642 1726 y(Hunzew)o(eg)g Fn(57)1642 1775 y(9893)e Fu(PB)h(Garn)o(w)o +(erd)1642 1825 y(The)g(Netherlands)1642 1875 y(cgl@rc.service.rug.nl)1642 +1925 y Fn(31)6 b Fu(\()p Fn(0)p Fu(\))p Fn(594)g(62)h(1525)-118 +3014 y Fl(Draft)j(June)f Ff(25)p Fl(,)i Ff(1996)811 b Fl({12{)2005 +3013 y(c)1990 3014 y Fk(\015)p Fl(cgl)p eop +%%Page: 13 13 +bop -118 -89 a Fg(MAPS)11 b Fn(96)p Fg(.)p Fn(2)1252 b Fq(Par)n(adigms:)19 +b(Just)14 b(a)i(little)d(bit)h(of)h(PostScript)-118 0 y Fv(Con)o(ten)o(ts)-68 +75 y Fu(BLUe's)f(Design)g(X)-68 125 y(P)o(ostScript)-27 175 +y(Pro)q(cessing)-27 224 y(Subset)h(0)f(from)e(the)i(language)15 +274 y(ex:)k(Conforming)11 b(EPS)k(structure)-27 324 y(Summary)c(of)j +(\(graphics\))g(commands)-27 374 y(What)g(is)f(not)h(allo)o(w)o(ed)f(as)h +(EPS?)-27 424 y(Do)q(cumen)o(tation)15 473 y(ex:)k(Pie)c(c)o(hart)g(from)f +(the)h(blue)g(b)q(o)q(ok)-27 523 y(Pro)q(o\014ng)-27 573 y(Inclusion)15 +623 y(BoundingBo)o(x)-27 673 y(W)m(riting)f(P)o(ostScript)15 +722 y(A)h(line)f(bundle)15 772 y(A)h(\015o)o(w)o(er)-68 822 +y(Some)e(more)h(Graphics)15 872 y(ex:)18 b(Malb)q(ork)13 b(windo)o(w)15 +922 y(ex:)18 b(Esc)o(her's)d(imp)q(ossible)e(triangle)15 972 +y(ex:)18 b(Ben)o(tley's)d(p)q(olygon)15 1021 y(ex:)j(Another)d(double)f(lo)q +(op)15 1071 y(ex:)k(P)o(olygons)13 b(with)h(splines)g(as)g(sides)15 +1121 y(ex:)k(Barn)c(windo)o(w)15 1171 y(ex:)k(Bak)o(er's)c(inspiration)15 +1221 y(ex:)k(Romano)o(vsky's)11 b(real)j(Esc)o(her)-68 1270 +y(Math)g(graphs)15 1320 y(ex:)k(Sine)c(function)-68 1370 y(T)m(ext)g(set)g +(along)f(curv)o(ed)i(paths)15 1420 y(ex:)j(Along)13 b(a)h(circle)15 +1470 y(ex:)k(Along)13 b(a)h(spiral)15 1519 y(ex:)k(Seals)15 +1569 y(ex:)g(Gurari's)13 b(squares)15 1619 y(ex:)18 b(Gurari's)13 +b(ABC)15 1669 y(ex:)18 b(W)m(alking)12 b(along)g(the)j(S-curv)o(e)-68 +1719 y(T)m(ables)e(set)i(sidew)o(a)o(ys)15 1769 y(ex:)j(Rotated)c(table)-68 +1818 y(MET)m(AF)o(ONT/MetaP)o(ost)g(user)h(in)o(terface)15 +1868 y(ex:)j(Esc)o(her's)d(knot)-27 1918 y(A)f(teaser)15 1968 +y(ex:)k(Esc)o(her's)d(knot)f(I)q(I)q(I)-27 2018 y(Colum)o(bus')e(egg)-68 +2067 y(Ac)o(kno)o(wledgemen)o(ts)-68 2117 y(Conclusion)-68 +2167 y(What)h(more?)-68 2217 y(Con)o(ten)o(ts)-118 2979 y Fl(Draft)d(June)f +Ff(25)p Fl(,)i Ff(1996)811 b Fl({13{)2005 2978 y(c)1990 2979 +y Fk(\015)p Fl(cgl)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/info/laan/paradigm/paradigm.src b/info/laan/paradigm/paradigm.src new file mode 100644 index 0000000000..8b4f6f9df2 --- /dev/null +++ b/info/laan/paradigm/paradigm.src @@ -0,0 +1,759 @@ +%Aug 1995, modified Feb 1996 +%Paradigm: Searching +%C.G. van der laan, cgl@rc.service.rig.nl +\input blue.tex \loadtocmacros%\tolerance500\hbadness=499\hfuzz=5pt + %\parindent=1pc +\everyverbatim{\emc} +\bluetitle Paradigms: Searching + +\blueissue \maps{96}2 + +%\blueauthor Kees van der Laan + +\beginscript + +\bluehead BLUe's Design VIII + +Hi folks. +I started using \LaTeX{} for my hobby bridge, to typeset +bid sequences and plays. Important in these kind of plays +is data integrity, i.e.\ the system should remember +that a card has been played. +In \TeX nical terms it comes down to update the computer memory. +This is precisely what makes computer-assisted typography different +from previous formatting techniques. We can update memory. + +This is a common phenomenon and the problem can be formulated +in general terms as deleting an element from a set. + +The central macro in BLUe's format searching is \cs{loc}, +and for selective loading \cs{lst} must be defined appropriately. + +Before delving into the details where I have needed searching, I'll +touch upon searching \TeX niques, as used in \TB. + +\bluehead Searching in \TB + +The examples of searching are about balancing columns. + +On page {\oldstyle387} it is applied to adjusting the column widths when we have +the English text in column one and the same text in another language +in column two. With fixed column widths the column lengths are different. + +On page {\oldstyle417} the manmac macro \cs{balancecolumns} is given to +balance two columns on the last page of the index of \TB. +These \TeX niques and macros have been used\Dash and customized a little\Dash +for typesetting BLUe's format indexes.\ftn{My major contribution in this area + is that I process indexes on the fly, in one-pass.} + +\bluehead Salomon's procrusting + +Salomon\ftn{Advanced \TeX, Springer, {\oldstyle1995}, page {\oldstyle189}.} +looks for the optimal font size in fitting text to a box of prescribed size. +The essence of the search process is given stripped from other aspects. +I modified his example as follows. +\thisverbatim{\unmc} +\beginverbatim +%Salomn's fitting text to a box +%Sept 95, cgl@rc.service.rug.nl +\begingroup +%Text +\toks0{Leentje leerde lotje lopen + langs de lange lindenlaan.} +%Restrictions +\hsize=3cm \dimen1=20pt%\vsize=20pt +\def\showresult{\rlap{\f + Fontsize=\the\dimen0\quad + ht, dp=\the\ht0, \the \dp0} + \copy0\smallbreak} +%Start: first estimate size of font +\dimen0=5pt +\loop\font\f=cmr10 at\dimen0 + \setbox0=\vbox{\tolerance10000 + \baselineskip\dimen0 + \f \the\toks0 } +\showresult +\ifdim\ht0<\dimen1 %next, linear search + \advance\dimen0 by1pt +\repeat +%make the best fit +\advance\dimen0 by-1pt +\font\f=cmr10 at\dimen0 + \setbox0=\vbox to\dimen1{\tolerance10000 + \baselineskip\dimen0 plus 1pt minus1pt + \f \the\toks0 } +\showresult +\endgroup +%Remark: extension to adjust for total size +%of box is left to the reader, and the +%context +\bye +!endverbatim + +\bluehead Finding an element + +The basic functionality is to locate an element in a set. +The result is the value of the Boolean \cs{iffound}. +BLUe's format uses the following approach.\ftn{Assumed is + that the set does not contain a period.} +\beginverbatim +\def\loc#1#2{%locate #1 in #2 a def + \def\locate##1#1##2\end{\ifx\empty##2\empty + \foundfalse\else\foundtrue\fi}% + \ea\locate#2.#1\end} +!endverbatim + +To append the searched for element at the end of the arguments for \cs{locate} +is related to the sentinel technique in programming. + +\blueexample Printing vowels in bold + +Schwarz {\oldstyle1987} coined the problem to print vowels +in bold face.\ftn{His solution mixes up the picking up of list + elements and the process to be applied. Moreover, his nesting of + {\tt\char92if}-s + in order to determine whether a character is a vowel or not, + is not elegant.} + +The problem can be split into two parts. First, the general part of going +character by character through a string, and second, decide whether the +character at hand is a vowel or not. + +For the first part use \cs{fifo}. + +For the second part, combine the vowels into a string, |aeiou|, +and the problem can be reduced +to the question $\langle char\rangle\in{}$|aeiou|? + +With \cs{process} appropriately defined\Dash + locate the argument in the string of vowels\Dash +|\fifo Audacious\ofif| yields +\newif\iffound% +\def\loc#1#2{%locate #1 in #2 + \def\locate##1#1##2\end{\ifx\empty##2\empty + \foundfalse\else\foundtrue\fi}% + \locate#2#1\end}% +\def\process#1{\uppercase{\loc#1}{AEIOU}% +\iffound{\bf#1}\else#1\fi}% +\fifo Audacious\ofif, +with +\beginverbatim +\def\process#1{\uppercase{\loc#1}% + {AEIOU}\iffound{\bf#1}\else#1\fi} +!endverbatim + +\blueexample Searching a set of accent strings + +In sorting in \TeX{} I determine whether a control symbol belongs to the set of +accents\Dash|\def\accstr{\`\'\"\^\c}|. +In the macro \cs{nxtw} the relevant invoke reads as follows. +\beginverbatim +\ea\loc\head\accstr +!endverbatim +The same approach has been applied in my BLUe-2-MAPS convertor +assistant. + +\blueexample Searching a set of Pascal reserved words + +In typesetting PASCAL fragments I determine whether a word belongs to the set +of reserved words. +The set of reserved words reads +\beginverbatim +\reservedset{and array begin case const + div do downto else end. end; file for + function goto if in label mod nil not of + or packed procedure program record repeat + set then to type until var while with} +!endverbatim +The relevant invoke in \cs{processw} reads +\beginverbatim +\loc{#1}{\the\reservedset}% +!endverbatim +The Pascal environment scans the program fragment line-by-line and +each line word-by-word. +Each word is tested against the set of reserved words. + +\bluehead Deleting an element + +The functionality is to delete an element from a set. +It consists of two steps: finding and deleting. +It can be coded as a variant of \cs{loc}, with as result not a +Boolean but the modified set. A template might read as follows. +\beginverbatim +\def\delete#1#2{%Delete #1 from #2 a def + \def\locate##1#1##2\end{\ifx\empty##2\empty + \else\def#2{##1##2}\fi}% + \ea\locate#2#1\end} +!endverbatim +Addition of an element to a set can be done as follows.\ftn +{This is not so much about searching but added for your convenience.} +\beginverbatim +\def\add#1#2{%Add #1 to #2 a def + \ea\def\ea#2\ea{#2#1}} +%or when #2 consists of unexpandable tokens +\def\add#1#2{%Add #1 to #2 a def + \xdef#2{#2#1}} +!endverbatim + +\blueexample Updating a hand in bridge + +Bridge is an elimination play like most games. +From the start elements are removed. +The deletion of a card is a little special +because we know that the card is there. +The macro is called \cs{strip} and has been adapted. +The hand is a definition instead of a token variable. +\beginverbatim +\def\strip#1#2{%Function: +% delete card value #1, is AKQJT9...2 +% from #2, a def. + \def\wis##1#1##2\siw{\gdef#2{##1##2}% + \ifx#2\empty\gdef#2{--}\fi}% + \ea\wis#2\siw} +!endverbatim + +Remarks. In the above example the searching (and deleting) is a side-effect of the printing. +It is merely there to guarantee data integrity. +If only attention is paid to the main issues, +the searching would have been remained hidden, under a `pile of cards'\smiley. +It is worth it to make some kind of library macro out of it\Dash +at least a template\Dash ready for reuse. + +Realize that the searched for element is supplied dynamically. + +\blueexample Modifying \cs{dospecials} + +Inspired upon the Babel macros the following +alternatives which also obey the locality character. +\beginverbatim +%Variant \bbl@add@specials +%No grouping, nor edef, +%assumed \dospecials, \sanitize are defined. +% +\let\sanitize\empty \let\dospecials\empty +% +\def\addspecials#1{\ea\def\ea + \dospecials\ea{\dospecials\do#1}% + \ea\def\ea + \sanitize\ea{\sanitize\makeother#1} +} +% +%Variant \bbl@remove@specials +%No grouping, nor edef, +%assumed \dodefault available +% +\let\dodefault\empty +% +\def\removespecials#1{% + \def\do##1{\ifnum`#1=`##1 + \else\nx\do\nx##1\fi} + \edef\dospecials{\dospecials} + \def\makeother##1{\ifnum`#1=`##1 + \else\nx\makeother\nx##1\fi} + \edef\sanitize{\sanitize} +\let\do\dodefault +\let\makeother\makeotherdefault +} +!endverbatim + +\bluehead \DeK's set macros + +In \TB{} the locating of an element\Dash and delete it\Dash +is done as follows. + +\DeK{} provides \cs{remequivalent},\ftn +{As part of a suite of set macros.} +\TB{} {\oldstyle380}, which uses a very general \TeX nique. +I'll untangle and recast the coding in the FIFO\Dash First In First Out\Dash notation. + +\blueexample A set is just a list of defs + +Suppose the set reads |\def\set{\a\b\c}|. Then +\beginverbatim +%Assume #2 not empty +\def\remequivalent#1\from#2{% + \def\process##1{\ifx#1##1\else\nx##1\fi} + \xdef#2{\ea\fifo#2\ofif}} +\def\fifo#1{\ifx\ofif#1\ofif\fi + \process{#1}\fifo} +\def\ofif#1\fifo{\fi} +!endverbatim + +\blueexample A set is a list of defs with list element tags + +Suppose the set reads |\def\set{\\\a\\\b\\\c}|. Then +\beginverbatim +%Assume #2 not empty +\def\remequivalent#1\from#2{% + \def\\##1{\ifx#1##1\else\nx\\\nx##1\fi}% + \edef#2{#2}} +!endverbatim +Once we use list element tags we can also have more general +elements, as \DeK{} put it `control sequences which are \cs{ifx}-equivalent +to a given control sequence.' + +\blueexample A set is a more general list of control sequences + +Suppose the set reads |\def\set{\\\a\\\b\\\c}|. Then +\beginverbatim +%Assume #2 not empty +\def\remequivalent#1\from#2{\let\given=#1% +\def\\##1{\ifx#1##1\else\nx\\\nx##1\fi}% + \edef#2{\ea\fifola#2\alofif}} +\def\fifola\\#1#2{\ifx#1\given\else\nx\\\nx#1\fi + \ifx#2\alofif\alofif\fi\fifola#2} +\def\alofif#1\alofif{\fi} +!endverbatim +Finally, it can be extended by the test for the emptiness of \cs{set}. + +\bluehead Database use + +While developing BLUe's format system and using the database idea +other search \TeX niques have been coded. +Needed are facilities for browsing a database next to +macros for selective loading of + addresses, + a format, + pictures, + references, or + tools. + +The browse macros are based on \cs{loc}, and can be associated with the +keyword pattern recognition. + +The selective loading macros are based on the proper definition of the +list element tag. + +Below the searching aspects have been put together. +`BLUe's Databases' treats the use and coding of BLUe's format databases in depth. + +\bluesubhead Pattern recognition + +A nice application is mail-merge, merging addresses with a letter. + +\blueexample Match addresses for the pattern RUSSIA + +\beginverbatim +\input blue.tex \letter \searchfile{address} +\search{RUSSIA} +\bye +!endverbatim +To send a letter to all those persons or to make all address labels +insert \cs{makesearchletters}, respectively \cs{makesearchlabels} +before \cs{bye}. + +\blueexample Coding the search macro + +At the heart lies the earlier mentioned \cs{loc} macro. +Because we need to do more with found entries than just knowing that they are there, +their names, preceded by the list element tag for further action, +are collected in the toks variable \cs{namelst}. +For convenience the names are also written to the log file, +in order that we can follow what is going on. +\beginverbatim +\def\search#1{\def\loc##1##2{% + \def\locate####1##1####2\end + {\ifx\empty####2\empty\foundfalse + \else\foundtrue\fi}\ea\locate##2.##1\end} + \def\lst##1##2{\loc{#1}{##2}\iffound + \immediate\write16{\nx##1}%log file + \namelst\ea{\the\namelst\lst##1} + \def##1{##2}%define found element + \fi}\input\the\searchfile.dat\relax} +!endverbatim + +\bluesubhead Selective loading + +This is also a search activity. +The file is scanned and when an entry is found it will be loaded. +The details of the selective loading process depend +on the entries of the database. +I call them class I and class II databases. + +\bluesubsubhead Formats and tools + +The idea is that for example \cs{letter} only loads the letter +macros from |fmt.dat|. +In the examples below use is made of \cs{tool}, +with the functionality that when the tag after is known +the control sequences which follow the tag until \cs{endinput} +will be loaded, otherwise all in between the tag and +\cs{endinput} will be gobbled. +\beginverbatim +\long\def\tool#1{\ifx#1\undefined + \bgroup\unouterdefs + \ea\gobbletool\fi} +\long\def\gobbletool#1\endinput{\egroup} +!endverbatim + +\blueexample Coding the loading of the letter macros + +\thisverbatim{\emc} +\beginverbatim +%From blue.tex +\def\letter{\ifx\undefined\letterfmt + \let\letterfmt=x\fi + \loadformat + \let\letterfmt\undefined} +\def\loadformat{\input fmt.dat \relax} +%from fmt.dat +\tool\letterfmt +<lettermacros> +\endinput +!endverbatim + +Similarly, a tool can be loaded as follows. + +\blueexample Coding the loading of the smiley macros + +\thisverbatim{\emc} +\beginverbatim +%From blue.tex +\newbox\smileybox +\newcount\smileysloadcount +\def\smiley{\loadsmileys\raise.5ex + \hbox{\unitlength.01pt + \copy\smileybox + \eyes\mouth + \kern1000\unitlength} } +\def\winksmiley{<similar>} +\def\sadsmiley{<similar>} +\def\loadsmileys{\ifx\undefined\smileystool + \let\smileystool=x\fi + \ifnum\smileysloadcount=0 \ea\loadtool + \else\message{--- smileys already + loaded---}\fi + \advance\smileysloadcount1 + \let\smileystool\undefined} +%from tools.dat +\tool\smileystool +<smileymacros> +\endinput +!endverbatim + + +Remark. +Whenever suited a load counter is maintained such that +dubble loading is inhibited. + +\bluesubsubhead Addresses, pictures and references + +The entries of these database obey the syntax +\beginverbatim +\lst\<name>{<entryproper>} +!endverbatim +The selective loading comes down to a proper definition of \cs{lst}. +Moreover, the names of the entries to be selected must be defined +with whatever you wish as replacement text.\ftn{This approach is the opposite of + preventing reloading. + We tacitly want to redefine the fancy entries by the meaningful ones. + My fancy replacement text is an error message.} +\beginverbatim +\def\loadselectivefrom#1{%#1 lit etc. + \def\lst##1{\ifx##1\undefined\ea\gobble + \else \ea\gdef\ea##1\fi} + \input #1.dat \relax%e.g. lit.dat + } +\def\gobble#1{} +!endverbatim +Because of the scanning \cs{outer} defs are not allowed, nor are \cs{par}-s. +The selective loading macro is embedded in the user macros \cs{references} +and its ilks. In detail the meaning of `loading' is adapted to the application. +For references this means that the specified entries are set in a box and their names +redefined by numbers. +The names can be used for cross-referencing purposes while the +box can be pasted up at your place of choice. +However, the underlying searching methodology is the same for +addresses, references and pictures. + +\blueexample Coding the handling %(searching and some more) + of references + +\beginverbatim +\def\references#1{\beginreferences#1% + \endreferences} +\def\bluereferences#1\par + {\beginreferences#1\endreferences} +\def\loadreferences{\loadselectivefrom + {\the\referencesfile}} +\def\beginreferences#1\endreferences{% + \bgroup\def\process##1{\ifx\undefined##1 + \global\let##1\referenceserror\else + \message{***\tt\string##1 + already loaded.***} + \fi\namelst\ea{\the\namelst\lst##1}}% + \fifo#1\ofif + \if]#1]\else\ea\loadreferences\fi + %formatting + \ifstore\global\setbox\referencesbox= + \vbox\bgroup\fi\prenum{}\postnum{} + \lsams%Default ls + \the\thisreferences + \def\lst##1{\ls{##1} + \xdef##1{\the\itemno}} + \the\namelst\endreferences} +!endverbatim +Remark. +BLUe's format style of coding is centred along two-part macros with a one-part +macro on top, enriched by a convenient alias such as \cs{bluereferences}, for the +user interface. + +\bluesubsubhead Max D\'\i az' \TeX nique + +\TB{} {\oldstyle382}\dash{\oldstyle384} +mentions the fast loading \TeX nique of Max D\'\i az, which requires that +every line is preceded by a special character. +The process comes down to the following. +\thisverbatim{\emc} +\beginverbatim +%The TeXbook, Appendix D 4.Selective loading. +%The Max Diaz fast selective loading process. +%(A little simplified, and combined with +% my list element tag, \lst.) +\def\lst#1{\catcode`\~= + \ifx#1\undefined14 %comment + \else9 \fi}%ignore char +%We want to load the cgl part. +\def\cgl{<anything>} + +\lst\name +~a +~b +~c +\lst\cgl +~aa +~bb +~cc +\lst\erik +~aaa +~bbb +~ccc +\catcode`\~13 +% +<Commonpart> +\bye +%Explanation: the list element tag toggles the +%catcode for ~ such that either the first +%character is ignored (and the rest of the line +%loaded) or the line is a comment line. +!endverbatim +In the above one can replace |\lst\name...| by +|\input <filetobeloadedfrom>|. + +\bluesubsubhead Variant document parts + +The idea is that a script is marked up also with markup +tags which have a selection/omission function. +For example an abridged version is interspersed within the script. +The idea is that the owner can either ask for an abridged or a +full version. +Another example is documentation with details for various computer +operating systems. +Given a customer with a specific operating system only the +relevant parts will be printed.\ftn +{In real-life this is hardly done. + When I buy a TV it contains the information in several languages.} + +With the new hype HTML this functionality may enjoy a second youth. + +\bluehead Tree search + +When I implemented trees in \TeX{} especially the Pythagorean trees\Dash to illustrate + turtle graphics\Dash +I played a little longer with it and could use \TeX{} in `dialogue mode' to +search for a name by answering questions. + +\bluesubhead Interactive path through binary tree + +The following is inspired upon Greene's `Playing in \TeX's mind.'\ftn +{Courtesy Bernd Raichle for node representation.} +\beginverbatim +%Guess what? August 1995, cgl@rc.service.rug.nl +%Idea biased by A.M.Greene's +%Playing in TeX's mind, TUG 89. +%Interactive binary tree traversal. +%Interactive TeX ing, +%TeX as an engine to play with. +\input blue.tex +\def\bintree{\message{\csname\node\endcsname} + \ea\ifx\csname\node0\endcsname\relax\eertnib\fi + \read0to\yorn + \edef\node{\node\if n\yorn1\else0\fi} + \bintree} +\def\eertnib#1\bintree{\fi\def\node{1} + \immediate\write0{Hope this is the one + you are looking for :-) } + \immediate\write0{} + \message{Another play?} + \read0to\yorn + \if y\yorn\ea\bintree\fi + \immediate\write0{Thank you, bye}} +%Rules of the game +\immediate\write0{Guess game. + The system asks questions to be answered} +\immediate\write0{by *** y or n ***} +\immediate\write0{The following play + guesses an NTG member} +\immediate\write0{} +% +%Data (a tree structure) +\begingroup\obeylines +\def\lst#1 #2 + {\ea\def\csname#1\endcsname{#2}} +\lst 1 NTG member? +\lst 10 Plain TeX ie? +\lst 100 Honoured? +\lst 1000 Kees +\lst 1001 HH +\lst 101 On board? +\lst 1010 Chair? +\lst 10100 Erik +\lst 10101 Secretary? +\lst 101010 Gerard +\lst 101011 Treasurer? +\lst 1010110 Wietse +\lst 1010111 Dark? +\lst 10101110 Johannes +\lst 10101111 Frans +\lst 1011 Anonymous +\lst 11 Just a friend +% +%Start the play +\endlinechar-1 %TB20.18 +\def\node{1}\bintree +\endgroup +% +%Typesetting the data +\onecol +Pretext +\thisbt{\xoffset{-400}} +\beginbt1 NTG member? +10 Plain TeX ie? +100 Honoured? +1000 cgl +1001 HH +101 On board? +1010 Chair? +10100 Erik +10101 Secretary? +101010 Gerard +101011 Treasurer? +1010110 Wietse +1010111 Dark? +10101110 JLB +10101111 FG +1011 Anonymous +11 Just a friend +8 \endbt +Posttext +\bye +!endverbatim + +A typical log file looks as follows. +\beginverbatim +Guess game. The system asks questions to +be answered by *** y or n *** +The following play guesses an NTG member + +NTG member? +\yorn=y + Plain TeX ie? +\yorn=y + Honoured? +\yorn=y + Kees +Hope this is the one you are looking for :-) + +Another play? +\yorn=y + NTG member? +\yorn=n + Just a friend +Hope this is the one you are looking for :-) + +Another play? +\yorn=y + NTG member? +\yorn=y + Plain TeX ie? +\yorn=n + On board? +\yorn=y + Chair? +\yorn=y + Erik +Hope this is the one you are looking for :-) + +Another play? +\yorn=y + NTG member? +\yorn=y + Plain TeX ie? +\yorn=n + On board? +\yorn=y + Chair? +\yorn=n + Secretary? +\yorn=y + Gerard +Hope this is the one you are looking for :-) + +Another play? +\yorn=y + NTG member? +\yorn=y + Plain TeX ie? +\yorn=n + On board? +\yorn=n + Anonymous +Hope this is the one you are looking for :-) + +Another play? +\yorn=n +!endverbatim +Remarks. The first version used a counter to represent the +nodes with the restriction of $2^{16}$. + +Robustness with respect to mistypes of the user after the prompt\Dash + the user does not supply `y' or `n'\Dash +has been treated in Paradigms: Loops. + +\bluesubhead The tree + +The typesetting of the binary tree +visualizes the data for your convenience. +Within BLUe's format this goes as follows +\beginverbatim +\thisbt{\xoffset{-400}} +\beginbt 1 NTG member? +10 Plain \TeX ie? +... +11 Just a friend +8 \endbt +!endverbatim +\thisbt{\xoffset{-400}} +\beginbt 1 NTG member? +10 Plain \TeX ie? +100 Honoured? +1000 cgl +1001 HH +101 On board? +1010 Chair? +10100 Erik +10101 Secretary? +101010 Gerard +101011 Treasurer? +1010110 Wietse +1010111 Dark? +10101110 JLB +10101111 FG +1011 Anonymous +11 Just a friend +8 \endbt + +Have fun, and all the best +\makesignature +\pasteuptoc +\endscript
\ No newline at end of file diff --git a/info/laan/paradigm/paradigm.srt b/info/laan/paradigm/paradigm.srt new file mode 100644 index 0000000000..d0b88a782a --- /dev/null +++ b/info/laan/paradigm/paradigm.srt @@ -0,0 +1,723 @@ +%Paradigm: Sorting. Aug 1995, revised Feb 1996 +%C.G. van der laan, cgl@rc.service.rig.nl +\input blue.tex +\loadtocmacros +\loadindexmacros %necessary for sorting examples +\tolerance500\hbadness=499\hfuzz=5pt + +\bluetitle Paradigms: Sorting + +\blueissue \maps{96}2 + +\everyverbatim{\emc} + +\def\on{\bgroup\afterassignment\doold\count0=} +\def\doold{\oldstyle\the\count0\egroup} + +\beginscript + +\bluehead BLUe's Design IX + +Hi folks. +A strong and {\em unique\/} point of BLUe's format system is its +indexing on the fly. +Be it for a total document or just for a chapter. One of the requisites +for indexing on the fly is the possibility to sort within \TeX. + +Sorting has always been an important topic in computer science. +In \TeX{} I needed sorting on several occasions especially for sorting +numbers such as citation lists, +words such as addresses, and +index entries. + +This note is devoted to paradigms encountered while implementing and applying +sorting in \TeX. + +Sorting can be characterized by +\item- the set to be sorted (numbers, word. etc.) +\item- the addressing of elements of the set +\item- the ordering for the set +\item- the comparison operation, and +\item- the exchange operation. +\smallbreak + +To do some sorting of your own please load from \bluetex{} the index macros +via \cs{loadindexmacros}. +Below parts have been extracted from that collection of +macros to make this note as intelligible as possible. +\cs{ea} is my shortcut for \cs{expandafter}. + +\bluehead Linear sorting + +A simple sorting method is repeatedly searching for the smallest element. +In the example below the set is defined as a def with +list element tag |\\|. + +\thisverbatim{\unmc} +\beginverbatim +\def\lst{\\\ia\\\ib\\\ic} +\def\ia{314} \def\ib{1} \def\ic{27} +% +\def\dblbsl#1{\ifnum#1<\min\let\min=#1\fi} +% +\loop\ifx\empty\lst\expandafter\break\fi + \def\\{\let\\=\dblbsl\let\min=} %space + \lst%find minimum + \min%typeset minimum + {\def\\#1{\ifx#1\min \else\nx\\% + \nx#1\fi}\xdef\lst{\lst}}% +\pool%Inspired upon van der Goot's + %Midnight macros. +\def\loop#1\pool{#1\loop#1\pool} +\def\break#1\pool{} +!endverbatim + +The coding implements the looping of the basic steps +\item- find minimum (via \cs{lst}, + and suitable definition of \DeK's list element tag |\\|) +\item- typeset minimum (via \cs{min}) +\item- delete minimum from the list (via another appropriate + definition of the list element tag. +\smallbreak + +Remark. +The kludge for using \cs{ifx} instead of \cs{ifnum} in the deletion part +is necessary because \TeX{} inserts a \cs{relax}. + +\bluehead Sorting in an array + +If we adopt array addressing in \TeX{} for the elements to be sorted +then we can implement bubble sort in \TeX{} too.\ftn +{The above example of linear sorting can be seen as sorting in a + so-called associative array.} + +\bluesubhead Array addressing + +When we think of associating values to (index) numbers\Dash + |1| $\rightarrow$ |\value{1}| \Dash +then we are talking about an array. +A mapping of the \IN{} on \dots for example \IN. +The \cs{value} control sequence can be implemented as follows. + +\beginverbatim +\def\value#1{\csname#1\endcsname} +!endverbatim +The writing to the array elements can be done via +\beginverbatim +\def\1{<value1>} \def\2{<value2>}... +!endverbatim + +In general this must be done via + +\beginverbatim +\ea\def\csname<number>\endcsname{<valuenumber>} +!endverbatim + +\bluesubsubhead To get the hang of it + +The reader must be aware of the differences between +\item- the index number, $\langle k\rangle$ +\item- the counter variable \cs{k}, with the value $\langle k\rangle$ + as index number +\item- the control sequences |\<k>|$, k=1, 2, \dots, n$, + with as replacement texts the items to be sorted. +\smallbreak + +When we have |\def\3{4}| |\def\4{5}| |\def\5{6}| then \\ +\def\3{4}\def\4{5}\def\5{6} +|\3| yields {\bf\3}, \\ +|\csname\3\endcsname| yields +{\bf\csname\3\endcsname}, and \\ +|\csname\csname\3\endcsname\endcsname| yields +{\bf\csname\csname\3\endcsname\endcsname}. + +Similarly, when we have\\ +\cs{k3} |\def\3{name}| |\def\name{action}| then \\ + \def\3{name}\def\name{action}\k=3{} +|\the\k| yields {\bf\the\k}, \\ +|\csname\the\k\endcsname| yields {\bf\csname\the\k\endcsname}, and\\ +|\csname\csname\the\k\endcsname\endcsname| yields +{\bf\csname\csname\the\k\endcsname\endcsname}.\ftn{Confusing, but powerful.} +To exercise shortcut notation the last can be denoted by +|\value{\value{\the\k}}|. + +Another \cs{csname...} will execute \cs{action}, which can be whatever +you provided as replacement text.\ftn +{My other uses of the \cs{csname} construction are: + to let \TeX{} accept an outer defined macro name in a replacement text, + to check whether a name has already been defined, and + to mimic a switch selector.} + +\bluehead Bubble sort + +This process looks repeatedly for the biggest element which is swapped +to the end. This is done for the complete array, the array of size $n-1$ et cetera. +The pseudo code reads as follows. +\beginpascal +for n:= upb downto 2 do +begin for k:= n-1 downto 1 do + if a[n]<a[k] then + exchange(a[n], a[k]); +end; +\endpascal + +The \TeX{} macro reads as follows. +\thisverbatim{\unmc} +\beginverbatim +\def\bubblesort{%Data in defs \1, \2,...\<n>. +%Result: \1<=\2<=...<=\<n>. +{\loop\ifnum1<\n{\k\n + \loop\ifnum1<\k \advance\k-1 + \cmp{\deref\k}{\deref\n}% + \ifnum\status=1 \xch\k\n\fi + \repeat}\advance\n-1 + \repeat}}%end \bubblesort +%with auxiliaries +\def\deref#1{\csname\the#1\endcsname} +\let\cmp\cmpn %from blue.tex or provide +%\def\cmp#1#2{%Comparison. Yields +% \status=0, 1, 2 for =, >, < +%{...} +%\def\xch#1#2{%exchange +%#1, #2 counter variables +%{...} +!endverbatim + +\bluehead Heap sort + +We can organize the array as a heap. A heap is an ordered tree. +Loosely speaking for each node the siblings are smaller or +equal than the node. + +The process consists of two main steps +\item- creation of a heap +\item- sorting the heap +\smallbreak + +with a sift operation to be used in both. + +In comparison with my earlier release of the code in \maps{92}2, +I adapted the notation with respect to sorting in {\em non-decreasing\/} +order.\ftn +{It is true that the reverse of the comparison operation would + do, but it seemed more consistent to me to adapt + the notation of the heap concept with + the smallest elements at the bottom.} + +What is a heap? +A sequence $a_1, a_2, \dots, a_n$, is a heap if +$a_k\ge a_{2k} \wedge a_k\ge a_{2k+1}, k=1, 2, \dots, n\div2$, and +because $a_{n+1}$ is undefined, the notation is simplified by +defining $a_k>a_{n+1}, k= 1, 2, \dots , n$. +\\ +A tree and one of its heap representations of $2, 6, 7, 1, 3, 4$ +read + +$$\thisbintree{\tophns10ex} +\beginbintree{00}2{11}6{12}7{21}1{22}3{23}4 + 2\endbintree +\kern-4ex\raise13ex\hbox{$\buildrel heap\over \longrightarrow$} +\thisbintree{\tophns10ex}\kern-4ex +\beginbintree{00}7{11}6{12}4{21}3{22}2{23}1 +2\endbintree$$ + +In PASCAL-like notation the algoritm, +for sorting the array a[1:n], reads + +{\parindent0pt +\beginpascal +(*heap creation*) +l := n div 2 + 1; +while l <> 1 do +begin l := l-1; sift(a, l, n) end; +(*sorting*) +r := n; +while r <> 1 do +begin swap(a[1], a[r]); + r := r-1; sift(a, 1, r) +end; +(*sift arg1 through arg2*) +j:= arg1; +while 2j >= arg2 and + (a[j] < a[2j] or a[j] < a[2j+1]) +do begin mi := 2j + if a[2j] > a[2j+1] + then 0 else 1; + exchange(a[j], a[mi]); j := mi + end; +\endpascal +\smallskip} + +\bluesubhead Purpose + +Sorting values given in an array. + +\bluesubhead Input + +The values are stored in the control sequences +\cs{1}, \dots, |\<n>|. +The counter |\n| must contain the value $\langle n\rangle$. +The parameter for comparison, \cs{cmp}, +must be \cs{let}-equal to +\item- \cs{cmpn}, for numerical comparison, +\item- \cs{cmpw}, for word comparison, +\item- \cs{cmpaw}, for word comparison obeying the ASCII ordering, or +\item- a comparison macro of your own. +\smallbreak + +\bluesubhead Output + +The sorted array \cs{1}, \cs{2}, \dots |\<n>|, +with \\ +\cs{value1} $\le$ \cs{value2} $\le$ +\dots $\le$ \cs{value}$\langle n\rangle$. + +\bluesubhead Source + +\thisverbatim{\unmc} +\beginverbatim +%Non-descending sorting +\def\heapsort{%data in \1 to \n +\r\n\heap\ic1 +{\loop\ifnum1<\r\xch\ic\r + \advance\r-1 \sift\ic\r +\repeat}} +% +\def\heap{%Transform \1..\n into heap + \lc\n\divide\lc2{}\advance\lc1 + {\loop\ifnum1<\lc\advance\lc-1 + \sift\lc\n\repeat}} +% +\def\sift#1#2{%#1, #2 counter variables + \jj#1\uone#2\advance\uone1 \goontrue + {\loop\jc\jj \advance\jj\jj + \ifnum\jj<\uone + \jjone\jj \advance\jjone1 + \ifnum\jj<#2 \cmpval\jj\jjone + \ifnum2=\status\jj\jjone\fi\fi + \cmpval\jc\jj\ifnum2>\status\goonfalse\fi + \else\goonfalse\fi +\ifgoon\xch\jc\jj\repeat}} +% +\def\cmpval#1#2{%#1, #2 counter variables +%Result: \status= 0, 1, 2 if +%values pointed by +% #1 =, >, < #2 + \ea\let\ea\aone\csname\the#1\endcsname + \ea\let\ea\atwo\csname\the#2\endcsname + \cmp\aone\atwo} +% +\def\cmpn#1#2{%#1, #2 must expand into + %numbers +%Result: \status= 0, 1, 2 if +% \val{#1} =, >, < \val{#2}. + \ifnum#1=#2\global\status0 \else + \ifnum#1>#2\global\status1 \else + \global\status2 \fi\fi} +% +\def\xch#1#2{%#1, #2 counter variables + \edef\aux{\csname\the#1\endcsname}\ea + \xdef\csname\the#1\endcsname{\csname + \the#2\endcsname}\ea + \xdef\csname\the#2\endcsname{\aux}}. +%with auxiliaries +\newcount\n\newcount\lc\newcount\r +\newcount\ic\newcount\uone +\newcount\jc\newcount\jj\newcount\jjone +\newif\ifgoon +!endverbatim + +Explanation. +\item{}\cs{heapsort} + The values given in \cs{1},\dots|\<n>|, + are sorted in non-descending order. +\item{}\cs{heap} + The values given in \cs{1},\dots|\<n>|, + are rearranged into a heap. +\item{}\cs{sift} + The first element denoted by the first (counter) argument + has disturbed the heap. Sift rearranges + the part of the array denoted by its two arguments, such that the + heap property holds again. +\item{}\cs{cmpval} + The values denoted by the counter values, + supplied as arguments, are compared. +\smallbreak + +\blueexample Numbers, words + +\cs{cmpn}, and \cs{cmpw} stand for compare numbers and words. +\cs{prtn}, and \cs{prtw} stand for print numbers and words, and +work the way you expect. +\cs{accdef} takes care that accents are properly defined. + +\beginverbatim +\def\1{314}\def\2{1}\def\3{27}\n3 +\let\cmp\cmpn\heapsort +\beginquote\prtn,\endquote +% +\def\1{ab}\def\2{c}\def\3{aa}\n3 +\let\cmp\cmpaw\heapsort +\beginquote\prtw,\endquote +and +\def\1{j\ij}\def\2{ge\"urm}\def\3{gar\c con} +\def\4{\'el\`eve}\n4 +\let\cmp\cmpw {\accdef\heapsort} +\beginquote\prtw\endquote +!endverbatim +yields +\def\1{314}\def\2{1}\def\3{27}\n=3 +{\let\cmp\cmpn\heapsort +\beginquote\prtn,\endquote +% +\def\1{ab}\def\2{c}\def\3{aa}\n=3 +\let\cmp\cmpaw\heapsort +\beginquote\prtw,\endquote +and +\def\1{j\ij}\def\2{ge\"urm}\def\3{gar\c con}\def\4{\'el\`eve}\n=4 +\let\cmp=\cmpw{\accdef\heapsort} +\beginquote\prtw.\endquote +} + +\bluehead Quick sort + +The quick sort algorithm has been discussed in many places, +The following code is borrowed from Bentley.\ftn{Programming Pearls, Addison-Wesley. + It contains also diagrams which keep track of the invariants.} + +\beginpascal +procedure QSort(low,up); +if low<up then +begin +(*choose suitable median*) + Swap(X[low], X[RandInt(low,up)]); + T:=X[low]; M:=low; +(*Invariant loop + X[low+1..M]<T and X[M+1..I-1]>=T*) + for I:=low+1 to up do + if X[I]<T then + begin M:=M+1; + Swap(X[M], X[I]); + end; +(*exchange median*) + Swap(X[low], X[M]); +(*X[low..M-1]<X[M]<=X[M+1..up]*) + QSort(low, M-1); QSort(M+1, up); +end; +\endpascal + +\bluesubhead Purpose + +Sorting of the values given in the array +|\<low>|, \dots, |\<up>|. + +\bluesubhead Input + +The values are stored in +|\<low>|, \dots, |\<up>|, +with $1\le low\le up\le n$. +The parameter for comparison, \cs{cmp}, +must be \cs{let}-equal to +\item- \cs{cmpn}, for number comparison, +\item- \cs{cmpw}, for word comparison, +\item- \cs{cmpaw},for word comparison obeying the ASCII ordering, or +\item- a comparison macro of your own. +\smallbreak + +\bluesubhead Output + +The sorted array |\<low>|, \dots, |\<up>|, with \\ +\cs{va}$\langle low\rangle \le +\dots \le{}$ \cs{val}$\langle up\rangle$. + +\bluesubhead Source + +\thisverbatim{\unmc} +\beginverbatim +\def\quicksort{%Values given in +%\low,...,\up are sorted, non-descending. +%Parameters: \cmp, comparison. + \ifnum\low<\up\else\brk\fi +%\refval, a reference value selected +%at random. + \m\up\advance\m-\low%Size-1 of array part + \ifnum10<\m\rnd\multiply\m\rndval + \divide\m99 \advance\m\low \xch\low\m + \fi + \ea\let\ea\refval\csname\the\low\endcsname + \m\low\k\low\let\refvalcop\refval + {\loop\ifnum\k<\up\advance\k1 + \ea\let\ea\oneqs\csname\the\k\endcsname + \cmp\refval\oneqs\ifnum1=\status + \global\advance\m1 \xch\m\k\fi + \let\refval\refvalcop + \repeat}\xch\low\m + {\up\m\advance\up-1 \quicksort}% + \low\m\advance\low1 \quicksort} +% +\def\brk#1\quicksort{\fi} +!endverbatim + +Explanation. +At each level the array is partitioned into two parts. +After partitioning +the left part contains values less than the reference value and the +right part contains values greater than or equal to the reference value. +Each part is again partitioned via a recursive call of the macro. +The array is sorted when all parts are partitioned. + +In the \TeX{} coding +the reference value as estimate for the mean value is determined +via a random selection of one of the elements.\ftn +{If the array is big enough. I chose rather arbitrarily \on10{} + as threshold.} +Reid's \cs{rnd} has been used. +The random number is mapped into +the range [$\,low:up\,$], via the linear transformation +$\hbox{\cs{low}}+(\hbox{\cs{up}}-\hbox{\cs{low}})* +\hbox{\cs{rndval}}/99$.\ftn +{Note that the number is guaranteed within the range.} + +The termination of the recursion is coded in a \TeX{} peculiar way. +First, I coded the infinite loop. +Then I inserted the condition for termination with the \cs{fi} +on the same line, and not enclosing the main part of the macro. +On termination the invocation \cs{brk} gobbles up all the tokens +at that level to the end, to its separator \cs{quicksort}, +and inserts its replacement text, a new \cs{fi}, +to compensate for the gobbled \cs{fi}. + +\bluesubhead Auxiliaries + +Sorting is parameterized by comparison and exchanging. +Also needed is a random number generator. +The latter is not supplied here. + +\thisverbatim{\unmc} +\beginverbatim +\def\cmpn#1#2{%#1, #2 must expand into + %numbers +%Result: \status= 0, 1, 2 if +% \val{#1} =, >, < \val{#2}. + \ifnum#1=#2\global\status0 \else + \ifnum#1>#2\global\status1 \else + \global\status2 \fi\fi} +% +\def\xch#1#2{%#1, #2 counter variables + \edef\aux{\csname\the#1\endcsname}\ea + \xdef\csname\the#1\endcsname{\csname + \the#2\endcsname}\ea + \xdef\csname\the#2\endcsname{\aux}} +!endverbatim + +\bluesubhead Ordering + +The ordering is parameterized in the ordering table. + +\blueexample Numbers, words + +\cs{cmpn}, and \cs{cmpw} stand for compare numbers and words. +\cs{prtn}, and \cs{prtw} stand for print numbers and words, and +work the way you expect. +\cs{accdef} takes care that accents are properly defined. + +\beginverbatim +\def\1{314}\def\2{1}\def\3{27}\n3 +\low1\up\n\let\cmp\cmpn +\quicksort +\beginquote\prtn,\endquote +% +\def\1{ab}\def\2{c}\def\3{aa} +\def\4{\ij}\def\5{ik}\def\6{z}\def\7{a}\n7 +\low1\up\n\let\cmp\cmpw +\quicksort +\beginquote\prtw,\endquote +and +\def\1{j\ij}\def\2{ge\"urm}\def\3{gar\c con} +\def\4{\'el\`eve}\n4 +\low1\up\n\let\cmp\cmpw +{\accdef\quicksort} +\beginquote\prtw.\endquote +!endverbatim + +yields +\def\1{314}\def\2{1}\def\3{27}\n3 +{\low1\up\n\let\cmp\cmpn +\quicksort +\beginquote\prtn,\endquote +% +\def\1{ab}\def\2{c}\def\3{aa} +\def\4{\ij}\def\5{ik}\def\6{z}\def\7{a}\n7 +\low1\up\n\let\cmp\cmpw +\quicksort +\beginquote\prtw,\endquote +and +\def\1{j\ij}\def\2{ge\"urm}\def\3{gar\c con} +\def\4{\'el\`eve}\n=4 +\low=1\up=\n\let\cmp=\cmpw +{\accdef\quicksort} +\beginquote\prtw.\endquote +} + +\bluehead Use + +I needed sorting within \TeX{} for indexing and +for sorting address labels. + +\bluesubhead Sorting address labels + +Suppose we wish to sort addresses on the secondary key membership number. +In order to do so the index must point to the name of the database entry +and the name must point to its membership number, that is + +$$\vbox{\hbox{$1\,2\,\ldots + \rightarrow$ |\<name>|${}_x\,$ |\<name>|$_y\,\ldots + \rightarrow$ |<no>|${}_x\,$ |<no>|$_y\,\ldots$\hss}} +$$ + +This can be coded as follows. + +\beginverbatim +\loadindexmacros +% +\def\lst#1#2{\advance\k1 + \ea\def\csname\the\k\endcsname{#1}% + \ea\def\ea#1\gobbletono#2} +\def\gobbletono#1\no{} +\k0 +\input toy.dat %The test database +\n\k %number of items +Membershipno unsorted: \1, \2, ... +% +\let\cmp\cmpn\sort + +Sorted on membershipno: \1, \2, ... +!endverbatim + +The amazing thing is that we don't have to do much extra because the name +will expand to the number, which will be used in the comparison. +I used that \cs{no} was the last element of the database entry, +but that is not essential. +Each database entry consist of a triple \cs{lst}, |\<name>|, +and entry proper within braces. + +\bluesubsubhead Typesetting + +Now we have to redirect the pointer from the name away from the number +to the complete entry, that is + +$$\vbox{\hbox{$1\,2\,\ldots + \rightarrow$|\<name>|$_1\,$|\<name>|$_2\,\dots + \rightarrow$|{entry}|$_1\,$|{entry}|$_2\,\ldots$\hss}} +$$ + +This is done as follows. + +\beginverbatim +\def\lst#1#2{\def#1{#2}} +\input toy.dat +\1 \2 \3 \4 \5 \6 +!endverbatim + +\bluesubhead Sorting index entries + +One of the processes in preparing an index is sorting the Index Reminders, IRs. +This is again a sorting process on secondary keys, even tertiary keys. + +Given the sorting macros we just have to code +the special comparison macro in compliance with \cs{cmpw}: +compare two `values' specified by \cs{def}s. +Let us call this macro \cs{cmpir}.\ftn{Mnemonics: compare index reminders} +Each value is composed of +\item- a word (action: word comparison) +\item- a digit (action: number comparison), and +\item- a page number (action: (page) number comparison). +\smallbreak + +The macros read as follows. + +\thisverbatim{\unmc\catcode`!=12 \catcode`*=0 } +\beginverbatim +\def\cmpir#1#2{%#1, #2 defs +%Result: \status= 0, 1, 2 if +% \val{#1} =, >, < \val{#2} + \ea\ea\ea\decom\ea#1\ea;#2.} +% +\def\decom#1 !#2 #3;#4 !#5 #6.{% + \def\one{#1}\def\four{#4}\cmpaw\one\four + \ifnum0=\status%Compare second key + \ifnum#2<#5\global\status2 \else + \ifnum#2>#5\global\status1 \else + %Compare third key + \ifnum#3<#6\global\status2 + \else\ifnum#3>#6\global\status1 \fi + \fi + \fi + \fi + \fi} +*endverbatim + +Explanation. +I needed a two-level approach. The values are decomposed +into their components by providing them as arguments to \cs{decom}.\ftn +{Mnemonics: decompose. In each comparison the defs + are `dereferenced,' that is their replacement texts are + passed over. This is a standard \TeX nique: a triad of + \cs{ea}s, and the hop-overs to the second argument.} +The macro picks up the components +\item- the primary keys, the $\langle word\rangle$ +\item- the secondary keys, the $\langle digit\rangle$, and +\item- the tertiary keys, the $\langle page\,number\rangle$. +\smallbreak + +It compares the primary keys, and if necessary +successively the secondary and the tertiary keys. +The word comparison is done via the already available macro \cs{cmpaw}. + +To let this work with \cs{sort}, we have to +\cs{let}-equal the \cs{cmp} parameter to \cs{cmpir}. + + +\bluehead Sorting in the mouth + +Alan Jeffrey and Bernd Raichle have provided macros for this. +The following variant of the linear sorting given at the beginning of this +note is inspired upon Bernd's `Quick Sort in the Mouth,' Euro\TeX~\on94. +The idea is that a sequence is split in its smallest element and the rest +by an invoke of \cs{fifo}. +The rest is treated recursively as a similar sequence. +Another example of (multiple) nested FIFO. + +\thisverbatim{\unmc} +\beginverbatim +\def\fifo#1%accumulated rest + #2%smallest + #3%next +{\ifx\ofif#3 #2\ofif{#1}\fi + \ifnum#3<#2 + \p{\fifo{#1{#2}}{#3}}\else + \q{\fifo{#1{#3}}{#2}}\fi} +%repeat or terminate +\def\ofif#1\fi#2\fi{\fi + \if*#1*\endsort\fi + \fifo{}#1\ofif} +%auxiliaries +\def\p#1\else#2\fi{\fi#1} +\def\q#1\fi{\fi#1} +%terminator +\def\endsort#1\ofif{\fi} +%test +\fifo{}3{123}8{1943}\ofif +!endverbatim + +To assure yourself that it is all done in the mouth \cs{write} the test.\ftn +{I don't know how to ensure correctness. + It is tricky to get the braces right. + I used \cs{tracingmacros=1}.} + +However, in sorting within \TeX{} I prefer a uniform approach +not in the least parameterized over the ordering table. + +Have fun, and all the best +\makesignature +\pasteuptoc +\endscript
\ No newline at end of file diff --git a/info/laan/paradigm/paradigm.two b/info/laan/paradigm/paradigm.two new file mode 100644 index 0000000000..819514c0b8 --- /dev/null +++ b/info/laan/paradigm/paradigm.two @@ -0,0 +1,622 @@ +%November 1994,Summer 1995, Paradigma: Two part macros +%C.G. van der laan, cgl@rc.service.rig.nl +\input blue.tex \loadtocmacros +\outer\def\endmathdemo{\crcr\egroup$$} +\tolerance500\hbadness=499\hfuzz=10pt +\parindent=1pc +\everyverbatim{\emc} + +\bluetitle Paradigms: Two-part macros + +\blueissue\maps{95}1 + +\beginscript + +\bluehead BLUe's Design III + +Hi folks. When attending Amy's class in \on1990, +I was much surprised about +the two-part macro. In Algol, FORTRAN, PASCAL and ADA, +I had not heard of the concept, let alone I was familiar with it. + +In \bluetex{} they are at the heart of the syntax for the markup language. +To speak with Jackowski `I use them all the time.' + +\bluehead One-part vs.\ two-parts + +One-part macros are explained in Chapter \on20 of \TB. +They are used as a shortcut for the replacement text +parameterized by at most nine arguments. + +A two-part macro is different. The first part sets up +the `environment' followed by script elements and ended +by the second part, to finish up the environment. +\LaTeX{} emphasizes the environment concept in for example +\beginverbatim +\begin{abstract}...\end{abstract} +\begin{center}...\end{center} +\begin{itemize}...\end{itemize} +\begin{picture}...\end{picture} +\begin{quote}...\end{quote} +\begin{tabular}...\end{tabular} +\begin{thebibliography}... + \end{thebibliography} +\begin{verbatim}...\end{verbatim} +%etc. +!endverbatim + +\bluehead Why? + +The need for bothering about two-part macros is that the +enclosed script elements are processed on the fly, meaning with +the right catcodes. + +To digress a little on the above the following hypothetical example. +Suppose we have +\beginverbatim +{\catcode`*=13 + \gdef\begindemo{\begingroup + \catcode`*=13 \def*{MUL}} + \gdef\demo#1{\catcode`*=13 \def*{MUL}#1} +}\let\enddemo\endgroup +!endverbatim +then the result of +\beginverbatim +\begindemo*\enddemo +%and +\demo* +!endverbatim +is different. The first yields MUL and the latter *.\ftn{A robustness aspect is to + use \cs{begingroup} and \cs{endgroup} instead of \cs{bgroup} and \cs{egroup}, + to facilitate the location of (user) unmatched braces in between.} + +Explanation. +In the two-part case the * is seen after the catcode has changed. +while in the latter the * is seen, and the catcode {\it fixed}, before it +is made active. + +\bluehead Two-part macros + +In Chapter \on20 of \TB{} there is no treatment +of two-part macros, nor is there an entry for it in the index, alas. +Exercise \on5.\on7 deals with named blocks and +checking of them. +The latter is used in \LaTeX{} to make sure +that the right environment closing tag is used in the markup. +In Appendix~E, where example formats (o.a.\ manmac) are explained, +two-part macros are abundant, for example +\beginverbatim +\beginchapter...\endchapter +\beginlines...\endlines +\begindisplay...\enddisplay +\begintt...\endtt +\begimathdemo...\endmathdemo +\beginchart...\endchart +\beginsyntax...\endsyntax +\begindoublecolumns...\enddoublecolumns +\exercise...\answer...\par +!endverbatim +Furthermore, of late two questions were posed on TeX-nl, which exposed +the unfamiliarity with two-part macros. All this was enough for me to +spend a paradigm column on two-part macros.\ftn{Note that \cs{beginchapter}'s + title is not processed on the fly. In the `Paradigm: Headache?' I have shown + how the title and the contents of the chapter can be processed on the + fly.} + +\blueexample \cs{beginlines}\dots\cs{endlines} + +The functionality is that the script in between is processed +line-by-line and the result is preceded and followed by an \cs{hrule}. +\beginverbatim +\def\beginlines{\par\begingroup\nobreak + \medskip\parindent0pt\hrule\kern1pt + \nobreak\obeylines\everypar{\strut}} +\def\endlines{\kern1pt\hrule\endgroup + \medbreak\noindent} +!endverbatim +In the \TeX book script this is combined with in-line +verbatim.\ftn{To set text verbatim. By the way, this is another approach + to `verbatims with an escape character.'} + +Explanation. +The replacement text of \cs{beginlines} +is processed, followed by the formatting on-the-fly of the inserted material +(after \cs{beginlines}) up to \cs{endlines}. +The replacement text of the latter finishes it up. + +Unwanted breaks are avoided. +The \cs{hrule} is set in the first part and in the +second part next to opening and closing of the group. +The in between script is processed with \cs{obeylines} on. + +\blueexample \cs{begindisplay}\dots\cs{enddisplay} + +The functionality is that the script in between is processed +as a non-centered display, indented by \cs{displayindent}, +next to the value of \cs{parindent} from the template. +Pruned from non-essential issues for the two-part macro idea, +the macros read as follows. +\beginverbatim +\def\begindisplay{$$\the\thisdisplay\halign + \bgroup\indent##\hfil&&\qquad##\hfil\cr} +\def\enddisplay{\crcr\egroup$$} +!endverbatim + +Explanation. +The replacement text of \cs{begindisplay} +is processed, followed by the formatting on-the-fly of the inserted material +(after \cs{begindisplay}) up to \cs{enddisplay}. +The replacement text of the latter finishes it up. + +By the way, note that the user is not bothered by the details +of the template of the \cs{halign}; +it is already there.\ftn{In my \cs{btable} macro, I allowed the possibility + for a user to supply his own template, because I stored the + template in a token variable.} + +\bluesubhead Alignment display + +\$\$ followed by \cs{halign} is special, an exception. +It starts the so-called alignment display, meaning that +each hbox of the \cs{halign} is added to the main vertical list +indented at the left by \cs{displayindent}. +It is {\it not a math display}. +\cs{the}\cs{thisdisplay} allows to insert assignments. + +\bluesubhead And what about a one-part on top? + +This is not possible via my method as explained in +`Paradigms: Head\-ache?', because each table entry +must have balanced braces. Suppose we have + +\beginverbatim +\def\display#{\begindisplay\bgroup + \aftergroup\enddisplay + \let\dummy=} +!endverbatim + +then the \cs{bgroup} after \cs{begindisplay} is `unbalanced' in the first +column, except when it is about one entry only. + +\beginverbatim +\display{a} %works +\display{a&b}%doesn't work +!endverbatim + +\bluesubsubhead I let it go + +Because I could not provide a nice solution I let it go. +What I tried is out of balance with just using the two-part macros. +The best I could get at, when we allow in-line verbatim, needs the +following input. + +\thisverbatim{\catcode`\!=12 \catcode`\*=0 } +\beginverbatim +\thisdisplay{\catcode`\!=0 \catcode`\\=12 } +\display{|\a|&b!cr e&f} +*endverbatim + +\bluesubsubhead Conclusion + +When tables are involved my method of building one-part +macros on top of two-part macros is not suited.\ftn +{If one prefers a simple, but {\em restricted\/} one-part macro provide + |\def| |\display#1{| \cs{begindisplay} |#1| |\enddisplay}|.} +On the other hand for all those cases where the method works I have provided also +a macro such that \TeX{} can add the one-part automatically given the |<root>|. + +\bluesubhead Manmac's two-part macros + +These are treated in \TB~\on421. +Note that there the |\catcode`\^^M| annihilates the effect of \cs{obeylines}. +The \cs{obeylines} was introduced only to allow for an optional argument. +Because of my \cs{thisdisplay} toks variable, the \cs{obeylines} +and its annihilator are no longer needed. +Knuth's coding has been simplified, at the expense of introducing +a token variable \cs{thisdisplay}.\ftn +{Optional arguments\Dash well, more generally `Parame\-te\-riz\-ation'\Dash + will be subject of the next paradigm column.} + +\bluehead From the \TeX-nl list + +Andrea de Leeuw van Weenen and Ton Biegstraaten posed the following problems. +\bitem let characters print other characters +\bitem let |_| in math denote an underscore and not a subscript. +\smallbreak + +Although it turned out that my suggestions are not the \on100\% required ones, +I'll expose them here nonetheless, because they illustrate the use of two-part +macros. + +\bluesubhead Andrea's problem + +Let us suppose that the problem is to let B typeset 1, on demand. +A solution reads. + +\beginverbatim +\def\beginIT{\begingroup\catcode`\B=13 \ITstart} +{\catcode`\B=13 + \gdef\ITstart{\def B{\char'61}}} +\let\endIT\endgroup +%with use +ABC\quad +\beginIT ABC\endIT\quad +ABC +!endverbatim + +\def\beginIT{\begingroup\catcode`\B=13 \ITstart} +{\catcode`\B=13 + \gdef\ITstart{\def B{\char'61}}} +\let\endIT\endgroup + +The result reads\quad +ABC\quad +\beginIT ABC\endIT\quad +ABC. + +The problem which remained is that Andrea needs +simultaneously macros with those letters like B in their name. +She added the problem to her list of +`Impossible with \TeX{} problems.\ftn +{I'm curious to see that list in MAPS some day.}' + +\bluesubhead Ton's problem + +The restriction, which made that my solution was not appropriate, +is that it should be possible to use the solution as argument +of one-part macros, and that to unlimited depth.\ftn +{Courtesy Piet van Oostrum.} +In my approach all involved one-part macros had to be rewritten +into two-part ones. +However, if people would start to think in two-part macros +(nearly) all would have been fine. + +\beginverbatim +\def\beginusn{\hbox\bgroup\catcode`\_=13 + \startusn} +{\catcode`\_=13\gdef\startusn{\def_{\_}}} +\def\endusn{\egroup} +%with use +$a_b\quad \beginusn a_b\endusn\quad a_b$ +!endverbatim + +\def\beginusn{\hbox\bgroup\catcode`\_=13\startusn} +{\catcode`\_=13\gdef\startusn{\def_{\_}}} +\def\endusn{\egroup} + +\noindent and result\quad +$a_b\quad \beginusn a_b\endusn\quad a_b$. + +On top of the above two-part macros we can add one-part macros +{\it wih the same functionality}, as explained in the `Paradigm: Headache?' + +The one-part macros read + +\beginverbatim +\def\IT{\beginIT\bgroup + \aftergroup\endIT + \let\dummy=} +% +\def\usn{\beginusn\bgroup + \aftergroup\endusn + \let\dummy=} +!endverbatim + +\def\IT{\beginIT\bgroup + \aftergroup\endIT + \let\dummy=} +% +\def\usn{\beginusn\bgroup + \aftergroup\endusn + \let\dummy=} +As expected |ABC\quad\IT{ABC}\quad ABC|\\ +yields +\quad ABC\quad\IT{ABC}\quad ABC, and +\par +|$a_b\quad\usn{a_b}\quad a_b$|\\ +yields +\quad $a_b\quad\usn{a_b}\quad a_b$. + +Note that I omitted here the \# as last element of the parameter list, +neglecting some built-in security checks.\ftn +{In the case of the \# end separator the text after the macro invocation + must syntactically begin with an opening brace. + When the \# separator is omitted, anything can follow |\<tag>|.} + +\bluehead Eqalign as two-part macro + +As an example of how to cast a one-part macro into two parts, +and a one-part macro\ftn{Not more limited than the one available.} +on top, let us rewrite \cs{eqalign}, \TB~\on362. +The extra functionality of this approach is +that the two-part variant can be used in those cases where +the argument needs to be processed on the fly. + +\beginverbatim +\def\begineqalign{\,\vcenter\bgroup + \the\thiseqalign\openup1\jot\m@th + \starteqalign} +\def\starteqalign{\ialign\bgroup + \strut\hfil$\displaystyle{##}$&& + $\displaystyle{{}##}$\hfil\crcr} +\def\endeqalign{\crcr\egroup\egroup} +%with the one-part +\def\eqalign#1{\begineqalign + #1\endeqalign} +!endverbatim + +I don't have a concrete example for the need for modifying +\cs{eqalign} towards processing on the fly. However, it illustrates how +to rewrite a one-part macro into two-parts as basis. + +\bluehead Looking back + +I like the consistent markup via + +\thisverbatim{\emc} +\beginverbatim +\begin<tag> +<copy>!qquad!hbox!bgroup or!egroup!qquad\<tag>{<copy>} +\end<tag> +!endverbatim + +The right-hand variant is suited for the markup of headings, for example. +It has been adopted in \bluetex, as basic syntax, for the markup language. + +As an extra user-interface I have added in BLUe's format system as a tribute to manmac +tags of the form + +\beginverbatim +\blue<tag><copy>\par%or blank line +!endverbatim + +They have lost the processing on the fly behaviour but they are suited for minimal +markup, reducing the number of curly braces. + +\bluehead Multiple use of copy + +Sometimes we need to process the copy\Dash or should we talk about data then?\Dash +more than once. +An example is the data for a crossword, where I used the data for typesetting +the puzzle\Dash the data reflect the structure\Dash +and the solution. +See `Typesetting crosswords via \TeX, revisited,' \maps{92}2. + +The basic idea is to store the data with the right catcodes.\ftn +{Perhaps the most trivial approach is to insert the data each time we need it. + I consider that inelegant and also error-prone. The given macro is a + beautiful example, if I may say so, of what Victor Eijkhout and + David Salomon call two-step macros (see later), + while at the user level the macro can be used + as if it is a two-part macro, with the nice opening and closing tags.} + +\beginverbatim +\def\bdata{\begingroup + \obeylines\obeyspaces\store} +\def\store#1\edata{\endgroup + \def\storeddata{#1}} +!endverbatim + +Explanation. +The data, in natural markup line-by-line, +can be supplied between \cs{bdata} and \cs{edata}. The \cs{edata} +is a parameter separator and not the invocation of the closing part +of a two-part macro, although it looks the same. +What happens is that \cs{bdata} sets up the environment, especially provides +the right catcodes. \cs{store} ends the environment (scope) and +stores the data, with the wanted catcodes, as replacement text of +\cs{storeddata}. + +In order to appreciate the subtleness of the above coding +the following digressions. + +\bluesubhead Two-part macros and storing on the fly + +This is inhibited by the following\ftn +{Courtesy Victor Eijkhout in `\TeX{} by Topic,' section \on10.\on3 group delimiters. + Awareness of these restrictions is indispensable for writing two-part macros. + I omitted the use of \cs{setbox}, because once set in a box one can't do much with + the data anymore.} +\bitem the {\it opening and closing brace\/} of the + replacement text of a \cs{def} must be explicit +\bitem the right-hand side of a token list assignment must be explicit. +\smallbreak + +The following innocent coding is therefore incorrect.\ftn +{The use of explicit braces is incorrect as well.} + +\beginverbatim +\def\bdata{\begingroup + \obeylines\obeyspaces + \gdef\storeddata\bgroup} +\def\edata{\egroup\endgroup} +!endverbatim + +Possible alternatives to my coding above are + +\beginverbatim +\def\data{\obeylines\obeyspaces + \gdef\storeddata} +%with use +\begingroup +\data{ab c + e fg} +\endgroup +% +%and via the use of a toks variable +% +\newtoks\storeddata +\def\data{\obeylines\obeyspaces + \global\storeddata} +%with use +\begingroup +\data{ab c + e fg} +\endgroup +!endverbatim + +Nice aspects of the above approaches are +\bitem at the outer level I abstracted from storing in a def or a token + variable, and +\bitem the symmetry. +\smallbreak + +Definitely not nice aspects are +\bitem it looks as if the data are stored in \cs{data}, and +\bitem the \cs{begingroup} and \cs{endgroup} at the user level. +\smallbreak + +\bluesubhead A one-part on top + +My scheme does not work for this case. Some puzzling yielded +as one-part \cs{data} on top of \cs{bdata}, +with \cs{edata} eliminated.\ftn +{Note that in-line verbatim as part of the data goes wrong in the sense of unexpected results.} + +\beginverbatim +\def\data{\begingroup + \def\store##1{\endgroup + \gdef\storeddata{##1}\endgroup} + \bdata} +%With use +\data{ab c + d ef} +!endverbatim + +Explanation. +\cs{data} starts a group and (re)defines \cs{store}. +The invocation of \cs{bdata} set the catcodes\Dash via \cs{obeylines} and +\cs{obeyspaces}\Dash and invokes \cs{store}. +The argument to the latter macro is stored in +\cs{storeddata} with the right catcodes. +\cs{store} also ends the groups.\ftn +{The group opening in \cs{bdata} is not needed here, but + within the context of the two-part macro next to the one part, it is needed.} + +\bluesubhead Chapterhead + +For \bluetex{} I designed \cs{report}. A report takes chapter titles. +The problem is how to write macros consistent with the philosophy of starting from +two-part macros and building a one-part on top, {\it with\/} the chapter +title also stored for use in the running headline, for example. + +In an abstract sense this is equivalent to the \cs{bdata} \cs{edata}, \cs{data} suite. +It is even simpler, because I just have to store the title and allow the following use. + +\beginverbatim +\beginchapterhead +<titlehead> or \chapterhead{<titlehead>} +\endchapterhead +!endverbatim + +The result must be such that the chapter title will be typeset appropriately within the context, +as prescribed by the token variables \cs{prechapterhead} and \cs{postchapterhead}, and +that the title will be stored in the token variable \cs{chaptername}. + +\bluesubsubhead Coding the two-part macros + +The coding of the two-part macros read as follows. + +\beginverbatim +\def\beginchapterhead{\the\prechapterhead + \storechaptername} +\def\storechaptername#1\endchapterhead{% + \chaptername={#1}\endchapterhead} +\def\endchapterhead{{\chpfont + \the\chaptername}\the\postchapterhead} +!endverbatim + +\bluesubsubhead Coding the one-part macro on top + +The one-part macro on top reads as follows. + +\beginverbatim +\def\chapterhead{\bgroup + \def\storechaptername##1{\egroup + \global\chaptername={##1}% + \endchapterhead} + \beginchapterhead} +!endverbatim + +The head-suite of macros also need processing and storing if not for writing to a ToC file. +The use of the token variable \cs{prechapterhead} provided the hook to change +the catcode of the circumflex\Dash +which in \bluetex{} is default active because of preparing Index Reminders\Dash +into \on7 and allow processing math as part of the title. + +\bluesubsubhead What have we gained? + +We can use now the title with different fonts, as title and in the running head. +Moreover, we can use the \cs{beginchapterhead}, \cs{endchapterhead} pair +to enclose the title, or let it look as an assignation to |\chapterhead|. +Looking back a paradigm emerged for the following. + +\beginverbatim +\begin<tag> +<copy> or \<tag>{<copy>} +\end<tag> +!endverbatim + +|<copy>| also stored in the token variable |\<tag>name|. +Useful. + +\bluesubhead Multiple use with different catcodes + +Like Knuth we are at loss, unless we make use of a file. +It occurs in manmac's math demos, for example +\beginmathdemo%TeXbook 128 + \it Input&\it Output\cr + \noalign{\vskip2pt} + |$x^2$|&x^2\cr +\endmathdemo +needs markup with repetition of the data\ftn +{Borrowed from \TB{} script. In \bluetex{} I added \cs{crcr} + to \cs{endmathdemo}, for consistency with \cs{halign} use.} + +\thisverbatim{\catcode`\|=12 \unmc} +\beginverbatim +\beginmathdemo + \it Input&\it Output\cr + \noalign{\vskip2pt} + |$x^2$|%<--- + &x^2 %<--- +\endmathdemo +!endverbatim + +Subtle, very subtle. One thing is crystal clear, however. +\beginquote +Because of the above varieties (and pitfalls?),\\ +a discipline of \TeX{} coding is needed. +\endquote + +\bluehead Epilogue + +Eijkhout in `\TeX{} by Topic' and Salomon in `Insights and Hindsights' +treat {\it two-step\/} macros, not {\it two-part\/} macros.\ftn +{Apparently they did not inspect manmac in detail. + In Eijkhout's book look at section \on11.\on9.\on4, the macro \cs{PickToEol}. + In Salomon's courseware look at section \on5.\on19, the macro \cs{elp}.} +One macro will set up conditions and a second will do the work. +The difference with two-part macros is that the `work macro' also terminates the conditions, +while in two-part macros the second part has only the functionality to terminate. +Probably other macros are involved to do the work. +A beautiful example from manmac is the non-centered display macro with the following tags. + +\beginverbatim +\begindisplay %to set up conditions +\startdisplay %to do the work +\enddisplay %to finish up +!endverbatim + +As known, I prefer\Dash like Knuth\Dash the separation of concerns principle, and +like opening and closing tags. +But, \dots I prefer {\em implicit\/} closing tags, in short minimal markup. + +To my knowledge it is not possible to build gracefully, +and with the {\it same functionality}, a one-part {\em table\/} macro +on top of its constituent two-parts, in full generality. + +Have fun, and all the best. +\makesignature +\pasteuptoc +\endscript
\ No newline at end of file diff --git a/info/laan/paradigm/polygon.eps b/info/laan/paradigm/polygon.eps new file mode 100644 index 0000000000..c8cdc1e1d8 --- /dev/null +++ b/info/laan/paradigm/polygon.eps @@ -0,0 +1,16 @@ +%!PS EPSF Nested pentagons +%%Title: polygon.eps +%%Creator: cgl +%%CreationDate: June 17 1996 +%%BoundingBox: -100 -100 100 100 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%250 500 translate +%150 0 translate +10 10 100{dup 0 moveto + 5{72 rotate + dup 0 lineto + }repeat +}for stroke +showpage diff --git a/info/laan/paradigm/polygonii.eps b/info/laan/paradigm/polygonii.eps new file mode 100644 index 0000000000..a3fbf4c4bd --- /dev/null +++ b/info/laan/paradigm/polygonii.eps @@ -0,0 +1,20 @@ +%!PS EPSF +%%Title: polygon.eps II +%%Creator: cgl +%%CreationDate: June 17 1996 +%%BoundingBox: -100 -100 100 100 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%250 500 translate +/r 100 def +/r1 {r .25 mul} def +/r3 {r .75 mul} def +25{r 0 moveto + 4{r3 r3 r1 r1 0 r curveto + 90 rotate + }repeat + .9 .9 scale +}repeat +stroke showpage +%%eof diff --git a/info/laan/paradigm/prpie.eps b/info/laan/paradigm/prpie.eps new file mode 100644 index 0000000000..aecb95c143 --- /dev/null +++ b/info/laan/paradigm/prpie.eps @@ -0,0 +1,98 @@ +%!PS EPSF %-Adobe-2.0 +%%Title: Blue Book Program 14, on page 187 +%%Creator: Adobe Systems Incorporated +%%CreationDate: Thu Dec 28 18:14:18 PST 1989 +%%BoundingBox: -215 -215 215 195 +%%EndComments + +/PieDict 24 dict def +PieDict begin + /DrawSlice + { /grayshade exch def + /endangle exch def + /startangle exch def + /thelabel exch def + + newpath 0 0 moveto + 0 0 radius startangle endangle arc + closepath + 1.415 setmiterlimit + + gsave + grayshade setgray + fill + grestore + stroke + gsave + startangle endangle add 2 div rotate + radius 0 translate + newpath + 0 0 moveto labelps .8 mul 0 lineto stroke + labelps 0 translate + 0 0 transform + grestore + itransform + /y exch def /x exch def + x y moveto + + x 0 lt + { thelabel stringwidth pop neg 0 rmoveto } + if + y 0 lt { 0 labelps neg rmoveto }if + thelabel show + } def + + /findgray + { /i exch def /n exch def + i 2 mod 0 eq + { i 2 div n 2 div round add n div } + { i 1 add 2 div n div } + ifelse + } def +end + +/DrawPieChart + { PieDict begin + /radius exch def + /ycenter exch def /xcenter exch def + /PieArray exch def + /labelps exch def /titleps exch def + /title exch def + + gsave + xcenter ycenter translate + + /Helvetica findfont titleps scalefont setfont + title stringwidth pop 2 div neg radius neg + titleps 3 mul sub moveto + title show + /Helvetica findfont labelps scalefont setfont + /numslices PieArray length def + /slicecnt 0 def + /curangle 0 def + + PieArray + { /slicearray exch def + slicearray aload pop + /percent exch def + /label exch def + /perangle percent 360 mul def + /slicecnt slicecnt 1 add def + label curangle curangle perangle add + numslices slicecnt findgray DrawSlice + /curangle curangle perangle add def + } forall + grestore + end + } def + +(January Pie Sales) 24 12 + [ [(Blueberry) .12 ] + [(Cherry) .30 ] + [(Apple) .26 ] + [(Boston Cream) .16 ] + [(Other) .04 ] + [(Vanilla Cream) .12 ] + ] 0 0 140 DrawPieChart + +showpage diff --git a/info/laan/paradigm/readme.fst b/info/laan/paradigm/readme.fst new file mode 100644 index 0000000000..25af2b3468 --- /dev/null +++ b/info/laan/paradigm/readme.fst @@ -0,0 +1,22 @@ +What is't? (The paradigm.*** files) %June, 1996 +---------- + +The purpose of the series is to explain and foster \TeX ing paradigms, +with emphasis on what has been used in BLUe's format system. + +Submitted: +Paradigm: Plain's \item extended MAPS 94.2 (paradigm.itm; about items) +Paradigm: Headache? MAPS 94.2 (paradigm.hea; about headings) +Paradigm: Two-part macros MAPS 95.1 (paradigm.two; about two-part macros) +Paradigm: Parameterization I---Options MAPS 95.1 (paradigm.opt; about \this..., \every...) +Paradigm: Winds and halfwinds + ---Details matter MAPS 96.1 (paradigm.lin; about turtle graphics) +Paradigm: It's all in the game MAPS 96.1 (paradigm.gam; about tic-tac-toe) +Paradigm: Loops MAPS 96.2 (paradigm.lps; about loops and tail recursion) +Paradigm: Searching MAPS 96.2 (paradigm.src; about searching) +Paradigm: Sorting MAPS 96.2 (paradigm.srt; about sorting) +Paradigm: Just a little bit of PostScript MAPS 96.2 (paradigm.postscript; about creating epsf) + and (paradigm.ps with .ps pictures included). + +Kees van der Laan, Hunzeweg 57, 9893PB, Garnwerd, The Netherlands. +Phone: (31) (0)594 62 1525, email: cgl@rc.service.rug.nl.
\ No newline at end of file diff --git a/info/laan/paradigm/seal.eps b/info/laan/paradigm/seal.eps new file mode 100644 index 0000000000..679109f814 --- /dev/null +++ b/info/laan/paradigm/seal.eps @@ -0,0 +1,26 @@ +%!PS EPSF +%%Title: Typesetting along arcs +%%Creator: cgl +%%CreationDate: June 4 1996 +%%BoundingBox: -110 -40 110 90 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +%150 650 translate +/Courier findfont 10 scalefont setfont +/text (happy postscripting to you) def +/r 100 def +gsave + 90 rotate %begin orientation + 0 r moveto%begin point +{-7.04 rotate 0 r moveto} text kshow +grestore +3{25 34 moveto + 25 -34 lineto + 17 -38.2 lineto + 17 20 lineto + -17.6 0 lineto +120 rotate +}repeat +stroke +showpage diff --git a/info/laan/paradigm/sine.eps b/info/laan/paradigm/sine.eps new file mode 100644 index 0000000000..4db36ff2bb --- /dev/null +++ b/info/laan/paradigm/sine.eps @@ -0,0 +1,22 @@ +%!PS EPSF +%%Title: Sine function +%%Creator: cgl (inspired by Batagelj) +%%CreationDate: May 27 1996 +%%BoundingBox: -200 -110 200 110 +%%EndProlog +/Courier findfont 15 scalefont setfont +%figure scaled by 100 +%x-axes and label +-200 0 moveto 200 0 lineto +-15 -15 rmoveto (x) show +%y-axes and label +0 -110 moveto 0 110 lineto +-35 -10 rmoveto (sin) show +%function +-180 0 moveto +-180 10 180{%from step to + dup sin 100 mul%(x, 100sin x) + lineto +} for +stroke +showpage
\ No newline at end of file diff --git a/info/laan/paradigm/sinedisks.eps b/info/laan/paradigm/sinedisks.eps new file mode 100644 index 0000000000..2ae7ef88f7 --- /dev/null +++ b/info/laan/paradigm/sinedisks.eps @@ -0,0 +1,13 @@ +%!PS Sine with overlapping disks +%%BoundingBox: -200 -110 200 110 +%%Creator: cgl (METAFONTbook ex 13.10) +%%CreationDate: June 17 1996 +%%EndProlog +%300 500 translate +newpath +-180 10 180{dup sin 100 mul%(x, 100sin x) + 12.5 0 360 arc + gsave 1 setgray fill grestore + stroke +} for +showpage diff --git a/info/laan/paradigm/textalongarc.eps b/info/laan/paradigm/textalongarc.eps new file mode 100644 index 0000000000..ea263f3e24 --- /dev/null +++ b/info/laan/paradigm/textalongarc.eps @@ -0,0 +1,20 @@ +%!PS EPSF +%%Title: Typesetting along arcs +%%Creator: cgl +%%CreationDate: June 4 1996 +%%BoundingBox: -100 50 100 125 +%%Pages: 1 +%%EndProlog +%%Page: 1 1 +/Courier findfont 10 scalefont setfont +%150 650 translate +% +/text (happybirthday) def +60 rotate +0 1 12{0 100 moveto + dup%double loop var + text exch 1 getinterval show + -10 rotate +}for +stroke +showpage diff --git a/info/laan/paradigm/textalongspiral.eps b/info/laan/paradigm/textalongspiral.eps new file mode 100644 index 0000000000..81a3c45d1c --- /dev/null +++ b/info/laan/paradigm/textalongspiral.eps @@ -0,0 +1,45 @@ +%!PS EPSF +%%Title: Text along spiral +%%Creator: jvr +%%BoundingBox: -100 -100 90 60 +%%EndProlog +/Courier findfont 20 scalefont setfont +gsave +%150 700 translate +-100 0 moveto 50 rotate +{-10 rotate 3 0 rmoveto .98 .98 scale} +(Olga Grineva my charming + St Peterburg hostess)kshow +stroke +grestore +500 100 translate +% +/l 36 def +/r {l 22.5 sin mul} def +/m {l 22.5 cos mul} def +8{r .5 mul 0 moveto + l 0 lineto + currentpoint %begin circular arc + 22.5 rotate m 0%center + r %radius + -90 90 arc + 22.5 rotate +}repeat +%inner circle +/rin {r .5 mul} def +rin 0 moveto +0 0 rin 0 360 arc +%outer circle +/rout {r m add} def +rout 0 moveto +0 0 rout 0 360 arc +%extra circles +/rin {r .25 mul} def +22.5 rotate +8{m rin add 0 moveto + m 0 rin 0 360 arc + 45 rotate +}repeat +stroke +showpage +showpage diff --git a/info/laan/pwt/README b/info/laan/pwt/README new file mode 120000 index 0000000000..966a6277c5 --- /dev/null +++ b/info/laan/pwt/README @@ -0,0 +1 @@ +readme.fst
\ No newline at end of file diff --git a/info/laan/pwt/pwt.aft b/info/laan/pwt/pwt.aft new file mode 100644 index 0000000000..896198cbf8 --- /dev/null +++ b/info/laan/pwt/pwt.aft @@ -0,0 +1,293 @@ +\input blue.tex \loadindexmacros \report + +\bluechapter Afterthoughts + +\beginsummary +This chapter relates BLUe's format to existing formats and styles, +especially \AmS-(La)\TeX, (La)\TeX, LAmS\TeX, and the TUGboat styles. +At the end some statistics about processing PWT has been included. +\endsummary + +Why this work? Is \LaTeX{} not sufficient? +\LaTeX{} was not necessary, the \TeX book contained it all, \smiley. +This advantage turned out to be a severe disadvantage. +\TeX{} was simply too much, too unusual and ahead of its time. +The bad news is, alas, that \TeX{} is very error-prone, +in the hands of the casual layman.\ftn{Don't misunderstand me, + the software itself is as free of errors as bugfree can be. + No, it has all to do with people who partly + understand the system, but need macros. + Many a released macro\Dash the more so for collections of macros\Dash + is immediately followed by an improved version, and so on. The last + observation is due to George Greenwade, and I agree with him.} +One has to be very precise, has to oversee all the consequences, +and has to be utmost, utmost consequent. + +Perhaps because of the latter Lamport dared to do less, +thought that simplifying is the way out. To quote Dijkstra +\begincenter\noindent`Abstraction is our only mental tool to + master complexity' +\endcenter +He provided a system tuned for the end-user, +along with a users' guide. +The latter is the big deal for general acceptance.\ftn{BLUe's format system + not only provides the macros and the users' guide PWT, no it also provides + the background articles, especially the paradigm series, next to articles + which account in detail for some other formats like manmac, AMS, and \TUB.} +\begincenter +If only there had been a users' guide for manmac, +the \AllTeX{} world would have looked much different +from what it is today. {\TB} is +`intended for people who have never used {\TeX} before, +as well as for experienced {\TeX} hackers. +\endcenter +Below I'll very roughly characterize other formats, which enjoy a general +acceptance, in relation to BLUe's format. +The AMS and TUG styles, and the work of Spivak, have been +surveyed\Dash and commented in depth\Dash in separate articles. + + +^^{\AmSTeX} +\bluehead \AmS-(La)\TeX + +These formats are not personal but provided and maintained by the \AMS. +It is a rich and wealthy source. My comments date back to {\oldstyle1992}, +when I studied the formats in detail. +Their user and installation guides are very good. +The coding is clever, very clever, but tends to be monolithic. +It is not easy to borrow parts from it. The formatting of references +in \bluetex{} has been inspired upon \AmSTeX's preprint style. + +^^{\LAMSTeX} +\bluehead \LAMSTeX + +Michael Spivak did a great job. +His macros for tables and commutative diagrams +are impressive, very impressive. +The way he recast the \LaTeX{} functionality looks very promising. +It is only a pity that his code does not enjoy general acceptance, +as far as I know. +It is even sadder that his codings have not been +studied nor borrowed from.\ftn{I must confess that I was put off by + his argument for why an \cs{else} is needed within \cs{loop} \cs{repeat}. + Not true, IMHO, with all respect. A little Boolean arithmetic will do, + and is useful for other purposes too. I explained that in `Syntactic + Sugar,' and showed codes for that.} + + +^^{\LaTeX} +\bluehead La\TeX + +Indeed, \LaTeX{} is not sufficient, although much of +the functionality of BLUe's format was already provided by \LaTeX. +The setup of BLUe's format is much different though. +\LaTeX{} does not suit my purposes. +Its Achilles heel is customization. +Some features of BLUe's format are +its open eye for change, +its openendedness, +next to +its turtle graphics, +its databases,\ftn{This is much more general than {\em separately stored\/} + style files.} +and last but not least its (mini-)indexing on the fly, +that is what I need. +I understand \bluetex{} and feel happy with it, \winksmiley, +probably for the rest of my life. +The great\Dash not to be underestimated\Dash virtues of \LaTeX{} are +\begincenter +separate style files +users' guide +general acceptance +\endcenter +BLUe's format is stable, compatible with plain \TeX, +well-organized, and reasonably compact. +I have tried to combine the best of both worlds. +\begincenter +Stay with Knuth with respect to his unsurpassed markup, and +borrow Lamport's awareness of the necessity of a users' guide. +\endcenter +If you ponder about a manmac users' guide, it is mandatory to pay attention +to developments since.\ftn{However, I must confess that I'm not + completely up to date with \PS, Adobe's Photoshop, nor Acrobat.} +That is how BLUe's format emerged. +A tribute to manmac and some more, that is the royal road I passed by. +Reality shows that manmac.tex has been neglected by the \AllTeX{} +community. +Given the reputation of Don Knuth, and the wide-spread use of \LaTeX, +I'm realistic about the acceptance of BLUe's format.\ftn{Thinking aloud: + I would be happy if {\oldstyle50}\% of NTG's members finds something of + interest in BLUe's format, be it the system, a nice macro, or just + an eye-opener with respect to markup or computer-assisted + typesetting in general. From CyrTUG I expect that even {\oldstyle75}\% of their + members can take advantage of the system. + And what about {\oldstyle10}\% of the {\it unorganized\/} \TeX{} users, + \winksmiley?} +Nevertheless, I hope that BLUe's format will find its niche within the spectrum of +tools for computer-assisted production and consumption of information. +IMHO, with all respect, it deserves it. \winksmiley. + +In the past I used \LaTeX{} but was unhappy with +the layout, and therefore added modifications, like many of us. +The results did not satisfy me, because +I never got the feeling that I understood the coding. +Even worse, I never felt happy with the coding of \LaTeX. + +Since then, I have become more and more enthusiastic about Knuth's markup, +especially about the subtleness of plain and manmac. +Understanding his macros is a real challenge, but once mastered +you feel like in heaven. It gave me such a pleasure. +The beneficial spinoff of this thorough study was that +the knowledge gained contributed much to the compactness of +BLUe's format. + +At the Euro\TeX{} {\oldstyle94} the new, long-awaited +\LaTeX{\oldstyle2}$\epsilon$ went public. +During the conference I was asking myself over and over the same questions, +to uncover the reasons why I don't believe that the approach taken +is the right one, especially for self-publishing authors. +My septicisms come down to the following. + +\bitem \LaTeX{} is essentially quasi-static in contrast with + plain, which is frozen and hence stable. I know that dynamics is the + nature of progress, but only a small amount needs change. + The lack of the awareness to separate the quasi-static part + from the stable part, is what I don't like. +\bitem The macros are essentially one-part macros with flexibility + via optional and ordinary parameters. The mechanism of parsing + optional arguments, is a non-\TeX{} approach, at the expense of + cumbersome and monolithic coding. + Two-part macros should be at the basis, + with options via token variables. As far as my experience goes + this will yield simpler coding, with the benefits of + easier maintenance. +\bitem \LaTeX{} is verbose and far from minimal markup +\bitem \LaTeX{} is not easy to customize +\bitem \LaTeX's macros are incompatible with plain, even the use of + \cs{def} is not possible\ftn{I know of the annoyance + of silently redefined macros, but nevertheless.} +\bitem \LaTeX{} turns out to be a cuckoo's egg +\bitem \LaTeX{} tends to represent the establishment, + not what individuals really need, IMHO, with all respect. + The imposing character is believed to be beneficial for + publishers, to ascertain that authors don't use markup + different from the standard style. Much truth in there, but the + world is changing. I favour simple tools, + which I understand to a high degree, and which are cooperative. +\smallbreak +I only hope that the \LaTeX{} developers can take advantage of my views. + +^^{TUGboat styles} +\bluehead TUGboat styles + +I learned a lot from those. The functionality of the OTR has +been taken over in BLUe's format. +It is just a pity that a preprint style is lacking. +I also consider the approach of the separate streams +\TeX{} next to \LaTeX, cumbersome to maintain. +At the lower level separate collections are in use next to each other. +For example the verbatim macros for \TeX{} differ from those for \LaTeX. +A common picture environment for both streams is not there either. +Similar to the AMS formats the coding is monolithic. +It is not easy to borrow parts from it. + +\displaycenterline{Not a common \TeX{} format with a \LaTeX{} + user interface on top.} + +I have used them for quite a while, but once I looked into the code, +I decided to go over to the manmac line of thought, back to the roots, +so to say, with all respect. + +\bluehead The future + +More important, and thinking positively, is to day-dream about the future +and especially to ponder about the new media to assist information +production and consumption. + +It is a little peculiar that I sympathize so much with the new media, +the newer developments, which will make it possible for the + \displaycenterline{masses to access information easily,} +the more so because this file is much like a traditional book. +It does not combine different media like text, sound, colours or graphics +in general. Not even does it allow you to click through the file +in a hyperlink sense. I'm not ashamed of that. +There are so many problems to be solved, +before we come even close to coping better +with information, I mean taking real advantage of the information. + +The buzzword which goes along +with this is the `electronic highway,' +having rapid and cheap access to +information stored digitally. +Perhaps the words `database publishing,' and +`multi-media' appeal even more. +Whatever the value of these approaches and promises, +let us down-to-earth ponder +about electronic equivalents of the old goodies, such as +a table of contents, +an index, +and cross-references. + + +\thissubhead{\runintrue} +\bluesubhead A Table of Contents\par is getting more and more important. +When tables of contents, ToCs for short, are generated automatically, +which is nice, they can't be searched for in a script. +A surprising consequence is to store a ToC also explicitly, +and perhaps separately from the work, because +people first like to browse through a table of contents or +read.me file. +For electronic use the page numbers attached are not that important. +How to access parts is more important. Therefore the ToC should contain +hyperlinks to the real information. + +\thissubhead{\runintrue} +\bluesubhead An Index\par is also no longer tied up with one book. +Databases can be searched on keywords, or more selectively browsed via queries, +to spot what one is looking for, whatever the context. +When we have spotted what we are looking for, +another click would be all that is needed to get +into it.\ftn{Let us forget, for the moment, the reality of + the morning-after invoice.} + +\thissubhead{\runintrue} +\bluesubhead Cross-referencing\par is really outdated. +Electronically, we are not limited by the traditional sequential +order of numbered pages. Relational links are there to +bring you immediately to the material required, be it to more details or +to just the opposite, a survey, with fewer details, +or, \dots\thinspace another representation, like spoken +in a different language. + +\thissubhead{\runintrue} +\bluesubhead The bad news\par is that none of those goodies mentioned are +part of this work. Just an afterthought, some wishful thinking, +pondering about future work. + +Frank Poppe communicated that he would be happy with the \TeX book script +with hyperlinks. That he could easily click through the related material +spread over the file. Indeed that would be nice. + +\bluehead Statistics about processing PWT + +The booklet contains in the draft version of spring {\oldstyle1995}, +{\oldstyle125} odd pages and some +{\oldstyle400} index entries, +all processed in one pass. +The sorting of the index did take an hour on my Mac Classic II, +and {\oldstyle10}K words of memory. +For re-runs without page changes one can do without \cs{sortindex} +because \cs{pasteupindex} reads from index.elm. +\begincenterblock +{\oldstyle967} strings out of {\oldstyle5259} +{\oldstyle4438} string characters out of {\oldstyle31539} +{\oldstyle63053} words of memory out of {\oldstyle65536} +{\oldstyle2531} multiletter control sequences out of {\oldstyle10000} +{\oldstyle18} hyphenation exceptions out of {\oldstyle307} +{\oldstyle22}i,{ \oldstyle21}n,{\oldstyle16}p, {\oldstyle216}b,% + {\oldstyle1015}s stack positions +out of {\oldstyle200}i, {\oldstyle60}n,{\oldstyle60}p, {\oldstyle5000}b, {\oldstyle2000}s +\endcenterblock +Remark. The needed save-stack size is larger than the usual default\Dash + as of {\oldstyle1995}\Dash for a PC. +\endinput diff --git a/info/laan/pwt/pwt.cus b/info/laan/pwt/pwt.cus new file mode 100644 index 0000000000..2e713ac06e --- /dev/null +++ b/info/laan/pwt/pwt.cus @@ -0,0 +1,433 @@ +\input blue.tex \loadindexmacros \report + +\bluepictures\bluepagepic + +\bluechapter Customization + +\beginsummary +Adaptation of BLUe's format with respect to the look-and-feel +has been discussed, i.e., adapting +the page size, +the headlines and footlines, +and the various headings. +Transformation of a BLUe script into a MAPS submission +has been touched upon. +At the end a quick look has been given +into the Pandora box of processing +scripts in other languages. +\endsummary + +The first thing to do is to personalize the format. Make yourself known. +In order to do so look in the file \bluetex{} for the comment line that +starts with |%Personalization|, and adjust what follows. + +Customization comes down to adapting \TeX's and \bluetex's parameters. +The big deal of ^{customization} is to adapt BLUe's format for processing +scripts in your language. +Apart from trivia this is beyond the scope of this guide. + +\bluehead Changing the look-and-feel + +Much of the ^{look-and-feel} is determined by +the page size, +the headline and footline, +the section beginnings, +and the opening part. + + +\bluesubhead Adapting the page size + +A page is composed of the page proper block, +$\cs{pagewd}{\times}\cs{vsize}$, preceded by the headline +and followed by the footline. +^|\hsize| is the width of a column. +^|\vsize| is the length of a column with footnotes included.\ftn{The + length of the page can actually become a little shorter or longer + because of the depth of the last box.} +Customization of the page dimensions can be done by adapting +|\A4|.\ftn{Customization of the + page composition is beyond the scope of this guide + and requires knowledge of the output routine. ^|\A5|, or other sizes, + can be added.} +^|\twocol| has been included below, along with the picture ^|\bluepagepic|. +^^|\onecol| + +\blueexample Page layout, and two-column settings + +{\gutter6em +\begindemo +\def\twocol{\maxcols=2 \xcol=1 + \onecolfalse\A4 + \hyphenchar\tentt='055 + \hyphenchar\ninett='055 + \hyphenchar\eighttt='055 + \tolerance500 + \hbadness=499 + \hfuzz=5pt +} +!yields +\bluepagepic +\enddemo} +Names are inherited from \TUB's output routine. +^|\xcol| denotes the number of the actual column. +The value of the ^|\hyphenchar| +allows hyphenation for words in those fonts. +The tolerance and badnesses are set to circumvent superfluous messages, +at the expense of less optimum results.\ftn{For the pragmatic approach + of getting rid of overfull boxes, I'm much indepted to Phil Taylor.} + +^|\hoffset| and ^|\voffset|, the offsets +of the left upper corner of the page to the boundary of the paper, +are both {\oldstyle1}\thinspace cm less than plain's +default of {\oldstyle1}\thinspace in. + +^|\A4| reads as follows. +\beginverbatim +\def\A#1{\csname A#1\endcsname} +\ea\def\A4{\ifonecol\hsize16cm\pagewd\hsize + \else\hsize9cm\intercolwd.5cm + \pagewd\hsize\advance\pagewd\hsize\advance\pagewd\intercolwd + \fi\colwd\hsize \vsize25cm} +!endverbatim + +\thissubhead{\runintrue} +\bluesubhead The header and footer\par are generated from the + token variables \cs{headline}, and \cs{footline}. + Default they read as follows. + +\blueexample Default headline and footline code + +\begincenterverbatim +\headline={\hbox to\pagewd{\it\the\issue\hfill\the\title}} +% +\footline={\hbox to\pagewd{\fiverm\rlap{Draft \today}\hfill + \dash\the\pagenumber\dash\hfill\llap{\copyright cgl}}} +!endcenterverbatim +An extra dimension ^|\pagewd| is needed +in order to have a quantity independent of the number of columns. +\exercise What are the ^|\headline| and ^|\footline| for \cs{report}? +\answer The regular headlines and footlines are as above with a few + elements altered. + However, there is a complication in the sense that + the headline is suppressed for the first page + of the chapter. This is handled in \cs{postchapterhead}. + Consult the formatbase, especially the report format. + +\exercise How can we use the \cs{headline} for transparencies? +\answer Similar to the running head of a book the headline\Dash well, the header + part\Dash can be put in a headline with contextual information + dynamically coupled. See the formatbase, especially the transparencies + format. + +\exercise In a book the footline contains usually the page number away from + the back, that is, right on right-hand pages and left on left-hand + pages. How can we achieve this? +\answer Provide +\beginverbatim +\footline{\hbox to\pagewd{\ifodd\pageno\null\hfill\fi\number\pageno\hfil}} +!endverbatim + + +\bluesubhead Title part + +The markup of the beginning\Dash title part\Dash +and the markup of the end\Dash closing part\Dash +of a regular BLUe script are implemented as follows. + +\blueexample Beginscript and endscript code + +^^|\beginscript| %^^|\endscript| +^^|\beginkeywords|%^^|\endkeywords| +^^|\beginabstract|%^^|\endabstract| +^^|\begincontents|%^^|\endcontents| +\thisverbatim{\catcode`\!=12 \catcode`\*=0 } +\beginverbatim +\def\beginscript{\lastscript\the\everyscript\begingroup + \the\thisscript + \hrule\kern2ex\noindent + {\titlefont\the\title}\if!\the\subtitle!\else + {\subtitlefont\the\subtitle}\fi + \medskip\the\author + \medskip\pasteupkeywords + \medskip\pasteupabstract + \medbreak\pasteupcontents\smallbreak} + +\def\endscript{\makesignature\xcol=\maxcols \vfil\eject\endgroup + \tracingstats1\stop\thisscript{}} +%with at the lower level +\def\beginkeywords{\setbox\keywordsbox\vbox\bgroup\subhead{\sevenbf + \the\keywordsname: }\small} +\def\endkeywords{\egroup} + +\def\beginabstract{\setbox\abstractbox\vbox\bgroup\centerline{\sevenbf + \the\abstractname}\beginquote\small} +\def\endabstract{\endquote\egroup} + +\def\begincontents{\setbox\contentsbox\vbox\bgroup\small\noindent + \the\contentsname\par\obeylines} +\def\endcontents{\egroup} + +\def\pasteupkeywords{\box\keywordsbox} +\def\pasteupabstract{\box\abstractbox} +\def\pasteupcontents{\unvbox\contentsbox} +*endverbatim + +Customization can be done by changing the above. +I have omitted the macros, which allow the use |\<tag>{...}|, +the short variant. +Whatever your change of |\begin<tag>| or |\end<tag>|, +the short variant |\<tag>{...}| remains invariant, that is, +complies automatically with your change.\ftn{Consult the paper + `Paradigms: Two-part macros' for the explanation.} +\exercise How can we suppress the author information at + the end of the document? +\answer Let \cs{makesignature} equal to \cs{relax}. + +%end answer +\exercise Enumerate the token variables which + contain language-dependent names. +\answer The token variables |\<tag>name|: + \cs{abstractname}, + \cs{keywordsname}, + \cs{contentsname}. + +%end answer +\exercise How can we obtain ^{Roman\ numerals} as page numbers? ^^|\folio| +\answer The control sequence to obtain Roman numerals is \cs{romannumeral}. + In plain \TeX{} Roman numerals are obtained automatically for + page numbers when \cs{folio} is used instead of \cs{pageno} provided + the number is negative. + From \TB{} 252, 362 the following. +\thisverbatim{\unmc} +\beginverbatim +\def\folio{\ifnum\pageno<0 \romannumeral-\pageno + \else\number\pageno \fi} +!endverbatim +See also page 40 and 41 of \TB, especially when uppercase +roman numerals are needed. +In \bluetex{} I introduced the token variable |\pagenumber{\folio}|. + +%end answer +\exercise How can we suppress the headline on the first page? +\answer This is a very common \TeX ing paradigm. The idea is + to redefine the responsible control sequence in such a way that + on first invocation the only action is to define itself by the + regular replacement text. For example in the report format, + in order to suppress the headline on the first page of each chapter, + I defined \cs{headline} in \cs{postchapter} as follows. +\beginverbatim +\postchapterhead={\vskip3pc\headno=0 \exno=0 \exano=0 + \headline={\global\headline={\hbox to\pagewd + {\sevenrm\the\chaptername\hfill\it\the\title}}}} +!endverbatim + +%end answer +\exercise How come that more than one script can be formatted + despite \cs{stop} in \cs{endscript}? +\answer The explanation is in the definition of \cs{notlastscript} + and \cs{lastscript}, which read as follows. +\beginverbatim +\def\notlastscript{\let\stop\relax} +\def\lastscript{\let\stop\end} +!endverbatim + +%end answer +For parameters which govern special constructs, such as +the shape of paragraphs, items, tables, or \dots\thinspace, +see the chapters on the issue. + +\bluesubhead Section beginnings + +^|\head| can be customized by adaptation of the parameters +^|\prehead| and ^|\posthead|, to position the head within context. +^|\ignorewhitespace| does what its name suggests.\ftn{It + gobbles white space after \cs{beginhead} up to the head title.} +The font used is parameterized in ^|\headfont|. + +\blueexample Head code + +\begincenterverbatim +\prehead{\vskip0pt plus5ex\penalty-250\vskip0pt plus1ex + \bigskip\noindent} +\posthead{\medskip\nobreak\noindent\ignorewhitespace} +\def\beginhead{\the\prehead\bgroup\headfont} +\def\endhead{\egroup\the\posthead} +!endcenterverbatim +\cs{subhead} and \cs{subsubhead} are constructed similarly. + +\exercise How can we ^{center\ heading}s? +\answer It looks like to extend \cs{prehead} and \cs{posthead}, + something like +\beginverbatim +\prehead\ea{\the\prehead\centerline\bgroup} +\posthead\ea{\ea\egroup\theposthead} +!endverbatim +However, this does not work\Dash explain why the head flushes right\Dash +because we can't use \cs{bgroup} and \cs{egroup} to enclose an argument. +A solution is to append \cs{hfil} to \cs{prehead} as follows. +\beginverbatim +\prehead\ea{\the\prehead\hfil} +!endverbatim + +%end answer + +\bluesubhead Raster layout and \TeX + +As Nico Temme communicated to me publishers require sometimes +fixed white space between headings and the surrounding text. +How to achieve this? +Naively this looks simple, just provide \cs{prehead} and \cs{posthead} +with the fixed skips. +The problem is, however, that \TeX{} likes some freeway +to shrink or stretch a little. + +\bluehead BLUe script into MAPS submission + +^^{BLUe\ script\ into\ MAPS} +In principle this is not too laborious, because only a handful of +outer-level control sequences need adaptation.\ftn{In general + transformation is very complex and confusing, + for example if we also consider automatic generation of an index. + It is next to impossible to do this automatically. + When submissions to (various) journals are + in sight, keep the markup as simple as possible. + And why not stick to simplicity as a rule?} + +MAPS.sty is \LaTeX{} biased. +To give you an impression of the amount of work +a template for a MAPS submission and a transformation table is +given below.\ftn{I don't use + times fonts, + don't use Babel (no dutch.sty, nor english.sty), + no fancyheadings are involved, + don't need + Mittelbach's multicolumn, nor Sch\"opf's verbatim facilities, + and the like. + Until today MAPS has used \LaTeX{\oldstyle2}.{\oldstyle09}. + Minimal markup tags have been neglected.} +Because BLUe's format is a personalized format you have to add +|\author{...}| and the like. + +Globals deserve special attention, because they might +interfere with other submissions. +%The MAPS style is not of an active type, and %in the sense of an active +%therefore retrograde adaptations are needed. %document. (cgl) + +The title block is filled in or simply reused +from the template. No problem at all. +A table of contents can be moved to the back part. + +I fell back upon +\LaTeX's bibliography handling.\ftn{Nowadays, I tend to omit the + references in a MAPS submission, and refer to my database + lit.dat.} +My use of so-called `run-in' heads requires special attention.\ftn{The + (sub)subhead title is part of the first sentence of the section.} +Important is that \bluetex's verbatim suite, tables and pictures +can be reused as such, similar to plain's math constructs. +For other things like my way of citation\Dash |<author>|, |<year>|\Dash +no adaptation is needed. + + +\blueexample BLUe script into MAPS submission + +\begindemo +%Template for MAPS submissions +\documentstyle[twocolumn]{maps} +\begin{document} +\title{...} +\subtitle{...} +\author{...} +\date{} +\maketitle + +\begin{abstract}...\end{abstract} +\begin{keywords}...\end{keywords} +%Contents table +%Copy proper +\head{...}%et cetera +%back matter, LaTeX's +\begin{thebibliography}{abcde} +... +\end{thebibliography} +\end{document} +!yields +\small\def\rowstblst{} +\def\x{\lower1ex\null} +\vruled\fll\def\colsep{$\longrightarrow$} +\def\btablecaption{} \def\footer{} +\def\header{BLUe script\cs MAPS.sty script} +\beginbtable +$\vcenter{\hbox{\tstrut|\begin|} + \hbox{|\end|\x}}$\ abstract + \cs$\vcenter{\hbox{|\begin{abstract}|\tstrut} + \hbox{|\end{abstract}|\x}}$\rs +$\vcenter{\hbox{|\begin|\tstrut} + \hbox{|\end|\x}}$\ keywords + \cs$\vcenter{\hbox{|\begin{keywords}|\tstrut} + \hbox{|\end{keywords}|\x}}$\rs +|\beginscript| \cs|\begin{bijlage}| \rs +|\head| \cs|\let\head\section|\rs +$\vcenter{\hbox{|\bitem|} + \hbox{\raise2ex\null\lower1ex\null\dots} + \hbox{|\bitem|\x} + \hbox{|\smallbreak|}}$ + \cs$\vcenter{\hbox{|\begin{itemize}|\tstrut} + \hbox{|\item...|\strut} + \hbox{|\item...|\strut} + \hbox{|\end{itemize}|\x}}$\rs +$\vcenter{\hbox{\tstrut|\begin|} + \hbox{|\end|\x}}$\ quote + \cs$\vcenter{\hbox{|\begin{quote}|\tstrut} + \hbox{|\end{quote}|\x}}$\rs +|\ftn| \cs|\footnote|\rs +$\vcenter{\hbox{|\begin|\tstrut} + \hbox{|<escape char>end|\x}}$\ verbatim + \cs$\vcenter{\hbox{|\begin{verbatim}|\tstrut} + \hbox{|\end{verbatim}|\x}}$\rs +|\endscript| \cs$\vcenter{\hbox{\tstrut + |\end{bijlage}|} + \hbox{|\end{document}|\x}}$ +\endbtable +\enddemo +^^{BLUeto you-name-it} +In general the mapping of a BLUe script into a you-name-it script +is near to impossible to automate completely, because of the +incompatibilities. +As far as I know\ftn{As of {\oldstyle1995}} +BLUe's format is the only formatting \TeX-like system +which has embraced the database idea at large, +has provided macros for `Turtle graphics.' and which +can produce indexes on the fly. + +However, when BLUe's format will be adopted by publishers +the conversion problem is no longer there, because the publisher +might issue the default as a ^{preprint format}, +with result that authors and publishers use the same markup tags, +while the formatted result is in agreement with the context, because +the publisher can best customize the various replacement texts +to their wishes. +As usual a hard \TeX nical problem can be +solved more elegantly non-\TeX nically. + +\bluehead Other languages + +The Pandora box of customization is to tailor BLUe's format +towards processing scripts in your language. +Knuth adapted \TeX{} in {\oldstyle1989}, +and provided \cs{language} to handle hyphenation per language, +and smarter ligatures, if I'm not mistaken. +The trivia for adaptation are changing the names +for document parts, like `Abstract, Keywords,' and similar things. +In BLUe's format the latter are parameterized in token variables. + +More complicated is creating an index on-the-fly in your language via +BLUe's format.\ftn{For the time being this is open. + The language-dependent ordering of letters has been parameterized + in an ordering table though.} + +An interesting application of formatting simultaneously two (or more) +languages is: two-column, with each column devoted to a language. +That is beyond the scope of this guide. +\endinput + diff --git a/info/laan/pwt/pwt.fmt b/info/laan/pwt/pwt.fmt new file mode 100644 index 0000000000..df373a78e7 --- /dev/null +++ b/info/laan/pwt/pwt.fmt @@ -0,0 +1,1467 @@ +\input blue \loadindexmacros \report \hfuzz=15pt +%\telephone{{\oldstyle31\thinspace{\rm(}0{\rm)}% +% 594\thinspace62\thinspace1525}} + +\bluechapter Formats + +\beginsummary +Next to the regular format BLUe's format contains the +report and transparencies formats. +The letter and concert format from the \TeX book have been +reviewed and the goodies in there have been borrowed. +The letter format makes use of the address.dat database. +Treated are among other things +how to use the formats, +how to proof separate chapters of a report, +how to create and update a set of transparencies, +how to format letters, make address labels, and +how to extend the databases by a format, tool, or address of your own. +A table of main tags and a list of the Frequently Used Tags, +for the letter, report and transparencies format, have been included. +\endsummary + +Before delving into the details of the database approach, +I'm happy to let you know that you can do without it, can fall +back on the traditonal method of file inclusion, if for some reason +or other you don't feel comfortable with databases. +For example, if you like to make use of the transparencies macros from +BLUe's format, copy the relevant part from fmt.dat into, +say, trspar.tex. Then proceed as usual, for example as follows. +\begincenterverbatim +\input blue.tex +\input trspar.tex +<restofbluescript> +!endcenterverbatim +On the other hand those who like the database approach can peruse +`BLUe's Format databases.' + +^^{database,\ fmt.dat} +\bluehead Use of formats from fmt.dat database + +To use a format just start a script with\ftn{Inclusion of files etc. + is handled behind the scenes. Default the format is suited for an article.} +\displaycenterline{|\input blue.tex \<formatname>|} +The markup tags are upwards compatible, i.e., +the tags from the regular \bluetex{} are still there, +but extended with extra tags. +The coding of the tags from the default format +have been adapted to the look-and-feel of |\<formatname>|, +the design if I may say so. + +\bluesubhead Adding a format + +To ^{add\ a\ format} to the BLUe's format system the following has to be done. +\bitem separate the storage-allocating + control sequences from the format, + i.e., treat \cs{newtoks} and the like separately +\bitem add the allocation control sequences to \bluetex +\bitem add the format with an `opening' and `closing' to fmt.dat +\bitem add a load macro to \bluetex. +\smallbreak +In actual fact this comes down to the following. Add to fmt.dat +\begincenterverbatim +\tool\<yourformat>fmt%Opening +<themacros> +\endinput %Closing +!endcenterverbatim +and include in the kernel \bluetex{} the load macro and the storage allocations +^^{entry\ for\ fmt.dat} +\thisverbatim{\catcode`\|=12 + \catcode`\!=12 + \catcode`\~=0 + } +\begincenterverbatim +%load macro +\def\<yourformat>{\let\<yourformat>fmt=x +\loadformat +\let\<yourformat>fmt=\undefined +} +%storage allocations +\new<type>\<name> +%<type> is one of box count dimen fam insert language skip +% muskip read toks write +%et cetera +~endcenterverbatim +Note the difference between |\<yourformat>| and |\<yourformat>fmt|. +Take care that |\<yourformat>fmt| remains undefined afterwards. +Now and then I safeguarded formats from double loading. + +There are a few restrictions on the macros, as a consequence +of the skipping mechanism used, via \TeX's argument processing. +\bitem no outer defs, i.e., \cs{newtoks} and the like should + be declared in regular \bluetex +\bitem no \cs{par}, use \cs{endgraf}, or |\csname par\endcsname| +\bitem no blank lines, insert \% +\smallbreak +Remarks. +The restriction with respect to your outer defs can be circumvented by +\bitem define all macros non-outer, or +\bitem use |\csname newtoks\endcsname\<tag>|, and the like, or +\bitem extend \cs{unouterdefs} by your outer defs, i.e., + include \cs{newtoks} and similars. When these are + part of the format or tool, multiple use + reallocates memory, and because \TeX{} + lacks a garbage collector this will cost extra + memory locations. +\smallbreak + +\bluesubsubhead Check for data integrity + +After a format has been added one can check whether the file can be scanned by +\TeX{} via making a table of contents as follows. +\begincenterverbatim +\input blue.tex +\contentstoolsorfmt{fmt} +\bye +!endcenterverbatim +This script produces no pages of output (that is OK). +The file contentsfmt will be created though. + +\bluesubsubhead Verbatim listing of a format + +This problem is induced by my multi-file approach. Of course +one can extract the format by an editor et cetera as alternative. + +\blueexample Verbatim listing of letter format + +\begincenterverbatim +\input blue.tex \let\letterfmt=x +\long\def\tool#1{\ifx#1\undefined\bgroup\unouterdefs\ea\gobbletool + \else\ea\toolverbatim\fi} +%\def\toolverbatim{\thisverbatim{\baselineskip12pt plus2pt minus1pt +% \lineskip1pt plus1pt minus1pt}\beginverbatim} +\def\cgl{\endverbatim\endinput} +\input fmt.dat \bye +!endcenterverbatim + +\bluesubsubhead Conventions for entries fmt.dat + +come down to +\bitem update the contents at the beginning of the file fmt.dat +\bitem supply |\message{ ---<...> format, <date>, <owner>--- }| in the beginning +\bitem take care of visual layout for print out +\bitem provide additional comments which contain markup for line numbering +\bitem add history of changes +\bitem add a table of contents with line numbers. +\smallbreak +The layout is aimed at printing in two columns and starts in a new column. +The selective line numbering is controlled by the following control sequences +\item{}\cs{numvrb}, to start line numbering +\item{}\cs{vrblin} = |<number>|, to adjust line counter, and +\item{}\cs{nonum} to switch off line numbering. +\smallbreak +Do remember that the escape char is the semi-colon. + +\blueexample Template for an entry in fmt.dat + +\begincenterverbatim +%end%%%%%<lastlinepreviousformat>%;newcol +% +% +%begin%%%%%%%%%%%%%%%%%%%%%<....>%;numvrb +\tool\<...>fmt +\message{ ---<...> format, <date>, + <owner>--- } +%<authorinformation> +%<theformatproper> +\endinput %;nonum +%Contents +%<item>...................<pagenumber(s)> +%etc +%History of changes +%<date> <change> +%etc +%end%%%%%%%%%%%%%%%%%%%%%%%<....>%!!cgl;newcol +!endcenterverbatim + +\bluehead Concert format + +Please open \TB{} on page {\oldstyle411}. What about this concert announcement? +I never received such a leaflet when attending a concert. ^^{format,\ concert} +The ones I got are prettier, so there is no use in copying this template.\ftn{I + have included the macros in the format \cs{concert} nevertheless, + for your convenience.} +This is more or less in agreement with what +Knuth states +\beginquote\noindent +\llap`Notice that the \cs{composition} and \cs{movements} and \cs{soloists} + macros do not include any special provision for vertical spacing; the + user is supposed to insert \cs{smallskip}, \cs{medskip}, and + \cs{bigskip} as desired. This was done deliberately, because different + concert programs seem to demand different spacing; no automatic scheme + actually works very well in practice, since musical literature is + so varied.' +\endquote +What can we learn from the format, especially the macros? +Usually a lot. Here we go. +\bitem The simple ^{size-switching macros} are nice, intelligible, + and compact, because we don't deal with math in this context. + The tags are just \cs{smalltype}, \cs{medtype}, and \cs{bigtype}. + A pedagogical stepping stone for size-switching macros in general. +\bitem The ^|\tsaologo| is nice too. I have used it for + delineating parts in `Math into BLUes.' My variant is the macro + ^|\partlogo| with the text as argument. The latter is part of \bluetex. +\bitem The ^|\soloists| macro deserves more general use. It shows + how to use \cs{halign} to {\sl center a block of text}. Moreover, it + can be recast into a two-part macro. + Note that \cs{centerline} has been used, but + the \cs{vbox} could have been replaced by math display markup with + the automatic insertion of \cs{displayskip} before and aft. + And why not get rid of the \cs{cr}? Natural input? + A matter of taste? I agree partly. The advantage + is the extra option possibility after the opening keyword. In this + case we can parameterize over the font to be used. +\smallbreak + +\bluesubhead Centering a block + +The coding of \cs{soloists} can be combined with the coding of +\cs{begindisplay}, \TB{} {\oldstyle421}, to yield a two-part macro for centering a block, +with the flexibility to specify the font after \cs{begincenterblock}. +Moreover, I incorporated the natural markup idea. No \cs{cr} has to be +supplied by the user, \TeX{} will insert those. +The macro is part of \bluetex. ^^|\begincenterblock|%^^|\endcenterblock| +\begincenterverbatim +\def\begincenterblock{\bgroup + \let\par\cr\obeylines\startcenterblock} +{\obeylines\gdef\startcenterblock#1 + {$$#1\vbox\bgroup\halign\bgroup&##\hfil\cr}} +\def\endcenterblock{\egroup\egroup$$\egroup} +!endcenterverbatim + +\blueexample The soloists macro; block centering + +\begindemo +\begincenterblock\bf +Ben Lee User, horn +Peter Schickele, hardart +\endcenterblock +!yields +\begincenterblock\bf +Ben Lee User, horn +Peter Schickele, hardart +\endcenterblock +\enddemo +Remark. The disadvantage of this macro is that no + page break will occur within the vbox. +% As usual there are advantages and disadvantages. + +\bluehead Letter format + +Please open \TB{} on page {\oldstyle403}, and you will see a marvel of natural markup. +Only {\oldstyle5} tags are needed to mark up a letter. +^^{format,\ letter} +\begincenterverbatim +\letterhead \address \body \closing \endletter +!endcenterverbatim +If this is such a great approach, +how come that it has not been taken over? +IMHO, with all respect, it was too difficult to customize. +At the time \TeX ies were busy porting the system to the various +platforms. +Moreover, nowadays I would like to +\bitem store addressees in a database, and use them from there +^^{database,\ address.dat} +\bitem have a simpler letterhead +\bitem let ^|\headline| take care of the headers +\bitem use fewer fonts, prevent suffering from fontitus +\bitem use the known sender\Dash remember BLUe's format is yours, + it knows about your context +\bitem use window envelopes +\bitem introduce token variables for ^|\subject|, ^|\yourreference|, + and ^|\ourreference| +\bitem make positioning of the address flexible in such a way + that it can move to adjust to your window envelope +\bitem adapt \cs{makelabel}\ftn{I named it \cs{makelabels}.} + to work independenly with the address.dat database + (Handy for address labels for carbon copies among other things) +\bitem substitute \cs{beginscript} for \cs{beginletter} and ditto for the + \cs{endscript}.\ftn{Well, \dots\thinspace I allowed \cs{beginletter} + as alias, ditto for \cs{endletter}.} +^^|\makelabels|\smallbreak +Because of the above, it is of no use to +include the letter format literally from \TB. +Furthermore, I simplified the approach a little, \smiley, to facilitate +customization. +The variant has been incorporated as \cs{letter} format in the fmt.dat +database. + +Note. The \cs{footline} on the first page is free to contain business +information like giro, Chamber of Commerce number and the like. +BLUe's format contains a toks variable \cs{businessaccount} for that +purpose. See NTG's letter format. + +\bluesubhead Use of the letter format + +In order to use this format the user has to customize his letter +format and make sure address.dat is available.\ftn{Well, + the latter can be circumvented + if \cs{loadreference} is replaced by a def with + the name of the addressee, followed by + the affiliation of which each line is preceded by |\\|, + as replacement text.} +^^{script,\ letter} +\begincenterverbatim +\input blue.tex \letter %Knows about logo, sender +\subject{...} +\yourreference{...} \ourreference{...}%just numbers +\addresses{\<name>} %load list of address{es} +\addressee{\<name>} +\beginscript +\dear +.... +\sincerely %knows about you +\cc ... %Optional set cc. .... +\ps ... %Optional set P.S. .... +\appendix{<appendixtitle>} +<appendixmaterial> +\endscript +!endcenterverbatim +The \cs{appendix} control sequence takes one argument. +It starts a new page but continues numbering. +%The material will be set after an \cs{item}. + +If the letter proper is stored in letter.tex, then the use looks even simpler. +\begincenterverbatim +\input blue.tex \letter %Knows about logo, sender +\subject{...} +\yourreference{...} \ourreference{...}%just numbers +\letterto{\<name>...} +!endcenterverbatim + +\blueexample A letter script; a letter to Don Knuth + +\beginverbatim +\input blue.tex \letter %Preliminary initializations +\subject{\TeX{} for BLU} +\ourreference{22 1 95} +\yourreference{\TB} +\addresses{\knuthde} +\addressee{\knuthde} %Initializes \addresseename \affiliationbox + %\thisscript{\notlastscript} +\beginscript %\beginletter is an alias +\dear +First of all I'm much obliged to your works especially \TB. +As you know roughly 10k organized users profit from your system +in getting their work out. It is estimated that the number of +{\sl unorganized\/} users is a tenfold. +I like your Ben Lee User character very much, +and hope he will benefit from my work towards understanding +and using \TeX{} with confidence. +\bigskip +What puzzles me is that manmac has been neglected so much. +Is it because a user's guide was lacking? +Was \TeX{} too far ahead of its time? +Too unusual? +\bigskip +I'm also puzzled about the neglectance of the letter format. +Was it too difficult for \TeX ies to customize at the time? +I mean, it is confusing to mix the line mode and the par mode. +As you can see from the \cs{letter} format I included, as part of +BLUe's format, I refrained from those and concentrated on +customization. +I also made use of a database of addresses, but that is +a minor \TeX nical point, because the markup abstracts from +that detail as it should. Just |\adressee\<name>|. +\bigskip +Whatever the reasons, I hope that my work will ease the use of manmac, +or even better BLUe's format. +The latter has manmac assimilated, and taken notice of +experience gained since the release of manmac. +\bigskip +After this work on using \TeX{} I intend to write +another booklet on \TeX{} macro writing, to emphasize two-part macros, +because two-part macros are in the dark in the \TeX book. +They are lacking in the chapter on macro writing\Dash except for \cs{beginbold} + and \cs{endbold}\Dash but have been used in manmac, and +therefore are dealt with in Appendix~E. +IHMO, with all respect, they deserve more attention. +By that time, I hope to be familiar with `\TeX{} The Program' too. +\bigskip +In near future I'll direct myself to \MF, well META{\smc post}, +and pay attention to {\oldstyle2}.{\oldstyle5}-D applications. +I have in mind to emulate the works of Naum Gabo, a sculptor, +whose objects I like very much. The exciting thing in there is +that I can emulate the work in {\oldstyle2}.{\oldstyle5}-D +with only {\oldstyle1}-D information. +The latter is quite obvious because he used regular surfaces. +However, it is apparently me who arrived at the crossroads. +\bigskip +I would appreciate it very much if you would let me know +that you have received this work, and of course, +I welcome suggestions. +\sincerely +\ps When I entered `Het Nederlands Rekenmachine Genootschap,' + in {\oldstyle1967}, the first volume of the Art of Computer + Programming was given to me, because of my lucky membership + number, {\oldstyle1024}. + I really could not foresee at the time that my interest in your work + would take this turn +\cc NTG +\endscript +!endverbatim +\storedpageno\count0 +\storedheadline\headline +\storedfootline\footline +\newpage +{\letter +%Preliminary initializations +\subject{\TeX{} for BLU} +\ourreference{22 1 95} +\yourreference{\TB} +\addresses{\knuthde} +\addressee{\knuthde} %Initializes \addresseename \affiliationbox + \thisscript{\notlastscript} +\beginscript +\dear +First of all I'm much obliged to your works especially \TB. +As you know roughly 10k organized users profit from your system +in getting their work out. It is estimated that the number of +{\sl unorganized\/} users is a tenfold. +I like your Ben Lee User character very much, +and hope he will benefit from my work towards understanding +and using \TeX{} with confidence. +\bigskip +What puzzles me is that manmac has been neglected so much. +Is it because a user's guide was lacking? +Was \TeX{} too far ahead of its time? +Too unusual? +\bigskip +I'm also puzzled about the neglectance of the letter format. +Was it too difficult for \TeX ies to customize at the time? +I mean, it is confusing to mix the line mode and the par mode. +As you can see from the \cs{letter} format I included, as part of +BLUe's format, I refrained from those and concentrated on +customization. +I also made use of a database of addresses, but that is +a minor \TeX nical point, because the markup abstracts from +that detail as it should. Just |\adressee\<name>|. +\bigskip +Whatever the reasons, I hope that my work will ease the use of manmac, +or even better BLUe's format. +The latter has manmac assimilated, and taken notice of +experience gained since the release of manmac. +\bigbreak +After this work on using \TeX{} I intend to write +another booklet on \TeX{} macro writing, to emphasize two-part macros, +because two-part macros are in the dark in the \TeX book. +They are lacking in the chapter on macro writing\Dash except for \cs{beginbold} +and \cs{endbold}\Dash but have been used in manmac, +and therefore are dealt with in Appendix~E. +IHMO, with all respect, they deserve more attention. +By that time, I hope to be familiar with `\TeX{} The Program' too. +\bigskip +In near future I'll direct myself to \MF, well META{\smc post}, +and pay attention to {\oldstyle2}.{\oldstyle5}-D applications. +I have in mind to emulate the works of Naum Gabo, a sculptor, +whose objects I like very much. The exciting thing in there is +that I can emulate the work in {\oldstyle2}.{\oldstyle5}-D +with only {\oldstyle1}-D information. +The latter is quite obvious because he used regular surfaces. +However, it is apparently me who arrived at the crossroads. +\bigskip +I would appreciate it very much if you would let me know +that you have received this work, and of course, +I welcome suggestions. +\sincerely +\ps When I entered `Het Nederlands Rekenmachine Genootschap,' + in {\oldstyle1967}, the first volume of the Art of Computer + Programming was given to me, because of my lucky membership + number, {\oldstyle1024}. + I really could not foresee at the time that my interest in your work + would take this turn +\cc NTG +\endscript +\newpage} +%Restore previous values +\count0\storedpageno\advance\count0by3 +\headline\storedheadline +\footline\storedfootline +\onecol%Restore \vsize + +\bluesubsubhead Syntax entries address database + +The address.dat database contains addresses sorted on name. +Each entry obeys the syntax, as shown by the following example. +^^{entry\ for\ address.dat} +\begincenterverbatim +\lst\<name>{<salutationname> + %Each line preceded by \\ + \\<fullname> + \\<affiliation> + \email{...}%optional + \phone{...}%Optional +} +!endcenterverbatim + +\blueexample Entry address.dat database + +\begincenterverbatim +\lst\ntg{NTG +\\Nederlandstalige \TeX{} + Gebruikersgroep +\\Postbus 394 +\\1740 AJ Schagen +\\The Netherlands +\email{ntg@nic.surfnet.nl} +\registeredbluetrue +} +!endcenterverbatim + +To ^{add\ an\ address} just adhere to the syntax, and include +the new address in address.dat, in the right order. +Note that it is also possible to introduce fields, which can be used in a query and +otherwise don't hinder, like \cs{registeredbluetrue}. ^^{field of database} + +\bluesubsubhead Check for data integrity + +After an address has been added one can check +whether the file can be scanned by +\TeX{} via making a table of contents as follows. +\begincenterverbatim +\input blue.tex +\contentsdatabase{address} +\bye +!endcenterverbatim +This script produces no pages of output (that is OK). +The file contentsaddress will be created though. +If you have a file with addresses of your own, say abc.dat, provide also +\cs{newwrite} \cs{tocabc}. + +\bluesubsubhead Multiple letters + +Erik Frambach asked me how to format ^{multiple letters}, with each letter +personalized by incorporating the address. +If we are talking of a few letters there is no problem at all. +Store the letter in a file and repeat the formatting for each letter. + +Let us assume that we wish to address a list of addressees, and that these +addressees are already in our database address.dat. + +The approach to solve this is to go through the list of adressees, via +FIFO, and `process' each with the letter. ^^{fifo} +\begincenterverbatim +\input blue.tex \letter +\subject{\TeX{} for BLU} +\yourreference{\TB} +\ourreference{1$\,$2$\,$95} +\letterto{\knuthde\ntg} +\bye +!endcenterverbatim +This scheme also works for one letter. +Note that after Dear the salutation name is used, +which gives a personal flavour. + +\bluesubsubhead And what about a letter to the complete address database? + +Logically, this is simple. Make a list of all the names of +the database elements and supply this list to ^|\letterto|. +We can let \TeX{} do all the work, by using ^|\lettertoall| +as follows. +\begincenterverbatim +\input blue.tex \letter +\subject{\TeX{} for BLU} +\yourreference{\TB} +\ourreference{1 2 95} +\lettertoall +\bye +!endcenterverbatim +An interesting application is that for example NTG can send a\Dash more or less +personalized\Dash letter to all its members. + +\bluesubsubhead Address labels + +Especially for the case of carbon copies separate address labels are wanted. +For that purpose I modified Knuth's \cs{makelabel} into +^|\makelabels|. ^^|\makealllabels| +\begincenterverbatim +\input blue.tex \letter +\makelabels{\knuthde\ntg} +%and all address labels +%can be obtained via +\makealllabels +\bye +!endcenterverbatim +If you prefer smaller address labels provide \cs{twocol}. + +\bluesubsubhead Searching the address.dat database by pattern + +^^{search\ of\ database} +BLUe's format provides a \cs{search} macro with +a search pattern as argument. +The purpose is to search the database file provided in +the toks variable \cs{searchfile}, +for this search pattern. +The result of the search is a list of names, of which +the replacement text contains the search pattern. +This list of names is delivered in the toks var \cs{namelist}, +and for the time being they are also written to the log file. + +\blueexample Search for addresses from RUSSIA in the database address.dat + +In order to justify my use of the word +database in relation to \TeX, I provided the search macro +to browse the databases lit.dat and address.dat. +Below the input and result have been given of the search of address.dat +for the pattern RUSSIA. The result is contained in the toks variable +\cs{namelst}. The names are also written to the log file +to give you a check for whether the right names have been selected. + +\begindemo +\input blue.tex +\searchfile{address} +\search{RUSSIA} +\bye +!yields +\cs{lst}\cs{gorbunovai} +\cs{lst}\cs{grinevaoa} +\cs{lst}\cs{makhovayai} +\enddemo + +This is handy for making address labels grouped per country. +\begincenterverbatim +\input blue.tex \letter +\search{RUSSIA} +\makesearchlabels +\bye +!endcenterverbatim +^^|\makesearchlabels| +^^|\makesearchletters| +\exercise Do you see the extension for sending letters to all those people? +\answer BLUe's format system contains the command \cs{makesearchletters}, similar + to \cs{makesearchlabels}. + +Remarks. A search pattern should not contain a period. + The search is case sensitive. + +\bluesubsubhead Sorting the address.dat database + +^^{sorting\ of\ database} +With databases a convenient aspect while reporting is the possibility of sorting +the database on secondary keys. Below I have included by example how this +can be achieved.\ftn{In `Sorting in BLUe' + I have shown how address labels can be sorted all within \TeX. + At that time I had not yet incorporated the database idea within \TeX.} + +The idea is that the `list' of names of the database entries are +sorted according to the criterion. +Because blue.tex's sorting macros sort an array, +the list is stored in an array. + +The major steps for typesetting the membership database sorted on +(membership) number, are that the {\em names\/} of the database entries are +\bitem stored in the array |\1, \2, ... , \<n>| +\bitem redefined with the value of \cs{no} as replacement text +\bitem sorted +\bitem redefined with the database entry as replacement text, and +\bitem typeset. +\smallbreak + +\blueexample Sorting address.dat on number + +The sorting of address.dat on (membership) number can be achieved with blue.tex as follows. +\beginverbatim +\loadindexmacros %Contains sorting macros +\def\lst#1#2{%Function: \def\<k>{#1} \def#1{<number>}, with + % \no{<number>} last item in each database entry + \advance\k1 \ea\def\csname\the\k\endcsname{#1}% + \ea\def\ea#1\gobbletono#2} +\def\gobbletono#1\no{} +\k0 +\input toy.dat %The test database +\n\k %number of items +No unsorted: \1, \2, \3, \4, \5, \6. %A snapshot + +\let\cmp\cmpn\sort +Sorted on no value: \1, \2, \3, \4, \5, \6. + +\def\lst#1#2{\def#1{#2}}%Redefine names by their database entry +\input toy.dat +Database entries sorted on no value: +%For typesetting we need +\let\\\par \def\no{\\Number=} \def\phone{\\Phone: } \def\email{\\Email: } +%Typeset entries with increasing membership number +\smallskip\1\smallskip\2\smallskip\3\smallskip\4\smallskip\5\smallskip\6. +\bye +!endverbatim +Each entry of the database is a triple \cs{lst}, |\<name>|, and a group, +with the group structured as shown in the syntax of an entry of the +(toy) membership database given below. +\beginverbatim +\lst\<name>{<forename> +\\<full name> +\\<address> +\email{<address>} +\phone{<number>} +\no{<number>} +} +!endverbatim + +\bluesubhead Customization + +If there is one format which is candidate for customization this is the one. +However, much information is already known by the system, like +\cs{author}, \cs{address}, \cs{logo}, et cetera. +Also addressees are known because of the address database. +What is left is to position the address in the address window. +BLUe's format provides the skip variables +\cs{haoffset} and \cs{vaoffset}. +These determine the shifts of the address within the window, +horizontally or vertically, respectively. + +When you are not satisfied with the basic layout then the \cs{headline} +and \cs{footline} have to be rewritten, because how the +information is pasted up will be taken form these token variables. +How to design your own letter format +is beyond the scope of this user's guide. + +\bluesubsubhead And what about a letter on behalf? + +Suppose your letter has to be sent by fax and signed by a formal organization +instead of yourself. How can we achieve this? A real-life example is a letter +I sent to the ISF signed by the secretary of the NTG. The key to the solution is +to know which variables to adjust. It is not that difficult to look for those +in the fmt.dat file in the letter part. ^^{letter on behalf} +Tht letter format comprises a {\oldstyle100} lines or so. +Here they are anyway: + \cs{address}, + \cs{netaddress}, + \cs{businessaccount}, + \cs{fullname} and + \cs{affiliationbox}. + (In general redefine also \cs{ntglogobox}.) +The greetings is inserted explicitly. +\beginverbatim +\input blue.tex \letter %\fax{(202)342-2765} +\subject{Request J. Soros travel grant} +\ourreference{5} +\yourreference{} +%\addresses\isf\addressee\isf %Switched off, details exlicitly provided +%To override defaults from BLUe.tex +%address sender +\address{Postbus {\oldstyle394}\\{\oldstyle1740}AJ Schagen\\The Netherlands} +\netaddress{ntg@nic.surfnet.nl} +\businessaccount{\vtop{\hbox{\strut KvK Groningen nr V{\oldstyle025936}} + \hbox{\strut GIRO {\oldstyle1306238}, NTG}}} +%addressee +\setbox\affiliationbox\hbox{International Science Foundation\\ + Washington\\USA} +\fullname{ISF} %Used in headline follow pages +\beginscript %\beginletter is an alias +L.S., +\bigskip +The NTG ---Dutch language-oriented \TeX{} Users Group--- +is organizing the Euro\TeX{} {\oldstyle95} meeting, +September {\oldstyle4}--{\oldstyle8}, at Arnhem. +\bigskip +Our plan is to facilitate participation from East and Mid European countries, +i.e., from CSTUG, CyrTUG, GUST, and HunTUG, not on an individual basis +but for some 50 members in total of those groups. +\bigskip +We are convinced that this project will stimulate scientific cooperation +between East and West and hope that the ISF will also support this effort by +a grant. +\begingroup%local re-assignation +\author{G.J.H. van Nes\smallskip + {\small secretary NTG}} +\sincerely +\endgroup +\ps \TeX{} is the revolutionary computer-assisted typesetting system designed by D.E. Knuth. +\cc CSTUG: Matematick\'y \'ustav UK, Sokolovsk\'a 83, CS-186 00 Prague, + CZECH Republic\\(The Czech \TeX{} Users Group. horakk@earn.cvut.cz)\\ + CyrTUG: MIR publishers, 2 Pervy Rizhsky pereulok, Moscow 129820, RUSSIA\\ + (The Cyrillic \TeX{} Users Group from CIS{}. cyrtug@mir.msk.su)\\ + GUST: Institut Bada\'n Systemowych PAN, ul.~Newelska 6, 01-447, Warszawa, + POLAND\\(The Polish \TeX{} Users Group. tomasz@panda.bg.univ.gda.pl)\\ + HunTUG: Institute of Mathematics and Informatics, Lajos Kossuth University + of Debrecen, H-4010 Debrecen, P.O.B. 12, HUNGARY\\ + (The Hungary \TeX{} Users Group. ludens@tigris.klte.hu)\\ +\endscript +!endverbatim + +Remark. Maybe I should make it possible to allow for multiple users, read senders +of letters. + +\bluesubsubhead And what about enclosures? + +I was so preoccupied by letters completely processed by \TeX{} or its ilks, +that I simply overlooked the wish to specify ^{enclosures} and include these fysically. +Well, \dots no problem. Just define +\beginverbatim +\def\enclosures{\bigskip Enclosures: \small } +!endverbatim +and use this for example at the end\Dash just before \cs{endscript}\Dash as follows +\beginverbatim +\enclosures{Copy of bank payment} +!endverbatim +Creeping featurism? Let us put it positively: +no unnecessary issues have been implemented, and +when something is needed we can easily add it. + + +\bluesubsubhead Your summary of main markup tags for letters + +The Frequently Used Tags, FUTs for short\Dash indeed a handful, as already indicated in + the template in the `Introduction'\Dash for personalizing. +Use it as crib. + +\beginverbatim +!bf +Letter proper!tt +\addresses{...} +\addressee{...} +\subject{...} +\yourreference{...} +\ourreference{...}%only digits +\letterto{...} +\lettertoall +\vaoffset +\haoffset +!bf +Copy Proper!tt +\beginscript +\endscript +\dear +\sincerely +\cc +\ps +\appendix{...} +!bf +Address labels!tt +\makelabels{...} +\makealllabels +\makesearchlabels +!endverbatim + + +\newpage +\bluehead Report format + +A report is set in one-column, with per page a header and footer. +The header is suppressed for the preliminary pages and +for every first page of a chapter. ^^{format,\ report} +The latter starts with a +title and summary followed by the copy proper. +The footer is suppressed for the preliminary pages, i.e., +these pages lack numbering, among other things. + +^^|\chapterhead|^^|\summary| +^^|\begindemo|%^^|\enddemo| +^^|\yields| +^^|\displaycenterline| +^^|\begincenterdisplay|%^^|\endcenterdisplay| +Some new control sequences are +\begincenterdisplay +\cs{preface} &for a preface\cr +\cs{chapterhead} &for chapter title\cr +\cs{setupappendices} &for letters as numbers\cr +\cs{pasteup...} &to paste up elements\cr +\endcenterdisplay +Next to the coding of the new control sequences several existing control +sequences had to be recoded to comply with \cs{report}. +The reimplementation of ^|\beginscript| was tedious work, because +it takes care of the preliminary pages: +the cover page, +the inside cover page, +the title page, +the preface page, and +the table of contents page. +|\endscript| takes care of the back cover pages. + +The implementation of \cs{(chapter)head} was tough work because of the wish +to process on the fly and to store the title. +On second thoughts I realized the more +modest wish to allow for math in the titles, +especially to handle the circumflex appropriately. + +Next to the a priori and physical table of contents +in the front matter of the report, +a table of contents with page numbers attached dynamically, +is generated on the fly and appended at the end of the +typeset report. +The latter supports `drafting,' much in the spirit of developing +a program supported by literate programming tools. +A ToC, a ToE, or the set of answers, are generated on +the fly and can be called up via \cs{pasteuptoc}, \cs{pasteuptoe}, +respectively \cs{pasteupanswers}. The contents file can be edited and used +for the static table of contents, finally. + +\bluesubhead Template + +The file for this report has all chapters included. +However, while writing and proofing all chapters were kept +in separate files. +The latter structure, stripped from redundancies, +has been included below as a template. ^^{script,\ report} + +If the preliminary matter is a little overwhelming, skip this section, and continue +with `Proofing a single chapter.' + +\blueexample A report script; the outer markup for this report + +The template reads as follows. +\thisverbatim{\catcode`\!=12 + \catcode`\~=0 } +\beginverbatim +\input blue.tex %\loadindexmacros %When creating an index too +\report + %Cover data +\bluetitle Publishing with \TeX + +\bluesubtitle BLUe's Selection + +\bluepictures \bluemodelpic + + %Inside cover data +\bluekeywords Bibliography, \bluetex, ... + +\bibliographydata{ISBN: \dots\par ...} +\beginacknowledgements +First of all +\displaycenterline{Don Knuth, Thank You!} +... +\rightline{I'm grateful to all of you.} +\endacknowledgements + %Title page data (next to title&author) +\beginabstract +The use of \bluetex{} has been documented in a user's guide, +... +\endabstract + %Preface page data +\beginpreface \vskip2\bigskipamount +Dear User, \bigskip +It occurred to me that my detailed studies +... +will be beneficial for new-and-old \AllTeX ies alike. + \bigskip +\rightline{\the\author} +\endpreface + %Contents Page data + %Because of \valign use, \contents{...} + %is not possible. +\begincontents %\se is subentry descriptive tag +Preface +Table of contents +Introduction +\se BLUe's format +... +\se J: Table of Contents +\endcontents +\let\coverpic=\bluemodelpic %BLUe script proper +\beginscript +\input pwt.int %Introduction +\input pwt.txt %Text +%\endscript %For testing, to make script smaller +\input pwt.mat %Mathematics +\input pwt.tab %Tabular material +\input pwt.grf %Pictures +\input pwt.ref %References +\input pwt.ind %Index creation +\input pwt.cus %Customization +\input pwt.aft %Afterthoughts +% +\setupappendices %From now on A, B, C,... +\pasteupanswers %A: Answer to Exercises +\input pwt.fmt %B: Formats +\input pwt.tls %C: Tools +\input pwt.sur %D: Backgrounds +\pasteuptoe %E: Table of Examples +\input pwt.tot %F: Table of tags +\input pwt.his %G: History of changes +\input pwt.obs %H: Obselete macros +%\sortindex\pasteupindex %I: Index +\pasteuptoc %J: Table of Contents +\endscript +~endverbatim + +\bluesubhead Proofing a single chapter + +^^{proofing single chapter} +Chapters can be proofed separately, not only for their contents but also for what +will come in +the Answers to the Exercises, +the List of Examples, +the Index, and +the Table of Contents. + +The markup where also +a ^{mini-ToE}, +a ^{mini-index}, and +a ^{mini-ToC} will be obtained, +reads as follows. +\beginverbatim +\input blue.tex %\loadindexmacros +\report +\input <filewithchapter> + %\pasteupanswers + %\pasteuptoe + %\sortindex\pasteupindex + %\pasteuptoc +\bye +!endverbatim +Perhaps the easiest way to get results is to forget about the preliminary +matter to start with. The above script formats your chapter and why not +begin with + +|\chapterhead{...}| right away, instead of |\input <filewithchapter>|? + +We can easily test a few chapters in a row as follows. +Omit \cs{bye} and when \TeX{} prompts for an +\cs{end} insert `i' for insert and after the insert prompt supply +\cs{input} |<nextchapter>|. + +\bluesubhead Main tags for report format + +A table of main tags for \cs{report} has been included ^^{report format, main tags} +to provide a survey of what outer tags\Dash and to what extent\Dash +they have been implemented for the \cs{report} format.\ftn{More + control sequences and symbols are available, + especially for the lower level markup, + if not for the undocumented features of manmac, + and the wealth of plain \TeX.} +The table also illustrates the naming convention of +a root name with affixes. + +The header fields indicate, +the prefixes pre-, post-, this-, every-, pasteup-, and +the suffixes -font, -name and -box. +The first column contains the various root names, with a marker +to denote to what extent the minimal one-part macro +has been implemented. + +\begingroup +\def\first{\hfil\thispicture{\unitlength=6ex \xdim{1.4}\ydim{1}}% + \lower1.5ex\hbox\beginpicture%(1.4, 1)(0,-.1) + \put( 0.0, 0.0){\small \strut Root}% + \put( 1.4, 0.575){\llap{\small Affix}}% + \put( 1.4, 0.1){\line(-2, 1){1.4}}% +\endpicture\lower3ex\null} +\def\header{pre-\cs post-\cs this-\cs every- \cs pasteup- + \cs -font\cs -name + \cs -box} +\def\btablecaption{Main tags for report scripts} + +\catcode`/=13 +\def/{\leavevmode\thinspace\hbox{% + \vrule\vtop{\vbox{\hrule\kern1pt\hbox{% + \vphantom{\tt e}\thinspace%{\tt#1}% + \thinspace}}\kern1pt\hrule}\vrule}% + \thinspace} % control sequence token +\catcode`-13 \def-{$\neg$} +\def\footer{\qquad\vtop{\small\rlap{- not implemented} + \rlap{${}^+$ implemented} + \rlap{/ implemented without processing on the fly}}} +\def\rowstblst{ +{abstract\hfill\ \tiny+} +{acknowledgements\hfill\ \tiny+} +{btable \hfill\ \tiny/} +{center \hfill\ \tiny+} +{chapterhead \hfill\ \tiny+} +{contents\hfill\ \tiny+} +{(sub(sub))head\hfill\ \tiny+} +{keywords\hfill\ \tiny+} +{picture \hfill\ \tiny-} +{pictures\hfill\ \tiny/} +{preface \hfill\ \tiny+} +{quote \hfill\ \tiny+} +{references\hfill\ \tiny/} +{script \hfill\ \tiny+} +%{syntax\hfill\ \tiny-} %Although there, not so relevant for the table +{summary \hfill\ \tiny+} +{verbatim\hfill\ \tiny-}} +\def\data{% + -\cs-\cs-\cs-\cs+\cs-\cs+\cs+\rs%abstract + +\cs+\cs+\cs-\cs+\cs-\cs+\cs+\rs%abstract + +\cs+\cs+\cs+\cs-\cs-\cs-\cs+\rs%btable + -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%center + +\cs+\cs+\cs+\cs-\cs+\cs-\cs-\rs%chapterhead + -\cs-\cs-\cs-\cs+\cs-\cs+\cs+\rs%contents + +\cs+\cs-\cs-\cs-\cs+\cs-\cs-\rs%head + -\cs-\cs-\cs-\cs+\cs-\cs+\cs+\rs%keywords + -\cs-\cs+\cs+\cs-\cs-\cs-\cs-\rs%picture + -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%pictures + +\cs+\cs-\cs-\cs-\cs+\cs-\cs-\rs%preface + -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%quote + +\cs+\cs+\cs+\cs+\cs-\cs+\cs+\rs%references + +\cs+\cs-\cs-\cs-\cs+\cs-\cs-\rs%summary + -\cs-\cs+\cs+\cs-\cs-\cs-\cs-\rs%script +% -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%syntax + +\cs+\cs+\cs+\cs-\cs-\cs-\cs-%\rs%verbatim +} +$$\vbox{\nonruled\nonframed + \btable\data}$$ +\endgroup +Remarks. +\bitem ^|\title|, ^|\subtitle|, ^|\author| and the like, are token + variables and associated with the script +\bitem ^|\pictures| and ^|\references| have been implemented in a + straightforward way, + because their use doesn't need processing on the fly. +\smallbreak + +\bluesubsubhead Your summary of main markup tags for reports + +The Frequently Used Tags, FUTs\Dash indeed a handful, as already indicated in + the template in the `Introduction'\Dash +for personalizing. + + +\beginverbatim +!bf +Preliminary matter!tt +\title{...} +\subtitle{...} +\keywords{...} +\abstract{...} +\contents{...} +\issue{...} +\acknowledgements{...} +\references{...} +\pictures{...} +!bf +Copy Proper!tt +\beginscript +\endscript +\chapterhead{...} +\summary{...} +\head{ ...} +\thissubhead{...} +\subhead{...} +\thissubsubhead{...} +(the \this<headkind>{...} especially together with \runintrue) +\subsubhead{...} +!bf +Inner level!tt +\begindemo...<escapechar>yields...\enddemo +\thisverbatim{...} +\beginverbatim +<escapechar>endverbatim +(and in-line !vrt!thinspace...!thinspace!vrt) +\beginquote +\endquote +\begindisplay +\enddisplay +(with & and \cr) +\displaycenterline{...} +\begincenterdisplay +\endcenterdisplay +(with & and \cr) +\btable +(with \data{...\cs...\rs...\cs...\rs...} + \header{...} + \footer{...} + \rowstblst{...} + \vruled{...} ) +\ref\<name> +\crsref\<name> +\ftn{...} +\item{...} +\itemitem{...} +\aitem +\Aitem +\bitem +\nitem +\example{...} +\thispicture{...} +(with \unitlength=...) +\cs{<tagname>} +!bf +Back matter!tt +\setupappendices +\pasteupanswers +\pasteuptoe +\pasteupreferences +\sortindex\pasteupindex +\pasteuptoc +!endverbatim + +\bluesubhead Addition of a format to BLUe's format system + +\blueexample Addition of report format to the fmt.dat database + +The following has been added to fmt.dat. ^^{add\ a\ format} +\begincenterverbatim +\tool\reportfmt +<themacros> +\endinput +!endcenterverbatim +\bluetex{} has been extended with +\thisverbatim{\catcode`\|=12 + \catcode`\!=12 + \catcode`\~=0 } +\begincenterverbatim +\def\report{\ifx\undefined\reportfmt\let\reportfmt=x\fi + \ifnum\reportloadcnt=0 \ea\loadformat\fi + \advance\reportloadcnt1 \let\reportfmt=\undefined} +%Storage allocations for \report come next +\newtoks\prefacename +%et cetera +~endcenterverbatim + +\newpage +\bluehead Transparencies format + +BLUe's format transparencies have a centered flavour, with +a header part which reflects the series, and the context. +^^{format,\ transparencies} +There is also room for a user logo to be printed in the header. + +Very error-prone is the line-by-line nature of a transparencies script. +Beware! +For example when providing a macro one should remember +that each line end is special. Perhaps I should provide +also \cs{disobeylines} to undo the \cs{obeylines}. + +\bluesubhead Template + +I like to start from an example, a template, which shows what +has to be provided. + +^^{script,\ transparencies} +\blueexample Transparencies script + +\thisverbatim{\catcode`\|=12 } +\beginverbatim +\input blue.tex \pictures\bluemodelpic +\transparencies \vfuzz=15pt \everyverbatim{\emc} +\hsize14cm +\leftskiptrs.2\hsize \rightskiptrs.1\hszie + +\title{BLUe's Format} +\subtitle{the best of both worlds} + +\contents{WAF? + Outer vs Inner markup + Template + Customization + Coding + Transparencies + Tags survey + Conclusions +} + +\beginscript +\head{WAF? } %Starts a new transparency, implicitly +$$\thispicture{\xoffset{-1}}\bluemodelpic$$ + +\head{Markup language} %Starts a new transparency, implicitly +\bitem |\begin<tag>...\end<tag>| |\<tag>| \hfill defs +\bitem |\this<tag>| |\every<tag>| \hfill token vars +\bitem \cs{title} \dots \hfill token vars +\bitem |\pre<tag>| |\post<tag>| \hfill token vars +\bitem |\pasteup<tag>| \hfill defs +\smallskip +\vfill +\loadxyz$$\xyz{Alias tags}{Options}{Place within context}$$ +\endscript +!endverbatim + +The following pages contain the results. +\cs{transparencies} has been used locally, and because of the nested use +I inserted |\thisscript{\notlastscript}|. Note that \cs{pictures} +has to be supplied before \cs{transparencies} because the latter +turns \cs{obeylines} on. +\newpage +\subheadtitle{} +\subsubheadtitle{} +\storedpageno\count0 +{\pictures\bluemodelpic + \transparencies + \hsize14cm + \leftskiptrs.2\hsize\relax + \rightskiptrs.1\hsize\relax + \hfuzz30pt \vfuzz=15pt \everyverbatim{\emc} + +\title{BLUe's Format} +\subtitle{the best of both worlds} + +\begincontents WAF? + Outer vs Inner markup + Template + Customization + Coding + Transparencies + Tags survey + Conclusions +\endcontents + +\thisscript{\notlastscript} +\beginscript +\head{WAF? } +$$\thispicture{\xoffset{-1}}\bluemodelpic$$ + +\head{Markup language} +\bitem |\begin<tag>...\end<tag> \<tag>| \hfill defs +\bitem |\this<tag>| |\every<tag>| \hfill token vars +\bitem \cs{title} \hfill token vars +\bitem |\pre<tag>| |\post<tag>| \hfill token vars +\bitem |\pasteup<tag>| \hfill defs +\smallskip +\vfill +\loadxyz +$$\vbox{\xyz{Alias tags}{Options}{Place within context}}$$ +\endscript +%\nxttrs +}%end transparencies intermezzo +\count0\storedpageno\advance\count0 by3 + +\def\bluehead#1\par{\head{#1}} +\def\bluesubhead#1\par{\subhead{#1}} +\def\bluesubsubhead#1\par{\subsubhead{#1}} +%kludge, admitted. March adaptation in trs is not robust, alas. + +\bluesubhead Use your logo + +^|\logo| is a def, and invoked within \cs{line}. +In order to have your logo, supply +\begincenterverbatim +\def\logo{\vbox to0pt{\vss +... %Your logo +}} +!endcenterverbatim + +\bluesubhead Maintenance + +This section is in a certain sense artificial, ^^{maintenance transparencies} +introduced by the automatisms which come with my choices for +the `header' and `footer,' especially the context-dependent +information in there. +The following might be helpful for modifying or extending +single transparencies. +The idea is to follow the script +setup and handle the \cs{header}, \cs{pagenumber} and +\cs{identification} for the particular transparency. +In the example below the task was to add a transparency +in between.\ftn{Without automatically gathering of context + information the modifications are a trifle.} +\begincenterverbatim +\title{Literate Programming} +\beginscript +\head{Tools} +\nxttrs +\identification{feb94} +\pagenumber{13a} +\subhead{FWEB} +LP tool by John Krommes +\endscript +!endcenterverbatim + +\bluesubhead Main tags for transparencies + +A table of main tags has been included ^^{transparencies format, main tags} +to provide a survey of what outer tags\Dash and to what extent\Dash +they have been implemented for the \cs{ transparencies} format. +The table also illustrates the naming convention adopted +via a root name with prefixes and suffixes. + +The header fields indicate, +the prefixes pre-, post-, this-, every-, pasteup-, and +the suffixes -font, -name and -box. +The first column contains the various root names, with a marker +to denote to what extent the minimal one-part macro +has been implemented. + +\begingroup +\def\first{\hfil\thispicture{\unitlength=6ex \xdim{1.4}\ydim{1}}% + \lower1.5ex\hbox\beginpicture%(1.4, 1)(0,-.1) + \put( 0.0, 0.0){\small \strut Root}% + \put( 1.4, 0.575){\llap{\small Affix}}% + \put( 1.4, 0.1){\line(-2, 1){1.4}}% +\endpicture\lower3ex\null} +\def\header{pre-\cs post-\cs this-\cs every- \cs pasteup- + \cs -font\cs -name%\cs -title + \cs -box} +\def\btablecaption{Main tags for transparencies scripts} + +\catcode`/=13 +\def/{\leavevmode\thinspace\hbox{% + \vrule\vtop{\vbox{\hrule\kern1pt\hbox{% + \vphantom{\tt e}\thinspace%{\tt#1}% + \thinspace}}\kern1pt\hrule}\vrule}% + \thinspace} % control sequence token +\catcode`-13 \def-{$\neg$} +\def\footer{\qquad\vtop{\small\rlap{- not implemented} + \rlap{${}^+$ implemented} + \rlap{/ implemented without processing on the fly}}} +\def\rowstblst{ +{btable \hfill\ \tiny/} +{center \hfill\ \tiny+} +{contents\hfill\ \tiny+} +{(sub(sub))head \hfill\ \tiny+} +{picture \hfill\ \tiny-} +{pictures\hfill\ \tiny/} +{quote \hfill\ \tiny+} +{script \hfill\ \tiny+} +%{syntax\hfill\ \tiny-} %Although there, not so relevant for the table +{verbatim\hfill\ \tiny-}} +\def\data{% + +\cs+\cs+\cs+\cs-\cs-\cs-\cs+\rs%btable + -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%center + -\cs-\cs-\cs-\cs+\cs-\cs+\cs+\rs%contents + +\cs+\cs-\cs-\cs-\cs+\cs-\cs-\rs%head + -\cs-\cs+\cs+\cs-\cs-\cs-\cs-\rs%picture + -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%pictures + -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%quote + -\cs-\cs+\cs+\cs-\cs-\cs-\cs-\rs%script +% -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%syntax + +\cs+\cs+\cs+\cs-\cs-\cs-\cs-%\rs%verbatim +} +$$\vbox{\nonruled\nonframed + \btable\data}$$ +\endgroup +Remarks. +\bitem ^|\title|, ^|\subtitle|, ^|\author| and the like, are token + variables and associated with the script +\bitem ^|\pictures| has been implemented in a straightforward way, + because it doesn't need processing on the fly. +\smallbreak +\newpage +\bluesubsubhead Your summary of markup tags for transparencies + +\beginverbatim +!bf +Token vars!tt +\address\author\crowner%Default, already personalized +\every... %See default blue.tex +\footline +\headline +\headtitle +\identification +\pagenumber +\posthead +\postsubhead +\postsubsubhead +\prehead +\presubhead +\presubsubhead +\subheadtitle +\subsubheadtitle +\subtitle +\this...%See blue.tex +\title + +!bf +Control sequences with root name!tt +center %default +contents +head +pictures +script + +!bf +Auxiliaries!tt +\continue +\nxttrs + +!bf +Lower level!tt +\bitem +\beginverbatim +<escape char>endverbatim +!endverbatim +For inner markup the macros from plain +and those from \bluetex{} can be used. +Load what you need before \cs{transparencies} because the latter turns +\cs{obeylines} on. +\displaycenterline{Do remember the line-by-line character of the script} +\endinput diff --git a/info/laan/pwt/pwt.his b/info/laan/pwt/pwt.his new file mode 100644 index 0000000000..2ef1b7ff88 --- /dev/null +++ b/info/laan/pwt/pwt.his @@ -0,0 +1,84 @@ +\input blue.tex +\report +\bluechapter History of Changes + +\beginsummary +An account of the history of BLUe's format has been provided. +Milestones in the development have been listed. +\endsummary + +In {\oldstyle1994} BLUe's format was introduced at CyrTUG and Euro\TeX. +The article was published in MAPS {\oldstyle94}.{\oldstyle1}, +and also in the Euro\TeX{} proceedings (abbreviated). +The fall article and a pre-release of \bluetex{} +have been sent to the world, i.e., to the CTAN. +At that time only a default format and the transparencies format +were available. It has been extended by report and letter format. +The design of BLUe's format accounted for personalization, open-endedness, +minimal markup and a discipline to cope with progress. + +The major extension of {\oldstyle 1995} was this user's guide, +which entailed the \cs{report} format, and the inclusion of Knuth's +letter and concert formats, \TB{} Appendix~E. +Both were finished in January {\oldstyle1995}. +Important was how to cope with the multitude of +formats, macros and tools out there. +The files have been organized in databases. +Not only a database for references, pictures, and addresses, no, +also for tools and formats. +What is needed will be loaded selectively from these, behind the scenes, +and\dots\thinspace by \TeX. Neat! + +\newpage + +\def\btablecaption{}\def\footer{} +$$\def\first{Date} +\def\header{\hfil Change\hfil\lower1.25ex\null}%To put on 1/3th +\nonframed\fll +%Beware of the name clash \cs: control sequence and column separator. +% +\def\template{\colsepsurround ##\hfil\raise4ex\null&\lft##\rgt& + \lft\vtop\bgroup\noindent\hsize.75\hsize + \baselineskip12pt\openup2pt + \obeylines##\egroup\rgt\cr} +\thisbtable{\let\tstrut\relax\def\par{\strut\endgraf}} +% +%Data to be extended. Remember that \obeylines is on. +\def\rowstblst{{Future} + {Spring {\oldstyle1996}} + {Summer {\oldstyle1995}} + {Spring {\oldstyle1995}} + {Dec {\oldstyle1994}} +} +\beginbtable +Updates to come +%Another line +%The 3th jolly line +\rs +BLUe-2-\LaTeX{} Convertor Assistant emerged +\rs +PASCAL tool improved, one-pass ToC added +Graphics has been extended by turtle graphics, fractals, and smileys +\rs %No \cs{name} possible; name clash with column separator + %Next are lines within one entry. Natural input. +page size for index flexible; plnindex can be used loose from blue.tex +|\nxttrs| |\continue| consistent with |\newpage| (|\vfill\eject|) +\rs +list element tag in address.dat, lit.dat and pic.dat changed into |\lst| +|\oldstyle| is introduced for the page numbers in the index etc. +Font handling for transparencies has been cleaned up +Addresses are stored in address.dat to cooperate with |\letter| +Tools are stored in the database tools.dat +Formats are stored in a database fmt.dat +\bluetex{} has been extended to BLUe's format system +|\report| and |\letter| have been designed +|\nitem| uses |\prenum| and |\postnum| for embellishments +|\create| in math cross-refs stores also |\prenum| and |\postnum| +|\rowstblst|'s last argument is no longer an exception +Partitioned matrix markup is short and elegant via |\btable| +Space-saving variant of continued fraction looks much better now +D\"urer's magic square has a better |\dotboxit|. +Bridge form details have been improved. +\endbtable +$$ +\endinput
\ No newline at end of file diff --git a/info/laan/pwt/pwt.ind b/info/laan/pwt/pwt.ind new file mode 100644 index 0000000000..85508d814d --- /dev/null +++ b/info/laan/pwt/pwt.ind @@ -0,0 +1,506 @@ +\input blue.tex \loadindexmacros \report + + \bluepictures\indmodelpic + +\bluechapter Creating an Index + +\beginsummary +The creation of a modest index within +a one-pass \TeX{} job has been treated. +In general a proof run and a final run are needed. +\endsummary + +Making an index is an art. The fundamental problem is +\bluedisplaycenterline What to include in an index? + +Computer-assisted indexing is not simple either. +Issues are +\bitem the markup of keywords or phrases +\bitem to associate page numbers +\bitem to sort and compress raw Index Reminders (^{IR}s), and +\bitem to typeset the result. +\smallbreak +My approach is to create proof indexes\Dash also called mini-indexes\Dash +for each chapter and +learn from those what should be included in the total index. +I perceived this as very pleasant in practice. +Even if you prefer \cs{makeindex} for the real index, this +processing on the fly of a chapter index can be of great help.\ftn{It is said + that the automatic generation of an index is a feature of the Literate Programming tools. + For LP with \TeX{} as such, as for example Gurari's Pro\TeX, this on-the-fly indexing + within \TeX{} can be used.} + +\bluehead Use + +I'll show how to mark up Knuth's four types of IRs, +how to mark up accents, +how to mark up font switching, and +how to mark up spaces as part of the IR. + +\blueexample Markup, commands and resulting index + +The right column has been obtained via +\bitem ^|\loadindexmacros|, at the beginning of the script +\bitem ^|\sortindex|, at the place of indexing, and +\bitem ^|\pasteupindex|, for the pasteup of + the index. +\smallbreak + \thisverbatim{\catcode`\|=12 + \catcode`!=12 \unmc + \catcode`\*=0 } +\begindemo +Types of IR + 0 ^{return} + 1 ^|verbatim| + 2 ^|\controlsequence| + 3 ^\<syntactic quantity> +Accents ^{\'el\`eve!}, +font changing ^{\bf bold} +and spaces ^{control\ symbol} +Control sequences + ^{\TeX, and \AmSTeX} + ^{Lamport and \LaTeX} +brackets ^{\tt< \rm and \tt>} +\newpage ^{return} +\newpage ^{return}%on purpose +\sortindex\pasteupindex\bye +*yields\obeylines +\quad {\tt {}< \rm {}and \tt {}>}{} {\oldstyle1} +\quad {\bf {}bold}{} {\oldstyle1} +\quad {control\ symbol}{} {\oldstyle1} +\quad {\tt \char 92\hbox {controlsequence}}{} {\oldstyle1} +\quad {\'el\`eve!}{} {\oldstyle1} +\quad {Lamport and \LaTeX{}} {\oldstyle1} +\quad {\TeX, and \AmSTeX{}} {\oldstyle1} +\quad {return}{} {\oldstyle1}--{\oldstyle3} +\quad $\langle \hbox {syntactic\ + quantity}\rangle ${} {\oldstyle1} +\quad {\tt verbatim}{} {\oldstyle1} +\enddemo +The representation of page numbers as a range comes out automatically. + +\exercise What makes a good index? Of course this is a million-dollar + question. Let us concentrate on the number of entries and on the + number of page numbers per entry. Which of the two extremes + sketched below is the better one in your opinion? + One with many entries pointing to issues spread throughout the book\Dash + like \TB{} ;-))), and pushing the limits just for the imagination, + an index with pointers to related work on the internet, accessible + by just clicking the mouse\Dash + or one with few page numbers per entry\ftn{Courtesy Erik Frambach.}? +\answer As usual it all depends on your application. End of answer. + But\Dash there is always a but\Dash the complaint I heard + most about \TB{} was that the information is spread all over, + and that it is hard to find what you are looking for. + Therefore I consider a few page numbers per entry beneficial. + (Let us forget about the intrinsic complexity of the + subject, certainly at the time.) + BLUe's format supports scrutinizing parts of an index, + because it is so easy to generate an index per chapter on the fly. + It is hardly not more difficult than generating a table of contents. + An index per chapter can be scrutinized more easily, and + redundancies removed. + That the index provides a mechanism + to link things over chapters is a good thing, however. + Don't misunderstand me. + But don't overuse it, IMHO, with all respect. Remember DeVinne's + adage `The last thing to learn is simplicity.' + +%end answer + +\bluehead Markup of Index Reminders + +IR-s are at the heart of the process. ^^{IR,\ markup} +Knuth distinguished {\oldstyle4} types to facilitate the outside processing. +I'll adopt his IRs syntax and types. + +\bluesubhead Syntax + +Knuth's IRs obey the following syntax. ^^{IR,\ syntax} +\begincenterverbatim +<word(s)>!]!!<digit>!]<page number>. +!endcenterverbatim +The digits {\oldstyle0}, {\oldstyle1}, {\oldstyle2}, or {\oldstyle3} +denote the types: +words, +verbatim words, +control sequences, and +syntactic quantities. +A user does not have to bother about the digits nor about the +page numbers. +Knuth has adopted the accompanying conventions for +the word(s) of IRs.\ftn{See \TB{} {\oldstyle424}, for the IR types, + and what is typeset in the result. + In \cs{vref} the markup is inserted as replacement + text of \cs{next}. What is set in the index is governed by the macros + which are included after \cs{begindoublecolumns} in the \TeX book script.} +$$\vbox{\offinterlineskip\def\tstrut{\vrule height2.5ex depth.5ex width0pt} +\halign{\tstrut#\hfill\quad\vrule\quad&#\hfill\quad\vrule\quad&#\hfill\cr +Mark up&Typeset in copy$^*$&IR \cr +\noalign{\hrule} +|^{...}| &\dots &|... !!0 |$\langle page\, no\rangle$.\cr +|^!vrt...!vrt| &|!vrt...!vrt|& + |... !!1 |$\langle page\, no\rangle$.\cr +|^!vrt\...!vrt| &|!vrt\...!vrt| & + |... !!2 |$\langle page\, no\rangle$.\cr +|^\<...>|&$\langle\dots\rangle^{**}$& + |... !!3 |$\langle page\, no\rangle$.\cr +\noalign{\vskip.5ex\hrule width1cm\relax\vskip1ex} +\multispan3{\quad$^*\,$\vrt\dots\vrt\ denotes manmac's, TUGboat's,\dots + verbatim \hfil}\cr +\multispan3{\quad$^{**}\,$in \cs{rm} \hfil}\cr +}}$$ +For the user the word(s) is (are) important. +The markup allowed for the IRs and the result in the copy are +given in the accompanying table. + +\bluesubhead Markup + +The markup for IRs is near to natural. +Precede the entry by a circumflex, or a double one in case of +a silent\ftn{Silent IRs mean that these will appear + only in the index, not on the page.} +index entry. + +\blueexample IR markup + +\thisverbatim{\catcode`\|=12 \catcode`\^=12 + \catcode`!=12 \catcode`*=0 \unmc} +\beginverbatim +^{\'el\`eve!}^|verbatim text|^|\controlsequence|^\<a metalinguistic variable> +^^\<a metalinguistic variable> %for silent ones, double the ^ +{\sl^{ligatures}} |'$|^|\,||$''|%from the TeX book script +^^{markup commands, see control sequences} +^{Lamport and \LaTeX} %text and control sequences with sort keys +*endverbatim + +\thissubsubhead{\runintrue} +\bluesubsubhead Spaces \par are difficult as always. ^^{IR\ and\ spaces} +In the IR they separate parts of the IR and are used +in the word part. + +\bitem Just typing a space has as an effect that + it will be neglected during sorting +\bitem The markup `\cs{\char32}', a control space, + will yield a space subject to sorting, according to + the ordering table +\bitem \cs{space} as markup will be neglected during sorting. + This token is default member of + the set of control sequences to be ignored. + It will be set in the index as \cs{\char32}. +\smallbreak + +\exercise What to do when part of a title should reappear in the index? +\answer The naive approach is to enclose that part by braces and precede + it by a circumflex. However, that goes wrong because a title + is stored and reused in many places. So copy the words and + mark them as a silent IR. + +\blueexample Spaces + +\thisverbatim{\catcode`\|=12 } +\begindemo +^{\space}%an ignored cs +^{a\ a} %control space +^{aa} +^{a\ b} +^{a \TeX} +^{a\ \bf a} +^{\TeX book} +^{xyz beta}%space neglected in + %sorting +^{xyza} +^|\space| +\sortindex\pasteupindex\bye +!yields +\noindent Sorted result in file index.srt +\thisverbatim{\catcode`\!=12 + \catcode`\;=0 } +\beginverbatim +\space {} !0 1. +a\ \bf a{} !0 1. +a\ a{} !0 1. +a\ b{} !0 1. +aa{} !0 1. +a \TeX {} !0 1. +space{} !2 1. +\TeX book{} !0 1. +xyza{} !0 1. +xyz beta{} !0 1. +;endverbatim +\enddemo +Explanation. \cs{space} belongs to the set of control sequences +to be ignored, ^^{ignored\ control\ sequences} +ICSs for short. +This means that it is skipped with respect to sorting, +except when it occurs as the last token of the word part. +In that case they are ordered as a space, +i.e., according to the lowest value. +This explains the position of `\cs{space}.' + +`\cs{TeX},' and `\cs{TeX} book,' are subject to the default sorting keys. + +`xyza' precedes `xyz beta,' because the space is silent. +When word ordering is preferred a \cs{\char32}, a control space, must +be included. + +\bluehead Special tokens + +Tokens are either neglected +or replaced by another sequence while sorting. +\bluetex{} provides two sets of tokens to be ignored while sorting: +^|\conseqs| and ^|\consyms|.\ftn{There are two sets because of + the handling of the space after the token in the result.} +Replacing a control sequence by another sequence +is called associating a sorting key to the +control sequence. + +Active symbols can't be part of the IR, for the moment. + +\bluesubhead Tokens to be ignored + +In practice I needed things like \cs{tt} +as part of the IR, which must be neglected while sorting.\ftn{The reason is + that {\tt <, and >} are used, and printed wrongly.} +I decided to ignore those tokens while sorting and to include +the tokens in the final index.elm as such. +Default \bluetex{} knows about the following sets of tokens to be ignored. +\begincenterverbatim +\conseqs{\c\space\bf\it\rm\tt\sub\relax} +\consyms{\`\'\"\^\~} +!endcenterverbatim + +\bluesubhead Sorting keys + +In order to extend a set, use the macro \cs{add}. + +\blueexample Use of sorting keys + +Default \bluetex{} provides the following +sorting keys. +\begincenterverbatim +\srtkeypairs{\AmSTeX{amstex} + \LAMSTeX{lamstex} + \LaTeX{latex} + \TeX{tex} + \PS{PostScript}} +!endcenterverbatim +Suppose that we have \cs{fourtex} and that we like this to be sorted +as `4tex.' +This can be done by extending the set of ^|\srtkeypairs|, ^^|\add| +as follows. +\thisverbatim{\unmc} +\begindemo +\add\fourtex{4tex}to\srtkeypairs +Copy with ^{IR \fourtex} +^{IR 1} +^{IR 5} +^{IR a} +% +\sortindex %with 4tex for \fourtex +\pasteupindex%Set `IR \fourtex{} + %<pagenumbers>' +\bye +!yields +then the file index.srt will contain the IRs +\thisverbatim{\catcode`\!=12 + \catcode`\;=0 } +\beginverbatim +IR 1 !0 <pageno>. +IR \fourtex{} !0 <pageno>. +IR 5 !0 <pageno>. +IR a !0 <pageno>. +;endverbatim +\enddemo +with \cs{fourtex} sorted on 4tex. + +\exercise What to do when `to' is part of the sorting key? +\answer Add an extra level of braces. + + +\bluehead Ordering + +A fundamental issue with indexes is the ordering. ^^{ordering} +The ^{ASCII} table is not suited because lowercase and uppercase +letters differ by 32. I decided to rank these as equal, more +precisely to assign the lowercase ASCII values to both. I prefer +from the accompanying table the {\oldstyle1}$^{st}$ column to the +{\oldstyle2}$^{nd}$ one. + +Moreover, accented letters are not part of ASCII. How should we +order for example e, \'e, \`e, \^e, \"e? +I decided to rank accented letters equal to those without an accent, +because I prefer from the accompanying table +the {\oldstyle3}$^{rd}$ column to the {\oldstyle4}$^{th}$ one. + +I know that non-letters precede letters, but what about their relative +ordering? I decided to stay as close as possible to the ASCII ordering. + +Then there is the problem of digits. In IRs they come as part of the +word(s) and as page numbers. For the latter I used the numerical ordering. +For the former I used the alphabetical ordering.\ftn{I could have applied + a look ahead mechanism and use numerical ordering throughout. + Maybe another time.} + +Furthermore, a user can select +the so-called ^{word\ ordering},\ftn{This means that a space precedes + all letters. A space as such is neglected in the ordering.} +by \cs{\char32}, \TeX nically a control space, as markup for a space. +Personally, I like from the accompanying table +the {\oldstyle5}$^{th}$ column better than the {\oldstyle6}$^{th}$. +\def\btablecaption{} +\def\footer{} +\nonframed +\def\rowstblst{} +$$\def\header{lower vs.\ upper case\cs + accents vs.\ unaccented\cs + word ordering} +\vruled\btable{\vtop{\halign{&\tstrut\quad#\hfil\cr +el & el \cr +El\`eve & em \cr +em & El\`eve \cr}}\cs +\vtop{\halign{&\tstrut\quad#\hfil\cr +el & el \cr +\hbox{\'el\`eve} & em \cr +em & \hbox{\'el\`eve} \cr}} +\cs\vtop{\halign{&\tstrut\quad#\hfil\cr +sea lion & seal \cr +seal & sea lion\cr}} +}%end \btable +$$ + +\bluehead Typesetting the index + +The specifications for typesetting a \bluetex{} index are +\bitem represent the four IR types the same as in the \TeX book +\bitem set in two-columns, balanced, possibly preceded + by one-column copy +\bitem set subsidiary entries analogous to the \TeX book +\bitem indent continuation lines by {\oldstyle2}em +\bitem indent subsidiary entries by {\oldstyle1}em +%\bitem underline page numbers which represent the definition or +% the main source of information +%\bitem represent a page number in italics when that page contains +% an instructive example of the concept in question. +\smallbreak +Users can edit index.elm\Dash read: add markup\Dash and +provide the necessary macros in for example \cs{preindex}. +In short follow Knuth. To please Frans Goddijn I introduced the tag +^|\numberstyle|, by default equal to \cs{oldstyle}. + +\exercise And what about subentries? +\answer My approach is to consider subentries as a typesetting problem in the sense + that the full entries are specified and only when sorted and typeset redundant first + parts can be suppressed, if one considers this better. This is similar to how + BLUe's format system typesets references, inspired by the \AMS. + For the moment I did not implement subentries handling, because as of {\oldstyle1995} + I consider it of low priority. + +\bluehead Customization + +A user might wish to interfere in places +\bitem to include other tokens to be ignored while sorting +\bitem to supply an ordering of his/her own +\bitem to enrich the sorted and compressed file index.elm. +\smallbreak + +\bluesubhead Adding tokens + +What are reasonable requirements to impose upon the handling of +markup control sequences (cs for short)? In my opinion +\bitem the cs must be defined +\bitem ^|\makexref| writes the cs unexpanded +\bitem ordering? unknown, and therefore must be supplied +\bitem ^|\setupnxtokens| guards that the cs-s are written %, unexpanded, + to ^{index.srt} and ^{index.elm}. +\smallbreak +As a consequence I decided to neglect the `in between' +control sequences while sorting. +For those who favour a one-pass job, I have provided the following, +though.\ftn{It is simpler to add those control sequences to + index.elm.} + +The extension of a set of tokens can be done via ^^|\add| +\beginverbatim +\add\hfil to\conseqs or \add\`to\consyms or \add\hfil{hfil}to\srtkeypairs +%with auxiliary \def\add#1to#2{...} +!endverbatim +Each element from \cs{conseqs} is redefined in such a way +that the control sequence token is written to the file +with a space appended.\ftn{\cs{noexpand} is used instead of \cs{string}.} + +\bluesubhead Modifying ordering + +A general way is to `copy' the ordering table +and to modify it.\ftn{My \cs{fifo} is just a shortcut, which also + prevents typos in assigning the ASCII values. For \cs{fifo}, see + my `FIFO and LIFO sing the BLUes.'} + +And what about a macro to add to the table? +This can be done easily, and superficially looks convenient +for an innocent user. +At the moment I don't trust the macros to be worthwhile +for an innocent user, unless a very modest index has to be made. +And this completes the circle: different ordering is not wanted, I guess. + +\bluesubhead The process and files involved + +Like in manmac, \bluetex{} stores the raw IRs in the file index. +^^{IR,\ processes\ and\ files} +The file index^^{index,\ file}\ftn{Default index is the value of + the toks variable ^|\irfile|, which is used in \cs{sortindex}.} +is read and stored in an array for internal sorting. +After sorting, the number of entries is +reduced,\ftn{Those which differ by page + number are collected in one entry.} +and the result is written to the file ^{index.srt}. +Then, index.srt is transformed into the file +index.elm.\ftn{Default ^{index.elm} is the value of the toks variable + ^|\indexfile|, which is used in |\pasteupindex|. + The transformation abandons the IR syntax. + The part which specifies the kind of IR + is deleted and the word part marked up + accordingly.} +The result is typeset via ^|\pasteupindex|. +Schematically it comes down to the following. +\bigskip +$$\vbox{\hsize.5\hsize% +\indmodelpic +}$$ +^|\loadindexmacros| loads the index and sorting macros, and performs +initializations. It is safeguarded against double loading.\ftn{I introduced + this because I start each chapter with \cs{loadindexmacros}, + independent from whether it is run on its own or as part of the total.} + + +\bluesubhead Enriching the index + +This use is necessary when for example ^^{index,\ enrich} +\bitem control sequences have to be typeset +\bitem special symbols are needed, or +\bitem cross-references within the index are required. +\smallbreak +The best way is to start from the ^{index.elm} file. + +\bluesubhead Typesetting the enriched file + +When the default name is used\Dash index.elm\Dash +just say \cs{pasteupindex}. +For another file name assign this name to the toks +variable \cs{indexfile}, +prior to the invocation of \cs{pasteupindex}. + +\bluehead Extras + +Ubdoubtedly people favour their own subset of \TeX, or more likely \LaTeX. +There is good news. You don't have to use BLUe's format system. I gathered the sorting +and indexing stuff as an independent self-contained set in the file plainindex.tpl. + +The bad news is that up till now I did not do much about preventing name clashes. + +\bluesubhead \TeX nical details + +The details with respect to indexing have been treated in `BLUe's Indexes,' and +the sorting aspects have been treated in `Sorting in BLUe,' both available from the CTAN. +\endinput +\bye
\ No newline at end of file diff --git a/info/laan/pwt/pwt.int b/info/laan/pwt/pwt.int new file mode 100644 index 0000000000..f242bad747 --- /dev/null +++ b/info/laan/pwt/pwt.int @@ -0,0 +1,707 @@ +\input blue.tex +\loadindexmacros \report \vfuzz1000pt +\bluepictures\bluemodelpic + +\bluechapter Introduction + +\pageno1 +\beginsummary +A plea is made for simplicity after having made the right a priori choices. +The aim is to provide a user's guide such that \bluetex{} can be used +with confidence. +\TeX{} and its benefits are explained in a nutshell. +The contents of each chapter is summarized and +the audience addressed. +The model of BLUe's format is given. +The concept, syntax and template of a BLUe script are touched upon. +At the end a list of notations and definitions has been included. +\endsummary + +Scientific tradition has it that simplicity can be attained +once the right a priori choices have been made. + +In relation to using \TeX{} this means to get your priorities right, +to keep in mind that it is all about what you have to say, +to what you developed and wish to communicate. + +Next to the a priori choices, selection is important. +The `handful' of tags needed in practice most of +the time, at least by me, will be treated. +\TeX{} is just one of the tools needed for computer-assisted information +exchange, and therefore there is no use in (sub)optimizing. +\displaycenterline{Understand BLUe's format sufficiently and + use \TeX{} with confidence!} +The spirit of this work on using \TeX{} is to guide a user +towards preparing documents with as little knowledge of +the nitty-gritty of \TeX{} as possible. +A tool should not become part of the problem.\ftn{My adage is + {\oldstyle80}\% of the quality with {\oldstyle20}\% of the energy. + Relevancy prevailed highbrowness. + Common scripts marked up by sound, non-esoteric \TeX niques.} +To quote {\TB} `\dots If you are preparing a simple manuscript, you won't +need to learn much about {\TeX} at all; on the other hand \dots' + +\TeX\Dash designed in the late seventies and frozen in the early nineties\Dash +is a tool for formatting documents by computer. +Together with its twin sister \MF{} it has revolutionized +computer-assisted typesetting. +The benefits of ^{\TeX{}} are +\bitem quality +\bitem availability on most if not all computers (in the Public Domain, + turn-key) +\bitem independence from input and ouput devices +\bitem open-endedness, to cooperate with EP tools, and + last but not least +\bitem stability. +\smallbreak +Because of this, an ASCII script with \TeX{} markup is portable +in place and time. + +I'll show that \TeX{} is suited for structural markup. This in +contrast with the widespread belief that this is the virtue of +\LaTeX. Not true, IMHO, with all respect. \LaTeX{} provided a +user's guide along with its macros and +emphasized the concept of separate style files. + +From the ample \TeX{} commands I'll select BLUe's subset +for practical day-to-day use. +To format an article\Dash a set of transparencies, and some more\Dash +with \bluetex, that is what it is all about. +These representations of a script are common. +Write down the results, and support the aftertalks by transparencies. + +The `^{BLUe's\ format}' section defines the structure of a ^{BLUe\ script}, and +provides a template, to be filled in. +How to mark up copy in detail, is subject of the chapters +`Text,' +`Mathematics,' +`Tables,' and +`Pictures.' +How to add a list of references and how to make citations +to that list is treated in the chapter `References.' +The chapter `Index,' is about how to create and include an index. +The chapter `Customization' is about modifying \bluetex. +Each chapter contains exercises. +As Appendices I included +`Solution to the Exercises,' +`Formats,' +`Tools,' +`BLUe's, BLUes, and Paradigms,' +`List of Examples,\ftn{Although this work is not a cookbook, + it's handy to have a quick access to the examples, because + it has all to do with using, not in the least by example.}' +`Table of Tags,' +`History of Changes,' +`Obsolete stuff,' +`Index,' and +`Table of Contents.' +A similar approach as in `Publiceren met \LaTeX' has been on my mind. +Ideally, the material dealt with should have been the same, +with only the \LaTeX{} tool exchanged for \TeX. +The underlying idea is that the functionalities required, +and the essence of the exercises, should be independent +of the tool used. +The same setup and exercises should allow a treatise on +you-name-it word processor.\ftn{The main difference with + the early work on \LaTeX{} is that now + the markup of a BLUe script is the issue.} + +Floating aspects have been used in a special sense. +Information is set in a box and inserted via a pasteup control sequence +at your place of choice. +Of course the usual inserts of plain for floats, \cs{topinsert}, +\cs{midsert} closed by \cs{endinsert}, are still there to be used + +I did not include a chapter on basic notions in publishing or book +production, because that information can be found elsewhere, +and would otherwise unduly increase the size of this work. +I did not include a survey of +`\TeX{} flavours and worlds' either, for similar reasons +although it comes closer to the subject. +For \TeX{} flavours et cetera, consult the archives of the worldwide +electronic networks to find for example +`What is \TeX{} and \MF{} all about?' + +Nothing of the world of \PS{} coupled to \TeX{} has been included, +jeopardizing \PS's scalability of fonts, +its rotation capabilities, +and its possibilities with colours. +I take the fonts which come with \TeX{} for granted, +assuming English as the lingua franca +for scientific communication. +The latter implies that (multi-)lingual issues have not +been touched upon either. + +Font switching and {font\ selection} has been treated poorly, to put it mildly. +For the moment I stay with Knuth and copied his size-switching macros. +BLUe's format contains the size-switching macros +\cs{Large}, $\approx${\oldstyle17}pt, used for chapter headings, +\cs{large}, $\approx${\oldstyle14}.{\oldstyle5}pt, +used for transparencies, +and \cs{small}, i.e., {\oldstyle8}pt, used for footnotes. +Next to these \cs{tenpoint}, \cs{ninepoint}, and +\cs{eightpoint} have been inherited from manmac. +However, the abstraction of mapping the linear space of fonts onto a logical +{\oldstyle5} dimensional space, which is the basic idea in NFFS, +is nice and might become very useful some day. + +Because of these a priori choices this guide remained small +and will hopefully be perceived as simple. + +The audience in mind consists of scientific workers, especially the +growing breed of self-publishing authors, with substantially complex copy, +especially complex math and tables. +Authors who concentrate on the contents +welcome a reasonable print-out, +exchange their works via electronic networks, +submit \AllTeX{} scripts to publishers, +like to understand their tool, and +last but not least aim to use +it confidently with minimal markup.\ftn{\TeX{} markup is extremely + tolerant. Many ways are possible, opening the door to quick-and-dirty + markup. A discipline is needed.} +In netland one can't rely much on publishers for the moment, +one is on one's own. +There is even the danger of becoming a \TeX hacker after some years, +because \TeX{} will serve your lifetime. + +For running a BLUe script with text not much \TeX{} knowledge is required. +When details of math, tables, and graphics come into play, +familiarity with David Salomon's courseware\Dash MAPS special {\oldstyle1992}, +also available on NTG's CD-ROM\Dash is assumed.\ftn{Advanced \TeX, {\oldstyle1995}, + Springer-Verlag, ISBN {\oldstyle0}-{\oldstyle387}-{\oldstyle94556}-{\oldstyle3}.} + +\bluehead The key to understanding Knuth's markup + +^^{Knuth's\ markup} +It did take me quite a while to understand Knuth's markup, \winksmiley. +Biased by my programming experience, and +influenced by SGML and \dots\thinspace\LaTeX, I was on the wrong track. +My mind was full of block structures with rigorous opening and closing tags, +and parameterization via arguments of procedures. +I was blocked for the simple approach of {\sl text replacement}, and +had to unlearn much, in order to become innocent again, +to open my mind for Knuth's approach. +\begincenter +ASCII text with visual layout +and +minimal markup tags added +\endcenter +The royal road to understanding and appreciating Knuth's markup is starting +from ASCII text, what you would write by hand. +The next step is inserting markup tags, as few as possible, +that is, enriching the ASCII file with minimal markup.\ftn{It is + quite another task to implement those minimal tags, however.} + +An example? Undo the examples in the Example Formats chapter of \TB{} +of the markup, and insert your own markup, and you will know what I'm +talking about. +I hope you will come to the same conclusion as I did +\displaycenterline{ Knuth's markup is unsurpassed!} +I'll come back to the matter in the chapter `Text' and in the Appendix +`Formats,' especially with the letter format. + +\bluehead BLUe's format + +The format is a personalized system to format compuscripts. +It is a compatible extension of plain \TeX{} and +organized as a `kernel + modules,' +similar to the setup of FORTRANxx. +It is designed to be supportive, to suit your needs. +You are Ben Lee User. +It is not imposing.\ftn{I know of the defensive attitude of publishers. + They welcome the benefits of imposing formats to prevent + the use of macros which hinder production. + There is much truth in there, given the reality of the complex\Dash + or better, the unusual\Dash \TeX{} markup language. + However, there is no use in protecting an author + against himself. + Simple supporting tools should make the imposing attitude superfluous.} + +The concept of a BLUe script is at the heart. +\bluetex{} allows one or more scripts to be processed\ftn{Either in sequence + or nested. The former is handy when several contributions have to be run + in one job, for a journal for example. + The latter has been used in this script to switch temporarily + to \cs{letter}, casu quo \cs{transparencies}.} +in one run, even non-BLUe scripts. +As an example of the latter +\displaycenterline{Thank you. \cs{bye}} +runs with \bluetex. +This tolerance is handy while proofing parts. + +\blueexample BLUe script + +^^{BLUe\ script,\ template} +Generally, I use a template, an empty script as a fill-in form, +with the main markup tags already there.\ftn{The order does not matter + much for the elements before \cs{beginscript}. +% They can be supplied in any order. + Because of the short markup tags + the feature to let the computer prompt the |\end<tag>|, + once the |\begin<tag>| has been typed in, + is not so relevant. + The \cs{contents} can be used to provide a wired-in ToC, + to facilitate browsing of the script, + next to the dynamically generated one.} +\thisverbatim{\catcode`\~=14 + \catcode`\_=8 } +\begincenterverbatim +%Template BLUe script---outer level markup + %Preliminary part, with + %elements in arbitrary order +\issue{MAPS 94.2} +\title{BLUe's Format} +\subtitle{The best of both worlds} +\keywords{...} +\abstract{...} +\contents{Introduction + \se Why? %\se acronym for subelement + ... + Acknowledgements, Conclusion, References} +\references{~ +\!math!langle!,name_1!rangle!dots!endmath~ +\!math!langle!,name_n!rangle!endmath} +\pictures{~ +\!math!langle!,name_1!rangle!,pic!dots!endmath~ +\!math!langle!,name_n!rangle!,pic!endmath} +\acknowledgements{...} +\beginscript %Marked up copy proper comes next +\head{Introduction} + %Various parts with inner markup +... + %Ended by the following back matter +\pasteupacknowledgements +\pasteupreferences +\endscript +!endcenterverbatim +Once used to the template, the outer markup is a trifle. +Of course, in order to process the script it should be preceded by +\cs{input} {\tt \bluetex}. +On my Mac Classic II \bluetex{} is a format. +One could even think of a bluetex command similar to \LaTeX. +\exercise How to override the defaults for \cs{author} and the like? +\answer To override the defaults assign values to the token variables +\cs{author}, \cs{address}, \cs{netaddress}, and \cs{issue}. + +\exercise How can we process more scripts in one run? +\answer Provide |\everyscript{\notlastscript}| and precede the last + script by |\thisscript| |{| \cs{lastscript} |}|. This holds for scripts in + sequence. For nested scripts see this script file for + the examples of a letter and + a few transparencies run within this script. + +Default the look-and-feel in print resembles much \TUB's (two-column) layout. + +\thissubhead{\runintrue} +\bluesubhead The syntax + +^^{BLUe\ script,\ syntax}for a BLUe script reads +as follows.\ftn{I used the same + Backus-Naur formalism for the syntax diagrams, + as adopted by Knuth and explained in \TB{} {\oldstyle268}, + {\oldstyle269}.} + +\beginsyntax +<BLUe script>\is|\input|\thinspace \bluetex\thinspace<language><scripts> +<language>\is<default>\alt|\english|\alt|\russian|\ftn{In progress as % + spinoff of the translation effort. Default is English.}% + \alt|\<yourlanguage>| +<scripts>\is<script>\alt<script><scripts> +<script>\is<preliminary><scriptoptions>|\beginscript|<sections>% + <indexing>|\endscript| +\endsyntax +with refinements +\beginsyntax +<preliminary>\is<index><format>|\title|<infopart> +<index>\is<empty>\alt|\loadindexmacros| +<format>\is<empty>\alt|\concert|\alt|\letter|% + \alt|\report|\alt|\transparencies|\alt|\<yourformat>| +<infopart>\is<empty>\alt<infoelement><infopart> +<infoelement>\is|\subtitle|\alt|\issue|\alt|\input|\alt<TeXcode> + \alt|\author|\alt|\address|\alt|\netaddress|\ftn{Defaults.} + \alt|\keywords|\alt|\abstract|\alt|\contents|\alt|\references|\alt|\pictures| + \alt|\acknowledgements| +<scriptoptions>\is<empty>\alt|\everyscript|\alt|\thisscript|% + \alt|\everyscript||\thisscript| +\endsyntax +The sections consist of the tree of head +structures with IM copy, inner marked up copy proper. +\beginsyntax +<sections>\is<empty>\alt<section><sections>\ftn{To be repeated for subsections and subsubsections.} +<section>\is<head><paragraphs> +<head>\is|\head|\alt|\bluehead|\ftn{A minimal markup alias % + as a tribute to manmac.} +<paragraphs>\is<empty>\alt<paragraph><paragraphs> +<paragraph>\is<subsections>\alt<IM copy> +<indexing>\is<empty>\alt|\sortindex||\pasteupindex| +\endsyntax + +\bluesubhead Variants + +By a control sequence\Dash called an attribute in the SGML world\Dash +the format used can be changed, resulting in a different look-and-feel +in print. +For example, via \cs{onecolumn} within the default format. +This is meant for a script in total. +However, two-column and one-column scripts can be processed +in one run. + +The control sequence \cs{transparencies} changes the result +into a representation suited for copying on transparencies. +Adaptation of the script is mainly about deleting. + +Especially for PWT I designed the report format. +It is essentially one-column, and a mod on top of the default. +The control sequence \cs{report} yields the report layout. +The path `From-report-to-transparencies' +comes down to stripping off the superfluous. +See the Appendix `Formats' for details. + +I also included Knuth's letter format, \cs{letter},\ftn{Well, I updated + Knuth's approach a little, if I'm allowed to say so. Important is to + provide for mail merge and in general to let the format cooperate with + an address database. And of course I simplified the macros a little. + No different modes of text processing.} +and concert format, \cs{concert}. + +\bluesubhead Extras + +The Appendix `Tools' is mainly about the lower level extras. +It provides a method to organize all your macros. +It is not part of \bluetex, but can cooperate smoothly without overhead, +respecting the `little user,' i.e., the user with modest demands. + +It is also important to think of a garbage bin. Somewhere to keep +your obsolete stuff, macros or formats, in order that your scripts +can still be formatted without change in future. +For that purpose I introduced the obsolete.dat database. + +Finally, I coupled my address.dat database, that is letters can +find addresses in that database, similar to a bibliography +which will take the references from a bibliography database. + + +\bluehead The model + +^^{BLUe's\ format\ model} +BLUe's format is a personalized formatting system. It's yours! +It knows about your context. +It is based on ^{manmac}, ^{gkppic}, and the use of databases. +$$\qquad\qquad\bluemodelpic$$ +What does the model say? +One way of looking at it is to think of inner and outer worlds.\ftn{Knuth + had the outer-inner duality on his mind already, as can be deduced + from his \cs{outer} \cs{def}-s.} +The extras part reflects the outer world in general. +Your publisher and his tools, casu quo formats, and your colleagues +who provide macros for general use. +The BLUe's format part\Dash your inner world\Dash +divides the markup tags into two clusters, +supported by databases.\ftn{Database in this context means essentially + a multi-file file. Each tool or macro set is part of a file. + I prefer to have separate clusters for + formats, tools, references + pictures and addresses. + The global structure has been simplified. + What is needed will be loaded selectively. + The best of both worlds.} +These databases not only support the handling of +the usual collection of references. +It also provides the mechanism for elegantly storing pictures. +Even newer is using the database approach +to manipulate formats and tools. +We don't need all those separate files any longer. +This approach can also clean up the organization of +the multitude of font files, I presume. + +Another way of looking at the model is that +the model provides a structure for +keeping pace with change and progress. + +You have to do the work. +Polish what you have to say. +Mark up, as naturally as possible, +by using formatting goodies from the past like manmac and picmac. +I like minimal markup, that is +\displaycenterline{supprematism in markup} +in the spirit of Malevich's `White cross on a white background,' +let us say. + +Build up your collection of works relatively independently of +context.\ftn{This looks trivial but experience has it that early + \TUB{} articles, for example, can't be formatted without adaptation, + because the formats used are obsolete. + An intrinsic question is whether we should update + or republish old work. Up till now I have updated my works. + All my \AllTeX{} articles run with \bluetex. + When composing this work, I decided not to update + old works any longer. That is history from now on. + This work contains the improvements, if any \smiley.} +Communicate what you have lived through, and keep in touch with developments. + +When you are a self-publishing author, that is all there is. +If not, you have to obey the wishes of your institute or publisher, +meaning that outer-level issues have to be adapted. +Outer-level commands govern +the title part and the global page layout, +like headings of sections, +running headers and footers, +the font(s) used, +the number of columns, +the page size, +paragraph indentation and separation, +and the like. + +The aim of the inner level set of markup tags is to remain invariant, +with the purpose that these tags can be used in any context now and in future. + +The borderline between inner and outer markup +is context dependent, and therefore undefined. +I like to think in terms of overlapping clusters. +What you might call outer I might call inner, and vice versa, +not to mention your publisher's opinion. +A pragmatic description of the group of your outer commands are those +which you have to change when you submit your work to your publisher or +a second publisher. + +The wish to modify has been anticipated in BLUe's format. +For that purpose either control sequences, +which represent a different format, can be invoked, +or a handful of outer level markup commands, casu quo parameters, +can be customized. + +Also the open-endedness is there. +At the higher level the number of mappings from +BLUe's format into publisher formats can grow. +At the lower level you can add macros. +And what about the old stuff? +The old versions can be stored in the obsolete.dat database, +with the purpose that BLUe scripts can still be +formatted in future, without change.\ftn{Well, \dots\thinspace let us hope + little change.} +And if you have a database of your own, +just make the connection. + +Portability and reusability are served by writing macros in plain \TeX, +the lowest common and documented \TeX{} language of all the flavours. +The multitude of tools have been organized in a database +to load selectively from. + +The reusability of formats, tools, references, pictures, and addresses +has been eased by storing these in databases. +By this way I obeyed the ^{Samelson\ principle}, which comes down to +\displaycenterline{ Don't pay for what you don't use.} + +\bluehead Notations and definitions + +^{Acrobat} is Adobe's .pdf tool suite, which the consumer of scripts +can use independent from the preparation tool used, to browse +scripts, to add hyperlinks and so on. + +^{address.dat} is the address database to cooperate smoothly with \cs{letter}. + +^{\AmSTeX} denotes the \AllTeX{} system in use by the \AMS. + +^{ASCII} is an acronym for American Standard Code for Information Interchange. + +BLU is Knuth's nickname for Ben Lee User. I adopted his cousin BLUe.^^{BLU, BLUe} + +^{BLUe\ script} is an ASCII file with \TeX{} markup inserted, to be processed +by \bluetex. + +^{BLUe's\ format} is the collection of the formatting tools: + ^{blue.tex}{} file (the kernel), + and the databases fmt.dat, tools.dat, address.dat, + lit.dat, pic.dat (modules). + +\bluetex{} denotes the kernel format to typeset scripts. + +^{CTAN} is the acronym for Comprehensive \TeX{} Archive Network. The resource +of \AllTeX{} materials on the internet. It comprises various sites with their +contents automatically mirrored. + +Customization occurs a lot in this work. On the one hand it is explained what +to do, and on the other hand it is indicated how to customize the macros. + +^{DTP} an acronym for Desktop Publishing, an interactive approach orthogonal +to markup-oriented systems. + +^{EP} is an acronym for Electronic Publishing. + +^{fmt.dat} denotes the database of formats to be used along with \bluetex. + +^{gkppic} is the acronym for the macros used by Graham, Knuth and Pastashnik +to format `Concrete Mathematics.' + +^{HTML} is the acronym for HyperText Markup Language and facilitates clicking +through a fragmented script. + +^{IMHO} stands for In My Honest Opinion, usually with all respect. + +^{\LaTeX} is Lamport's system on top of \TeX{} to format articles, reports, +letters, books and so on. + +^{lit.dat} is the literature database to cooperate smoothly with \bluetex. + +^{manmac} stands for the macros used by Knuth to format \TB. + +^^{markup, automatic, descriptive, functional, inner, Knuth's, logical, minimal, + outer, recursive, structural, visual} +Markup stands for the insertion of instructions in a script. +There are various markup notions. +\item{}Automatic markup is used by me when the computer generates the markup. +\item{}Descriptive markup abstracts from concrete printers and emphasizes + the descriptional nature. Agreed a little vague \smiley. +\item{}Functional markup emphasizes the functional character of the elements. +\item{}Inner markup tags is the set of markup tags that remains invariant + when processing a script with another \TeX{} flavour. +\item{}Logical markup is all about the logics of the script. +\item{}Minimal markup stands for markup with as few as possible markup tags. +\item{}Outer markup tags is the set of markup tags which needs to be + customized when processing a script with another \TeX{} flavour. +\item{}Recursive markup is used by me especially when the markup is generated + by the computer by means of recursion. +\item{}Structural markup emphasizes the structure of the script. +\item{}Visual markup denotes the implicit markup by white space. +\smallbreak +I'm not claiming that these descriptions enjoy general acceptance; +no, it helps to indicate the various backgrounds and intentions, as I +have perceived them and hinted at in this script. +IMHO, there is a lot of overlap, and no generally accepted list of +definitions. + +^^{miniature} +Miniature is an initial of a chapter. Historically, a nice painting. +In compuscripts generally a character from a special font. + +^{NFSS} is the acronym for New Font Selection Scheme. Its purpose is to +describe the selection of fonts logically. A mapping of the {\oldstyle1} +dimensional space of fonts onto the logical {\oldstyle5} dimensional space +as introduced by NFSS, with dimensions +encoding scheme, family, series, shape, and size. + +^{OTR} acronym for OutpuT Routine. + +^{PDF} acronym for Adobe's Portable Document Format. + +^{pic.dat} is the picture database to cooperate smoothly with \bluetex. + +^|\PiCTeX| a system to format pictures with plain \TeX, due to Wichura. + +Parameterization denotes ways to parameterize a macro. + +^{\PS} denotes Adobe's\Dash de facto standard\Dash page description language. + +References are stored in lit.dat, which contain even the works I don't remember + explicitly but have built upon undoubtedly. + +Script is my term of a file with (\TeX) markup. + +Section is a document element, that is, + a head followed by paragraphs.\ftn{Analogous for \cs{subsection} + and \cs{subsubsection}.} + +^{SGML} Standardized Generalized Markup Language. The ISO standard activity + for markup, ISO{\oldstyle8879}. + +^^{sorting\ keys} +Sorting keys are pairs consisting of a control sequences and +the replacement for sorting the item in the index. + +Syntax for tags: +|\begin<tag>|, |\end<tag>|, |\<tag>|; +|\pre<tag>|, |\post<tag>| placement within context; +|\this<tag>|, |\every<tag>| handling of options + +^{tools.dat} is the database of tools to cooperate smoothly with \bluetex. + +^{WYSIWYG} What You See Is What You Get. +An interactive way of working via what is seen on the display. +It is at the heart of DTP systems, to counteract the +difference of what is seen on the screen and what will be printed on the paper, especially +with respect to the fonts. + +\bluehead Markup conventions adopted + +The preliminary pages are treated separately, don't take numbering, and have +a label in the margin. There are two ToCs. A static one at the beginning to facilitate +browsing the script file and the dynamically generated one at the end which takes page numbers. + +The chapter headings are set in a larger type. The title is used in +the headline (without number), +the list of examples, and +the table of contents. +The (hidden) number of the chapter has been used in +the exercises, +the table of contents, and +the list of examples. +Chapter headings and section headings are centered and +don't take a number. +The appendix headings have their number printed as a capital letter. + +Headings don't take a period. +Run-in text can be recognized from the context. + +Headlines have the title of the chapter left and the title of the report right. +They are both set in slanted type. + +\cs{parindent} has been set to {\oldstyle0}. +Because of this the footnote numbers hang out. +A \cs{generalindent} has been used. + +Exercises take a number, no further indication has been used. + +Examples are not numbered in the text, but labeled by the word +`Example' and take a label to characterize the example. +The label is reused in the list of examples, next to the hidden number. +Punctuation marks and footnote markers are used in such a way that the +footnote marker appears after the punctuation mark. (Except for question +marks and exclamations.) +Quotation closings come after that. + +Now and then an explicit \cs{newpage} has been inserted to prevent +underfull vbox messages. No floats have been used, in order not to +disturb the sequential ordering. + +\bluehead Copyrights BLUe's Format system + +The software +$$\def\data{blue.tex\rs + fmt.dat \rs + tools.dat} +\btable\data$$ +is shareware available from CTAN and NTG's 4All\TeX{} CD-ROM. +It is not allowed to make any profit on it. +A happy user is requested to send +US\$\thinspace{\oldstyle25} to the author. +However, people in financial disadvantaged countries can send an amount +according to the macindex, that is the amount in dollars equivalent +to {\oldstyle20} breads. +No check please, because of banking overhead. + +The contributors will be added to my address database, +with field \cs{registeredbluetrue}. +Russian users are relieved for the moment from +the shareware request, with respect to personal use. + +Auxiliary and personalized files are the databases +$$\def\data{address.dat\cs addresses \rs + lit.dat \cs references\rs + pic.dat \cs pictures.\hfill} +\btable\data$$ + +The main reason for asking shareware support is to +protect myself against too many request, and +to raise some funds to continue my \TeX{} and \MP{} work. + +The user's guide `Publishing with \TeX,' and the +accompanying articles are free for personal use, and can be +plucked from the CTAN\ftn{Directory: pub/archive/info/pwt/\dots} +or NTG's 4All\TeX{} CD-ROM. + + +{\def\copyright{March, {\oldstyle1995}} + \makesignature} + +\endinput diff --git a/info/laan/pwt/pwt.mat b/info/laan/pwt/pwt.mat new file mode 100644 index 0000000000..9ad24d59b5 --- /dev/null +++ b/info/laan/pwt/pwt.mat @@ -0,0 +1,1167 @@ +\input blue.tex +\loadindexmacros +\report +\font\grkop=cmr12 scaled\magstep3 +\bluechapter Mathematics + +\beginsummary +On top of plain \TeX{} \bluetex{} provides facilities for: +automatic numbering, +cross-referencing for formulas, +matrix icons, +multi-alignment points in eqalign, +primed summation symbols, +arrows for commutative diagrams, and +some special symbols. +Examples borrowed from literature are incfluded to illustrate +how \TeX{} can be used to mark up mathematics. +This anthology shows that many details have to be prescribed. +To give a math manuscript to a keyboarder without markup guidance +is doomed to yield mediocre results. +\endsummary + +\noindent^{Swanson} {\oldstyle1986} is a good source for what math should +look like in print. +Very nice is also `^{Mathematical Writing},' a report from +a Stanford Workshop organized by Knuth. +\TeX{} is already very rich for math markup, +because in his Preface to \TB{} Knuth states +\beginquote +\noindent\llap`\dots \TeX, a new typesetting system intended for the +creation of beautiful books\Dash and especially +for books that contain a lot of mathematics.' +\endquote + +\bluehead What's the problem, Doc? + +If we assume that mathematicians write math manuscripts +in the classical sense, then there is a problem when those mathematicians +wish to have their work formatted via computer-assisted +document-preparation tools like \TeX. +What has to be keyboarded looks much different from the manuscript. +Examples of this phenomenon are omni-present in this work. + +\blueexample Disparity math notation and markup notation + +\thisverbatim{\catcode`!=12 + \catcode`~=0 } +\begindemo +x=1+\left({y^2\over k+1} + \right)^{\!\!1/3} +~yields +$$x=1+\left({y^2\over k+1}\right)^ + {\!\!1/3}$$ +\enddemo +Because of this disparity, the problem is how to get a correct\ftn{Not + only in the sense that the \TeX{} formatter does not complain, + no, correct in the sense of complying with tradition of mathematical + typesetting.} +\TeX script, starting from a mathscript. +This is difficult\ftn{In the example at hand the keyboarder has to be + aware of \cs{over} and $/$ respectively, and when to use which. + Moreover, the correct size of the parentheses must be supplied, and + some kernings have to be inserted!} +due to the inherent complexity of math typesetting, and due to +the unusual nature of \TeX, if not because of the bewildering and +confusing flavours of \TeX-based products. +Even a fancy and friendly, {\smc wysiwyg} user-interface is not enough. +Optical scanners of math\Dash or systems which understand + spoken mathematics\Dash are still science fiction. + +\bluehead The extras + +\bluetex{} provides as extras to plain {\TeX} facilities for: +automatic numbering, +cross-referencing for (display) formulas, +macros for ^{matrix icons}, +an extension of ^|\eqalign| with respect to multi-alignment points, +primed summation symbols, +arrows for commutative diagrams, +^|\beginmathdemo| and |\endmathdemo| from manmac, and +poor man's ^{blackboard bold} and some other special symbols. +These extras are introduced via examples. + +\blueexample Automatic numbering and cross-referencing + +^^{formula,\ cross-referencing} +^^{formula,\ automatic numbering} +^^{formula,\ labeled} +This is a compatible extension. +For the markup of math ^{cross-referencing} insert +instead of plain's explicit (reference) number + +\bitem \noindent^|\ref|, for creation of the number, and + \thisverbatim{\emc}|\ref\<name>|, for attaching + a name to the automatically generated number, and +\bitem ^|\crsref||\<name>|, for cross-referencing. +\smallbreak + +\begindemo +%Automatic numbering +$$a+b\eqno\ref$$ +!yields +$$a+b\eqno\ref$$ +\enddemo + + +\begindemo +%Automatic numbering, and +%symbolic cross-referencing +$$c*d\eqno\ref\cgl$$ +Text, \crsref\cgl +!yields +$$c*d\eqno\ref\cgl$$ +Text, \crsref\cgl +\par\noindent +\enddemo +\exercise And what about forward referencing? +\answer This is not possible in a one-pass job. Therefore a note + is printed in the margin while proofing. The correct + number has to be filled in ultimately. + +%end answer +Handy token variables are ^|\prenum| +and ^|\postnum|.\ftn{Courtesy Michael Spivak.} +Their contents is inserted before, respectively +after, the automatically generated number in \cs{ref} and \cs{crsref}. +Because of this one can get labels and crossrefs like {\oldstyle13}a, +or enclosing numbers by parenthesis. +The latter are the defaults of these token variables. +If in such a case the formula counter must keep its value, provide +|\advancefalse|. +\exercise How can we retain the number, and suffix a letter, as + label of a formula to come? +\answer Provide \cs{advancefalse}, and |\postnum{a)}|. + +\blueexample Matrix icons + +Useful icons concern the matrices: +rectangular, via ^|\icmat|, +triangular (lower left and upper right), +via ^|\icllt| or ^|\icurt|, and +upper Hessenberg, via ^|\icuh|. +The arguments are dimensionless numbers. +The first argument reflects the vertical size, and +the second the horizontal size. +In case of \cs{icuh} the second argument is the Hessenberg bandwidth +and the third is the difference between the first and the second. + + +\begindemo +\unitlength1ex +$$\icmat44\kern\unitlength\icllt44= + \icllt44\icuh413\qquad + \hbox{AL}=\hbox{LH}$$ +!yields +\unitlength1ex +$$\icmat44\kern\unitlength\icllt44= + \icllt44\icuh413\qquad + \hbox{AL}=\hbox{LH}$$ +\enddemo + +\exercise Another matrix factorization reads +\begincenterverbatim +$$\icmat63=\icmat63\kern\unitlength + \icurt63\qquad\hbox{A}=\hbox{QR}$$ +!endcenterverbatim +When used together with the example above, +align on the =-signs, that is, on the =-sign in the icons and on the +=-sign in the formulas. +\answer Use \cs{eqalign} as follows. +\beginverbatim +$$\unitlength1ex + \eqalign{ + \icmat44\kern\unitlength\icllt44={}& + \icllt44\icuh413& + \qquad \hbox{AL${}={}$LH}\cr + \icmat63={}& + \icmat63\kern\unitlength\icurt63& + \qquad \hbox{\phantom{A}A${}={}$QR}} +$$ +!endverbatim + +\blueexample Compatible extension of eqalign % + with multiple alignment points + +^^|\eqalign| +\begindemo +$$\eqalign{ +\cos(z\sin\theta)={}& + J_0(z)& + {}+2\sum_{n=1}^\infty + J_{2n}(z)\cos2n\theta\cr + \sin(z\sin\theta)={}& + & + {}+2\sum_{n=1}^\infty +J_{2n+1}(z)\sin(2n+1)\theta\cr +}$$ +!yields +$$\eqalign{ +\cos(z\sin\theta)={}&J_0(z)& + {}+2\sum_{n=1}^\infty J_{2n}(z)\cos2n\theta\cr +\sin(z\sin\theta)={}& & + {}+2\sum_{n=1}^\infty +J_{2n+1}(z)\sin(2n+1)\theta\cr +}$$ +\enddemo +\exercise Why is the empty formula used in the markup? +\answer The empty formula $\{\}$ is used to coerce the + to behave + as a dyadic operator, and the = to behave similarly. + In other words to yield the correct spacing. + +\blueexample Macros for showing math markup and the result + +^|\beginmathdemo| (and variants) and |\endmathdemo|, +are used in the \TB{} script, {\oldstyle444}--{\oldstyle466}, +for indented display Math, see \TB{} chapters +{\oldstyle16}--{\oldstyle19}.\ftn{There + is only one second part macro for all these cases. + Its replacement text is modified into \cs{crcr}\cs{egroup}\$\$.} +^^|\begindemo|^^|\yields| +They are used to typeset the marked up copy and the +typeset result side-by-side. +The user does not have to bother about the template for the +alignment display used. +The functionality provided is similar, but a little restricted, +to the (\LaTeX) styles for switching from +one-column to two-column format and vice versa. +But, \dots\thinspace it is much simpler and more efficient\Dash +IMHO with all respect\Dash +because it does not entail OTR processing. + +\thisverbatim{\catcode`\|=12 } +\begindemo +%TeXbook 128 +\beginmathdemo + \it Input&\it Output\cr + \noalign{\vskip2pt} + |$x^2$|&x^2\cr +\endmathdemo +!yields +\beginmathdemo + \it Input&\it Output\cr + \noalign{\vskip2pt} + |$x^2$|&x^2\cr +\endmathdemo +\enddemo + +\thisverbatim{\catcode`\|=12 } +\begindemo +%TeXbook 139 +\begindisplaymathdemo + |$$x+y^2\over k+1$$|& + x+y^2\over k+1\cr + \noalign{\vskip2pt} + |$${x+y^2\over k}+1$$|& + {x+y^2\over k}+1\cr +\endmathdemo +!yields +\begindisplaymathdemo + |$$x+y^2\over k+1$$|& + x+y^2\over k+1\cr + \noalign{\vskip2pt} + |$${x+y^2\over k}+1$$|& + {x+y^2\over k}+1\cr + \noalign{\vskip-1pt} +\endmathdemo +\enddemo +Remark. Note that we have to supply the input and the output, +due the \TeX's rigidness of the category codes once assigned. + +\blueexample Poor man's blackboard bold and some special symbols + +^^{blackboard bold} +Now and then other symbols than those provided in the font tables +of Appendix~F of \TB{} are needed.\ftn{Generally, non-standard fonts are + already available somewhere. For math consult AMS.} +These can be constructed approximately. + +{\gutter4em +\def\boxit#1{\vbox{\hrule\hbox{\vrule + #1\vrule}\hrule}} +\begindemo +$$\halign{#\hfil\quad& + \hfil#\hfil\cr + natural numbers &$\IN$ \cr + integers &$\Z$ \cr + rational numbers &$\Q$ \cr + reel numbers &$\R$ \cr + and complex numbers&$\C$ \cr + next to\cr + greater or less &$\gtrless$\cr + external tensor product& + $\boxtimes$\cr}$$ +!yields +$$\def\IN{{\rm I\kern-.5ex N}} +\halign{#\hfil\quad&\hfil#\hfil\cr + natural numbers &$\IN$ \cr + integers &$\Z$ \cr + rational numbers &$\Q$ \cr + reel numbers &$\R$ \cr + and complex numbers&$\C$ \cr + next to\cr + greater or less &$\gtrless$\cr + external tensor product& + $\boxtimes$\cr}$$ +\enddemo} +\cs{IN}, \cs{Z}, et cetera are incorporated in \bluetex. +\exercise On the \TeX-NL network there was a request for the pro mille + token. How to get it? +\answer It is in the wasy font. A poor man's version is an open problem + as yet, because the lower 0 is neither 5pt, nor 6pt, and therefore + the symbol can't be built from \% and an appropriate sized 0. + A very, very poor man's version reads |\%\lower.2ex\hbox{\fiverm 0}|, + in fact unacceptible. + Building it from \cs{frac}, |\frac0/{00}|, is different from \%. + +\bluehead Use + +Many ingredients are supplied by plain. +It is just a matter of what-and-how, what to use from the wealth offered. +It has all to do with what the script should look like in print +{\em within the context}. +In the sequel some more math markup will be shown, not restricted to +markup tags from \bluetex{}. +A classical example is the markup for the various uses of O. + +Noteworthy is further that +punctuation symbols are also used with spacing before them, +ditto for the vertical bars and the backslash. +The size of delimiters is dependent on the context, +which can't be completely automated. +The variants can be obtained via special markup, for example via + +\bitem ^{coercion macro}s + (to guide \TeX{} with respect to spacing before and after, + for example via \cs{mathdelimiter}, + or to positioning of embellishments below and on top, + for example via \cs{mathop}) +\bitem the use of the ^{empty formula}, $\{\}$, + to coerce binary behaviour of the operator +\bitem macros to impose the size of delimiters + (\cs{biggl} et cetera) +\bitem special control sequences + (like \cs{colon}). +\smallbreak + +\bluesubhead Plain's display maths + +Most displays belong to one of the categories given below. + +\blueexample A labeled formula in display + +Spaces are neglected in math mode. ^^{formula,\ labeled} +The kern |\,| is needed to coerce the correct spacing. +\begindemo +$$\sin2x=2\sin x\,\cos x + \eqno({\rm TB186})$$ +!yields +$$\sin2x=2\sin x\,\cos x + \eqno({\rm TB186})$$ +\enddemo + +\blueexample Formula hyphenation; shifting of lines + +A hyphenated formula via \cs{displaylines}. ^^{formula,\ hyphenation} +With the use of \cs{hfill} we can shift lines to the +left or right. +\begindemo +$$\displaylines{F(z)= +a_0+{a_1\over z}+{a_2\over z^2} + +\cdots+{a_{n-1}\over z^{n-1}} + +R_n(z),\hfill\cr +\hfill n=0,1,2,\dots\,,\cr +F(z)\sim\sum_{n=0}^\infty + a_nz^{-n},\quad z\to\infty + \hfill\llap{(TB ex19.16)}}$$ +!yields +$$\displaylines{F(z)= +a_0+{a_1\over z}+{a_2\over z^2} + +\cdots+{a_{n-1}\over z^{n-1}} + +R_n(z),\hfill\cr +\hfill n=0,1,2,\dots\,,\cr +F(z)\sim\sum_{n=0}^\infty + a_nz^{-n},\quad z\to\infty + \hfill\llap{(TB ex19.16)}}$$ +\enddemo + +\blueexample Alignment and centered labeling + +\begindemo +$$\eqalign{\cos2x + &=2\cos^2x-1\cr + &=\cos^2x-\sin^2x} + \eqno({\rm TB193})$$ +!yields +$$\eqalign{\cos2x + &=2\cos^2x-1\cr + &=\cos^2x-\sin^2x} + \eqno({\rm TB193})$$ +\enddemo + +\blueexample Alignment and labels per line + +\begindemo +$$\eqalignno{\cosh2x + &=2\cosh^2x-1&({\rm TB192})\cr + &=\cosh^2x+\sinh^2x}$$ +!yields +$$\eqalignno{\cosh2x + &=2\cosh^2x-1&({\rm TB192})\cr + &=\cosh^2x+\sinh^2x}$$ +\enddemo + +Remark. %In not too narrow columns the last formulas + %are both centered. +If one wants \cs{eqalignno} to behave like +\cs{displaylines}\Dash that is, left-justified\Dash +then modify in \cs{eqalignno} the first +\cs{tabskip}=\cs{centering} assignation into +\cs{tabskip}= \cs{z@skip}. + +\blueexample Subscripts + +The depth of a ^{subscript} depends on whether there is +a superscript. With a superscript a subscript sinks a little. +In order to obtain uniformly placed subscripts +the solution is to adjust the following font dimension +parameters, see \TB{} {\oldstyle179}. +\begindemo +\fontdimen16\textfont2=2.7pt +\fontdimen17\textfont2=2.7pt +$$X_1+Y_1^2=1$$ +!yields +\fontdimen16\textfont2=2.7pt +\fontdimen17\textfont2=2.7pt +$$X_1+Y_1^2=1$$ +\enddemo + +\thissubhead{\runintrue} +\bluesubhead A snapshot of examples\par borrowed from \TB, +to illustrate the need for extra markup. +\TB{} chapters {\oldstyle16}\dash{\oldstyle19} contain many examples, +well-ordered and appropriately explained. + +\blueexample Dots and the comma after + +^^{dots and the comma after} +\begindemo +$${\bf S^{\rm-1}TS=dg}(\lambda_1, + \ldots\,,\lambda_n)=\bf\Lambda$$ +!yields +$${\bf S^{\rm-1}TS=dg}(\lambda_1, + \ldots\,,\lambda_n)=\bf\Lambda$$ +\enddemo + +\blueexample Summation with limits + +\begindemo +$$\sum_{k=1}^\infty{1\over2^k}=1$$ +!yields +$$\sum_{k=1}^\infty{1\over2^k}=1$$ +\enddemo +\exercise In line we usually have subscripts and superscripts. + How can we get those? +\answer Automatically! \TB{} 144: ` A displayed sum usually occurs + with `limits,' i.e., with subformulas that are to appear above + and below it. \dots\thinspace According to the normal conventions + of mathematical typesetting, \TeX{} will change this to + `$\sum_{k=1}^\infty{1\over2^k}=1$' (i.e., without limits) if it + occurs in text style rather than in displaystyle.' Explicit control + is possible via the control sequences \cs{limits}, respectively + \cs{nolimits}. + +%end answer + +\blueexample Overlining; accents + +If there is an example with various markup possibilities, this is the one, +although the various O-s comes close. ^^{overlining}^^{accents in math} +\begindemo +$$\bar z,\ \overline z,\ +\bar P,\ \overline P,\ +\bar h,\ \hbar,\ +\overline{AB}$$ +!yields +$$\bar z,\ \overline z,\ +\bar P,\ \overline P,\ +\bar h,\ \hbar,\ +\overline{AB}$$ +\enddemo + +\blueexample Square roots + +\begindemo +$$\sqrt{1+\sqrt{1+\sqrt{1+x}}}$$ +!yields +$$\sqrt{1+\sqrt{1+\sqrt{1+x}}}$$ +\enddemo + +\blueexample Roman texts in math, \TB~{\oldstyle163}; accents + +^^{roman texts in math} +\begindemo +$${f(x+\Delta x)-f(x)\over + \Delta x}\to f'(x)\quad + {\rm as}\quad\Delta x\to0$$ +!yields +$${f(x+\Delta x)-f(x)\over + \Delta x}\to f'(x)\quad + {\rm as}\quad\Delta x\to0$$ +\enddemo +Remark. \TeX{} uses special conventions for accents in formulas, so the +accents in ordinary text and the ^{accents in math} have different markup, +\TB~{\oldstyle135}. + + +\blueexample Kerning; positive and negative + +^^{kerning; positive and negative} +\thisverbatim{\catcode`\!=12 + \catcode`\~=0 } +\begindemo +$$ \int\!f(x)\,dx, \quad + \Gamma_{\!2}+\Delta^{\!2},\quad + \sum^\infty_{n=-\infty}\! + \!\!\cos nt$$ +~yields +$$ \int\!f(x)\,dx, \quad + \Gamma_{\!2}+\Delta^{\!2}, \quad +\sum^\infty_{n=-\infty}\!\!\!\cos nt$$ +\enddemo + +\blueexample Empty formula and subscripting + +^^{empty formula and subscripting} +\begindemo +(\lambda)_2\,{}_2F_1 +!yields +$$(\lambda)_2\,{}_2F_1$$ +\enddemo + +\blueexample Math operator + +^^{math\ operator} +\begindemo +$$\mathop{\hbox{\rm Res}}_ + {s=e^{i\pi}}f(s)=-e^{i\pi z}$$ +!yields +$$\mathop{\hbox{\rm Res}}_ + {s=e^{i\pi}}f(s)=-e^{i\pi z}$$ +\enddemo + +\blueexample Colon markup; punctuation vs.\ operator + +^^{colon markup} +\begindemo +$$f\colon A\to B,\quad \{x:x>5\}$$ +!yields +$$f\colon A\to B,\quad \{x:x>5\}$$ +\enddemo + +\blueexample Context-dependent size + +\begindemo +$$\bigl\!vrt\,\alpha(\sqrt + {\mathstrut a}+\sqrt + {\mathstrut b}\,)\, + \bigr\!vrt +\leq!vrt\alpha!vrt\, + \bigl\!vrt\sqrt + {\mathstrut a}+\sqrt + {\mathstrut b}\, + \bigr\!vrt$$ +!yields +$$\bigl\Vert\,\alpha(\sqrt{\mathstrut a}+ + \sqrt{\mathstrut b}\,)\,\bigr\Vert + \leq\vert\alpha\vert\, + \bigl\Vert\sqrt{\mathstrut a}+ + \sqrt{\mathstrut b}\,\bigr\Vert$$ +\enddemo +It is tempting to insert a multiplication dot. Don't! + +\blueexample Vertical bars, \TB{} {\oldstyle146}, {\oldstyle147}, + ex{\oldstyle18}.{\oldstyle21} + +\begindemo +$$\big\{\,x^3\bigm\vert h(x)\in + \{-1,0,+1\}\,\bigr\}$$ +!yields +$$\bigl\{\,x^3\,\bigm\vert\,h(x)\in + \{-1,0,+1\}\,\bigr\}$$ +\enddemo + +\blueexample Halves variety \TB{} ex{\oldstyle11}.{\oldstyle6}, ex{\oldstyle19}.{\oldstyle2} + +Essential is the use of \cs{textstyle}. +\begindemo +$$D^\lambda_0(z)= + 4a_\lambda\, z\,{}_2F_1(% + \textstyle + \lambda+{1\over2},{1\over2}; + {3\over2};z)$$ +%Typographer's 1/2 +Typographer's $\fracdek1/2$, +(recipes), which works better +than a mathematician's $1\over2$ +!yields +$$D^\lambda_0(z)= +4a_\lambda\, z\,{}_2F_1(\textstyle\lambda+{1\over2},{1\over2}; +{3\over2};z)$$ +Typographer's $\fracdek1/2$, +(recipes), which works better +than a mathematician's $1\over2$ +\enddemo + +\blueexample Under and overbraces + +Subtle use of fonts, and \cs{mathstrut} to enforce size. +For under and over parentheses see TTN 3.4. ^^{underbraces}^^{overbraces} +\begindemo +$$\{\underbrace{\overbrace + {\mathstrut a,\ldots,a}^ + {k\;a\mathchar`'\rm s}, + \overbrace{\mathstrut b,\ldots + ,b}^{l\;b\mathchar`'\rm s}} + _{k+l\rm\;elements}\}$$ +!yields +$$\{\underbrace{\overbrace{\mathstrut + a, \ldots,a}^{k\;a\mathchar`'\rm s}, + \overbrace{\mathstrut b,\ldots,b} + ^{l\;b\mathchar`'\rm s}} + _{k+l\rm\;elements}\}$$ +\enddemo + +\blueexample Diagonal dots, coercions, \TB{} ex{\oldstyle18}.{\oldstyle45} + +^^{diagonal dots} +\begindemo +$$2\uparrow\uparrow k + \mathrel{\mathop=^{\rm def}} + 2^{2^{2^{\cdot^{\cdot^ + {\cdot^2}}}}}\vbox + {\hbox{$\Big\}\scriptstyle k$} + \kern0pt}$$ +!yields +$$2\uparrow\uparrow k\mathrel{\mathop= + ^{\rm def}} + 2^{2^{2^{\cdot^{\cdot^{\cdot^2}}}}} + \vbox{\hbox{$\Big\}\scriptstyle k$} + \kern0pt}$$ +\enddemo + +\exercise What is the function of the \cs{kern}0pt? +\answer To set the curly brace on the baseline. + +\exercise Can the \cs{cdot} be replaced by just a period? +\answer It looks like it. Used within the picture environment + I stumbled on lack of scaling invariance for the latter case?!? + As far as I see it now the \cs{cdot} yields nicer result anyway. + Because of the explicit \cs{Big} the above markup is not + scaling invariant. + +\blueexample Undoing mathsurround space + +\begindemo +$2{\times}3$-matrix +!yields +\hfil$2{\times}3$-matrix +\enddemo + +\blueexample All those O-s + +\begindemo +$\emptyset$, (the empty set) +$f\circ g\colon + x\mapsto f\bigl(g(x)\bigr)$, + (composition), and + order symbols +$o(h^2)$, +$O(h^2)$. +!yields +\par $\emptyset$, {(the empty set)}, +\par $f\circ g\colon x\mapsto f\bigl(g(x)\bigr)$ +(composition), +\par and the order symbols $o(h^2)$ and $O(h^2)$ +\enddemo + +\blueexample Set difference vs.\ cosets + +^^{set difference}^^{cosets} +\begindemo +$A\setminus A=\emptyset, + \hbox{and the cosets of $G$ + by $H$:\ }G\backslash H$ +!yields +$A\setminus A=\emptyset, +\hbox{and the cosets of $G$ by $H$:\ } + G\backslash H$ +\enddemo + +\blueexample The Cardano solution to third-order equation + +\begindemo +%x^3+px=q, p,q\ge0 +$$\root3\of{\sqrt{p^3/27-q^2/4}+ + q/2}-\root3\of{\sqrt{p^3/27+ + q^2/4}-q/2}$$ +!yields +$$\root3\of{\sqrt{p^3/27-q^2/4}+q/2}- + \root3\of{\sqrt{p^3/27+q^2/4}-q/2}$$ +\enddemo + +\blueexample Derivatives + +The problem is the three dotted derivative, ^^{derivatives} +\TB~{\oldstyle136}. +\begindemo +$$\dot y\,\ddot y\, + \skew3\dot{\ddot y}\quad + y'\,y''\,y''' \quad +\partial_xy\,\partial_x^2y\, +\partial_x^3y$$ +!yields +$$\dot y\,\ddot y\, + \dot{\ddot y\kern2pt}\quad + y'\,y''\,y''' \quad +\partial_xy\,\partial_x^2y\, +\partial_x^3y$$ +\enddemo + +\blueexample Bessel equation + +^^{Bessel equation} +\begindemo +$$z^2w''+zw'+(z^2-\nu^2)w=0$$ +solutions: +$J_{\pm\nu}(z)$, +$Y_{\pm\nu}(z)$, +$H_\nu^{(1)}(z)$, +$H_\nu^{(2)}(z)$ +!yields +$$z^2w''+zw'+(z^2-\nu^2)w=0$$ +solutions: +$J_{\pm\nu}(z)$, +$Y_{\pm\nu}(z)$, +$H_\nu^{(1)}(z)$, +$H_\nu^{(2)}(z)$ +\enddemo + +\blueexample Primed summation symbols and split formula + +Subtle use of the prime and the right font. +Nice is the nested use of the coercions \cs{mathop} and +\cs{mathrel}. A minor detail is to preserve the dyadic +character of the + in the last term. \cs{acclap} is +incorporated in \bluetex. See \TB{} ex{\oldstyle18}.{\oldstyle44}. +\begindemo +$$\displaylines{ + \mathop{{\sum}\acclap'}_{k=0}^n + a_kT_k(x) + \mathrel{\mathop=^{\rm def}} + .5\kern1pt a_0+a_1 x+a_2T_2(x)+ + \cdots \hss\cr + \hfill{}+a_nT_n(x)}$$ +!yields +$$\displaylines{ + \mathop{{\sum}\acclap'}_{k=0}^n + a_kT_k(x)\mathrel{\mathop=^{\rm def}} + .5\kern1pt a_0+a_1 x+a_2T_2(x)+\cdots + \hss\cr + \hfill{}+a_nT_n(x)}$$ +\enddemo +\exercise How can we prevent the line distance from growing larger + than the regular value? +\answer Give the summation symbol depth 0. + +\blueexample Hypergeometric function + +^^{hypergeometric function} +Subtle subscripting, size of parentheses, and positioning of arguments. +\begindemo +$$M_n(z)={}_{n+1}F_n\Bigl({k+a_0, + \atop\phantom{kc_1}} + {k+a_1,\dots,k+a_n + \atop k+c_1,\dots,k+c_n};z\Bigr) +$$ +!yields +$$M_n(z)={}_{n+1}F_n\Bigl({k+a_0, + \atop\phantom{kc_1}} + {k+a_1,\dots,k+a_n + \atop k+c_1,\dots,k+c_n};z\Bigr) +$$ +\enddemo +\exercise Why has the \cs{phantom} argument |kc_1|? +\answer It could have been anything representative for the lower part. + With the k and the subscript in the \cs{phantom} we are sure + that the vertical positioning will be OK. + +%end answer +\blueexample From \TB{} {\oldstyle177}, (p)matrix as formula part. % + proclaim is used too + +\begindemo +\proclaim Definition. $x$ is called +an eigenvector with +eigenvalue $\lambda$ of the matrix +$$A=\pmatrix{ + a_{11}&a_{12}&\ldots&a_{1n}\cr + a_{21}&a_{22}&\ldots&a_{2n}\cr + \vdots&\vdots&\ddots&\vdots\cr + a_{n1}&a_{n2}&\ldots&a_{nn}\cr}$$ +if $Ax=\lambda x$. +\par +!yields +\proclaim Definition. $x$ is called +an eigenvector with +eigenvalue $\lambda$ +of the matrix +$$A=\pmatrix{ + a_{11}&a_{12}&\ldots&a_{1n}\cr + a_{21}&a_{22}&\ldots&a_{2n}\cr + \vdots&\vdots&\ddots&\vdots\cr + a_{n1}&a_{n2}&\ldots&a_{nn}\cr}$$ +if $Ax=\lambda x$. + +\enddemo%blank line is necessary + +\blueexample Split equation and context-sized delimiters + +\begindemo +From Swanson (1986, Section 3.3 + Math in Display) +Because it is a large formula +I used \displaylines. +For the integral we need \nolimits +to inactivate the default placement +of limits. +Furthermore, there is subtle use of +subscripting and delimiters of +varying sizes. +Finally the shifting of parts +has to handled corrrectly. +See the script for the details. +!yields +$$\displaylines{ + \int\nolimits_U\delta(I)\mu(I) + \leq{}\hfill\cr + \quad{}\sum_{{\cal D}} + \sum_{{\cal D}_{I'}} + \biggl[\int\nolimits_J + \alpha(J')\mu(J')-\alpha(J)\mu(J) + \hfill\cr + \hfill {}-\int\nolimits_J + [\{s(\alpha\eta)(J')\} + /\eta(J')]\mu(J')\biggr]\cr + \quad{}+\biggl[ + \sum_{{\cal D}} + \sum_{{\cal D}_{I'}} + |\alpha(J)-[\{s(\alpha\eta)(J)\} + /\eta(J)]|\mu(J)\biggr]\hfill\cr + \hfill + {}\times\biggl[ + \sum_{{\cal D}} + \sum_{{\cal D}_{I'}} + |\alpha(J)-[\{s(\alpha\eta)(J)\} + /\eta(J)]|\eta(J)\biggr] \cr} $$ +\enddemo + +\blueexample Rhombus scheme + +^^{rhombus\ scheme} +\begindemo +The idea is to align vertically. +Pseudo markup reads +\setbox\ru={</ line>} +\setbox\rl={<\ line>} +$$\halign{<template>\cr +1st & &e...\cr + &\ru& &\rl& \cr +q...& & & &q...\cr + &\rl& &\ru& \cr + & &e...&\omit... + \hidewidth\cr}$$ +For the details consult the script. +!yields +{\hfuzz=30pt +\newbox\ru % +\newbox\rl % +\setbox\ru=\hbox{\unitlength=1ex + \xdim{4}\ydim{2} + \beginpicture + \put(0,0){\line(2,1){4}} + \endpicture} +%\diagline . 4ex wd +2ex ht\relax}% +\setbox\rl=\hbox{\unitlength=1ex + \xdim{4}\ydim{2} + \beginpicture + \put(0,2){\line(2,-1){4}} + \endpicture} +%\diagline . 4ex wd -2ex ht\relax}% +$$\quad\vbox{\offinterlineskip +\halign to\displaywidth +{\tabskip=0pt \hfil$#$%left element +&\hfil$\vcenter{#}$\hfil%left lines +&\hfil$#$\hfil %middle elements +&\hfil$\vcenter{#}$\hfil%right lines +&$#$\hfil %right elements +\tabskip=\centering\cr %end template +1^{st}\/{\rm RS}\hfill + & &e^{(s)}_k&& \cr +&\copy\ru& &\copy\rl& \cr +q^{(s+1)}_k&&&&q^{(s)}_{k+1}\cr +&\copy\rl& &\copy\ru& \cr +& &e^{(s+1)}_k + &\omit$={q^{(s)}_{k+1}\over q^{(s ++1)}_k}\,e^{(s)}_k$\hfil\hidewidth\cr +\noalign{\vskip1ex} +2^{nd}\/{\rm RS}\hfill + & &q^{(s)}_k&& \cr +&\copy\ru& &\copy\rl& \cr +e^{(s+1)}_{k+1}&&&&e^{(s)}_k\cr +&\copy\rl& &\copy\ru& \cr +& &q^{(s+1)}_k + &\omit$=q^{(s)}_k+(e^{(s)}_k- + e^{(s+1)}_{k+1})$\hfil\hidewidth + \cr}%end halign +}% end vbox element +$$} +\enddemo + +\blueexample Commutative diagram, confer \TB{} ex{\oldstyle18}.{\oldstyle46} + +Nice use of two-sided \cs{hidewidth}, ^^{commutative diagram} +and the subtle \cs{strut} to place the superscript of {$\cal F$}. +There is no strict alignment. The elements at the nodes overflow +into the space of the arrows. As a consequence we need arrows of +various lengths. +\begindemo +\let\normalbaselines + \adaptedbaselines +$$\matrix{ + f&\lmapright\otimes&a_f\cr + \mapdown{{\cal F}}&&\mapup{% + {\cal F}\strut^{-}}\cr + \hidewidth{\cal F}(f)\hidewidth + &\mapright\times\hfil& + \hidewidth\bigl({\cal F}(f) + \bigr)^2\hidewidth\cr}$$ +!yields +\let\normalbaselines\adaptedbaselines +$$%Diagram +\matrix{f&\lmapright\otimes&a_f\cr + \mapdown{{\cal F}}&&\mapup{% + {\cal F}\strut^{-}}\cr + \hidewidth{\cal F}(f)\hidewidth + &\mapright\times\hfil& + \hidewidth\bigl({\cal F}(f) + \bigr)^2\hidewidth\cr}$$ +\enddemo + +\blueexample Partitioning + +^^{partitioning} +\begindemo +$$\def\data{$I_{n-r}$\cs 0 \rs + 0\cs $I-2v_rv_r^T$} +P_r=\left(\vcenter{\ruled + \btable\data}\right)$$ +!yields +$$\def\lft{\hfil$}\def\rgt{$\hfil} +\def\data{I_{n-r}\cs 0 \rs + 0\cs I-2v_rv_r^T} +P_r=\left(\vcenter{\ruled + \btable\data}\right)$$ +\enddemo +\exercise How can we avoid \$-s in the markup of the data? +\answer Define \cs{lft} and \cs{rgt} equal to \$ with + \cs{hfil} added left, respectively right, for centering. + +\exercise How can we construct partitioned matrices in general? +\answer Make use of nested tables. Consider the partitioned matrix, + a \cs{ruled}\cs{btable}, to be built from blocks + with each block a non-ruled matrix. + +%end answer + +\blueexample Continued fractions with alignment on =, and interruption + +^^{continued fraction} +\begindemo +Many details come together in +this markup. Not in the least +the alignment on = where one is +an =-def. Also the space +saving variants, borrowed from +literature are relevant. +The special `\over'-line is a +poor man's use of \atop and +\over, because \over is a +primitive. +Peruse the script. +!yields +\def\cfsym{\mathop{\grkop \Phi}} +$$\eqalignno{ +1+\cfsym_{k=1}^n{a_k\over b_k} +&{}\buildrel{\rm def}\over= + 1+{a_1\over\displaystyle b_1+ + {\strut a_2\over\strut + \vrule height3ex width0pt\relax + \displaystyle b_2 + + \lower2.0ex\hbox{$\ddots\, + \lower1.25ex\hbox{$+ + {\displaystyle a_{n-1}\over + \displaystyle b_{n-1}+ + {\strut a_n\over + \displaystyle b_n}}$} + $} + } + }\cr +\noalign{%\noindent %not necessary +with (space saving) + variant notations} +&{}\buildrel{\rm\phantom{def}}\over= +1+\cf{a_1}{b_1}+\cf{a_2}{b_2}+\cdots+\cf{a_n}{b_n}\cr +% +&{}\buildrel{\rm\phantom{def}}\over= +1+ +{a_1\over\textstyle\strut + \vrule height2.5ex width0pt + b_1\,+\,} +{a_2\over\textstyle\strut + \vrule height2.5ex width0pt + b_2\,+\,} + \cdots +{a_n\over\textstyle\strut + \vrule height2.5ex width0pt + b_n} +\cr}%end\eqalignno +$$ +\enddemo +\exercise How can we replace the division line by $\cf{}{}$ \ ? +\answer This is an open problem. If you have an elegant solution, + let me know. + +%end answer +\blueexample Context sensitivity + +Certain accents can grow a little with what has to be accented, \TB~{\oldstyle136}. +^^{context sensitivity}^^{accents in math} +\begindemo +$$\widehat{xy}, + \widetilde{xyz}$$ +!yields +$$\widehat{xy}, + \widetilde{xyz}$$ +\enddemo + +\blueexample Matrix equation + +^^{matrix equation} +\begindemo +$$\displaylines{\indent +\bordermatrix{ + & &\rm A & \cr + &\times&\times&\times\cr + &\times&\times&\times\cr + &\times&\times&\times} +\bordermatrix{ + & &\rm N & \cr + &1& & \cr + &0&1 & \cr + &0&\times&1} +\hfill\cr\hfill= +\bordermatrix{& &\rm N & \cr + &1& & \cr + &0&1 & \cr + &0&\times&1} +\bordermatrix{ + & &\rm H & \cr + &\times&\times&\times\cr + &\times&\times&\times\cr + &0 &\times&\times} +}$$ +!yields +$$\displaylines{\indent +\bordermatrix{& &\rm A & \cr + &\times&\times&\times\cr + &\times&\times&\times\cr + &\times&\times&\times\cr} +\bordermatrix{& &\rm N & \cr + &1& & \cr + &0&1 & \cr + &0&\times&1\cr}\hfill\cr +\hfill= +\bordermatrix{& &\rm N & \cr + &1& & \cr + &0&1 & \cr + &0&\times&1\cr} +\bordermatrix{& &\rm H & \cr + &\times&\times&\times\cr + &\times&\times&\times\cr + &0 &\times&\times\cr} +}$$ +\enddemo + + +\blueexample Braces and matrices + +^^{braces and matrices} +\begindemo +This is a complex problem, with a lot +of fine-tuning. However, it is +possible to systemize much. +The approach is to look at it as +a bordered table with a +parenthesized matrix as data. +The handling of the row stub and +the header are separated from +the data (the pmatrix). +The pseudo code reads as follows. +\setbox1=\hbox{$\pmatrix{<data>}$} +Define header and row stub list, and +switch off defaults of btable, +especially the separators. +Finally invoke +$$\btable{$\vcenter{\copy1}$}$$. +Alignment left braces courtesy +Alan Jeffrey communicated by +J\"org Knappen. +For the details see the script. +!yields +\def\fatlbrace{\delimiter"4000338 } +%Set the block +\setbox1=\hbox{$\pmatrix{% +\times&\times&\times&\times&\times&\times&\times\cr +0 &\times&\times&\times&\times&\times&\times\cr +0 &0 &\times&\times&\times&\times&\times\cr +0 &0 &0 &\times&\times&\times&\times\cr +0 &0 &0 &0 &\times&\times&\times\cr +0 &0 &0 &0 &\times&\times&\times\cr +0 &0 &0 &0 &\times&\times&\times}$} +%Define header and row stub list (each one element) +\def\header{\hbox to\wd1{\hfil +$\overbrace{\vrule height0pt width.4\wd1 depth0pt}^p$\hfil +$\overbrace{\vrule height0pt width.3\wd1 depth0pt}^{n-p}$\hfil}} +\tvsize=\ht1\advance\tvsize\dp1 +\def\rowstblst{{$\vcenter to\tvsize{\vss + \hbox{${\scriptstyle\phantom{n{-}}p} + \left\fatlbrace\vrule height.55\ht1 width0pt depth 0pt\right.$}\vss + \hbox{${\scriptstyle n{-}p} + \left\fatlbrace\vrule height.15\ht1 width0pt depth 0pt\right.$}\vss}$}} +% +\def\data{$\vcenter{\copy1}$} +%Switch off defaults in btable +\let\rowstbsep\relax%kind of row stub separator +\let\headersep\relax%kind of header separator +\let\colsepsurround\relax%space around column separator +\def\hs{\cr\nxtrs}%function of header separator: yield next row stub +$$\vcenter{\btable\data}$$ +\enddemo + +\exercise Add partitioning to the braces and matrices example. +\answer In pic.dat a trial-and-error solution is included. + Not elegant. Improve, enjoy, and let me know! + +\endinput +\bye
\ No newline at end of file diff --git a/info/laan/pwt/pwt.obs b/info/laan/pwt/pwt.obs new file mode 100644 index 0000000000..a8cd565fc9 --- /dev/null +++ b/info/laan/pwt/pwt.obs @@ -0,0 +1,5 @@ +\report +\bluechapter Obsolete Database + +To be filled in. +\endinput
\ No newline at end of file diff --git a/info/laan/pwt/pwt.ref b/info/laan/pwt/pwt.ref new file mode 100644 index 0000000000..bbc786cc66 --- /dev/null +++ b/info/laan/pwt/pwt.ref @@ -0,0 +1,292 @@ +\input blue.tex +\loadindexmacros +\report +\bluechapter Coping with References + +\beginsummary +\bluetex{} makes use of the database of references +lit.dat. The references have to be specified by name. +Prior to the formatting of the script the specified +references are set and kept in a box. +This box is pasted up on command. +The layout of the references has been inspired upon AMS +and can be customized at a lower level. +\endsummary + +Most if not all of your references should be part of your\ftn{And + hopefully of your publisher as well.} +database of literature. +This starting point makes things simpler and definitely +facilitates reuse. + +\bluetex{} makes use of lit.dat, a database of references, +organized as a list. ^^{database,\ lit.dat} +The names of the list elements\Dash primary keys in database jargon\Dash +identify the entries. +Each list entry consists of a +list element tag, +a name, and the +(marked up) bibliography item proper. +The structure of the marked up of the bibliography item proper is modest and +prompted by my use: + author name, year of publication, and + rest part, +next to some adopted conventions. +In the field I'm working I know the publication by heart, once +I know the name of the author(s) and the year of publication. +For my own use I don't need further tagging. + +\bluehead Using references + +With \bluetex{} the use comes down to specifying the names of +the references in the preliminary part of the script, via +^^|\beginreferences|%^^|\endreferences|^^|\references| +\begincenterblock +\cs{beginreferences} +$\cs{}\langle\,name_1\rangle\dots% + \cs{}\langle\,name_n\rangle\qquad% + \hbox{or}\qquad% + \cs{references}\{\cs{}\langle\,name_1\rangle\dots% + \cs{}\langle\,name_n\rangle\}$ +\cs{endreferences} +\endcenterblock +and paste up the references via ^|\pasteupreferences|, +at your place of choice. +\exercise What is the effect of |\references{}|? +\answer Via this empty specification we can typeset what has + been supplied in \cs{thisreferences}. Agreed, a little + unusual. + +Placement within context can be handled via +the token variables ^|\prereferences| and ^|\postreferences|. +Default \cs{prereferences} takes care of the heading via +\displaycenterline{|\prereferences{\head{\the\referencesname}}|.} +The token variables ^|\thisreferences| and ^|\everyreferences| +can be used for customization. + +\thissubhead{\runintrue} +\bluesubhead Cross-referencing\par can always be done via the +convention of |<author name(s)>| |<year>|. ^^{cross-referencing} +This approach facilitates reading, +at least for me, at the expense of a little more space in print +than the system of numbers. +The latter system is possible with \bluetex. +Once the references have been set by \cs{references}, +each name is redefined by its sequence number. + +After +$\cs{references}\{\dots\cs{}\langle\,name_n\rangle\dots\}$ +then +$\cs{}\langle\,name_n\rangle$ +denotes the number |<n>|. + +\thissubhead{\runintrue} +\bluesubhead Robustness\par is there too. +Most likely users will now and then mistype +a name supplied in \cs{references}. +\bluetex{} reacts very elegantly to this. +First, it continues, it does not stop. +A message is provided in the log file, and as reference +an error message is printed by |\pasteupreferences|. + +\bluehead Adding a reference to the database lit.dat + +^^{add\ a\ reference} +The structure of the bibliography items in lit.dat is modest, +a list of elements and each element starting with the list +element tag, \cs{lst}, and a name. ^^{entry\ for\ lit.dat} +\begincenterverbatim +\lst\<name><extension> +{<name part> (<date part>): + <title part> + <rest> +} +!endcenterverbatim +This syntax leaves freedom and flexibility, although +the essentials\Dash name, date, title\ftn{I consider it + important to delineate the main fields, however.} +\Dash have prescribed positions. +The number of authors does not matter, +nor is it prescribed how the author names should be specified. +That is up to you. +The representation of the date is free too, +leaving room for things like `in progress' or `priv. comm.' +I don't like to prescribe structurally the title in more detail. +The rest part is not further prescribed either, +because of the great variety of sources---publishers, books, journal series, +proceedings, theses, technical reports, and the like. +At the end of the rest part I added, within parentheses, +annotations, now and then.\ftn{There is + usually too much formatting in a bibliography for my taste. + Why discriminate between a title of a book and an article? + Given the context that is clear enough. + Especially, when for a book the ISBN (or ISSN) number is provided. + And why so much (superfluous) punctuation? + For me there should be as little punctuation as is + functionally needed to separate the elements within the entry.} + +For the name I chose to use lowercase letters only: +the (first) name followed by the initials. +For the |<extension>| I chose extra letter(s). +The latter are there to tell the difference between more than one publication +per author, and to allow insertions, when one stumbles on some +early work of an author. As an example of an entry, I'm pleased to +take \TB.\ftn{In practice I hardly use this one, because in + \cs{prereferences} I supply the note + `I assume \TB{} to be omni-present.'} + +\blueexample lit.dat entry + +\begincenterverbatim +\lst\knuthded +{Knuth D.E (1984): + \TB. + \AW. ISBN 0-201-13448-9. + \annotation{Soft cover edition + of book A in the series + Computers and Typesetting.} +} +!endcenterverbatim +The list of references is ordered alphabetically on +|<name><extension>|. Prepare your bibliography and insert the +items in your personalized version of lit.dat, and that is it. + +\exercise How can we format the complete lit.dat database, with + each entry preceded with numbers enclosed in square brackets? +\answer Recognize that the file consists of triples. +BLUe's format provides \cs{setdatabase} for this purpose. +That macros comes down to the following. +\beginverbatim +\input blue.tex \onecol +\prenum{[\thinspace}\postnum{\thinspace]} +\def\lst#1{\nitem} +\input lit.dat +\smallbreak +\bye +!endverbatim +An older fifo-oriented solution reads as follows. +\beginverbatim +\newcount\bcnt +\def\prt{\medskip\noindent\advance\bcnt1 + \llap{[\number\bcnt]\quad}} +\def\fifo#1#2#3{\ifx#1\ofif\ofif\fi +\prt#3\fifo} +%a blank line +\fifo\lst\<name1>{...} + \lst\<name2>{...} + ... + \lst\<namen>{...} +\ofif\relax\relax +\bye +!endverbatim +Note the difference. + +^^{list\ of\ database} +\exercise How can we get a list of names of the references in the database? +\answer \bluetex{} contains a macro \cs{contentsdatabase} + that writes the list of names of + a lit, pic, or address database to the file contentslit, + contentspic, or contentsaddress.\\ +Let us assume that we wish the list of names in a toks +variable \cs{namelst}. To facilitate processing of \cs{namelst} +\cs{lst} has been inserted before each name in the list. +\beginverbatim +\newtoks\namelst +\def\lst#1#2{\namelst\ea{\the\namelst\lst#1}} +\input lit.dat +%and to verify the contents +\baselineskip12pt plus2pt minus1pt +\lineskip1pt plus 1pt minus1pt +\def\lst#1{{\tt\string#1}\endgraf} +\the\namelst +!endverbatim + +\exercise When a reference has been added to lit.dat a simple check + for verifying that the file can still be processed is + the following. What would you expect as outcome? + +\begincenterverbatim +\input blue.tex +\references\zusek +\zusek +\bye +!endcenterverbatim +\answer The number 1. Once the reference has been found, + it will be used, and the name will be + overwritten by its sequence number. + +%end answer + +\bluesubhead Check for data integrity + +After a reference has been added one can check whether the file can be scanned by +\TeX{} via making a table of contents as follows. +\begincenterverbatim +\input blue.tex +\contentsdatabase{lit} +\bye +!endcenterverbatim +This script produces no pages of output (that is OK). +The file contentslit will be created, though. +If you have a file with references of your own, +say abc.dat, provide also \cs{newwrite} \cs{tocabc}. + +\bluehead Customization + +Each entry is typeset by \cs{ls} which is activated by ^|\lsams| +in \cs{references}. +The default formatting has been inspired upon AMS. + +\bluesubhead How to provide your way of formatting? + +To illustrate how a user can specify his own convention +\bluetex{} contains the template +\begincenterverbatim +\def\lsstraight{\let\ls\nitem} +!endcenterverbatim + +\blueexample Formatting references your way + +Provide your variant of \cs{lsstraight} and supply +^^{formatting\ references} +\begincenterverbatim +\thisreferences{\let\lsams\lsstraight}. +!endcenterverbatim + +\bluehead Searching the lit.dat database by pattern + +^^{search\ of\ database} +BLUe's format provides a \cs{search} macro with +as argument a search pattern. +The purpose is to search the database file provided in +the toks variable \cs{searchfile}, +for this search pattern. +The result of the search is the list of names of which +the replacement texts contain the search pattern. +This list of names is delivered in the toks var \cs{namelist}, +and for the time being they are also written to the log file. + +\blueexample Search for references of {\oldstyle1973} in lit.dat + +In order to justify my use of the word +database in relation to \TeX, I provided the search macro +to browse the databases lit.dat and address.dat. +Below the input and result have been given of the search of lit.dat +for the pattern {\oldstyle1973}. +The result is contained in the toks variable +\cs{namelst}. The names are also written to the log file +to give you a check for whether the right names have been selected. + +\begindemo +\input blue.tex +\searchfile{lit} +\search{1973} +\bye +!yields +\cs{lst}\cs{knuthdec} +\cs{lst}\cs{schumacherefa} +\cs{lst}\cs{wirthna} +\enddemo +Remarks. A search pattern should not contain a period. + The search is case sensitive. +\endinput diff --git a/info/laan/pwt/pwt.scr b/info/laan/pwt/pwt.scr new file mode 100644 index 0000000000..54c6366648 --- /dev/null +++ b/info/laan/pwt/pwt.scr @@ -0,0 +1,452 @@ +%Copyright: C.G. van der Laan, cgl@rc.service.rug.nl, 31 59462 1525 +%Started 22 November, 1994 %Version September 1995 +\input blue.tex +%Conventions +%-Titles of other work (also references by name to chapters) within single quotes +%Spelling +%-alphabetically or lexicographically +%-appendices, contrast with prefixes, suffixes, affixes +%-ascertain +%-BLUe's format, BLUe script, blue.tex +%-cross-referencing +%-controlled (l always doubles) +%-developed +%-flavour, favour +%-file name, not filename, similar type name +%-govern +%-macro writing +%-mark up (verb), the markup (noun) +%-occasionally +%-one pass and one-pass job (similar two-part macro; in line in-line text +% on line on-line documentation) +%-open-ended, open-endedness +%-page number, page size +%-parenthesize +%-rhombus-framed, similar pseudo-code +%-setup (similar to markup (noun)) +%-shortcut +%-size-switching macros (not size switching) +%-user's guide (not user guide, nor users' guide) +%-user-friendly +%-uppercase letters (similar lowercase), upperright corner +%-word processor + +\loadsmileys%Not necessary per se, but now these are globally available +\loadindexmacros +\report %Format to be selected from the fmt.dat database + +\bluetitle Publishing with \TeX %Cover data + +\bluesubtitle BLUe's Selection + +\bluepictures \bluemodelpic + +\def\coverpic{\qquad\qquad\bluemodelpic} +%\translator{Irina Gorbunova} + + %Inside cover data +\bluekeywords Bibliography, \bluetex{}, + citations, compatible extension, cross-referencing, customization, + databases, data integrity, education, fractals, + index, letter, manmac, mark up, math, minmal markup, pictures, no-nonsense, + plain \TeX, programs, publishing, + report, reuseable software parts, + software engineering, supprematism, + tables, table of contents, table of examples, transparencies, trees, turtle graphics, + verbatim. + +%endkeywords + +\bibliographydata{ISBN: \dots\par + Classification: \dots\par + Date: September {\oldstyle1995} +}%end bibliography data + +\beginacknowledgements +First of all + $$\hbox{Don Knuth, Thank You!}$$ +for what you gave to the world, and to me in particular. +I enjoyed so much studying your \TeX{} works. +I never perused a book so many times as \TB. + +I owe many thanks to numerous anonymous people +who contributed to my \AllTeX{} knowledge. +I'm very grateful to NTG for bringing out early notes in MAPS, +and to Erik Frambach and Wietse Dol for disseminating +BLUe's Format system on the 4All\TeX{} CD-ROM. +With pleasure I look back at Bacho\TeX{} {\oldstyle 94}, where among +others Bogus\l aw Jackowski stimulated me to work on a manmac user's guide. +This emerged in BLUe's Format system and fitted well with my ideas about +a `Publishing with you-name-it' series. + +The macros and styles of the \TUG, and the \AMS{} have been very inspiring. +Of the former I borrowed the abbreviations and the approach of the OTR. +The latter inspired me how to format references. +I'm not aware to what extent the excellent user and installation guides of +the AMS have influenced me. I like those for sure. +Amy Hendrickson made me familiar with two-part macros. +Amy's \cs{diagline} macro is part of \bluetex, although +it is not much used by other macros, because of \LaTeX's line fonts. +David Salomon's courseware has been a wealthy source, especially for +macro writing. +Phil Taylor familiarized me with sequences of \cs{expandafter}s. +His \cs{ignorewhitespace} has been incorporated in \bluetex. +Bernd Raichle mentioned en-passant how to look at triples of \cs{noexpand}s. +Joseph Romanovsky stressed the importance of memory management, which resulted +in the general database approach. +Frans Goddijn made me appreciate the frisky \cs{oldstyle} numbers. +My perception of compuscripts has its roots in the SGML world. +And, of course, I learned a lot from \LaTeX. + +Frank Poppe, Eric Veldhuyzen, and Jos Winnink, thank you +for proofreading and for the useful comments. +Peter Frambach polished my use of English.\ftn{Any abuses left have to do + with later versions he did not see.} +Erik Frambach, again, was of great help in the proofing phase. +Many a suggestion with respect to the layout was prompted by him. +Irina Gorbunova%\the\translator +, my host when attending CyrTUG {\oldstyle93}, {\oldstyle94}, +translated the script into Russian. + +Last but not least thank you Ina Kooi for your friendship, support +and patience. +\medskip +\rightline{\vbox{\noindent\hsize.4\hsize I'm grateful to all of you.}} +\endacknowledgements + + %Title page data (next to title&author) +\beginabstract +The use of BLUe's format has been documented in a user's guide, +to be released electronically in English and in Russian. +\par +The functionalities provided are similar to those of \LaTeX, to mark up +a note, an article, a set of transparencies, a report, and a letter. +The attitude is much different though. An example of the +latter is processing of a modest index in one pass, +completely within \TeX, on-the-fly. +\par +The concept of two clusters of markup tags is introduced, +called the outer level markup tags and the inner level markup tags. +The former are responsible for the look-and-feel, +and are kept to a minimum to cope with the inevitable change. +The latter constitute the lower level issues, and are aimed at stability, +invariance of representation and implementation, much in the spirit of +the frozen kernel of \TeX. +\par +Many examples, exercises and answers have been included. +\par +The basic attitude has been to make \TeX{} +simpler to use, to let it look less confusing. +To select from the multitude of commands a handful, and to +elucidate what we need most of the time. +\par +New details treated are: +the script concept, +the separation of outer and inner level markup, +using databases\Dash + formats, tools, references, pictures, and addresses\Dash +in a one-pass job with \TeX, +macros to format Pascal programs, +a verbatim suite of macros to cooperate with Any\TeX, +selective line-numbering of verbatims, +a compatible extension of math cross-referencing, +some matrix icons, +a compatible extension of \cs{equalign} with multi-alignment points, +a simple approach to formatting of partitioned matrices, +a refined bordered table macro with the awareness of logical +rows and columns and attributes to control layout, +various codings of deterministic tables, +a new look at manmac's \cs{samplebox}, +creation of a modest index in one pass, +design of a report format on top of \bluetex, and +last but not least +a uniform coding approach to start from two-part macros and +to build one-part macros on top of those, parameterized +by |\this<tag>|, |\every<tag>|, |\pre<tag>|, |\post<tag>|, and +occasionally |\<tag>name|. + +I have built upon manmac and gkppic, and developed most of the macros myself. +Ideas have been borrowed from the styles of TUG, AMS, from the +proceedings of the Euro\TeX{} and TUG meetings, +and from the articles in the bulletins of the various user groups. +Of course, many an idea came to mind when talking to friends at the various +\TeX{} User Group meetings. +The markup of examples released earlier has been improved, simplified, +or made more consistent. +\endabstract + %Foreword translator data +\beginforewordtranslator + +This guide is about BLUe's Format, aimed at +formatting documents in English via plain \TeX. +\medskip +What do we mean by a translation? +\medskip +For the time being it is just a translation of the +English into Russian, {\sl not\/} a transliteration +of the contents. +The latter entails that an index in Russian +is {\sl not\/} generated on the fly. +Another consequence is that this guide +is {\sl not\/} about the use of Cyr\TeX. +\medskip +Hopefully, the future will give birth to a real +Russian BLUe's Format project. +\endforewordtranslator + %Preface page data +\beginpreface +\vskip2\bigskipamount +Dear User, +\bigskip +It occurred to me that my detailed studies +as published in NTG's MAPS, such as +the BLUes series\Dash Manmac, TUGboat, AMS\Dash +did not attract the attention it deserved, \winksmiley, +let alone that people read it. +They simply lack the time. +Similarly, the BLUe's series enjoys a modest audience. +Most \TeX ies are just busy using \LaTeX. +Therefore, `Publishing with \TeX,' PWT for short, is not so much about +reading, but has all to do with using. + +My experience in macro writing comes from +perusing Knuth's books, +attending Amy's and David's advanced \TeX{} classes, +looking into the works of colleagues, +and inevitably experimenting. +The fundamental macro writing \TeX niques I have assimilated +will be reported in NTG's MAPS, in +backside of the envelope contributions, +in what I call the Paradigm series. + +BLUe's format, its extensions and this user guide +`Publishing with \TeX,' are shareware available,\ftn{I would welcome + \$\thinspace{\oldstyle25} from each happy user, + to facilitate investment in hardware to maintain the format. + The PWT booklet alone is worth it \smiley. + Of course, you will be added to my address database with filed + \cs{registeredbluetrue}. Do provide + complete affiliation, email included. Users in Russia can just send me + a nice mail with their affiliation for the time being.} +and will be distributed electronically +on diskette, via NTG's CD-ROM, or +can be plucked from the CTAN. +The relation between the various BLUe's articles and PWT is that the latter +is a user's guide, while the former explain the coding too, +are about the whys-and-hows, about insights and hindsights. +However, remember that PWT is not an introduction to \TeX{} +nor a treatise on macro writing. + +PWT has been available in February {\oldstyle 1995}, in English. +A version in Russian is scheduled to be released +before Euro\TeX\ {\oldstyle95}, and CyrTUG {\oldstyle95}. +For the latter I'm dependent on my host for my various stays in Moscow, +Irina Gorbunova%\the\translator +, who volunteered to translate the work. + +My aim has been to make PWT as useful as possible, +even for those who don't intend to use \bluetex. +Numerous examples show how to mark up in \TeX{} +various typographic challenges known in the computer-assisted +information processing and dissemination world. +The above does not imply that the PWT script can't be printed. +No, not at all, it can, and you will be surprised, hopefully, by the +thin booklet of {\oldstyle125} odd pages, +which will come off your selfpublishing press, some day. + +I strove for a logically and physically thin system. The user's guide +is physically thin and even thinner logically. If you are not interested +in the math markup, just skip the chapter. Within a chapter examples +can be skipped of course. The chapters are independent with `thin' +interrelations. The files, especially the databases, allow you to +load only what you need. + +The layout has been kept simple. The page width has been determined by my +MAC screen. A large page length is there to reduce the number of +pages and to prevent underfull vboxes. The primary medium is a file, +not a book. + +For future releases, I intend to include `markup pearls' from readers. +In the meantime, I'm pondering about hyperlinking the script to the +\TeX book script, and acquainting myself with \MF{} and +{\manual META}\-{\smc post}. +Another challenge, but fun. +For the time-being, a printed version of PWT, +with the \TeX book at your elbow, or with windows open +on each of the files needed, will hopefully ease your \TeX ing task. +If not, let me know\dots\thinspace And for the rest + +\displaycenterline{let us \TeX{} with confidence} + +I hope that my approach to publishing with \TeX +\Dash a result of some {\oldstyle7} years of \TeX{} use and of some + {\oldstyle20} years of programming numerical software\Dash +will be beneficial to new and old \AllTeX ies alike. +\bigskip +\rightline{Kees van der Laan} +\endpreface + %Contents Page data + %Because of \valign use, \contents{...} +\let\he\quad \let\she\qquad\def\sshe{\qquad\quad}%not possible. +\begincontents +Preface +Table of contents +Introduction +\he Understanding Knuth's markup +\he BLUe's format +\she The syntax +\she Variants +\he The Model +\he Notations and definitions +\he Markup conventions adopted +\he Copyrights BLUe's format +\separator +Text +\he Introduction +\he Headings +\he Paragraphs +\she Parameterization +\she Special paragraphs +\she Customization +\he Use of special text elements +\she Items +\she Centering +\she Quotations +\she Non-centered displays +\she Setting text apart +\she Pascal programs +\she Syntax diagrams +\she Verbatims +\she Exercises and answers +\she Footnotes +\he Fonts and size switching +\he Table of Contents +\separator +Mathematics +\he What is the problem, Doc? +\he The extras +\he Use +\she Plain's display maths +\she A snapshot of examples +\separator +Tabular material +\he Bordered table +\she Model +\she Markup tags +\she Customization +\he Use of btable macro +\he Kaleidoscope +\she Font charts +\separator +Pictures +\he The roots +\he Creating pictures +\she Turtle Graphics +\she \TeX's stacking of boxes +\she Samplebox diversions +\she Picture environment +% +\newcol +% +\sshe Line thickness +\sshe Picture objects +\sshe Curves +\he Adding a picture to pic.dat +\he Using pictures +\he Fractals +\separator +Coping with References +\he Using references +\he Cross-referencing +\he Adding a reference to lit.dat +\he Customization +\separator +Creating an Index +\he Use +\he Markup of IR-s +\she Syntax +\she Markup +\she Spaces +\he Special tokens +\she Sorting keys +\he Ordering +\he Typesetting the index +\he Customization +\she Adding tokens to be ignored +\she Modifying ordering +\she Enriching the index +\she Typesetting the enriched file +\she Processes and files +\separator +Customization +\he Changing look-and-feel +\she The page size +\she The header and footer +\she Section beginnings +\he BLUe script into MAPS +\he Other languages +\separator +Afterthoughts +\separator +Appendices +A: Answers to the exercises +B: Formats +\she Use +\she Concert +\she Letter +\she Report +\she Transparencies +C: Tools +D: BLUe's, BLUes and Paradigms +E: List of Examples +F: Main Tags +G: Obsolete database +H: History of Changes +I: Index +J: Table of Contents +\endcontents + +\let\backcover\pwtbackcover +\beginscript %BLUe script proper +%The next three have been included in +%\report to facilitate mini-ToCs +%\immediate\openout\ans=answers +%\immediate\openout\toe=examples +%\immediate\openout\toc=contents +\input pwt.int %Introduction +%\pasteuptoe\pasteuptoc\endscript %test probe +\input pwt.txt %Text +%\setupappendices\pasteupanswers +%\sortindex\pasteupindex%\pasteuptoc%\endscript +\input pwt.mat %Mathematics +\input pwt.tab %Tabular material +\input pwt.grf %Pictures +\input pwt.ref %References +\input pwt.ind %Index preparation +\input pwt.cus %Customization +\input pwt.aft %Afterthoughts +%From now on A, B, C,... +%And in order not to disturb the current +%number, and its use +\setupappendices +\pasteupanswers +\input pwt.fmt %B: Formats +\input pwt.tls %C: Tools +\input pwt.sur %D: Backgrounds + %E: Table of examples +\pasteuptoe +\input pwt.tot %F: Table of tags +\input pwt.his %G: History of changes +\input pwt.obs %H: Obsolete macros + %I: Index +\sortindex +\preindex\ea{\the\preindex + In this index \cs{end}$<tag>$s + have been excluded, only the \cs{begin}$<tag>$s are there.} +\pasteupindex + %J: Table of contents +\pasteuptoc +\let\backcover\pwtbackcover +\endscript + + diff --git a/info/laan/pwt/pwt.sur b/info/laan/pwt/pwt.sur new file mode 100644 index 0000000000..32966e8cb8 --- /dev/null +++ b/info/laan/pwt/pwt.sur @@ -0,0 +1,139 @@ +\input blue.tex \report \hfuzz40pt% I allow overflow + +\bluechapter Blues, BLUe`s \& Paradigms + +\beginsummary +The BLUe's format material and accompanying articles, which explain details +and show examples, have been listed. +\endsummary + +Originally this note was sent along with \bluetex{} +to inform a user about background and related articles. +\TB{} is assumed to be omni-present. +For other references consult lit.dat. + +\bluehead The files + +BLUe's format has been organized as a `kernel with modules.' +The files are named as follows. +{\parindent4.5\generalindent +\item{the format} \hbox to21ex{\bf \bluetex\hss} the kernel +\item{the databases} +\vtop{\noindent\advance\hsize-1.1\parindent + \hbox to21ex{\bf fmt.dat\hss} the formats\\ + \hbox to21ex{\bf tools.dat\hss} the macros and environments\\ + \hbox to21ex{\bf address.dat\hss} the addresses\\ + \hbox to21ex{\bf lit.dat\hss} the references\\ + \hbox to21ex{\bf pic.dat\hss} the pictures\\ + \hbox to21ex{\bf obsolete.dat\hss} obsolete macros and formats. +}\smallskip} +A handy auxiliary is pfile\Dash and the more general pgfile\Dash +to print \bluetex{} with appropriate line numbers in two-column layout. +The general macro prompts for the file name. It is suited to print +\bluetex, tools.dat, or fmt.dat, all with the appropriate line numbers. + +This `Publishing with \TeX' is the user's guide. + +No profit may be made on it. The articles are free for personal use. +The files are shareware.\ftn{When you are happy with it and wish to support + maintenance, send me \$ {\oldstyle25} to support my hardware, to maintain + BLUe's format system. Of course you will be added to my register.blu database. + Users from Russia can just send me their address, for the time being.} + +When the results are used a proper credit\Dash + be it Knuth or the authors of gkpmac, + or me for the composition and the fill-ins\Dash +is the least a happy publishing user can do. + +\bluehead Background + +\begindisplay +BLUe's Format\Dash The best of both worlds + &The umbrella article about \bluetex. \hidewidth\cr +BLUe's Graphs\Dash Simplicity, aha! + &The gkppic macros are explained. \hidewidth\cr +BLUe's Cross-Refs\Dash A one-pass approach + &One-pass cross-referencing with math.\hidewidth\cr +BLUe's Bibliography\Dash Selective loading + &One-pass bibliography handling. \hidewidth\cr +BLUe's Verbatim\Dash The selection + &Handling verbatims in TeX. \hidewidth\cr +BLUe's Transparencies\Dash To finish up with + &The making of transparencies. \hidewidth\cr +BLUe's Index\Dash The principle and some more + &The making of indexes in a one-pass job.\hidewidth\cr +BLUe's Typesetting of PASCAL\Dash Mean and lean + &The formatting of PASCAL programs. \hidewidth\cr +BLUe's Letters\Dash With love + &The formatting of letters. \hidewidth\cr +BLUe's Reports\Dash Good work + &The formatting of reports. \hidewidth\cr +BLUe's Format databases + \Dash Stay organized&The database approach explained. \hidewidth\cr +BLUe-2-|<younameit>| + &Acceptance and conversion. \hidewidth\cr +Math into BLUes &The typesetting of math via \TeX.\hidewidth\cr +\quad I: Mourning \cr +\quad\llap II: Sing your song \cr +Icons via lfonts &Common matrix icons via \LaTeX's fonts.\hidewidth\cr +Table Diversions &The typesetting of tables via \TeX. \hidewidth\cr +Sorting in BLUe &The basics for making a simple index. \hidewidth\cr +FIFO and LIFO sing the BLUes\Dash Got it &FIFO paradigm, fundamental. \hidewidth\cr +Syntactic Sugar &Discusses various approaches to macros.\hidewidth\cr +`Van tekst naar transparant'&About the life-cycle of documents, + {\oldstyle1984}.\hidewidth\cr +BLUe-2-\LaTeX &Convertor Assistant, {\oldstyle1996}\cr +% +\noalign{\bluehead Related material\par} +% +Manmac BLUes &Is all about manmac, as-is. \hidewidth\cr +\quad\Dash Or how to typeset a book via \TeX \cr + +AMS BLUes &Details with AMS practice, \cs{lsams} for\hidewidth\cr +\quad\Dash Professionals at work + &\null\ formatting references is inspired upon AMS.\hidewidth\cr +TUGboat BLUes &TUGboat styles. ppt.tex emerged from this\hidewidth\cr +\quad\Dash How \TeX ies do it + &\null\ which is at the heart of \bluetex. \hidewidth\cr +% +\noalign{\medskip\noindent An overview is supplied in `What is \TeX{} and \MF{} + all about?' NLUUG, {\oldstyle1993}. + The relation with SGML is in `SGML(\TeX,\dots\thinspace),' + Cork {\oldstyle1990}. + The work of Michael Spivak has been surveyed in Spivak's \OE uvre. +% + \bluehead For fun\par +% + Added are the following, + which also show macro writing by example.\medskip} +% +Typesetting bridge via \TeX & \maps{91}2\hidewidth\cr +Typesetting crosswords via \TeX& \maps{92}2\hidewidth\cr +Tower of Hanoi, revisited & \maps{91}2\hidewidth\cr +% +\noalign{\bluehead The Paradigm series\par} +% +Paradigm: Plain's \cs{item} extended & \maps{94}2\hidewidth\cr +Paradigm: Headache? & \maps{94}2\hidewidth\cr +Paradigm: Two-part macros & \maps{95}1\hidewidth\cr +Paradigm: Parameterization I \hidewidth\cr +\phantom{Paradigm: }\Dash Options & \maps{95}1\hidewidth\cr +Paradigm: Winds and halfwinds \hidewidth\cr +\phantom{Paradigm: }\Dash Details matter & \maps{96}1\hidewidth\cr +Paradigm: It's all in the game & \maps{96}1\hidewidth\cr +Paradigm: Loops & \maps{96}2\hidewidth\cr +Paradigm: Searching & \maps{96}2\hidewidth\cr +Paradigm: Sorting & \maps{96}2\hidewidth\cr +Paradigm: Naming conventions & \maps{97}?\hidewidth\cr +Paradigm: Alignment & \maps{97}?\hidewidth\cr +Paradigm: Eating and preserving & \maps{97}?\hidewidth\cr +\enddisplay +Of course all the articles run up till {\oldstyle1995}, with BLUe's format +in plain TeX. + +\bluehead Availability + +It is disseminated on NTG's 4All\TeX{} CD-ROM (edition {\oldstyle1995}), and +the most recent versions can be plucked from a CTAN in directory +pub/archive/info/pwt/\dots +\endinput
\ No newline at end of file diff --git a/info/laan/pwt/pwt.tab b/info/laan/pwt/pwt.tab new file mode 100644 index 0000000000..43a535c135 --- /dev/null +++ b/info/laan/pwt/pwt.tab @@ -0,0 +1,1875 @@ +\input blue.tex \loadindexmacros \report \hfuzz15pt + +\bluechapter Tabular Material + +\beginsummary +BLUe's format provides btable for the class of (simple) bordered tables. +It will be shown that this model can be used to format a wide variety +of tables. +Difference in representation can be obtained via attributes, i.e., +without changing the markup. +Customization of the macro can be done by modification of the separators +for the caption, the columns, and the like. +The diversity of tabular material in general has been illustrated by +a kaleidoscope of tables borrowed from literature. +For the latter group the markup is not necessarily restricted to +btable or halign. +The example of how Knuth marked up real-life tables is illustrated by +his font charts. +\endsummary + +The backbone of \bluetex's tables is |\btable|, to format a bordered table. +Other \TeX niques for formatting tables will be dealt with too. +The formatting of tables with simultaneous row and column spans +is a subject for the `educated layman,' not for the faint-hearted. + +\bluehead Bordered table + +A bordered table consists of +a caption, +a header, +row stubs, +a table proper, and +a footer, all with parameterized separators. +Special cases occur when some of the elements are absent. + +Abstraction from a ruled and a non-ruled table is realized at +the user level. +Ruled can be specified either as horizontal, vertical or both. +Dotted rules, also the partial ones, can be specified. +No variation in the line thicknesss has been coded. +Framing has been treated just as if a general document element +has to be framed. +I chose to leave the caption and the footer outside the frame.\ftn{However, + we can frame any document element, can't we?} +The positioning of the elements can be specified as +centered, flushed left, or flushed right. +A ^{template} is provided by default. +Caption, border (first, header, row stubs), and footer can be specified; +all mutual orthogonal and independent of \cs{data}. +^^{bordered table model} + +\bluesubhead Model + +{\def\btablecaption{$\leftarrow$\hfill C a p t i o n\hfill$\rightarrow$} +\def\first{\hbox to6ex{\hss First\hss}} +\def\header{\hbox to18ex{\hss Header\hss}} +\def\rowstblst{{\hfil$\vcenter to20ex{\vss\offinterlineskip + \fifo rowstblst\ofif\vss}$}} +\def\data{$\vcenter{\offinterlineskip\hbox{Table}\kern1ex\hbox{Proper}}$} +\def\footer{$\leftarrow$\hfill{\small F o o t e r}\hfill\hfill\hfill$\rightarrow$} +\def\fifo#1{\ifx\ofif#1\ofif\fi\process{#1}\fifo}\def\ofif#1\fifo{\fi} +\def\process#1{\hbox to0pt{\hss#1\hss}\kern.5ex} +\nonframed +$$\vcenter{\btable\data}$$ +}%end scope +\TeX nically caption and footer are \cs{hbox}-es and table proper is an \cs{vbox}. +The separators of caption and footer are default \cs{medskip} and \cs{smallskip}. + +\bluesubhead Markup tags + +\bitem tags ^|\beginbtable| and |\endbtable|, or the shortcut |\btable|, + and the column and row separator ^|\cs|, and ^|\rs| +\bitem defs to be redefined ^|\btablecaption|, ^|\first|, + ^|\header|, ^|\footer|, ^|\rowstblst|, + (all defined empty by default) +\bitem table markup tags, ^|\logms|, ^{logical multispan} to + span a number of {\em logical\/} columns +\bitem attributes +\itemitem{--} ^|\ruled|, ^|\hruled|, ^|\vruled|, ^|\dotruled| \hfill + Default:\hbox to13ex{\hfil^|\nonruled|} +\itemitem- ^|\framed|, ^|\dotframed| \hfill + Default:\hbox to13ex{\hfil^|\nonframed|} +\itemitem- ^|\fll| (flushed left), ^|\flr| (flushed right) \hfill + Default:\hbox to13ex{\hfil^|\ctr|} +\bitem token variables ^|\prebtable|, ^|\postbtable| for positioning +the table within the context.{\parindent0pt\ftn{In practice the math display is used + most of the time.}} +\smallbreak + +By the way the above model is an example of the markup +of a bordered table.\ftn{Admittedly a little complicated. Simpler + examples will follow.} +The markup reads as follows. + +\beginverbatim +\def\btablecaption{$\leftarrow$\hfill C a p t i o n\hfill$\rightarrow$} +\def\first{\hbox to6ex{\hss First\hss}} +\def\header{\hbox to18ex{\hss Header\hss}} +\def\rowstblst{{\hfil$\vcenter to20ex{\vss\offinterlineskip + \fifo rowstblst\ofif\vss}$}} +\def\process#1{\hbox to0pt{\hss#1\hss}\kern.5ex} +\def\data{$\vcenter{\offinterlineskip\hbox{Table}\kern1ex\hbox{Proper}}$} +\def\footer{$\leftarrow$\hfill{\small F o o t e r}\hfill\hfill\hfill + $\rightarrow$} +$$\vcenter{\btable\data}$$ +!endverbatim + +\thissubhead{\runintrue} +\bluesubhead Customization\par +\cs{$\langle X\rangle$sep} are parameters, +which govern the kind of ^{separators}. +The following are defaults to be customized. + +\beginverbatim +\def\cellsize{\cvsize=4ex\tsht=.775\cvsize\tsdp=.225\cvsize} +\def\colsepsurround{\kern.5em}\def\captionsep{\medskip}\def\rowstbsep{\vrule} +\def\headersep{\hrule}\def\footersep{\smallskip}\def\template{} +!endverbatim + +The positioning of the elements in the cells is parameterized +by \cs{lft} and \cs{rgt}. They are equal to \cs{hfil} by default. +A nice application is to make these equal to \$ in such a way that data +can be processed in math mode. + +The empty template looks curious. +The explanation is: when empty\Dash i.e., a user did not provide one\Dash +a standard template will be used. + +\vfill\eject +\bluehead Use of btable macro + +There are some pitfalls that I know of and that +a user might like to be aware of. ^^{btable, pitfalls} +\bitem When \cs{header}, \cs{footer} and the like are defined + they keep their value. + So when you don't have a header in the next table, be sure that + this definition is empty. +\bitem Most of the time I used definitions with \cs{btable} instead of + token variables. Beware. +\bitem To specify the row stub list separately from the data might yield + a first column and a data part of unequal size. +\bitem The ^|\cs| is ambiguous. In \bluetex{} it has the function to + yield the argument as control sequence, while within btable + the meaning is the column separator. +\bitem When verbatims are also part of the data process the table on the + fly via \cs{beginbtable} \dots\thinspace \cs{endbtable}. However, + there is a problem when the header and footer have to be processed + on the fly too. +\bitem In the markup of the table in the appendix `History of + Changes,' the problems are the right line distances in a \cs{vtop}. + The latter as element in the table. + It is caused by the \cs{tstrut}, table strut, + which is inserted at the end of each table row. + See the script how to circumvent this problem. +\bitem The attribute \cs{dotruled} is not so general as \cs{ruled} + or \cs{vruled}, because we lack the primitive \cs{vdotfill} + as a dotted alternative for \cs{vrule}. + For horizontal rules \TeX{} provides the primitives + \cs{hrule} with the dotted variant \cs{dotfill}. +\smallbreak + +In the examples of use below the invocation of \cs{data} could have been +hidden. +However, in order to remain compatible with the situation where a user +wishes to forget about \cs{data} and provide the table entries directly +as argument to \cs{btable}, I refrained from that. + +\blueexample Just data, magic squares + +$$\def\data{2\cs7\cs6\rs + 9\cs5\cs1\rs + 4\cs3\cs8} +\vcenter{\framed\ruled\btable\data}\qquad\qquad\qquad + \def\data{16\cs 3\cs 2\cs13\rs + 5\cs 10\cs 11\cs 8\rs + 9\cs 6\cs 7\cs12\rs + 4\cs 15\cs 14\cs 1} + \def\template{\colsepsurround\lft{\oldstyle##}\rgt + &&\lft##\rgt&\lft{\oldstyle##}\rgt\cr} + \ruled\framed\setbox0=\btable\data%for measuring sizes + \vcenter{\dotruled\dotframed\btable\data}\qquad$$ +via +\begincenterverbatim +$$\def\data{2\cs7\cs6\rs + 9\cs5\cs1\rs + 4\cs3\cs8} +\vcenter{\framed\ruled\btable\data}\qquad\qquad\qquad + \def\data{16\cs 3\cs 2\cs13\rs + 5\cs 10\cs 11\cs 8\rs + 9\cs 6\cs 7\cs12\rs + 4\cs 15\cs 14\cs 1} + \def\template{\colsepsurround\lft{\oldstyle##}\rgt + &&\lft##\rgt&\lft{\oldstyle##}\rgt\cr} + \ruled\framed\setbox0=\btable\data%for measuring sizes + \vcenter{\dotruled\dotframed\btable\data}\qquad$$ +!endcenterverbatim +Remark. To introduce the ^|\oldstyle| elegantly I added +a template for the ^|\halign|. For doing this, awareness of +the physical columns is needed. Logically we are talking about +a {\oldstyle3}${*}${\oldstyle3} and {\oldstyle4}${*}${\oldstyle4} table. +Note that for dotted variants much more work has to be done. + +\blueexample Data plus header, \TB{} {\oldstyle246} + +^^{data with header} +$$\def\header{\hfill Year\hfill\cs + \hfill World Population\hfill} +\def\data{8000 B.C.\cs 5,000,000\rs + 50 A.D.\cs200,000,000} +\flr\nonframed\vruled\vcenter{\btable\data}\qquad + \ruled\vcenter{\framed\btable\data}$$ +via the nearly descriptive markup + +\beginverbatim +\def\header{\hfill Year\hfill\cs \hfill World Population\hfill} +\def\data{8000 B.C.\cs 5,000,000\rs 50 A.D.\cs200,000,000} +$$\flr\vruled\vcenter{\btable\data}\qquad\ruled\framed\vcenter{\btable\data}$$ +!endverbatim + +\exercise How come that the left table contains a \cs{hrule}? +\answer The header separator is not influenced by the ruled + attributes. + +\blueexample Data with row stubs, \TB{} {\oldstyle232} + +^^{data with row stubs} +\nonruled\nonframed\ctr%defaults +\begindemo +\def\rowstblst{{Horizontal lists} + {Vertical lists}{Math lists}} +\def\rowstbsep{}%Customization +\def\data{Chapter 14\rs + Chapter 15\rs + Chapter 17} +$$\btable\data$$ +!yields +\def\rowstblst{{Horizontal lists} + {Vertical lists} + {Math lists}} + \def\rowstbsep{} + \def\data{Chapter 14\rs + Chapter 15\rs + Chapter 17} +\btable\data +\enddemo + +\exercise How can we obtain the same table without the use of \cs{rowstblst}? +\answer Just consider all as data. +\beginverbatim +Alternative +\def\data{Horizontal lists \cs Chapter 14\rs + Vertical lists\hfill\cs Chapter 15\rs + Math lists\hfill \cs Chapter 16} +$$\btable\data$$ +!endverbatim + +%end exercise + +\blueexample Data, row stubs, header, caption and footer + +^^{data with header, row stubs, caption and footer} +\nonruled\nonframed +$$\def\data{11\cs12\rs + 21\cs22} + \vcenter{\framed\btable\data} \qquad + \def\header{\logms2\hfill Header\hfill} + \def\rowstblst{{$1^{st}$ row} + {$2^{nd}$ row}} + \vcenter{\btable\data} \qquad + \def\btablecaption{Caption} + \def\footer{Footer} + \vcenter{\dotruled\btable\data} \qquad + \vcenter{\ruled\framed\btable\data} +$$ +after data definition, |\def\data| |{11\cs12\rs| |21\cs22}|, +via\ftn{Note the invariance of the + {\tt\char92data} specification.} +\begincenterverbatim +$$\vcenter{\framed\btable\data} \qquad + \def\header{\logms2\hfill Header\hfill} + \def\rowstblst{{$1^{st}$ row} + {$2^{nd}$ row}} + \vcenter{\btable\data} \qquad + \def\btablecaption{Caption} + \def\footer{Footer} + \vcenter{\dotruled\btable\data} \qquad + \vcenter{\ruled\framed\btable\data}$$ +!endcenterverbatim +The above example shows in a nutshell the essential possibilities of +the \cs{btable} macro. It is my favorite, although other nice +and powerful examples are still to come. + +\blueexample Walter's spreadsheet, \TB{} {\oldstyle244} + +No preamble has to be defined. ^^{spreadsheet} +$$ +\def\data{1\cs\logms2Adjusted gross income \dotfill\cs \$4,000\rs + 2\cs Zero bracket amount for \rs + \cs a single individual \dotfill\cs\hfill\$2,300\cs \rs + 3\cs Earned income \dotfill\cs + \hfill\underbar{ 1,500}\cs \rs + 4\cs\logms2Substract line 3 from line 2 + \dotfill\cs\hfill\underbar{ 800}\rs + 5\cs Add lines 1 and 4. Enter here \rs + \cs\logms2and on Form 1040, line 35 \dotfill\cs\$4,800} +\def\colsepsurround{\kern.5ex}\cvsize=3ex +\fll\btable\data +$$ +The above is marked up, as a 4-column table, via +\beginverbatim +\def\data{1\cs\logms2Adjusted gross income \dotfill\cs \$4,000\rs + 2\cs Zero bracket amount for \rs + \cs a single individual \dotfill\cs\hfill\$2,300\cs \rs + 3\cs Earned income \dotfill\cs + \hfill\underbar{ 1,500}\cs \rs + 4\cs\logms2Substract line 3 from line 2 + \dotfill\cs\hfill\underbar{ 800}\rs + 5\cs Add lines 1 and 4. Enter here \rs + \cs\logms2and on Form 1040, line 35 \dotfill\cs\$4,800} +\def\colsepsurround{\kern.5ex}\cvsize=3ex +$$\fll\btable\data$$ +!endverbatim + +\blueexample Spreadsheet digression + +It happens that tables\Dash read budgets\Dash set by \AllTeX{} suffer from +a simple addition flaw. +Can't we add a {\em little\/} spreadsheet functionality to \TeX, i.e., +let \TeX{} do the additions?\ftn{Courtesy + Phil Taylor's Trigonometry \TeX, for the idea to use dimen vars and + how to remove the pt. + Remember that \TeX{} allows {\oldstyle16} bit fixed-point arithmetic. + It is limited to absolute values $<$ {\oldstyle16384}.} +\begingroup +\newdimen\a\newdimen\b\newdimen\c +\begindemo +\def\data{r1\cs \ass\a{1.23} \rs + r2\cs\ubp{\ass\b{4.56}}\rs + \cs\cs\sumup{\a\b}\global\c\dimen0\rs + \cs\cs\ubm{\ass\a{3.14}}\rs + \cs\cs\minus\c\a} +$$\btable\data$$ +!yields +\def\ass#1#2{\global#1=#2pt#2} +\def\sumup#1{\global\dimen0=0pt + \let\process\processsum\fifo#1\ofif} +\def\processsum#1{\global\advance\dimen0#1\relax} +\def\ofif#1\fifo{\fi\nodim\the\dimen0} +\def\minus#1#2{\global +\dimen0#1\global\advance\dimen0-#2 +\nodim\the\dimen0} +%\nodim, i.e. \xs, strips pt from +% dimension quantity +{\catcode`\p=12 \catcode`\t=12 + \gdef\xs#1pt{#1}} +\def\nodim{\expandafter\xs} +%\underbar extended by + and - +\def\ubp#1{\underbar{#1}\rlap + {\lower.8ex\hbox{\thinspace\small$+$}}} +\def\ubm#1{\underbar{#1}\rlap + {\lower.8ex\hbox{\thinspace\small$-$}}} +% +\def\data{r1 \cs \ass\a{1.23} \rs + r2 \cs\ubp{\ass\b{4.56}}\rs + \cs\cs\sumup{\a\b}\global\c\dimen0\rs + \cs\cs\ubm{\ass\a{3.14}}\rs + \cs\cs\minus\c\a} +$$\btable\data$$ +\enddemo +\endgroup +with auxiliaries +\beginverbatim +\newdimen\a\newdimen\b\newdimen\c +\def\ass#1#2{\global#1=#2pt#2} +\def\sumup#1{\global\dimen0=0pt\let\process\processsum\fifo#1\ofif} +\def\processsum#1{\global\advance\dimen0#1\relax} +\def\ofif#1\fifo{\fi\nodim\the\dimen0} +\def\minus#1#2{\global\dimen0#1\global\advance\dimen0-#2\nodim\the\dimen0} +%\nodim, i.e. \xs, strips pt from +% dimension quantity +{\catcode`\p=12 \catcode`\t=12 \gdef\xs#1pt{#1}} +\def\nodim{\expandafter\xs} +%\underbar extended by + and - +\def\ubp#1{\underbar{#1}\rlap{\lower.8ex\hbox{\thinspace\small$+$}}} +\def\ubm#1{\underbar{#1}\rlap{\lower.8ex\hbox{\thinspace\small$-$}}} +!endverbatim + +\blueexample Part of AAP's table, AAP {\oldstyle1989} + +Subtle is the header part and the alignments on the signs. ^^{AAP table} +\def\nl{\hfil\strut\break\strut} +{% +\catcode`?=\active \def?{\kern1.1ex} +% +\def\btablecaption{AAP's table:\qquad Job Changes + 1973--1980\hfill} +\def\rowstblst{{Texas}{Maryland}} +\def\header{\copy1\cs\copy2\cs\copy3} + \setbox1=\vtop{\noindent\hsize14ex + Gain/Loss of\nl hospitals \nl since 1973} + \setbox2=\vtop{\noindent\hsize13ex + Total No\nl + of CEO Job\nl + Changes\nl + 1973--90\strut} + \setbox3=\vtop{\noindent\hsize10ex + Survival\nl Rate of\nl CEO's} +\def\data{$+20$\cs---\cs22\%\rs + $+?5$\cs 42\cs24\%} +\def\footer{Source: David Kinzer, `Turnover etc.} +$$\btable\data$$ +}obtained via +\beginverbatim +\def\btablecaption{AAP's table:\qquad Job Changes 1973--1980\hfill} +\def\rowstblst{{Texas}{Maryland}} +\def\header{\copy1\cs\copy2\cs\copy3} +\def\data{$+20$\cs---\cs22\%\rs + $+?5$\cs 42\cs24\%} +\def\footer{Source: David Kinzer, `Turnover etc.} +$$\btable\data$$ +!endverbatim +with auxiliaries +\beginverbatim +\def\nl{\hfil\strut\break\strut} +\catcode`?=\active \def?{\kern1.1ex} +\setbox1=\vtop{\noindent\hsize14ex Gain/Loss of\nl hospitals \nl since 1973} +\setbox2=\vtop{\noindent\hsize13ex Total No\nl of CEO Job\nl Changes\nl 1973--90} +\setbox3=\vtop{\noindent\hsize10ex Survival\nl Rate of\nl CEO's} +!endverbatim +Remark. With longer footnotes put the text in a \cs{vtop}, +with \cs{hsize} set to \cs{thsize}.\ftn{The table proper is first set + in a box, and this box is measured yielding \cs{thsize} and \cs{tvsize}. + After this the \cs{header} and \cs{footer} are set using the + \cs{thsize}.} + +\blueexample AT\&T table diversions, \TB{} {\oldstyle247} + +Subtle is the alignment on the dot via the use of `?', \`a la Knuth, +and the |\llap\$|, and |\rlap*|. +^^{ATT table} +\def\rowstblst{} +{\def\btablecaption{AT\&T Common Stock\hfill} +\def\header{Year\cs Price\cs Dividend} +\catcode`?=\active \def?{\kern1.1ex} +\def\data{1971\cs41--54\cs\llap\$2.60\rs + 2\cs41--54\cs 2.70\rs + 3\cs46--55\cs 2.87\rs + 4\cs40--53\cs 3.24\rs + 5\cs45--52\cs 3.40\rs + 6\cs51--59\cs ?.95\rlap*} +\def\footer{* (first quarter only)} +$$\framed\vcenter{\vbox{\small\btable\data}}\qquad\qquad + \def\btablecaption{} + \def\header{\logms3 \hfil AT\&T Common Stock\hfil\rs + \hfill Year\hfill\cs\hfill Price\hfill\cs \hfill Dividend\hfill} + \vcenter{\flr\ruled\btable\data}$$ +} +via +\begincenterverbatim +\def\btablecaption{AT\&T Common Stock} +\def\header{Year\cs Price\cs Dividend} +\catcode`?=\active \def?{\kern1.1ex} +\def\data{1971\cs41--54\cs\llap\$2.60\rs + 2\cs41--54\cs 2.70\rs + 3\cs46--55\cs 2.87\rs + 4\cs40--53\cs 3.24\rs + 5\cs45--52\cs 3.40\rs + 6\cs51--59\cs ?.95\rlap*} +\def\footer{* (first quarter only)} +$$\framed\vcenter{\vbox{\small + \btable\data}}\qquad\qquad +% +\def\btablecaption{} +\def\header{\logms3 + \hfil AT\&T Common Stock\hfil\rs + \hfill Year\hfill\cs + \hfill Price\hfill\cs + \hfill Dividend\hfill} +\vcenter{\flr\ruled\btable\data}$$ +!endcenterverbatim + +\blueexample Pittman's deterministic multiplication table + +Typographically and in other programming languages a trifle. +In \TeX\ the coding matters. ^^{multiplication table} + +\def\header{} +\def\rowstblst{} +\def\btablecaption{}\def\first{}\def\footer{} +\newcount\rcnt \newcount\ccnt \newcount\tnum +\newcount\mrow \newcount\mcol +\rcnt1 \ccnt1 +\def\rows{\global\ccnt1 \cols \global\advance\rcnt1 + \ifnum\rcnt>\mrow\swor\fi\rs\rows} +\def\swor#1\rows{\global\rcnt1 \global\ccnt1 \fi} +\def\cols{\tnum\rcnt \multiply\tnum\ccnt \the\tnum + \global\advance\ccnt1 \ifnum\ccnt>\mcol\sloc\fi\cs\cols} +\def\sloc#1\cols{\fi} +% +\mrow2 \mcol3 $$\nonruled\nonframed +\vcenter{\btable\rows}\qquad\qquad +\def\first{$\times$} \def\header{\row} +\def\row{\the\ccnt\global\advance\ccnt1 + \ifnum\ccnt>\mcol\wor\fi\cs\row} +\def\wor#1\row{\fi} +\def\rowstblst{{Anything, non-empty}} +\def\nxtrs{\the\rcnt\rss} +\vcenter{\btable\rows}\qquad\qquad +% +\mrow3 \mcol4 \def\rowstblst{{Anything, non-empty}} +\framed\vcenter{\btable\rows} +$$ +via +\beginverbatim +\newcount\rcnt\newcount\ccnt\newcount\tnum\newcount\mrow\newcount\mcol +\rcnt1 \ccnt1 \mrow2 \mcol3 +\def\rows{\global\ccnt1 \cols \global\advance\rcnt1 + \ifnum\rcnt>\mrow\swor\fi\rs\rows} +\def\swor#1\rows{\global\rcnt1 \global\ccnt1 \fi} +\def\cols{\tnum\rcnt\multiply\tnum\ccnt\the\tnum\global\advance\ccnt1 + \ifnum\ccnt>\mcol\sloc\fi\cs\cols} \def\sloc#1\cols{\fi} +$$\mrow2 \mcol3 \vcenter{\btable\rows}\qquad\qquad +% +\def\first{$\times$} \def\header{\row} +\def\row{\the\ccnt\global\advance\ccnt1 \ifnum\ccnt>\mcol\wor\fi\cs\row} +\def\wor#1\row{\fi} %\def\rowstblst{{1}{2}}%Fully automated via the two defs + \def\rowstblst{{Anything, non-empty}} \def\nxtrs{\the\rcnt\rss} +\vcenter{\btable\rows}\qquad\qquad +% +\mrow3 \mcol4 %\def\rowstblst{{1}{2}{3}}%Fully automated via the two defs + \def\rowstblst{{Anything, non-empty}} \def\nxtrs{\the\rcnt\rss} +\framed\vcenter{\btable\rows}$$ +!endverbatim + +%Back to defaults +\def\header{}\def\rowstblst{}\def\btablecaption{}\def\first{}\def\footer{} + +\vfill\eject +\bluehead Kaleidoscope + +Some examples of special tables are given in order to illustrate the +diversity. The markup is not restricted to the use of \cs{btable}. +With respect to programming, the deterministic tables and +the tables which update the computer memory, deserve special attention. +The latter category is induced by {\em computer\/} typography. + +\blueexample Young tableaux, irregular shape, Knuth {\oldstyle1973} + +^^{Young tableaux} +\begindemo +\newdimen\csize\csize=3ex +\newcount\cnt +\def\young#1{\hbox{\vrule\vtop{\hrule + \offinterlineskip\halign{&\vbox + {\hbox to\csize{\strut\hss##\hss + \vrule}\hrule}\cr%template +#1\crcr}}}}%end \young +\catcode`'=13\relax +\def'{\global\advance\cnt1 \the\cnt} +\def\data{'&'&'&'\cr'&'&'\cr'} +\young\data +\def\data{7&8&9&10\cr9&11\cr16\cr} +\young\data +!yields +\newdimen\csize\csize=3ex +\newcount\cnt +\def\young#1{\hbox{\vrule\vtop{\hrule + \offinterlineskip\halign{&\vbox + {\hbox to\csize{\strut\hss##\hss + \vrule}\hrule}\cr%template +#1\crcr}}}}%end \young +\catcode`'=13\relax +\def'{\global\advance\cnt1 \the\cnt} +\def\data{'&'&'&'\cr'&'&'\cr'} +\leavevmode\qquad\young\data\qquad +\def\data{7&8&9&10\cr9&11\cr16\cr} +\young\data +\enddemo + +\blueexample Pascal triangle, a deterministic table + +^^{Pascal triangle} +\begindemo +$$\displaylines{1\cr + 1\quad1\cr + 1\quad2\quad1\cr + 1\quad3\quad3\quad1\cr}$$ +!yields\hsize=10em +$$\displaylines{1\cr + 1\quad1\cr + 1\quad2\quad1\cr + 1\quad3\quad3\quad1\cr}$$ +\enddemo +\exercise The Pascal triangle is deterministic. Write a macro + |\def\pascal#1{...}| which provides the table with the + order as argument. +\answer The macro and auxiliaries read as follows. +\thisverbatim{\unmc} +\beginverbatim +\newcount\n +\newcount\rcnt \newcount\ccnt +\newcount\tentry\newcount\prev +% +\def\pascal#1{\n#1 \def\0{1} \ccnt1 + \loop\ea\xdef\csname\the\ccnt\endcsname{0} + \ifnum\ccnt<\n \advance\ccnt1 + \repeat\rcnt0 \ccnt0 + \displaylines{\rows}} +% +\def\rows{\global\advance\rcnt1 + \ifnum\rcnt>\n \swor\fi + \nxtrow\rows} +% +\def\swor#1\rows{\fi} +% +\def\nxtrow{1 \ccnt1 \prev1 + \loop\ifnum\ccnt<\rcnt + \tentry\prev + \prev\csname\the\ccnt\endcsname + \advance\tentry\prev + \ea\xdef\csname\the\ccnt\endcsname{\the\tentry} + \quad\the\tentry + \advance\ccnt1 + \repeat\cr} +!endverbatim + +%above blank line terminates answer. + +\blueexample Tower of Hanoi, deterministic + +The process of replacement of the disks will be printed +by the invocation of |\hanoi<n>|, $n$ an integer. +No user markup is needed. ^^{tower\ of\ Hanoi} +\begindemo +\hanoi2 +%or +\beginhanoi2\endhanoi +!yields +\hanoi2 +\enddemo + +\blueexample Chart, \TB{} ex{\oldstyle22}.{\oldstyle14} {\oldstyle248} + +^^{chart}%but elaborated differently. +{\small +\newdimen\dist \dist=2\baselineskip +\def\ent#1{\hbox{\vbox to 0pt +{\vss\hbox to10ex{\quad\strut#1\hss} + \hrule}}} +\def\vl#1{\hbox{\vrule height#1\dist +depth0pt}}%Vertical Line of prop. size +\def\bl#1{\kern#1\dist}%BLank of prop. size +%Balanced +$$\offinterlineskip + \vcenter{\ent{abc}} + \vcenter{\ent{de} + \vl2 + \ent{fg}} + \vcenter{\ent{hij} + \vl1 + \ent{klm} + \bl1 + \ent{nop} + \vl1 + \ent{qrs}} +\quad%Nearly balanced tree; pruning a branch + \vcenter{\ent{abc}} + \vcenter{\ent{de} + \vl2 + \ent{fg}} + \vcenter{\ent{hij} + \vl{.5} %\bl{.5}<-| + % \ent{klm} | + \bl{1.5}% <-| + \ent{nop} + \vl1 + \ent{qrs}}$$ }%end scope + +via the following alternative code without \cs{halign} + +\begincenterverbatim +\newdimen\dist \dist=2\baselineskip +\def\ent#1{\hbox{\vbox to0pt{\vss\hbox to10ex{\quad + \strut#1\hss}\hrule}}} +\def\vl#1{\hbox{\vrule height#1\dist depth0pt}} +\def\bl#1{\kern#1\dist}%BLank of proper size +%Balanced +$$\offinterlineskip + \vcenter{\ent{abc}} + \vcenter{\ent{de} \vl2\ent{fg}} + \vcenter{\ent{hij}\vl1\ent{klm}\bl1\ent{nop}\vl1\ent{qrs}} +\quad%Nearly balanced tree; pruning a branch + \vcenter{\ent{abc}} + \vcenter{\ent{de} \vl2\ent{fg}} + \vcenter{\ent{hij}\vl{.5}%\bl{.5}\ent{klm} + \bl{1.5}\ent{nop}\vl1\ent{qrs}}$$ +!endcenterverbatim + +\blueexample Binary tree + +The nodes are identified via Dewey's decimal notation, similar to +a ToC in a book. +For example, node {\oldstyle11} is the left most node at the first level. +The user must supply within the environment ^|\beginbintree| \cs{endbintree} +the pairs of node numbers and node contents, with at the end the +level of the tree. +A node which is not specified will not show. + +The syntax of the invocation reads +\begincenterverbatim +\beginbintree<nodeno><nodevalue> + ... + <nodeno><nodevalue> +<levelno>\endbintree +!endcenterverbatim +$$\thisbintree{\tophns13ex} + \beginbintree{00}1{11}6{12}7{21}2{22}3{23}4 + 2\endbintree + \raise13ex\hbox{$\buildrel heap\over \longrightarrow$} + \thisbintree{\tophns13ex} + \beginbintree{00}7{11}6{12}4{21}3{22}2{23}1 + 2\endbintree +$$ +\begincenterverbatim +$$\thisbintree{\tophns13ex} + \beginbintree{00}1{11}6{12}7{21}2{22}3{23}4 + 2\endbintree + \raise13ex\hbox{$\buildrel heap\over \longrightarrow$} + \thisbintree{\tophns13ex} + \beginbintree{00}7{11}6{12}4{21}3{22}2{23}1 + 2\endbintree +$$ +!endcenterverbatim + +\blueexample Dewey's decimal notation + +$$\beginbintree{00}{$root$} + {11}{$n_{11}$} + {12}{$n_{12}$} + {21}{$n_{21}$} + {22}{$n_{22}$} + {23}{$n_{23}$} + {24}{$n_{24}$} + {35}{$n_{35}$} + {36}{$n_{36}$} + {49}{$n_{49}$} + {410}{$n_{410}$} +4\endbintree$$ +\vskip-2.5\bigskipamount +\begincenterverbatim +$$\beginbintree{00}{$root$} + {11}{$n_{11}$}{12}{$n_{12}$} + {21}{$n_{21}$}{22}{$n_{22}$}{23}{$n_{23}$}{24}{$n_{24}$} + {35}{$n_{35}$}{36}{$n_{36}$} + {49}{$n_{49}$}{410}{$n_{410}$} +4\endbintree$$ +!endcenterverbatim + +\blueexample Bitstreams as names of nodes + +^^|\beginbt|\thisbt{\xoffset{-400}}%Interactive binary tree traversal +\beginbt 1 NTG member? +10 Plain TeX ie? +100 Honoured? +1000 cgl +1001 HH +101 On board? +1010 Chair? +10100 Erik +10101 Secretary? +101010 Gerard +101011 Treasurer? +1010110 Wietse +1010111 Dark? +10101110 JLB +10101111 FG +1011 Anonymous +11 Just a friend +8 \endbt +The above b(inary)t(ree)\ftn{Courtesy Bernd Raichle.} is not foolproof and suffers from +overprinting of the leaves with a tree of depth {\oldstyle10} or so. +Note that the specification of the nodes is on a line by line basis\Dash + \cs{obeylines} is on\Dash and +that each node and its contents is separated by a space. +The last line must contain the number of levels\Dash + used to create the niche for the tree\Dash +and the closing tag \cs{endbt}, again separated by a space. +By adopting these conventions no curly braces were needed.\ftn{The above ideas + emerged from an interactive traversal of a binary tree in a guess + who-is-who game. The programming is such that it can be extended easily to + a trinary or higher-order tree. The overprinting drawback remains, however. + Alexander Calder might have appreciated these `mobiles,' \winksmiley.} +\begincenterverbatim +\thisbt{\xoffset{-400}} +\beginbt 1 NTG member? +10 Plain TeX ie? +100 Honoured? +1000 Kees +1001 HH +101 On board? +1010 Chair? +10100 Erik +10101 Secretary? +101010 Gerard +101011 Treasurer? +1010110 Wietse +1010111 Dark? +10101110 JLB +10101111 FG +1011 Anonymous +11 Just a friend +8 \endbt +\bye +!endcenterverbatim +There are some special tree packages. Gurari is strong with respect to +diagrams in general and trees in particular. + +\blueexample Maze + +%Labyrinth via TeX, just an experiment feb 92. +%Assumed is a closed rule on top and to the right +%| and _ denote the rules to mark the labyrinth +%Labyrinth proper +\thisverbatim{\catcode`\|=12 } ^^{maze} +\begindemo +\catcode`|=13 \def|{\vrule} +\catcode`_=13 \def_{\hrulefill} +$$\vcenter{\hbox{\vtop{\hrule +\offinterlineskip +\halign{&\hbox to\csize{\vrule + height\csize width0pt#\hfil}\cr + |&_&|_& \cr + &|&_& \cr + |&|_&_&|\cr + |_& &_&_\cr}%end \halign + }\vrule%end \vbox + }%end \hbox +!yields +\newdimen\csize \csize=3ex +\catcode`|=13 \def|{\vrule} +\catcode`_=13 \def_{\hrulefill} +\qquad\hbox{\vtop{\offinterlineskip + \hrule\halign{&\hbox to\csize + {\vrule height\csize width0pt + #\hfil}\cr + |&_&|_& \cr + &|&_& \cr + |&|_&_&|\cr + |_& &_&_\cr}%end \halign + }\vrule%end \vbox + }%end \hbox +\enddemo + +\blueexample Crosswords: puzzle, clues and solution + +^^{crosswords} +\begincrosswords +$$\bdata% +P*On +DEk* +*n*S +Edit +\edata +\vcenter{\sevenrm\csize=3ex\crw} +\vcenter{\parindent=5ex +\vtop{\hsize=21ex\obeylines Across +2 Switch mode +3 Knuth +6 Prior to \TeX}} +\vcenter{\parindent=3ex +\vtop{\hsize=25ex\obeylines Down +1 Public domain +2 All right +4 All comes to it +5 Atari type}} +\vcenter{\fiverm\csize=3ex\sol}$$ +\endcrosswords +The above is obtained essentially via +\begincenterverbatim +\begincrosswords +$$\bdata% +P*On +DEk* +*n*S +Edit +\edata +\vcenter{\sevenrm\csize=3ex\crw} +<Clues> +\vcenter{\fiverm\csize=3ex\sol}$$ +\endcrosswords +!endcenterverbatim + +\blueexample Much alignment occurs in typesetting mathematics + +Aligned equations in display, matrices, and +the complex commutative diagrams. +This has been dealt with elsewhere, +for example Knuth {\oldstyle1984}, and Spivak {\oldstyle1989}. +Also typesetting of program texts requires vertical alignment. + +\blueexample Chess boards + +The first board has been marked up via ^|\leaders|,\ftn{Courtesy + David Salomon.} +horizontally and vertically. ^^{chess} +The second is obtained via (a degenerate use of \winksmiley ) +the crossword macro. +{\newdimen\unitlength \unitlength3ex +\begindemo +\unitlength3ex +\boxit{\vbox{\leaders + \vbox{\offinterlineskip + \hbox{\leaders\hbox{% + \kern\unitlength + \vrule width\unitlength + height\unitlength + }\hskip8\unitlength + }\hbox{\leaders\hbox{\vrule + width\unitlength + height\unitlength + \kern\unitlength + }\hskip8\unitlength + }}\vskip8\unitlength}} +!yields +\boxit{\vbox{\leaders + \vbox{\offinterlineskip + \hbox{\leaders\hbox{% + \kern\unitlength + \vrule width\unitlength + height\unitlength + }\hskip8\unitlength + }\hbox{\leaders\hbox{\vrule + width\unitlength + height\unitlength + \kern\unitlength + }\hskip8\unitlength + }}\vskip8\unitlength}} +\enddemo} + +\begindemo +\begincrosswords +\obeyspaces\let =\space +\csize=3ex +\bdata% +8 * * * * +7* * * * +6 * * * * +5* * * * +4 * * * * +3* * * * +2 * * * * +1* * * * +*ABCDEFGH +\edata +\sol +\endcrosswords +!yields +\begincrosswords +\obeyspaces\let =\space +\csize=3ex +\bdata% +8 * * * * +7* * * * +6 * * * * +5* * * * +4 * * * * +3* * * * +2 * * * * +1* * * * +*ABCDEFGH +\edata +\sol +\endcrosswords +\enddemo +\exercise How can we add field indicators on top and to the right? +\answer Extend the data by the numbers at the end of each row, and + copy the last row also on top. +\beginverbatim +\bdata% +*ABCDEFGH* +8 * * * *8 +7* * * * 7 +6 * * * *6 +5* * * * 5 +4 * * * *4 +3* * * * 3 +2 * * * *2 +1* * * * 1 +*ABCDEFGH* +\edata +!endverbatim + +\exercise How can we diminish the ^{optical illusion} + of the border? +\answer Make the border thicker. For example via + |\boxit{\boxit{\sol}}|. Why don't you develop a nice border macro? + +\exercise How can we add pieces to the board? +\answer Chess pieces are available in a font. Similar to the letters in the + solution of the crosswords we can put in pieces. For example let us + assume for simplicity's sake that K denotes the white king then + the following yields the requested result. +\beginverbatim +\begincrosswords +\obeyspaces\let =\space +\csize=3ex +\bdata% +8 * * * * +7* * * * +6 * * * * +5* * * * +4 *K* * * +3* * * * +2 * * * * +1* * * * +*ABCDEFGH +\edata +\boxit{\boxit{\sol}} +\endcrosswords +!endverbatim + +%blank line is needed, to close answer. +The above entails that we are on the way to generate any board and +just add the pieces, all based on the crosswords macro approach. + +\blueexample Optical illusion + +Again a nice application of the use of ^|\leaders|,\ftn{For \cs{soto} and + and \cs{sot} see the script file.} +horizontally and vertically. When I submitted my crosswords macro to \TUB{} +it was refused because of the wiggling of the frame!?! There the similar +effect is on with neighbouring black and white squares. +The black squares look smaller than the white squares, +yielding a ^{wiggling illusion}. + +\newdimen\unitlength \unitlength5ex +\newbox\soto\setbox\soto\vbox{\hrule height1exwidth5ex\relax + \hbox to5ex{\vrule width1exdepth0pt\relax + \hss\vrule height3exwidth1exdepth0pt}% + \hrule height1exwidth5ex\relax} +{\newdimen\unitlength \unitlength5ex +\newbox\sot +\setbox\sot\vbox to\unitlength{\vss + \hbox to\unitlength{\hss + \vrule height.6\unitlength + width.6\unitlength + depth0pt\hss}% + \vss} + +\smallskip +\begindemo +\boxit{\vbox{\leaders\vbox{% + \offinterlineskip\hbox{\leaders + \hbox{\copy\soto\copy\sot}% + \hskip30ex}% + \hbox{\leaders + \hbox{\copy\sot\copy\soto}% + \hskip30ex}}% + \vskip30ex}} +!yields +\boxit{\vbox{\leaders\vbox{\offinterlineskip + \hbox{\leaders\hbox{\copy\soto\copy\sot}\hskip30ex}% + \hbox{\leaders\hbox{\copy\sot\copy\soto}\hskip30ex}}% + \vskip30ex}} +\enddemo + +\blueexample Soto's kinetic art + +\begindemo +\leavevmode +%background +\hbox{\xleaders\hbox to.5ex{\hss + \vrule height6\unitlength\hss + }\hskip6\unitlength + }\kern-6\unitlength +%the squares +\boxit{\vbox{\offinterlineskip + \leaders\hbox{\leaders\copy\sot + \hskip6\unitlength + }\vskip6\unitlength}} +!yields +\leavevmode +\hbox{\xleaders\hbox to.5ex{\hss + \vrule height6\unitlength\relax\hss + }\hskip6\unitlength}\kern-6\unitlength +%the squares +\boxit{\vbox{\offinterlineskip + \leaders\hbox{\leaders\copy\sot + \hskip6\unitlength}\vskip6\unitlength}} +\enddemo +} + +\blueexample Row and/or column spans, partial horizontal rules + +^^{row\ and\ column\ spans} +%Fill-in form bridge +\nonruled\ctr\framed \def\rowstblst{} +{\small%\defaults +\newcount\bcnt +\def\lines{\global\advance\bcnt by1 \ifnum\bcnt=3 et cetera\hidewidth + \senil\fi\the\bcnt.\cs\cs\cs\cs\cs\cs\rs\lines} +\def\senil#1\lines{\fi} +\thisbtable{ +\def\ghostrow{\omit\colsepsurround% + \vbox to0pt{\vss\hbox to5ex{\hss Pair\hss}\vskip.5ex + \hbox to5ex{\hss No\hss}\vss}\prs\logms2\lineglue\srp + \vbox to0pt{\vss\hbox to5ex{\hss Re-\hss}\vskip.5ex + \hbox to5ex{\hss sults\hss}\vss}\prs\logms2\lineglue\srp + \vbox to0pt{\vss\hbox to15ex{\hss Game \dots\hss}\vskip1.5ex + \hbox to15ex{\hss MP$\,$s\hss}\vss}\colsepsurround\cr} +\def\header{\cs\logms2\hfil Contract\hfil\cs + \cs\logms2\hfil Scores\hfil\cs\grs + \cs N--S\cs E--W\cs\cs N--S\cs E--W\cs} +} +$$ \framed\ruled\btable\lines$$ +}%end scope +\beginverbatim +\newcount\bcnt +\def\lines{\global\advance\bcnt by1 \ifnum\bcnt=3 et cetera\hidewidth + \senil\fi\the\bcnt.\cs\cs\cs\cs\cs\cs\rs\lines} +\def\senil#1\lines{\fi} +\thisbtable{ +\def\ghostrow{\omit\colsepsurround% + \vbox to0pt{\vss\hbox to5ex{\hss Pair\hss}\vskip.5ex + \hbox to5ex{\hss No\hss}\vss}\prs\logms2\lineglue\srp + \vbox to0pt{\vss\hbox to5ex{\hss Re-\hss}\vskip.5ex + \hbox to5ex{\hss sults\hss}\vss}\prs\logms2\lineglue\srp + \vbox to0pt{\vss\hbox to15ex{\hss Game \dots\hss}\vskip1.5ex + \hbox to15ex{\hss MP$\,$s\hss}\vss}\colsepsurround\cr} +\def\header{\cs\logms2\hfil Contract\hfil\cs + \cs\logms2\hfil Scores\hfil\cs\grs + \cs N--S\cs E--W\cs\cs N--S\cs E--W\cs} +} +$$ \framed\ruled\btable\lines$$ +!endverbatim +\exercise How many rows does the header have? +\answer Descriptive {\oldstyle1}, visual {\oldstyle2}, and for + plain \TeX\ formatting {\oldstyle3}. + It is all a matter of point of view. + +\exercise The above ^{recursive markup} of the data is elegant, especially + when the table is large. + Simplify the markup by abandoning the independence of size, + i.e., provide the data explicitly instead of recursively. +\answer The `data' can be defined as follows. +\beginverbatim +\def\data{1.\cs\cs\cs\cs\cs\cs\rs + 2.\cs\cs\cs\cs\cs\cs\rs + et cetera\hidewidth} +!endverbatim + +\blueexample Bridge pair match scheme, with special `first' element + +$$\def\first{\thispicture{\unitlength=6ex \xdim{1.4}\ydim{1}}% + \lower1.5ex\hbox\beginpicture%(1.4, 1)(0,-.1) + \put( 0.0, 0.0){\small \strut Round}% + \put( 1.4, 0.575){\llap{\small Game}}% + \put( 1.4, 0.1){\line(-2, 1){1.4}}% +\endpicture\lower2ex\null} +\def\header{% + 1--3 \cs 4--6 \cs 7--9 \cs 10--12\cs13--15\cs 16--18 \cs 19--21} +\def\rowstblst{{1.}{2.}{et cetera}} +\def\data{% +1--2 \cs \cs \cs2: 3--4\cs \cs3: 5--6 \cs4: 7--8\rs +4: 8--3\cs1: 1--6\cs \cs \cs2: 5--7 \cs \cs3: 2--4\rs + %\cs \cs \cs \cs \cs \cs \rs +} +\framed\ruled\btable\data +$$via +\beginverbatim +\def\first{\thispicture{\unitlength=6ex\xdim{1.4}\ydim{1}}% + \lower1.5ex\hbox\beginpicture%(1.5, 1)(0,-.1) + \put( 0.0, 0.0){\small \strut Round}% + \put( 1.4, 0.575){\llap{\small Game}}% + \put( 1.4, 0.1){\line(-2, 1){1.4}}% +\endpicture +\lower2ex\null +} +\def\header{% + 1--3 \cs 4--6 \cs 7--9 \cs 10--12\cs13--15\cs 16--18 \cs 19--21} +\def\rowstblst{{1.}{2.}{et cetera}} +\def\data{% +1--2 \cs \cs \cs2: 3--4\cs \cs3: 5--6 \cs4: 7--8\rs +4: 8--3\cs1: 1--6\cs \cs \cs2: 5--7 \cs \cs3: 2--4\rs + %\cs \cs \cs \cs \cs \cs \rs +} +\framed\ruled\btable\data +!endverbatim +Remark. The need for centering the first row is induced by +\cs{first}. It is elegant to solve the problem for that in ^|\first|. + +\exercise How can we center the numbers in the first column? +\answer Add \cs{hfil} in the \cs{rowstblst} via + \beginverbatim + \def\rowstblst{{\hfil1.}{\hfil2.}{et cetera}} + !endverbatim + Another solution is the following template + \beginverbatim + \def\template{\colsepsurround\hfil##\hfil&&\lft##\rgt\cr} + !endverbatim + +\blueexample Alignment at decimal points + +Generally this is done by introducing an extra column for the dot, +and flushing right the digits left and +flushing left the digits right of it. +It comes from the wish not to print +non-significant leading zeroes, and to suppress +zeroes behind the point for exact numbers. +{\oldstyle3}.{\oldstyle5} means exactly 3${1\over2}$. +{\oldstyle3}.{\oldstyle500} means accurate to three digits. +I would mark up the numbers separately and +insert Knuth's `?', \TB{} {\oldstyle240}\dash{\oldstyle241}, +for non-signicant zeroes, automatically. +The latter can also be done by programming the editor by a template +consisting of sufficient ?-s followed by the decimal point. +The numbers required can be brought in by overtyping +the template. +Related to ^{alignment at decimal point}s is + ^{alignment at number sign}s,\ftn{Another column for the signs + offends the structure. + At a lower level one could think of {\tt\char92scs}, + a Sign Column Separator, but that is not nice either.} +see the AAP table. + +\blueexample Nested table + +A ruled table with unruled tables as data is incorporated in the chapter +`Creating an index,' to illustrate the ordering choices. See the script. + +^^{nested table} +\blueexample Nested, and interrupted table with updating of memory + +From the user level one would say: +aligned material connected by text, where the latter +in the case at hand is the status of the play. +For the markup see the script. + +\beginbridge +{\small +%bridge data +\def\LFTINF{Puzzle} +\def\RGTINF{\vtop{\hbox{6NT,} + \hbox{by East}}} +% +\Ns={KQ76}\Es={T9}\Ss={8542}\Ws={AJ3} +\Nh={J98} \Eh={A2}\Sh={QT74}\Wh={K653} +\Nd={J942}\Ed={T5}\Sd={Q876}\Wd={AK3} +\Nc={65}\Ec={KJ9xxxx}\Sc={2}\Wc={AQT} +\showgame +\LEADS\bplay +h4! & hK & h8 & h2 & --& 1\LEADW\cr +cA & c5 & cx & c2 & --& 2\cr +cQ & c6 & cx & s2 & --& 3\cr +cT & h9 & cK & s4 & --& 4\LEADE\cr +cJ & s5 & s3 & s6 & --& 5\cr +c9 & s8 & h5 & s7 & --& 6\cr +cx & d6 & sJ & d2 & --& 7\cr +\bintermezzo +\def\RGTINF{\vtop{\hbox to 0pt{NS squeezed on\hss} + \hbox to 0pt{\cl\ continuation?\hss} + \hbox to 7ex{\hss}}} %phantom for alignment +\Ec={{\ooalign{\hfil\raise.07ex% + \hbox{x}\hfil\crcr\mathhexbox20D}}} +\showgame \Ec={x} +\eintermezzo +cx & h7 & h6 & hJ & --& 8\cr +\omit et cetera \hidewidth \cr +\eplay +}%end of scope +\endbridge + +Tables which also require updating of memory +occur with typesetting of chess, +for example Tutelaers {\oldstyle1992}, or +GO, Ko{\l}odziejska {\oldstyle1991}. + +\blueexample Fill-in forms + +The registration forms for the various \TeX{} conferences are captivating. +Now and then I ponder about the +e-mail equivalents of the traditional snail forms, especially what +(and how they) should be filled in. +Redefine a list of empty definitions? + +\blueexample Time tables + +Railway, bus, \dots\thinspace, and the use of rotated fonts. +This is a \PS{} issue. + +\blueexample No markup + +For simple tables the data can be specified {\em without\/} +\cs{cs}-s, and \cs{rs}-s, +i.e., without explicit markers for column and row separators. +These can be inserted by \TeX, see \TB{} {\oldstyle249}. +For special cases, for example centering texts\ftn{See the implementation + of \cs{center} in the file.} +and crosswords, this is handy. ^^{no markup} + +\thissubhead{\runintrue} +\bluesubhead Pondering about lists\par makes you realize that the table proper data forms +a nested list with \cs{rs} and \cs{cs}, respectively first level +and second level separators. One could also adopt |<cr>| +and {\tt\char32} for that, in other words allow natural data provision. + +\blueexample Simultaneous row spans + +Simultaneous column spans can be marked up in \cs{btable} by +\cs{logms}---for logical columns, +as an extension to \cs{multispan} for \cs{halign}. ^^{row\ spans} +For row spans start from \cs{valign}, the transposition of \cs{halign}. +A little more than the analogy of transposition is needed. +From the \TeX-nl list the following example of spans over rows. +\begindemo +\hbox{\vrule\valign{&\hrule\vfil + \noindent\hsize15ex\strut + \xsp#\xsp\vfil\hrule\cr +\multispan3{\hrule\vfil + \vbox{\noindent\hsize15ex\strut + \xsp This\\ + \xsp looks\\ + \xsp problematic}}\vfil + \hrule& + Doesn't it?\cr +\noalign{\vrule} +\hfill22 &%space needed +\hfill12 & +\hfill1943 & +\hfill190 \cr}\vrule} +%with auxiliary +\def\xsp{\hbox{ }} +!yields +\def\xsp{\hbox{ }} +\hbox{\vrule\valign{&\hrule\vfil + \noindent\hsize15ex\strut + \xsp#\xsp\vfil\hrule\cr +\multispan3{\hrule\vfil + \vbox{\noindent\hsize15ex\strut + \xsp This\\ + \xsp looks\\ + \xsp problematic}}\vfil + \hrule& + Doesn't it?\cr +\noalign{\vrule} +\hfill22 &%space needed +\hfill12 & +\hfill1943 & +\hfill190 \cr}\vrule} +\enddemo +As can be seen from this difficult example, we have to fall back +on lower level details now and then. +\exercise Modify the above towards a ^|\vtable| macro, such that we can use + the attributes \cs{ruled}, \cs{vruled}, \cs{hruled}, with + default \cs{nonruled}, and \cs{framed} and \cs{nonframed}.^^|\valign| +\answer As a parameter I provided the \cs{hsize} of the table entries. + For row spans the \cs{logms}, logical multispan, has been used, + similar as for \cs{btable}. +\beginverbatim +\def\xsp{\hbox{ }} +\def\vruled{\def\colsep{\vrule}\def\rowsep{}} +\def\hruled{\def\colsep{}\def\rowsep{\hrule}} +\def\ruled{\def\colsep{\vrule}\def\rowsep{\hrule}} +\def\nonruled{\def\colsep{}\def\rowsep{}} +\def\framed{\let\frameit\boxit} +\def\nonframed{\def\frameit##1{##1}} +\def\rs{&\null\rowsepsurround\rowsep\rowsepsurround&} +\def\cs{\lcs\noalign{\colsep}} +\def\lcs{\rowsepsurround\cr} +\def\top{\null\vskip.5em} +\def\bot{\vskip.5em} +\def\ctr{\def\lft{\hfil}} +\def\fll{\def\lft{}} +\def\flr{\def\lft{\hfill}} +%Macro +\def\vtable#1{\frameit{\hbox{\valign{\top\noindent + \hsize#1\lft##\bot + &&##&\hsize#1\top\noindent\lft##\bot\cr + \data}}}} +%Defaults +\nonframed\nonruled\ctr +\def\rowsepsurround{\vskip.1ex} +%Examples +\def\data{1 \rs 2\rs 3\cs + 4 \rs 5\rs 6\cs + 314\rs271\rs \lcs} +\vtable{7ex} +\smallskip +\def\data{\logms3{\hsize7ex\null +\vfil\noindent\hfil1\hfil\vfil}\cs + C\rs G\rs L\cs + 22\rs12\rs1943\lcs} +\ruled\vtable{7ex} +\smallskip +\def\data{\logms3{\hsize15ex\null +\vfil\noindent\xsp This\\ + \xsp looks\\ + \xsp problematik\vfil}\cs + O\rs A\rs G\cs + 16\rs11\rs1954\lcs} +\framed\ruled\vtable{5ex} +!endverbatim + +%end answer +\blueexample Macroscopic markup vtable, based on valign + +{%Example with macroscopic \vtable markup +\def\xsp{\hbox{ }} +\def\vruled{\def\colsep{\vrule}\def\rowsep{}} +\def\hruled{\def\colsep{}\def\rowsep{\hrule}} +\def\ruled{\def\colsep{\vrule}\def\rowsep{\hrule}} +\def\nonruled{\def\colsep{}\def\rowsep{}} +\def\framed{\let\frameit\boxit} +\def\nonframed{\def\frameit##1{##1}} +\def\rs{&\null\rowsepsurround\rowsep\rowsepsurround&} +\def\cs{\lcs\noalign{\colsep}} +\def\lcs{\rowsepsurround\cr} +\def\top{\null\vskip.5em} +\def\bot{\vskip.5em} +\def\ctr{\def\lft{\hfil}} +\def\fll{\def\lft{}} +\def\flr{\def\lft{\hfill}} +%Macro +\def\vtable#1{\frameit{\hbox{\valign{\top\noindent + \hsize#1\lft##\bot + &&##&\hsize#1\top\noindent\lft##\bot\cr + \data}}}} +%Defaults +\nonframed\nonruled\ctr +\def\rowsepsurround{\vskip.1ex} +\begindemo +\def\data{\logms3{\hsize15ex + \vfil\noindent\xsp This\\ + \xsp looks\\ + \xsp problematic + \vfil}\rs\omit\hsize15ex + \vfil\noindent + \xsp Doesn't it?\vfil\cs + O\rs A\rs G\rs 189\cs + \rs 16\rs11\rs1954\lcs} +\framed\ruled\vtable{5ex} +!yields +\def\data{\logms3{\hsize15ex + \vfil\noindent\xsp This\\ + \xsp looks\\ + \xsp problematic +\vfil}\rs +\omit\hsize15ex\vfil\noindent + \xsp Doesn't it?\vfil\cs + O\rs A\rs G\rs \cs + \rs16\rs11\rs1954\lcs} +\framed\ruled\vtable{5ex} +\enddemo} + +\blueexample Regular use vtable based on valign + +{\begindemo +\def\vtable#1{\frameit{\hbox + {\valign{\top\noindent + \hsize#1\lft##\bot + &&##&\hsize#1\top + \noindent\lft + ##\bot\cr + \data}}}} +\def\data{anatoly\rs + andre\rs + alex + \cs + beatrici\rs + bernd\lcs} +\nonframed\vtable{20ex} +!yields +\def\vruled{\def\colsep{\vrule}\def\rowsep{}} +\def\hruled{\def\colsep{}\def\rowsep{\hrule}} +\def\ruled{\def\colsep{\vrule}\def\rowsep{\hrule}} +\def\nonruled{\def\colsep{}\def\rowsep{}} +\def\framed{\let\frameit\boxit} +\def\nonframed{\def\frameit##1{##1}} +\def\rs{&\null\rowsepsurround\rowsep\rowsepsurround&} +\def\cs{\lcs\noalign{\colsep}} +\def\lcs{\rowsepsurround\cr} +\def\top{\null\vskip.1em} +\def\bot{\vskip.1em} +\def\ctr{\def\lft{\hfil}} +\def\fll{\def\lft{}} +\def\flr{\def\lft{\hfill}} +% +\def\rowsepsurround{\vskip.1ex} +% +\def\vtable#1{\frameit{\hbox + {\valign{\top\noindent + \hsize#1\lft##\bot + &&##&\hsize#1\top + \noindent\lft + ##\bot\cr + \data}}}} +\def\data{anatoly\rs + andre\rs + alex + \cs + beatrici\rs + bernd\lcs} +\nonframed\vtable{20ex} +\enddemo} +The advantage of \cs{valign} for this case is that when a name is +inserted in a column that column can grow without +adaptation of the markup for the other cells. + +\blueexample Simultaneous row and column spans + +These require more work. ^^{row\ and\ column\ spans} +\newbox\block +\setbox\block=\hbox{$2*3$} +\def\data{\logms3\cs14\grs + \logms3\cs24\rs + 31\cs32\cs33\cs34} +\def\btablecaption{Caption} +\def\rowstblst{{row 1}{row 2}{\hfil + $\Rightarrow$}} +\def\header{\logms4 Header\hfil$\Downarrow$} +\def\footer{Footer} +\thisbtable{\def\ghostrow{\ifx\empty\rowstblst + \else\omit\lineglue\ea\srp\fi + \logms3\hfil\vbox to0pt{\vss + \copy\block\vss}\hfil\prs\lineglue\cr\nxtrs} +} +$$\vcenter{\framed\ruled\btable\data} +\qquad\qquad +%\setbox\block=\hbox{$3*3$} +\def\data{\logms3\hfil\cs14\grs +\logms3\hfil$3*3$\hfil\cs24\grs + \logms3\hfil\cs34\rs + 41\cs42\cs43\cs44} +\thisbtable{\def\ghostrow{\ifx\empty\rowstblst + \else\omit\lineglue\ea\srp\fi + \logms3\hfil\prs\lineglue\cr + \ifx\empty\rowstblst\else\ea\nxtrs\fi}} +\def\btablecaption{Caption} +\def\header{\logms4 Header\hfil$\Downarrow$\ } +\def\rowstblst{{row 1}{row 2}{row 3}{\hfil$\Rightarrow$}} +\def\footer{Footer} +\vcenter{\ruled\framed\btable\data} +$$ +\exercise How to markup the above with simultaneous row and column spans? +\answer Because of the separation of concerns we only have to concentrate + on the data. My approach is to look at a block\Dash here $2{*}3$\Dash + as a ghost to be overprinted. + A natural way is to introduce the concept of a ghostrow, + which will be invoked by the ghostrow separator \cs{grs}. + So first mark up for the data with the hole in the table and + include the \cs{grs}. Then provide \cs{ghostrow}. + In order to do the latter gracefully, + we also need the concept of partial row separator, \cs{prs}, + and its mirror, \cs{srp}, to handle partial lines. + \beginverbatim + \setbox\block=\hbox{$2*3$} + \def\data{\logms3\cs14\grs + \logms3\cs24\rs + 31\cs32\cs33\cs34} + \def\btablecaption{Caption} + \def\rowstblst{{row 1}{row 2}{\hfil + $\Rightarrow$}} + \def\header{\logms4 Header\hfil$\Downarrow$} + \def\footer{Footer} + \thisbtable{\def\ghostrow{\ifx\empty\rowstblst + \else\omit\lineglue\ea\srp\fi + \logms3\hfil\vbox to0pt{\vss + \copy\block\vss}\hfil\prs\lineglue\cr\nxtrs} + }\vcenter{\framed\ruled\btable\data}$$ + % + %and the 3*3 block can be obtained via + % + %\setbox\block=\hbox{$3*3$} + \def\data{\logms3\hfil\cs14\grs + \logms3\hfil$3*3$\hfil\cs24\grs + \logms3\hfil\cs34\rs + 41\cs42\cs43\cs44} + \thisbtable{\def\ghostrow{\ifx\empty\rowstblst + \else\omit\lineglue\ea\srp\fi + \logms3\hfil\prs\lineglue\cr + \ifx\empty\rowstblst\else\ea\nxtrs\fi}} + \def\btablecaption{Caption} + \def\header{\logms4 Header\hfil$\Downarrow$\ } + \def\rowstblst{{row 1}{row 2}{row 3}{\hfil$\Rightarrow$}} + \def\footer{Footer} + $$\vcenter{\ruled\framed\btable\data}$$ + !endverbatim + +\begingroup +\blueexample Gnonoms + +In \TUB{} a discussion about the following kind of +rules within tables\Dash so-called ^{gnonoms}\Dash emerged. +\newcount\rowno \rowno1 +\thisverbatim{\unmc} +\begindemo +\newcount\columnno \columnno1 +\def\data{1\cs3\cs5\rs + 1\cs4\cs7\rs + 1\cs5\cs9\lrs} +\def\cs{\hss\vrule\ifnum + \columnno<\rowno width0pt\fi\relax + &\global\advance\columnno1 } +\def\rs{\hss\vrule\relax\cr + \global\advance\rowno1 + \global\columnno1 } +\def\lrs{\hss\vrule\relax\cr} +\halign{&\vbox to12pt{\hbox to12pt + {\hss\strut#}\vss\hrule\ifnum + \rowno<\columnno width0pt\fi}\cr + \data} +!yields\offinterlineskip +\newcount\columnno \columnno1 +\def\data{1\cs3\cs5\rs + 1\cs4\cs7\rs + 1\cs5\cs9\lrs} +\def\cs{\hss\vrule\ifnum + \columnno<\rowno width0pt\fi\relax + &\global\advance\columnno1 } +\def\rs{\hss\vrule\relax\cr + \global\advance\rowno1 + \global\columnno1 } +\def\lrs{\hss\vrule\relax\cr} +$$\vbox{\halign{&\vbox to12pt{\hbox to12pt{\hss\strut#}\vss\hrule + \ifnum\rowno<\columnno width0pt\fi\relax}\cr + \data}}\qquad\qquad$$ +\enddemo +% +%Coding with the deterministic behaviour absorbed, reads as follows. +\newcount\rowno \rowno1 +\newcount\columnno \columnno1 +\newcount\tnum +\newcount\diff \diff1 +\newcount\n +\def\rows{\global\tnum1 + \global\advance\diff1 + \cols + \ifnum\rowno=\n\lrs\swor\fi + \rs\rows} +\def\swor#1\rows{\fi} +\def\cols{\the\tnum + \global\advance\tnum\diff + \ifnum\columnno=\n\sloc\fi + \cs\cols} +\def\sloc#1\cols{\fi} +\def\cs{\hss\vertrule \ifnum + \columnno<\rowno width0pt\fi\relax + &\global\advance\columnno1 } +\def\rs{\hss\vertrule\relax\cr + \global\advance\rowno1 + \global\columnno1 } +\def\lrs{\hss\vertrule\relax + \global\columnno1 + \global\rowno1 + \global\diff1 \cr} +% +\def\gnonoms#1{\n#1 \offinterlineskip +\halign{&\vbox to12pt{\hbox to15pt + {\hss\strut\oldstyle##}\vss\horrule + \ifnum\rowno<\columnno + width0pt\fi\relax}\cr + \rows}} +\let\vertrule\vrule +\let\horrule\hrule +\exercise Each entry of the table obeys the formula + $$entry_{i,j}=2j-1+(i-1)(j-1).$$ + A little backside of the envelope calculation-\Dash or just + look closer at the table\Dash shows + that elements in neighbouring columns differ by $i+1$. + Format this table as function of the size, i.e., + with the elements generated automatically. +\answer A solution reads as follows (Similar approach as to Pittman's + multiplication tables.) +\thisverbatim{\unmc} +\beginverbatim +\newcount\rowno \rowno1 +\newcount\columnno \columnno1 +\newcount\tnum +\newcount\diff \diff1 +\newcount\n +\def\rows{\global\tnum1 + \global\advance\diff1 + \cols + \ifnum\rowno=\n\lrs\swor\fi + \rs\rows} +\def\swor#1\rows{\fi} +\def\cols{\the\tnum + \global\advance\tnum\diff + \ifnum\columnno=\n\sloc\fi + \cs\cols} +\def\sloc#1\cols{\fi} +\def\cs{\hss\vertrule \ifnum + \columnno<\rowno width0pt\fi\relax + &\global\advance\columnno1 } +\def\rs{\hss\vertrule\relax\cr + \global\advance\rowno1 + \global\columnno1 } +\def\lrs{\hss\vertrule\relax + \global\columnno1 + \global\rowno1 + \global\diff1 \cr} +% +\def\gnonoms#1{\n#1 \offinterlineskip +\halign{&\vbox to12pt{\hbox to15pt + {\hss\strut\oldstyle##}\vss\horrule + \ifnum\rowno<\columnno + width0pt\fi\relax}\cr + \rows}} +\let\vertrule\vrule +\let\horrule\hrule +$$\vtop{\gnonoms2}\qquad + \vtop{\gnonoms5}\qquad + \vtop{\gnonoms{10}}$$ +\bye +!endverbatim + +\exercise Playing longer with the gnonoms can yield the following + graphical results. Modify the above in order to obtain this + graph. +\def\vertrule{\vrule width1ex} +\def\horrule{\hrule height 1ex} +\def\cols{\ifnum\columnno=\n\sloc\fi + \cs\cols} +$$\vtop{\gnonoms3}\qquad + \vtop{\gnonoms5}\qquad + \vtop{\gnonoms{7}}$$ +\answer The following redefinitions yield the results. +\beginverbatim +\def\vertrule{\vrule width1ex} +\def\horrule{\hrule height 1ex} +\def\cols{\ifnum\columnno=\n\sloc\fi + \cs\cols} +$$\vtop{\gnonoms3}\qquad + \vtop{\gnonoms5}\qquad + \vtop{\gnonoms7}$$ +!endverbatim + +\endgroup + +\bluesubhead Font charts + +Font tables can be formatted via +^|\beginchart| and |\endchart|. +This markup is used in \TB{} {\oldstyle468}--{\oldstyle526}, +for the font tables of the Appendices C and F, and +in {\tt testfont.tex}, which comes along with \MF. + +\blueexample ASCII table, \TB{} {\oldstyle367} + +\beginverbatim +\beginchart{\global\count@='41\tentt + \def\chartstrut{\lower4.3pt\vbox to13.6pt{}}} +&\oct{00x}&&NUL&&SOH&&STX&&ETX&&EOT&&ENQ&&ACK&&BEL&&\oddline0 +&\oct{03x}&&CAN&&EM&&SUB&&ESC&&FS&&GS&&RS&&US&\evenline +&\oct{04x}&&SP&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline2 +&\oct{05x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline +\noalign{\vskip2ex\line{\hfil et cetera\hfil} + \vskip2.5ex\hrule + \global\advance\count@ 64 } +&\oct{16x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline7 +&\oct{17x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&DEL&\evenline +\endchart +!endverbatim +resulting in the partial ASCII table +{\catcode`\@=11 +\beginchart{\global\count@='41\postdisplaypenalty=0 \tentt + \def\chartstrut{\lower4.3pt\vbox to13.6pt{}}} +&\oct{00x}&&NUL&&SOH&&STX&&ETX&&EOT&&ENQ&&ACK&&BEL&&\oddline0 +&\oct{03x}&&CAN&&EM&&SUB&&ESC&&FS&&GS&&RS&&US&\evenline +&\oct{04x}&&SP&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline2 +&\oct{05x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline +\noalign{\vskip2ex\line{\hfil et cetera\hfil} + \vskip2.5ex\hrule\global\advance\count@ 64 } +&\oct{16x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline7 +&\oct{17x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&DEL&\evenline +\endchart +} + +%Blank line is needed +\bluesubsubhead Why bother about font charts? + +Well, \dots\thinspace a lot can be learned from \cs{beginchart} +for the markup of classes of tables. + +\bitem Font charts belong to the class of bordered tables +\bitem the template is hidden from the user +\bitem the data can be provided separately and processed on the fly +\bitem the default value of \cs{displaypenalty} can be redefined + via \cs{displaypenalty} |<number>| as argument of + \cs{beginchart} +\bitem \cs{beginchart} is parameterized over the fonts +\bitem ^|\normalchart| keeps automatically track of the positions + in the font chart. +\smallbreak +In short, the macros show how +\bitem to mark up classes of tables +\bitem to hide an \cs{halign} template +\bitem to use two-part macros +\bitem to cope with options and defaults +\bitem to parameterize over fonts, and +\bitem to minimize markup. +\smallbreak + +\blueexample Markup for Appendix F {\oldstyle427}\dash{\oldstyle432} + +\beginverbatim +\beginchart{\postdisplaypenalty=0 \tenrm} + %or \tenit, \tentt, \tenit, \tensy, \tenex + \normalchart +\endchart +!endverbatim +resulting in, for the ^{font chart} \cs{tenrm} +\beginchart{\postdisplaypenalty=0 \tenrm} + \normalchart +\endchart +\noindent The default value of \cs{postdisplaypenalty} is -{\oldstyle10000}, +to enforce a page break. + +\exercise How can we get a print of \LaTeX's ^{line\ font}s? + Why don't you print ^|\oldstyle| too, just for the fun of it? +\answer Similarly, as follows. +\beginverbatim +\font\tenln=line10 +\font\tenlnw=linew10 +\beginchart{\postdisplaypenalty=0 + \tenln} + \normalchart +\endchart +\beginchart\tenlnw + \normalchart +\endchart +!endverbatim + +%end of answer + +The argument of \cs{beginchart} is used among other things to control +the kind of table: \cs{tenrm}, \cs{tenit}, \cs{tentt}, + \cs{teni}, \cs{tensy}, or \cs{tenex}. +The data for normal font tables is provided via |\def\normalchart{...}|. +As a consequence the markup for the +other tables in \TB{} Appendix F is surprisingly simple. +\exercise How come that Knuth decided to implement an ordinary argument + after \cs{beginchart}? If you look at \cs{begindisplay} + nearly the same coding structure is used, but there the argument is + optional. Subtle, very subtle these coding schemes. +\answer There is no much use in providing an optional one. + The font is needed and {\sl must\/} be specified. + +%end answer +\bluesubhead Ordering table for indexing + +The most curious of all tables is not a table but generated +each time. ^^{ordering table} +\thisverbatim{\catcode`\|=12 \catcode`\!=12 \catcode`\~=0 } +\begincenterverbatim +\def\otindex{%Parameters: Ordering `table' +\ea\chardef\csname ot \endcsname=0 +%Bulk according to ASCII +\def\process##1{\ea\chardef + \csname ot##1\endcsname=`##1 } +% +\fifo abcdefghijklmnopqrstuvwxyz\ofif +\chardef\otij=`y \chardef\otIJ=`y +% +\fifo!"##$&'()*+,-./0123456789:;<=>?@ + []_`\ofif +% +\def\process##1{\ea\chardef + \csname ot##1\endcsname=\lccode`##1 } +\uppercase{\fifo + abcdefghijklmnopqrstuvwxyz\ofif}} +~endcenterverbatim +%Back to defaults +\def\header{}\def\rowstblst{}\def\btablecaption{}\def\first{}\def\footer{} +\endinput
\ No newline at end of file diff --git a/info/laan/pwt/pwt.tls b/info/laan/pwt/pwt.tls new file mode 100644 index 0000000000..62a1be6840 --- /dev/null +++ b/info/laan/pwt/pwt.tls @@ -0,0 +1,365 @@ +\input blue.tex \loadindexmacros \report + +\bluechapter Tools + +\beginsummary +BLUe's format comprises tools.dat, a database of tools, +available at your fingertips, which doesn't hinder when not needed. +\endsummary + +At the moment tools.dat, the database of tools, contains macros for +typesetting +bridge, +crosswords, +the tower of hanoi game, +creation of an index (and in there sorting macros), +ntglogo, +Pascal, and +xyz-axes. +Most likely this database will grow. + +\bluehead Use + +Nobody would be surprised to hear that the ease of use of a tool +has all to do with the tool's jargon as implemented by its author. +However, how to access the tool is also important, and we would +love a uniform approach to that, wouldn't we? +Alas, consistency at the outer level\Dash how the tools can be +accessed from the database tools.dat\Dash is too heavy a demand, +as can be seen from the index tool in relation with the other tools. +The tools are just too varied. ^^{database,\ tools.dat} + +\bluesubhead Adding a tool + +First we have to decide what it is that we like to add. +A format? A picture? Or just a tool? +I had to add the \cs{xyz} picture to tools.dat, because it is not a format +and it does not obey the syntax of pic.dat entries, although +it looks like a picture in print to me.\ftn{Remember that the entries + in the address.dat, lit.dat, and pic.dat database obey the syntax + |\lst\<name>{| |<replacement text>}|.} + +The entries of fmt.dat and tools.dat obey the syntax ^^{entry\ for\ tools.dat} +\begincenterverbatim +\tool\<name>fmt \tool\<name>tool +... or ... +\endinput \endinput +!endcenterverbatim + + +To ^{add\ a\ tool} the following has to be done. +\bitem separate the storage-allocating + control sequences from the tool, + i.e., treat \cs{newtoks} and the like separately +\bitem add the storage-allocating control sequences to \bluetex +\bitem add the tool as a definition to tools.dat +\bitem add a load macro to \bluetex. +\smallbreak +\blueexample Add xyz macro to tools.dat + +Suppose we wish to use the \cs{xyz} macro (with three arguments). +What to do? +The use could simply be \cs{loadxyz}, followed by the invocation +|\xyz{...}{...}{...}|. + +In order to make this possible, I have added to tools.dat +\begincenterverbatim +\tool\xyztool +\def\xyz#1#2#3{%the macro +...} +\endinput +!endcenterverbatim +and to \bluetex +\begincenterverbatim +\def\loadxyz{\let\xyztool=x + \loadtool + \let\xyztool\undefined} +!endcenterverbatim +Confusing, isn't it? + +\blueexample Add an environment to tools.dat + +Suppose we wish to make use of the environment +\begincenterverbatim +\begin<yourtoolname> +... +\end<yourtoolname> +!endcenterverbatim +In order to make this possible we have to do several things. +First, add to tools.dat the following `file' +\begincenterverbatim +\tool\<yourtoolname>tool%Opening +<themacros> +\endinput %Closing +!endcenterverbatim +Second, include in \bluetex{} the environment opening and closing, +next to the needed allocations +\thisverbatim{\catcode`\|=12 + \catcode`\!=12 + \catcode`\~=0 + } +\begincenterverbatim +%Tool environment macro +\def\begin<yourtoolname>{\begingroup + \let\end<yourtoolname>\endgroup + \let\<yourtoolname>tool=x + \loadtool +} +%storage allocation +\new<type>\<name> +%<type> is box count dimen fam +% insert language skip +% muskip read toks write +etc. +~endcenterverbatim +Fourth, verify the data integrity. (See later.) + +There are a few restrictions on the macros, as a consequence +of the skipping technique used, i.e., +via \TeX's argument-reading mechanism. +\bitem no outer defs, i.e, \cs{newtoks} and the like, should + be declared in regular \bluetex +\bitem no \cs{par}, use \cs{endgraf}, or |\csname par\endcsname|. +\smallbreak +Remarks. +The restriction with respect to your outer defs can be circumvented by +\bitem defining all macros non-outer, or +\bitem using |\csname newtoks\endcsname\<tag>|, or +\bitem extending \cs{unouterdefs} by your outer defs, i.e., + including \cs{newtoks}, and similars. When these are + part of the format or tool, multiple use + reallocates memory, and because \TeX{} + lacks a garbage collector this will cost extra + memory locations +\bitem sometimes a different macro name for \bluetex{} is needed, such as + the index tool. +\smallbreak +The \cs{tool} macro accepts any |<yourtoolname>| + +\bluesubhead And what about double loading? + +At the moment it is printed in the log file, whenever a tool is loaded. +Sometimes we wish to load a tool anew, for example the pascal +environment. +The index tool is only loaded once.\ftn{Very handy when after + having proofed chapters with an index generated on the fly, + we don't have to delete the \cs{loadindexmacros} tag in the chapters.} +A load counter is maintained to control this. + +\bluesubhead Check for data integrity + +After a tool has been added one can check whether the file can be scanned by +\TeX{} via making a table of contents as follows. +\begincenterverbatim +\input blue.tex +\contentstoolsorfmt{tools} +\bye +!endcenterverbatim +This script produces no pages of output (that is OK). +The file contentstools will be created though. + +\bluesubhead Verbatim listing of a tool + +This problem is induced by my multi-file approach. Of course +one can extract the tool by an editor et cetera as alternative. + +\blueexample Verbatim listing of macros of pascaltool + +\begincenterverbatim +\input blue.tex \let\pascaltool=x +\long\def\tool#1{\ifx#1\undefined\bgroup\unouterdefs\ea\gobbletool + \else\ea\toolverbatim\fi} +%\def\toolverbatim{\thisverbatim{\baselineskip12pt plus2pt minus1pt +% \lineskip1pt plus1pt minus1pt}\beginverbatim} +\def\cgl;newcol{\endverbatim\endinput} +\input tools.dat \bye +!endcenterverbatim + +\thissubhead{\runintrue} +\bluesubhead Conventions for entries fmt.dat\par come down to + +\bitem update the contents at the beginning of the file tools.dat +\bitem |\message{ ---<...>tool, <date>, <owner>--- }| in the beginning +\bitem visual layout for print out +\bitem additional comments which contain markup for line numbering +\bitem addition of table of contents with cross-ref line numbers +\bitem addition of history of changes. +\smallbreak +The layout is aimed at printing in two columns, and start a new column. +The selective line numbering is controlled by the control sequences +\cs{numvrb}, to start line numbering +\cs{vrblin} = |<number>|, to adjust line counter, and +\cs{nonum} to switch off line numbering. +Do remember that the escape char is the semi-colon. + +\blueexample Template for an entry in tools.dat + +\begincenterverbatim +%end%%%%%%<lastlineprevioustool>%;newcol +% +% +%begin%%%%%%%%%%%%%%%%%%%%<....>%;numvrb +\tool\<...>tool +\message{ ---<...>tool, <date>, + <(cr)owner>--- } +%<authorinformation> +%<thetoolproper> +\endinput %;nonum +%Contents +%<item>...................<pagenumber(s)> +%etc +%History of changes +%<date> <change> +%etc +%end%%%%%%%%%%%%%%%%%%%%%%%<....>%!!cgl;newcol +!endcenterverbatim + +\bluehead Binary tree + +^^|\beginbinarytree|^^|\beginbt| +The syntax of the invocation reads +\thisverbatim{\unmc} +\begincenterverbatim +\beginbintree<nodeno><nodevalue> + ... + <nodeno><nodevalue> +<levelno>\endbintree +!endcenterverbatim +See the Tabulair Material chapter for an example. +There is also an example about \cs{beginbt}\dots\cs{endbt}, +a variant\Dash and smarter\Dash implementation of typesetting a binary tree. +The specification of the nodes and their contents +contains less curly braces.\ftn{blue.tex also contains + \cs{bintree} \cs{eertnib}, see the Pictures chapter for an example.} + +\bluehead Bridge + +^^|\beginbridge|%^^|\endbridge| +This is available within the environment +\displaycenterline{|\beginbridge...\endbridge|.} +the following has been copied from the \cs{bridgetool}. +\beginverbatim +%Typesetting bridge publications via (plain) TeX. Version May 92. +%The macros can als be used within LaTeX. +%Version: 1.1 March 1994 (basically unmodified since publication in 1990) +%Author: Kees van der Laan,Hunzeweg 57, 9893PB, Garnwerd (Gr) +% The Netherlands. 05941-1525, cgl@rc.service.rug.nl +%Examples of use have been published in TUGboat, 11, 2, 265--276, and +%MAPS 91.2. +%The macros consist of 3 independent parts: +%- dec.tex ((language) declarations, register used and control sequences) +%- bid.tex (macros for bidding and layout of games) +%- play.tex (macros for discussing the course of a play) +!endverbatim + +\blueexample Bridge bidding, and play + +The following has been copied from the \cs{bridgetool}. The `course of play' +has been printed in the chapter `Tabular Material.' +\beginverbatim +%Examples: diagram, bidding, course of play. +%1. Diagram +$$\crdima{N/None}{\vtop{\hbox{Deal:}\hbox{demo}}}% + {\hand{J74}{AJ}{QJT2}{Q874}}%N + {\hand{K86}{T9542}{874}{T3}}%E + {\hand{QT952}{Q83}{AK5}{A6}}%S + {\hand{A3}{K76}{963}{KJ952}}%W +$$ +%2. Bidding +$$\bbid +1\cl\alert& ? no& 1\sp&\think no\cr + 2\sp& no& 4\sp& a.p.\cr +\noalign{\vskip.5ex}%With the explanation +\alert\ means Alert, conventional bid\hidewidth\cr +? means explanation asked \hidewidth\cr +\think means think pause \hidewidth\cr +\ebid $$ +%3. Course of play +\def\LFTINF{Puzzle} \def\RGTINF{\vtop{\hbox{6NT,}\hbox{by East}}} +\Ns={KQ76}\Es={T9}\Ss={8542}\Ws={AJ3} +\Nh={J98} \Eh={A2}\Sh={QT74}\Wh={K653} +\Nd={J942}\Ed={T5}\Sd={Q876}\Wd={AK3} +\Nc={65}\Ec={KJ9xxxx}\Sc={2}\Wc={AQT} +% +\showgame +% +*Problem* How must NS defend in order to guarantee 1 trick? +*Solution* Start with a \h\ lead in order to break communication. +N must discard \h s and S must discard \sp s. +\smallskip\noindent +\LEADS\bplay +h4! & hK & h8 & h2 & --& 1\LEADW\cr +cA & c5 & cx & c2 & --& 2\cr +cQ & c6 & cx & s2 & --& 3\cr +cT & h9 & cK & s4 & --& 4\LEADE\cr +cJ & s5 & s3 & s6 & --& 5\cr +c9 & s8 & h5 & s7 & --& 6\cr +cx & d6 & sJ & d2 & --& 7\cr +\bintermezzo +\def\RGTINF{\vtop{\hbox to 0pt{NS squeezed on\hss} + \hbox to 0pt{\cl\ continuation?\hss} + \hbox to 7ex{\hss}}} %phantom for alignment +\Ec={{\ooalign{\hfil\raise.07ex% + \hbox{x}\hfil\crcr\mathhexbox20D}}} +\showgame \Ec={x} +\eintermezzo +cx & h7 & h6 & hJ & --& 8\cr +\omit et cetera \hidewidth \cr +\eplay +!endverbatim + +\bluehead Crosswords + +^^|\begincrosswords|%^^|\endcrosswords| +This is available within the environment +\displaycenterline{|\begincrosswords...\endcrosswords|.} +For an example of use see the `Tabular Material' chapter. + +\bluehead Tower of Hanoi + +^^|\hanoi| +This is available as a command but acts as an environment. +\displaycenterline{|\hanoi{...}|.} +An example is provided in the `Tabular Material' chapter. + +\bluehead Creation of an Index + +This is different. ^|\loadindexmacros| should be provided +at the beginning of the script. +At the end supply ^|\sortindex|, followed by ^|\pasteupindex|. +See the `Creation of an Index' chapter for more details. + +\bluehead NTG logo + +When ^|\loadntglogo| is invoked, the logo will be set in a vbox, +\cs{ntglogobox}, for multiple use via for example |\copy\ntglogobox|. + +\blueexample Use NTG logo from tools.dat + +\begindemo +\loadntglogo +\copy\ntglogobox +!yields +\loadntglogo +\copy\ntglogobox +\enddemo + +\bluehead Pascal texts + +^^|\beginpascal|%^^|\endpascal| +This is available within the environment +\displaycenterline{|\beginpascal...\endpascal|.} +An example has been provided in the `Text' chapter. + +\bluehead Smileys + +Just provide \cs{smiley}, \cs{winksmiley}, or \cs{sadsmiley} for +\smiley +\winksmiley +\sadsmiley. + +\bluehead xyz-axes + +This is available as macro \cs{xyz} with three (text label) arguments. +The macro can be invoked after \cs{loadxyz}. +\endinput
\ No newline at end of file diff --git a/info/laan/pwt/pwt.tot b/info/laan/pwt/pwt.tot new file mode 100644 index 0000000000..fc3cc6a988 --- /dev/null +++ b/info/laan/pwt/pwt.tot @@ -0,0 +1,154 @@ +%\input blue.tex +\report +\bluechapter Main Tags + +\beginsummary +A table of main tags of \bluetex{} has been included +to provide a survey of what outer tags +have been implemented for the regular format. +More control sequences and symbols are available, +especially for the lower level markup, +if not for the undocumented features of manmac, +and the wealth of plain \TeX. +The table also illustrates the naming convention adopted +via a root name with prefixes and suffixes. +\endsummary + +The header fields indicate, +the prefixes pre-, post-, this-, every-, pasteup-, and +the suffixes -font, -name and -box. +The first column contains the various root names, with a marker +to denote to what extent the minimal one-part macro +has been implemented. + +\begingroup +\def\first{\hfil\thispicture{\unitlength=6ex \xdim{1.4}\ydim{1}}% + \lower1.5ex\hbox\beginpicture%(1.4, 1)(0,-.1) + \put( 0.0, 0.0){\small \strut Root}% + \put( 1.4, 0.575){\llap{\small Affix}}% + \put( 1.4, 0.1){\line(-2, 1){1.4}}% +\endpicture\lower3ex\null} +\def\header{pre-\cs post-\cs this-\cs every- \cs pasteup- + \cs -font\cs -name%\cs -title + \cs -box} +\def\btablecaption{Main tags for regular scripts} + +\catcode`/=13 +\def/{\leavevmode\thinspace\hbox{% + \vrule\vtop{\vbox{\hrule\kern1pt\hbox{% + \vphantom{\tt e}\thinspace%{\tt#1}% + \thinspace}}\kern1pt\hrule}\vrule}% + \thinspace} % control sequence token +\catcode`-13 \def-{$\neg$} +\def\footer{\qquad\vtop{\small\rlap{- not implemented} + \rlap{${}^+$ implemented} + \rlap{/ implemented without processing on the fly}}} +\def\rowstblst{ +{abstract\hfill\ \tiny+} +{acknowledgements\hfill\ \tiny+} +{btable \hfill\ \tiny/} +{center \hfill\ \tiny+} +{contents\hfill\ \tiny+} +{(sub(sub))head\hfill\ \tiny+} +{keywords\hfill\ \tiny+} +{picture \hfill\ \tiny-} +{pictures\hfill\ \tiny/} +{quote \hfill\ \tiny+} +{references\hfill\ \tiny/} +{script \hfill\ \tiny+} +%{syntax\hfill\ \tiny-} %Although there, not so relevant for the table +{verbatim\hfill\ \tiny-}} +\def\data{% + -\cs-\cs-\cs-\cs+\cs-\cs+\cs+\rs%abstract + +\cs+\cs+\cs-\cs+\cs-\cs+\cs+\rs%abstract + +\cs+\cs+\cs+\cs-\cs-\cs-\cs+\rs%btable + -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%center + -\cs-\cs-\cs-\cs+\cs-\cs+\cs+\rs%contents + +\cs+\cs-\cs-\cs-\cs+\cs-\cs-\rs%head + -\cs-\cs-\cs-\cs+\cs-\cs+\cs+\rs%keywords + -\cs-\cs+\cs+\cs-\cs-\cs-\cs-\rs%picture + -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%pictures + -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%quote + +\cs+\cs+\cs+\cs+\cs-\cs+\cs+\rs%references + -\cs-\cs+\cs+\cs-\cs-\cs-\cs-\rs%script +% -\cs-\cs-\cs-\cs-\cs-\cs-\cs-\rs%syntax + +\cs+\cs+\cs+\cs-\cs-\cs-\cs-%\rs%verbatim +} +$$\vbox{\nonruled\nonframed + \btable\data}$$ +\endgroup +Remarks +\bitem \cs{title}, \cs{subtitle}, \cs{author} and the like, are token + variables and associated with the script +\bitem \cs{pictures} and \cs{references} have been implemented in a + straightforward way, because their use doesn't need processing on the + fly +\bitem In the Appendix Formats similar tables for \cs{transparencies} + and \cs{report} have been included. The latter contains some + more tags. +\smallskip + +\bluesubhead Your summary of markup tags + +Perhaps it is a good idea to add my +Frequently Used Tags, FUTs\Dash indeed a handful, as already +indicated in the template in the `Introduction'\Dash +for personalizing.\ftn{I consider this + very appropriate. At school the irony of cribs was when + prepared carefully they made themselves superfluous. + Transform these summary lists into your personal cribs.} + +\beginverbatim +!bf +Preliminary matter!tt +\title{...} +\subtitle{...} +\keywords{...} +\abstract{...} +\contents{...} +\issue{...} +\acknowledgements{...} +\references{...} +\pictures{...} +!bf +Copy Proper!tt +\beginscript +\endscript +\head{...} +\thissubhead{...} +\subhead{...} +\thissubsubhead{...} +(the \this<headkind>{...} especially together with \runintrue) +\subsubhead{...} +!bf +Inner level!tt +\thisverbatim{...} +\beginverbatim +<escapechar>endverbatim +(and in-line !vrt!thinspace...!thinspace!vrt) +\begincenterverbatim +<escapechar>endcenterverbatim +\beginquote +\endquote +\begindisplay +\enddisplay +(with & and \cr) +\displaycenterline{...} +\btable +(with \data{...\cs...\rs...\cs...\rs...} + \header{...} + \footer{...} + \rowstblst{...} + \vruled{...} ) +\ftn{...} +\bitem +\example{...} +\thispicture{...} +(with \unitlength=...) +\cs{<tagname>} +!bf +Back matter!tt +\pasteupacknowledgements +\pasteupreferences +!endverbatim +\endinput diff --git a/info/laan/pwt/pwt.txt b/info/laan/pwt/pwt.txt new file mode 100644 index 0000000000..1f36d82ebb --- /dev/null +++ b/info/laan/pwt/pwt.txt @@ -0,0 +1,1255 @@ +\input blue.tex \loadindexmacros \loadsmileys \report + \hfuzz=25pt\vbadness=1000 + +\bluechapter Text + +\beginsummary +An introduction to the markup of text has been given. +BLUe's format structure of text is nested to three levels, +each preceded by a title. +The building block is a paragraph. +The markup for \TeX's standard paragraph shape, +the markup for the headings and +the markup for some special text elements have been given. +Examples of the latter are: +items, +quotations, +display text, +centering, +text to be set apart preceded and followed by lines, +PASCAL programs, +verbatims, +exercises and answers, and +footnotes. +\endsummary + +\bluehead Introduction + +Let us assume that we have ordinary text, to be typeset by computer. +What to do? Let us begin by the beginning and write it down. +\begincenterverbatim +An unexpected party + +In a hole in the ground there lived a hobbit. +Not a nasty, dirty, wet hole filled with the ends +of worms and an oozy smell, nor yet a dry, bare +sandy hole with nothing in it to sit down on or +to eat: +it was a hobbit-hole and that means comfort. + +It had a perfectly round door like a porthole, +painted green,... +!endcenterverbatim +We must instruct the computer\Dash that is, supply markup\Dash +to make something nice out of it. How? + +As far as I understand it, ^{Knuth's\ markup} comes down to +just preceding the title by \cs{beginchapter}?!? +That is all. He makes use of the already available +visual markup of blank lines. These blank lines +separate document parts, be it a title from the text +or paragraphs from each other. + +Is that all? Essentially, yes. But\Dash there is always a but\Dash +the role which \cs{beginchapter} has to play is not simple. +Happily, that is not our concern. That is the job of +the book designer in cooperation with the programmer. +I take for granted the niceties of \TeX's text processing\Dash +and which a regular user tends to forget\Dash +such as automatic handling of ligatures, +justification and hyphenation over paragraphs, and +ignoring of superfluous blanks (spaces and lines) in text. +All this is not necessarily restricted to English. + +However, to quote {\TB} `and when you are using plain {\TeX} format, + you need to know that the ten characters +\begincenterverbatim +\ { } $ & # ^ _ % ~ +!endcenterverbatim +cannot be used in the ordinary way when you are typing; each of them +will cause {\TeX} to do something special, \dots' + +After this oversimplification let us go back to BLUe scripts, +full of the right spirit. + +\bluehead BLUe script + +BLUe's format allows text in print to be nested up to {\oldstyle3} levels deep. +The layout of the titles and the shapes of the paragraphs +contribute much to the look-and-feel. +The nesting is reflected in the markup tags +\cs{head}, \cs{subhead} and \cs{subsubhead}. +Also \cs{title} and \cs{subtitle} are there. +The tag \cs{author} has been filled-in by default, +meaning that you don't have to pay attention to it. +It's {\em your\/} format. +You are Ben Lee User. + +\bluehead Headings + +As a tribute to ^{manmac}, BLUe's format provides the following +outer level markup tags as an extra user-interface +on top of the rigorous two-part macros. +\begincenterverbatim +\blue(sub)title <(sub)titletext> + +\bluekeywords <listofkeywords> + +\blue(sub(sub))head <(sub(sub))sectionheadtext> + +\blueexample <exampleheadtext> +!endcenterverbatim +A handful, but\Dash there is always a but\Dash the ^{processing on the fly} +has been lost. +Note that all have a blank line\Dash implicit markup\Dash or +\cs{par} as end separator. Reread page {\oldstyle202} of \TB, please. +I used them in this script, because they counter the ^{curly braces mania}, +or to put it in Knuth's words +\displaycenterline{`\dots you needn't always enclose arguments in braces.'} + +^^{heading,\ markup} +The regular markup for headings reads as follows.\ftn{Of course the long forms + |\begin<tag>| and |\end<tag>| can be used too.} +\displaycenterline{|\head{<headtext>}|} +Similar for \cs{subhead} and \cs{subsubhead}. +No terminating periods are automatically typeset. + +\bluesubhead Parameterization + +The text of a heading is preceded by \cs{prehead} and followed by \cs{posthead}. +Again, similarly for \cs{subhead} and \cs{subsubhead}. +By default the placement within context\Dash that is, +the tokens contained in |\pre<tag>| and |\post<tag>|\Dash +is determined by the following, apart from (stretchable) glue.\ftn{See for + those \TB{}{\oldstyle355}, especially \cs{beginsection}. `The macro first emits glue + and penalties designed to start a new page if the present page is nearly + full, \dots' This mechanism has been borrowed for the various + |\pre(sub(sub))head|-s.} +The latter fills up the page by a page break +to prevent an underfull \cs{vbox} message. + +{\let\css\cs +\def\rowstblst{{\css{head}}{\css{sh}}{\css{ssh}}} +\def\data{\css{bigskip} \cs\css{nobreak}\css{medskip}\css{noindent}\rs + \css{medbreak}\css{noindent}\css{shindent} \cs\css{quad}\rs + \css{smallbreak}\css{noindent}\css{sshindent}\cs\css{quad}\rs} +\def\rowstbsep{\quad} +\def\tag{${<}tag{>}$} +\def\first{\css{}\tag} +\def\header{\css{}pre\tag\cs \css{}post\tag} +\def\footer{{\small*sh stands for subhead, ssh for subsubhead}} +\def\headersep{\kern.5ex\hrule\kern.75ex} +$$\fll\btable\data$$} + +With defaults \cs{subheadindent}{\oldstyle0}pt and +\cs{subsubheadindent}\cs{generalindent}. +I used to mark up headings by the short form, i.e., +by |\head{...}| instead of ^|\beginhead| \dots \cs{endhead}. +From now on\Dash back to the roots\Dash I will use manmac's minimal forms. +In headings I don't need much processing on the fly. + +Automatic numbering is provided in the \cs{report} format. +The idea is to use |\<tag>numbering| token variables. + +The above is only part of the story, just the top of the iceberg +In a document we also like to reuse the head titles for table of contents, +the index, and undoubtedly we need the head numbers sooner or later, +whether they are hidden or not. +So on the one hand we like to process a title on the fly, and +on the other hand we like to store head information, as general as possible, +for reuse. +In the \cs{report} format I had to face the music and deal with those issues. +Happily, the {\bluetex} kernel could do without it. +^^{heading,\ automatic numbering} + +\bluehead Paragraphs + +\TeX's building block is the ^{paragraph}. +This unit is split up into lines to be mapped on pages. +The markup for a paragraph is minimal, i.e., +it is generally implicit and near to natural. +An occasional user is hardly aware of the markup. +In most cases +\begincenterblock +a paragraph starts by the first letter, and +ends by a blank line. +\endcenterblock +The blank line is substituted by \cs{par} automatically. +Explicit markup for a paragraph reads +\begincenterverbatim +\indent %starts a paragraph, an empty box (size \parindent) is inserted + %or \noindent, which just starts a paragraph +<paragraph> +\par %ends the paragraph, and resets defaults of par shape pars + %\hangindent and \hangafter +!endcenterverbatim +On encountering a vertical command in a paragraph, +like \cs{smallskip} and its ilks, +\TeX{} automatically inserts \cs{par}, and because of this +the paragraph is ended. +Each script, and this one is no exception, contains a lot of +ordinary paragraphs.\ftn{For an extensive treatment of paragraphs see + {\TB} chapter~{\oldstyle14}.} + +\bluesubhead Parameterization + +The parameters which govern the standard paragraph shape are given in the +following model.\ftn{Courtesy David Salomon. (A white lie, any + migrated vertical material has been omitted.)} +\def\Xfil{\xleaders\hbox{X}\hfil} +\beginquote\advance\leftskip.25\hsize + \advance\rightskip.25\hsize\small\noindent +\hfil\cs{parskip}\\\null +\hfil\cs{(base)lineskip}\\\null +\cs{parindent}\Xfil\break\null +\hfil\cs{clubpenalty}\\\null +\hfil\cs{(base)lineskip}\\\null +\Xfil\break\null +\hfil\cs{interlinepenalty}\\\null +\hfil\cs{(base)lineskip}\\\null +\hfil$\vdots$\\\null +\Xfil\break\null +\hfil\cs{widowpenalty}\\\null +\hfil\cs{(base)lineskip}\\\null +\Xfil\cs{parfillskip}\break\null +$\longleftarrow$\hfill\cs{hsize}\hfill$\longrightarrow$ +\endquote +The left margin is \cs{hoffset} from the left. +The distance from the left side of the paragraph +to the left margin is the glue \cs{leftskip}. +At the right side the glue has the name \cs{rightskip}. +Between words the glue is \cs{spaceskip} and between +sentences \cs{xspaceskip}. + +The contents of the token variable \cs{everypar} is inserted before +the paragraph text. + +\exercise How can the parameters be set such that the last line + of a paragraph is centered\ftn{Courtesy Anne Br\"uggeman-Klein.}? +\answer \cs{leftskip}0pt plus1fil, + \cs{rightskip}0pt plus$-1$fil, + and \cs{parfillskip}0pt plus2fil. + End the paragraph with |\hskip0pt plus1fil|. + +\exercise One of the problems induced by paragraphs as building blocks is that + it is not easy to provide for line numbering. + How can we achieve this\ftn{Courtesy Jan Kybic.}? +\answer Jan Kybic reported about the several ways he received as answers + to this problem on comp.text.tex. + Below is the solution due to Petr Olsak. Beware it is limited. + The general idea in the solutions collected by Kybic + is to take apart the lines set in a vbox either + starting at the end via \cs{lastbox} or starting at the begin + via \cs{vsplit}, collect these + lines extended by their line numbers, and reinsert these later. + \beginverbatim +%Due to Petr Olsak +%Disclaimer: Macros for plain prose line +%numbering only for ordinary paragraphs +%without display mathematics or other +%specialities. +%(Note added: no \footnote, \centerline.) +\newcount\linenum +\newcount\worknum +\newbox\allparagraph +\def\beginnum{\begingroup\linenum0 + \def\par{\ifhmode\completepar\fi}% + \setbox\allparagraph\vbox\bgroup} +% +\def\endnum{\par\egroup\endgroup} +% +\def\completepar{\endgraf \global + \advance\linenum\prevgraf + \worknum\linenum \setbox0\null + \loop\unskip\unpenalty + \setbox2\lastbox + \ifhbox2 \global\setbox0\hbox + {\llap{$\scriptstyle\the\worknum.$ + }\box2\penalty0\unhbox0}% + \advance\worknum-1 + \repeat\egroup\noindent + \unhbox0\unpenalty\endgraf + \setbox\allparagraph\vbox\bgroup} +!endverbatim +The numbering of verbatim lines has been treated separately. +Another variant is mentioned by Salomon to number the lines on +{\it each page}. +This is handy for proofers to indicate more precisely the commented parts. +See his OTR articles as published in \TUB +\Dash or his courseware `Insights \& Hindsights' + MAPS Special {\oldstyle1992}\Dash +for the modified OTR. +Knuth in \tubissue8(2) {\oldstyle1987}\Dash about letting text +flow around figures\Dash provided the basics for +Hoenig's approach \tubissue{15}(3) {\oldstyle1994}, to let the OTR +create one-line pages\Dash i.e., one can lay hands on each line\Dash +and introduce a `mock'-\cs{everyline}. Promising. + + +\bluesubhead Why a paragraph as unit for line breaking? + +Knuth did choose a paragraph as next larger unit than a line for line +breaking, i.e., for mapping the horizontal list onto lines. +This gives better results than using roughly a line. + +\exercise What happens to accented words? +\answer They hyphenate, but only the part of the word up to the accent control + sequence is subject to hyphenation as such. + However, we can do much better and + use \cs{allowhyphens}\Dash from Appendix~D + {\sl Hanging punctuation}\Dash to be inserted after the place + where the hyphenation stopped. The conclusion is that \TeX{} + can hyphenate properly accented words. + For example the Dutch word + `|onge\"emancipeerde|' can better be input as `|onge\ee{}mancipeerde|' + with\ftn{Courtesy Bernd Raichle and Bas Romeny, + and a wink to dutch.sty.} +\beginverbatim +\def\ee{\nobreak\discretionary{e-}{e}{\"e}\allowhyphens} +\newskip\zzz\def\allowhyphens{\nobreak\hskip\zzz} +\hyphenation{man-ci-peer-de} +!endverbatim +Note that because of the Dutch rules with respect to a dieresis +use has to be made of \cs{discretionary} as well. +The explanation is that the search for hyphenation patterns is stopped +when an explicit kern, induced by the accent, is encountered. +To let \TeX{} resume hyphenation of the remainder +the zero glue \cs{hskip} is inserted. A line break is inhibited +by \cs{nobreak}. The first \cs{nobreak} is needed to isolate the effect +of the \cs{discretionary}. Normally when a discretionary is encountered +\TeX{} stops hyphenating the complete word. + + +\exercise What is wrong with |pretext\par\llap`Quotation'|? +\answer \cs{llap} does not start the horizontal mode. Insert \cs{leavevmode} + after \cs{par}. + +\exercise What is the unexpected result of |\par{\bf New paragraph} blah blah| + with |\everypar{\hang}| active\ftn{Courtesy Alan Reese}? + And why?\ftn{Courtesy Jeremy Henty.} + Note that \cs{bf} is only there to make the pitfall look + realistic. +\answer Without braces the text comes out as a block. With the braces at the + beginning there is no effect of the automatically inserted \cs{hang}. + The explanantion reads as follows. + When processing ordinary text, \TeX{} does not enter horizontal mode + until it encounters a letter. In the troublesome paragraph the first + letter is inside a group. When the group ends all local assignments + are undone, and the effect of the \cs{hang} instruction\Dash + the contents of \cs{everypar} is inserted within the group\Dash + is forgotten. + A solution is to precede the group by \cs{leavevmode}, + because the \cs{everypar} will be executed before the group then. + + +\exercise How can we allow for hyphenation in teletype font? +\answer This is handy when we set control sequences in \cs{tt} + in two-column. Provide +\beginverbatim +\hyphenchar\tentt=`- +!endverbatim + +\exercise And what about page breaks? +\answer The fact is that Knuth did not implement a spread or a chapter + as next larger unit than a little more than `a page' for page breaking, + i.e., for mapping the main vertical list onto pages. + Perhaps this was dictated by the status of the hardware technology + when \TeX{} was designed. + +\noindent The ^{hyphenation} process can be customized by +\beginverbatim +\lefthyphenmin=<number> \righthyphenmin=<number> +!endverbatim +which are {\oldstyle2} and {\oldstyle3} by default, +and via exceptions as argument to +\cs{hyphenation}. For \TB{} Knuth used as exceptions +\beginverbatim +\hyphenation{man-u-script man-u-scripts ap-pen-dix} +!endverbatim +Hyphenation assignments are global and cumulative. +For more details start with Appendix~H of \TB. + +\bluesubhead Special paragraphs + +\TeX{} provides \cs{parshape}, \cs{hangindent} and \cs{hangafter} +for special paragraph shapes. A captivating example is provided +in \TB{} {\oldstyle101}. + +\blueexample Miniature + +History has it to start the first paragraph of a chapter +with a `Miniature.' ^^{miniature} +Knuth in his `Preface' showed how to mark up such kinds of paragraphs. +This is an illustration of the use +of \cs{hangindent}\ftn{\cs{hang} assigns the value + of \cs{parindent} to \cs{hangindent}.} +and \cs{hangafter}, as well as of the use of +\cs{smash} outside math mode. +There is no need for a special `^{dropped capital}' macro, because it is +really simple. + +\cs{cglpic} is the minitiature used from the picture database pic.dat. +For an nice application\ftn{Courtesy Huub Mulders.} see the miniature in the +NTG information, on the inside of the back cover.\ftn{Knuth in \tubissue8(2), + {\oldstyle1987}, touched upon the general problem how to + let text {\it flow around\/} figures. + Hoenig \tubissue{15}(3), {\oldstyle1994}, provided user-friendly macros.} +\begindemo +\pictures{\gpic}%load gpic +\parindent=24pt +\noindent\hang\hangafter-2 +\smash{\lower13pt\hbox to0pt{% +\hskip-\hangindent\gpic +\hfil}}{\smc entle Reader}: +This is a handbook about \TeX, +a new typesetting system +intended for the creation of +beautiful books\Dash and +especially for books that +containa lot of mathematics. +!yields +\pictures{\gpic} +\parindent=24pt +\noindent\hangindent\parindent +\hangafter-2 +\smash{\lower13pt\hbox to0pt{\hskip + -\hangindent\gpic\hfil}}{\smc entle Reader}: +This is a handbook about \TeX, +a new typesetting +system intended for the creation of beautiful +books\Dash and especially for books that contain +a lot of mathematics. +\par\noindent +\enddemo + +Remark. Realize that the reference point for the \cs{smash} + is where the {\smc e} starts, and that the first ({\oldstyle2}) lines are + indented. + Within the \cs{smash} you can move around as you wish, leaving the + reference point and the other things outside invariant. +Note the use of \cs{smc} to smooth the transition from the miniature to the +rest of the text. + +\exercise Compare the above simplified version of Knuth's opening + sentence with the real one in \TB{} script. + +\exercise At the end of each paragraph \TeX{} resets the paragraph shape + parameters. How can we retain these values\ftn{Courtesy + Marek Ry\'cko and Bogus{\l}aw Jackowski.}? +\answer Use |{\par}| instead of \cs{par}. See + their article `From \cs{indent} to \cs{par},' + MAPS{\oldstyle94}.{\oldstyle2}, among other things. + The point is they are changed, but\Dash + there is always a but\Dash on encountering + a \cs{par} the paragraph shape parameters are reset {\sl locally}, + within the group so to say. + After the group closing, the right curly brace, + the old values pop up again, which yields the effect. + Note. This method was first elucidated by the author of \TeX{} + and communicated in a private letter to Elizabeth Barnhart, of + {\oldstyle1987}. + + +\exercise Is the scope of \cs{leftskip} and \cs{rightskip} restricted + to a paragraph? +\answer No, it is not. + +\blueexample Flushed right paragraphs + +At the end of each chapter in \TB{} +quotations are set as flushed paragraphs. ^^{paragraphs,\ flushed} +A little simplified the following will +do the job. The key issue is the +use of \cs{leftskip} and the zero value +of \cs{rightskip} and \cs{parfillskip}. +\cs{manmacauthor} is the \cs{author} macro from manmac to +set the author part in those quotations. + +\begindemo +\leftskip0pt plus40pc + minus\parindent +\rightskip0pt\parfillskip0pt +\everypar{\sl}\obeylines +I got the BLUes, +but I like it +\manmacauthor{Anonymous} + (20th Century) +\bigskip +It contains all +\manmacauthor{DeK}(1978) \TB +!yields +\leftskip 0pt plus 40pc minus\parindent +\rightskip0pt\parfillskip0pt +\everypar{\sl}\obeylines +I got the BLUes, +but I like it +\manmacauthor{Anonymous}(20th Century) +\bigskip +It contains all +\manmacauthor{DeK}(1978) \TB +\enddemo + +\exercise Why is |\everypar{\sl}| needed, instead of just \cs{sl}\ftn{Courtesy + Staszek Wawrykiewicz}? +\answer In \cs{manmacauthor} \cs{rm} is switched on for the special + paragraph of the author line. + The next quotation, if there is one, takes \cs{sl} again, automatically. + Note that the \cs{noindent} in \cs{manmacauthor} is mandatory, + because it starts the new paragraph and therefore \cs{rm} will + be in effect. It will come after the automatically inserted + \cs{sl}. + +\bluesubhead Customization + +The hook for customization of paragraphs is +the token variable \cs{everypar}. +A nice application of \cs{everypar}, next to \cs{sl} above, +is to number lines automatically in verbatim texts. + +\bluehead Accents and ligatures + +Some ligatures come automatically while others have to marked up for. +\begindemo +TB ex9.2-3 +{\AE}sop's {\OE}uvres en fran\c cais\\ +p\^at\'es +!yields +$$\hbox{{\AE}sop's {\OE}uvres en fran\c cais}$$ +$$\hbox{p\^at\'es}$$ +\enddemo +Remark. From \TB~{\oldstyle54}. \dots`It's important to remember that these +conventions for ^{accents} and special letters are not built into {\TeX} itself; +they belong to the plain {\TeX} format, which uses the Computer Modern fonts.' + +\bluehead Paragraphs with digits + +^^{numbers in paragraphs} +When numbers occur in paragraphs they look irregular, they exceed the size +of lowercase letters. Typographers advise to use \cs{oldstyle}. +Minimal markup can be achieved via \cs{on}, for example |\on3|.\ftn{When a space +should follow the number end the number by |{}|{\tt\char32}.} + +\bluehead Use of special text elements + +Examples of special text elements are: + items, labeled by a bullet, by a number, or alphabetically; + centering, + quotations; + (non-centered) displays; + text to be set apart, preceded and followed by a line; + PASCAL text; + syntax diagrams; + verbatims; + exercises and answers; and + footnotes. + +The markup for these elements will be shown by examples. + +\bluesubhead Items + +At the basis are plain's one-parameter \cs{item} and \cs{itemitem}, +which take as argument the item marker. +The bulleted item, ^|\bitem|, comes from \TB{} ex{\oldstyle14}.{\oldstyle20}. +^|\nitem|\Dash numbered items\Dash +^|\aitem|\Dash alphabetically labeled items, lowercase\Dash +^|\Aitem|\Dash alphabetically labeled items, uppercase\Dash and +^|\eitem|\Dash enumerated items, +are similar extensions. +The extensions provide the marker automatically, no argument is needed. +Note that the closing tag is \cs{smallbreak}.\ftn{Knuth advised \cs{medskip} + before and after, \TB{} {\oldstyle102}. I sobered this and made use of + \cs{smallbreak}'s paragraph terminating function.} + +\blueexample Items + +\begindemo +\bitem first item +\itemitem{--} subitem +\bitem second item +\smallbreak +!yields +{\parindent=1pc +\bitem first item +\itemitem{--} subitem +\bitem second item +\smallbreak} +\enddemo + +\bluesubhead Quotations + +A special case of centering a block is the so-called quotation, indented +on the left and the right by the same (fixed) amount, usually the value +of \cs{parindent}. ^^|\beginquote| + +\blueexample Quotations + +\begindemo +pretext +\beginquote +Some text to be set apart, +indented on the left and +on the right +\endquote +posttext +!yields +pretext +\beginquote +Some text to be set apart, +indented on the left and on the right. +\endquote posttext +\enddemo +Add a little to this to obtain \cs{beginsummary} and +\cs{endsummary}, abstracting in the markup from formatting details. +A step towards descriptive or functional markup. The summaries +at the beginning of each chapter of PWT have been marked up in this way. +Perhaps it is also good to mention here that accents don't start horizontal +mode. If you like to quote then start with \cs{leavevmode}\Dash to enforce +horizontal mode\Dash followed by |\llap`| or so. + +\bluesubhead Setting text apart + +^|\beginlines| and |\endlines|, \TB{} {\oldstyle583}--{\oldstyle591}, +is in display (zero-indented), +which obeys the line structure and inserts a \cs{hrule} for and aft. +For an example of use I borrowed the following from \TB, where it is +used in combination with in-line verbatim. +\cs{obeylines} is on.\ftn{Variant \cs{endlines} are + \cs{weak\-end\-li\-nes}, \cs{fi\-nal\-end\-li\-nes}. + The former uses a \cs{medskip} instead of a \cs{medbreak}.} + +\blueexample Setting text apart + +\thisverbatim{\catcode`\|=12 } +\begindemo +%TB 343 +\beginlines +|%This is the plain TeX format | +|%that's described in The TeXbook.| +\dots +\endlines +!yields +\beginlines +|%This is the plain TeX format| +|%that's described in The TeXbook.| +\dots +\endlines +\enddemo + +\bluesubhead Centering in display + +Plain \TeX{} provides \cs{centerline}. +BLUe's format provides the extension ^|\displaycenterline|, +to center a line with display glue for and aft, and +^|\begincenter| \dots \cs{endcenter}, and ^|\begincenterblock| \dots +\cs{endcenterblock} to center each line of the block. +^^|\begincenterdisplay| + +\blueexample Centering in display + +\begindemo +pretext +\displaycenterline{I $\heartsuit$ + \TeX{} \winksmiley} +text in between +\begincenterblock +Sign of times? +The extraordinary rate of change. +\endcenterblock +intermediate text +\begincenter +TLC +tender loving care +that is all there is +\endcenter +posttext +!yields +pretext +\displaycenterline{I $\heartsuit$ \TeX{} \winksmiley} +text in between +\begincenterblock +Sign of times? +The extraordinary rate of change. +\endcenterblock +intermediate text +\begincenter +TLC +tender loving care +that is all there is +\endcenter +posttext +\enddemo +Remarks. +Agreed, \cs{displaycenterline} is a special case and therefore superfluous. +An alternative for centering of a block\Dash although a little different\Dash +is \cs{raggedcenter} +`that partitions the words of a paragraph into as few as possible lines + of approximately equal size and centers each individual line. + Hyphenation should be avoided if possible.' +{\TB} ex{\oldstyle14}.{\oldstyle34}. + +\exercise Do |\begincenter...\endcenter| and +|\begincenterblock...\endcenterblock| allow for page breaks? +\answer |\begincenter...\endcenter| does. + |\begincenterblock...\endcenterblock| does not, + because it is a \cs{vbox}. + +\bluesubhead Non-centered displays: one-line, multi-lines and multi-columns + +^|\begindisplay| and |\enddisplay|, \TB{} {\oldstyle434}--{\oldstyle439}, +yields an indented display. Very powerful and user-friendly. + +\blueexample Non-centered displays: one-line, multi-lines and multi-columns + +\begindemo +pretext +%TB 3 +\begindisplay + ``I understand.'' +\enddisplay +posttext +!yields +pretext\begindisplay + ``I understand.'' +\enddisplay posttext +\enddemo + +Multi-line displays can be handled by ending each line +in the environment by the control sequence \cs{cr}. ^^{multi-line displays} +The indentation is the value of \cs{displayindent}, +default {\oldstyle0}pt, next to the |\hbox to\parindent{}| because of the +\cs{indent} in the (hidden) template. + +\begindemo +pretext +%TB 4 +\begindisplay + a hyphen (-);\cr + an en-dash (--);\cr + an em-dash (---);\cr + a minus sign ($-$).\cr +\enddisplay +posttext +!yields +pretext +\begindisplay + a hyphen (-);\cr + an en-dash (--);\cr + an em-dash (---);\cr + a minus sign ($-$).\cr +\enddisplay +posttext +\enddemo + +Another subtle point is that more-column copy can be displayed, +because a repetitive template has been used. + +\begindemo +pretext +%TB 29 +\begindisplay \hbadness10000 + \hbox spread-.666667em{The + badness of this line is 100.}& + (very tight)\cr + \hbox spread-.333333em{The + badness of this line is 12.}& + (somewhat tight)\cr + ... +\enddisplay +posttext +!yields +pretext +\begindisplay \hbadness10000 + \hbox spread-.666667em{The + badness of this line is 100.}& + \ (very tight)\cr + \hbox spread-.333333em{The + badness of this line is 12.}& + \ (somewhat tight)\cr + ... +\enddisplay +posttext +\enddemo + +\exercise How can we center a \cs{begindisplay}\dots \cs{enddisplay}? +\answer Enclosing the construct with a \cs{vbox} in math display does + not work, which is the usual way to center a \cs{halign}. + This comes from the fact that the construct is recognized as an + alignment display. A solution is +\beginverbatim +{\def\enddisplay{\crcr\egroup\egroup$$} + \begindisplay\vbox\bgroup + <displaymaterial> + \enddisplay} +!endverbatim +Perhaps it is simpler for those cases to fall back on the following +usual markup +\beginverbatim +$$\vbox{\halign{<template> + <displaymaterial> + }}$$ +!endverbatim + +%end answer +\bluesubhead Syntax diagrams + +Markup tags are +\begincenterdisplay +^|\beginsyntax|\dots |\endsyntax| &the environment\cr +^|\alt| &to start an alternative\cr +^|\is| &to define left element\cr +\thisverbatim{\unmc}|<| and \thisverbatim{\unmc}|>| + &to start and end a unit.\cr +\endcenterdisplay +When a line starts with +\thisverbatim{\unmc}|<| it is assumed +that a new rule starts. \cs{obeylines} is on. +The end-of-line is redefined to take the appropriate action. +In the example below a \cs{quad} is +used in the markup to prevent starting a new rule. +The \% sign at the end of a line annihilates the effect of +the e-o-l, and prevents a new rule to start. + +\blueexample Syntax diagrams + +\thisverbatim{\unmc} +\begindemo +%TB 268 +\beginsyntax +<unitofmeasure>\is +\quad<optionalspaces>% + <internalunit> +\alt<optional {\tt true}>% + <physicalunit> +\endsyntax +!yields +\beginsyntax +<unit of measure>\is +\quad<optionalspaces><internalunit> +\alt<optional {\tt true}><physicalunit> +\endsyntax +\enddemo + +\bluesubhead Programs + +Program texts are special, due to the use of non-monospaced fonts. +\bluetex{} assumes that the ^{PASCAL texts} have been prepared in such +a way that they are insensitive to font spacing.\ftn{Courtesy Wilson + and Addyman. Compare the markup with \TB{} {\oldstyle234} and + ex{\oldstyle18}.{\oldstyle9}, + and you will appreciate + the approach of BLUe's format typesetting of PASCAL.} +^^|\beginpascal| + +\blueexample Programs + +\begindemo +\beginpascal +(*Print length of third side of + triangle given two sides and + enclosed angle*) +program EX4A(input, output); +var a, b, c angle : real; +begin read(a, b, angle); + c:=sqrt(sqr(a)+sqr(b)- + 2*a*b*cos(angle)); + writeln('The third side is', c) +end. +\endpascal +!yields +\beginpascal +(*Print length of third side of + triangle given two sides and + enclosed angle*) +program EX4A(input, output); +var a, b, c, angle : real; +begin read(a, b, angle); + c:=sqrt(sqr(a)+sqr(b)- + 2*a*b*cos(angle)); + writeln('The third side is', c) +end. +\endpascal +\enddemo + +Perhaps it is not nice to have the types in the same font as variables. +PASCAL can be extended with types, +and therefore names of types are also variable. +An open problem is the vertical alignment because of the monotype fonts in the input +and the variable-width fonts used in the typeset result. Proofing needed. + +\exercise How can we use the macros for typesetting program fragments + in other languages? +\answer The set of reserved words has to be customized, next to + the handling of special symbols. + +%end exercise + +\bluesubhead Verbatims + +The functionalities are ^{verbatim\ text} (in-line and in display), +and file verbatim inclusion. + +The markup starts with ^|\beginverbatim| and ends with +^|<escapechar>endverbatim|. The default escape character is `!'. +`Options,' for among other things numbering and enabling of metacode, +are handled via the token variables +\cs{thisverbatim}, or globally via \cs{everyverbatim}. + +The place within context is controlled via +the token variables ^|\preverbatim| and ^|\postverbatim|. + +It is true that verbatims are heavily used +by authors who write in \AllTeX{} about \AllTeX, +and perhaps not so relevant for math authors. + +\blueexample Verbatims: escape char use + +\thisverbatim{\catcode`\|=12 \let\-=- + \catcode`\!=12 + \catcode`\<=12 + \catcode`\-=0 } +^^{verbatim,\ escape char} +\begindemo +%To handle via ! (escape char) +% -- other fonts +% -- emc (enable metacode) +\thisverbatim={\emc} +\beginverbatim +Some <metacode> and +blah, blah, ... !it +Now text in italics!tt +and back again in tt +!endverbatim +-yields +\thisverbatim={\emc} +\beginverbatim +Some <metacode> and +blah, blah, ... !it +Now text in italics!tt +and back again in tt +!endverbatim +\enddemo + +\blueexample Verbatims: line numbering and file inclusion + +\thisverbatim{\catcode`\|=12 + \let\-=- \catcode`\!=12 + \catcode`\<=12 + \catcode`\-=0 } +^^{verbatim,\ line numbering} +^^{verbatim,\ file inclusion} +\begindemo +pretext +\everyverbatim={\numvrb} +\thisverbatim={% + \catcode`\!=12 + \catcode`\|=12 +% \input vrb.tex %<file> + \makeescape\*}%To terminate +\beginverbatim +Extras after file +*endverbatim +\noindent posttext +-yields\noindent +pretext +\everyverbatim={\numvrb} +\thisverbatim={\emc + \catcode`\!=12 + \catcode`\|=12 +% \input vrb.tex + \makeescape\*}%To terminate +\beginverbatim +<file> +Extras after file*nonum +*endverbatim +\noindent posttext +\enddemo + +\blueexample Verbatims: line numbering + +\thisverbatim{\catcode`\|=12 + \let\-=- \catcode`\!=12 + \catcode`\<=12 + \catcode`\-=0 } +\begindemo +\thisverbatim={\numvrb + \catcode`\~=9 + \catcode`\*=14 } +\beginverbatim +Just some text with +ligatures such as ?` switched +off (TB 381). +line numbers restarted via +<escapechar>numvrb.!nonum +<escapechar>nonum switches off +line numbering. +<escapechar>vrblin<number> +assigns +<number> to the line counter. + + +!numvrb~After two blank* +lines.!nonum +!endverbatim +-yields +\thisverbatim={\numvrb + \catcode`\~=9 + \catcode`\*=14 } +\beginverbatim +Just some text with +ligatures such as ?` switched +off (TB 381). +line numbers restarted via +<escapechar>numvrb.!nonum +<escapechar>nonum switches off +line numbering. +<escapechar>vrblin<number> assigns +<number> to the line counter. + + +!numvrb~After two blank* +lines.!nonum +!endverbatim +\enddemo + +\blueexample Verbatims: in line + +\thisverbatim{\catcode`\|=12 + \let\-=- %\catcode`\!=12 + \catcode`\<=12 + \catcode`\-=0 } +^^{verbatim,\ in-line} +{\def\-{\hbox{-}} +\begindemo +\thisverbatim{\emc} +Before |<in!-lineverbatim>| after. +-yields\indent +\thisverbatim{\emc} +Before |<in!-lineverbatim>| after. +\enddemo} +Also provided is \cs{unmc} to unable metacode. + +For ^{long\ verbatim\ listing}s supply +\beginverbatim +\everyverbatim{\baselineskip12ptplus2ptminus1pt\lineskip1ptplus1ptminus1pt} +!endverbatim +to prevent underfull vbox messages. +\exercise How can we put \cs{it}, and \cs{tt} at the beginning of + the lines? +\answer The naive way introduces an unwanted space. We can get rid of + a space after a control sequence via the use of a control symbol + with category code 9 (to be ignored) after those control sequences. + +\exercise How can we center verbatims? ^^|\begincenterverbatim| +\answer This is included in BLUe's format and reads as follows. +\thisverbatim{\catcode`\~=0 \catcode`\!=12 } +\beginverbatim +\def\boxlines{\obeyspaces\fifol} +%\gdef\fifol#1^^M{\ifx\lofif#1\lofif\fi +% \processl{#1}\fifol} +\def\begincenterverbatim{$$% + \def\processl##1{\hbox{##1}}% + \def\lofif##1\fifol{\fi\egroup + \egroup$$\thisverbatim{}} + \let\endcenterverbatim\lofif + \bgroup\tt\setupcopy + \let\!=!\catcode`\!=0 + \the\everyverbatim\the\thisverbatim + \vbox\bgroup\boxlines} +~endverbatim + +\exercise A math display does not end a paragraph, it is part of the + paragraph with the effect that paragraph parameters + are not reset to their defaults. What about \cs{beginverbatim} + |!!endverbatim|? +\answer It looks although all depends on the values of \cs{preverbatim} and + \cs{postverbatim}. The defaults are \cs{medskip} and + \cs{smallbreak}. The former does not insert a \cs{par} + while the latter does. As is well-known a \cs{par} + terminates a paragraph. However, the subtleness is that + \cs{begingroup} and \cs{endgroup} enclose the verbatim + which, \TB{} 279 `don't change the mode.' On reading I did not + understand the consequences of the quoted sentence. + A small experiment taught me that the paragraph parameters are not + reset. Therefore the \cs{beginverbatim} |<escapechar>endverbatim| + just {\it interrupt\/} the paragraph, similar to the math display. + +%end exercise + +Remark. As known \TeX{} makes use of special characters. For example +when \% is input the \% is not obtained in print, but rather the rest of +the input line is considered as comment. +Similar for $<$, $>$ and \vrt{} in horizontal mode, although for a different reason. +Because of this the less than and greater than symbols can be used nicely +for syntax charts and the vertical bar for in-line verbatim. + +\bluesubsubhead Pitfalls + +There are some pitfalls that I know of and that +a user might like to be aware of. ^^{verbatim,\ pitfalls} +\bitem Default \cs{emc} and when the less than and greater than signs are + used curious error messages occur. Remedy |\thisverbatim{\unmc}|. +\bitem Long verbatims give a bunch of underfull vbox messages. + Remedy |\everyverbatim{|\\ + |\baselineskip12pt plus2pt minus1pt|\\ + |\lineskip1ptplus1ptminus1pt}| +\bitem And \dots don't forget ! is the default escape character. +!endverbatim +\smallbreak + +\bluesubhead Exercise and answer + +Exercises and answers have to be marked up as follows. +\blueexample Exercise and answer + +\begincenterverbatim +\exercise<exercisetext> +\answer<answertext> + +%followed by a blank line +!endcenterverbatim + +\bluesubhead Footnotes + +Plain \TeX{} provides the \cs{footnote} command. ^^{footnote, + automatic numbering} +\TB{} ex{\oldstyle15}.{\oldstyle12} deals with how to number a footnote +automatically. +In \bluetex{} the markup for the latter is ^|\ftn||{<footnotetext>}|. + +In the title part of an article\Dash or report\Dash +BLUe falls back on \cs{footnote}, because those footnotes +are some sort of out of order. That use reads as follows. + +\blueexample Footnotes + +\begincenterverbatim +\footnote*{<titlefootnotetext>} +%or +\footnote{**}{<titlefootnotetext>} +%etc. +!endcenterverbatim +The above is regular \TeX. Because of me using \cs{oldstyle} for the numbering +the {\oldstyle*} symbol will be obtained instead of *. To correct this +provide |{\rm *}|, or just forget about a marker and provide an empty group. +From the context it is clear enough that the note is about the title. +The footnotes are set in {\oldstyle8}pt. + +^^{margin notes} +\exercise And what about notes in the margin? +\answer This is not implemented in \bluetex's OTR. + It is rather difficult to combine that with flexibility + with the number of columns. + If needed occasionally use \cs{vadjust}. + +%end exercise + +\bluehead Fonts and size switching + +Default {\oldstyle10}pt is used. ^^{fonts\ and\ size\ switching\ macros} +For the moment I stay with Knuth and copied his size-switching +macros.\ftn{Because of this attitude + I could easily kameleon \cs{oldstyle} to all those sizes. + To achieve this with NFSS would have cost me much more time, + I guess.} +BLUe's format contains the size-switching macros +\cs{Large}, $\approx$\thinspace{\oldstyle17}pt, used for chapter headings, +\cs{large}, $\approx$\thinspace{\oldstyle14}.{\oldstyle5}pt, +used for transparencies, +and \cs{small}, that is, {\oldstyle8}pt, used for footnotes. +Next to these \cs{tenpoint}, \cs{ninepoint}, and +\cs{eightpoint} have been inherited from manmac. + +\cs{tiny} has size {\oldstyle5}pt and has been setup similar to the +\cs{...type} macros from Knuth's concert format, Appendix~E of \TB. +A pedagogical stepping stone for size-switching macros, +and sufficient for just text. +\beginverbatim +\def\tiny{\fiverm\baselineskip7pt\let\it\fivei\let\bf\fivebf\let\oldstyle\it} +!endverbatim +\exercise How to setup a general \cs{twelvepoint} size-switching macro? +\answer Copy Knuth's \cs{tenpoint} and adjust for the size. +\beginverbatim +\def\twelvepoint{\def\rm{\fam0\twelvenrm}% + \textfont0=\twelverm\scriptfont0=\ninerm + \scriptscriptfont0=\sevenrm + \textfont1=\twelvi \scriptfont1=\ninei + \scriptscriptfont1=\seveni + \textfont2=\twelvesy\scriptfont2=\ninesy + \scriptscriptfont2=\sevensy + \textfont3=\twelveex\scriptfont3=\tenex + \scriptscriptfont3=\tenex + \def\it{\fam\itfam\twelveit}\def\oldstyle + {\fam1 \twelvei}\textfont\itfam=\twelveit + \def\sl{\fam\slfam\twelvesl}% + \textfont\slfam=\twelvesl + \def\bf{\fam\bffam\twelvebf}% + \textfont\bffam=\twelvebf + \scriptfont\bffam=\sevenbf + \scriptscriptfont\bffam=\fivebf + \def\tt{\fam\ttfam\twelvett}% + \textfont\ttfam=\twelvett + \tt \ttglue=.5em plus.25em minus.15em + \normalbaselineskip=14pt minus1pt + \def\MF{{\manual META}\-{\manual FONT}}%fixed + \let\sc=\tenrm + \let\big=\fourteenbig + \setbox\strutbox=\hbox{\vrule + height10pt depth4pt width\z@}% + \normalbaselines\rm} +\def\fourteenbig#1{{\hbox{$\left#1\vbox + to12pt{}\right.\n@space$}}} +!endverbatim +Make sure all the used fonts are available, otherwise +provide scaled versions. See the script for \cs{Large}. + +%end answer +\exercise What is the effect of |\bf\it|? And of |\it\bf|? +\answer Once you realize that \cs{bf} and \cs{it} are shortcuts + to the fonts \cs{tenbf} and \cs{tenit}, actually to the family, + the answer prompts itself: the last font, that is italics + respectively bold face roman. + One of the features of NFSS is that you will get bold italics + in both cases, that is these tags commute, or am I mistaken? + +\exercise Experiment with the difference between \cs{twelvepoint} + and the use of \cs{magstep1}.\ftn{Courtesy Nico Temme.} + +\bluehead Table of Contents + +I must confess that my way of writing has changed. +Now I start keyboarding with a vague idea of the sections and their +structural dependence. +This style of working badly needs an automatically generated +table of contents, ^{ToC} for short. +The markup to achieve a ToC in the default {\bluetex} reads as follows. +\begincenterverbatim +\input blue.tex \loadtocmacros +\beginscript +<copyproper> +\pasteuptoc +\endscript +!endcenterverbatim +Remark. +The example titles are interspersed with the sections in the ToC, +because my purpose is to supply an overview while writing, and +not for finding the appropriate section to assist the reader. +However, this dynamically generated ToC can be inserted as part of the copy, +eventually enriched by hand, for the convenience of the reader. + +For the \cs{report} format \cs{loadtocmacros} {\em must\/} be omitted. +The necessary macros come already with \cs{report}. +This ToC is aimed at the reader. + +\bluehead Index + +The \cs{report} format has been designed to provide also an index on the fly +if one wishes. There is nothing against it to play also with it +in the default format. +\begincenterverbatim +\input blue.tex \loadindexmacros +\beginscript +<copyproper>%marked up with IRs +\sortindex\pasteupindex +\endscript +!endcenterverbatim +\endinput diff --git a/info/laan/pwt/readme.fst b/info/laan/pwt/readme.fst new file mode 100644 index 0000000000..a965934c9e --- /dev/null +++ b/info/laan/pwt/readme.fst @@ -0,0 +1,66 @@ +What is't? (the collection of pwt.*** files) %June, 1996 +----------- + +Publishing with TeX (pwt for short) +is the user's guide which comes with BLUe's format system. + +How to process the PWT user's guide? (also available on NTG's 4AllTeX CD-ROM and +------------------------------------ TUG/ukTuG/GUTenberg Tex-alive CD-ROM) + +Copy Blue's format files +(blue.tex, fmt.dat, tools.dat, pic.dat) +in addition to the PWT files you wish. + +pwt.scr is the root script which invokes all the other chapters: + pwt.int Introduction + pwt.txt Text + pwt.mat Mathematics + pwt.tab Tables + pwt.grf Graphics + pwt.ref References + pwt.ind Indexing + pwt.cus Customization + pwt.aft Afterthoughts + pwt.fmt Appendix: formats + pwt.tls Appendix: Tools + pwt.sur Appendix: Survey (of related material) + pwt.his Appendix: History of changes + pwt.tot Appendix: Table of Tags + pwt.obs Appendix: Obsolete items + +A preview or print can be obtained after + + tex pwt.scr + +(Each chapter can be processed independently such as + tex pwt.int +for example. (close after prompt with \end or \pasteupindex\sortindex\end).) + +Contents BLUe's format system (also available on NTG's 4AllTeX CD-ROM and +----------------------------- TUG/ukTuG/GUTenberg Tex-alive CD-ROM) + + +The files are: blue.tex (format) + fmt.dat (variant formats) + tools.dat (tools like indexing) + address.dat, lit.dat, pic.dat (databases addresses, literature, pictures) +Its user's guide is called Publishing with TeX. +TeX nical aspects have been explained in the Paradigm series. + +Articles in the Paradigm series +------------------------------- + +Paradigms: Headache? +Paradigms: Plain's item extended +Paradigms: Two-part macros +Paradigms: Parameterization I Options +Paradigms: Winds and halfwinds---Details matter +Paradigms: It's all in the game +Paradigms: Loops +Paradigms: Searching (in BLUe) +Paradigms: Sorting (in TeX) +Paradigms: Just a little bit of PostScript (with a few .eps files) + + +Kees van der Laan, Hunzeweg 57, 9893PB, Garnwerd, The Netherlands. +Phone: (31) (0)594 62 1525, email: cgl@rc.service.rug.nl. |