]> git.lyx.org Git - lyx.git/blob - lib/tex/lyxchess.sty
Adding hebrew quotation marks (bug #12849).
[lyx.git] / lib / tex / lyxchess.sty
1 %
2 % chess.sty
3 % ---------
4 % Style file for writing about chess games
5 % Author : Piet Tutelaers (internet: rcpt@urc.tue.nl)
6 % Version: 1.2 (Febr. 1992)
7 %    Improvements over version 1.1
8 %     - added `\v{S}ahovski Informator' symbols
9 %     -`en passant capture' bug fixed (reported by Jonathan Mestel)
10 %     -change {--} into \hbox{--} to prevent hyphenation within move
11 %     -\move's lined up on last row (or digit in case of castling)
12 %     -handling of promotion improved
13 %       * Black promotion problem solved (plain TeX)
14 %       * comment allowed also with promotion
15 %       * if no promotion piece is provided a default Q(ueen) is supposed
16 %     Thanks to: Jan Jaap Spreij (puls@cs.rug.nl)
17 %     -improved interface to plain TeX
18 %     -language support using the babel package from Johannes Braams
19 %      (currently support for english, dutch, german and french but you
20 %       can add an extra language `foreign' by:
21 %         1. creating `foreign.sty' for cooperating with `babel'
22 %         2. search for FOREIGN and follow the instructions in the comments)
23 %     - \begin{nochess} ... \end{nochess}
24 %     -chessfig10 renamed to chessf10 (service to MSDOS users)
25 % Version: 1.1 (17 Nov 1990)
26 %    Improvements over version 1.0:
27 %     -TeX code cleaned up (thanks to TeX-wizzard Victor Eijkhout)
28 %     -moving a King does not generate a castling move when this
29 %      King already moved
30 %     -renamed internal macro `\\' because LaTeX uses that
31 %     -better hooks for foreign languages (look for lines marked with
32 %      %%FOREIGN%%)
33 %    Torture test:
34 %      If you change something in the chess.sty style check if everything
35 %      else is still working with torture-test.ltx (LaTeX) or
36 %      torture-test.tex (plain TeX).
37 %    Known problems:
38 %     -The analysis mode cannot be used within arguments of macros
39 %         not: \centerline{|21.N5*f3|}  but: |\centerline{21.N5*f3}|
40 % Version: 1.0 (5 Jan 1990)
41 %
42
43 %
44 % Macro specific initialisations
45 %
46 {\def\format{plain}
47 \ifx\fmtname\format
48    \ifcat/@ \gdef\makeatletter{\catcode`@=11\relax}
49       \gdef\resetat{\catcode`@=12\relax}
50    \else\let\makeatletter\relax\let\resetat\relax\fi
51    \gdef\mbox#1{\leavevmode\hbox{#1}}
52    \gdef\Box{\vbox{\hrule height .1pt\hbox{\vrule width .1pt\kern3pt
53              \vbox{\kern6pt}\kern3pt\vrule width .1pt}\hrule height .1pt}}
54    \global\font\sc=cmcsc10
55 \else
56    \gdef\line#1{\hbox to \textwidth{#1}}
57 \fi}
58
59 \makeatletter
60
61 %
62 % Do we have language support? Otherwise take default language!
63 %
64 % \ifx\undefined\babel@core@loaded\input english.sty\fi
65
66
67 \def\@set[#1#2](#3){%arguments: [a-h1-8](<letter>)
68     \expandafter\xdef\csname#1#2\endcsname{#3}}
69
70 \def\@get#1[#2#3]{%arguments:\cs[a-h1-8]
71     \edef#1{\csname#2#3\endcsname}}
72
73 \font\Chess=chess20
74
75 \newcount\@c % column
76 \newcount\@r % row
77 \newcount\@sum % row+column
78
79 \def\@col{\ifcase\@c\or a\or b\or c\or d\or e\or f\or g\or h\fi}
80
81 \def\@showchar{
82    \@get\piece[\@col\the\@r]
83    \if\piece E \ifodd\@sum 0\else Z\fi\else
84    \if\piece P \ifodd\@sum P\else O\fi\else
85    \if\piece p \ifodd\@sum p\else o\fi\else
86    \if\piece R \ifodd\@sum R\else S\fi\else
87    \if\piece B \ifodd\@sum B\else A\fi\else
88    \if\piece N \ifodd\@sum N\else M\fi\else
89    \if\piece r \ifodd\@sum r\else s\fi\else
90    \if\piece b \ifodd\@sum b\else a\fi\else
91    \if\piece n \ifodd\@sum n\else m\fi\else
92    \if\piece K \ifodd\@sum K\else J\fi\else
93    \if\piece Q \ifodd\@sum Q\else L\fi\else
94    \if\piece k \ifodd\@sum k\else j\fi\else
95    \if\piece q \ifodd\@sum q\else l\fi\else
96    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
97
98 \def\@showrow#1{
99    \@r=#1\@c=1
100    \@sum=\@r\advance\@sum by\@c
101    \loop
102       \@showchar
103       \ifnum\@c<8 \advance\@c by1\advance\@sum by1
104    \repeat
105 }
106
107 \def\showboard{
108 \vbox{\offinterlineskip
109    \hrule height1pt
110    \hbox{\vrule width1pt\Chess
111          \vbox{\hbox{\@showrow8}
112                \hbox{\@showrow7}
113                \hbox{\@showrow6}
114                \hbox{\@showrow5}
115                \hbox{\@showrow4}
116                \hbox{\@showrow3}
117                \hbox{\@showrow2}
118                \hbox{\@showrow1}}%
119          \vrule width1pt}
120    \hrule height1pt}
121 }
122
123 % inner loop needs extra { ... }
124
125 \def\@emptyboard{
126    \@r=1
127    \loop
128       {\@c=1
129        \loop
130          \@set[\@col\the\@r](E)
131          \ifnum\@c<8 \advance\@c by1
132        \repeat}
133        \ifnum\@r<8 \advance\@r by 1
134    \repeat
135 }
136
137 \def\@initboard{
138 % empty squares
139    \@r=3
140    \loop
141      {\@c=1
142       \loop
143          \@set[\@col\the\@r](E)
144          \ifnum\@c<8 \advance\@c by1
145       \repeat}
146       \ifnum\@r<6 \advance\@r by 1
147    \repeat
148 % pawns
149    \@c=1
150    \loop
151       \@set[\@col2](P)\@set[\@col7](p)
152       \ifnum\@c<8 \advance\@c by1
153    \repeat
154 % pieces
155    \@set[a1](R)\@set[h1](R)
156    \@set[a8](r)\@set[h8](r)
157    \@set[b1](N)\@set[g1](N)
158    \@set[b8](n)\@set[g8](n)
159    \@set[c1](B)\@set[f1](B)
160    \@set[c8](b)\@set[f8](b)
161    \@set[d1](Q)\@set[e1](K)
162    \@set[d8](q)\@set[e8](k)
163 }
164
165 %
166 % The next part defines a user friendly notation for chess moves.
167 % Some examples:  |21. Nf3-e5, Ke8*f8 22. 0-0-0+, Bh8*a1|
168 %              :  |21.: Ke8*f8 22. Bh8*a1, 0-0|
169 %              :  |21 Nfe5 K*f8 22 0-0-0! B*a1|
170 %              :  |21: K*f8 22 B*a1 0-0|
171 %
172
173 \font\Fig=chessf10
174
175 \gdef\@king{{\Fig K}}
176 \gdef\@queen{{\Fig Q}}
177 \gdef\@rook{{\Fig R}}
178 \gdef\@bishop{{\Fig B}}
179 \gdef\@knight{{\Fig N}}
180 \gdef\@dash{\hbox{--}}
181 \gdef\@capt{$\times$}
182 \gdef\@dots{~$\ldots$,}
183 \gdef\@dot{\char46 }
184
185 %
186 % Make character codes for pieces depending on current language.
187 % (I cann't derive the Black values from the White using `\lowercase'!)
188 %
189
190 \def\define@White@pieces#1#2#3#4#5#6{% define character codes for White pieces
191    \chardef\king@=`#1  \def\uc@king{#1}
192    \chardef\queen@=`#2 \def\uc@queen{#2}
193    \chardef\rook@=`#3  \def\uc@rook{#3}
194    \chardef\bishop@=`#4\def\uc@bishop{#4}
195    \chardef\knight@=`#5\def\uc@knight{#5}
196    \chardef\pawn@=`#6  \def\uc@pawn{#6}}
197 \def\define@Black@pieces#1#2#3#4#5#6{% and now the Black pieces
198    \def\lc@king{#1}\def\lc@queen{#2}\def\lc@rook{#3}
199    \def\lc@bishop{#4}\def\lc@knight{#5}\def\lc@pawn{#6}}
200 \def\activate@pieces{% make them active
201    \catcode\king@=\active\catcode\queen@=\active\catcode\rook@=\active%
202    \catcode\bishop@=\active\catcode\knight@=\active}
203 \def\deactivate@pieces{% make them inactive
204    \catcode\king@=11\catcode\queen@=11\catcode\rook@=11%
205    \catcode\bishop@=11\catcode\knight@=11}
206 \def\ifcurrentlanguage#1#2{%if language defined then compare with \language
207    \expandafter\ifx\csname l@#1\endcsname\relax%
208    \else\ifnum\language=\expandafter\csname l@#1\endcsname\relax#2\fi\fi}
209 \def\select@pieces{% select pieces depending on language
210    \ifcurrentlanguage{english}{%
211       \define@White@pieces{K}{Q}{R}{B}{N}{P}
212       \define@Black@pieces{k}{q}{r}{b}{n}{p}}
213    \ifcurrentlanguage{dutch}{%
214       \define@White@pieces{K}{D}{T}{L}{P}{I}
215       \define@Black@pieces{k}{d}{t}{l}{p}{i}}
216    \ifcurrentlanguage{german}{%
217       \define@White@pieces{K}{D}{T}{L}{S}{B}
218       \define@Black@pieces{k}{d}{t}{l}{s}{b}}
219    \ifcurrentlanguage{french}{%
220       \define@White@pieces{R}{D}{T}{F}{C}{P}
221       \define@Black@pieces{r}{d}{t}{f}{c}{p}}
222 % Define here your language and choose an unique set of uppercase letters
223 % for the White pieces (KING, QUEEN, etc.) and the corresponding lowercase
224 % letters for the Black pieces (king, queen, etc.).
225 %  \ifcurrentlanguage{FOREIGN}{%
226 %     \define@White@pieces{KING}{QUEEN}{ROOK}{BISHOP}{KNIGHT}{PAWN}
227 %     \define@Black@pieces{king}{queen}{rook}{bishop}{knight}{pawn}}
228    }
229 \def\let@pieces#1#2#3#4#5{% let character codes be macros
230    \let#1=\@king\let#2=\@queen\let#3=\@rook%
231    \let#4=\@bishop\let#5=\@knight}
232
233 \catcode`|=\active\select@pieces
234 {\catcode`:=\active\catcode`.=\active\catcode`*=\active\catcode`-=\active
235  \activate@pieces
236  \gdef\trigger@pieces{
237      \catcode`:=\active\catcode`.=\active\catcode`*=\active\catcode`-=\active
238      \activate@pieces
239      % I would like to say ``\let\king@=\@king'' but how?
240      \ifcurrentlanguage{english}{\let@pieces{K}{Q}{R}{B}{N}}%
241      \ifcurrentlanguage{dutch}{\let@pieces{K}{D}{T}{L}{P}}%
242      \ifcurrentlanguage{german}{\let@pieces{K}{D}{T}{L}{S}}%
243      \ifcurrentlanguage{french}{\let@pieces{R}{D}{T}{F}{C}}%
244 % Fill in your language and the uppercase letters for KING, QUEEN, etc.
245 % \ifcurrentlanguage{FOREIGN}{\let@pieces{KING}{QUEEN}{ROOK}{BISHOP}{KNIGHT}}%
246 % Your language will be activated by FOREIGN.sty.
247      \let-=\@dash\let*=\@capt\let:=\@dots\let.=\@dot}%
248  \gdef\@notation{\begingroup\let|=\endgroup\trigger@pieces}%
249 %
250 % Provide a `nochess' environment in which the `|' character becomes
251 % inactive for situations where the `|' is already in use (like in
252 % the LaTeX `tabular' environment for example).
253 %
254  \gdef\nochess{\begingroup\let|=\relax\catcode`\|=12\relax
255          \catcode`:=12 \catcode`.=12 \catcode`*=12 \catcode`-=12
256          \deactivate@pieces\let\endnochess=\endgroup}
257  \gdef\chess{\begingroup\let\endchess=\endgroup\trigger@pieces}
258 }
259 \let|=\@notation
260
261 %
262 % Next part provides a ply (half move) generator
263 %
264
265 \newif\ifWhite     \newif\ifFigure    \newif\ifcapture
266
267 %
268 % next newif's needed for castling
269 %
270 \newif\ifKnotmoved \newif\ifknotmoved
271 \newif\ifcastling  \newif\ifoo
272
273 %
274 % Globals for special pawn moves (en passant capture and promotion)
275 %
276
277 \newif\ifenpassant \newif\ifpromotion
278
279 \def\@color#1{ %  Color of a piece     0: none, -1: black, 1: white
280    \if #1E0\else
281    \ifnum`#1=\uccode`#11\else-1\fi\fi}
282
283 %
284 % No checking is done for validity of moves, only legal moves behave well!!
285 %
286
287 \def\@ply#1#2#3#4#5 {% Syntax: [a-h][1-8][a-h][1-8]{Q|R|B|N}{Comment}
288    \@get\piece[#1#2]\@get\capture[#3#4]\Figuretrue
289    \if\capture E\capturefalse\else\capturetrue\fi
290    \ifWhite
291       \if\piece P\Figurefalse
292          \if#46
293              \if\eprow#3\capturetrue\enpassanttrue\fi
294              \xdef\eprow{x}%
295          \else
296             \xdef\eprow{x}%
297             \if#22
298                \if#44\xdef\eprow{#3}\fi
299             \else
300                \if#48\promotiontrue\fi
301             \fi
302          \fi
303       \else\xdef\eprow{x}
304          \if\piece K% check for possible castling
305             \ifKnotmoved
306                \if#3g\if#41\castlingtrue\ootrue\fi
307                \else\if#3c\if#41\castlingtrue\oofalse\fi\fi
308                \fi
309                \global\Knotmovedfalse
310             \fi
311          \fi
312       \fi
313       \ifcastling
314           \@set[#1#2](E)\@set[#3#4](K)%
315           \ifoo 0\@dash0\rlap{#5}\@set[f1](R)\@set[h1](E)%
316           \else 0\@dash0\@dash0\rlap{#5}\@set[d1](R)\@set[a1](E)\fi
317           \castlingfalse
318       \else
319           \ifFigure{\Fig\piece}\fi
320           #1#2\ifcapture\@capt\else\@dash\fi#3#4%
321           \rlap{\ifpromotion\expandafter\promovendus#5XYZ\else#5\fi}%
322           \@set[#1#2](E)%
323           \ifpromotion\@set[#3#4](\PROM)\else\@set[#3#4](\piece)\fi
324           \ifenpassant\@set[#3#2](E)\enpassantfalse\fi
325       \fi
326       \global\Whitefalse
327    \else % ``same'' for Black
328       \if\piece p\Figurefalse
329          \if#43
330              \if\eprow#3\capturetrue\enpassanttrue\fi
331              \xdef\eprow{x}%
332          \else
333             \xdef\eprow{x}%
334             \if#27
335                \if#45\xdef\eprow{#3}\fi
336             \else
337                \if#41\promotiontrue\fi
338             \fi
339          \fi
340       \else\xdef\eprow{x}
341          \if\piece k
342             \ifknotmoved
343                \if#3g\if#48\castlingtrue\ootrue\fi
344                \else\if#3c\if#48\castlingtrue\oofalse\fi\fi
345                \fi
346                \global\knotmovedfalse
347             \fi
348          \fi
349       \fi
350       \ifcastling
351           \@set[#1#2](E)\@set[#3#4](k)%
352           \ifoo 0\@dash0\rlap{#5}\@set[f8](r)\@set[h8](E)%
353           \else 0\@dash0\@dash0\rlap{#5}\@set[d8](r)\@set[a8](E)\fi%
354           \castlingfalse
355       \else
356           \ifFigure{\Fig\if\piece rR\else\if\piece bB\else\if\piece nN\else
357                         \if\piece qQ\else K\fi\fi\fi\fi}\fi
358           #1#2\ifcapture\@capt\else\@dash\fi#3#4%
359           \rlap{\ifpromotion\expandafter\promovendus#5XYZ\else#5\fi}%
360           \@set[#1#2](E)%
361           \ifpromotion\@set[#3#4](\prom)\else\@set[#3#4](\piece)\fi
362           \ifenpassant\@set[#3#2](E)\enpassantfalse\fi
363       \fi
364       \global\Whitetrue
365    \fi}
366
367 %
368 % Promovendus: treat first char of argument as promotion piece if queen,
369 % rook, knight or bishop; otherwise consider it as comment and take queen
370 % as default promotion. Leave in \PROM White promoting piece (Q|R|B|N)
371 % and in \prom Black's version (q|r|b|n).
372 %
373
374 \def\promovendus#1#2Z{%
375    \if#1X\def\C{}\gdef\PROM{Q}\gdef\prom{q}%
376    \else
377      \ifnum`#1=\queen@ \gdef\PROM{Q}\gdef\prom{q}\def\C{\@comment#2}\else
378      \ifnum`#1=\rook@  \gdef\PROM{R}\gdef\prom{r}\def\C{\@comment#2}\else
379      \ifnum`#1=\bishop@\gdef\PROM{B}\gdef\prom{b}\def\C{\@comment#2}\else
380      \ifnum`#1=\knight@\gdef\PROM{N}\gdef\prom{n}\def\C{\@comment#2}\else
381        \gdef\PROM{Q}\gdef\prom{q}\def\C{\comment#1#2}%
382    \fi\fi\fi\fi\fi%
383    {\Fig\PROM}{\C}}
384 \def\@comment#1XY{#1}
385
386 \newcount\movecount \movecount=0
387
388 \def\showmove#1#2{\par
389    \line{\strut\hbox to1cm{\hfil\the\movecount.}%
390    \hbox to2.8cm{\hfil#1}\hbox to2.8cm{\hfil#2}\hfil}\par}
391
392 \def\move#1 #2 {
393    \advance\movecount by 1
394    \showmove{\@ply#1 }{\@ply#2 }}
395
396 \def\ply#1 {
397    \ifWhite
398      \advance\movecount by 1
399      \showmove{\@ply#1 }{}
400    \else
401      \showmove{$\ldots$}{\@ply#1 }
402    \fi}
403
404 \def\newgame{\vskip0pt\movecount=0 \@initboard
405     \Whitetrue\castlingfalse\xdef\eprow{x}
406     \Knotmovedtrue\knotmovedtrue
407     \promotionfalse\enpassantfalse}
408
409 \def\@dolist{\afterassignment\@dodolist\let\@@next= } % Answer 11.5 TeXbook
410 \def\@dodolist{\ifx\@@next\@endlist \let\@@next\relax % adapted to generate
411   \else \@nextitem\let\@@next\@dolist \fi             % chess diagrams
412   \@@next}
413
414 \def\@endlist{\@endlist}
415
416 \def\@nextitem{%
417        \if\@@next\space      \@set[\@col\the\@r](E)\else
418        \if\@@next *          \@set[\@col\the\@r](E)\else
419        \if\@@next\uc@pawn    \@set[\@col\the\@r](P)\else
420        \if\@@next\lc@pawn    \@set[\@col\the\@r](p)\else
421        \if\@@next\uc@rook    \@set[\@col\the\@r](R)\else
422        \if\@@next\lc@rook    \@set[\@col\the\@r](r)\else
423        \if\@@next\uc@bishop  \@set[\@col\the\@r](B)\else
424        \if\@@next\lc@bishop  \@set[\@col\the\@r](b)\else
425        \if\@@next\uc@knight  \@set[\@col\the\@r](N)\else
426        \if\@@next\lc@knight  \@set[\@col\the\@r](n)\else
427        \if\@@next\uc@queen   \@set[\@col\the\@r](Q)\else
428        \if\@@next\lc@queen   \@set[\@col\the\@r](q)\else
429        \if\@@next\uc@king    \@set[\@col\the\@r](K)\else
430        \if\@@next\lc@king    \@set[\@col\the\@r](k)\else
431        \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
432        \advance\@c by1}
433
434 \def\@initrow#1#2{\@r=#1\@c=1\@dolist#2\@endlist}
435
436 %
437 % For setting up a position
438 %
439 \def\board#1#2#3#4#5#6#7#8{
440         \@initrow8{#1}
441         \@initrow7{#2}
442         \@initrow6{#3}
443         \@initrow5{#4}
444         \@initrow4{#5}
445         \@initrow3{#6}
446         \@initrow2{#7}
447         \@initrow1{#8}}
448
449 %
450 % Next macros for defining chess position (thanks to Victor Eijkhout)
451 %
452 \def\White(#1){\def\match{xxx}\xWhite#1,xxx,}
453 \def\xWhite#1,{\def\temp{#1}
454   \ifx\temp\match \else \WhitePieceOrPawn#1XY \expandafter\xWhite \fi}
455 \def\WhitePieceOrPawn#1#2#3#4Y{%
456   \if#3X \@set[#1#2](P)
457   \else\ifnum`#1=\king@  \@set[#2#3](K)\else % King
458        \ifnum`#1=\queen@ \@set[#2#3](Q)\else % Queen
459        \ifnum`#1=\rook@  \@set[#2#3](R)\else % Rook
460        \ifnum`#1=\bishop@\@set[#2#3](B)\else % Bishop
461        \ifnum`#1=\knight@\@set[#2#3](N)\else % kNight
462        \fi\fi\fi\fi\fi
463   \fi}
464
465 \def\Black(#1){\def\match{xxx}\xBlack#1,xxx,}
466 \def\xBlack#1,{\def\temp{#1}
467   \ifx\temp\match \else \BlackPieceOrPawn#1XY \expandafter\xBlack \fi}
468 \def\BlackPieceOrPawn#1#2#3#4Y{
469   \if#3X\@set[#1#2](p)
470   \else\ifnum`#1=\king@  \@set[#2#3](k)\else % King
471        \ifnum`#1=\queen@ \@set[#2#3](q)\else % Queen
472        \ifnum`#1=\rook@  \@set[#2#3](r)\else % Rook
473        \ifnum`#1=\bishop@\@set[#2#3](b)\else % Bishop
474        \ifnum`#1=\knight@\@set[#2#3](n)\else % kNight
475        \fi\fi\fi\fi\fi
476   \fi}
477
478 \def\position{\begingroup%
479     \@emptyboard\movecount=0\xdef\eprow{x}
480     \global\Whitetrue\global\castlingfalse
481     \global\Knotmovedtrue\global\knotmovedtrue
482     \global\promotionfalse\global\enpassantfalse}
483 \def\endposition{\endgroup}
484
485 % And now we define most symbols that are used in `\v{S}ahovski Informator'
486 % (Chess Informant). For a complete list see Informant#51 (1991) pp 10-12.
487 % If you add symbols realize that the macros should be usable by plain TeX
488 % and LaTeX and that the (La)TeX names should be suggestive and clear!
489 % But don't use uppercase letters or existing names (center)!
490 % Thanks go to John Saba (saba@ccit.arizona.edu) and Henry Thomas
491 % (hthomas@irisa.fr) for their help in defining next symbols.
492 \font\symbolten=cmsy10 \font\smrm=cmr6 \font\symbolsix=cmsy6
493 \def\wbetter{\mbox{\baselineskip0pt$\vcenter{\vbox{\hbox{+}\hbox{=}}}$}}
494 \def\bbetter{\mbox{\baselineskip0pt
495    $\vcenter{\vbox{\hbox{=}\kern-.3ex\hbox{+}}}$}}
496 \def\wupperhand{\mbox{$\pm$}}
497 \def\bupperhand{\mbox{$\mp$}}
498 \def\wdecisive{\mbox{$+\hbox{}-$}}
499 \def\bdecisive{\mbox{$-\hbox{}+$}}
500 \def\equal{=}
501 \def\unclear{\mbox{$\infty$}}
502 \def\compensation{\mbox{\baselineskip0pt$\vcenter{\vbox{%
503    \hbox{\kern.056em\vbox{\hrule width0.89em\kern0.35ex\hrule width0.89em}}
504    \kern.2ex\hbox{$\infty$}}}$}}
505 % next symbol should be build using METAFONT
506 \def\devadvantage{{\symbolten\char'015}\kern-4.8pt
507    \vrule width 2.4pt height6pt depth-5.6pt
508    \vrule width .4pt height8pt depth-5.6pt\kern2.4pt}
509 \def\moreroom{{\symbolten\char'015}}
510 \def\withattack{$\rightarrow$}
511 \def\withinit{$\uparrow$}
512 \def\counterplay{\hbox{\baselineskip0pt%
513    $\vcenter{\vbox{\hbox{$\leftarrow$}\hbox{$\rightarrow$}}}$}}
514 \def\zugzwang{$\odot$}
515 \def\mate{\kern.4pt\mbox{%
516    \vrule width2ex height1.18ex depth-1.1ex\kern-2ex
517    \vrule width2ex height.52ex depth-.44ex\kern-1.381ex
518    \vrule width.08ex height1.8ex depth.2ex\kern0.615ex
519    \vrule width.08ex height1.8ex depth.2ex\kern0.406ex}\kern.4pt}
520 \def\withidea{$\triangle$}
521 \def\onlymove{$\Box$}
522 \def\betteris{\mbox{\baselineskip0pt
523    $\vcenter{\vbox{\hbox{$\frown$}\kern-0.35ex\hrule width0.95em}}$}}
524 \def\file{$\Leftrightarrow$}
525 % next symbol should be build using METAFONT
526 \def\diagonal{$\nearrow$}
527 \def\centre{$\Box$\kern-.6em\raise.54ex\hbox{\smrm\char'053}}
528 \def\kside{$\gg$}
529 \def\qside{$\ll$}
530 \def\weakpt{$\times$}
531 \def\ending{$\perp$}
532 % John Saba's method:
533 \def\blackbox{\vrule height .8ex width 1.2ex depth 0ex}
534 \def\whitebox{\vbox{\hrule height .1pt\hbox{\vrule width .1pt\kern.6ex
535               \vbox{\kern.8ex}\kern.6ex\vrule width .1pt}\hrule height .1pt}}
536 \def\bishoppair{\whitebox\kern-2pt\raise1.8pt\hbox{\whitebox}}
537 \def\opposbishops{\whitebox\kern-2pt\raise1.8pt\hbox{\blackbox}}
538 \def\samebishops{\blackbox\kern-2pt\raise1.8pt\hbox{\blackbox}}
539 % My method
540 %\def\bishoppair{\setbox0=\hbox{%
541 %   \vrule width1.4ex height1ex depth-.92ex\kern-1.4ex
542 %   \vrule width1.4ex height.08ex depth0pt\kern-1.4ex
543 %   \vrule width.08ex height1ex depth0ex\kern1.24ex
544 %   \vrule width.08ex height1ex depth0ex}%
545 %   \kern.4pt\mbox{\copy0\kern-.6ex\raise0.56ex\box0}\kern.4pt}
546 %\def\opposbishops{\kern.4pt\mbox{%
547 %   \vrule width1.4ex height1ex depth-.92ex\kern-1.4ex
548 %   \vrule width1.4ex height.08ex depth0pt\kern-1.4ex
549 %   \vrule width.08ex height1ex depth0ex\kern1.24ex
550 %   \vrule width.08ex height1ex depth0ex\kern-.6ex
551 %   \vrule width1.4ex height1.56ex depth-0.56ex}\kern.4pt }
552 %\def\samebishops{\kern.4pt\mbox{%
553 %   \vrule width1.4ex height1ex depth0ex\kern-.6ex
554 %   \vrule width1.4ex height1.56ex depth-0.56ex}\kern.4pt}
555 \def\unitedpawns{$\circ\kern-.05em\circ$}
556 \def\seppawns{$\circ\kern-.3em\cdot\kern-.35em\cdot\kern-.1em\circ$}
557 \def\doublepawns{\mbox{\baselineskip0pt
558    $\vcenter{\vbox{\hbox{$\circ$}\vskip.8pt\hbox{$\circ$}}}$}}
559 % Next symbol still not perfect ...
560 \def\passedpawn{\mbox{\baselineskip0pt
561    $\vcenter{\vbox{\hbox{\kern0.14em\symbolsix\char'042}\hbox{$\circ$}}}$}}
562 \def\morepawns{$>$}
563 \def\timelimit{$\oplus$}
564 \def\novelty{{\sc N}}
565 \def\comment{{\sc RR}}
566 \def\various{{\sc R}}
567 \def\without{\kern.4pt\mbox{%
568    \vrule width 1ex height.08ex depth0ex\kern-0.08ex
569    \vrule width0.08ex height1.5ex depth0ex}\kern.4pt}
570 \def\with{\kern.4pt\mbox{%
571    \vrule width 0.08ex height1.5ex depth0ex\kern-0.08ex
572    \vrule width 1ex height.08ex depth0ex}\kern.4pt}
573 \def\etc{$\parallel$}
574 \def\see{\kern.4pt\mbox{\vrule width 1em height.54ex depth-.46ex}\kern.4pt}
575