%History of changes
%dec 1993: The Prague proceedings version as been adapted.
%          This version submitted to CTAN.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Revised/Alternative Crosswords via (plain) TeX
%Version: Oct 92
\input tugboat.sty
\def\rtitle{\hbox to \pagewd{\tenrm MAPS92.2\hfil
                             {\it Typesetting Crosswords via \TeX, revisited}
}}
\def\rfoot{\hbox to\pagewd{\sevenrm \rlap{Draft: \today}\hfil-\the\pageno-
\hfil\llap{\copyright cgl}}
}
\pageno=1
\overfullrule=0pt

\title*Typesetting Crosswords via \TeX, revisited*
\author*Kees van der Laan*
\address*Hunzeweg 57, 9893PB\\
         Garnwerd (Gr), The Netherlands*
\netaddress*cgl@risc1.rug.nl*
\article
%Footnote counter and footnote indexer
\newcount\fcnt
\def\ftn{\global\advance\fcnt1 \footnote{${}^{\the\fcnt}$}}
\def\DeK{D\kern-.11em\lower.5ex\hbox{E}\kern-.1em K}

\head*Abstract*
An alternative macro, to van der Laan (1992b),
is provided for typesetting crosswords via (plain) \TeX.

\subhead*Keywords* Crosswords, games, plain \TeX. %, typography.
%
\head*Introduction*
The previous version  has been published
in the proceedings of Euro\-\TeX\ '92, and in MAPS92.1.
A TUGboat referee suggested not to use |\halign|, et voil\`a.
The differences of this version with the previous version are:
|\halign| is not used, and therefore there is no mark-up phase,
and |\data| is hidden.
The nested FIFO paradigm is directly applied to |\data|,
van der Laan (1992a). The control sequence |\data| is created in
|\store| with as replacement text the data provided between |\bdata...\edata|.
Alternative sizes of the crossword
can be obtained via appropriate (re)definition of
|\usersize|.

\head*Example of use* %\input crwrev.tex
%
\let\ea=\expandafter \newif\ifpuzzle
\newcount\cnt \puzzletrue
\newdimen\csize\csize=3ex
%
\def\bdata{\bgroup\obeylines\obeyspaces%
\store}
\def\store#1\edata{\egroup\def\data{#1}}
{\obeyspaces\global\let =\relax}
\def\usersize{}
%
{\catcode`\^^M=13 %local scope
\gdef\crw{\cnt=0\relax\boxit{\usersize%
\hrule\ea\fifol\data\lofif^^M}}
\gdef\sol{\boxit{\def\num{}\puzzlefalse%
\usersize\hrule\ea\fifol\data\lofif^^M}}
\gdef\fifol#1^^M{\ifx\lofif#1\lofif\fi%
\processl{#1}\fifol}}%end local scope
%
\def\lofif#1\fifol{\fi}
\def\processl#1{\hbox{\fifo#1\ofif}\hrule}
\def\fifo#1{\ifx\ofif#1\ofif\fi%
\process#1\fifo}  \def\ofif#1\fifo{\fi}
%
\def\process#1{\if*#1\cc\else%
\ifx\relax#1\cc\else%
\ifnum`#1=\uccode`#1\cap#1\else%
\low#1\fi\fi\fi}
\def\low#1{\hbox to\csize{\vrule
height.8\csize depth.2\csize\relax%
\ifpuzzle\null\else\hss\uppercase{#1}%
\fi\hss\vrule}}
\def\cap#1{\hbox to\csize{\vrule
height.8\csize depth.2\csize\relax%
\num\ifpuzzle\null\else\hss#1\fi%
\hss\vrule}}
\def\cc{\vrule height.8\csize depth%
.2\csize width\csize}
%
\def\num{\global\advance\cnt1\relax%
\vbox to.8\csize{\rlap{\kern1pt%
\fiverm\the\cnt\hss}\vfil}}
%
\def\boxit#1{\vbox{\hrule\hbox{\vrule%
\vbox{#1}\vrule}\hrule}}%   cgl, oct92
%
\bdata%
P*On
DEk*
*n*S
Edit
\edata$$\crw\qquad
\def\usersize{\fiverm\csize=3ex}\sol$$
\medskip\noindent
is obtained via\ftn{The sides seem to wiggle. Is this optical illusion,
a driver bug, or caused by the properties of ink-blocks on paper?
Electronic previewing did not suffer from this.
The framing was added via {\tt\char92 boxit} to enhance a straight frame.}
\verbatim
\input crwrev.tex
\bdata%
P*On
DEk*
*n*S
Edit
\edata$$\crw\qquad
\def\usersize{\fiverm\csize=3ex}\sol$$
\endverbatim
\noindent Conventions for |\bdata| $\langle\,data\,\rangle$ |\edata|\ftn{A
`white lie,' spaces are also allowed for crossed out cells, see the Appendix.}
\item{--} cell descriptions have to be given line by line
\item{--} * denotes crossed out cell
\item{--} capitals denote marked open cells (with reference numbers
          to the clues), and letters of the solution
\item{--} lower case letters, denote empty cells,
          and letters of the solution.
\par\noindent The explicit number of cells is not needed to specify,
nor used.

\head*Programming*
Crossword diagrams consist of
(marked) empty cells, crossed out cells, and
for the solution cells with (capital) letters.
I parameterized each cell into the
size |\csize| by |\csize|, with height |.8\csize|.
Cells are typeset per row in a |\hbox| and these boxes are
stacked in a |\vbox|. All is framed via |\boxit|.
The carriage return, |^^M|, and space are active characters
between |\bdata| and |\edata|, allowing WYSIWYG input.
The numbering of the marked cells is done automatically, row-wise and hidden.
I adopted the convention to use reversed words for end-parameter separators,
except for the |\edata| separator.

Furthermore,
I assumed that no diacritical marks  are used in crosswords, and restricted
myself to the roman alphabet.

\subhead*The file {\tt crwrev.tex}*
%\verbfile{crwrev.tex}
\verbatim
\let\ea=\expandafter \newif\ifpuzzle
\newcount\cnt \puzzletrue
\newdimen\csize\csize=3ex
%
\def\bdata{\bgroup\obeylines\obeyspaces%
\store}
\def\store#1\edata{\egroup\def\data{#1}}
{\obeyspaces\global\let =\relax}
\def\usersize{}
%
{\catcode`\^^M=13 %local scope
\gdef\crw{\cnt=0\relax\boxit{\usersize%
\hrule\ea\fifol\data\lofif^^M}}
\gdef\sol{\boxit{\def\num{}\puzzlefalse%
\usersize\hrule\ea\fifol\data\lofif^^M}}
\gdef\fifol#1^^M{\ifx\lofif#1\lofif\fi%
\processl{#1}\fifol}}%end local scope
%
\def\lofif#1\fifol{\fi}
\def\processl#1{\hbox{\fifo#1\ofif}\hrule}
\def\fifo#1{\ifx\ofif#1\ofif\fi%
\process#1\fifo}  \def\ofif#1\fifo{\fi}
%
\def\process#1{\if*#1\cc\else%
\ifx\relax#1\cc\else%
\ifnum`#1=\uccode`#1\cap#1\else%
\low#1\fi\fi\fi}
\def\low#1{\hbox to\csize{\vrule
height.8\csize depth.2\csize\relax%
\ifpuzzle\null\else\hss\uppercase{#1}%
\fi\hss\vrule}}
\def\cap#1{\hbox to\csize{\vrule
height.8\csize depth.2\csize\relax%
\num\ifpuzzle\null\else\hss#1\fi%
\hss\vrule}}
\def\cc{\vrule height.8\csize depth%
.2\csize width\csize}
%
\def\num{\global\advance\cnt1\relax%
\vbox to.8\csize{\rlap{\kern1pt%
\fiverm\the\cnt\hss}\vfil}}
%
\def\boxit#1{\vbox{\hrule\hbox{\vrule%
\vbox{#1}\vrule}\hrule}}%   cgl, oct92
\endverbatim
%
\subhead*{\tt\char92crw}, {\tt\char92sol}*
The crossword, respectively the solution are typeset
(as |\vbox|-es) by these macros. |\data| is used.
%
\subhead*{\tt\char92process}*
This macro typesets each cell contents according to the |\data|. %
|\if*#1| etc.\ tests whether a crossed-out cell has to be typeset, and if so
a copy is inserted. For the other situation according to
the case of the letter |\low|(er case letter) or
|\cap|(ital letter), is invoked.
How the cell contents will be typeset depends upon |\ifpuzzle|.
The letters are typeset in upper case and centered.
%
\subhead*{\tt\char92num}*
Generates and typesets the reference numbers.
The numbers are set in the left upper corners of the cells marked
by capitals in the puzzle representation.
%
\subhead*{\tt\char92bdata, \char92store}*
These store the user provided information between |\bdata| and |\edata|
in |\data|, with the carriage return and space as active characters.
(The |\bgroup| after |\gdef| must be an
{\it explicit\/} brace, because |\bgroup| can be equally well a
parameter separator.)
%
\head*References*
%
\frenchspacing
\newcount\bcnt
\def\bib{\global\advance\bcnt1 [\the\bcnt]}
\item{\bib} Hamilton Kelley, B (1990): Some macros to draw crosswords.
            \tubissue{11}(1), 103\dash119.
\item{\bib} Knuth, D.E (1986): The \TeX Book. Addison-Wesley.
\item{\bib} Laan, C.G van der (1992a):
            FIFO and LIFO sing the BLUes. MAPS92.2.
\item{\bib} Laan, C.G van der Laan (1992b): Typesetting Crosswords via \TeX.
            Euro\TeX\ '92. 217\dash224. Also in MAPS92.1.
\par\noindent
%%%The above blank line (or \par) is needed to terminate \item%%%
\head*Appendix: {\rm Hamilton Kelley's puzzle}*
\tolerance=5000
\bdata%BHK's example, TB11#1
 S I C T D S P*
Swam Oho Icecap
 o p m r t n l*
Bopeep Schedule
 s l a i y u  *
Thalassographer
   e s n a   r*
HAirpin UmbRage
 r   o S b i  *
ScaLenetriangLe
   o a u c g e*
AMounted Allege
 a v e e l e a*
Floral Nil Tace
 l e y t y s y*
\edata$$\crw$$
is obtained---after |\input|\ |crwrev.tex|---via
\verbatim
\bdata%BHK's example
 S I C T D S P*
Swam Oho Icecap
 o p m r t n l*
Bopeep Schedule
 s l a i y u  *
Thalassographer
   e s n a   r*
HAirpin UmbRage
 r   o S b i  *
ScaLenetriangLe
   o a u c g e*
AMounted Allege
 a v e e l e a*
Floral Nil Tace
 l e y t y s y*
\edata$$\crw$$
\endverbatim
\endarticle
\bye








