% \iffalse  % -*- LaTeX -*-
%% This is the thmbox package.
%% (c) Emmanuel Beffara, 2002--2005 (LPPL)
%%
%<*driver>
\documentclass{ltxdoc}
\usepackage[latin1]{inputenc}
\usepackage{url,multicol,alltt}
\usepackage{thmbox}
\title{Package \texttt{thmbox}}
\author{Emmanuel \textsc{Beffara}\\\url{manu@beffara.org}}
\date{version 2.0, April 2005}
\newtheorem[L]{thm}{Theorem}[section]
\newtheorem{cor}[thm]{Corollary}
\renewcommand\{{\char`\{}
\renewcommand\}{\char`\}}
\newcommand\mac[1]{\texttt{\string#1}}
\newcommand\kv[2]{\texttt{#1=}$\langle$\textmd{\itshape#2}$\rangle$}
\newenvironment{changelog}{%
  \def\version##1##2{%
    \stoplist%
    \par\smallskip\noindent Version ##1 (##2)%
    \let\stoplist\dostoplist%
    \startlist}
  \def\startlist{%
    \begin{list}{-- }{\topsep=0pt\parsep=0pt\itemsep=0pt}}%
  \let\stoplist\relax%
  \def\dostoplist{\end{list}}%
}{\stoplist}
\begin{document}
\DocInput{thmbox.dtx}
\end{document}
%</driver>
% \fi
%
%\maketitle
%
% \begin{abstract}
%   This package defines an environment \texttt{thmbox} aimed at presenting
%   theorems, definitions and similar objects in boxes decorated with frames
%   and various aesthetic features. The standard macro |\newtheorem| is
%   redefined to use this format.
% \end{abstract}
%
% \section{Documentation}
%
% The package is loaded like any other, by writing
% \begin{quote}
%   \ttfamily \string\usepackage[\textrm{\itshape options}]\{thmbox\}
% \end{quote}
% The option \texttt{nothm} prevents the command |\newtheorem| from being
% redefined, so theorems defined with this command keep their traditional
% aspect. All other options are considered as default formatting options, they
% can be redefined at any time using the command |\thmboxoptions|. The
% argument of this macro is a list of |key=value| pairs in the \texttt{keyval}
% style, as defined in section~\ref{sec:options}.
%
% \subsection{Examples}
%
% The package defines an environment |thmbox| that is used as follows:
% \begin{multicols}{2}
%   {\ttfamily\noindent%
%   \string\begin\{thmbox\}[L]\{The title\}\\
%   \strut~~Some text, some more text, a\\
%   \strut~~sufficient amount to get a\\
%   \strut~~full box with several lines.\\
%   \string\end\{thmbox\}}
% \columnbreak
%   \begin{thmbox}[L]{The title}
%     Some text, some more text, a sufficient amout to get a full box
%     with several lines.
%   \end{thmbox}
% \end{multicols}
% \noindent
% The argument |[L]| indicates the style of the box. The two other defined
% styles are |[M]| and |[S]|, which make respectively:
% \begin{multicols}{2}
%   \begin{thmbox}[M]{The title}
%     Some text, some more text, a sufficient amout to get a full box
%     with several lines.
%   \end{thmbox}
% \columnbreak
%   \begin{thmbox}[S]{The title}
%     Some text, some more text, a sufficient amout to get a full box
%     with several lines.
%   \end{thmbox}
% \end{multicols}
% \noindent
% Any other option from the previous list can be used in the optional
% argument.
%
% \medskip
%
% By default, loading the package \texttt{thmbox} replaces the definition of
% the \LaTeX\ command |\newtheorem|. This feature can be turned off by the
% option \texttt{nothm}. The new version has the same syntax as the standard
% one with an extra optional argument at the beginning. This argument can be
% used to specify formatting options for the optional argument of the
% \texttt{thmbox} environment. For instance, saying
% \begin{quote}
%   \ttfamily \string\newtheorem[L]\{thm\}\{Theorem\}[section]
% \end{quote}
% will produce the following aspect for the environment \texttt{thm}:
% \begin{multicols}{2}
%   {\ttfamily\noindent%
%   \string\begin\{thm\}\\
%   \strut~~Any continuous function over
%   \strut~~\$\string\mathbf\{R\}\$ is measurable.\\
%   \string\end\{thm\}}
% \columnbreak
%   \begin{thm}
%     Any continuous function over $\mathbf{R}$ is measurable.
%   \end{thm}
% \end{multicols}
% \noindent And with a title, with the defaut style, we get:
% \begin{multicols}{2}
%   {\ttfamily\noindent%
%   \string\begin\{thm\}[G\string\"odel]\ \string\label\{tg\}\%\\
%   \strut~~Any theory that contains first\\
%   \strut~~order arithmetics is undecidable.\\
%   \string\end\{thm\}}
% \columnbreak
%   \begin{thm}[Gödel]
%     \label{tg}Any theory that contains first order arithmetics is
%     undecidable.
%   \end{thm}
% \end{multicols}
% \noindent
% The default style for theorem boxes is ``|M|'', so writing
% \begin{quote}
%   \ttfamily \string\newtheorem\{cor\}[thm]\{Corollary\}
% \end{quote}
% will lead to this:
% \begin{multicols}{2}
%   {\ttfamily\noindent%
%   \string\begin\{cor\}\\
%   \strut~~Second order arithmetics\\
%   \strut~~is undecidable.\\
%   \string\end\{cor\}}
% \columnbreak
%   \begin{cor}
%     Second order arithmetics is undecidable.
%   \end{cor}
% \end{multicols}
% The package also redefines the |proof| environment. The text inside such an
% enivronment is written smaller, with extra margins, with a black square sign
% at the end. The aspect is the following:
% \begin{multicols}{2}
%   {\ttfamily\noindent%
%   \string\begin\{proof\}\\
%   \strut~~This is a consequence of the\\
%   \strut~~inclusion of PA into AF2,\\
%   \strut~~since Peano arithmetics is
%   \strut~~undecidable.\\
%   \string\end\{proof\}}
% \columnbreak
%   \begin{proof}
%     This is a consequence of the inclusion of PA into AF2,
%     since Peano arithmetics is undecidable.
%   \end{proof}
% \end{multicols}
% \noindent The |proof| environment takes an optional argument:
% \begin{multicols}{2}
%   {\ttfamily\noindent%
%   \string\begin\{proof\}[of \string\ref\{tg\}]\\
%   \strut~~This is a rather technical\\
%   \strut~~story of encodings.\\
%   \string\end\{proof\}}
% \columnbreak
%   \begin{proof}[of \ref{tg}]
%     This is a rather technical story of encodings.
%   \end{proof}
% \end{multicols}
% \noindent The |example| environment has mostly the same behaviour as
% |proof|:
% \begin{multicols}{2}
%   {\ttfamily\noindent%
%   \string\begin\{example\}\\
%   \strut~~An approach consists in\\
%   \strut~~encoding Turing machines.\\
%   \string\end\{example\}}
% \par\columnbreak
%   \noindent Bla bla bla.
%   \begin{example}
%     An approach consists in encoding Turing machines.
%   \end{example}
%   Ploum plam.
% \end{multicols}
% \noindent Its optional argument can be used to write something else than
% ``Example''. The alternative method is to redefine |\examplename|.
% \begin{multicols}{2}
%   {\ttfamily\noindent%
%   \string\begin\{example\}[Idea]\\
%   \strut~~One could also proceed by\\
%   \strut~~encoding \$\string\lambda\$-calculus.\\
%   \string\end\{example\}}
% \columnbreak
%   \begin{example}[Idea]
%     One could also proceed by encoding $\lambda$-calculus.
%   \end{example}
% \end{multicols}
%
% \begin{leftbar}
%   As an extra, on the model of the |thmbox| environment, the package
%   provides an environment |leftbar| that formats its contents with an extra
%   margin and a running vertical rule in the left.
% \end{leftbar}
%
% \subsection{Options}
% \label{sec:options}
%
% The following general options are available:
% \begin{description}
% \item[\kv{style}{letter}]
%   indicates which style should be used when drawing the boxes. The letter
%   may be one of the following:
%   \begin{description}
%   \item[\tt S]: a vertical bar on the left of the text
%   \item[\tt M]: a bar on the left and a short horizontal bar at the
%     bottom of the text
%   \item[\tt L]: a vertical bar on each side and a horizontal bar at the
%     bottom
%   \end{description}
%   The default value for this parameter is |M|. The options |S|, |M|, |L| are
%   shortcuts for |style=S|, |style=M| and |style=L|.
% \item[\kv{cut}{bool}]
%   indicates if boxes may be cut at page breaks (true by default),
%   \texttt{nocut} is equivalent to \texttt{cut=false}
% \end{description}
% The following options are used to change style of the header and contents:
% \begin{description}
% \item[\kv{underline}{bool}]
%   indicates if the title of boxes should be underlined (true by default),
%   \texttt{nounderline} is equivalent to \texttt{underline=false}
% \item[\kv{headstyle}{text}]
%   defines how the header of the theorems is formatted. In the text, |#1|
%   represents the environment name (i.e. ``Theorem'') and |#2| represent the
%   number. The default value is ``|\bfseries\boldmath#1 #2|''.
% \item[\kv{titlestyle}{text}]
%   defines how the optional title of theorems is formatted. In the text,
%   |#1| represents the title. The default value is ``| (\textit{#1})|''.
% \item[\kv{bodystyle}{text}]
%   defines how the text of theorems and similar environments is formatted, it
%   is inserted before the text in those environments. The default value is
%   ``|\slshape\noindent|''.
% \end{description}
% The following options define the various spacings:
% \begin{description}
% \item[\kv{leftmargin}{dim}, \kv{rightmargin}{dim}]
%   defines the horizontal space between the margin of the surrounding text
%   and that of the text inside the box (defaut value is |\parskip| for the
%   left margin and 0pt for the right margin)
% \item[\kv{hskip}{dim}, \kv{vskip}{dim}]
%   defines the horizontal and vertical space between the frame of the box
%   and its contents (default value is~0.4em for both)
% \item[\kv{thickness}{dim}]
%   defines the thickness of the bars (defaut value is~0.6pt)
% \end{description}
%
% \subsection{Change log}
%
% \begin{changelog}
% \version{2.0}{2005/04/24}
%   \item first CTAN release
%   \item replaced |preskip| and |postskip| by |left|/|rightmargin| and
%     |h|/|vskip|
%   \item new option |headstyle|
% \version{1.91}{2004/06/08}
%   \item translated everything to english
%   \item cleaned interface, switched to |keyval|, added parameters
% \version{1.3}{2002/09/09}
%   \item added option |nothm|
% \version{1.2}{2002/05/24}
%   \item added option |nocut|
% \version{1.1}{2002/03/08}
%   \item proper \LaTeX\ interface with |\newtheorem|
% \version{1.0}{around 2001}
%   \item first version as an independent package
% \end{changelog}
%
%
% \pagebreak
% \section{Implementation}
%
% First of all, we have to repect the protocol of \LaTeXe\ packages, by
% checking the format and introducing ourselves:
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{thmbox}[2005/04/24 v2.0 fancy theorem outlining]
%    \end{macrocode}
%
% \subsection{Formatting options}
%
% \begin{macro}{\thmboxoptions}
% Parameters are set using the \texttt{keyval} mechanism. All options are in
% the set named \texttt{thmbox}. The macro |\thmboxoptions| can be used to
% change the default parameters at any time.
%    \begin{macrocode}
\RequirePackage{keyval}
\newcommand\thmboxoptions{\setkeys{thmbox}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thmbox@style}
% The style of the current box is stored by a |\let| in the macro
% |\thmbox@style|, it can be changed using the \texttt{style} option.
%    \begin{macrocode}
\let\thmbox@style=M
\define@key{thmbox}{style}{\let\thmbox@style=#1}
%    \end{macrocode}
% For compatibility with previous versions, we provide shortcuts for each
% style:
%    \begin{macrocode}
\define@key{thmbox}{S}[]{\let\thmbox@style=S}
\define@key{thmbox}{M}[]{\let\thmbox@style=M}
\define@key{thmbox}{L}[]{\let\thmbox@style=L}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thmbox@leftmargin}
% \begin{macro}{\thmbox@rightmargin}
% \begin{macro}{\thmbox@hskip}
% \begin{macro}{\thmbox@vskip}
% \begin{macro}{\thmbox@thickness}
% Next we have presentation parameters. The variables |\thmbox@leftmargin| and
% |\thmbox@rightmargin| are the extra margins to put between the surrounding
% text and the text of the box. The thickness of the frame is defined by
% |\thmbox@thickness|, its spacing with the contents is |\thmbox@hskip|
% horizontally and |\thmbox@vskip| vertically.
%    \begin{macrocode}
\newdimen\thmbox@leftmargin  \thmbox@leftmargin=\parindent
\newdimen\thmbox@rightmargin \thmbox@rightmargin=0pt
\newdimen\thmbox@hskip       \thmbox@hskip=.4em
\newdimen\thmbox@vskip       \thmbox@vskip=.4em
\newdimen\thmbox@thickness   \thmbox@thickness=.6pt
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% These parameters can be set using the keyval interface:
%    \begin{macrocode}
\define@key{thmbox}{leftmargin}{\thmbox@leftmargin=#1\relax}
\define@key{thmbox}{rightmargin}{\thmbox@rightmargin=#1\relax}
\define@key{thmbox}{hskip}{\thmbox@hskip=#1\relax}
\define@key{thmbox}{vskip}{\thmbox@vskip=#1\relax}
\define@key{thmbox}{thickness}{\thmbox@thickness=#1\relax}
%    \end{macrocode}
%
% \begin{macro}{\ifthmbox@cut}
% The boolean |\ifthmbox@cut| indicates whether the boxes may be cut on page
% breaks or if they must be kept in one block. By default, cutting boxes is
% allowed.
%    \begin{macrocode}
\newif\ifthmbox@cut
\thmbox@cuttrue
%    \end{macrocode}
% This can be changed using the \texttt{cut} option, the option \texttt{nocut}
% is equivalent to \texttt{cut=false}.
%    \begin{macrocode}
\define@key{thmbox}{cut}[true]{%
  \expandafter\let\expandafter\ifthmbox@cut\csname if#1\endcsname}
\define@key{thmbox}{nocut}[]{\thmbox@cutfalse}
\DeclareOption{cut}{\thmbox@cuttrue}
\DeclareOption{nocut}{\thmbox@cutfalse}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifthmbox@underline}
% The boolean |\ifthmbox@underline| indicates if the title of boxes should be
% underlined. It is activated by default and can be changed using the option
% \texttt{underline}.
%    \begin{macrocode}
\newif\ifthmbox@underline
\thmbox@underlinetrue
\define@key{thmbox}{underline}[true]{%
  \expandafter\let\expandafter\ifthmbox@underline\csname if#1\endcsname}
\define@key{thmbox}{nounderline}[]{\thmbox@underlinefalse}
\DeclareOption{underline}{\thmbox@underlinetrue}
\DeclareOption{nounderline}{\thmbox@underlinefalse}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thmbox@headstyle}
% The macro |\thmbox@headstyle| defines how the header of theorems is
% formatted, the arguments are the kind of enviromnent (i.e. ``theorem'') and
% its number.
%    \begin{macrocode}
\newcommand\thmbox@headstyle[2]{\bfseries\boldmath#1 #2}
%    \end{macrocode}
% This macro can be redefined using the option \texttt{headstyle}:
%    \begin{macrocode}
\define@key{thmbox}{headstyle}{\def\thmbox@headstyle##1##2{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thmbox@titlestyle}
% The macro |\thmbox@titlestyle| defines how the title of theorems is
% formatted, after the theorem number. Its argument is the text to be
% formatted.
%    \begin{macrocode}
\newcommand\thmbox@titlestyle[1]{ (\textit{#1\/})}
%    \end{macrocode}
% This macro can be redefined using the option \texttt{titlestyle}:
%    \begin{macrocode}
\define@key{thmbox}{titlestyle}{\def\thmbox@titlestyle##1{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thmbox@bodystyle}
% The macro |\thmbox@bodystyle| defines formatting options for the body of
% theorem-like environments. It is inserted before the text.
%    \begin{macrocode}
\newcommand\thmbox@bodystyle{\slshape\noindent}
%    \end{macrocode}
% This macro can be redefined using the option \texttt{bodystyle}:
%    \begin{macrocode}
\define@key{thmbox}{bodystyle}{\def\thmbox@bodystyle{#1}}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Package options}
%
% The only package option is \texttt{nothm}, which prevents from redefining
% the standard |\newtheorem| command.
%    \begin{macrocode}
\newif\ifthmbox@newtheorem
\thmbox@newtheoremtrue
\DeclareOption{nothm}{\thmbox@newtheoremfalse}
%    \end{macrocode}
% All other package options are considered to be formatting options and are
% parsed using the \texttt{keyval} package.
%    \begin{macrocode}
\DeclareOption*{\expandafter\thmboxoptions\expandafter{\CurrentOption}}
\ProcessOptions\relax
%    \end{macrocode}
%
% \subsection{Formatting}
%
% We now define the code for formatting boxes.
% When a box is to be cut, the idea is the following: we assume the box
% |\thmbox@box| to contain the whole text, with an aribtrary height. First we
% compare the height of the box to the available space on the current page. If
% there is enough space, we simply place the box at once with the decorations
% around it. Otherwise, we cut the box at the available height, place the
% first part on the page, and proceed with the remaining text. The following
% steps are similar except that the available space is the height of the whole
% page.
%
% The drawback with this method, apart from the fact that it cannot produce
% page breaks as good as \TeX's page builder does, is that the construction
% cannot be nested. Putting a box of that kind into another works as long as
% there is no page break, but has unpredictable results when a page break
% occurs. If we wanted to allow nested boxes, we would have to completely
% rethink the system, and it would result in a much heavier code. Is this
% really necessary?
%
% \begin{macro}{\thmbox@box}
% \begin{macro}{\thmbox@box@}
% \begin{macro}{\thmbox@dim}
% We first introduce internal variables. We will use two boxes and a length
% register for computations during formatting.
%    \begin{macrocode}
\newbox\thmbox@box
\newbox\thmbox@box@
\newdimen\thmbox@dim
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\thmbox@put}
% Placing a box after appropriate cutting is performed by the macro
% |\thmbox@put|. Its argument is the register that holds the box to be placed.
% The effect is simply to insert the appropriate spaces and rules, according
% to the value of |\thmbox@style|, and switch back to vertical mode.
%    \begin{macrocode}
\def\thmbox@put#1{
  \vskip\z@%
  \noindent%
  \hbox{%
    {\dimen0=\thmbox@leftmargin%
     \advance\dimen0-\thmbox@hskip%
     \advance\dimen0-\thmbox@thickness%
     \hskip\dimen0}%
    \vrule width \thmbox@thickness%
    \hskip\thmbox@hskip%
    \box#1%
    \ifx\thmbox@style L%
      \hskip\thmbox@hskip%
      \vrule width \thmbox@thickness%
    \fi}%
  \par\nobreak}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thmbox@start}
% The first step as described above is always applied to the box
% |\thmbox@box|, and |\thmbox@box@| is reserved for the part that is cut out
% by a |\vsplit|. The macro |\thmbox@start| performs the first step in the
% process of formatting a complete box. A difficult point occurs here: if the
% box is to be inserted at the beginning of a page, it may happen that
% |\output| has not been called yet, so the height of the current vertical
% material (the value of |\pagetotal|) may exceed the page height (contained
% in |\vsize|). In this case, the available space on the page must be computed
% as $2\times|\vsize|-|\pagetotal|$ instead of $|\vsize|-|\pagetotal|$. This
% explains the conditional at the beginning of the macro.
%    \begin{macrocode}
\def\thmbox@start{%
  \ifthmbox@cut%
    \ifdim\pagetotal>\vsize%
      \thmbox@dim=2\vsize%
    \else%
      \thmbox@dim=\vsize%
    \fi%
    \advance\thmbox@dim -\pagetotal%
    \ifdim\thmbox@dim>\ht\thmbox@box%
      \thmbox@put\thmbox@box%
    \else%
      \setbox\thmbox@box@=\vsplit\thmbox@box to \thmbox@dim%
      \thmbox@put\thmbox@box@%
      \thmbox@page%
    \fi%
  \else%
    \thmbox@put\thmbox@box%
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thmbox@page}
% The following steps are for the case when a box is placed at the beginning
% of an empty page. They are handled by the macro |\thmbox@page|, which
% systematically inserts a page break before the box (unless the box is empty,
% which may happen after cutting near the end of a box).
%    \begin{macrocode}
\def\thmbox@page{%
  \ifvoid\thmbox@box%
  \else%
    \eject%
    \ifdim\vsize<\ht\thmbox@box%
      \setbox\thmbox@box@=\vsplit\thmbox@box to \vsize%
      \thmbox@put\thmbox@box@%
      \thmbox@page%
    \else%
      \thmbox@put\thmbox@box%
    \fi%
  \fi}
%    \end{macrocode}
% \end{macro}
%
% After the formatting of text boxes, we have to handle the header of the box
% as well as the part below the last box, where there may be a horizontal
% rule.
%
% \begin{macro}{\thmbox@head}
% The macro |\thmbox@head| produces a header with the text in its argument. A
% horizontal rule is possibly placed below, after a space of
% |\thmbox@vskip|. This space is produced by adding an invisible vertical
% rule in the title so that the size of the space does not depend on the text.
% Finally we add an invisible horizontal rule to switch back to vertical mode
% without making a new paragraph.
%    \begin{macrocode}
\def\thmbox@head#1{%
  \par\noindent\vbox{%
    \setbox\thmbox@box@=\hbox{%
      \vrule width 0mm height 0mm depth \thmbox@vskip%
      #1}%
    \copy\thmbox@box@%
    \ifthmbox@underline%
      \hrule width \wd\thmbox@box@ height \thmbox@thickness%
    \fi}%
  \hrule height 0mm\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thmbox@tail}
% The terminal par of the box is produced by the macro |\thmbox@tail|. As
% opposed to the previous one, this one is very dependent on the style of the
% box. However we assume is is called only with a style equal to |M| or |L|,
% and not for the style |S|.
%    \begin{macrocode}
\def\thmbox@tail{%
  \hrule height 0mm%
  \ifx\thmbox@style M%
    \thmbox@dim=1cm%
  \else\ifx\thmbox@style L%
    \thmbox@dim=\hsize%
    \advance\thmbox@dim-\thmbox@leftmargin%
    \advance\thmbox@dim-\thmbox@rightmargin%
    \advance\thmbox@dim2\thmbox@hskip%
    \advance\thmbox@dim2\thmbox@thickness%
  \fi\fi%
  \noindent%
  {\dimen0=\thmbox@leftmargin%
   \advance\dimen0-\thmbox@hskip%
   \advance\dimen0-\thmbox@thickness%
   \hskip\dimen0}%
  \vrule width \thmbox@dim height \thmbox@thickness%
  \par}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{\LaTeX\ interface}
%
% \subsubsection{Environnements}
%
% \begin{macro}{thmbox}
% Now that the previous commands are defined, we can actually define the
% \texttt{thmbox} environment. The prefix part is used to set the formatting
% options and produce the header, then start a vertical box with appropriate
% width for the contents of the text. The postfix part closes this box,
% formats it using the previously defined commands, and possibly inserts
% material at the end.
%
% The code contains groupings that may appear unnecessary, around |#2| in the
% header and around the environment's contents. They are here to obtain a
% satisfactory behaviour when using colours.
%    \begin{macrocode}
\newenvironment{thmbox}[2][]{%
  \parskip\z@%
  \setkeys{thmbox}{#1}%
  \ifx\thmbox@style S\else\ifx\thmbox@style M\else\ifx\thmbox@style L\else%
    \PackageWarning{thmbox}{\thmbox@style\ is not a valid style for
      \string\thmbox, using M}%
    \let\thmbox@style=M%
  \fi\fi\fi%
  \thmbox@head{{#2}}\nobreak\relax%
  \thmbox@dim=\hsize%
  \advance\thmbox@dim-\leftskip%
  \advance\thmbox@dim-\rightskip%
  \setbox\thmbox@box=\vbox\bgroup%
    \hsize=\thmbox@dim%
    \advance\hsize -\thmbox@leftmargin%
    \advance\hsize -\thmbox@rightmargin%
    \textwidth=\hsize%
    \linewidth=\hsize%
    \vskip\thmbox@vskip%
    \begingroup}{\endgroup%
    \vskip\thmbox@vskip%
  \egroup%
  \thmbox@start%
  \ifx\thmbox@style S\else\thmbox@tail\fi%
  \@endparenv}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{leftbar}
% The definitions used for wrapping boxes allow for easily defining an
% evironment that places a vertical bar on the side of the text. The code of
% this enivonment is basically that of \texttt{thmbox} without the header and
% tail material:
%    \begin{macrocode}
\newenvironment{leftbar}[1][]{%
  \setkeys{thmbox}{#1}%
  \par\vskip\thmbox@vskip%
  \setbox\thmbox@box=\vbox\bgroup%
    \hsize=\textwidth%
    \advance\hsize -\thmbox@leftmargin%
    \advance\hsize -\thmbox@rightmargin%
    \begingroup}{\endgroup%
    \vskip\thmbox@vskip%
  \egroup%
  \thmbox@start%
  \vskip\thmbox@vskip\par}
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{\LaTeX\ theorems}
%
% \begin{macro}{\newboxtheorem}
% In order to use this package transparently in a \LaTeX\ text, we define the
% command |\newboxtheorem| on the model of the standard |\newtheorem| command.
% The code of this version respects the semantics of the original one, with
% two possible syntaxes:
% \begin{itemize}
% \item |\newtheorem{|\textit{environment}|}[|\ignorespaces%
%   \textit{counter}|]{|\textit{title}|}|
%   to use an already existing counter,
% \item |\newtheorem{|\textit{environment}|}{|\ignorespaces%
%   \textit{title}|}[|\textit{coupter}|]|
%   to create a new counter that possibly depends on an existsing one.
% \end{itemize}
% We add an optional first argument that contains formatting options for the
% boxes used in a particular kind of theorem. The definition of this macro is
% in a very \LaTeX ish style\dots
%    \begin{macrocode}
\def\newboxtheorem{%
  \@ifnextchar[{\thmbox@newA}{\thmbox@newA[]}}%
%    \end{macrocode}
% The sub-macros eventually call |\thmbox@new|, which performs the actual
% theorem definition according to four arguments, respectively the formatting
% options, the environment name, the title used and the name of \LaTeX\
% counter.
% \end{macro}
%
% The macro |\thmbox@newA| is used when options are specified. We store the
% options in the macro |\thmbox@temp| for stability. This is needed because it
% may contain an option of the form |titlestyle={...#1...}| which could cause
% problems in a |\def|.
%    \begin{macrocode}
\def\thmbox@newA[#1]#2{%
  \def\thmbox@temp##1{#1}%
  \@ifnextchar[{\thmbox@newC{#2}}{\thmbox@newD{#2}}}
%    \end{macrocode}
% The macro |\thmbox@newC| corresponds to the case where an existing counter
% is used for the new environment.
%    \begin{macrocode}
\def\thmbox@newC#1[#2]#3{%
  \expandafter\thmbox@new\expandafter{\thmbox@temp{####1}}{#1}{#3}{#2}}
%    \end{macrocode}
% The macro |\thmbox@newD| corresponds to the case where a new counter is
% created.
%    \begin{macrocode}
\def\thmbox@newD#1#2{%
  \@ifnextchar[{\thmbox@newE{#1}{#2}}{%
    \newcounter{#1}%
    \expandafter\thmbox@new\expandafter{\thmbox@temp{####1}}{#1}{#2}{#1}}}
%    \end{macrocode}
% The macro |\thmbox@newE| corresponds to the case where the new counter
% depends on another counter.
%    \begin{macrocode}
\def\thmbox@newE#1#2[#3]{%
  \newcounter{#1}[#3]%
  \expandafter\def\csname the#1\endcsname{%
    \csname the#3\endcsname.\arabic{#1}}
  \expandafter\thmbox@new\expandafter{\thmbox@temp{####1}}{#1}{#2}{#1}}
%    \end{macrocode}
%
% The macro |\thmbox@new| performs the actual environment definition.
% Because of the way we handle the environment's optional argument, we
% don't define the new environment using \LaTeX\ macros. The drawback is that
% there is no error checking.
%    \begin{macrocode}
\def\thmbox@new#1#2#3#4{%
  \expandafter\def\csname#2\endcsname{%
    \setkeys{thmbox}{#1}%
    \@ifnextchar[{\thmbox@beginA{#3}{#4}}{%
      \thmbox@begin{#3}{#4}{}}}%
  \expandafter\def\csname end#2\endcsname{%
    \endthmbox\smallbreak}}
%    \end{macrocode}
% Like previously, the macro |\thmbox@beginA| is used when the optional
% argument is present.
%    \begin{macrocode}
\def\thmbox@beginA#1#2[#3]{%
  \thmbox@begin{#1}{#2}{\thmbox@titlestyle{#3}}}
%    \end{macrocode}
%
% The macro |\thmbox@begin| is responsible for opening a theorem environment
% as defined by the new version of |\newtheorem|. Its arguments contain
% respectively options for the box, the name of the element (e.g.
% ``Theorem''), the counter used and the text to insert after the number.
%    \begin{macrocode}
\def\thmbox@begin#1#2#3{%
  \medbreak%
  \refstepcounter{#2}%
  \thmbox{\thmbox@headstyle{#1}{\csname the#2\endcsname}#3}%
  \thmbox@bodystyle\ignorespaces}
%    \end{macrocode}
%
% Optionally (see the package option \texttt{nothm}), this macro replaces the
% original |\newtheorem| so that the package can be used without modifying an
% already prepared text.
%    \begin{macrocode}
\ifthmbox@newtheorem
\let\newtheorem\newboxtheorem
\fi
%    \end{macrocode}
%
%
% \subsection{Examples and proofs}
%
% \begin{macro}{example}
% For examples, we write the text in a smaller face, with an extra left margin
% and a mark at the beginning.
%    \begin{macrocode}
\def\example{}
\@ifundefined{examplename}{\def\examplename{Example}}{}
\renewenvironment{example}[1][\examplename]{%
  \par\smallbreak\small%
  \list{\hspace\labelsep\textbf{#1\,:}}{%
    \leftmargin=\parindent%
    \labelwidth=\parindent}%
  \item\relax}{%
  \endlist}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{proof}
% The format of proofs is mostly that of examples, with two differences: the
% right margin is also extended, and a black square is placed in this extra
% margin at the end of the last line.
%    \begin{macrocode}
\def\proof{}
\@ifundefined{proofname}{\def\proofname{Proof}}{}
\renewenvironment{proof}[1][]{%
  \small%
  \list{\hspace\labelsep\textbf{\proofname\ #1\unskip\,:}}{%
    \topsep=\smallskipamount%
    \partopsep=0pt%
    \leftmargin=\parindent%
    \rightmargin=\parindent%
    \listparindent=\parindent%
    \labelwidth=\parindent}%
  \item\relax\ignorespaces}%
%    \end{macrocode}
%    \begin{macrocode}
 {\parskip\z@%
  \par\noindent%
  \setbox\thmbox@box=\hbox{%
    \kern .5em\vbox{%
      \hrule width .7em height .7em
      \vskip\baselineskip}}%
  \wd\thmbox@box=0mm%
  \ht\thmbox@box=0mm%
  \hfill\box\thmbox@box%
  \endlist\par}
%    \end{macrocode}
% \end{macro}
%
%
% \Finale