summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/thmbox/thmbox.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/thmbox/thmbox.dtx')
-rw-r--r--macros/latex/contrib/thmbox/thmbox.dtx824
1 files changed, 824 insertions, 0 deletions
diff --git a/macros/latex/contrib/thmbox/thmbox.dtx b/macros/latex/contrib/thmbox/thmbox.dtx
new file mode 100644
index 0000000000..a0636cc7e1
--- /dev/null
+++ b/macros/latex/contrib/thmbox/thmbox.dtx
@@ -0,0 +1,824 @@
+% \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