diff options
Diffstat (limited to 'info/laan/paradigm/paradigm.src')
-rw-r--r-- | info/laan/paradigm/paradigm.src | 759 |
1 files changed, 759 insertions, 0 deletions
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 |