summaryrefslogtreecommitdiff
path: root/macros/generic/proofs/taylor/QED.sty
blob: bdf443cee190cea8c4456ab5f79e16bbf3184e92 (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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
\message{<Paul Taylor's right-justified end-of-proof mark, 24 June 1995>}
%%========================================================================
%************************************************************************%
%*                                                                      *%
%*      Maybe you already have a \qed macro to put a little square      *%
%*      on the right hand side at the end of a mathematical proof?      *%
%*                                                                      *%
%*                      IT'S PROBABLY MINE!                             *%
%*                                                                      *%
%*           Please compare yours with \parag@pushright below.          *%
%*                                                                      *%
%*      This new file is compatible, it fixes the bugs, has extra       *%
%*      features, and is maintained and portable.  Please use it!       *%
%*                                                                      *%
%*      NEW FEATURE \WillHandleQED and \HandleQED for environments      *%
%*      which do not give access to the right hand side of the page.    *%
%*                                                                      *%
%*      Now also available: \DefineStandardTheorems or                  *%
%*      \usepackage[define-standard-theorems]{QED}                      *%
%*                                                                      *%
%************************************************************************%
%========================================================================%

% COPYRIGHT (C) 1993-6 Paul Taylor, Department of Computer Science,
% Queen Mary & Westfield College, London E1 4NS.
% You may use this file for any purpose. You may copy it on condition that
% you do so in exactly the form in which it was supplied, make no charge
% for the copy and impose the same conditions on the recipient.
% This software is supplied ``as is'' without warranty, express or implied,
% including but not limited to merchantability and fitness for any particular
% purpose. No liability is accepted by the author, Queen Mary and Westfield
% College, Imperial College or any third party for any direct or consequential
% damages, however caused.
% In all cases you must keep several backup versions of your files in a place
% to which your machine cannot write, and you must check documents visually
% before submitting the final version to a publisher or expensive printer.

% WARNING: If you use this with Frank Mittlebach's "theorem.sty" you
% MUST load theorem first, then QED, then do the \newtheorem commands.

%       Authoritative version:  /pub/tex/contrib/pt/proofs/QED.sty
%       by anonymous FTP from:  ftp.dcs.qmw.ac.uk
%       also CTAN:              macros/generic/proofs/taylor/QED.sty
%       author/maintained by:   Dr Paul Taylor <pt@dcs.qmw.ac.uk>

% WARNING: This file replaces some of the functions of "Paul.sty"
% and MUST NOT be used with it as serious conflicts will arise.

%=========================================================================

%       USER INTERFACE AND EXAMPLES (see also OPTIONS below)

% LaTeX2e \usepackage options: see \DeclareOption commands below
% theorems-as-commands roman-theorems italic-theorems
% auto-QED explicit-QED number-theorems dont-number-theorems
% black-square open-square

%       \begin{Proof} ... \end{Proof}
%       or    \Proof  ... \endProof
%       or    \Proof  ... \endproof
%       or    \Proof  ... \qed          also \QED \QEF and \QEI

% WARNING: \qed which doesn't follow \Proof will not print the square.

% Each properly nested Proof/endProof pair gets a single
% \qedsymbol at the end, on the far right hand side.
% Unfortunately, this may still be in the wrong place
% if the proof ends with a display or itemisation.
% To solve this, \qed may be put *inside* the last substantive
% environment; the \qedsymbol will be put at that point
% (the visual end) and suppressed at the logical end of proof.

% Examples:
%       \begin{Proof}                   \begin{Proof}
%         ...                             ...
%         \begin{eqnarray}                \begin{itemize}
%          ... &=& ... \\                   \item ...
%          ..  &=& ... &\qed                \item ...   \qed
%         \end{eqnarray}                  \end{itemize}
%       \end{Proof}                     \end{Proof}
% also works with $$...$$ and \[...\] displays, including fleqn.sty.

% Unfortunately some environments, such as picture, do not allow this at all.
% See the section "centering environments" below for the mechanism for
% passing \qed to such an environment for special processing.

% In fact \qed will only work in those environments which provide access to
% the right hand side of the page. In other words, wherever you think
% "\hfill\square" ought to work then \qed will; of course it is just because
% that naive method doesn't work that this macro file is needed at all.
% The macro was designed to solve the problem in the case of "unrestricted
% horizontal mode" (ie at the end of a paragraph); it also works in $$
% displays by pretending to be an equation number. In most other cases it
% basically does "\hfill\square" or "\hfill$\square$" and hopes for the best.

% If you have to put \qed outside the environment, it may be appropriate to
% put \vskip-\baselineskip before it, unless of course this would over-print.
% There is, however, still a danger that TeX will break the page here.
% This seems to be unavoidable if the environment ends with a \penalty.

% The eqnarray example above does not in fact work: if you try it you'll
% get "! Paragraph ended before \llap was complete" with LaTeX in a mess.
% This is a very common place where you might want to put the end of proof
% mark, and I also consider that the fourth column should be available for
% "reasons" for equational steps.  The following substitute for \eqnarray
% allows this, whilst being compatible with automatic numbering. I have
% proposed it to Rainer Sch\"opf for inclusion in LaTeX. If you want to
% use it, please copy it to another file rather than uncommenting it here.
% Don't forget to use \makeatletter or put it in a documentstyle (.sty) file.
%
% \def\eqnarray{\stepcounter{equation}\let\@currentlabel\theequation
% \global\@eqnswtrue\m@th\global\@eqcnt\z@\tabskip\@centering\let\\\@eqncr
% $$\halign to\displaywidth\bgroup\@eqnsel\hskip\@centering$\displaystyle
% \tabskip\z@{##}$&\global\@eqcnt\@ne\hskip 2\arraycolsep \hfil${##}$\hfil
% &\global\@eqcnt\tw@\hskip2\arraycolsep$\displaystyle\tabskip\z@{##}$\hfil
% \tabskip\@centering&%
%       \global\@eqcnt\thr@@\hbox to\z@\bgroup\hss##%*** instead of "\llap{##}"
% \tabskip\z@\cr}%
% \def\@@eqncr{\let\@tempa\relax
% \ifcase\@eqcnt \def\@tempa{& & &}\or \def\@tempa{& &}%
%       \or\def\@tempa{&}\else\@eqnswfalse%*** instead of "\else\def\@tempa{&}"
% \fi\@tempa\if@eqnsw\@eqnnum\stepcounter{equation}\fi
%       \egroup%*** added, to match \bgroup in fourth cell of preamble
% \global\@eqnswtrue\global\@eqcnt\z@\cr}

% Why can't we do all of this with \endProof? Because by that stage
% the damage has been done: the environments, paragraphs or
% displays have already been closed and their \hbox'es added
% to the current vertical list, and cannot be removed for
% alteration if this is the current page.

% Even if you don't need to put \qed inside an inner environment
% to avoid a blank line, it's still a good idea to do so, because
% otherwise it's possible that intervening end-of-environment
% material may allow TeX to put the mark on the next page.

% This file may be called QED.sty, QED.tex, qed.sty or qed.tex.
% It may be loaded using \input, \usepackage or as a \documentstyle option,
% as it is careful to handle the \catcode of @ appropriately.

% If you don't use theorem.sty, this file instead provides options to use
% commands to begin theorems, instead of enclosing them in environments,
% and to suppress numbering and italicisation. A rudimentary version of
% \newtheorem for plain TeX is also implemented (always using commands
% rather than environments).

% At the end of the file some useful \newtheorem
% commands are listed but not executed.

% NB \Theorem\Proof\endProof\qed will print the second square, whereas
% \begin{Theorem}\end{Theorem}\begin{Proof}\end{Proof}\qed will not.

%=========================================================================
% Make @ letter, saving its old code to restore at the end of this file.
% Look for this towards the end of the file if you think something's missing!
% "plain.tex" defines \lq as a synonym for back quote (character constant);
% I use it to avoid corruption when sending TeX files by email via BITNET.
\edef\qedrestoreat{\noexpand\catcode\lq\noexpand\@=\the\catcode\lq\@}%%
\catcode\lq\@=11

% in LaTeX, \protect the user commands;
% in plain TeX, ensure that it is defined.
\ifx\protect\undefined\let\protect\relax\fi

%=========================================================================

%                               OPTIONS

% These are the user commands.

\def\qed{\protect\@qed{$\qedsymbol$}}% suppressible printing of \qedsymbol
% \pushright takes an argument, which it always prints
% it is (re)defined by \WillHandleQED and \UnHandleQED below (12.4.94)

% theoremata in Euclid needed proof:    "which   was  to be shown"
\def\QED{\protect\@qed{{\rm Q.E.D.}}}%  "quod   erat  demonstrandum"

% but problemata needed construction:   "which   was  to be found"
\def\QEI{\protect\@qed{{\rm Q.E.I.}}}%  "quod   erat  inveniendum"

% alternatively:                        "which   was  to be done/made"
\def\QEF{\protect\@qed{{\rm Q.E.F.}}}%  "quod   erat  faciendum"

% a LaTeX environment
\def\Proof{\protect\@Proof}\def\endProof{\protect\@endProof}%
\let\proof\Proof\let\endproof\endProof


% These are the user-settable parameters.

% The actual (maths) symbol used by \qed
\def\qedsymbol{\square}% PLEASE NOTE: this is in the AMS symbols font.
%\def\qedsymbol{\blacksquare}%  use one of these instead
%\def\qedsymbol{\hbox{\rm Q.E.D.}}%        if you prefer
%\def\qedsymbol{\dashv}% this is what the Journal of Symbolc Logic likes.

% This is the text used by \Proof.
% A new paragraph is begun without indentation.
% Change it to {\kern\parindent\sc D\'emonstration: } if you like.
\def\TheWordProof{\bf Proof\enskip}

% This is the font command used for the text of proofs
\def\ProofFont{}

% The command \AutoQEDtrue causes a \qed in \end{Theorem}, so you do
%       \begin{Theorem} ... \begin{Proof} ... \end{Proof} \end{Theorem}
% but if you omit the proof, the statement gets a little square at the end.
\newif\ifAutoQED\AutoQEDfalse

% The remaining options are redundant with theorem.sty
% so are not defined if this has been loaded.
\newif\ifNumberResults
\ifx\theorem@style\undefined
   %
   % How to print the name (#1), number (#2) and attribution (#3) of a theorem.
   \NumberResultstrue
   % If the number (#2) is absent, "\unskip" removes the
   % unwanted space "\ " from before it (16 Feb 1993).
   \def\TheoremHeader#1#2#3{\bf #1\ifNumberResults\ #2\unskip\fi#3}
   %
   % This is the font command used for the text of theorem enunciations
   % change to {\rm} or {\small} if you like.
   \def\TheoremFont{\it}
   %
   % The command \NumberResultsfalse will suppress theorem numbering.
   %
   % The command \TheoremsAsCommands will allow you to write
   % \Theorem instead of \begin{Theorem} ... \end{Theorem}.
   % In this case italicisation is suppressed by default.
   % To do this with theorem.sty would involve rewriting the substyles.
   %
   % WARNING: if you subsequently redefine \TheoremFont, and use the command
   % instead of the environment, the font will remain in force afterwards!
\fi

% The document style option "theorems-as-commands" will allow you to
% write \Theorem instead of \begin{Theorem} ... \end{Theorem}.
% Moved here from further down. 10 Jan 1994
\def\TheoremsAsCommands{%
  \def\TheoremFont{}% suppress italicised theorems.
  \def\begin@theorem##1{%
     \par\removelastskip\smallskip
     \save@set@qed % enable \qed
     \noindent{##1}% the name
     %\TheoremFont % italicise at your own risk!
   }%
  \def\@endtheorem{\ifAutoQED\qed\fi\restore@qed}%
}%

\expandafter\let\csname ds@theorems-as-commands\endcsname\TheoremsAsCommands

%=========================================================================
%  If you already have a macro called \qed, \endproof or \pushright
%  which is laid out in a similar way to the following two definitions
%  (but with \hbox@pushright incorporated) then it is almost certainly
%  my code, which has been copied anonymously via numerous people since
%  my Cambridge PhD thesis in August 1986. Belated acknowledgements to
%  Chris Thompson of the Cambridge University Computing Service for his
%  help with my early attempts at TeX, in particular this problem.

%  The complexity of the macro necessary to get a little box on the
%  right-hand-side at the end of a proof is amazing.  It really does
%  have to be this long!  Otherwise you're liable to get it at the
%  beginning of the next line, or even on the next page. 

\def\parag@pushright#1{{% set up
    \parfillskip=0pt            % so \par doesnt push \square to left
    \widowpenalty=10000         % so we dont break the page before \square
    \displaywidowpenalty=10000  % ditto
    \finalhyphendemerits=0      % TeXbook exercise 14.32
    %
    %                   horizontal
    %\leavevmode                % not needed since we now only use it in hmode
    \hbox@pushright             % this used to be incorporated
    #1%                         % the end-of-proof mark (or whatever)
    %
    %                     vertical
    \par}}%                     % build paragraph with the above parameters

\def\hbox@pushright{% horizontal
    \unskip                     % remove previous space or glue
    \nobreak                    % don't break lines
    \hfil                       % ragged right if we spill over
    \penalty50                  % discouragement to do so
    \hskip.2em                  % ensure some space
    \null                       % anchor the following \hfill
    \hfill                      % push \square to right
}%

% Ideally \endProof should do all this. We should be able to add the symbol
% to the last line after the paragraph, display or whatever other structure
% has been completed and we've returned to vertical mode. This isn't possible
% on the current page (outer vmode) because \lastbox doesn't work there.

% But \ifinner is true inside a \vbox, \vadjust or \insert (LaTeX \parbox,
% minipage, figure or table), and in these circumstances we can use \lastbox.
% We would have to strip & restore glue & penalties (\insert, \mark and \write
% are obstacles to this) to get access to the last line (box), which may
% still not have the correct baseline. We could check its natural width
% against the page width, but if we re-set it, centering and (right)
% justification might be disturbed. Is this worth the trouble?
\def\vbox@pushright#1{\expandafter\message %  (2 Jan 1994)
  {QED.sty could be improved in this case (line \the\inputlineno): please ask}%
  \page@pushright{#1}}%

% Using this method the Proof environment could be implemented by collecting
% the entire proof in its own \vbox, modifying that and \unvbox'ing it to the
% current page. This approach may lead to the following problems:
%   (i) footnotes, floats, marginpars, labels and index items may be lost;
%  (ii) overflow of TeX's main memory, especially if \end{Proof} is missing;
% (iii) I don't know how page-breaking would be handled.

%========================================================================

% Switch to enable/suppress \qedsymbol; since suppression may be done
% within a nested scope it must be global, so we do our own save/restore
% in a symbol which is local to the Proof environment.
% On first use, we check to see whether an obsolete version of Paul.sty
% is around, and complain loudly if it is, because they interfere seriously.

\newif\if@qed\@qedfalse
\def\save@set@qed{\check@pt@sty@v\let\saved@ifqed\if@qed\global\@qedtrue}%
\def\restore@qed{\global\let\if@qed\saved@ifqed}

% prefer proofs with statements if possible - hence \penalty700
% the only essential part of this is \save@set@qed
\def\@Proof{%
   \par\removelastskip\smallskip\penalty700
   \save@set@qed
   \noindent\ProofFont{\TheWordProof\enskip}%
}%

\def\@endProof{%
   \qed\restore@qed
   \penalty-700 \smallskip
}

\def\@qed#1{\check@pt@fm@thm
\if@qed                                 % have we already done \qed?
     \global\@qedfalse\pushright{#1}%  - no  - do it now, but not again
\else\ifhmode\ifinner\else\par\fi\fi%  - yes - just end paragraph, if any
\fi}

% \pushright{text} always prints its argument, on the far right, in text mode
\def\@pushright#1{%
  \ifvmode
       \ifinner\vbox@pushright{#1}% vertical mode (see comments above)
       \else   \page@pushright{#1}%
       \fi
  \else\ifmmode\maths@pushright{\hbox{#1}}% maths (force a text argument)
       \else\ifinner\hbox@pushright{#1}%  inside an \hbox
            \else\parag@pushright{#1}%    in a paragraph
  \fi  \fi  \fi
}% (22 Feb 1993) removed extra {} which would destroy our \] below

% In the \hbox and maths cases we are really at the mercy of the environment.
% Assuming that we have $\qed$ simply embedded in a paragraph, the horizontal
% processing by \hbox@pushright will at least make sure that the square isn't
% at the beginning of the line, but we can't stop it being on the next page.
% However it is more likely that the reason why we're in maths mode is that
% we're inside an eqnarray or similar, in which case \hfill will do its best
% to put the square on the right of the available space. (See \vadjust below.)
\def\maths@pushright#1{%
  \ifinner
     \hbox@pushright{#1}%
  \else
     \eqno#1%   use TeX's right equation number feature (\eqno) within $$.
     \def\]{$$\ignorespaces}%    suppress LaTeX's error checking (HACK!)
  \fi
}% (22 Feb 1993) removed extra {} which would destroy our \] above

% outer vertical mode (the current page)
% There's very little we can do in these circumstances!
% Penalties still allow the page to be broken.
% If the user has put negative glue in, leave it alone. (15 Feb 1994)
\def\page@pushright#1{% 18 Jan 1994
  %\unpenalty % ineffective
  \skip@\lastskip
  \ifdim\skip@>\z@
       \unskip    % remove \parskip, but only (15 Feb 1994) if it's positive
  \else\skip@\z@\relax
  \fi
  %\unpenalty % TeX won't let me do this
  \dimen@\baselineskip
  \advance\dimen@-\prevdepth            % save \prevdepth to make a strut
  \nobreak                              % don't break the page here
  \nointerlineskip
  \hbox to\hsize{%
    \setbox\z@\null
    \ifdim\dimen@>\z@\ht\z@\dimen@\fi   % simulate \baselineskip
    \box\z@
    \hfill
    #1}%
  \vskip\skip@                  % replace old \parskip
}%

% An idea that didn't work: see TeXbook p188. (16 Feb 1993)
% Use \predisplaysize to find out the width of the previous box,
% in the case where it has already been completed.
% But this can only be used inside displays ($$), and a display in
% vertical mode begins a paragraph first, so we end up with
% \predisplaysize=\parindent+2em whatever happened in the previous
% paragraph.

% Another idea: it may be worth trying \vadjust, if only to insert \nobreak.
% The problem with this is that if we are too deeply nested in horizontal
% or maths lists, the adjustment may not be able to find its way out to the
% enclosing vertical list. In the case of array-like environments, it will
% appear (assuming it manages to get out) after the current row of the array.

%===========================================================================
% We have to add to the theorem environments the commands to enable \qed.
% This is done by re-defining \@thm#1#2.
% Note that Mittelbach's theorem.sty re-defines \@thm and \@endtheorem, so
% that must be loaded before us, otherwise our changes will get over-written
% and \qed will never be enabled.
% Paul.sty didn't use this method of gaining control inside a theorem,
% whereas it did define \qed and \pushright, so here is the one place
% where we can check for it.

\ifx\nonqed@thm\undefined % otherwise double loading causes a loop 22 Feb 1993
   \let\nonqed@thm\@thm % save original
   \let\nonqed@endthm\@endtheorem
\fi

\def\@thm{\save@set@qed\nonqed@thm}%
\def\@endtheorem{\ifAutoQED\qed\fi\restore@qed\nonqed@endthm}%

%===========================================================================
% "CENTERING" ENVIRONMENTS - 
% those which don't give their contents access to the right hand side
% of the page, such as center, picture, ...  (12 April 1994)

% Each individual environment (both the standard ones and those defined
% by the user) needs to co-operate in order to make \qed and \pushright work.
% It is not the business of this package to rewrite LaTeX in this way,
% but the following mechanism may be inserted in to other environments.
%  - put \WillHandleQED in the \begin part of the environment definition;
%    then if a \qed occurs in the body of the environment it is stored
%    in \QEDbox until...
%  - \HandleQED anywhere in the \end part of the environment definition
%    (even inside dollars, braces or another environment) prints it.
%
% For example:
% \newenvironment{qedpicture}%
%    {\begin{picture}\WillHandleQED}%
%    {\put(0,0){\HandleQED}\end{picture}}
%
% To make this compatible with *not* loading QED.sty,
% add the following to macro files which use \WillHandleQED and \HandleQED:
%   \ifx\WillHandleQED\undefined
%      \let\WillHandleQED\relax
%      \let\HandleQED\relax
%      \let\UnHandleQED\relax % if you use it
%      \let\QEDbox\voidb@x    % must have \makeatletter here!
%   \fi
%
% \UnHandleQED restores normal processing; this may be useful for
% the minipage environment, which has its own notion of "right hand side"
% of the page.
%
% The width of the saved \qed is available for testing as \wd\QEDbox

\newbox\qed@box % the box in which to save \qed for special handling

\def\WillHandleQED{\relax
\ifx\HandleQED\nohandle@qed
   % no enclosing environment has declared \WillHandleQED
   \def\pushright{\global\setbox\qed@box\hbox}% \qed will be saved
   \let\QEDbox\qed@box % point at the right box
   \def\HandleQED{\unhbox\QEDbox}% print it
   \aftergroup\check@handle@qed  % check that this really gets done
\else
   % an enclosing environment already wants to catch \qed
   % \HandleQED doesn't print anything - let the saved \qed pass through
   \let\QEDbox\voidb@x % by pointing at an empty box
\fi}

\def\nohandle@qed{%
\errhelp{One of them is missing: see QED.sty.}%
\errmessage{This environment uses \string\WillHandleQED\space and
\string\HandleQED\space incorrectly}}

\def\check@handle@qed{\relax
\ifvoid\qed@box\else\expandafter\nohandle@qed\fi}

\def\UnHandleQED{%
\let\HandleQED\nohandle@qed
\let\QEDbox\voidb@x
\def\pushright{\protect\@pushright}}%

\UnHandleQED

%===========================================================================
% Check for obsolete versions and clashes of this and other macro files.
% Why do I do this? Because of those people who complain to me that
% something doesn't work but refuse to read the manual, and those
% who refuse to update their software, and then publish papers with
% commutative diagrams full of the bugs which I fixed several years ago.

\def\obsolete@pt@version#1{\errhelp={%
%     *****************************************************************
%     *            The master version is available by                 *
        Anonymous FTP ftp.dcs.qmw.ac.uk /pub/tex/contrib/pt/tex/#1}%*
%     *****************************************************************
\errmessage{You have an obsolete version of #1 - please get a new one}}%

% First check QED.sty
%\ifnum\year>1996 \obsolete@pt@version{QED.sty}\fi

% If theorem.sty hasn't been loaded, arrange to check it again in \@qed.
% And check (then) whether you've actually defined \square.
% changed 2 June 1993: don't define it now, as that would confuse amssymb.sty
\ifx\theorem@style\undefined
   \def\check@pt@fm@thm{\relax
     \ifx\square\undefined
       \gdef\square{\bigcirc
          \errhelp={Anonymous ftp e-math.ams.com /ams/amsfonts}%
          \errmessage{\string\square\space is an AMS symbol}%
          \global\let\square\bigcirc}%
     \fi
      \ifx\theorem@style\undefined
          \global\let\check@pt@fm@thm\relax
      \else\errhelp={The macros \@thm and \@endtheorem need to be re-defined.}%
          \errmessage{QED.sty must be loaded AFTER theorem.sty but before
           using \string\newtheorem}%
      \fi
      \global\let\check@pt@fm@thm\relax
      }%
\else
   \def\check@pt@fm@thm{%
      \ifx\square\undefined
         \def\square{\bigcirc
         \errhelp={Anonymous ftp e-math.ams.com /ams/amsfonts}%
         \errmessage{\string\square\space is an AMS symbol}%
         \global\let\square\bigcirc}%
      \fi
      \global\let\check@pt@fm@thm\relax
      }%
\fi

% Check for Paul.sty, which SERIOUSLY conflicts with this file.
% and also for version 2 or version 3 of commutative diagrams.
\def\check@pt@sty@v{%
   \relax
   \ifx\@@begintheorem\undefined
   \else\message{*** QED.sty and the old Paul.sty seriously conflict! ***}%
        \obsolete@pt@version{Paul.sty}%
   \fi
   \ifx\execHorizontalMap\undefined
        \gdef\obsolete@pt@version##1{}% it's no longer needed
   \else\global\let\di@gr@m\diagram
        \gdef\diagram{\obsolete@pt@version{diagrams.tex}\di@gr@m}%
   \fi
   \global\let\check@pt@sty@v\relax
}%

%===========================================================================

% Define some standard ``theorem'' types.

\def\DefineStandardTheorems{%
%
% First set up uniform numbering in LaTeX;
% don't use this in plain TeX because this usage of \newcommand is not
% supported and we have already done by hand what it would do in LaTeX,
% viz to define the macro \theResult and the count \c@Result.
\relax\ifx\@@thm\undefined
        \newtheorem{Result}{Result}[subsection]%
        \@addtoreset{Result}{section}%
        \ifx\chapter\undefined\else\@addtoreset{Result}{chapter}\fi
\fi
%
\let\theUnnumbered\relax\countdef\c@Unnumbered255 \def\p@Unnumbered{}%
\let\DefineStandardTheorems\relax
%
\newtheorem{Answer}[Result]{Answer}%
\newtheorem{Answers}[Result]{Answers}%
\newtheorem{Conjecture}[Result]{Conjecture}%
\newtheorem{Construction}[Result]{Construction}%
\newtheorem{Convention}[Unnumbered]{Convention}%
\newtheorem{Corollary}[Result]{Corollary}%
\newtheorem{Counterexample}[Result]{Counterexample}%
\newtheorem{Definition}[Result]{Definition}%
\newtheorem{Example}[Result]{Example}%
\newtheorem{Examples}[Result]{Examples}%
\newtheorem{Exercise}[Result]{Exercise}%
\newtheorem{Exercises}[Result]{Exercises}%
\newtheorem{Fact}[Result]{Fact}%
\newtheorem{Facts}[Result]{Facts}%
\newtheorem{Lemma}[Result]{Lemma}%
\newtheorem{NB}[Unnumbered]{NB}%
\newtheorem{Notation}[Result]{Notation}%
\newtheorem{Note}[Unnumbered]{Note}%
\newtheorem{Observation}[Result]{Observation}%
\newtheorem{Observations}[Result]{Observations}%
\newtheorem{Problem}[Result]{Problem}%
\newtheorem{Proposition}[Result]{Proposition}%
\newtheorem{PS}[Unnumbered]{PS}%
\newtheorem{Remark}[Result]{Remark}%
\newtheorem{Question}[Result]{Question}%
\newtheorem{Questions}[Result]{Questions}%
\newtheorem{Theorem}[Result]{Theorem}%
\newtheorem{Thesis}[Result]{Thesis}%
\newtheorem{Warning}[Result]{Warning}%
}

%===========================================================================
% Interaction with LaTeX2e (2 Jan 1994)

\ifx\newtheorem\undefined\else\ifx\ProvidesPackage\undefined
   \message{^^J^^J}%
   \message{****************************************************************}%
   \message{! ***** You are using an obsolete implementation of LaTeX ******}%
   \message{* A new version - called LaTeX2e - has been available from TeX *}%
   \message{* FTP archives such as ftp.tex.ac.uk, ftp.uni-stuttgart.de and *}%
   \message{* pip.shsu.edu since December 1993. It incorporates NFSS2 (the *}%
   \message{* Mittelbach-Schoepf New Font Selection Scheme) but is reverse *}%
   \message{* compatible with LaTeX versions 2.09 and is now the standard. *}%
   \message{****************************************************************}%
   \message{^^J^^J}%
\else
   \ProvidesPackage{QED}[1996/06/24 right-justified end-of-proof mark]%
   %\ProvidesFile{QED.sty}% I don't understand what this is for
   \DeclareOption{roman-theorems}{\def\TheoremFont{\rm}}%
   \DeclareOption{italic-theorems}{\def\TheoremFont{\it}}%
   \DeclareOption{theorems-as-commands}{\TheoremsAsCommands}%
   \DeclareOption{auto-QED}{\AutoQEDtrue}%
   \DeclareOption{explicit-QED}{\AutoQEDfalse}%
   \DeclareOption{number-theorems}{\NumberResultstrue}%
   \DeclareOption{dont-number-theorems}{\NumberResultsfalse}%
   \DeclareOption{black-square}{\def\qedsymbol{\blacksquare}}%
   \DeclareOption{open-square}{\def\qedsymbol{\square}}%
   \DeclareOption{define-standard-theorems}{\DefineStandardTheorems}%
   \ProcessOptions
\fi\fi

%===========================================================================
% If Mittelbach's theorem.sty is loaded, skip the rest of the file.
\ifx\theorem@style\undefined\else\qedrestoreat\expandafter\endinput\fi
%===========================================================================

% Allow the user to suppress italicisation and numbering.

% The following two macros are called by LaTeX to begin a theorem
% respectively with and without an optional (``attribution'') argument.
% It is clear from latex.tex that they are intended to be customised.
% The code common to the two has been taken out as \begin@theorem and
% \TheoremHeader. Of these, the former is re-defined by \TheoremsAsCommands.

\def\@opargbegintheorem#1#2#3{\begin@theorem{\TheoremHeader{#1}{#2}{ (#3)} }}

\def\@begintheorem#1#2{\begin@theorem{\TheoremHeader{#1}{#2}{} }}

\def\begin@theorem#1{%
  \trivlist\item[\hskip\labelsep {#1}]%         % LaTeX likes this method.
  \TheoremFont                                  % Italicise the enunciation
  \ifx\ProofFont\empty\def\ProofFont{\rm}\fi    % but not any nested proof.
  }%


%%% Here's what LaTeX (92/1/14) does:
%%%% RmS 91/08/14 Moved \it after \item to make it work with NFSS
%%\def\@begintheorem#1#2{\trivlist \item[\hskip \labelsep{\bf #1\ #2}]\it}
%%\def\@opargbegintheorem#1#2#3{\trivlist
%%      \item[\hskip \labelsep{\bf #1\ #2\ (#3)}]\it}
%%\def\@endtheorem{\endtrivlist}



%===========================================================================
% If we're running under LaTeX, skip the rest of the file.
\ifx\newtheorem\undefined\else\qedrestoreat\expandafter\endinput\fi
%===========================================================================

% This implements a rudimentary version of \newtheorem for plain TeX.
% Only the unattributed theorems and the
% declarations \newtheorem{Theorem}[Result]{Theorem} and
% \newtheorem{Convention}[Unnumbered]{Convention} are supported.
% The numbering is based on the counts \chapternumber, \sectionnumber
% and \subsectionnumber, which it is up to you to define with \newcount.
% It's also up to you to reset \c@Result at the beginning of each section.

% Form the number: (chapter).(section).(subsection).(#1)
% where any of the first three parts which is zero
% negative or undefined is omitted.
\def\ther@sult#1{%
\ifx\chapternumber\undefined\else
   \ifnum\chapternumber>0 \number\chapternumber.\fi\fi
\ifx\sectionnumber\undefined\else
   \ifnum\sectionnumber>0 \number\sectionnumber.\fi\fi
\ifx\subsectionnumber\undefined\else
   \ifnum\subsectionnumber>0 \number\subsectionnumber.\fi\fi
\expandafter\number\csname c@#1\endcsname}%

% plain version of LaTeX's \@thm
\def\plain@thm#1#2{% #1=counter, #2=text
  \save@set@qed
  \expandafter\advance\csname c@#1\endcsname1
  \@begintheorem{#2}{\csname the#1\endcsname}%
}%

% Rudimentary \newtheorem
\def\newtheorem#1[#2]#3{%   #1=command, #2=counter, #3=text
  %
  % \def\#1{\plain@thm{#2}{#3}}
  \expandafter\def\csname #1\endcsname{\plain@thm{#2}{#3}}%
  %
  % \def\end#1{\@endtheorem}
  \expandafter\def\csname end#1\endcsname{\@endtheorem}%
  %
  % if \c@#2 is not defined
  %    \newcount\c@#2
  %    \def\the#2{\ther@sult{#2}}
  \expandafter\ifx\csname c@#2\endcsname\relax
     \expandafter\expandafter\csname newcount\endcsname
        \csname c@#2\endcsname
     \expandafter\def\csname the#2\endcsname{\ther@sult{#2}}%
  \fi
}%

\TheoremsAsCommands

\qedrestoreat\endinput

%===========================================================================
% BUGS
% \item\qed\end{letterlist} puts the square above the item label.

% ! You can't use `\unskip' in vertical mode.
% from \qed in a paragraph on its own.