From b5175a492edaae1f38dd15addcbfeccf76033194 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 1 Feb 2010 23:43:36 +0000 Subject: crosswrd update (1feb10) git-svn-id: svn://tug.org/texlive/trunk@16896 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/source/latex/crosswrd/crosswrd.dtx | 944 ++++++++++----------- .../texmf-dist/source/latex/crosswrd/crosswrd.ins | 42 +- 2 files changed, 481 insertions(+), 505 deletions(-) (limited to 'Master/texmf-dist/source/latex') diff --git a/Master/texmf-dist/source/latex/crosswrd/crosswrd.dtx b/Master/texmf-dist/source/latex/crosswrd/crosswrd.dtx index edf15c4ca90..741e54f8e87 100644 --- a/Master/texmf-dist/source/latex/crosswrd/crosswrd.dtx +++ b/Master/texmf-dist/source/latex/crosswrd/crosswrd.dtx @@ -3,6 +3,8 @@ %% Copyright 1989 Brian Hamilton Kelly %% updated for LaTeX2e by Frank Mittelbach 96/12/06 %% Updated for LPPL 1.3c or later by Clea F. Rees (for Frank Mittelbach), 2008/10/06. +%% +%% Upgraded with many new features by Dirk Laurie 2010/02/01 % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 @@ -22,11 +24,12 @@ \ProvidesFile{crosswrd.dtx} % %<+package>\NeedsTeXFormat{LaTeX2e}[1995/12/01] +%<+package>\RequirePackage{ifthen} %<+package>\ProvidesPackage{crosswrd} %<*dtx,package> % \fi % \ProvidesFile{crosswrd.dtx} - [1996/12/06 v2.8b Generating crosswords (BHK)] + [2010/02/01 v3.0 Generating crosswords (BHK,DPL)] % % \iffalse % @@ -40,7 +43,7 @@ % % \fi % -% \CheckSum{671} +% \CheckSum{813} % % \let\ifBigTeX=\iftrue ^^A Change this in the obvious fashion if an % ^^A enlarged (>75k maxmem) version of TeX is available @@ -67,12 +70,17 @@ % \changes{v2.5}{89/09/01}{Final revisions for publication} % \changes{v2.6}{89/10/13}{Consistent indentation of {\tt\protect\bslash % def}s} +% \changes{v2.9}{07/12/19}{Variable dimensions and type sizes, does barred +% grids, does rectangular grids, tests label compatibility, complete +% rewrite of grid population code} +% \changes{v3.0}{10/02/01}{LPPL copyright notice included} % % \title{Some Macros to Draw Crosswords\thanks{This file is \fileversion, % dated \filedate}} % \author{B Hamilton Kelly\thanks{Especial thanks to my colleague Niel % Kempson for many helpful suggestions, and to Frank Mittelbach of the -% Johannes Gutenberg University of Mainz, who saved me two pages of code!}} +% Johannes Gutenberg University of Mainz, who saved me two pages of code!} +% \\ Extensions by Dirk Laurie} % \maketitle % \begin{abstract} % The {\sf crossword} environment is intended to be used to typeset @@ -104,11 +112,20 @@ % % The macros presented in this document provide a \LaTeX{} method of % typesetting these, and also assist the composer to ensure that the -% ``grid'' all goes together correctly. The grid generated is the more +% ``grid'' all goes together correctly. That is to say, checks +% are made that crossing lights have the same letter where they cross, +% lights starting at the same square have the same clue number, +% and clue numbers are in sequence from 1 upwards when reading +% from top left to bottom right. + +% The grid generated can be the more % usual form, with black squares separating the ``lights'' which receive the -% answers to the clues. Work is in hand to be able to handle the {\sl -% Mephisto/Azed\/} type of grid, in which only thicker grid lines -% separate the lights. +% answers to the clues, or the {\sl Mephisto/Azed\/} type of grid, +% in which only thicker grid lines separate the lights, or even +% a mixture of these. The user need not specify which type of grid +% is to be used, since they are both described by the same simple rule: +% a bar is drawn between every pair of adjacent +% light squares that do not belong to the same light. % % A sample crossword appears as Figure~\ref{crossword:1}; I've left the % grid blank for those who want some intellectual exercise: those who don't @@ -118,10 +135,15 @@ % % \DescribeEnv{crossword} % The whole crossword, including the \verb+\clue+ commands ({\it q.v}.), -% is bracketed within the {\sf crossword} environment. This requires that -% the user specifies two parameters:\begin{description} -% \item[\meta{gridsize}] This is a number which specifies the columns -% (and rows) in the square grid. +% is bracketed within the {\sf crossword} environment. The user may +% specify one optional and must specify two required parameters: +% \begin{description} +% \item[\meta{gridrows}] The number of rows +% in the rectangular grid. If supplied, it must be enclosed in +% square brackets. It may be omitted if the number of rows +% equals the number of columns. +% \item[\meta{gridcols}] The number of columns +% in the rectangular grid. % \item[\meta{visible}] This controls whether the answers are to be % ``filled in''; obviously of no use for publication, but useful whilst % composing the crossword. If the parameter provided is the letter `{\tt @@ -136,10 +158,10 @@ % An analogous environment is provided especially for typesetting a smaller % version of a grid showing, for example, ``Last Month's Solution''. In % this of course, the answers {\em always\/} appear, and the clues are not -% printed. Again it takes two parameters: +% printed. Again it takes three parameters, the first optional: % \begin{description} -% \item[\meta{gridsize}] As before, this specifies the number of squares -% in each axis. +% \item[\meta{gridrows, gridcols}] As before, these specify the number +% of squares in the two axes. % \item[\meta{header\_text}] Some text which will be set (in {\bf bold}) % above the completed grid. % \end{description} @@ -149,10 +171,10 @@ % \protect\TeX's} % Here is an example of the {\sf crossword*} % environment: -% +% {\centering % \begin{crossword*}{15}{Last month's solution} % \MakePercentComment \input{grid0} \MakePercentIgnore -% \end{crossword*} +% \end{crossword*}} % \else % Figure~\ref{crossword:2} shows an example of the {\sf crossword*} % environment. @@ -172,9 +194,12 @@ % \item[\meta{row\_number}] The $y$-coordinate of the first square of the % light. The top-most row is numbered 1. % \item[\meta{answer}] The answer to the clue (or that part of it which -% appears in the light numbered \meta{clue\_number}). This must be a -% string of upper-case letters {\em only\/}; no spaces, punctuation, -% hyphens, etc. +% appears in the light numbered \meta{clue\_number}). Traditionally +% in a completed grid, this is a +% string of upper-case letters, but spaces in between are silently ignored, +% lower case letters are equally OK, and some other characters such as +% question mark and fullstop are useful as placeholders in an +% uncompleted grid. No hyphens or apostrophes, though. % \item[\meta{text}] The text of the clue itself. If you want to use any % \LaTeX{} macros in this text, such as \verb+\dots+, each such macro must % be preceded by \verb+\noexpand+. This includes such macros as \verb+\&+, @@ -183,28 +208,54 @@ % this will most usually be used for giving the length of the answer, such % as ``7'' or ``2,6,3-3''. Also used when the text of the clue is % associated with another light when this parameter may say something like -% ``see 14d''. +% ``see 14d''. If this parameter is left \emph{absolutely empty}, +% not merely blank, i.e.\ \verb+{}+, the clue (if any) +% will not be printed at all. % \end{description} +% +% \subsection{Customizing the layout} +% Some definitions made when entering the {\sf crossword} environment +% may be overridden by the user inside the environment. +% \begin{verbatim} +% \unitlength 6mm +% \def\Preamble{} +% \def\cluewidth{70mm} +% \let\numbersize\tiny +% \let\cluesize\ninept +% \def\barwidth{0.1} +% \end{verbatim} +% These refer respectively to size of grid cells, text to be set between +% the diagram and the clues, +% width of clue columns, typesize of numbers in grid, type size of +% clues, and width of bars in \verb+\unitlength+s. +% +% If you override +% \verb+\cluesize+ by a \LaTeX\ size command +% like \verb+\normalsize+, you will probably feel that there is too much +% vertical space between the clues. The only good solution is to +% write your own macro by adapting the definition of \verb+\ninept+ +% given below. % + % \subsection{How to Specify Clue Numbers}\label{clue-numbers} % % Sometimes the solution to one clue is split amongst a number of -% ``lights''. To cover this eventuality, provide a \verb+\clue+ for {\em +% lights. To cover this eventuality, provide a \verb+\clue+ for {\em % each\/} of the lights involved, with the solution to that light {\em % alone\/} given as \meta{answer}. All except the \verb+\clue+ % corresponding to the first light of the solution should have a null -% \meta{text}, and the \meta{help} parameter should be something like +% \meta{text}, and the \meta{help} parameter might be something like % ``see 7d''. % % \changes{v2.4}{89/08/15}{Support for empty help field} -% If this final parameter is totally empty, no corresponding clue number -% is printed: this facility would be used when the current clue is the -% next consecutive light, when it is usual to omit any further reference -% to the clue number. +% If you wish to omit any further reference +% to the clue number (the usual practice when the current clue +% applies to consecutive lights, or in hard cryptics), +% leave the \meta{help} field totally empty. % % The \verb+\clue+ for the first light of the solution % should provide the {\em entire\/} clue as its \meta{text}, and the -% \meta{help} should say something like ``7,3-3''. The \meta{clue\_number} +% \meta{help} might say something like ``7,3-3''. The \meta{clue\_number} % field should consist of the number of that light, followed immediately % by the text required to describe the other lights, separated from it by % some non-digit character, for example, a space. @@ -213,7 +264,7 @@ % \end{multicols} % % \begin{figure*}[tp] -% \begin{crossword}{15}{N} +% \begin{crossword}{15}{N} % \MakePercentComment \input{grid1} \MakePercentIgnore % \end{crossword} % \caption{A Sample Crossword}\label{crossword:1} @@ -225,7 +276,7 @@ % for the {\tt\string\&}} % \begin{verbatim} % \clue{13}{A}{5}{1}{PARLIAMENT}{}{see 9d} -% \clue{9 {\noexpand\rm\&} 13a}{D}{1}{10}{ACTOF}% +% \clue{9 {\noexpand\rm\&} 13a}{D}{1}{10}{ACT OF}% % {Bill's desired outcome?}{3,2,10} % \end{verbatim} % will produce\begin{description} @@ -245,6 +296,7 @@ % \end{figure} % \fi % + % \StopEventually{\PrintIndex % \PrintChanges % \ifBigTeX @@ -258,8 +310,8 @@ % % \begin{macro}{\ninept} % \begin{macro}{\@listi} -% We define a new font size to ensure clues are set at 9pt, no matter what -% style size option is in effect. This command also defines suitable +% We define a new 9pt font size for setting clues. +% This command also defines suitable % parameters for list environments set in this size of type. % % \begin{macrocode} @@ -283,7 +335,7 @@ % \begin{macro}{\numberitfalse} % % The {\sf crossword} environment draws a grid (with black and white -% squares); each ``light'' into which a clue's answer is to be written has +% squares); each light into which a clue's answer is to be written has % to be numbered, and this number will be typeset (using \verb+\tiny+) in % the top-left corner of the first square of the light. % @@ -300,21 +352,27 @@ % \end{macro} % \end{macro} % -% \begin{macro}{\gr@dsize} +% \begin{macro}{\gridr@ws} +% \begin{macro}{\gridc@ls} % \changes{v2.3}{89/05/17}{Use a raw \protect\TeX\protect\space counter} +% \begin{macro}{\p@rsize} % \begin{macro}{\p@csize} % \changes{v2.3}{89/05/17}{Use a raw \protect\TeX\protect\space counter} -% The counter \verb+\gr@dsize+ is used to hold the width of the grid, as the -% number of squares in each direction. +% \changes{v2.9}{07/12/05}{Define more counters to allow rectangular grids.} +% The counters \verb+\gridr@ws+, \verb+\gridc@ls+, are used to hold the +% width of the grid, as the number of squares in each direction. % -% To prevent too much run-time arithmetic, the counter \verb+\p@csize+ is set -% to be one count higher than \verb+\gr@dsize+. +% To prevent too much run-time arithmetic, the counters \verb+\p@rsize+, +% \verb+\p@csize+ are set to be one count higher than \verb+\gridc@ls+, +% \verb+\gridr@ws+. % \begin{macrocode} -\newcount{\gr@dsize} -\newcount{\p@csize} +\newcount{\gridr@ws}\newcount{\gridc@ls} +\newcount{\p@rsize}\newcount{\p@csize} % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} +% \end{macro} % % \begin{macro}{\Down} % \changes{v2.3}{89/05/17}{Use a raw \protect\TeX\protect\space counter} @@ -370,26 +428,28 @@ % \changes{v2.8a}{96/07/22}{Removed string from \cs{@writefile} arg (FMi)} % \changes{v2.8a}{96/07/22}{Make clue column texts accessible (FMi)} % \begin{macrocode} - \@writefile{acr}{\begin{minipage}[t]{70mm}}% + \@writefile{acr}{\begin{minipage}[t]{\cluewidth}}% \@writefile{acr}{ \centerline{\textbf{\ACROSStext}}}% \@writefile{acr}{ \sloppy}% - \@writefile{acr}{ \ninept}% + \@writefile{acr}{ \cluesize}% \@writefile{acr}{ \begin{ClueList}}% % \end{macrocode} % Whilst something similar goes into the {\tt.dwn} file. % \begin{macrocode} - \@writefile{dwn}{\begin{minipage}[t]{70mm}}% + \@writefile{dwn}{\begin{minipage}[t]{\cluewidth}}% \@writefile{dwn}{ \centerline{\textbf{\DOWNtext}}}% \@writefile{dwn}{ \sloppy}% - \@writefile{dwn}{ \ninept}% + \@writefile{dwn}{ \cluesize}% \@writefile{dwn}{ \begin{ClueList}}} % \end{macrocode} -% \end{macro} +% \end{macro}\end{macro}\end{macro} % % \begin{macro}{\ACROSStext} % \changes{v2.8a}{96/07/22}{Make clue column texts accessible (FMi)} % \begin{macro}{\DOWNtext} % \changes{v2.8a}{96/07/22}{Make clue column texts accessible (FMi)} +% You may (e.g.\ if the crossword is not in English) prefer to change +% the column text headers. % \begin{macrocode} \newcommand\ACROSStext{ACROSS} \newcommand\DOWNtext{DOWN} @@ -425,8 +485,6 @@ } % \end{macrocode} % \end{macro} -% \end{macro} -% \end{macro} % % \subsection{Tabulating the Clues} % The auxiliary files contain the texts of the clues, each given as an @@ -470,17 +528,20 @@ % % \section{Creating the Grid} % The remaining commands are concerned with creating (and, optionally, -% populating) the crossword grid +% populating) the crossword grid. % -% \begin{macro}{\crossword} +% \begin{macro}{crossword} +% \begin{macro}{\c@ls} % -% The {\sf crossword} environment takes two parameters: {\em viz}.~the -% size of the matrix, and the indication of whether the grid is to include -% the answers. (If the latter is omitted, \LaTeX\ will request it -% interactively.) +% The {\sf crossword} environment takes three parameters: {\em viz}.~the +% number of rows (optional, may be omitted if the grid is square) and +% columns of the matrix, and the indication of whether the grid is to include +% the answers. (If the latter is not Y or N, \LaTeX\ will request it +% interactively.) The macro \verb+\c@ls+ is a communication mechanism. % % \begin{macrocode} -\def\crossword#1#2{% +\newenvironment{crossword}[3][\c@ls]{% + \def\c@ls{#2} % \end{macrocode} % % \changes{v2.4}{89/08/15}{Group within \string\crossword\space environment} @@ -488,20 +549,34 @@ % We start off with a \verb+\vtop+ box and a group to hold everything % within the environment, so as to ensure that user-entered text remains % with the crossword. +% \changes{v2.9}{07/12/04}{Changed to environment syntax, with +% optional argument for rectangular grids} % % \begin{macrocode} \endgraf\leavevmode \vtop\bgroup % \end{macrocode} % +% \begin{macro}{\Header} +% \begin{macro}{\cluewidth} +% \begin{macro}{\numbersize} +% \begin{macro}{\cluesize} +% \begin{macro}{\barwidth} % The {\sf crossword} environment uses the full-size grid, and has the % lights numbered. Furthermore it doesn't have any heading to output (see -% the {\sf crossword*} environment). +% the {\sf crossword*} environment). +% Some other macros are given so that the user can customize the layout. % % \begin{macrocode} \unitlength 6mm\numberittrue \def\Header{}% + \def\Preamble{}% + \def\cluewidth{70mm} + \let\numbersize\tiny + \let\cluesize\ninept + \def\barwidth{0.1} % \end{macrocode} +% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % We now open the auxiliary files into which the clues are written, and % determine (interactively if necessary) whether the answers are to be @@ -509,21 +584,22 @@ % % \begin{macrocode} \OpenClueFiles - \TestAnswers{#2}% + \TestAnswers{#3}% % \end{macrocode} % -% Finally, we generate the necessary macros to describe the grid as being -% entirely filled with black squares; for each square, a macro whose name is -% of the form \verb+\RiCi+, \verb+\RxiiCviii+, {\em etc}.\ is created. As -% the \verb+\clue+ commands are read in, these will be redefined to produce -% the correct appearance when the macros are later expanded. -% +% Finally, we generate the necessary macros to describe the grid. +% For each square, there are three macros. For example, corresponding +% to the square in row 4 from the top, column 2 from the +% left, the macros are: \smallskip \\ \hspace{1cm} +% \begin{tabular}{ll} +% \verb+\LetterRivCii+ & Letter in the square; \texttt{!} is used for a black square.\\ +% \verb+\NumberRivCii+ & Number in the square; 0 is used for a numberless square.\\ +% \verb+\BarRivCii+ & Code defining bars around the square, defined below. +% \end{tabular} \smallskip \\ +% % \begin{macrocode} - \SetUpGrid{#1}} + \SetUpGrid{#1}{\c@ls}} % \end{macrocode} -% \end{macro} -% -% \begin{macro}{\endcrossword} % % When all the clues have been processed, we can invoke \verb+\FinishGrid+ % to draw the grid. The \verb+\FinishGrid+ and \verb+\PrintClues+ commands @@ -536,7 +612,7 @@ % we'll print it just above the grid itself. % % \begin{macrocode} -\def\endcrossword{\endgraf +{\endgraf \centerline{\Header}% \hbox{\FinishGrid}% % \end{macrocode} @@ -549,24 +625,27 @@ % Finally, we complete the group and the \verb+\vtop+ box. % % \begin{macrocode} + \ifthenelse {\equal{\Preamble}{}} {} + {\centerline{\parbox{\textwidth}{\Preamble}}\medskip} \CloseClueFiles \hbox{\PrintClues}% \egroup } % \end{macrocode} -% \end{macro} +% \end{macro}\end{macro} % -% \begin{macro}{\crossword*} -% \changes{v2.6}{89/10/13}{Removed {\tt\protect\bslash iffalse} hack} -% \begin{macro}{\endcrossword*} -% \changes{v2.1}{89/04/27}{No longer opens {\tt.acr} and {\tt.dwn} files} +% \begin{macro}{crossword*} +% \changes{v2.1}{89/04/27}{No longer opens {\tt.acr} and {\tt.dwn} files} % \changes{v2.6}{89/10/13}{Removed {\tt\protect\bslash iffalse} hack} +% \changes{v2.9}{07/12/04}{Changed to environment syntax, with +% optional argument for rectangular grids} % The {\sf crossword*} environment doesn't need a second parameter to % control printing of answers, because it {\bf always} populates the grid % with the answers. Instead, its second parameter provides the text to % appear above the printed grid. Its actions are as for the {\sf % crossword} environment except that\begin{itemize} -% \item It prints the descriptive text above the grid. +% \item It assumes that there is descriptive text above the grid +% and allows room for it. % \item It {\bf always} outputs the answers, without numbers. % \item It draws them in a smaller box. % \item It doesn't output the clues (it doesn't even open any @@ -574,38 +653,92 @@ % \end{itemize} % % \begin{macrocode} -\expandafter\def\csname crossword*\endcsname#1#2{% +\newenvironment{crossword*}[3][\c@ls]{% + \def\c@ls{#2} \unitlength 4mm\numberitfalse + \def\barwidth{0.1} \endgraf\leavevmode \vtop\bgroup - \def\Header{{\bf\strut #2}}% + \def\Header{{\bf\strut #3}}% \def\answer{Y}% \let\tf@dwn=\relax \let\tf@acr=\relax - \SetUpGrid{#1}} - -\expandafter\def\csname endcrossword*\endcsname{\endgraf + \SetUpGrid{#1}{#2}} +{\endgraf \centerline{\Header}% \hbox{\FinishGrid}% \egroup } % \end{macrocode} % \end{macro} -% \end{macro} -% -% \subsection{Macros used when Populating the Grid} % -% \begin{macro}{\laterletter} -% \changes{v2.1}{89/04/27}{Used to be {\tt\protect\bslash letterput}} -% The following macro calls this to ``place'' the letters of a solution by -% defining a macro unique to this square. -% +% \subsection{Macros for each square} +% \changes{v2.9}{07/12/19}{The part of the code dealing with grid details has +% been completely rewritten. (DPL)} +% \begin{macro}{\ind@x} +% \begin{macro}{\arr@yref} +% \begin{macro}{\value} +% \begin{macro}{\assign} +% \begin{macro}{\addto} +% Crosswords are inherently two-dimensional, and require matrices +% of related definitions. Since \TeX\ does not allow numbers in +% a name, each square has a unique text index using \texttt{R} and +% \texttt{C} followed by roman numerals. Each macro name consists +% of a prefix (the same for all squares) followed by the unique +% text index. The original version of this +% package had only one such macro for each square, with an empty prefix, +% but in this version we have three: \texttt{Letter}, \texttt{Number} +% and \texttt{Bar}. +% +% For readability of the code, the following macros provide bracket +% syntax, thereby avoiding the use of \verb+\csname+\ldots\verb+\endcsname+ +% elsewhere. +% For example, \verb+\value Bar[2,5]+ gives \verb+\BarRiiCv+. +% A new definition \texttt{NEW} is assigned by \verb+\assign Bar[2,5]=NEW;+. +% If the contents of \verb+\BarRiiCv+ is a number, you can add 31 +% to it using \verb"\addto Bar[2,5]+=31;". In both cases, the semicolon +% is essential. +% \begin{macrocode} +\def\ind@x#1#2{R\romannumeral #1C\romannumeral#2} +\def\arr@yref#1#2#3{\csname #1\ind@x{#2}{#3}\endcsname} +\def\value#1[#2,#3]{\arr@yref{#1}{#2}{#3}} +\def\assign#1[#2,#3]=#4;% +{\expandafter\edef\csname #1\ind@x{#2}{#3}\endcsname{#4}} +\newcount\accumulat@r +\def\addto#1[#2,#3]+=#4;% +{\accumulat@r=\value #1[#2,#3] \advance\accumulat@r by #4 + \assign #1[#2,#3]=\the\accumulat@r;} +% \end{macrocode} +% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} + +% We do bars as follows: in addition to \verb+\RiCii+ etc which define the +% contents of a square, there is a bar code \verb+\BarRiCii+ etc with +% the following meaning: +% \begin{enumerate} +% \item[0:] no bar above or to the left of the square +% \item[1:] bar above the square +% \item[2:] bar to the left of the square +% \item[3:] bars above and to the left of the square +% \end{enumerate} +% At the start, all bar codes are set to 3; +% the bars between letters are erased as we go along. + +% \subsection{Macros used while processing the clues} + +% \begin{macro}{\lettercount} +% \begin{macro}{\Barcode} +% As we move along the letters of the answer, we count +% the number of letters processed in \verb+\lettercount+. +% The code for the bar to be erased (1 or 2) is put +% into \verb+Barcode+ before we start on each answer. % \begin{macrocode} -\def\laterletter#1{\setsquare{\lettersquare{#1}}} +\newcount\lettercount +\newcount\Barcode % \end{macrocode} -% +% \end{macro} +% \end{macro} + % \begin{macro}{\nextletter} % \begin{macro}{\nextlet} -% % To determine how much space is required for the light corresponding to % an answer, we need to cycle through each of the characters of the answer % individually; this macro is called with two parameters --- the first @@ -615,7 +748,7 @@ % When it is called, this ``second'' parameter is {\em not\/} enclosed in % braces, so only the first token in it is accessed. The macro calls % itself recursively to process the remaining characters until the -% \verb+\@nil+ has been met. +% \verb+\@nil+ has been met. % % \changes{v2.1}{89/04/27}{Can now process {\em first\/} letter of light} % \begin{macrocode} @@ -633,11 +766,22 @@ % \end{macrocode} % % Otherwise, we have another letter of the \meta{answer} in {\tt\#2}, so we -% call \verb+\letterput+ to define the macro corresponding to this square, -% and count one more position occupied in the current direction. +% save the letter and check that it does not conflict with an earlier letter +% in the same square. % % \begin{macrocode} - \else\letterput{#2}\advance#1 by \@ne + \else \immediate\edef\Before{\value Letter[\Down,\Across]} + \assign Letter[\Down,\Across]=#2; + \immediate\edef\After{\value Letter[\Down,\Across]} + \if \Before ! \else \if \Before \After + \else \errhelp{You mistyped an answer, or miscounted the coordinates.} + \errmessage{Letter "\After" conflicts with earlier "\Before" + in row \the\Down, column \the\Across} + \fi \fi +% If the letter is not the first letter of its answer, we erase a bar. + \ifnum \lettercount>0 \addto Bar[\Down,\Across]+=-\Barcode; \fi +% Advance another position in the current direction. + \@gobble{#2} \advance#1 by \@ne \global\advance \lettercount by \@ne % \end{macrocode} % % After we've processed this letter, we want to call this routine @@ -646,13 +790,6 @@ % \changes{v2.1}{89/04/27}{Change to handle subsequent letters of light} % \begin{macrocode} \let\nextlet=\nextletter -% \end{macrocode} -% -% These letters cannot possibly require a starting square number, so we -% use a simpler macro for these later letters. -% -% \begin{macrocode} - \let\letterput=\laterletter \fi % \end{macrocode} % @@ -666,214 +803,9 @@ % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} -% -% -% \begin{macro}{\blacktest} -% Later we shall want to check that the square into which we are ``putting'' -% a letter is either black (and hence should be changed to contain the -% character) or has already had the {\em same\/} letter put into it by an -% intersecting light. -% -% We don't want to expand each squares' macros, so these tests have to use -% the \verb+\ifx+ primitive; therefore, we need a macro which has the same -% substitution text {\em at the highest level}. -% -% \begin{macrocode} -\def\blacktest{\blacksquare} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\ifneed@d} -% \begin{macro}{\need@dtrue} -% \begin{macro}{\need@dfalse} -% As we create the macros corresponding to each occupied square, we have to -% decide whether it is necessary to actually perform a (re)definition of the -% macro; the following permits the code to determine whether such definition -% takes place (within the \verb+\putsquare+ macro). -% -% \begin{macrocode} -\newif\ifneed@d -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\ifNoerr} -% \begin{macro}{\Noerrtrue} -% \begin{macro}{\Noerrfalse} -% If an error is detected during the placement of the occupied squares, -% there will probably be other errors; to save pouring out yards of error -% messages, we arrange to suppress all but the first such; the following -% \verb+\newif+ provides this facility. % -% And of course we start without any errors! -% -% \begin{macrocode} -\newif\ifNoerr -\Noerrtrue -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\Number} -% \begin{macro}{\Plain} -% To determine whether a square has already been occupied, and if so, by -% what, we require a couple of new tokens which can be tested for as the -% result of a macro expansion -% \begin{macrocode} -\newtoks\Number \newtoks\Plain -% \end{macrocode} -% -% \begin{macro}{\blank} -% \begin{macro}{\numbered} -% The next two definitions can be temporarily \verb+\let+ to be the -% replacements for \verb+\lettersquare+ and \verb+\numbersquare+ -% respectively, for use in conjunction with the aforementioned test. -% -% \begin{macrocode} -\def\blank#1{\Plain} -\def\numbered#1#2{\Number} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\letterinsquare} -% \begin{macro}{\letterinnumbersquare} -% When we first read the clues, we create macros which are unique to each -% square; later we shall redefine the macros to which the squares' macros -% expand to actually perform the setting, but during the first phase we -% require expansions which correspond to the parameters alone. The -% following definitions are therefore used during the ``filling'' phase. -% -% \begin{macrocode} -\def\letterinsquare#1{#1} -\def\letterinnumbersquare#1#2{#2} -% \end{macrocode} -% -% \begin{macro}{\setsquare} -% As we scan the answers for each clue, this macro is called with a -% parameter which specifies a call of either the \verb+\lettersquare+ or -% \verb+\numbersquare+ macros (with appropriate parameters). -% -% It starts by assuming that no redefinition of the square's macro will be -% required. -% -% \begin{macrocode} -\def\setsquare#1{% - \need@dfalse -% \end{macrocode} -% -% This macro is also called during the initialization of the grid, when we -% populate it with black squares; therefore, we definitely want to perform a -% definition of the square's macro at this stage. -% -% \begin{macrocode} - \ifx#1\blacksquare - \need@dtrue -% \end{macrocode} -% -% Otherwise, let's have a look and see what is already in the square's -% macro. This test will succeed only if the square contains its initial -% definition (as \verb+\blacksquare+). -% \begin{macrocode} - \else - \expandafter\ifx\csname\ther@w\thec@l\endcsname\blacktest -% \end{macrocode} -% -% in which case we {\em will\/} want to redefine the macro for this square -% -% \begin{macrocode} - \need@dtrue -% \end{macrocode} -% -% If the square has already been redefined, it means we've already ``put'' a -% letter (or number+letter) into its definition, so we will have to check -% that this definition doesn't conflict with the new one (which is in -% {\tt\#1}). We have to expand the macros to perform this test, but don't -% want that expansion to return anything except the letter which is being -% (and has been) placed in the square, so we make a temporary replacement -% for the two macros which might form our {\tt\#1}. -% \begin{macrocode} - \else - \let\lettersquare=\letterinsquare - \let\numbersquare=\letterinnumbersquare -% \end{macrocode} -% -% Now we {\em expand\/} the original definition and the new one; these -% should be the same! -% \changes{v2.6}{89/10/13}{Minor revision of layout} -% -% \begin{macrocode} - \expandafter\if\csname\ther@w\thec@l\endcsname#1 - \else -% \end{macrocode} -% -% If they aren't, it means the compiler of the crossword has made a mistake -% and has solutions which don't correctly intersect: tell him so (well, the -% first time anyway). We even provide the user with some help! -% -% \begin{macrocode} - \ifNoerr - \errhelp{Two intersecting lights tried to - put different letters^^Jin the same square! - You've probably confused their coordinates.^^J - Carry on, and examine the printout.} - \errmessage{Illegal redefinition of square \ther@w\thec@l. - Was: \expandafter\meaning\csname\ther@w - \thec@l\endcsname. - Now: \noexpand #1} - \Noerrfalse - \fi - \fi -% \end{macrocode} -% -% So far, we don't seem to need to change anything, but if the new {\tt\#1} -% which has been passed to \verb+\putsquare+ specifies that it be numbered, -% we must subsume any existing definition which {\em doesn't\/} have a -% number. -% -% Again, we make temporary reassignments for the two potential macros, which -% is where we make use of the two new tokens that we invented. -% -% \begin{macrocode} - \let\lettersquare=\blank - \let\numbersquare=\numbered -% \end{macrocode} -% -% If the following test succeeds, we know that the new parameter specifies a -% number as well as a letter. This code could be expanded to check whether -% the original definition also specified a number, and if so ensure that -% they are the same, but would anybody really be silly enough to give -% different numbers for clues starting from the same square?! -% \begin{macrocode} - \expandafter\ifx#1\Number - \need@dtrue - \fi - \fi - \fi -% \end{macrocode} -% -% Now we know whether we must (re)define the macro which is unique to this -% square. If we must, we expand our {\tt\#1}, so as to get the actual -% number and letter passed in through that parameter, but keep the name of -% the placement macro itself\footnote{This will be the first token of the -% parameter itself.} unexpanded. -% -% \begin{macrocode} - \ifneed@d - \expandafter\edef\csname\ther@w\thec@l\endcsname{\noexpand #1} - \fi -} -% \end{macrocode} -% \end{macro} ^^A \setsquare -% \end{macro} ^^A \letterinnumbersquare -% \end{macro} ^^A \letterinsquare -% + % \subsection{The {\tt\protect\bslash clue} Command} % % \begin{macro}{\clue} @@ -885,8 +817,31 @@ % % \begin{macrocode} \def\clue#1#2#3#4#5#6#7{% +% \end{macrocode} +% The $x$ and $y$ coordinate counters are set from the \meta{column} and +% \meta{row} parameters. +% +% \begin{macrocode} + \Across=#3 \Down=#4 +% \end{macrocode} +% The clue may be spread over more than one number, but the square +% takes only the first of these. +% \begin{macrocode} \findnumber{#1} % \end{macrocode} +% Save the clue number, checking that it was not previously defined +% to be something else. +% \begin{macrocode} + \immediate\edef\Before{\value Number[\Down,\Across]} + \assign Number[\Down,\Across]=\cluenumber; + \immediate\edef\After{\value Number[\Down,\Across]} + \ifnum \Before>0 \ifnum \After=\Before + \else \errhelp + {You probably made a mistake when typing in one of the clues.} + \errmessage{Number {\After} conflicts with earlier {\Before} + in row \the\Down, column \the\Across} + \fi \fi +% \end{macrocode} % % We now examine the second (\meta{Across/Down}) parameter of the % \verb+\clue+ command to determine whether this is an Across or Down @@ -902,13 +857,15 @@ % \meta{Across/Down} parameter is the letter `{\tt A}'. In this case, the % counter to be incremented is \verb+\Across+. % \changes{v2.8a}{96/07/22}{Removed string from \cs{@writefile} arg (FMi)} +% \changes{v2.9}{07/12/19}{Change empty test to use \cs{ifthenelse}. +% Testing by \cs{if} is a bug. (DPL)} % \begin{macrocode} \ifx#2A - \if\@empty#7\relax\else + \global\Barcode=2 + \ifthenelse{\equal{\@empty}{#7}}{}{ \ifx\tf@acr\relax\else \@writefile{acr}{ \item[#1] #6 (#7)}% - \fi - \fi + \fi} \let\Direction=\Across \else % \end{macrocode} @@ -916,11 +873,11 @@ % file, and the \verb+\Down+ counter is incremented. % \begin{macrocode} \ifx#2D - \if\@empty#7\relax\else - \ifx\tf@dwn\relax\else - \@writefile{dwn}{ \item[#1] #6 (#7)}% - \fi - \fi + \global\Barcode=1 + \ifthenelse{\equal{\@empty}{#7}}{}{ + \ifx\tf@dwn\relax\else + \@writefile{dwn}{ \item[#1] #6 (#7)}% + \fi} \let\Direction=\Down \else % \end{macrocode} @@ -937,39 +894,15 @@ \fi % \end{macrocode} % -% The $x$ and $y$ coordinate counters are set from the \meta{column} and -% \meta{row} parameters. -% -% \begin{macrocode} - \Across=#3 \Down=#4 -% \end{macrocode} -% -% \begin{macro}{\letterput} -% \changes{v2.1}{89/04/27}{Replacement for {\tt\protect\bslash firstletter} -% method} -% -% The \verb+\letterput+ macro is defined anew at the start of each clue to -% create the correct definition for the {\em first\/} square of each -% light. The \verb+\setsquare+ macro redefines this macro internally for -% the remaining squares. -% -% \begin{macrocode} - \edef\letterput##1{\noexpand\setsquare - {\noexpand\numbersquare - {\noexpand\cluenumber}{##1}}}% -% \end{macrocode} -% \end{macro} -% % Now we can call \verb+\nextletter+ which will cycle through all the % letters of the \meta{answer} until meeting the token \verb+\@nil+. -% As each letter is processed, it creates a definition for the current -% square, initially using the above definition, and then \verb+\laterletter+ -% for subsequent letters of the \meta{answer}. -% +% It will save the current letter and recursively call itself until no +% letters are left. % Finally, we ensure that the newlines after \verb+\clue+ commands don't % lead to unwanted spaces being typeset. % \changes{v2.6}{89/10/13}{Minor revision of layout} % \begin{macrocode} + \global\lettercount=0 \nextletter{\Direction}#5\@nil \ignorespaces } @@ -1026,7 +959,8 @@ % \changes{v2.6}{89/10/13}{Minor revision of layout} % If the user did not provide a valid \meta{clue\_number} (i.e.\ something % starting with a digit), then \verb+clueNumber+ will have zero assigned to -% it --- seems the user ought to be told about this! +% it. This will cause a diagnostic message at the stage when it is checked +% that the clue numbers run consecutively in reading order from 1 upwards. % % This completes \verb+\findnumber+. % @@ -1055,13 +989,9 @@ % \changes{v2.2}{89/05/17}{Used {\tt\protect\bslash blackenrow} for inner loop} % \changes{v2.8a}{96/07/22}{Fixed command to save val of \cs{iterate} % not \cs{body} (FMi)} -% For each column in a row we create a black square; effectively -% \verb+\setsquare+ will execute the definition -% \begin{macrocode} -% \def\csname\ther@w\thec@l\endcsname{\blacksquare} -% \end{macrocode} -% so that for row~3 column~6 of a $15\times15$ grid, for example, we would -% end up by defining \verb+\def\RiiiCvi{\blacksquare}+. +% For each column in a row we create a black square by setting the +% letter in the square to \texttt{!}. We also initialize the \texttt{Number} +% and \texttt{Bar} macros. % % Before starting the inner loop, we need to save the definition of % \verb+\body+ which was created for the outer loop. We cannot do this by @@ -1070,12 +1000,14 @@ % % Actually with \LaTeXe{} we have to save \verb=\iterate= as the internals % of \verb=\loop= have been streamlined. With the old code only the first -% row was updated---this is the rpcie for using an unpublished implementation +% row was updated---this is the price for using an unpublished implementation % feature. % \begin{macrocode} \def\blackenrow{\let\savediterate\iterate \loop\relax\ifnum\Across>\z@ - \setsquare{\blacksquare}% + \assign Bar[\Down,\Across]=3; + \assign Letter[\Down,\Across]=!; + \assign Number[\Down,\Across]=0; % \end{macrocode} % % We then shift ourselves back to the next column to the left and iterate. @@ -1092,22 +1024,25 @@ % \end{macrocode} % % \begin{macro}{\SetUpGrid} +% \changes{v2.9}{07/12/05}{Rectangular grids} % % This macro creates an empty grid of the appropriate size. % % \begin{macrocode} -\def\SetUpGrid#1{% +\def\SetUpGrid#1#2{% % \end{macrocode} % -% We firstly make a note of the \meta{gridsize} parameter in the -% \verb+\gr@dsize+ counter, from which the width and height of the grid +% We firstly make a note of the \meta{gridcols} parameter in the +% \verb+\gr@dcols+ counter, from which the width and height of the grid % may be computed. We also set the \verb+\p@csize+ counter to be one -% greater than \verb+\gr@dsize+ to save our recomputing this quantity many -% times over. +% greater than \verb+\gridc@ls+ to save our recomputing this quantity many +% times over. Ditto mutatis mutandis for \meta{gridrows}. % % \begin{macrocode} - \gr@dsize=#1 - \p@csize=#1 \advance\p@csize by \@ne + \gridr@ws=#1\gridc@ls=#2 + \p@rsize=#1 \advance\p@rsize by \@ne + \p@csize=#2 \advance\p@csize by \@ne + \typeout{Grid has #1 rows and #2 columns.} % \end{macrocode} % % Right, this is where we start to generate the grid itself. We start at @@ -1116,7 +1051,7 @@ % number attainable. % % \begin{macrocode} - \Down=\gr@dsize + \Down=\gridr@ws % \end{macrocode} % % We now start a loop, so the following code will be repeated for each row @@ -1126,7 +1061,7 @@ % % \begin{macrocode} \loop - \Across=\gr@dsize + \Across=\gridc@ls % \end{macrocode} % % Provided we haven't decremented down to the 0th row, we start off the @@ -1155,22 +1090,6 @@ % \end{macro} ^^A \SetUpGrid % \end{macro} ^^A \blackenrow % -% \begin{macro}{\thec@l} -% \begin{macro}{\ther@w} -% \verb+\thec@l+ and \verb+\ther@w+ macros generate a string of letters, -% starting with `{\tt C}' (for column) and `{\tt R}' (for row) respectively. -% The remainder of the string consists of the lower-case Roman numeral -% equivalent to the current value of the appropriate counter. Such -% all-letter strings are used to create the names for macros which can be -% unique for each square of the grid. -% -% \begin{macrocode} -\def\thec@l{C\romannumeral\Across} -\def\ther@w{R\romannumeral\Down} -% \end{macrocode} -% \end{macro} -% \end{macro} -% % \begin{macro}{\TestAnswers} % This macro interacts with the user, if necessary, to get a yes or no % indication of whether the answers shall be written into the grid. No @@ -1195,7 +1114,7 @@ % \end{macrocode} % We can then extract just the first character % \begin{macrocode} - \edef\answer{\expandafter \f@rst \answer .}% + \edef\answer{\expandafter \f@rst \answer n.}% % \end{macrocode} % The we determine whether it's the letter `{\tt y}' or `{\tt n}'\dots % \begin{macrocode} @@ -1212,7 +1131,7 @@ % \begin{macrocode} \edef\next{\def\noexpand\answer{\answer}}% \uppercase\expandafter{\next}% - \edef\answer{\expandafter \f@rst \answer .}% + \edef\answer{\expandafter \f@rst \answer n.}% } % \end{macrocode} % \end{macro} @@ -1221,25 +1140,27 @@ % % \subsection{Setting the Grid} % -% \begin{macro}{\letter} -% This is the expansion which is used (for \verb+\letterinsquare+, -% and within the expansion of \verb+\numberedsquare+) when the grid is -% actually being {\em typeset\/} from the stored squares' macros. +% \begin{macro}{\putletter} % % \changes{v2.8a}{96/07/22}{use \cs{sffamily} (FMi)} +% These macros put letters, numbers and bars at the current +% \verb+[\Down,\Across]+ position. Note that \verb+\putletter+ +% would be redefined to \verb+\relax+ if no actual letters are required. % \begin{macrocode} -\def\letter#1{{\put(\Across,-\Down){\makebox(1,1){\sffamily #1}}}} +\def\putletter{{\put(\Across,-\Down){\makebox(1,1) + {\sffamily \value Letter[\Down,\Across]}}}} % \end{macrocode} -% -% \begin{macro}{\numberedsquare} -% This macro is used (for \verb+\numbersquare+) when the lights are being -% drawn with light numbering enabled. It puts the number (and the letter of -% the answer too, depending upon the definition of \verb+\letter+ which is -% current) at the current coordinate position specified by -% \verb+(\Across,\Down)+. +% \begin{macro}{\putnumber} +% The \verb+\putnumber+ macro checks whether the clue number is 0 (which +% means an unnumbered square) and whether the clue numbers are in +% sequence. To this end, it makes use of global \verb+\oldnumber+ +% and \texttt{seqtest}. % \begin{macrocode} -\def\numberedsquare#1#2{% - \put(\Across,-\Down){% +\newcount\oldnumber \oldnumber=0 +\newif\ifseqtest \seqtestfalse +\def\putnumber{\immediate\def\Number{\value Number[\Down,\Across]} + \ifnumberit \ifnum\Number>0 + \put(\Across,-\Down){% % \end{macrocode} % % To insert the clue number, we generate it within a sub-picture, of size @@ -1250,37 +1171,57 @@ % \end{macrocode} % % We stick the number in the top-left corner of an (invisible) box which -% fills the central 81\% of the area. -% -% \begin{macrocode} - \put(0.05,0.05){\makebox(0.9,0.9)[tl]{\tiny #1}} - \end{picture}% - } -% \end{macrocode} -% -% We also set the letter in the square (depending upon the definition of -% \verb+\letter+ which applies. +% fills the central 81\% of the area. In the process, we check whether +% the clues are properly numbered in reading order. % % \begin{macrocode} - \letter{#2}} + \put(0.05,0.05){\makebox(0.9,0.9)[tl]{\numbersize\Number}} + \end{picture}} + \ifnum \oldnumber>0 \advance\oldnumber by\m@ne + \ifnum \oldnumber=\Number {\seqtesttrue} \else + \ifseqtest + \errhelp{Clues should be numbered consecutively from top left + to bottom right.} + \errmessage{Found clue number \Number, but expected \the\oldnumber} % \end{macrocode} -% -% \begin{macro}{\unnumberedsquare} -% Despite its name, this macro is invoked (through \verb+\numbersquare+) for -% those squares which would ordinarily carry a light's number, were it not -% for the fact that the numbers have been suppressed by the {\sf crossword*} -% environment. -% -% It just discards the \meta{clue\_number} given in the first parameter and -% sets the current letter by invoking \verb+\letter+, which uses the second -% parameter\dots +% If a clue number was mistyped, it will generate two out-of-sequence +% errors. We suppress the second of these. % % \begin{macrocode} -\def\unnumberedsquare#1{\letter} + \seqtestfalse + \else\seqtesttrue\fi + \fi + \fi + \global \oldnumber=\Number +\fi \fi +} % \end{macrocode} -% \end{macro} ^^A \unnumberedsquare -% \end{macro} ^^A \numberedsquare -% \end{macro} ^^A \letter +% \begin{macro}{\putbars} +% If there are two adjacent light squares not belonging to the same light, +% we draw a bar between them. We use two counters for that: one for the +% previous square, so we can test for its blackness; one for the +% changing value of the barcode for the current square. +% \begin{macrocode} +\newcount \pr@vious +\newcount \c@de +\def\putbars{ \linethickness{\barwidth\unitlength} + \c@de=\value Bar[\Down,\Across] + \ifnum \c@de>1 \advance\c@de by -2 + \ifnum \Across>1 + \pr@vious=\Across \advance \pr@vious by -1 + \immediate\def\pr@vlet{\value Letter[\Down,\pr@vious]} + \if \pr@vlet ! \else \put(\Across,-\Down){\line(0,1){1}} + \fi \fi \fi + \ifnum \c@de>0 + \ifnum \Down>1 + \pr@vious=\Down \advance \pr@vious by -1 + \immediate\def\pr@vlet{\value Letter[\pr@vious,\Across]} + \if \pr@vlet ! \else \put(\Across,-\pr@vious){\line(1,0){1}} + \fi \fi \fi +} +% \end{macrocode} +% +% \end{macro}\end{macro}\end{macro} % % \begin{macro}{\FinishGrid} % Now we can process all the stored macros which define the appearance of @@ -1291,62 +1232,28 @@ % different effects during the filling of the grid. % \changes{v2.2}{89/05/17}{Removed extraneous opening space after brace} % \changes{v2.6}{89/10/13}{Minor revision of layout} +% \changes{v2.9}{07/12/05}{Rectangular grid, top right extra labels} % \begin{macrocode} \def\FinishGrid{% % \end{macrocode} % % If the customer doesn't want the letters put into the grid, then we -% need only throw away any parameter to \verb+letter+. -% -% \begin{macrocode} - \if\answer Y \else \let \letter=\@gobble \fi -% \end{macrocode} -% -% As stated in the introduction, when typesetting the grid in a smaller -% version, there is insufficient space to include the numbers for the -% lights; by testing \verb+\ifnumberit+ we can determine whether a macro -% which expands to \verb+\numbersquare+ shall result in a number being -% printed or not. -% -% \begin{macrocode} - \ifnumberit - \let\numbersquare=\numberedsquare - \else - \let\numbersquare=\unnumberedsquare - \fi -% \end{macrocode} -% -% Anything that's been stored as a \verb+\lettersquare+ is ``set'' using the -% \verb+\letter+ macro (which we might have just \verb+\let+ equal to -% \verb+\@gobble+). -% -% \begin{macrocode} - \let\lettersquare=\letter -% \end{macrocode} -% -% \begin{macro}{\blacksquare} -% Any black squares that are still left in the grid are set by means of this -% command: +% need only let \verb+\putletter+ do nothing. Since \verb+\FinishGrid+ +% is invoked inside the environment, the original definition will be +% restored on exit. % % \begin{macrocode} - \def\blacksquare{% -% \end{macrocode} -% -% The black square itself is merely a rule of the appropriate dimensions. -% -% \begin{macrocode} - \put(\Across,-\Down){\rule{\unitlength}{\unitlength}}} + \if\answer Y \else \let\putletter\relax \fi % \end{macrocode} -% \end{macro} -% % % Now we come to the actual body of \verb+\FinishGrid+. % % \changes{v2.6}{89/10/13}{Minor revision of layout} +% \changes{v2.9}{07/12/05}{Rectangular grid} % We start off at the bottom-most row of the grid\dots % % \begin{macrocode} - \Down=\gr@dsize + \Down=\gridr@ws % \end{macrocode} % % The whole grid is created in a centered \verb+\hbox+ in a {\sf picture} @@ -1356,7 +1263,7 @@ % % \begin{macrocode} \centerline{% - \begin{picture}(\p@csize,\p@csize)(1,-\p@csize) + \begin{picture}(\p@csize,\p@rsize)(1,-\p@rsize) % \end{macrocode} % % We now cycle through each of the rows. The first thing we output is a @@ -1366,14 +1273,14 @@ % % \begin{macrocode} \loop\ifnum\Down>\z@ - \put(1,-\Down){\line(1,0){\the\gr@dsize}} + \put(1,-\Down){\line(1,0){\the\gridc@ls}} % \end{macrocode} % % Now we are about to cycle across all the columns of the current row; % again, it's convenient for us to work backwards to the left\dots % % \begin{macrocode} - \Across=\gr@dsize + \Across=\gridc@ls % \end{macrocode} % % To do this we need an inner loop; this has to be inside a group so as to @@ -1383,13 +1290,16 @@ {\loop \ifnum\Across>\z@ % \end{macrocode} % -% To set the appropriate object in this square, we merely invoke the macro -% which has been associated with the square. Thus we'll end up with a black -% square, or a numbered or plain square, the latter two of which may also -% contain a letter. -% +% A black square is represented by \texttt{!} instead of a letter. +% We need an \verb+\immediate+ definition to force the expansion +% so we can test using \verb+\if+. This test cannot be made inside +% \verb+\putletter+ because that macro may have been redefined +% when the lights are empty. % \begin{macrocode} - \csname\ther@w\thec@l\endcsname + \immediate\def\lett@r{\value Letter[\Down,\Across]} + \if \lett@r ! \put(\Across,-\Down){\rule{\unitlength}{\unitlength}} + \else \putletter \putnumber \putbars + \fi % \end{macrocode} % % Now we advance to the next column and iterate. That's the end of the @@ -1402,18 +1312,23 @@ % \end{macrocode} % % Now we can decrement down to the next row and iterate through the -% rows. +% rows. In the process, we encounter all the clue numbers in opposite +% order, therefore the last clue number found should be 1. % % \begin{macrocode} \advance\Down by \m@ne \repeat + \ifthenelse{\equal{\the\oldnumber}1}{} + {\ifnumberit\errhelp{Clues should be numbered consecutively + from top left to bottom right.} + \errmessage{First clue number is \the\oldnumber, not 1} \fi} % \end{macrocode} % % We've so far drawn a horizontal line {\em under\/} each of the rows; the % next \verb+\put+ draws a final line {\em above\/} the top-most row. % % \begin{macrocode} - \put(1,0){\line(1,0){\the\gr@dsize}} + \put(1,0){\line(1,0){\the\gridc@ls}} % \end{macrocode} % % Similarly, a short loop can draw vertical rules at the left-hand edge of @@ -1424,7 +1339,7 @@ % \begin{macrocode} \Across=\p@csize \loop\ifnum\Across>\z@ - \put(\Across,0){\line(0,-1){\the\gr@dsize}} + \put(\Across,0){\line(0,-1){\the\gridr@ws}} \advance\Across by \m@ne \repeat % \end{macrocode} @@ -1440,12 +1355,20 @@ % \end{macro} % % +% +% \section{A hard crossword with blocks and bars} +% \begin{crossword}[11]{13}{N} +% \MakePercentComment \input{grid2} \MakePercentIgnore +% \end{crossword} + + +% \section{Sample input files} % Finally, here's the input which produced the crossword in -% figure~\ref{crossword:1} +% Figure~\ref{crossword:1} % % \begin{verbatim} % \begin{crossword}{15}{N} -% \input{grid-1} +% \input{grid1} % \end{crossword} % \end{verbatim} % @@ -1574,7 +1497,6 @@ % % \end{macrocode} % -% % % \begin{macrocode} %<*exa1> @@ -1586,7 +1508,7 @@ \begin{document} \section*{A Sample Crossword} \textit{(Chamber's Twentieth Century dictionary)} - \begin{crossword}{15}{?} + \begin{crossword}{15}{N} \input{grid1} \end{crossword} \begin{crossword*}{15}{Solution to grid 0} @@ -1595,8 +1517,80 @@ \end{document} % % \end{macrocode} -% + % % \Finale -% +% \endinput + + +%<*exa2> +\documentclass[a4paper]{article} +\usepackage{a4wide,charter,crosswrd} +\topmargin -20mm +\textheight 240mm +\begin{document} + \thispagestyle{empty} + \begin{crossword}[11]{13}{N} + \input grid2 + \end{crossword} +\end{document} +% +%<*grid2> + \unitlength 7mm + \let\numbersize\scriptsize + \centerline{\large{\textbf{T-shirt design} by Dirk Laurie}} + \def\Preamble{5 27, and that goes for 17 11 25 and 24A 10 too, +I'm sure, so the unclued lights should be entered in red. +The other lights are all +in the rather ancient edition of Chambers consulted by the composer.} +\clue{1}{A}{1}{1}{........}{Murderer's lip in an evil act}{8} +\clue{6}{A}{9}{1}{.....}{Places where vehicles without + resistance get bogged down?}{5} +\clue{10}{A}{2}{2}{..........}{}{} +\clue{12}{A}{1}{3}{....}{Perhaps 27 die here}{4} +\clue{14}{A}{5}{3}{.....}{Obstinate at first and after a smack}{5} +\clue{15}{A}{10}{3}{....}{Seduced girl, as rumoured}{4} +\clue{16}{A}{1}{5}{........}{Paid an unspecified amount in Johannesburg}{8} +\clue{17 \noexpand\& 11D \noexpand\& 25D}{A}{9}{5}{.....}{}{See preamble} +\clue{18}{A}{1}{6}{......}{Butt gives information in a peeve}{6,hyphenated} +\clue{20}{A}{8}{6}{......}{Big folk appearing in spots last month}{6} +\clue{24 \noexpand\& 10}{A}{1}{7}{.....}{}{See preamble} +\clue{26}{A}{6}{7}{........}{Wince after European has knocked back medicine, +leaving out some}{8} +\clue{30}{A}{1}{9}{....}{Recidivist is back, getting old in here}{4} +\clue{31}{A}{5}{9}{.....}{Unwilling to receive a small copper pot}{5} +\clue{32}{A}{10}{9}{....}{Primal wilderness beside a person from the East + ``is Paradise ---''}{4} +\clue{33}{A}{3}{10}{..........}{Denizen of Africa to suffer in the heat +when dose insects get in}{10} +\clue{34}{A}{1}{11}{.....}{Turn around at home and peek outside, like 18?}{5} +\clue{35}{A}{6}{11}{........}{Such as these two from the back going + ahead in copious lovemaking}{8} +\clue{1}{D}{1}{1}{......}{A disc full of French horn music}{6} +\clue{2}{D}{2}{1}{....}{Drams served up in Highland drizzle}{4} +\clue{3}{D}{4}{1}{......}{A gadfly with well-separated feet etc}{6,two words} +\clue{4}{D}{5}{1}{......}{Not many shooting up, in fact only one}{6} +\clue{5 \noexpand\& 27}{D}{7}{1}{.....}{}{See preamble,three words} +\clue{6}{D}{9}{1}{.....}{Tree that will, having had root extracted +at first, turn into mineral!}{5} +\clue{7}{D}{10}{1}{....}{Give me a response that I can hear: + it's no longer a crisis}{4} +\clue{8}{D}{12}{1}{......}{What unreformed head wears is right}{6} +\clue{9}{D}{13}{1}{.....}{Dirk's parrot, found in polar regions}{5} +\clue{11}{D}{11}{2}{........}{}{} +\clue{13}{D}{3}{3}{........}{Saying "Be with you shortly", lassie goes inside +house}{8} +\clue{19}{D}{2}{6}{......}{Invest ten rand judiciously}{6} +\clue{21}{D}{9}{6}{......}{Coin Dirk lost on the way up; Henry gets involved}{6} +\clue{22}{D}{10}{6}{......}{Peek!}{6} +\clue{23}{D}{13}{6}{......}{Neutral sounds and trite sayings arise all around Switzerland}{6} +\clue{24}{D}{1}{7}{.....}{Servants genteel at heart? One of them +is the butler at Blandings Castle!} +{5} +\clue{25}{D}{5}{7}{.....}{}{} +\clue{27}{D}{7}{7}{.....}{}{} +\clue{28}{D}{4}{8}{....}{Serving up only half a beer is a mistake}{4} +\clue{29}{D}{12}{8}{....}{Footplay before strong no-trump not allowed}{4} +% +% diff --git a/Master/texmf-dist/source/latex/crosswrd/crosswrd.ins b/Master/texmf-dist/source/latex/crosswrd/crosswrd.ins index 01993bdf41a..49acbbf1bdb 100644 --- a/Master/texmf-dist/source/latex/crosswrd/crosswrd.ins +++ b/Master/texmf-dist/source/latex/crosswrd/crosswrd.ins @@ -1,44 +1,24 @@ -%% crosswrd.ins -%% Copyright 1989 Brian Hamilton Kelly -%% updated for LaTeX2e by Frank Mittelbach 96/12/06 -% -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either version 1.3 -% of this license or (at your option) any later version. -% The latest version of this license is in -% http://www.latex-project.org/lppl.txt -% and version 1.3 or later is part of all distributions of LaTeX -% version 2005/12/01 or later. -% -% This work has the LPPL maintenance status `unmaintained'. -% -% This work consists of the files crosswrd.dtx, crosswrd.ins and README -% and the derived files test0.tex, test1.tex, grid0.tex, grid1.tex and crosswrd.sty. -% + \def\batchfile{crosswrd.ins} \input docstrip.tex \preamble - -Copyright 1989 Brian Hamilton Kelly -updated for LaTeX2e by Frank Mittelbach 96/12/06 +Copyright C 1989 Brian Hamilton Kelly crossword macros for LaTeX +updated for LaTeX2e by Frank Mittelbach 96/12/06 +substantially extended by Dirk Laurie 08/01/18 for documentation run latex crosswrd.dtx -This work may be distributed and/or modified under the -conditions of the LaTeX Project Public License, either version 1.3 -of this license or (at your option) any later version. -The latest version of this license is in - http://www.latex-project.org/lppl.txt -and version 1.3 or later is part of all distributions of LaTeX -version 2005/12/01 or later. +distribution consist of -This work has the LPPL maintenance status `unmaintained'. + crosswrd.dtx source + crosswrd.ins installation script + 00readme -This work consists of the files crosswrd.dtx, crosswrd.ins and README -and the derived files test0.tex, test1.tex, grid0.tex, grid1.tex and crosswrd.sty. +don't distribute this file without distributing the above +files as well \endpreamble @@ -48,6 +28,8 @@ and the derived files test0.tex, test1.tex, grid0.tex, grid1.tex and crosswrd.st \file{crosswrd.sty}{\from{crosswrd.dtx}{package}} \file{test0.tex}{\from{crosswrd.dtx}{exa0}} \file{test1.tex}{\from{crosswrd.dtx}{exa1}} + \file{test2.tex}{\from{crosswrd.dtx}{exa2}} \file{grid0.tex}{\from{crosswrd.dtx}{grid0}} \file{grid1.tex}{\from{crosswrd.dtx}{grid1}} + \file{grid2.tex}{\from{crosswrd.dtx}{grid2}} } -- cgit v1.2.3