summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:52:12 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:52:12 +0000
commitb2539d622ace09a4c7321ffb749e0d15f92c6d28 (patch)
tree3bb8b17d6b8168243202366e5f022673233ed549 /Master
parent4a7c88ec3ceec0d0f66d8af671597598ef213bf7 (diff)
trunk/Master/texmf-dist/source/latex/cwpuzzle
git-svn-id: svn://tug.org/texlive/trunk@216 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r--Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/README143
-rw-r--r--Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/nytconv.c202
-rw-r--r--Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/nytsconv.c209
-rw-r--r--Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/usaconv.c229
-rw-r--r--Master/texmf-dist/source/latex/cwpuzzle/Makefile33
-rw-r--r--Master/texmf-dist/source/latex/cwpuzzle/README73
-rw-r--r--Master/texmf-dist/source/latex/cwpuzzle/cwpuzzle.dtx1077
-rw-r--r--Master/texmf-dist/source/latex/cwpuzzle/cwpuzzle.ins43
8 files changed, 2009 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/README b/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/README
new file mode 100644
index 00000000000..8555f2a213a
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/README
@@ -0,0 +1,143 @@
+Here are three programs and a script for use with Gerd
+Neugebauer's excellent cwpuzzle.sty package for typesetting
+crossword puzzles in LaTeX.
+
+The purpose of the programs is to convert the popular
+Across Lite(R) puzzle formats, both binary and text, to
+LaTeX input suitable for use with Gerd's package.
+
+Build the programs like this:
+
+gcc -o nytconv nytconv.c
+gcc -o nytsconv nytsconv.c
+gcc -o usaconv usaconv.c
+
+1. nytconv
+
+This program converts Across Lite(R) binary puzzle files:
+
+nytconv puzzlefile.puz >puzzlefile.tex
+
+where of course 'puzzlefile' is the name of the binary
+input file. The program is best suited to puzzles up to
+size 15x15, which is the standard daily puzzle size for
+the New York Times. NYT puzzles are distributed from their
+web site in Across Lite binary format. The web site is
+http://www.nytimes.com but registration (currently free)
+is needed to access the contents of the site.
+
+2. nytsconv
+
+This program is very similar to the previous one except
+it's for the larger Sunday puzzles, up to about 23x23.
+
+nytsconv puzzlefile.puz >puzzlefile.tex
+
+3. usaconv
+
+This program converts Across Lite(R) text files. Puzzles
+such as the USA Today daily puzzle and the Times of London
+daily puzzle are converted to LaTeX input via a two step
+process. You should go to the Across Lite web site,
+http://www.litsoft.com to pick up a USA Today conversion
+program and a Times of London conversion program. You can
+then pick up the puzzles (http://www.usatoday.com, or
+http://www.the-times.co.uk), convert to Across Lite text form,
+and then convert to LaTeX.
+
+usaconv puzzlefile.txt >puzzlefile.tex
+
+Well, you might say, what's the point? There are several.
+I don't want to solve crosswords on screen; I want printed
+copy to work with. So, why not just print from the Across
+Lite program? Because (1) I'm a LaTeX fanatic, and more
+importantly (2) I use an automated procedure to download
+the NYT and USA puzzles every morning, format them, and
+ready them for printing whenever I want a fresh puzzle!
+The only work I have to do is to actually solve the
+puzzle. (I don't have the skill needed to solve difficult
+cryptics such as the Times of London puzzles so I don't
+download them regularly.)
+
+Another important point is generating your own crosswords
+with computerized tools. Tools such as Crossword Express
+(http://www.puzzledepot.com/cwe) help you to produce
+crosswords quickly and effectively. One of the output
+format is Across Lite binary. This can then be converted
+(with the nyt- or nyts- conversion program, depending on
+puzzle size) and dropped into a LaTeX document. This is
+nice for newsletters, educational material, etc.
+
+There is still another possibility using postscript tools
+usually found on Unix systems. You might collect, say,
+100 puzzles, convert them all to LaTeX input, and process
+them. Then you can use tools such as psbook to make books
+of puzzles to take along on boring business trips or
+interesting vacation trips.
+
+For those of you with an interest, here is my automated
+Perl script for downloading and formatting puzzles. It
+requires the program 'wget' which can be found at
+ftp://gnjilux.cc.fer.hr/pub/unix/util/wget/
+(This site is sometimes hard to reach. Keep trying. Or
+contact me for alternatives.)
+
+Now, the script, which will require local site modification:
+---------------
+#!/usr/bin/perl
+
+chdir("/usr/games/crossword");
+($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
+
+# NY Times
+
+ $mpart = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[$mon];
+ if ($mday lt 10){$puzzle = $mpart."0".$mday.$year;}
+ else {$puzzle = $mpart.$mday.$year;}
+ system("/usr/bin/wget --http-user=myname --http-passwd=secret http://www.nytimes.com/partners/xword/$puzzle.puz");
+ if ($wday ne 0) {system("./nytconv $puzzle.puz >$puzzle.tex");}
+ else {system("./nytsconv $puzzle.puz >$puzzle.tex");}
+ system("/usr/bin/latex $puzzle");
+ if ($wday ne 0) {system("/usr/bin/dvips -x 1400 $puzzle");}
+ else {system("/usr/bin/dvips -x 1100 $puzzle");}
+ system("/usr/bin/psnup -l -2 -pletter $puzzle.ps $puzzle.wps");
+ system("echo \"quit\" >>$puzzle.wps");
+ system("/usr/bin/gs -q -sDEVICE=laserjet -r300 -dQUIET -dNOPAUSE -sOutputFile=$puzzle.lj $puzzle.wps ");
+ system("gzip -9 -f $puzzle.lj");
+ system("/bin/rm *dvi *ps *log *aux *tex");
+
+# USA Today
+
+if ($wday ne 6 && $wday ne 0) { # no weekend puzzles
+ $month = $mon + 1;
+ if ($month lt 10) {$directory = $year."0".$month;}
+ else {$directory = $year.$month;}
+ if ($mday lt 10){$puzzle = "ut".$directory."0".$mday;}
+ else {$puzzle = "ut".$directory.$mday;}
+ system("/usr/bin/wget http://www.usatoday.com/life/puzzles/$directory/$puzzle.puz");
+ system("./usa-acl $puzzle.puz $puzzle.txt");
+ system("./usaconv $puzzle.txt >$puzzle.tex");
+ system("/usr/bin/latex $puzzle");
+ system("/usr/bin/dvips -x 1400 $puzzle");
+ system("/usr/bin/psnup -l -2 -pletter $puzzle.ps $puzzle.wps");
+ system("echo \"quit\" >>$puzzle.wps");
+ system("/usr/bin/gs -q -sDEVICE=laserjet -r300 -dQUIET -dNOPAUSE -sOutputFile=$puzzle.lj $puzzle.wps ");
+ system("gzip -9 -f $puzzle.lj");
+ system("/bin/rm *dvi *ps *log *aux *tex *txt");
+}
+
+exit;
+--------------
+
+For any questions, bug reports, or especially improvements, please
+contact me:
+
+bnewell@btigate.com
+http://www.btigate.com/~bnewell
+
+
+Bob Newell
+Bismarck, North Dakota
+28 November, 1996
+
+
diff --git a/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/nytconv.c b/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/nytconv.c
new file mode 100644
index 00000000000..2956d29b345
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/nytconv.c
@@ -0,0 +1,202 @@
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#define ROWSIZE 256
+
+FILE *infile;
+int width, height, j, k, ccount, mcount, anum, dnum;
+int apos, dpos;
+
+char inbuf[ROWSIZE];
+
+/* Here is a lazy programmer's waste of space. */
+char aspace[ROWSIZE][ROWSIZE];
+char dspace[ROWSIZE][ROWSIZE];
+
+char rowtext[10*ROWSIZE];
+char tmp[ROWSIZE];
+
+char title[80];
+char author[80];
+char copyright[80];
+char matrix[ROWSIZE*ROWSIZE*10];
+char aclues[ROWSIZE*15*16];
+char dclues[ROWSIZE*15*16];
+
+void fgetaline(char *, FILE *);
+
+void main(int argc, char *argv[])
+{
+
+/* Open the puzzle file. */
+ if (argc < 2) {
+ printf("Usage: Acl2TeX <puzzle file>\n");
+ exit(1);
+ }
+ infile = fopen(argv[1], "rb");
+ if (infile == NULL) {
+ printf("Error opening %s.\n");
+ exit(1);
+ }
+
+/* From here on we're assuming a non-corrupt puzzle file.
+ An enhancement later could be to check for this. */
+
+/* Read in the puzzle size, skipping the stuff
+ we don't understand. */
+ fread(inbuf, 46, 1, infile);
+ width = (int)(inbuf[44]);
+ height = (int)(inbuf[45]);
+
+/* Read in the solution, assuming(!) it is not scrambled.
+ This may be a bad idea but we do it anyhow. */
+ fread(inbuf, 6, 1, infile); /* more basura */
+ for (j=0; j<height; j++) fread(&aspace[j][0], width, 1, infile);
+
+/* Read in the diagram info separately. It's safer to use
+ this to deduce the numbering scheme. */
+ for (j=0; j<height; j++) fread(&dspace[j][0], width, 1, infile);
+
+ /* Now start to separate some of the text headers. */
+ apos=dpos=0;
+ fgetaline(title, infile);
+ fgetaline(author, infile);
+ fgetaline(copyright, infile);
+
+/* Now we are ready to produce the LaTeX stuff for the
+ puzzle diagram. Again we are assuming we have an unscrambled
+ solution. How can we know this? Put on TODO list. */
+
+/* We write to standard out. Lazy but effective. */
+
+ printf("\\documentclass{article}\n");
+ printf("\\usepackage{cwpuzzle}\n");
+ printf("\\title{%s}\n", title);
+ printf("\\author{%s}\n", author);
+ printf("\\date{%s}\n", copyright);
+ printf("\\voffset -1in\n");
+ printf("\\hoffset -1in\n");
+ printf("\\begin{document}\n");
+
+ ccount = 0;
+ mcount = 0;
+
+ for (j=0; j<height; j++) {
+ strcpy(rowtext,"\0");
+ for (k=0; k<width; k++) {
+ /* Analyze position for across-number */
+ /* Left edge non-black followed by non-black */
+ anum = 0;
+ if ( (k==0 && dspace[j][k]=='-' && dspace[j][k+1]=='-') ||
+ /* Previous black - nonblack - nonblack */
+ ( (k+1)<width && (k-1)>=0 && dspace[j][k]=='-'
+ && dspace[j][k-1]=='.'
+ && dspace[j][k+1]=='-' )
+ ){
+ ccount++;
+ anum = ccount;
+ }
+ /* Analyze position for down-number */
+ dnum = 0;
+ /* Top row non-black followed by non-black */
+ if ( (j==0 && dspace[j][k]=='-' && dspace[j+1][k]=='-') ||
+ /* Black above - nonblack - nonblack below */
+ ( (j-1)>=0 && (j+1)<height && dspace[j][k]=='-'
+ && dspace[j-1][k]=='.'
+ && dspace[j+1][k]=='-' )
+ ){
+ /* Don't double number the same space */
+ if (anum == 0) ccount++;
+ dnum = ccount;
+ }
+ /* Now, if necessary, pick up some clues and save them. */
+ if (anum != 0) {
+ fgetaline(tmp, infile);
+ sprintf(&aclues[apos], "\\Clue{%d}{}{%s}\\\\\n",
+ anum, tmp);
+ apos = strlen(aclues);
+ }
+ if (dnum != 0) {
+ fgetaline(tmp, infile);
+ sprintf(&dclues[dpos], "\\Clue{%d}{}{%s}\\\\\n",
+ dnum, tmp);
+ dpos = strlen(dclues);
+ }
+ /* Concat the current info to the current row. */
+ strcat(rowtext, "|");
+ if (dspace[j][k] == '.') strcat(rowtext, "*");
+ else {
+ /* see if we need a grid number */
+ if (dnum != 0) {
+ sprintf(tmp, "[%d]", dnum);
+ strcat(rowtext, tmp);
+ }
+ else if (anum != 0) {
+ sprintf(tmp, "[%d]", anum);
+ strcat(rowtext, tmp);
+ }
+ /* Put in solution letter */
+ strncat(rowtext, &aspace[j][k], 1);
+ }
+ }
+ /* End of the row. Put in marker and output it. */
+ strcat(rowtext, "|.");
+ sprintf(&matrix[mcount], "%s\n", rowtext);
+ mcount = strlen(matrix);
+ }
+ /* That's it for the puzzle. */
+
+ /* Now output the clue section */
+ printf("\\begin{PuzzleClues}{\\textbf{Across}}\\\\\n");
+ printf("%s", aclues);
+ printf("\\end{PuzzleClues}\n");
+ printf("\\begin{PuzzleClues}{\\textbf{Down}}\\\\\n");
+ printf("%s", dclues);
+ printf("\\end{PuzzleClues}\n");
+
+ /* Now output the diagram */
+ printf("\\newpage\n");
+ printf("\\maketitle\n");
+ printf("\\begin{Puzzle}{%d}{%d}\n", width, height);
+ printf("%s", matrix);
+ printf("\\end{Puzzle}\n");
+
+
+ printf("\\end{document}\n");
+
+ exit(0);
+
+}
+
+ void fgetaline(char *foo, FILE *infile) {
+ unsigned char i;
+ int oe;
+ oe = 0;
+ strcpy(foo, "\0");
+ while (1) {
+ fread(&i, 1, 1, infile);
+ if (feof(infile) || (i=='\0')) break;
+ if (i == 169) {
+ strcat(foo, "\\copyright ");
+ }
+ else {
+ if (i == '_' || i == '&' || i == '#' || i== '$') strcat(foo, "\\");
+ if (i == '"') {
+ if ( oe == 0) {
+ oe = 1;
+ strcat(foo, "``");
+ }
+ else {
+ oe = 0;
+ strcat(foo, "''");
+ }
+ }
+ else strncat(foo, &i, 1);
+ }
+ }
+ }
+
+
+
diff --git a/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/nytsconv.c b/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/nytsconv.c
new file mode 100644
index 00000000000..77e478f6840
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/nytsconv.c
@@ -0,0 +1,209 @@
+
+/* ACL to LaTeX conversion suitable for Sunday NY Times */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#define ROWSIZE 256
+
+FILE *infile;
+int width, height, j, k, ccount, mcount, anum, dnum;
+int apos, dpos;
+
+char inbuf[ROWSIZE];
+
+/* Here is a lazy programmer's waste of space. */
+char aspace[ROWSIZE][ROWSIZE];
+char dspace[ROWSIZE][ROWSIZE];
+
+char rowtext[10*ROWSIZE];
+char tmp[ROWSIZE];
+
+char title[80];
+char author[80];
+char copyright[80];
+char matrix[ROWSIZE*ROWSIZE*10];
+char aclues[ROWSIZE*15*16];
+char dclues[ROWSIZE*15*16];
+
+void fgetaline(char *, FILE *);
+
+void main(int argc, char *argv[])
+{
+
+/* Open the puzzle file. */
+ if (argc < 2) {
+ printf("Usage: Acl2TeX <puzzle file>\n");
+ exit(1);
+ }
+ infile = fopen(argv[1], "rb");
+ if (infile == NULL) {
+ printf("Error opening %s.\n");
+ exit(1);
+ }
+
+/* From here on we're assuming a non-corrupt puzzle file.
+ An enhancement later could be to check for this. */
+
+/* Read in the puzzle size, skipping the stuff
+ we don't understand. */
+ fread(inbuf, 46, 1, infile);
+ width = (int)(inbuf[44]);
+ height = (int)(inbuf[45]);
+
+/* Read in the solution, assuming(!) it is not scrambled.
+ This may be a bad idea but we do it anyhow. */
+ fread(inbuf, 6, 1, infile); /* more basura */
+ for (j=0; j<height; j++) fread(&aspace[j][0], width, 1, infile);
+
+/* Read in the diagram info separately. It's safer to use
+ this to deduce the numbering scheme. */
+ for (j=0; j<height; j++) fread(&dspace[j][0], width, 1, infile);
+
+ /* Now start to separate some of the text headers. */
+ apos=dpos=0;
+ fgetaline(title, infile);
+ fgetaline(author, infile);
+ fgetaline(copyright, infile);
+
+/* Now we are ready to produce the LaTeX stuff for the
+ puzzle diagram. Again we are assuming we have an unscrambled
+ solution. How can we know this? Put on TODO list. */
+
+/* We write to standard out. Lazy but effective. */
+
+ printf("\\documentclass{article}\n");
+ printf("\\usepackage{cwpuzzle,multicol}\n");
+ printf("\\title{%s}\n", title);
+ printf("\\author{%s}\n", author);
+ printf("\\date{%s}\n", copyright);
+ printf("\\voffset -1in\n");
+ printf("\\hoffset -1in\n");
+ printf("\\textwidth 6.5in\n");
+ printf("\\marginparwidth 0in\n");
+ printf("\\textheight 9.5in\n");
+ printf("\\begin{document}\n");
+ printf("{\\small\n");
+ printf("\\begin{multicols}{5}\n");
+ printf("\\raggedright\n");
+
+ ccount = 0;
+ mcount = 0;
+
+ for (j=0; j<height; j++) {
+ strcpy(rowtext,"\0");
+ for (k=0; k<width; k++) {
+ /* Analyze position for across-number */
+ /* Left edge non-black followed by non-black */
+ anum = 0;
+ if ( (k==0 && dspace[j][k]=='-' && dspace[j][k+1]=='-') ||
+ /* Previous black - nonblack - nonblack */
+ ( (k+1)<width && (k-1)>=0 && dspace[j][k]=='-'
+ && dspace[j][k-1]=='.'
+ && dspace[j][k+1]=='-' )
+ ){
+ ccount++;
+ anum = ccount;
+ }
+ /* Analyze position for down-number */
+ dnum = 0;
+ /* Top row non-black followed by non-black */
+ if ( (j==0 && dspace[j][k]=='-' && dspace[j+1][k]=='-') ||
+ /* Black above - nonblack - nonblack below */
+ ( (j-1)>=0 && (j+1)<height && dspace[j][k]=='-'
+ && dspace[j-1][k]=='.'
+ && dspace[j+1][k]=='-' )
+ ){
+ /* Don't double number the same space */
+ if (anum == 0) ccount++;
+ dnum = ccount;
+ }
+ /* Now, if necessary, pick up some clues and save them. */
+ if (anum != 0) {
+ fgetaline(tmp, infile);
+ sprintf(&aclues[apos], "{\\bf %d} %s\\\\\n",
+ anum, tmp);
+ apos = strlen(aclues);
+ }
+ if (dnum != 0) {
+ fgetaline(tmp, infile);
+ sprintf(&dclues[dpos], "{\\bf %d} %s\\\\\n",
+ dnum, tmp);
+ dpos = strlen(dclues);
+ }
+ /* Concat the current info to the current row. */
+ strcat(rowtext, "|");
+ if (dspace[j][k] == '.') strcat(rowtext, "*");
+ else {
+ /* see if we need a grid number */
+ if (dnum != 0) {
+ sprintf(tmp, "[%d]", dnum);
+ strcat(rowtext, tmp);
+ }
+ else if (anum != 0) {
+ sprintf(tmp, "[%d]", anum);
+ strcat(rowtext, tmp);
+ }
+ /* Put in solution letter */
+ strncat(rowtext, &aspace[j][k], 1);
+ }
+ }
+ /* End of the row. Put in marker and output it. */
+ strcat(rowtext, "|.");
+ sprintf(&matrix[mcount], "%s\n", rowtext);
+ mcount = strlen(matrix);
+ }
+ /* That's it for the puzzle. */
+
+ /* Now output the clue section */
+ printf("{\\bf ACROSS}\\\\\n");
+ printf("%s", aclues);
+ printf("{\\bf DOWN}\\\\\n");
+ printf("%s", dclues);
+ printf("\\end{multicols}\n");
+ printf("}\n");
+
+ /* Now output the diagram */
+ printf("\\newpage\n");
+ printf("\\maketitle\n");
+ printf("\\begin{Puzzle}{%d}{%d}\n", width, height);
+ printf("%s", matrix);
+ printf("\\end{Puzzle}\n");
+
+ printf("\\end{document}\n");
+
+ exit(0);
+
+}
+
+ void fgetaline(char *foo, FILE *infile) {
+ unsigned char i;
+ int oe;
+ oe = 0;
+ strcpy(foo, "\0");
+ while (1) {
+ fread(&i, 1, 1, infile);
+ if (feof(infile) || (i=='\0')) break;
+ if (i == 169) {
+ strcat(foo, "\\copyright ");
+ }
+ else {
+ if (i == '_' || i == '&' || i == '#' || i == '$') strcat(foo, "\\");
+ if (i == '"') {
+ if ( oe == 0) {
+ oe = 1;
+ strcat(foo, "``");
+ }
+ else {
+ oe = 0;
+ strcat(foo, "''");
+ }
+ }
+ else strncat(foo, &i, 1);
+ }
+ }
+ }
+
+
+
diff --git a/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/usaconv.c b/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/usaconv.c
new file mode 100644
index 00000000000..9f8433d4fd3
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cwpuzzle/AcrossLite/usaconv.c
@@ -0,0 +1,229 @@
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#define ROWSIZE 256
+
+FILE *infile;
+int width, height, j, k, ccount, mcount, anum, dnum;
+int apos, dpos;
+int acount, dcount;
+
+char inbuf[ROWSIZE];
+
+/* Here is a lazy programmer's waste of space. */
+char aspace[ROWSIZE][ROWSIZE];
+char dspace[ROWSIZE][ROWSIZE];
+
+char rowtext[10*ROWSIZE];
+char tmp[ROWSIZE];
+
+char title[80];
+char author[80];
+char copyright[80];
+char matrix[ROWSIZE*ROWSIZE*10];
+char actext[ROWSIZE][80];
+char dctext[ROWSIZE][80];
+char aclues[ROWSIZE*15*16];
+char dclues[ROWSIZE*15*16];
+
+void fgetsa(char *, int, FILE *);
+
+void main(int argc, char *argv[])
+{
+
+/* Open the puzzle file. */
+ if (argc < 2) {
+ printf("Usage: usaconv <puzzle file>\n");
+ exit(1);
+ }
+ infile = fopen(argv[1], "r");
+ if (infile == NULL) {
+ printf("Error opening %s.\n");
+ exit(1);
+ }
+
+/* From here on we're assuming a non-corrupt puzzle file.
+ An enhancement later could be to check for this. */
+
+/* start reading stuff in */
+ fgetsa(inbuf, 80, infile); /*<ACROSS PUZZLE>*/
+ fgetsa(inbuf, 80, infile); /*<TITLE>*/
+ fgetsa(title, 80, infile);
+ fgetsa(inbuf, 80, infile); /*<AUTHOR>*/
+ fgetsa(author, 80, infile);
+ fgetsa(inbuf, 80, infile); /*<COPYRIGHT>*/
+ fgetsa(copyright,80, infile);
+ fgetsa(inbuf, 80, infile); /*<SIZE>*/
+
+ fgetsa(inbuf, 80, infile);
+ height = width = 0 ; /* we calculate instead */
+
+ fgetsa(inbuf, 80, infile); /*<GRID>*/
+
+/* Read in the first line of the solution/diagram and determine width */
+ fgetsa(&aspace[height][0], 80, infile);
+ width = strlen(&aspace[height][0]);
+ height++;
+ while (1) {
+ fgetsa(&aspace[height][0], 80, infile);
+ if(strcmp(&aspace[height][0],"<ACROSS>")==0) goto didit;
+ height++;
+ }
+didit:
+ /* Read and save across and down clues */
+
+ apos=dpos=0;
+ while(1) {
+ fgetsa(&actext[apos][0], 80, infile);
+ if(strcmp(&actext[apos][0],"<DOWN>")==0)goto dida;
+ apos++;
+ }
+dida:
+ while(1) {
+ fgetsa(&dctext[dpos][0], 80, infile);
+ if(feof(infile)) goto didd;
+ dpos++;
+ }
+didd:
+ apos=dpos=0;
+
+/* Now we are ready to produce the LaTeX stuff for the
+ puzzle diagram. Again we are assuming we have an unscrambled
+ solution. How can we know this? Put on TODO list. */
+
+/* We write to standard out. Lazy but effective. */
+
+ printf("\\documentclass{article}\n");
+ printf("\\usepackage{cwpuzzle}\n");
+ printf("\\title{%s}\n", title);
+ printf("\\author{%s}\n", author);
+ printf("\\date{%s}\n", copyright);
+ printf("\\voffset -1in\n");
+ printf("\\hoffset -1in\n");
+ printf("\\begin{document}\n");
+
+ ccount = 0;
+ mcount = 0;
+ acount = dcount = 0;
+
+ for (j=0; j<height; j++) {
+ strcpy(rowtext,"\0");
+ for (k=0; k<width; k++) {
+ /* Analyze position for across-number */
+ /* Left edge non-black followed by non-black */
+ anum = 0;
+ if ( (k==0 && aspace[j][k]!='.' && aspace[j][k+1]!='.') ||
+ /* Previous black - nonblack - nonblack */
+ ( (k+1)<width && (k-1)>=0 && aspace[j][k]!='.'
+ && aspace[j][k-1]=='.'
+ && aspace[j][k+1]!='.' )
+ ){
+ ccount++;
+ anum = ccount;
+ }
+ /* Analyze position for down-number */
+ dnum = 0;
+ /* Top row non-black followed by non-black */
+ if ( (j==0 && aspace[j][k]!='.' && aspace[j+1][k]!='.') ||
+ /* Black above - nonblack - nonblack below */
+ ( (j-1)>=0 && (j+1)<height && aspace[j][k]!='.'
+ && aspace[j-1][k]=='.'
+ && aspace[j+1][k]!='.' )
+ ){
+ /* Don't double number the same space */
+ if (anum == 0) ccount++;
+ dnum = ccount;
+ }
+ /* Now, if necessary, assign some clues and save them. */
+ if (anum != 0) {
+ sprintf(&aclues[apos], "\\Clue{%d}{}{%s}\\\\\n",
+ anum, actext[acount]);
+ acount++;
+ apos = strlen(aclues);
+ }
+ if (dnum != 0) {
+ sprintf(&dclues[dpos], "\\Clue{%d}{}{%s}\\\\\n",
+ dnum, dctext[dcount]);
+ dcount++;
+ dpos = strlen(dclues);
+ }
+ /* Concat the current info to the current row. */
+ strcat(rowtext, "|");
+ if (aspace[j][k] == '.') strcat(rowtext, "*");
+ else {
+ /* see if we need a grid number */
+ if (dnum != 0) {
+ sprintf(tmp, "[%d]", dnum);
+ strcat(rowtext, tmp);
+ }
+ else if (anum != 0) {
+ sprintf(tmp, "[%d]", anum);
+ strcat(rowtext, tmp);
+ }
+ /* Put in solution letter */
+/* this is for real */ if (aspace[j][k]== '&') strncat(rowtext, "\\", 1);
+ strncat(rowtext, &aspace[j][k], 1);
+ }
+ }
+ /* End of the row. Put in marker and output it. */
+ strcat(rowtext, "|.");
+ sprintf(&matrix[mcount], "%s\n", rowtext);
+ mcount = strlen(matrix);
+ }
+ /* That's it for the puzzle. */
+
+ /* Now output the clue section */
+ printf("\\begin{PuzzleClues}{\\textbf{Across}}\\\\\n");
+ for (j=0; j<strlen(aclues); j++){
+ printf("%c",aclues[j]);
+ }
+ printf("\\end{PuzzleClues}\n");
+ printf("\\begin{PuzzleClues}{\\textbf{Down}}\\\\\n");
+ for (j=0; j<strlen(dclues); j++){
+ printf("%c",dclues[j]);
+ }
+ printf("\\end{PuzzleClues}\n");
+
+ /* Now output the diagram */
+ printf("\\newpage\n");
+ printf("\\maketitle\n");
+ printf("\\begin{Puzzle}{%d}{%d}\n", width, height);
+ printf("%s", matrix);
+ printf("\\end{Puzzle}\n");
+
+
+ printf("\\end{document}\n");
+
+ exit(0);
+
+}
+
+ void fgetsa(char *foo, int size, FILE *infile) {
+ int i, oe;
+ fgets(tmp, size, infile);
+ tmp[strlen(tmp)-1] = '\0';
+ strcpy(foo, "\0");
+ oe = 0;
+ for (i=0; i<strlen(tmp); i++) {
+ if (tmp[i]=='$' || tmp[i] == '_' || tmp[i] =='&' || tmp[i] == '#') strcat(foo, "\\");
+ if (tmp[i] == '"') {
+ if (oe == 0) {
+ oe = 1;
+ strcat(foo, "``");
+ }
+ else {
+ oe = 0;
+ strcat(foo, "''");
+ }
+ }
+ else strncat(foo, &tmp[i], 1);
+ }
+ }
+
+
+
+
+
+
diff --git a/Master/texmf-dist/source/latex/cwpuzzle/Makefile b/Master/texmf-dist/source/latex/cwpuzzle/Makefile
new file mode 100644
index 00000000000..eafb1b58dde
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cwpuzzle/Makefile
@@ -0,0 +1,33 @@
+#******************************************************************************
+#* $Id: Makefile,v 1.1 1996/11/25 21:20:35 gerd Exp gerd $
+#******************************************************************************
+#* Author: Gerd Neugebauer
+#*=============================================================================
+
+INSTALLDIR = /usr/local/lib/texmf/tex/latex/cwpuzzle
+
+FILES = cwpuzzle.dtx \
+ cwpuzzle.ins \
+ Makefile
+
+LATEX = latex
+MAKEINDEX = makeindex
+RM = rm -f
+INSTALL = install
+MKDIR = mkdir
+
+#*=============================================================================
+
+all: cwpuzzle.sty cwpuzzle.dvi
+
+cwpuzzle.sty: cwpuzzle.dtx cwpuzzle.ins
+ $(RM) cwpuzzle.cls cwpuzzle.sty
+ $(LATEX) cwpuzzle.ins
+
+cwpuzzle.dvi: cwpuzzle.dtx cwpuzzle.sty
+ $(LATEX) cwpuzzle.dtx
+ $(LATEX) cwpuzzle.dtx
+ $(MAKEINDEX) -s gind.ist cwpuzzle
+ $(MAKEINDEX) -s gglo.ist -o cwpuzzle.gls cwpuzzle.glo
+ $(LATEX) cwpuzzle.dtx
+
diff --git a/Master/texmf-dist/source/latex/cwpuzzle/README b/Master/texmf-dist/source/latex/cwpuzzle/README
new file mode 100644
index 00000000000..9ae8eb43c77
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cwpuzzle/README
@@ -0,0 +1,73 @@
+
+ cwpuzzle.sty
+ -
+ a LaTeX package for typesetting crossword puzzles
+
+ Gerd Neugebauer
+
+
+Since I know only of one additional package for this purpose on CTAN
+-- named crosswrd.sty -- I will compare it against this package to
+show the advantages and disadvantages of both packages.
+
+I have developed cwpuzzle.sty because I needed to typeset a puzzle
+which required more features than those provided by crosswrd. The
+feature I was missing was the inclusion of rectangular regions in the
+puzzles containing ads or other texts not directly related to the
+characters to be filled in.
+
+I have generalized this requirement by allowing arbitrary rectangles
+to be left free. Thus it is possible to typeset puzzles which have no
+rectangular border (See the documentation for examples).
+
+Another idea was to have different types of puzzles generated from the
+same source:
+
+- The classical puzzle contains numbers for the words and clues for
+ the words to be filled in.
+
+- The numbered puzzle contains numbers in each cell where identical
+ numbers represent identical letters. The goal is to find out which
+ number corresponds to which letter.
+
+- The fill-in type of puzzle consists of a grid and a list of words.
+ The goal is to place all words in the grid.
+
+crosswrd supports the first type of puzzle only. cwpuzzle supports all
+of them.
+
+The input for both packages is completely different. crosswrd assumes
+that a user uses this package to develop a puzzle. Thus it is tailored
+towards a human user. It checks for consistency and requires
+non-redundant input. (As a unpleasant side effect fragile macros used
+in clues have to be protected)
+
+cwpuzzle needs some redundancy in the input for the sake of
+flexibility. But it seems quite natural to specify the frame of the
+puzzle and the clues separately. Especially for those types where no
+clues are needed at all.
+
+cwpuzzle currently assumes that words are terminated by a black block
+(or the border of the puzzle). crosswrd also supports also the variant
+where words are terminated by a thicker border. This might also be
+incorporated into a future release of cwpuzzle.
+
+In cwpuzzle it is also possible to specify whether the crossword
+puzzle or it's solution should be produced (from the same
+source). Thus it is possible to include the puzzle in one issue of a
+journal and the solution into another, or to typeset the solution
+several pages after the puzzle.
+
+cwpuzzle provides a larger number of options and hooks which can be
+used to customize the result. E.g it is possible to modify the size of
+the boxes or the fonts used as well as the appearance of graphical
+elements like the black blocks.
+
+
+cwpuzzle is located in the CTAN directory
+
+ tex-archive/macros/latex/other/gene/crossword
+
+run tex on cwpuzzle.ins to produce the package and latex on
+cwpuzzle.dtx to get the documentation (or the Makefile to do both).
+
diff --git a/Master/texmf-dist/source/latex/cwpuzzle/cwpuzzle.dtx b/Master/texmf-dist/source/latex/cwpuzzle/cwpuzzle.dtx
new file mode 100644
index 00000000000..6148bba617f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cwpuzzle/cwpuzzle.dtx
@@ -0,0 +1,1077 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% $Id: cwpuzzle.dtx,v 1.4 1996/11/25 21:20:35 gerd Exp gerd $
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\DTK@RCS$#1: #2 #3${#2}
+\def\filename{cwpuzzle.dtx}
+\xdef\fileversion{\DTK@RCS$Revision: 1.4 $}
+\xdef\filedate{\DTK@RCS$Date: 1996/11/25 21:20:35 $}
+\let\docversion=\fileversion
+\let\docdate=\filedate
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\iffalse
+\typeout{%
+%% Purpose:
+ Package: cwpuzzle \filedate\space\fileversion\space
+ for typesetting crossword puzzles.
+}%
+%%
+%% Documentation:
+%% The documentation can be generated from the original file
+%% cwpuzzle.dtx with the doc style/package. LaTeX the file
+%% cwpuzzle.dtx to get the full documentation in dvi format.
+%%
+%%
+%% Author: Gerd Neugebauer
+%% Mainzer Str. 8
+%% 56321 Rhens
+%% Mail: gerd@informatik.uni-koblenz.de
+%%
+%% Copyright (C) 1996 Gerd Neugebauer
+%%
+%% cwpuzzle.dtx is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY. No author or distributor accepts
+%% responsibility to anyone for the consequences of using it or for
+%% whether it serves any particular purpose or works at all, unless
+%% he says so in writing.
+%%
+%% Everyone is granted permission to copy, modify and redistribute
+%% dtk.dtx, provided this copyright notice is preserved and any
+%% modifications are indicated.
+%%
+%%
+%% This style is still under development and may be replaced with a
+%% new version which provides an enhanced functionality.
+%%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{cwpuzzle}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\setcounter{IndexColumns}2
+\begin{document}
+ \DocInput{cwpuzzle.dtx}
+ \newpage
+ \PrintChanges
+\end{document}
+%</driver>
+%\fi
+%
+% \title{A \LaTeX\ Package for Typesetting\\ Crossword
+% Puzzles\thanks{This file documents \filename\ version
+% \fileversion\ as of \filedate.}}
+% \author{Gerd Neugebauer\\
+% Mainzer Stra\ss{}e 8\\
+% 56321 Rhens (Germany)\\
+% Net: {\tt gerd@informatik.uni-koblenz.de}}
+%
+% \date{{\footnotesize Documentation date: \docdate}}
+%
+% \maketitle
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \DoNotIndex{\ ,\",\',\.,\[,\\,\],\^,\`,\~,\@,\@dottedtocline}
+% \DoNotIndex{\@empty,\@nameuse,\advance,\begin,\begingroup}
+% \DoNotIndex{\catcode,\def,\else,\end,\endgroup,\fi,\filedate}
+% \DoNotIndex{\footnotesize,\framebox,\gdef,\hfill,\if,\ifx,\let,\makebox}
+% \DoNotIndex{\mbox,\newcommand,\newcount,\newdimen,\newenvironment}
+% \DoNotIndex{\newif,\noindent,\normalsize,\null,\par,\put}
+% \DoNotIndex{\relax,\rm,\rule,\scriptsize,\sf,\textsf,\textwidth}
+% \DoNotIndex{\the,\unitlength,\uppercase,\xdef,\ProvidesPackage}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \changes{1.3}{1996/10/28}{First public release.}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \CheckSum{284}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \MakeShortVerb{|}
+%
+% \begin{abstract}
+% cpwuzzle.dtx provides a package to typeset crossword
+% puzzles. There is an graphical user interface written in
+% Tcl/Tk which does most of the work in creating a file which is
+% conform with this style. Thus it is clear that the macros
+% provided are not tailored towards a human user.
+%
+% The package can be used to produce several types of puzzles like
+% the classical crossword puzzle, a number puzzle, and fill-in
+% puzzles.
+% \end{abstract}
+%
+% \tableofcontents
+% \newpage
+%
+% \section{About Crossword Puzzles}
+%
+% Crossword puzzles are can be a an amusing but also a challenging
+% hobby. Unfortunately at the time of this writing I am not aware
+% of any good package to typeset crossword puzzles with \LaTeX.
+% Thus I decided to make one which at least fits my needs.
+%
+% There are several types of crossword puzzles aroung. This
+% package can only be used to typeset several of them. The basic
+% assumption in this package is that puzzles are rectangular
+% arragnements of boxes. Some of these boxes are black and others
+% are prepared to take single letters.
+% Each word in the grid is enclosed in black boxes or the outside.
+%
+% Optionally there may be rectangular regions left blank inside the
+% puzzle. They can be used to place ads or other informative texts
+% inside the puzzle.
+%
+% \subsection{Classical Crossword Puzzles}\label{sec:classical}
+%
+% \PuzzleUnsolved
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[1]E|X |* |.
+% |[2]A|[3]S|T |* |[4]T|.
+% |* |[5]P|A |R |T |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \begin{PuzzleClues}{Across}%
+% \Clue{1}{EX}{unit of measure}%
+% \Clue{2}{AST}{\(\ast\)}%
+% \Clue{5}{PART}{sectioning unit}%
+% \end{PuzzleClues}%
+% \begin{PuzzleClues}{Down}%
+% \Clue{1}{ETA}{\(\eta\)}%
+% \Clue{3}{SP}{unit of measure}%
+% \Clue{4}{TT}{nonproportional font}%
+% \end{PuzzleClues}%
+% \end{minipage}\medskip
+%
+% The ``classical'' type of a crossword puzzle words are marked
+% with numbers and each word is acomapanied with a clue which
+% should help (or confuse) the reader. Those clues are listed after
+% the frame of the puzzle.
+%
+% \subsection{Number Crossword Puzzles}\label{sec:numbered}
+%
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[6]E|[1]X|* |.
+% |[5]A|[2]S|[7]T|* |[7]T|.
+% |* |[4]P|[5]A|[3]R|[7]T|.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \PuzzleLetters{AEPRSTX}\medskip\par
+% \PuzzleNumbers{XSRPAET}%
+% \end{minipage}\medskip
+%
+% The ``number puzzle'' variant contains only numbers instead of
+% letters. Different numbers denote different letters. There are no
+% clues. The reader is assumed to find a complete list of letters
+% by filling appropriate words into the grid. Sometimes a word is
+% already entered into the grid to ease the start.
+%
+% \subsection{Fill-In Crossword Puzzles}\label{sec:fill-in}
+%
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |E |X |* |.
+% |A |S |T |* |T |.
+% |* |P |A |R |T |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \begin{PuzzleWords}{2}
+% \Word{EX}%
+% \Word{SP}%
+% \Word{TT}%
+% \end{PuzzleWords}%
+% \begin{PuzzleWords}{3}
+% \Word{AST}%
+% \Word{ETA}%
+% \end{PuzzleWords}%
+% \begin{PuzzleWords}{4}
+% \Word{PART}%
+% \end{PuzzleWords}%
+% \end{minipage}\medskip
+%
+% The ``fill-in puzzle'' variant consists of a frame containing
+% only black and white boxes. Additionally a list of words is given
+% which have to be put into the frame until none is left and the
+% frame is completed.
+%
+% \subsection{Solutions}
+%
+% \PuzzleSolution
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[1]E|X |* |.
+% |[2]A|[3]S|T |* |[4]T|.
+% |* |[5]P|A |R |T |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \end{minipage}\medskip
+%
+% Often it is not only desirable to typeset the unsolved crossword
+% puzzle but also the solution. This means that all the letters
+% have to be filled in. This should be possible with the same
+% source as the questions to avoid typos or redundancies leading to
+% additional work.
+%
+% Several variants of solutions come to mind. Primarily the
+% solution should show the letters and suppress any clues. One
+% major distinction is also wether or not the numbers of the words
+% should be shown in the solution as well.\medskip
+%
+% \noindent%
+% \PuzzleSolution[true]%
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[1]E|X |* |.
+% |[2]A|[3]S|T |* |[4]T|.
+% |* |[5]P|A |R |T |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \end{minipage}%
+%
+% Finally there are the lists of letters in numbered puzzles. In
+% the solution they will show the letters in them as well.\medskip
+%
+% \noindent%
+% \PuzzleSolution[false]%
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[6]E|[1]X|* |.
+% |[5]A|[2]S|[7]T|* |[7]T|.
+% |* |[4]P|[5]A|[3]R|[7]T|.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \PuzzleLetters{AEPRSTX}\medskip\par
+% \PuzzleNumbers{XSRPAET}%
+% \end{minipage}
+%
+%
+% \section{Input of Crossword Puzzles}
+%
+% The basic idea behind this package is that a crossword puzzle is
+% specified in a seperate file. The actual appearance of the puzzle
+% is controlled by several options. Thus it should be possible to
+% produce the unsolved and the solved puzzle from the same
+% source. Before we describe the various options we will have a
+% look at the basic environments and macros used to specified a
+% crossword puzzle.
+%
+% \DescribeEnv{Puzzle}%
+% This package provides the environment |Puzzle| which typesets the
+% frame of a crossword puzzle. This environment takes two
+% arguments. These arguments are the number of columns and the
+% number of the rows of the puzzle. This means that essentially
+% only rectangular puzzles can be typeset.
+%
+% The example from section~\ref{sec:classical} has been entered as
+% follows:
+% \begin{verbatim}
+% \begin{Puzzle}{5}{3}%
+% |* |* |[1]E|X |* |.
+% |[2]A|[3]S|T |* |[4]T|.
+% |* |[5]P|A |R |T |.
+% \end{Puzzle}
+% \end{verbatim}
+% In this example we can see that inside the |Puzzle| environment
+% there is one special character. This is the bar \verb/|/. This
+% bar is an activge character in \TeX. Thus you can think of it
+% like a macro.
+%
+% The \verb/|/ macro takes two arguments. The first argument is
+% optional, i.e. enclosed in brackets if present. This optional
+% argument denotes the number for numbered boxes.
+%
+% The second argument is either empty |{}| or it consists of a
+% single character. This argument describes the action to be
+% performed.
+%
+% \begin{itemize}
+% \item If this argument is a letter then it is simply shown
+% in the solution and suppressed in the unsolved crossword puzzle.
+%
+% \item If this argument is an asterisk |*| then a black box is
+% produced.
+%
+% \item If this argument is a dot |.| then this marks the end of
+% the current row. The next box is typeset at the beginning of the
+% following row.
+%
+% \item If this argument is empty |{}| then a white box is
+% typeset. This box does not contain a letter, nor does it have a
+% frame. This macro can be used to leave room for larger boxed with
+% ads. Alternatively this can be used to disable certain boxes to
+% make a non-rectangular crossword puzzle.
+% \end{itemize}
+%
+% \begin{verbatim}
+% \begin{Puzzle}{5}{5}
+% |{} |{} |[1]S|.
+% |{} |[2]M|I |[3]D|.
+% |[4]T|I |M |E |S |.
+% |{} |[5]N|E |G |.
+% |{} |{} |Q |.
+% \end{Puzzle}
+% \end{verbatim}
+% \PuzzleUnsolved
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{5}%
+% |{} |{} |[1]S|.
+% |{} |[2]M|I |[3]D|.
+% |[4]T|I |M |E |S |.
+% |{} |[5]N|E |G |.
+% |{} |{} |Q |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \begin{PuzzleClues}{\textbf{Across: }}%
+% \Clue{2}{MID}{\(\mid\)}%
+% \Clue{4}{TIMES}{\(\times\)}%
+% \Clue{5}{NEG}{\(\neg\)}%
+% \end{PuzzleClues}%
+% \begin{PuzzleClues}{\textbf{Down: }}%
+% \Clue{1}{SIMEQ}{\(\simeq\)}%
+% \Clue{2}{MIN}{loglike function}%
+% \Clue{3}{DEG}{loglike function}%
+% \end{PuzzleClues}%
+% \end{minipage}%
+%
+% Note that whitespace is ignored after the arguments but not
+% between the bar and the arguments.
+%
+% \DescribeMacro{\Frame}
+% The macro |\Frame| can be used to typeset ads or other text into
+% larger boxes inside the frame of the crossword puzzle. For this
+% purpose five arguments are required. The first two arguments are
+% used to specify the leower left corner of the frame. The lower
+% left corner has the coordinates 0,0 and the numbers increase
+% upwards and to the right.
+%
+% The third argument is the width of the frame and the fourth
+% argument is the height of the frame measured in number of boxes.
+% Finally, the fifth argument contains the text to be typeset. Per
+% default it is typeset in a minipage of the appropriate width
+% centered horizontally and vertically.
+%
+% \begin{verbatim}
+% \begin{Puzzle}{8}{6}
+% \Frame{2}{2}{4}{2}{\sf Crossword\\Puzzle}
+% |[1]E|* |[2]N |U |L |[3]L |* |[4]V|.
+% |[5]T|[6]R|I |A |N |G |[7]L|E |.
+% |A |U |{} |{} |{} |{} |[8]C|C |.
+% |* |L |{} |{} |{} |{} |E |* |.
+% |[9]B|E |T |[10]A|* |[11]L|I |M |.
+% |F |* |[12]L|A |B |E |L |* |.
+% \end{Puzzle}
+% \end{verbatim}
+%
+% \PuzzleUnsolved\noindent
+% \begin{minipage}{.5\textwidth}\PuzzleUnitlength=18pt
+% \begin{Puzzle}{8}{6}%
+% \Frame{2}{2}{4}{2}{\sf Crossword\\Puzzle}%
+% |[1]E|* |[2]N|U|L|[3]L|* |[4]V|.
+% |[5]T|[6]R|I|A|N|G|[7]L|E|.
+% |A|U|{}|{}|{}|{}|[8]C|C|.
+% |* |L|{}|{}|{}|{}|E|* |.
+% |[9]B|E|T|[10]A|* |[11]L|I|M|.
+% |F|* |[12]L|A|B|E|L|* |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.47\textwidth}
+% \begin{PuzzleClues}{\textbf{Across: }}%
+% \Clue{2}{NULL}{empty}%
+% \Clue{5}{TRIANGLE}{\(\triangle\)}%
+% \Clue{8}{CC}{carbon copy (letter.sty)}%
+% \Clue{9}{BETA}{\(\beta\)}%
+% \Clue{11}{LIM}{limes}%
+% \Clue{12}{LABEL}{mark it}%
+% \end{PuzzleClues}%
+% \begin{PuzzleClues}{\textbf{Down: }}%
+% \Clue{1}{ETA}{\(\eta\)}%
+% \Clue{2}{NI}{\(\ni\)}%
+% \Clue{3}{LG}{logarithm}%
+% \Clue{4}{VEC}{\(\vec{}\)}%
+% \Clue{6}{RULE}{black rectangle}%
+% \Clue{7}{LCEIL}{\(\lceil\)}%
+% \Clue{9}{BF}{bold face}%
+% \Clue{10}{AA}{\AA}%
+% \Clue{11}{LE}{\(\le\)}%
+% \end{PuzzleClues}%
+% \end{minipage}%
+%
+%
+% \DescribeEnv{PuzzleClues}
+% The clues in the classical crossword puzzle are typeset with the
+% use of the environment |PuzzleClues|. This environment takes one
+% argument which is typeset before the clues. The environment takes
+% roughly the half of the textwidth and make a minipage with this
+% width. Thus two invocations of this environment are typeset side
+% by side.
+%
+% Alternatively if the solution is typeset then the environment
+% |PuzzleClues| has no effect.
+%
+% \begin{verbatim}
+% \begin{PuzzleClues}{\textbf{Across}}%
+% \Clue{1}{EX}{unit of measure}%
+% \Clue{2}{AST}{\(\ast\)}%
+% \Clue{5}{PART}{sectioning unit}%
+% \end{PuzzleClues}%
+% \begin{PuzzleClues}{\textbf{Down}}%
+% \Clue{1}{ETA}{\(\eta\)}%
+% \Clue{3}{SP}{unit of measure}%
+% \Clue{4}{TT}{nonproportional font}%
+% \end{PuzzleClues}%
+% \end{verbatim}
+%
+% \DescribeMacro{Clue}
+% The environment |PuzzleClues| defines one local macro. This macro
+% is named |\Clue| and takes three arguments. The first argument is
+% the number of the word. This should correspond to the number in
+% the puzzle frame. The second argument is the word itself.
+% Currently this not used at all. Finally the third argument is the
+% clue for the word.
+%
+% If the unsolved puzzle is typeset then the first and the third
+% argument are used. Otherwise all arguments are silently absorbed.
+%
+% \DescribeMacro{\PuzzleLetters}
+% The macro |\PuzzleLetters| can be used to typeset the list of
+% used letters in numbered crossword puzzles. It has one argument
+% which are the used letters (preferably in alphabethical order.
+%
+% \DescribeMacro{\PuzzleNumbers}
+% The macro |\PuzzleNumbers| can be used to generate a numbered
+% list of boxes for the numbered crossword puzzles. The user is
+% supposed to collect the found letters here.
+%
+% \DescribeEnv{PuzzleWords}
+% The environment |PuzzleWords| can be sued to typeset the list of
+% words for a fill-in puzzle. It takes one argument. This is the
+% length of the words listed. For each length there should be an
+% invocation of this environment. The words in this environment are
+% supposed to be ordered alphabetically.
+%
+% \DescribeMacro{\Word}
+% The macro |\Word| is defined inside the environment
+% |PuzzleWords|. It takes one argument which is the word itself.
+%
+% \begin{verbatim}
+% \begin{PuzzleWords}{2}
+% \Word{EX}%
+% \Word{SP}%
+% \Word{TT}%
+% \end{PuzzleWords}%
+% \begin{PuzzleWords}{3}
+% \Word{AST}%
+% \Word{ETA}%
+% \end{PuzzleWords}%
+% \begin{PuzzleWords}{4}
+% \Word{PART}%
+% \end{PuzzleWords}%
+% \end{verbatim}
+%
+%
+% \section{Parameters and Options}
+%
+% \DescribeMacro{\PuzzleUnitlength}
+% The length |\PuzzleUnitlength| deternimes the width and height of
+% each single box in the frame of a crossword puzzle. The default
+% value is |20pt|.
+%
+% \DescribeMacro{\PuzzleBlackBox}
+% The macro |\PuzzleBlackBox| contains the commands to produce the
+% black boxes. It has to produce at most of width and height of
+% |\PuzzleUnitlength|. Per default it just produces a black
+% rectangle of this size.
+%
+% The following list shows some variants which can be achieved by
+% redefining the macro |\PuzzleBlackBox|.\medskip
+%
+% \noindent
+% \unitlength=\PuzzleUnitlength
+% \framebox(1,1){\rule{.75\PuzzleUnitlength}{.75\PuzzleUnitlength}}
+% \hfill
+% \begin{minipage}{.9\textwidth}
+% \begin{verbatim}
+% \renewcommand{\PuzzleBlackBox}{\rule{.75\PuzzleUnitlength}%
+% {.75\PuzzleUnitlength}}
+% \end{verbatim}
+% \end{minipage}
+%
+% \noindent
+% \framebox(1,1){\framebox(.75,.75){\framebox(.5,.5){}}}
+% \hfill
+% \begin{minipage}{.9\textwidth}
+% \begin{verbatim}
+% \renewcommand{\PuzzleBlackBox}{\framebox(.75,.75){%
+% \framebox(.5,.5){}}}
+% \end{verbatim}
+% \end{minipage}
+%
+% Additional effects can be achieved by using shades of gray (with
+% the |graphics| package).
+%
+% \DescribeMacro{\PuzzleFont}
+% The macro |\PuzzleFont| contains the font changing
+% command issued before the frame of the crosword puzzle.
+%
+% \DescribeMacro{\PuzzleNumberFont}
+% The macro |\PuzzleNumberFont| contains the font changing
+% command issued before a number in the frame of the crosword
+% puzzle is typeset.
+%
+% \DescribeMacro{\PuzzleClueFont}
+% The macro |\PuzzleClueFont| contains the font changing
+% command issued before the clues are typeset.
+%
+% \DescribeMacro{\PuzzleWordsText}
+% The macro |\PuzzleWordsText| contains the text which is typeset
+% at the beginning of the environment |PuzzleWords|. It has one
+% argument which contains the length of the words listed.
+%
+% \DescribeMacro{\PuzzleLettersText}
+% The macro |\PuzzleLettersText| contains the text which is typeset
+% at the beginning of the macro |PuzzleLetters|.
+%
+% \DescribeMacro{\PuzzleSolution}
+% The macro |\PuzzleSolution| arranges everything that the
+% following puzzles are typeset in the ``solution'' mode, i.e. the
+% letters are shown and the clues are suppressed.
+%
+% This macros has one optional argument which has to be |true| or
+% |false|. This argument determines whether or not the numbers
+% should also be shown in the solution. The default is |false|
+% which means that the numbers are suppressed in the solution.
+%
+% \DescribeMacro{\PuzzleUnsolved}
+% The macro |\PuzzleUnsolved| arranges everything that the
+% following puzzles are typeset in the ``unsolved'' mode, i.e. the
+% letters are suppressed and the clues are shown.
+%
+% \DescribeMacro{\PuzzleHook}
+% The macro |\PuzzleHook| is called at the end of the |Puzzle|
+% environment. It can be used to place additional graphical
+% elements in the puzzle frame.
+%
+% The following example shows a crossword puzzle which we have seen
+% before and the definition for the |\PuzzleHook|.\medskip
+%
+% \PuzzleUnsolved
+% \begin{minipage}{.35\textwidth}%
+% \newcommand\PuzzleHook{%
+% \put(0,2){\line(1,-1){2}}
+% \put(0,3){\line(1,1){2}}
+% \put(5,2){\line(-1,-1){2}}
+% \put(5,3){\line(-1,1){2}}
+% }
+% \begin{Puzzle}{5}{5}%
+% |{} |{} |[1]S|.
+% |{} |[2]M|I |[3]D|.
+% |[4]T|I |M |E |S |.
+% |{} |[5]N|E |G |.
+% |{} |{} |Q |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \begin{verbatim}
+% \newcommand\PuzzleHook{
+% \put(0,2){\line(1,-1){2}}
+% \put(0,3){\line(1,1){2}}
+% \put(5,2){\line(-1,-1){2}}
+% \put(5,3){\line(-1,1){2}}
+% }
+% \end{verbatim}
+% \end{minipage}
+%
+%
+% \section{The Related Program}
+%
+% There is a related program written in Tcl/Tk. This program can be
+% used to manually construct crosswrod puzzles and save them in a
+% format suitable for this package. Alternativly it can also store
+% the crossword puzzle prepared for |crosswrd.sty|.
+%
+% Other features include the creation of a proper frame and filling
+% with words.
+%
+% Right now I have not prepared a distribution of this program yet
+% since this program requires dictionaries which I can not
+% distribute legally.
+%
+% The examples in this documentation have been computed with the
+% help of the |cwp| program.
+%
+%
+% \section{Further Plans}
+%
+% Maybe I will add a mode for further variants of crossword puzzles
+% sometimes.
+%
+%
+%
+% \StopEventually{}
+% \newpage
+%
+%
+% \section{The Implementation}
+%
+% The crossword puzzle is basically implemented with the \LaTeX{}
+% picture environment. This gives us enough flexibility and
+% provides an high enough abraction such that we do not have to
+% fiddle around with to many low level details.
+%
+% The natural unit in a crossword puzzle is a box which is empty
+% or black. Thus the |unitlength| is set to the width (and height)
+% of such a box.
+%
+%
+% \subsection{Basic Definitions and Parameters}
+%
+% First we identify this package.
+%
+% \begin{macrocode}
+\ProvidesPackage{cwpuzzle}[\filedate gene]
+% \end{macrocode}
+%
+% The dimen register |\PuzzleUnitlength| stores the height and
+% width of a box of the puzzle. The default is |20pt| which is
+% also shown in this documentation.
+% \begin{macrocode}
+\newdimen\PuzzleUnitlength
+\PuzzleUnitlength=20pt
+% \end{macrocode}
+%
+% \begin{macro}{\PuzzleClueFont}
+%
+% The macro |\PuzzleClueFont| contains font changings
+% commands issued before the clues are typeset.
+% \begin{macrocode}
+\newcommand\PuzzleClueFont{\footnotesize}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleFont}
+%
+% The macro |\PuzzleFont| contains font changings
+% commands issued before the puzzle is typeset.
+% \begin{macrocode}
+\newcommand\PuzzleFont{\rm\normalsize}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleNumberFont}
+% The macro |\PuzzleNumberFont| contains font changings
+% commands issued before the numbers in a puzzle are typeset.
+% \begin{macrocode}
+\newcommand\PuzzleNumberFont{\sf\scriptsize}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleHook}
+% Puzzles are typeset with the \LaTeX{} picture environment. At the
+% end of this environment the macro |\PuzzleHook| is
+% called. The package prodised an empty default. Users may want to
+% use this place to typeset additional elements on top of the
+% puzzle.
+%
+% The puzzle uses a |\unitlength| of |\PuzzleUnitlength|. Thus it
+% is rather easy to adress the boxes in the puzzle.
+%
+% \begin{macrocode}
+\let\PuzzleHook=\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The Frame of the Crossword Puzzle}
+%
+% To describe the coordinates where the next box should be typeset
+% we need two counters for the coordinates. These counters are now
+% allocated (even though we could use temporary counters from
+% \LaTeX).
+% \begin{macrocode}
+\newcount\Puzzle@X
+\newcount\Puzzle@Y
+% \end{macrocode}
+%
+% \begin{macrocode}
+\begingroup
+\catcode`\|=13
+\gdef\Puzzle@@solution{
+ \let|=\Puzzle@Box@@solution
+ \let\Frame=\Puzzle@Frame@@solution
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\gdef\Puzzle@@normal{
+ \let|=\Puzzle@Box@@normal
+ \let\Frame=\Puzzle@Frame@@normal
+}
+\endgroup
+% \end{macrocode}
+%
+% \begin{environment}{Puzzle}
+% The environment |Puzzle| typesets the frame of a crossword
+% puzzle. It is implemented utilizing a |picture| environment. The
+% unilength is set to the |\PuzzleUnitlength|. Thus the navigation
+% is faily easy. The basic unit is width and height of a single
+% box.
+%
+% The macros which are local to the environment are activated. Thus
+% we avoid collisions with other packages where the same macro names
+% might be used.
+%
+% Finally the counter which contain the x and the y coordinate have
+% to be initialized.
+%
+% The last action in the |picture| environment is the expansion of
+% the macro |\PuzzleHook|. This can be used to include additional
+% material in the |picture| environment. Primarily I have use this
+% to include the ads. But now there is the macro |\Frame| for this
+% purpose.
+% \begin{macrocode}
+\newenvironment{Puzzle}[2]{\par\noindent\mbox{}\hfill
+ \catcode`\|=13
+ \@nameuse{Puzzle@@\Puzzle@TYPE}%
+ \unitlength=\PuzzleUnitlength
+ \Puzzle@Y=#2
+ \begin{picture}(#1,#2)
+ \Puzzle@Box@@normal.
+}{%
+ \PuzzleHook
+ \end{picture}\hfill\null\par\noindent
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\Puzzle@Frame@@normal}
+% The macro |Puzzle@Frame| is used to place additional
+% rectangular regions into the puzzle frame. This frame can contain
+% arbitrary text which is typeset in a centered environment.
+%
+% This macro takes five arguments. The first two arguments are the
+% coordinates of the upper left corner of the frame. The
+% coordinates are logical coordinates starting from the lower left
+% corner of the puzzle. The next two arguments are the width and the
+% height of the frame given in the number of boxes covered. Finally
+% the fifth argument contains the text which should apear in this
+% frame.
+% \begin{macrocode}
+\newcommand\Puzzle@Frame@@normal[5]{\put(#1,#2){\framebox(#3,#4){%
+ \begin{minipage}{#3\unitlength}\begin{center} #5
+ \end{center}\end{minipage}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Frame@@solution}
+% For the solution the framed ads are simply ignored.
+% \begin{macrocode}
+\newcommand\Puzzle@Frame@@solution[5]{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleBlackBox}
+% The macro |\PuzzleBlackBox| is called to typeset the black boxes.
+% It should produce a box of at most width and height of
+% |\PuzzleUnitlength|.
+% \begin{macrocode}
+\newcommand\PuzzleBlackBox{\rule{\PuzzleUnitlength}{\PuzzleUnitlength}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Box@@normal}
+% The macro |\Puzzle@Box@@normal| performs all tasks when a box
+% should be typeset in ``normal'' mode. The arguments are evaluated
+% and the appropriate tpye of box typeset or other actions performed.
+% \changes{1.4}{1996/11/25}{Minor bugfix. Using ifx instead of if.}
+% \begin{macrocode}
+\newcommand\Puzzle@Box@@normal[2][]{%
+ \def\Puzzle@tmp{#2}%
+ \if\Puzzle@tmp.
+ \Puzzle@X=0\relax \advance\Puzzle@Y-1
+ \else
+ \ifx\@empty\Puzzle@tmp
+ \else
+ \if\Puzzle@tmp*
+ \put(\Puzzle@X,\Puzzle@Y){\framebox(1,1){\PuzzleBlackBox}}
+ \else
+ \put(\Puzzle@X,\Puzzle@Y){\framebox(1,1){}}
+ \fi
+ \fi
+ \def\Puzzle@tmp{#1}%
+ \ifx\@empty\Puzzle@tmp\else
+ \put(\Puzzle@X,\Puzzle@Y){%
+ \makebox(1,.95)[tl]{\PuzzleNumberFont\,#1}}%
+ \fi
+ \advance\Puzzle@X 1
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Box@@solution}
+% The macro |\Puzzle@Box@@solution| performs all tasks when a box
+% should be typeset in ``solution'' mode. The arguments are evaluated
+% and the appropriate tpye of box typeset or other actions performed.
+% \changes{1.4}{1996/11/25}{Minor bugfix. Using ifx instead of if.}
+% \begin{macrocode}
+\newcommand\Puzzle@Box@@solution[2][]{%
+ \def\Puzzle@tmp{#2}%
+ \if\Puzzle@tmp.
+ \Puzzle@X=0\relax \advance\Puzzle@Y-1
+ \else
+ \ifx\Puzzle@tmp\@empty
+ \else\if\Puzzle@tmp*
+ \put(\Puzzle@X,\Puzzle@Y){\framebox(1,1){\PuzzleBlackBox}}
+ \else
+ \put(\Puzzle@X,\Puzzle@Y){\framebox(1,1){\uppercase{#2}}}%
+ \fi
+ \fi
+ \def\Puzzle@tmp{#1}%
+ \ifx\Puzzle@tmp\@empty\else
+ \ifPuzzle@SolutionNumbered
+ \put(\Puzzle@X,\Puzzle@Y){%
+ \makebox(1,.95)[tl]{\PuzzleNumberFont\,#1}}%
+ \fi
+ \fi
+ \advance\Puzzle@X 1
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Clues}
+%
+% \begin{macro}{\Puzzle@Clue@@normal}
+% The first and the third argument are shown as clue. This macro is
+% used for unsolved puzzles.
+% \begin{macrocode}
+\newcommand\Puzzle@Clue@@normal[3]{\textsf{#1} #3 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Clue@@solution}
+% In solutions clues are simply suppressed. Thus all three
+% arguments are discarted.
+% \begin{macrocode}
+\newcommand\Puzzle@Clue@@solution[3]{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{Puzzle@Clues@@normal}
+% The environment |Puzzle@Clues@@normal| is mapped to |PuzzleClues|
+% in ``normal'' mode. It typesets its contents in a minipage of
+% appropriate half textwidth.
+% \begin{macrocode}
+\newenvironment{Puzzle@Clues@@normal}[1]{%
+ \null\hfill
+ \let\Clue\Puzzle@Clue@@normal
+ \begin{minipage}[t]{.45\textwidth}%
+ \PuzzleClueFont{#1}%
+}{\end{minipage}\hfill\null }
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{Puzzle@Clues@@solution}
+% The environment |Puzzle@Clues@@solution| is mapped to |PuzzleClues|
+% in ``solution'' mode. It just suppressed any output.
+% \begin{macrocode}
+\newenvironment{Puzzle@Clues@@solution}[1]{%
+ \let\Clue\Puzzle@Clue@@solution
+}{}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\PuzzleWordsText}
+% The macro |\PuzzleWordsText| is the text typeset at the beginning
+% of the environment |PuzzleWords|. It takes one argument which is
+% the length of the words listed.
+% \begin{macrocode}
+\newcommand\PuzzleWordsText[1]{Words of length #1: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{Puzzle@Words@@normal}
+% The environment |Puzzle@Words@@normal| will be mapped to the
+% environment |PuzzleWords| in ``normal'' mode. It just arranges
+% that words are typeset after the |\PuzzleWordsText| has shown the
+% length of the words. Finally a new paragraph is started.
+% \begin{macrocode}
+\newenvironment{Puzzle@Words@@normal}[1]{%
+ \PuzzleWordsText{#1}%
+ \let\Word\relax
+}{\par}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{Puzzle@Words@@solution}
+% The environment |Puzzle@Words@@solution| will be mapped to the
+% environment |PuzzleWords| in ``solution'' mode. It arranges
+% things that the contents is silently ignored.
+% \begin{macrocode}
+\newenvironment{Puzzle@Words@@solution}[1]{%
+ \newcommand\Word[1]{}%
+}{}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Numbers}
+%
+% \begin{macro}{\PuzzleNumbers}
+% The macro |\PuzzleNumbers| will produce a list of boxes with
+% numbers for letters. It is intended for numbered crossword puzzles.
+% \begin{macrocode}
+\newcommand\PuzzleNumbers[1]{\begingroup
+ \@nameuse{Puzzle@@\Puzzle@TYPE}%
+ \Puzzle@Y=0
+ \Puzzle@X=1
+ \unitlength=\PuzzleUnitlength
+ \Puzzle@Numbers#1.\endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Numbers}
+% The macro |\Puzzle@Numbers| loops through the arguments until it
+% finds a dot. For each argument it produces a box, either with the
+% numbers or with the letters or both, depending on the current
+% settings.
+%
+% The loop is implemented via recursion. The box is tyepset by the
+% \verb/|/ macro which takes care of the current settings. For this
+% purpose this characterhas to be made active temporarily.
+% \begin{macrocode}
+\begingroup
+\catcode`\|=13
+\gdef\Puzzle@Numbers#1{%
+ \if#1.
+ \let\next\relax
+ \else
+ \begin{picture}(1,1)
+ \xdef\X{\the\Puzzle@X}%
+ \Puzzle@X=0
+ |[\X]{#1}%
+ \end{picture}%
+ \let\next\Puzzle@Numbers
+ \advance\Puzzle@X 1
+ \fi
+ \next
+}
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleLettersText}
+% The macro |\PuzzleLettersText| contains the text typeset at the
+% beginning of the |\PuzzleLetters| environment.
+% \begin{macrocode}
+\newcommand\PuzzleLettersText{The following letters are used: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleLetters}
+% The macro |\PuzzleLetters| is intended to show the letters used
+% in a numbered crossword puzzle. The argument is the (sorted) list
+% of characters used.
+% \begin{macrocode}
+\newcommand\PuzzleLetters[1]{\PuzzleLettersText #1\par}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@TYPE}
+% The macro |\Puzzle@TYPE| contains the type of the puzzle. It is
+% used find the appropriate initialization macro.
+% \begin{macrocode}
+\newcommand\Puzzle@TYPE{normal}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleSolution}
+% The macro |\PuzzleSolution| arranges everything that the
+% following puzzles are typeset in the ``solution'' mode, i.e. the
+% letters are shown and the clues are suppressed.
+%
+% This macros has one optional argument which has to be |true| or
+% |false|. This argument determines whether or not the numbers
+% should also be shown in the solution. The default is |false|
+% which means that the numbers are suppressed in the solution.
+% \begin{macrocode}
+\newcommand\PuzzleSolution[1][false]{%
+ \@nameuse{Puzzle@SolutionNumbered#1}%
+ \let\PuzzleClues\Puzzle@Clues@@solution
+ \let\endPuzzleClues\endPuzzle@Clues@@solution
+ \let\PuzzleWords\Puzzle@Words@@solution
+ \let\endPuzzleWords\endPuzzle@Words@@solution
+ \xdef\Puzzle@TYPE{solution}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleUnsolved}
+% The macro |\PuzzleUnsolved| arranges everything that the
+% following puzzles are typeset in the ``unsolved'' mode, i.e. the
+% letters are suppressed and the clues are shown.
+% \begin{macrocode}
+\newcommand\PuzzleUnsolved{%
+ \let\PuzzleClues\Puzzle@Clues@@normal
+ \let\endPuzzleClues\endPuzzle@Clues@@normal
+ \let\PuzzleWords\Puzzle@Words@@normal
+ \let\endPuzzleWords\endPuzzle@Words@@normal
+ \xdef\Puzzle@TYPE{normal}}
+% \end{macrocode}
+% \end{macro}
+%
+% The boolean |Puzzle@SolutionNumbered| deternimes whether or
+% not the solution should contain numbers. Initially it is set to
+% ``false''.
+%
+% \begin{macrocode}
+\newif\ifPuzzle@SolutionNumbered
+\Puzzle@SolutionNumberedfalse
+% \end{macrocode}
+%
+%
+% Finally we arrange that the default behaviour is to typeset an
+% unsolved crossword puzzle.
+%
+% \begin{macrocode}
+\PuzzleUnsolved
+% \end{macrocode}
+%
+% That's all.
+%
+% \PrintChanges
+% \newpage
+% \PrintIndex
+%
+% \Finale
+%
+\endinput
+%
+% Local Variables:
+% mode: latex
+% TeX-master: t
+% End:
diff --git a/Master/texmf-dist/source/latex/cwpuzzle/cwpuzzle.ins b/Master/texmf-dist/source/latex/cwpuzzle/cwpuzzle.ins
new file mode 100644
index 00000000000..ab749a8b6b4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cwpuzzle/cwpuzzle.ins
@@ -0,0 +1,43 @@
+%%------------------------------------------------------------------
+%% Driver file to extract the dtx style and package file.
+%%
+%% Copyright (C) 1995 Gerd Neugebauer
+%%
+%% Author: Gerd Neugebauer
+%% Mainzer Str. 8
+%% 56321 Rhens
+%% Mail: gerd@informatik.uni-koblenz.de
+%%
+%% cwpuzzle.ins is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY. No author or distributor accepts
+%% responsibility to anyone for the consequences of using it or for
+%% whether it serves any particular purpose or works at all, unless
+%% he says so in writing.
+%%
+%% Everyone is granted permission to copy, modify and redistribute
+%% cwpuzzle.ins, provided this copyright notice is preserved and
+%% any modifications are indicated.
+%%
+%%------------------------------------------------------------------
+%%
+%% Run this file through TeX or LaTeX to extract the files.
+%% You need the docstrip package as distributed with LaTeX2e.
+%% It is also availlable as seperate package from any CTAN site.
+%%
+%%------------------------------------------------------------------
+\def\batchfile{cwpuzzle.ins}
+\input docstrip.tex
+\keepsilent
+\generateFile{cwpuzzle.sty}{t}{\from{cwpuzzle.dtx}{}}
+\Msg{****************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space cwpuzzle.sty}
+\Msg{*}
+\Msg{* To produce the documentation run cwpuzzle.dtx through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{****************************************************************}
+\endinput