Allow configuration of theorem numbering.
[mdwtools] / mdwthm.dtx
1 % \begin{meta-comment}
2 %
3 % $Id: mdwthm.dtx,v 1.4 2003/09/06 11:25:54 mdw Exp $
4 %
5 % Standard theorem typesetting
6 %
7 % (c) 2001 Mark Wooding
8 %
9 %----- Revision history -----------------------------------------------------
10 %
11 % $Log: mdwthm.dtx,v $
12 % Revision 1.4 2003/09/06 11:25:54 mdw
13 % Allow configuration of theorem numbering.
14 %
15 % Revision 1.3 2003/09/05 16:16:20 mdw
16 % Various nips and tucks. Redefine theorem styles from scratch now.
17 %
18 % Revision 1.2 2002/02/24 12:35:55 mdw
19 % Fix handling of \chapter, in case some idiot has said `\csname
20 % chapter\endcsname'.
21 %
22 % Revision 1.1 2002/02/03 20:49:03 mdw
23 % Checkin for new build system.
24 %
25 %
26 % \end{meta-comment}
27 %
28 % \begin{meta-comment} <general public licence>
29 %%
30 %% mdwthm package -- standard theorem stuff
31 %% Copyright (c) 2001 Mark Wooding
32 %%
33 %% This program is free software; you can redistribute it and/or modify
34 %% it under the terms of the GNU General Public License as published by
35 %% the Free Software Foundation; either version 2 of the License, or
36 %% (at your option) any later version.
37 %%
38 %% This program is distributed in the hope that it will be useful,
39 %% but WITHOUT ANY WARRANTY; without even the implied warranty of
40 %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41 %% GNU General Public License for more details.
42 %%
43 %% You should have received a copy of the GNU General Public License
44 %% along with this program; if not, write to the Free Software Foundation,
45 %% Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
46 % \end{meta-comment}
47 %
48 % \begin{meta-comment} <Package preambles>
49 %<+package>\NeedsTeXFormat{LaTeX2e}
50 %<+package>\ProvidesPackage{mdwthm}
51 %<+package> [2001/09/16 1.0 theorem typesetting]
52 %<+thmstyle>\ProvidesFile{mdwmargin.thm}
53 %<+thmstyle> [2001/09/16 1.0 numbers-in-the-margin theorem style]
54 % \end{meta-comment}
55 %
56 % \CheckSum{203}
57 %% \CharacterTable
58 %% {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
59 %% 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
60 %% Digits \0\1\2\3\4\5\6\7\8\9
61 %% Exclamation \! Double quote \" Hash (number) \#
62 %% Dollar \$ Percent \% Ampersand \&
63 %% Acute accent \' Left paren \( Right paren \)
64 %% Asterisk \* Plus \+ Comma \,
65 %% Minus \- Point \. Solidus \/
66 %% Colon \: Semicolon \; Less than \<
67 %% Equals \= Greater than \> Question mark \?
68 %% Commercial at \@ Left bracket \[ Backslash \\
69 %% Right bracket \] Circumflex \^ Underscore \_
70 %% Grave accent \` Left brace \{ Vertical bar \|
71 %% Right brace \} Tilde \~}
72 %%
73 %
74 % \begin{meta-comment}
75 %
76 %<*driver>
77 \input{mdwtools}
78 \describespackage{mdwthm}
79 \mdwdoc
80 %</driver>
81 %
82 % \end{meta-comment}
83 %
84 %^^A-------------------------------------------------------------------------
85 % \section{User guide}
86 %
87 % \subsection{Environments provided}
88 %
89 % \DescribeEnv{theorem}
90 % \DescribeEnv{lemma}
91 % \DescribeEnv{proposition}
92 % \DescribeEnv{corollary}
93 % \DescribeEnv{definition}
94 % \DescribeEnv{example}
95 % \DescribeEnv{fact}
96 % \DescribeEnv{remark}
97 % \DescribeEnv{note}
98 % The package defines a collection of theorem environments, declared in the
99 % usual way. All of them except \env{claim} share the same counter. If the
100 % document class has a |\chapter| command, then they are numbered within the
101 % chapter; otherwise there is a single numbering system throughout the
102 % document.
103 %
104 % Every environment has a $*$-version, which doesn't print a number. This
105 % might be useful every now and then.
106 %
107 % The environments \env{theorem}, \env{lemma}, \env{proposition},
108 % \env{claim}and \env{corollary} are set using the `plain' style, with the
109 % body text in \textit{italics}. The environments \env{definition} and
110 % \env{example} are set in the `definition' style, with body text in roman.
111 % The remaining environments, \env{fact}, \env{remark}, and \env{note} are
112 % set in the `remark' style.
113 %
114 % \DescribeEnv{claim}
115 % \DescribeEnv{proof}
116 % The \env{claim} environment has its own counter, which is reset at the
117 % beginning of the \env{proof} environment. If you say |\qed| in a
118 % \env{proof} environment then it uses your symbol; otherwise it adds its own
119 % at the end.
120 %
121 % \subsection{Options}
122 %
123 % The package takes an option \syntax{"within="<counter>} -- number theorems
124 % within \<counter>. If this isn't given, a default is chosen -- either
125 % numbering in chapters, or global numbering. The \lit*{notwithin} option
126 % forces global numbering.
127 %
128 % \subsection{The \package{mdwmargin} style}
129 %
130 % This package also provides a pretty `number-hanging-in-the-margin' theorem
131 % style collection, available under the name \env{mdwmargin}.
132 %
133 % \implementation
134 %
135 %
136 %^^A-------------------------------------------------------------------------
137 % \section{Implementation of the environments}
138 %
139 % \begin{macrocode}
140 %<*package>
141 \RequirePackage{mdwkey}
142 \if1%
143 \ifx\if@article\iftrue0
144 \else\ifx\chapter\@@undefined0
145 \else\ifx\chapter\relax0
146 \else1\fi\fi\fi
147 \def\mt@within{[chapter]}
148 \else
149 \def\mt@within{}
150 \fi
151 \mkdef{mdwthm:opt}{within}{\def\mt@within{[#1]}}
152 \mkdef{mdwthm:opt}{notwithin}*{\def\mt@within{}}
153 \mkdef*{mdwthm:opt}{\PassOptionsToPackage{#1=#2}{amsthm}}
154 \mkdef*{mdwthm:opt}*{\PassOptionsToPackage{#1}{amsthm}}
155 \def\mt@opt#1{\mkparse{mdwthm:opt}{#1}}
156 \DeclareOption*{\expandafter\mt@opt\expandafter{\CurrentOption}}
157 \ProcessOptions
158 \RequirePackage{amsthm}
159 % \end{macrocode}
160 %
161 % \subsection{The simple bits}
162 %
163 % \begin{environment}{theorem}
164 %
165 % Do the right thing with the numbering rules.
166 %
167 % \begin{macrocode}
168 \edef\next@{\noexpand\newtheorem{theorem}{Theorem}\mt@within}\next@
169 \newtheorem*{theorem*}{Theorem}
170 % \end{macrocode}
171 %
172 % \end{environment}
173 %
174 % \begin{environment}{lemma}
175 % \begin{environment}{proposition}
176 % \begin{environment}{corollary}
177 % \begin{environment}{claim}
178 % \begin{environment}{definition}
179 % \begin{environment}{example}
180 % \begin{environment}{fact}
181 % \begin{environment}{remark}
182 %
183 % Most of this is very easy.
184 %
185 % \begin{macrocode}
186 \theoremstyle{plain}
187 \newtheorem{lemma}[theorem]{Lemma}
188 \newtheorem*{lemma*}{Lemma}
189 \newtheorem{proposition}[theorem]{Proposition}
190 \newtheorem*{proposition*}{Proposition}
191 \newtheorem{corollary}[theorem]{Corollary}
192 \newtheorem*{corollary*}{Corollary}
193 \newtheorem{fact}[theorem]{Fact}
194 \newtheorem*{fact*}{Fact}
195 \newtheorem{claim}{Claim}
196 \newtheorem*{claim*}{Claim}
197 % \end{macrocode}
198 %
199 % \begin{macrocode}
200 \theoremstyle{definition}
201 \newtheorem{definition}[theorem]{Definition}
202 \newtheorem*{definition*}{Definition}
203 \newtheorem{example}[theorem]{Example}
204 \newtheorem*{example*}{Example}
205 % \end{macrocode}
206 %
207 % \begin{macrocode}
208 \theoremstyle{remark}
209 \newtheorem{remark}[theorem]{Remark}
210 \newtheorem*{remark*}{Remark}
211 % \end{macrocode}
212 %
213 % \end{environment}
214 % \end{environment}
215 % \end{environment}
216 % \end{environment}
217 % \end{environment}
218 % \end{environment}
219 % \end{environment}
220 % \end{environment}
221 %
222 % \begin{environment}{note}
223 %
224 % Someone else might also have a \env{note} environment. Be careful.
225 %
226 % \begin{macrocode}
227 \ifx\note\@@undefined
228 \newtheorem{note}[theorem]{Note}
229 \newtheorem*{note*}{Note}
230 \fi
231 % \end{macrocode}
232 %
233 % \end{environment}
234 %
235 % \begin{macro}{\@qedhack}
236 %
237 % Make |\qed| idempotent.
238 %
239 % \begin{macrocode}
240 \newif\if@qedsw
241 \def\@qedhack{%
242 \let\@qed@\qed%
243 \global\@qedswtrue%
244 \def\qed{\if@qedsw\global\@qedswfalse\expandafter\@qed@\fi}%
245 }
246 % \end{macrocode}
247 %
248 % \end{macro}
249 %
250 % \begin{environment}{proof}
251 %
252 % Now to hack the proof environment.
253 %
254 % \begin{macrocode}
255 \renewenvironment{proof}[1][\proofname]{%
256 \setcounter{claim}{0}%
257 \par\normalfont%
258 \ifdim\topsep<\parskip\topsep\parskip\fi%
259 \ifdim\@topsepadd<\z@\@topsepadd\z@\fi%
260 \trivlist\advance\itemindent\labelsep\let\makelabel\proofstyle%
261 \advance\@topsep-\parskip%
262 \advance\@topsepadd-\parskip%
263 \@qedhack%
264 \item[#1]%
265 }{%
266 \qed\endtrivlist%
267 }
268 % \end{macrocode}
269 % \end{environment}
270 %
271 % \begin{macro}{\proofstyle}
272 %
273 % The |\proofstyle| macro is just a style hook for typesetting the `Proof'
274 % label.
275 %
276 % \begin{macrocode}
277 \providecommand\proofstyle[1]{\textit{#1.}}
278 % \end{macrocode}
279 %
280 % \end{macro}
281 %
282 % Done.
283 %
284 % \begin{macrocode}
285 %</package>
286 % \end{macrocode}
287 %
288 %^^A-------------------------------------------------------------------------
289 % \section{Implementation of the theorem style}
290 %
291 % \begin{macrocode}
292 %<*thmstyle>
293 % \end{macrocode}
294 %
295 % \begin{macro}{\thmhead@margin}
296 %
297 % Firstly, a macro to typeset the theorem environment header, with the number
298 % in the margin.
299 %
300 % \begin{macrocode}
301 \def\thmhead@margin#1#2#3{%
302 \thmnumber{\llap{#2{\normalsize\quad}}}%
303 \thmname{#1}%
304 \thmnote{ \the\thm@notefont(#3)}%
305 }
306 % \end{macrocode}
307 % \end{macro}
308 %
309 % \begin{macro}{\thm@headfont@margin}
310 %
311 % Now to decide on the header font. Definitely we want boldface; if the
312 % documentclass (or \package{mdwfonts}) has decided on a different font
313 % family for the headings, then we use that.
314 %
315 % \begin{macrocode}
316 \def\thm@headfont@margin{%
317 \fontseries{\bfdefault}%
318 \ifx\headdefault\@@undfined\else\fontfamily\headdefault\fi%
319 \selectfont%
320 }
321 % \end{macrocode}
322 % \end{macro}
323 %
324 % \begin{macro}{\qedsymbol}
325 %
326 % Use the nice symbol if available.
327 %
328 % \begin{macrocode}
329 \AtBeginDocument{\ifx\square\@@undefined\else\def\qedsymbol{$\square$}\fi}
330 % \end{macrocode}
331 % \end{macro}
332 %
333 % \begin{macro}{\proofstyle}
334 %
335 % Typeset `Proof' in bold face.
336 %
337 % \begin{macrocode}
338 \def\proofstyle#1{{\thm@headfont@margin#1}}
339 % \end{macrocode}
340 %
341 % \end{macro}
342 %
343 % \begin{macro}{\th@base}
344 % \begin{macro}{\@endtheorem}
345 %
346 % The |\th@base| macro provides the basis for our theorem style. The
347 % argument is something to do at the end of the environment.
348 %
349 % \begin{macrocode}
350 \def\th@base#1{%
351 \let\thmhead\thmhead@margin%
352 \thm@headfont{\thm@headfont@margin}%
353 \thm@headpunct{}%
354 \advance\thm@postskip-\parskip%
355 \@qedhack%
356 \def\after@thm{#1}%
357 \normalfont%
358 }
359 % \end{macrocode}
360 %
361 % Ah, but nobody actually does anything with |\after@thm|. Let's fix that.
362 %
363 % \begin{macrocode}
364 \AtEndOfPackage{\def\@endtheorem{\after@thm\endtrivlist\@endpefalse}}
365 % \end{macrocode}
366 % \end{macro}
367 % \end{macro}
368 %
369 % \begin{macro}{\th@plain}
370 % \begin{macro}{\th@definition}
371 % \begin{macro}{\th@remark}
372 %
373 % Now this is easy. The space hacking in |\th@remark| is straight from
374 % \package{amsthm}.
375 %
376 % \begin{macrocode}
377 \AtBeginDocument{
378 \def\th@plain{\th@base\relax\itshape}
379 \def\th@definition{\th@base\qed}
380 \def\th@remark{%
381 \th@base\qed%
382 \thm@preskip\topsep\divide\thm@preskip\tw@%
383 \thm@postskip\thm@preskip%
384 }
385 }
386 %</thmstyle>
387 % \end{macrocode}
388 % \end{macro}
389 % \end{macro}
390 % \end{macro}
391 %
392 % \hfill Mark Wooding, \today
393 % \Finale
394 %
395 \endinput