From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/thmbox/thmbox.dtx | 824 +++++++++++++++++++++++++++++++++ 1 file changed, 824 insertions(+) create mode 100644 macros/latex/contrib/thmbox/thmbox.dtx (limited to 'macros/latex/contrib/thmbox/thmbox.dtx') 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} +% +% \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 -- cgit v1.2.3