diff options
Diffstat (limited to 'Master/texmf-dist/source/latex-dev/tools/theorem.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex-dev/tools/theorem.dtx | 1144 |
1 files changed, 1144 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex-dev/tools/theorem.dtx b/Master/texmf-dist/source/latex-dev/tools/theorem.dtx new file mode 100644 index 00000000000..6f745d016ef --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/tools/theorem.dtx @@ -0,0 +1,1144 @@ +% \iffalse meta-comment +% +% Copyright (C) 1993-2019 +% +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the Standard LaTeX `Tools Bundle'. +% ------------------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% The list of all files belonging to the LaTeX `Tools Bundle' is +% given in the file `manifest.txt'. +% +% \fi +% +%% +% +% +\def\FMithmInfo{2014/10/28 v2.2c Theorem extension package (FMi)} +% +% \ProvidesFile{theorem.dtx}[\FMithmInfo] +%\iffalse % this is a METACOMMENT ! +%% +%% Package `theorem' to use with LaTeX2e +%% Copyright (C) 1989-1995 Frank Mittelbach, all rights reserved. +%<+package>\@ifundefined{theorem@style}{}{\endinput} +%<+package>\NeedsTeXFormat{LaTeX2e}[1995/06/01] +%<+package>\ProvidesPackage{theorem} +%<+package> [\FMithmInfo] +% +% \fi +% +% \changes{v1.0}{87/05/07}{First draft.} +% \changes{v1.0a}{87/05/07}{`thistheoremstyle' added.} +% \changes{v1.1a}{87/07/29}{New concept: redefine the internal +% \protect\LaTeX{} commands `@xnthm' etc.} +% \changes{v1.1b}{87/07/31}{`theoremfont' used to specify font.} +% \changes{v1.2a}{88/01/08}{`@endtheorem' now globally defined.} +% \changes{v1.2b}{88/01/11}{`newtheorem' only allowed in the preamble.} +% \changes{v1.3a}{88/02/14}{`theoremfont' now a toks register.} +% +% \changes{v2.0a}{88/11/16}{New implementation and new documentation.} +% \changes{v2.0a}{88/11/16}{No layout changes but internal modifications +% old substyles won't work.} +% \changes{v2.0b}{89/01/30}{`global' used for all definitions.} +% \changes{v2.0c}{89/06/15}{Documentation translated to English. +% Thanks to LLL and Nina} +% \changes{v2.1a}{90/02/15}{Support for new font selection.} +% \changes{v2.2a}{94/02/03}{Cleanup for LaTeX2e} +% +% \DoNotIndex{\@endparenv,\@ifdefinable,\@ifnextchar,\@ifundefined} +% \DoNotIndex{\@namedef,\@nameuse,\@spaces,\@tempa,\@warning} +% \DoNotIndex{\ } +% \DoNotIndex{\begingroup,\bfseries} +% \DoNotIndex{\csname} +% \DoNotIndex{\def,\do,\docdate} +% \DoNotIndex{\endcsname,\endgroup,\endinput,\endtrivlist,\expandafter} +% \DoNotIndex{\filedate,\fileversion} +% \DoNotIndex{\gdef,\global} +% \DoNotIndex{\hbox,\hskip} +% \DoNotIndex{\ignorespaces,\input,\itshape,\item} +% \DoNotIndex{\labelsep,\let,\llap} +% \DoNotIndex{\makeatletter} +% \DoNotIndex{\noexpand} +% \DoNotIndex{\refstepcounter,\relax,\rlap} +% \DoNotIndex{\setlength,\slshape,\space,\string,\strut} +% \DoNotIndex{\the,\trivlist,\typeout} +% \DoNotIndex{\vbox} +% \DoNotIndex{\xdef} +% +% \def\deflabel#1{\ttfamily #1\hfill} +% \def\deflist#1{\begin{list}{}{\settowidth\labelwidth{\ttfamily #1}% +% \setlength\leftmargin\labelwidth +% \addtolength\leftmargin\labelsep +% \let\makelabel\deflabel}} +% \def\enddeflist{\end{list}} +% \def\envfont{\normalfont\ttfamily} +% +% \MakeShortVerb{\|} +% +% \newcommand{\TUB}{{\sl TUGboat\/}} +% +% \GetFileInfo{theorem.dtx} +% \title{An Extension of the +% \LaTeX{} theorem environment\thanks{This file +% has version number \fileversion, last +% revised \filedate.}} +% \author{Frank Mittelbach} +% +% \MaintainedByLaTeXTeam{tools} +% \maketitle +% +% \begin{abstract} +% The macros described in this paper yield an extension of the +% \LaTeX{} theorem mechanism. It is designed is to satisfy the +% different requirements of various journals. Thus, the +% layout of the ``theorems'' can be manipulated by determining a +% ``style''. This article describes not only the use, but +% also the definition, of the necessary macros. +% \end{abstract} +% +% \section*{Preface to version 2.2} +% +% For \LaTeXe{} this package did not need any fundamental changes. I +% only modified the messages generated so that theorem layout styles +% will show up with the |\listfiles| command and cleaned the section +% on the New Font Selection Scheme since this is now included in +% \LaTeX. +% +% \section*{Preface to version 2.1} +% +% This version is identical to 2.0g described in \TUB\ 10\#3 except +% for some internal defaults which are now set depending on the used +% font selection scheme. +% +% This was done to avoid unpleasant surprises if the new font selection +% scheme is in force. For further details see +% section~\ref{sec:newfonts} and \cite{bk:GMS94}. +% +% \section{Introduction} +% +% For our purposes here, ``theorems'' are labelled enunciations, +% often set off from the main text by extra space and a font change. +% Theorems, corollaries, conjectures, definitions, and remarks +% are all instances of ``theorems''. The ``header'' of these structures +% is composed of a label (such as \textsc{Theorem} or \textsc{Remark}) +% and a number which serializes an item in the sequence of items +% with the same label. +% +% Shortly after the introduction of \LaTeX{} at the Fachbereich +% Mathematik in Mainz, the desire to manipulate the layout of +% ``theorems'' arose. In Mainz, the following two conventions came +% into general use: +% \begin{enumerate} +% \item The number of the theorem is shown in the margin. +% \item There is a line break at +% the end of the theorem header. +% \end{enumerate} +% +% Additionally, some journals require different formats which depend on +% the ``sort of theorem'': e.g.\ often remarks and definitions are set +% in |\upshape|, while |\itshape| is employed for main theorems. +% +% Confronted with these requirements, a theorem environment was +% developed in Mainz which allows separate determination of the +% layout of the ``theorems sets'', comparable to |\pagestyle|. +% +% +% \section{The user interface} +% \subsection{Defining new theorem sets} +% +% \DescribeMacro\newtheorem +% As in the original \LaTeX{} version, the command |\newtheorem| +% defines a new ``theorem set'' or ``theorem-like structure''. +% Two required arguments name the new environment and give the text +% to be typeset with each instance of the new ``set'', while +% an optional argument determines how +% the ``set'' is enumerated: +% \begin{description} +% \item[\ttfamily \bslash newtheorem\{foo\}\{bar\}] +% The theorem set {\envfont foo} (whose name is \texttt{bar}) +% uses its own counter. +% \item[\ttfamily \bslash newtheorem\{foo2\}{[foo]}\{bar2\}] +% The theorem set {\envfont foo2} (printed name \texttt{bar2}) +% uses the same counter as the theorem set \texttt{foo}. +% \item[\ttfamily \bslash newtheorem\{foo3\}\{bar3\}{[section]}] +% The theorem set {\envfont foo3} (printed name \texttt{bar3}) is +% enumerated within the counter \texttt{section}, i.e.\ with every +% new |\section| the enumeration begins again with 1, and +% the enumeration is composed from the section-number and the +% theorem counter itself. +% \end{description} +% +% \DescribeMacro\theoremstyle +% Additionally, the command |\theoremstyle| can define the layout +% of various, or all, theorem sets. It should be noted that any +% theorem set defined by |\newtheorem| is typeset in the +% |\theoremstyle| that is current at the time of the definition. +% Thus, the following +% \begin{verbatim} +% \theoremstyle{break} \newtheorem{Cor}{Corollary} +% \theoremstyle{plain} \newtheorem{Exa}{Example}[section] +%\end{verbatim} ^^A No blank at line start +% leads to the result that the set {\envfont Cor} is formatted in the +% style \texttt{break}, while the set {\envfont Exa} and all the +% following ones are formatted in the style \texttt{plain}, unless +% another |\theoremstyle| follows. Since the definitions installed by +% |\newtheorem| are global, one also can limit |\theoremstyle| locally +% by grouping braces. +% +% \DescribeMacro\theorembodyfont +% The choice of the font for the theorem body is completely +% independent of the chosen |\theoremstyle|; this has proven to +% be very advantageous. For example, +% \begin{verbatim} +% {\theorembodyfont{\upshape} \newtheorem{Rem}{Remark}} +%\end{verbatim} +% defines a theorem set {\envfont Rem}, which will be set in +% |\upshape| in the current layout (which in our example is +% \texttt{plain}). As with |\theoremstyle|, the |\theorembodyfont| +% chosen is that current at the time of |\newtheorem|. If +% |\theorembodyfont| is not specified or one defines +% |\theorembodyfont{}|, then the font used will be that defined by the +% |\theoremstyle|. +% +% \DescribeMacro\theoremheaderfont It is also possible to customize +% the font used for the theorem headers. This is, however, a global +% declaration, and therefore there should be at most one +% |\theoremheaderfont| declaration in the preamble.\footnote{If it is +% actually necessary to have different header fonts, one has to define +% new theorem styles (substituting the desired font) or specify the +% information directly in the \texttt{\bslash newtheorem} declaration +% (the unclean variant).} +% +% \DescribeMacro\theorempreskipamount +% \DescribeMacro\theorempostskipamount Two additional parameters +% affect the vertical space around the theorem environments: +% |\theorempreskipamount| and |\theorempostskipamount| define, +% respectively, the spacing before and after such an environment. +% These parameters apply for all theorem sets and can be manipulated +% with the ordinary length macros. They are rubber lengths, +% (`\textsf{skips}'), and therefore can contain \texttt{plus} and +% \texttt{minus} parts. +% +% Since the definition of theorem sets should---most sensibly---be +% placed in the preamble, we only allow installation there. +% It is therefore possible to release the memory used here after +% |\begin{document}|, in order to make room for other +% applications. +% +% +% \subsection{Existing theorem styles} +% +% The following theorem styles exist to date: +% \begin{deflist}{marginbreak} +% \item[plain] +% This theorem style emulates the original \LaTeX{} definition, +% except that additionally the parameters +% |\theorem...skipamount| are used. +% \item[break] +% In this style, the theorem header is followed by a line +% break. +% \item[marginbreak] +% The theorem number is set in the margin, and there is a line +% break as in \texttt{break}. +% \item[changebreak] +% Like \texttt{break}, but with header number and text +% interchanged. +% \item[change] +% Header number and text are interchanged, without a line break. +% \item[margin] +% The number is set in the left margin, without a line break. +% \end{deflist} +% All styles (except \texttt{plain}) select |\slshape| as the default +% |\theorembodyfont|. +% +% +% \subsection{Examples} +% +% Given the above theorem sets {\envfont Cor}, {\envfont Exa} +% and {\envfont Rem}, +% suppose that the preamble also contains the declarations: +% \begin{verbatim} +% \theoremstyle{marginbreak} \newtheorem{Lem}[Cor]{Lemma} +% \theoremstyle{change} +% \theorembodyfont{\itshape} \newtheorem{Def}[Cor]{Definition} +% +% \theoremheaderfont{\scshape} +%\end{verbatim} +% Then the following are some typical examples of the typeset output +% resulting from their use. +% +% \begin{Cor} +% This is a sentence typeset in the theorem environment {\envfont +% Cor}. +% \end{Cor} +% +% \begin{Exa} +% This is a sentence typeset in the theorem environment {\envfont +% Exa}. +% \end{Exa} +% +% \begin{Rem} +% This is a sentence typeset in the theorem environment {\envfont +% Rem}. +% \end{Rem} +% +% \begin{Lem}[Ben User] +% This is a sentence typeset in the theorem environment {\envfont +% Lem}. +% \end{Lem} +% +% \begin{Def}[Very impressive Definition] +% This is a sentence typeset in the theorem environment {\envfont +% Def}. +% \end{Def} +% +% The last two examples show the effect of the optional argument to +% a theorem environment (it is the text typeset in parentheses). +% +% +% \section{Special Considerations} +% \label{sec:newfonts} +% +% Theoremheader and body are implemented as a unit. This means that +% the |\theoremheaderfont| will inherit characteristics of the +% |\theorembodyfont| in \LaTeXe. Thus, if for example +% |\theorembodyfont| is |\itshape| and |\theoremheaderfont| +% is |\bfseries| the font selected for the header will have the +% characteristics `bold extended italic'. If this is not desired one +% should set the |\theoremheaderfont| to something like +% \begin{verbatim} +% \theoremheaderfont{\normalfont\bfseries} +%\end{verbatim} +% i.e.\ supplying all necessary font information explicitly. +% +% +% +% \section{Acknowledgements} +% +% The publication of this set of macros was only possible with the +% help of Christina Busse (translating the manuscript into English), +% Joachim Pense (playing the r\^ole of typist), Chris Rowley +% (looking everything over) and many others providing useful +% suggestions. +% +% \StopEventually{% +% \begin{thebibliography}{9} +% \bibitem{bk:GMS94} \textsc{M.~Goossens}, \textsc{F.~Mittelbach} +% and \textsc{A.~Samarin}. +% \newblock The \LaTeX{} Companion. +% \newblock +% Addison-Wesley, Reading, Massachusetts, 1994. +% \bibitem{latex:source} \textsc{Lamport, Leslie.} \newblock +% \texttt{latex.tex}, version 2.09, date +% Feb. 1990. +% \end{thebibliography} +% \PrintIndex +% \PrintChanges} +% +% +% \section{The documentation driver file} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you are +% currently reading. It will be extracted from this file by the +% \texttt{docstrip} program. Since it is the first code in the file +% one can alternatively process this file directly with \LaTeXe{} to +% obtain the documentation. +% +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} + +\usepackage{theorem} + +%<+driver>% The next few lines define theorem sets which are used +%<+driver>% in the example section of the documentation. + +\theoremstyle{break} \newtheorem{Cor}{Corollary} +\theoremstyle{plain} \newtheorem{Exa}{Example}[section] +{\theorembodyfont{\upshape}\newtheorem{Rem}{Remark}} +\theoremstyle{marginbreak} \newtheorem{Lem}[Cor]{Lemma} +\theoremstyle{change} +\theorembodyfont{\itshape} \newtheorem{Def}[Cor]{Definition} + +\theoremheaderfont{\scshape} + +\RecordChanges + +\begin{document} + \DocInput{theorem.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% \section{Definition of the Macros} +% +% If the file has been loaded before, we abort immediately. If not the +% package announces itself (this is actually done at the very top if +% the file---the way it is done isn't good style so don't copy it). +% \changes{v2.0e}{89/07/19}{Spaces removed from `typeout'.} +% \changes{v2.2b}{95/11/19}{Announce moved to top of file} +% \begin{macrocode} +%<*package> +%\@ifundefined{theorem@style}{}{\endinput} +%\def\FMithmInfo{1995/11/19 v2.2b Theorem extension package (FMi)} +%\ProvidesPackage{theorem}[\FMithmInfo] +% \end{macrocode} +% +% +% \subsection{Definition of theorem styles and fonts} +% +% All the definitions in this file are done globally to allow +% inputting this file inside a group. +% +% \begin{macro}{\theoremstyle} +% Before a theorem style can be installed, the chosen style must be +% known. For that reason, we must test to see that +% |\th@|\meta{style} is known or, more precisely, that it is +% different from |\relax|. If the style is not known then +% |\th@plain| is used. +% \begin{macrocode} +\gdef\theoremstyle#1{% + \@ifundefined{th@#1}{\@warning + {Unknown theoremstyle `#1'. Using `plain'}% + \theorem@style{plain}}% +% \end{macrocode} +% We save the theorem style to be used in the token register +% |\theorem@style|. +% \begin{macrocode} + {\theorem@style{#1}}% +% \end{macrocode} +% Now we ``evaluate'' the theorem style: this means, we call the +% macro |\th@|\meta{style} which will activate the relevant +% definitions which are contained in a separate file. This is done +% in a group to suppress changes to the current font. This could +% otherwise pose problems together with the new font selection +% scheme\footnote{When I printed the original article using the new +% font selection scheme I ended with a document with slanted +% typefaces (text headings and all) simply because one of the +% theorem styles used \texttt{\bslash sl} at toplevel.} if the +% |\th@|\meta{style} is evaluated a second time. +% \changes{v2.1a}{90/02/15}{Group added around `th@..} +% \changes{v2.1a}{90/02/15}{Reseting of `..@begintheorem removed.} +% \begin{macrocode} + \begingroup + \csname th@\the\theorem@style \endcsname + \endgroup} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@begintheorem} +% \changes{v2.1a}{90/02/15}{Relaxed at toplevel.} +% \begin{macro}{\@opargbegintheorem} +% \changes{v2.1a}{90/02/15}{Relaxed at toplevel.} +% We reset |\@begintheorem| and |\@opargbegintheorem| to +% |\relax| since these commands are no longer necessary at +% toplevel. This will save a few tokens. +% \begin{macrocode} +\global\let\@begintheorem\relax +\global\let\@opargbegintheorem\relax +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\theorem@style} +% Obviously the \textsf{token} register used above has to be +% allocated. To assure the utmost compatibility with the +% original \LaTeX{} definition, we set the default theorem style to +% \texttt{plain}, which implements the usual \LaTeX{} convention. +% \changes{v2.0f}{89/07/20}{Unnecessary `global' removed.} +% \begin{macrocode} +\newtoks\theorem@style +\global\theorem@style{plain} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\theorembodyfont} +% \begin{macro}{\theorem@bodyfont} +% If the |\theorembodyfont| is set by the user then it should not +% interact with the default font set in the theorem style. When the +% new font selection is in force this may happen if, for example, +% the default is |\itshape| and the new |\theorembodyfont| is +% |\sffamily|. So we add a |\reset@font| command in front of the +% user definition. +% \changes{v2.0f}{89/07/20}{Unnecessary `global' removed.} +% \changes{v2.0g}{89/09/19}{`theoremfont to `theorembodyfont.} +% \changes{v2.1c}{92/06/22}{`reset@font added and logic changed.} +% \changes{v2.1d}{92/10/28}{Reset to empty if arg is empty} +% \begin{macrocode} +\gdef\theorembodyfont#1{% +% \end{macrocode} +% We check if the argument supplied is empty and if so put nothing +% into the |\theorem@bodyfont| token register to allow for +% |\theorembodyfont{}| as a mean of using the default of the +% current |\theoremstyle|. +% \begin{macrocode} + \def\@tempa{#1}% + \ifx\@tempa\@empty + \theorem@bodyfont{}% + \else + \theorem@bodyfont{\reset@font#1}% + \fi + } +\newtoks\theorem@bodyfont +\global\theorem@bodyfont{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\theoremheaderfont} +% \changes{v2.0g}{89/09/19}{Macro added.} +% The font for the theorem headers is handled differently because +% this definition applies to all theorem styles. +% \begin{macrocode} +\gdef\theoremheaderfont#1{\gdef\theorem@headerfont{#1}% +% \end{macrocode} +% After using the macro once it is redefined to produce an error +% message. +% \begin{macrocode} + \gdef\theoremheaderfont##1{% + \typeout{\string\theoremheaderfont\space should be used + only once.}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\theorem@headerfont} +% \changes{v2.0g}{89/09/19}{Macro added.} +% To set the |\theorem@headerfont| default we first test if +% the new fontselection scheme is in force. +% \changes{v2.1a}{90/02/15}{Support for new font selection.} +% \begin{macrocode} +\ifx\upshape\undefined +% \end{macrocode} +% If not we define it to expand into |\bfseries|. We don't use +% |\let| just in case a following style option redefines this +% macro. +% \begin{macrocode} +\gdef\theorem@headerfont{\bfseries} +% \end{macrocode} +% Otherwise we reset the current shape before calling |\bfseries|. +% \begin{macrocode} +\else \gdef\theorem@headerfont{\normalfont\bfseries}\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\th@plain} +% \begin{macro}{\th@break} +% \begin{macro}{\th@marginbreak} +% \begin{macro}{\th@changebreak} +% \begin{macro}{\th@change} +% \begin{macro}{\th@margin} +% The different styles are defined in macros such as +% |\th@plain|. Since memory space is precious in +% ``non-Big-versions'', we have to avoid offering too many unused +% definitions. Therefore we define these styles in separate files +% that can be loaded on demand. Thus the commands themselves only +% load these files. We use |\@input@| a \LaTeXe{} internal command +% that ensures that the file will be listed with |\listfiles| +% \changes{v2.2a}{94/02/02}{Use `@input@ to load theorem layout files} +% \begin{macrocode} +\gdef\th@plain{\@input@{thp.sty}} +\gdef\th@break{\@input@{thb.sty}} +\gdef\th@marginbreak{\@input@{thmb.sty}} +\gdef\th@changebreak{\@input@{thcb.sty}} +\gdef\th@change{\@input@{thc.sty}} +\gdef\th@margin{\@input@{thm.sty}} +% \end{macrocode} +% This list will be expanded when new styles become +% available. For testing, just append new theorem substyles +% as document options. +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% \subsection{Definition of a new theorem set} +% +% As already pointed out, a new theorem environment can be defined in +% three different ways: +% \begin{verbatim} +% \newtheorem{Lem}{Lemma} +% \newtheorem{Lem}{Lemma}[section] +% \newtheorem{Lem}[Theorem]{Lemma} +%\end{verbatim} +% The function of the macro |\newtheorem| is to recognize these cases +% and then to branch into one of the three macros |\@ynthm|, |\@xnthm| +% or |\@othm|. This mechanism is adopted unchanged from +% \cite{latex:source}; the essential point here is that, for example, +% in the second case, the arguments \texttt{Lem}, \texttt{Lemma} and +% \texttt{section} are passed over to the macro |\@xnthm|. +% +% We inspect this case first because the others present fewer problems, +% and thus are easily derived from this one. +% +% \begin{macro}{\@xnthm} +% For our example arguments, the macro |\@xnthm| must fulfill +% the following: +% \begin{itemize} +% \item +% Define a new \LaTeX-counter `Lem' +% \item +% reset this counter within a |\section| +% \item +% define the macro |\theLem| +% \item +% define the environment macros |\Lem| and +% |\endLem| using the current +% |\theoremstyle| and |\theorem@bodyfont|. +% \end{itemize} +% Obviously, all this should happen only if the first argument +% of |\@xnthm| (i.e.\ \texttt{Lem} in our example) is chosen so +% as not to conflict with any previously defined commands or +% environments. This test is performed by the \LaTeX{} macro +% |\@ifdefinable|. +% \begin{macrocode} +\gdef\@xnthm#1#2[#3]{\expandafter\@ifdefinable\csname #1\endcsname +% \end{macrocode} +% Therefore, the first argument of |\@ifdefinable| is the +% expansion (in the example, |\Lem|) of +% |\csname||#1\endcsname|. The second argument is +% executed only if the test has been completed successfully. +% \begin{macrocode} + {% +% \end{macrocode} +% Now we define the new counter. The names of the \LaTeX{} +% macros employed should speak for themselves: +% \changes{v2.2b}{1995/10/07}{Use \cs{@newctr}} +% \changes{v2.2c}{1995/11/23}{Use \cs{@newctr} properly.} +% \begin{macrocode} + \@definecounter{#1}\@newctr{#1}[#3]% +% \end{macrocode} +% Using |\@newctr| will give a proper error message if the counter +% in |#3| is not defined. +% In defining `|\theLem|' we must generate the desired macro +% name by use of |\expandafter| and |\csname|. +% \begin{macrocode} + \expandafter\xdef\csname the#1\endcsname +% \end{macrocode} +% An |\xdef| is used in order to make the definition global, +% and to ensure that it contains the replacement texts of +% |\@thmcountersep| and |\@thmcounter|.\footnote{These +% two macros can be defined by the document style. Their default +% values produce a `\texttt{.}' as separation and an arabic +% representation of the number.} However, not everything should be +% expanded. For example, it saves space to use |\thesection| +% instead of its---at times---lengthy expansion. +% \begin{macrocode} + {\expandafter \noexpand \csname the#3\endcsname + \@thmcountersep \@thmcounter{#1}}% +% \end{macrocode} +% Thus with the defaults of \LaTeX{}, |\theLem| would be +% replaced by the command sequence |\thesection.\arabic{Lem}|. +% +% We will now look at the definition of the macro which is executed +% at the beginning of the actual environment (in our example this +% macro is |\Lem|). It should be noted that we use an +% ``|\expandafter| trick'' to expand only certain parts of the +% replacement text at the time of the definition. +% \begin{macrocode} + \def\@tempa{\global\@namedef{#1}}% + \expandafter \@tempa \expandafter{% +% \end{macrocode} +% First, the macro that contains the current definitions of +% |\@begintheorem| and |\@opargtheorem| should be called +% up. The name of this macro---as is already known---has the form +% |\th@|\meta{theorem\ style}; therefore, it must be called by +% \begin{macrocode} + \csname th@\the \theorem@style +% \end{macrocode} +% In addition the default theorem font should be changeable, i.e.\ +% we have to insert the contents of |\theorem@bodyfont|. For +% that reason, we expand even further, beyond |\endcsname|, +% and thus insert the contents of the \textsf{token} register +% |\theorem@bodyfont| in the replacement text. +% \begin{macrocode} + \expandafter \endcsname \the \theorem@bodyfont +% \end{macrocode} +% Now it is time to call the macro |\@thm| which takes over +% the further processing. It has two arguments: the current +% counter name (in our example, \texttt{Lem}), and the text of the +% label (in our example, \texttt{Lemma}). +% \begin{macrocode} + \@thm{#1}{#2}}% +% \end{macrocode} +% With this, the `sub-definition' is complete. The macro +% |\@endtheorem| ends a theorem environment and is, so far, nothing +% but an |\endtrivlist|. (Hence it is defined globally, and not +% within the theorem styles.\footnote{This has to be changed as +% soon as theorem styles that change \texttt{\bslash @endtheorem} +% exist. In such a case, all existing styles must be changed as +% well since they will have to reset the macro.}) Therefore, we can +% set it equivalent to the macro that ends the theorem set (in our +% example, |\endLem|). However, if some day theorem styles exist +% that do change |\@endtheorem|, we would have to use the +% commented-out line instead. +% \begin{macrocode} + \global \expandafter \let \csname end#1\endcsname \@endtheorem +% \global\@namedef{end#1}{\@endtheorem}% +% \end{macrocode} +% With these commands all the required definitions are employed, +% unless the test |\@ifdefinable| has failed. Therefore, we +% end the second argument of this macro and with it the definition +% of |\@xnthm|. +% \begin{macrocode} + }} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ynthm} +% The definition of |\@ynthm| is completely analogous. In +% this case the new counter that is defined is not reset within +% another counter; thus the definition of |\the...| +% is simplified: +% \begin{macrocode} +\gdef\@ynthm#1#2{\expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% +% \end{macrocode} +% The rest of the definition corresponds literally to that of +% |\@xnthm|: +% \begin{macrocode} + \def\@tempa{\global\@namedef{#1}}\expandafter \@tempa + \expandafter{\csname th@\the \theorem@style \expandafter + \endcsname \the\theorem@bodyfont \@thm{#1}{#2}}% + \global \expandafter \let \csname end#1\endcsname \@endtheorem}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@othm} +% The definition of |\@othm| does not contain anything new. +% \begin{macrocode} +\gdef\@othm#1[#2]#3{% +% \end{macrocode} +% \changes{v2.2b}{95/10/07}{Build in check for counter defined} +% We do not define a new counter but instead use one that has +% already been defined. Thus the only definition we need is that +% of this pseudo-counter (i.e.\ |\the|\meta{env.\ name}). +% First we check if |#2| corresponds to a known counter name. +% \begin{macrocode} + \expandafter\ifx\csname c@#2\endcsname\relax + \@nocounterr{#2}% + \else + \expandafter\@ifdefinable\csname #1\endcsname + {\expandafter \xdef \csname the#1\endcsname + {\expandafter \noexpand \csname the#2\endcsname}% +% \end{macrocode} +% All other parts of the definition can be adopted from +% |\@xnthm|. We have to remember, though, that in this case +% the name of the current counter and the theorem label have moved +% to the second and third arguments. +% \begin{macrocode} + \def\@tempa{\global\@namedef{#1}}\expandafter \@tempa + \expandafter{\csname th@\the \theorem@style \expandafter + \endcsname \the\theorem@bodyfont \@thm{#2}{#3}}% + \global \expandafter \let \csname end#1\endcsname \@endtheorem}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \subsection{Macros that are employed in a {\envfont theorem} +% environment} +% +% \begin{macro}{\@thm} +% The macro |\@thm| has to increase the current counter. Then, +% depending on whether the environment has (or does not have) an +% optional argument, it has to branch into either |\@begintheorem| +% or |\@opargtheorem|. +% \begin{macrocode} +\gdef\@thm#1#2{\refstepcounter{#1}% +% \end{macrocode} +% Now we start a {\envfont trivlist} environment, and give +% |\@topsep| and |\@topsepadd| the values of the \textsf{skip} +% registers |\theorempreskipamount| and |\theorempostskipamount|. +% The value in |\@topsep| is the vertical space that is inserted by +% the first (and only) |\item| in our |\trivlist| whilst +% |\@topsepadd| is inserted by |\@endparenv| at the end of that +% {\envfont trivlist} environment. By using these registers, we +% obtain the desired space around a {\envfont theorem} environment. +% \begin{macrocode} + \trivlist + \@topsep \theorempreskipamount % used by first \item + \@topsepadd \theorempostskipamount % used by \@endparenv +% \end{macrocode} +% Now we have to test whether an optional argument has been given. +% \changes{v2.0d}{89/07/18}{Forgotten percent added.} +% \begin{macrocode} + \@ifnextchar [% +% \end{macrocode} +% If there is an optional argument, we will call |\@ythm|, and +% move the arguments read back into the input stream. +% \begin{macrocode} + {\@ythm{#1}{#2}}% +% \end{macrocode} +% If not, we call |\@begintheorem|. Its first argument is the +% name of the theorem set (hence the second argument of +% |\@thm|). Its second argument is the macro that produces the +% current number. +% \begin{macrocode} + {\@begintheorem{#2}{\csname the#1\endcsname}\ignorespaces}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xthm} +% \begin{macro}{\@ythm} +% Both these macros were originally called by |\@thm|. We do +% not need |\@xthm| anymore, hence we reset it to +% |\relax|. The definition of |\@ythm| has not changed at +% all from its definition in \LaTeX. In order to make the macros +% easier to understand, we will +% nevertheless present it (commented out). +% \begin{macrocode} +\global\let\@xthm\relax +% \def\@ythm#1#2[#3]{\@opargbegintheorem{#2}{\csname +% the#1\endcsname}{#3}\ignorespaces} +%</package> +% \end{macrocode} +% The primitive |\ignorespaces| in |\@ythm| and +% |\@thm| is needed to remove the spaces between the +% |\begin{...}| and the actual text. +% \end{macro} +% \end{macro} +% +% +% \subsection{Definition of the theorem substyles} +% +% As already pointed out, the theorem substyles, defined below, are +% only loaded when necessary. Note that all these substyles, except +% \texttt{plain}, have |\slshape| as the default body font. +% +% \subsubsection{The \texttt{plain} style} +% +% \label{dok:th@plain} As the following macros use |@|, we have +% to locally set the |\catcode| of this symbol to ``letter''. +% This happens within a group, so that we do not have to worry about +% which |\catcode| that symbol had before. +% \begin{macrocode} +%<*thp> +\begingroup \makeatletter +% \end{macrocode} +% Since we are now within a group, we must make all definitions +% globally. First we make sure that \texttt{theorem.sty} is loaded. +% This will allow us to use this file as a document style option +% without having to call \texttt{theorem} itself as an option. At the +% same time, we assure that at least version 2 is loaded, since +% |\theorem@style| was not defined in earlier versions. +% \begin{macrocode} +\@ifundefined{theorem@style}{\input{theorem.sty}}{} +\ProvidesFile{thp.sty} + [\FMithmInfo] +% \end{macrocode} +% +% +% \begin{macro}{\th@plain} +% \begin{macro}{\@begintheorem} +% \begin{macro}{\@opargbegintheorem} +% |\theoremstyle{plain}| corresponds to the original +% definition, except that the distances to the surrounding text are +% determined by the parameters |\theorempreskipamount| and +% |\theorempostskipamount|. +% First we set the default body font. +% \begin{macrocode} +\gdef\th@plain{\normalfont\itshape +% \end{macrocode} +% Then we define |\@begintheorem| and +% |\@opargbegintheorem|. These two macros define how the +% header of a theorem is typeset. |\@opargbegintheorem| will +% be called if a \textsf{theorem} environment with an optional +% argument is encountered; otherwise, the header is constructed by +% calling |\@begintheorem|. If one of these macros is +% executed, we are within a \textsf{trivlist} environment started by +% |\@thm|. So the theorem header is produced with an +% |\item| command. +% +% Instead of specifying the header font directly, all standard +% theorem styles use the |\theorem@headerfont| macro to allow +% customization. The extra space (|\labelsep|) is necessary +% because of problems in the \textsf{trivlist} environment. +% \begin{macrocode} + \def\@begintheorem##1##2{% + \item[\hskip\labelsep \theorem@headerfont ##1\ ##2]}% +% \end{macrocode} +% The definition of |\@opargbegintheorem| is completely +% analogous. The only difference is the fact that there exists a +% third argument (which is the optional parameter of the +% environment and contains additional information about the +% theorem). Customarily we enclose it in parentheses. +% \begin{macrocode} +\def\@opargbegintheorem##1##2##3{% + \item[\hskip\labelsep \theorem@headerfont ##1\ ##2\ (##3)]}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \noindent +% We conclude with an |\endgroup| to restore the +% |\catcode| of |@|. +% \begin{macrocode} +\endgroup +%</thp> +% \end{macrocode} +% +% +% \subsubsection{The \texttt{break} style} +% +% This style option is stored in the file |thb.sty|. +% For the next two lines see the documentation for |\th@plain| on +% page~\pageref{dok:th@plain}. +% \begin{macrocode} +%<*thb> +\begingroup \makeatletter +\@ifundefined{theorem@style}{\input{theorem.sty}}{} +\ProvidesFile{thb.sty} + [\FMithmInfo] +% \end{macrocode} +% +% \begin{macro}{\th@break} +% |\theoremstyle{break}| produces a line break after the name +% of the theorem. The font is |\slshape|. Hence, we define +% |\th@break| as follows: +% \begin{macrocode} +\gdef\th@break{\normalfont\slshape + \def\@begintheorem##1##2{\item[% +% \end{macrocode} +% We run into the following problem: it is not possible to create +% the header with |\item[|\meta{title}|]| and then start +% a new line by, for example, |\mbox{}\\|. Such a definition +% will fail whenever a list environment follows immediately. With +% the above construction, the |\mbox{}| causes the switch +% |@inlabel| (cf.\ definition of |\list| and +% |\trivlist| in \cite{latex:source}) to be set to \texttt{false} +% and so the following list will insert additional vertical +% space (|\topskip|). This is quite annoying. Therefore, we +% create the line break within the |\item|. In order to ensure +% that the text will begin at the proper position in the following +% line, we simply pretend that the label does not take any +% room.\footnote{This will lead to problems whenever very high +% symbols occurring in the line tower into the +% heading. So, something else has to be done here sometime.} +% \begin{macrocode} + \rlap{\vbox{\hbox{\hskip \labelsep\theorem@headerfont ##1\ ##2}% + \hbox{\strut}}}]}% +% \end{macrocode} +% Again, the definition of |\@opargbegintheorem| is +% completely analogous. +% \begin{macrocode} +\def\@opargbegintheorem##1##2##3{% + \item[\rlap{\vbox{\hbox{\hskip \labelsep \theorem@headerfont + ##1\ ##2\ (##3)}% + \hbox{\strut}}}]}} +\endgroup +%</thb> +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{The \texttt{changebreak} style} +% +% \begin{macrocode} +% This style option is stored in the file |thcb.sty|. +% \begin{macrocode} +%<*thcb> +\begingroup \makeatletter +\@ifundefined{theorem@style}{\input{theorem.sty}}{} +\ProvidesFile{thcb.sty} + [\FMithmInfo] +% \end{macrocode} +% +% \begin{macro}{\th@changebreak} +% The \texttt{change-break} theorem style is like \texttt{break} +% but with interchange of theorem name and theorem number. Thus we +% define |\th@changebreak| as follows: +% \begin{macrocode} +\gdef\th@changebreak{\normalfont\slshape + \def\@begintheorem##1##2{\item + [\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont ##2\ ##1}% + \hbox{\strut}}}]}% +\def\@opargbegintheorem##1##2##3{% + \item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##2\ ##1\ (##3)}% + \hbox{\strut}}}]}} +\endgroup +%</thcb> +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{The \texttt{change} style} +% +% This style option is stored in the file |thc.sty|. +% \begin{macrocode} +%<*thc> +\begingroup \makeatletter +\@ifundefined{theorem@style}{\input{theorem.sty}}{} +\ProvidesFile{thc.sty} + [\FMithmInfo] +% \end{macrocode} +% +% \begin{macro}{\th@change} +% The \texttt{change} theorem style corresponds to the +% \texttt{change break} style without a linebreak after the header. +% To say it in another way, it's the same as the \texttt{plain} +% style but with number and name interchanged and |\slshape| as the +% default font. +% \begin{macrocode} +\gdef\th@change{\normalfont\slshape + \def\@begintheorem##1##2{\item + [\hskip\labelsep \theorem@headerfont ##2\ ##1]}% +\def\@opargbegintheorem##1##2##3{% + \item[\hskip\labelsep \theorem@headerfont ##2\ ##1\ (##3)]}} +\endgroup +%</thc> +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{The \texttt{marginbreak} style} +% +% This style option is the one used most often at Mainz. It is saved +% in the file |thmb.sty|. +% \begin{macrocode} +%<*thmb> +\begingroup \makeatletter +\@ifundefined{theorem@style}{\input{theorem.sty}}{} +\ProvidesFile{thmb.sty} + [\FMithmInfo] +% \end{macrocode} +% +% \begin{macro}{\th@marginbreak} +% The \texttt{margin break} style is nearly the same as the +% \texttt{change break} style. The only difference is the placement +% of the theorem number. We use |\llap| to place it in the left +% margin. +% +% In this style |\labelsep| denotes the separation between the +% number and the text. +% \begin{macrocode} +\gdef\th@marginbreak{\normalfont\slshape + \def\@begintheorem##1##2{\item + [\rlap{\vbox{\theorem@headerfont + \hbox{\llap{##2}\hskip\labelsep ##1}% + \hbox{\strut}}}]}% +\def\@opargbegintheorem##1##2##3{% + \item[\rlap{\vbox{\theorem@headerfont + \hbox{\llap{##2}\hskip\labelsep ##1\ (##3)}% + \hbox{\strut}}}]}} +\endgroup +%</thmb> +% \end{macrocode} +% \changes{v2.1c}{90/02/17}{`endgroup outside macrocode env.} +% \end{macro} +% +% +% +% \subsubsection{The \texttt{margin} style} +% +% This style option is stored in the file |thm.sty|. +% \begin{macrocode} +%<*thm> +\begingroup \makeatletter +\@ifundefined{theorem@style}{\input{theorem.sty}}{} +\ProvidesFile{thm.sty} + [\FMithmInfo] +% \end{macrocode} +% +% \begin{macro}{\th@margin} +% Again this is only a variant of the theorem styles described +% above without any new ideas. +% \begin{macrocode} +\gdef\th@margin{\normalfont\slshape + \def\@begintheorem##1##2{\item + [\theorem@headerfont \llap{##2}\hskip\labelsep ##1]}% +\def\@opargbegintheorem##1##2##3{% + \item[\theorem@headerfont \llap{##2}\hskip\labelsep ##1\ (##3)]}} +\endgroup +%</thm> +% \end{macrocode} +% \end{macro} +% +% +% +% +% \subsection{Final Definitions} +% +% \begin{macro}{\theorempreskipamount} +% \begin{macro}{\theorempostskipamount} +% The \textsf{skip} parameters that regulate the vertical empty space +% before and after the {\envfont theorem} environment have +% to be allocated as well. +% \changes{v2.0f}{89/07/20}{Unnecessary `global' removed.} +% \begin{macrocode} +%<*package> +\newskip\theorempreskipamount +\newskip\theorempostskipamount +% \end{macrocode} +% Since we have used the same values for all theorem sets, we now can +% assign them. +% \begin{macrocode} +\global\setlength\theorempreskipamount{12pt plus 5pt minus 3pt} +\global\setlength\theorempostskipamount{8pt plus 3pt minus 1.5pt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@endtheorem} +% The same holds for the macro |\@endtheorem|, which ends a +% {\envfont theorem} environment. Since it is the same for all +% theorem sets, it is removed from the macros |\th@|\meta{style}. +% It simply ends the {\envfont trivlist} environment, which was +% begun in |\@thm|. +% \begin{macrocode} +\global\let\@endtheorem=\endtrivlist +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@preamblecmds} +% All macros defined above are to be used only in the preamble. +% Therefore, we insert them in |\@preamblecmds| which will disable +% them at begin document. This is done by the internal \LaTeXe{} +% command |\@onlypreamble|. +% \changes{v2.0g}{89/09/19}{`theoremheaderfont and `theorembodyfont +% added.} +% \changes{v2.2a}{94/02/03}{Use \LaTeXe{} interface} +% \begin{macrocode} +\@onlypreamble\@xnthm +\@onlypreamble\@ynthm +\@onlypreamble\@othm +\@onlypreamble\newtheorem +\@onlypreamble\theoremstyle +\@onlypreamble\theorembodyfont +\@onlypreamble\theoremheaderfont +% \end{macrocode} +% \end{macro} +% +% Finally we declare the \texttt{plain} theorem style to be the default. +% \changes{v2.1b}{90/06/04}{Fixed missing `item by declaring default +% style.} +% \begin{macrocode} +\theoremstyle{plain} +%</package> +% \end{macrocode} +% +% \Finale + +\endinput |