summaryrefslogtreecommitdiff
path: root/macros/generic/misc/chessmin.tex
blob: 49b03d31b4244a4ced55beb3a0d13787f63fb6b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
%   These are two TeX macros which may be useful for writing about
% chess.  \bore creates a chess diagram from Forsyth notation, with
% Z used as a terminator.  For example,
% 
%   $$\bore r1bqkbnr pppp1ppp 2n5 1B2p3 4P3 5N2 PPPP1PPP RNBQK2R Z$$
%
% shows the Ruy Lopez after white's third move.
%
% \VAR (number) (moves separated by spaces) Z may be used to write
% a variation.  The macro inserts the move numbers, starting with 
% (number).  For example,
%
%     Continuing from the diagram above, \VAR 3 \dots{} a6 Ba4 Nf6 O--O
%     Be7 Re1 b5 Bb3 O-O c3 d5 Z is the Marshall gambit.
%
%  Note the \dots{} to indicate that Black made the first move.
%
%  The diagrams created by \bore have pieces made up of a small number
% of rectangles.  Much nicer diagrams and more powerful macros were
% created by Piet Tutelaers, available  by anonymous ftp
% at sol.cs.ruu.nl (131.211.80.5).  However, the ones offered here
% do not require additional fonts, and may be easier to use.
%
%   I authorize circulation of these macros by ftp sites and similar
% nonprofit media.  Improvements are welcome.  An earlier version of
% the macros (with letters for pieces) was done several years ago, 
% with substantial modifications by Steve Cochran.
%
%   Charles Blair  (ceblair@ux1.cso.uiuc.edu)
%    macros start below--- you may cut here --------------------------
%
% \fun is the fundamental length unit for the diagrams.  If you
% replace 1.2pt by something else, the scale is changed.
% The box rf is not used, except to provide something with which to
% refer to \fun.
%
\newdimen\fun \dimen\fun=1.2pt
\newbox\rf \setbox\rf=\vbox to \dimen\fun{
\hrule height \dimen\fun width \dimen\fun}
%
\def\oil{\offinterlineskip} % I needed to use this in all my vboxes
%
%   Black pieces are made from solid boxes of specified height and
% width (the \filbox macro).  For White pieces, \filbox is replaced by a
% macro (\blbox) which draws the lines around the border of such a box.
%   (the white knight is an exception to this)
% The macro \tbo is defined as \blbox or \filbox as needed.
%
\def\filbox#1#2{\vbox{\oil \hrule height #1\ht\rf width #2\ht\rf}}
%
\newdimen\adjust 
\def\blbox#1#2{\dimen\adjust=#1\ht\rf \advance\dimen\adjust by-0.4\ht\rf
\vbox{\oil \hrule height 0.2\ht\rf width #2\wd\rf
\hbox to #2\wd\rf{\vrule height \dimen\adjust width 0.2\wd\rf\hfil
\vrule height \dimen\adjust width 0.2\wd\rf}
\hrule height 0.2\ht\rf width #2\wd\rf}}
%
%  Each piece is 12 units wide.  \scen produces an hbox with this width
%  and either a \blbox or a \filbox in the center.
%
\def\scen#1#2{\hbox to 12\wd\rf{\hfil\tbo{#1}{#2}\hfil}}
%
%  Definitions (color independent) of each piece
%
\def\pawn{\vbox{\oil \scen{2.5}{4}\scen{3}{8}\scen{4.5}{4}\scen{3}{10}}}
%
\def\bishop{\vbox{\oil \scen{2}{2.5}\scen{3}{8}\scen{4}{10}%
\scen{3}{6}\scen{1.5}{12}}}
%
\def\rook{\vbox{\oil
\hbox to 12\wd\rf{\tbo2{2.5}\hfil\tbo2{2.5}\hfil\tbo2{2.5}}
\scen{3}{12}\scen{5.5}{7}\scen{3}{12}}}
%
\def\queen{\vbox{\oil \hbox to 12\wd\rf{\tbo{6}{2}\hfil\tbo{8}{2}%
\hfil\tbo{8}{2}\hfil\tbo{6}{2}}\scen{4}{10}}}
%
\def\king{\vbox{\oil%  Next 4 lines are the cross part (improvement wanted)
\hbox to 12\wd\rf{\rlap%
{\hbox to 12\wd\rf{\hfil\vrule height 3\ht\rf width 0.2\wd\rf\hfil}}%
\hfil\raise 1.5\ht\rf%
\hbox{\vrule width 3\ht\rf height 0.2\ht\rf}\hfil}
\hbox to 12\wd\rf{\tbo{6}{4.5}\hfil\tbo{6}{4.5}}
\scen{4}{10}}}
%
\def\knight{\vbox{\oil \hbox{\hskip 7\wd\rf\tbo{1}{1}}
\hbox{\hskip2\wd\rf\tbo{2.5}{7}}\hbox{\hskip 2\wd\rf
\vbox to  3\ht\rf{\tbo{1}{1.5}\vfil}\hskip3\wd\rf\tbo{3}{2.5}}
\hbox{\hskip 3.4\wd\rf\tbo{4}{5.6}}
\tbo{2.5}{12}}}
%
%    Creation of the boxes for the pieces
%
\newbox\WP \def\tbo#1#2{\blbox{#1}{#2}} \setbox\WP=\pawn
\newbox\BP \def\tbo#1#2{\filbox{#1}{#2}} \setbox\BP=\pawn
\newbox\WB \def\tbo#1#2{\blbox{#1}{#2}} \setbox\WB=\bishop
\newbox\BB \def\tbo#1#2{\filbox{#1}{#2}} \setbox\BB=\bishop
\newbox\WR \def\tbo#1#2{\blbox{#1}{#2}} \setbox\WR=\rook
\newbox\BR \def\tbo#1#2{\filbox{#1}{#2}} \setbox\BR=\rook
\newbox\WQ \def\tbo#1#2{\blbox{#1}{#2}} \setbox\WQ=\queen
\newbox\BQ \def\tbo#1#2{\filbox{#1}{#2}} \setbox\BQ=\queen
\newbox\WK \def\tbo#1#2{\blbox{#1}{#2}} \setbox\WK=\king
\newbox\BK \def\tbo#1#2{\filbox{#1}{#2}} \setbox\BK=\king
\newbox\BN \def\tbo#1#2{\filbox{#1}{#2}} \setbox\BN=\knight
%
%  The exceptional white knight (a lot of work to avoid a line at neck!)
%
\newbox\WN \def\tbo#1#2{\blbox{#1}{#2}} \setbox\WN=
\vbox{\oil \hbox{\hskip 7\wd\rf\tbo{1}{1}}
\hbox{\hskip2\wd\rf\vrule height 2.5\ht\rf width 0.2\ht\rf
\vbox to 2.5\ht\rf{\hrule height 0.2\ht\rf width 6.6\wd\rf\vfil
\hrule height 0.2\ht\rf width 4.5\wd\rf}%
\vrule height 2.5\ht\rf width 0.2\wd\rf}
\hbox{\hskip 2\wd\rf
\vbox to  3\ht\rf{\tbo{1}{1.5}\vfil}\hskip3\wd\rf
\hbox to 2.5\wd\rf{\vrule height 3\ht\rf width 0.2\wd\rf\hfil
\vrule height 3\ht\rf width 0.2\wd\rf}}
\hbox{\hskip 3.4\wd\rf\tbo{4}{5.6}}
\tbo{2.5}{12}}
%
%   \ver is the line used for square boundaries on the board
%   \nver is thinner line used to shade dark squares (if no piece on them)
%   \hor draws horizontal lines for each rank
%
\def\ver{\vrule height 15\ht\rf width 0.4\wd\rf}
\def\nver{\vrule height 15\ht\rf width 0.1\wd\rf}
\def\hor{\hrule height 0.4\wd\rf width 120\wd\rf}
%
 \newcount\color \newcount\blanks
