% \begin{meta-comment}
%
% $Id: mdwthm.dtx,v 1.4 2003/09/06 11:25:54 mdw Exp $
%
% Standard theorem typesetting
%
% (c) 2001 Mark Wooding
%
%----- Revision history -----------------------------------------------------
%
% $Log: mdwthm.dtx,v $
% Revision 1.4  2003/09/06 11:25:54  mdw
% Allow configuration of theorem numbering.
%
% Revision 1.3  2003/09/05 16:16:20  mdw
% Various nips and tucks.  Redefine theorem styles from scratch now.
%
% Revision 1.2  2002/02/24 12:35:55  mdw
% Fix handling of \chapter, in case some idiot has said `\csname
% chapter\endcsname'.
%
% Revision 1.1  2002/02/03 20:49:03  mdw
% Checkin for new build system.
%
%
% \end{meta-comment}
%
% \begin{meta-comment} <general public licence>
%%
%% mdwthm package -- standard theorem stuff
%% Copyright (c) 2001 Mark Wooding
%%
%% This program is free software; you can redistribute it and/or modify
%% it under the terms of the GNU General Public License as published by
%% the Free Software Foundation; either version 2 of the License, or
%% (at your option) any later version.
%% 
%% This program is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%% GNU General Public License for more details.
%% 
%% You should have received a copy of the GNU General Public License
%% along with this program; if not, write to the Free Software Foundation,
%% Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
% \end{meta-comment}
%
% \begin{meta-comment} <Package preambles>
%<+package>\NeedsTeXFormat{LaTeX2e}
%<+package>\ProvidesPackage{mdwthm}
%<+package>                [2001/09/16 1.0 theorem typesetting]
%<+thmstyle>\ProvidesFile{mdwmargin.thm}
%<+thmstyle>             [2001/09/16 1.0 numbers-in-the-margin theorem style]
% \end{meta-comment}
%
% \CheckSum{203}
%% \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         \~}
%%
%
% \begin{meta-comment}
%
%<*driver>
\input{mdwtools}
\describespackage{mdwthm}
\mdwdoc
%</driver>
%
% \end{meta-comment}
%
%^^A-------------------------------------------------------------------------
% \section{User guide}
%
% \subsection{Environments provided}
%
% \DescribeEnv{theorem}
% \DescribeEnv{lemma}
% \DescribeEnv{proposition}
% \DescribeEnv{corollary}
% \DescribeEnv{definition}
% \DescribeEnv{example}
% \DescribeEnv{fact}
% \DescribeEnv{remark}
% \DescribeEnv{note}
% The package defines a collection of theorem environments, declared in the
% usual way.  All of them except \env{claim} share the same counter.  If the
% document class has a |\chapter| command, then they are numbered within the
% chapter; otherwise there is a single numbering system throughout the
% document.
%
% Every environment has a $*$-version, which doesn't print a number.  This
% might be useful every now and then.
%
% The environments \env{theorem}, \env{lemma}, \env{proposition},
% \env{claim}and \env{corollary} are set using the `plain' style, with the
% body text in \textit{italics}.  The environments \env{definition} and
% \env{example} are set in the `definition' style, with body text in roman.
% The remaining environments, \env{fact}, \env{remark}, and \env{note} are
% set in the `remark' style.
%
% \DescribeEnv{claim}
% \DescribeEnv{proof}
% The \env{claim} environment has its own counter, which is reset at the
% beginning of the \env{proof} environment.  If you say |\qed| in a
% \env{proof} environment then it uses your symbol; otherwise it adds its own
% at the end.
%
% \subsection{Options}
%
% The package takes an option \syntax{"within="<counter>} -- number theorems
% within \<counter>.  If this isn't given, a default is chosen -- either
% numbering in chapters, or global numbering.  The \lit*{notwithin} option
% forces global numbering.
%
% \subsection{The \package{mdwmargin} style}
%
% This package also provides a pretty `number-hanging-in-the-margin' theorem
% style collection, available under the name \env{mdwmargin}.
%
% \implementation
%
%
%^^A-------------------------------------------------------------------------
% \section{Implementation of the environments}
%
%    \begin{macrocode}
%<*package>
\RequirePackage{mdwkey}
\if1%
  \ifx\if@article\iftrue0
  \else\ifx\chapter\@@undefined0
  \else\ifx\chapter\relax0
  \else1\fi\fi\fi
  \def\mt@within{[chapter]}
\else
  \def\mt@within{}
\fi
\mkdef{mdwthm:opt}{within}{\def\mt@within{[#1]}}
\mkdef{mdwthm:opt}{notwithin}*{\def\mt@within{}}
\mkdef*{mdwthm:opt}{\PassOptionsToPackage{#1=#2}{amsthm}}
\mkdef*{mdwthm:opt}*{\PassOptionsToPackage{#1}{amsthm}}
\def\mt@opt#1{\mkparse{mdwthm:opt}{#1}}
\DeclareOption*{\expandafter\mt@opt\expandafter{\CurrentOption}}
\ProcessOptions
\RequirePackage{amsthm}
%    \end{macrocode}
%
% \subsection{The simple bits}
%
% \begin{environment}{theorem}
%
% Do the right thing with the numbering rules.
%
%    \begin{macrocode}
\edef\next@{\noexpand\newtheorem{theorem}{Theorem}\mt@within}\next@
\newtheorem*{theorem*}{Theorem}
%    \end{macrocode}
%
% \end{environment}
%
% \begin{environment}{lemma}
% \begin{environment}{proposition}
% \begin{environment}{corollary}
% \begin{environment}{claim}
% \begin{environment}{definition}
% \begin{environment}{example}
% \begin{environment}{fact}
% \begin{environment}{remark}
%
% Most of this is very easy.
%
%    \begin{macrocode}
\theoremstyle{plain}
\newtheorem{lemma}[theorem]{Lemma}
\newtheorem*{lemma*}{Lemma}
\newtheorem{proposition}[theorem]{Proposition}
\newtheorem*{proposition*}{Proposition}
\newtheorem{corollary}[theorem]{Corollary}
\newtheorem*{corollary*}{Corollary}
\newtheorem{fact}[theorem]{Fact}
\newtheorem*{fact*}{Fact}
\newtheorem{claim}{Claim}
\newtheorem*{claim*}{Claim}
%    \end{macrocode}
%
%    \begin{macrocode}
\theoremstyle{definition}
\newtheorem{definition}[theorem]{Definition}
\newtheorem*{definition*}{Definition}
\newtheorem{example}[theorem]{Example}
\newtheorem*{example*}{Example}
%    \end{macrocode}
%
%    \begin{macrocode}
\theoremstyle{remark}
\newtheorem{remark}[theorem]{Remark}
\newtheorem*{remark*}{Remark}
%    \end{macrocode}
%
% \end{environment}
% \end{environment}
% \end{environment}
% \end{environment}
% \end{environment}
% \end{environment}
% \end{environment}
% \end{environment}
%
% \begin{environment}{note}
%
% Someone else might also have a \env{note} environment.  Be careful.
%
%    \begin{macrocode}
\ifx\note\@@undefined
  \newtheorem{note}[theorem]{Note}
  \newtheorem*{note*}{Note}
\fi
%    \end{macrocode}
%
% \end{environment}
%
% \begin{macro}{\@qedhack}
%
% Make |\qed| idempotent.
%
%    \begin{macrocode}
\newif\if@qedsw
\def\@qedhack{%
  \let\@qed@\qed%
  \global\@qedswtrue%
  \def\qed{\if@qedsw\global\@qedswfalse\expandafter\@qed@\fi}%
}
%    \end{macrocode}
%
% \end{macro}
%
% \begin{environment}{proof}
%
% Now to hack the proof environment.
%
%    \begin{macrocode}
\renewenvironment{proof}[1][\proofname]{%
  \setcounter{claim}{0}%
  \par\normalfont%
  \ifdim\topsep<\parskip\topsep\parskip\fi%
  \ifdim\@topsepadd<\z@\@topsepadd\z@\fi%
  \trivlist\advance\itemindent\labelsep\let\makelabel\proofstyle%
  \advance\@topsep-\parskip%
  \advance\@topsepadd-\parskip%
  \@qedhack%
  \item[#1]%
}{%
  \qed\endtrivlist%
}
%    \end{macrocode}
% \end{environment}
%
% \begin{macro}{\proofstyle}
%
% The |\proofstyle| macro is just a style hook for typesetting the `Proof'
% label.
%
%    \begin{macrocode}
\providecommand\proofstyle[1]{\textit{#1.}}
%    \end{macrocode}
%
% \end{macro}
%
% Done.
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
%^^A-------------------------------------------------------------------------
% \section{Implementation of the theorem style}
%
%    \begin{macrocode}
%<*thmstyle>
%    \end{macrocode}
%
% \begin{macro}{\thmhead@margin}
%
% Firstly, a macro to typeset the theorem environment header, with the number
% in the margin.
%
%    \begin{macrocode}
\def\thmhead@margin#1#2#3{%
  \thmnumber{\llap{#2{\normalsize\quad}}}%
  \thmname{#1}%
  \thmnote{ \the\thm@notefont(#3)}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thm@headfont@margin}
%
% Now to decide on the header font.  Definitely we want boldface; if the
% documentclass (or \package{mdwfonts}) has decided on a different font
% family for the headings, then we use that.
%
%    \begin{macrocode}
\def\thm@headfont@margin{%
  \fontseries{\bfdefault}%
  \ifx\headdefault\@@undfined\else\fontfamily\headdefault\fi%
  \selectfont%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\qedsymbol}
%
% Use the nice symbol if available.
%
%    \begin{macrocode}
\AtBeginDocument{\ifx\square\@@undefined\else\def\qedsymbol{$\square$}\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\proofstyle}
%
% Typeset `Proof' in bold face.
%
%    \begin{macrocode}
\def\proofstyle#1{{\thm@headfont@margin#1}}
%    \end{macrocode}
%
% \end{macro}
%
% \begin{macro}{\th@base}
% \begin{macro}{\@endtheorem}
%
% The |\th@base| macro provides the basis for our theorem style.  The
% argument is something to do at the end of the environment.
%
%    \begin{macrocode}
\def\th@base#1{%
  \let\thmhead\thmhead@margin%
  \thm@headfont{\thm@headfont@margin}%
  \thm@headpunct{}%
  \advance\thm@postskip-\parskip%
  \@qedhack%
  \def\after@thm{#1}%
  \normalfont%
}
%    \end{macrocode}
%
% Ah, but nobody actually does anything with |\after@thm|.  Let's fix that.
%
%    \begin{macrocode}
\AtEndOfPackage{\def\@endtheorem{\after@thm\endtrivlist\@endpefalse}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\th@plain}
% \begin{macro}{\th@definition}
% \begin{macro}{\th@remark}
%
%    Now this is easy.  The space hacking in |\th@remark| is straight from
%    \package{amsthm}.
%
%    \begin{macrocode}
\AtBeginDocument{
  \def\th@plain{\th@base\relax\itshape}
  \def\th@definition{\th@base\qed}
  \def\th@remark{%
    \th@base\qed%
    \thm@preskip\topsep\divide\thm@preskip\tw@%
    \thm@postskip\thm@preskip%
  }
}
%</thmstyle>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \hfill Mark Wooding, \today
% \Finale
%
\endinput