\def\blanksquare{\ifodd\color \hbox to 15\wd\rf{\hfil\nver%
\hfil\nver\hfil\ver}\else\hbox to 15\wd\rf{\hfil\ver}\fi
\advance\color by 1}
%
% Each piece is centered inside a 15-unit square
%
\def\cen#1{\hbox to 15\wd\rf{\hfil\vbox to 15\ht\rf{\vfil\copy#1\vfil}%
\hfil\ver}}
%
% This processes the characters specifying a row of the diagram.  It
% is patterned after the \length example at the end of chapter 20
% of The TeXbook
\def\nextchar#1{\let\nex=\nextchar%
\ifcat7#1%
\blanks=#1\loop\ifnum\blanks>0 \blanksquare%
\advance\blanks by -1\repeat\else
\advance\color by 1%
\ifx#1P\cen{\WP}\else\ifx#1p\cen{\BP}\else%
\ifx#1N\cen{\WN}\else\ifx#1n\cen{\BN}\else%
\ifx#1B\cen{\WB}\else\ifx#1b\cen{\BB}\else%
\ifx#1Q\cen{\WQ}\else\ifx#1q\cen{\BQ}\else%
\ifx#1R\cen{\WR}\else\ifx#1r\cen{\BR}%
\else\ifx#1K\cen{\WK}\else\ifx#1k\cen{\BK}\else\let\nex=\relax%
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\nex}
%
%  \bore carries out preliminary steps for making the diagram.
%  \rgc reads in a string of non-blank characters, checks that the
%  first character is not the terminator Z, gives the string to \nextchar,
%  and then processes the next string.  (again patterned after \length)
%
\def\bore#1Z{\color=1\vbox{\oil \hor\rgc#1 Z }}
\def\rgc#1#2 {\advance\color by 1\let\nx=\rgc\ifx#1Z\let\nx=\relax
\else\hbox{\ver\nextchar#1#2Z}\hor\fi\nx}
%
%  This macro prints a variation.  It is supposed to use the ideas of
% \length and seems to work, but there is something I don't understand:
%  if the {} following the \else is deleted, something goes wrong.  Why?
%
\newcount\move \newcount\iswhite
\def\VAR#1 #2Z{\move=#1\iswhite=1\listem #2 Z }
\def\listem#1#2 {\ifx#1Z\let\nx=\relax\else{}%
\ifodd\iswhite{} \number\move~#1#2\else%
~#1#2\advance\move by 1\fi\advance\iswhite by 1\let\nx=\listem\fi\nx}