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/ntheorem/README | 63 + macros/latex/contrib/ntheorem/ntheorem.dtx | 5258 ++++++++++++++++++++++++++++ macros/latex/contrib/ntheorem/ntheorem.ins | 18 + macros/latex/contrib/ntheorem/ntheorem.pdf | Bin 0 -> 475991 bytes 4 files changed, 5339 insertions(+) create mode 100644 macros/latex/contrib/ntheorem/README create mode 100644 macros/latex/contrib/ntheorem/ntheorem.dtx create mode 100644 macros/latex/contrib/ntheorem/ntheorem.ins create mode 100644 macros/latex/contrib/ntheorem/ntheorem.pdf (limited to 'macros/latex/contrib/ntheorem') diff --git a/macros/latex/contrib/ntheorem/README b/macros/latex/contrib/ntheorem/README new file mode 100644 index 0000000000..9a67fabac9 --- /dev/null +++ b/macros/latex/contrib/ntheorem/README @@ -0,0 +1,63 @@ +ntheorem.dtx includes the style-file, a standard configuration, and the +documentation. Additional information (including a test-file) is +available at + + http://user.informatik.uni-goettingen.de/~may/Ntheorem/ + +We recommend placing the unpacked files (and this message) in an extra +directory + + macros/latex/contrib/ntheorem/ + +Wolfgang May & Andreas Schedler + +-------------------- + +Abstract: + +ntheorem.sty for LaTeX + +by Wolfgang May and Andreas Schedler + +ntheorem.sty is a package for handling theorem-like environments. +Aditionally to several features for defining the layout of +theorem-like environments which can be regarded to be standard +requirements for a theorem-package, it provides solutions for two +related problems: placement of endmarks and generation of lists +of theorem-like environments. + +In contrast to former approaches, it solves the problem of +setting endmarks of theorem-like environments (theorems, +definitions, examples, and proofs) automatically at the right +positions, even if the environment ends with a displaymath or +(even nested) list environments, it also copes with the amsmath +package. This is done in the same manner as the handling of +labels by using the .aux file. + +It also introduces the generation of lists of theorem-like +environments in the same manner as listoffigures. Additionally, +more comfortable referencing is supported. + +After running LaTeX several times (depending on the complexity of +references, in general, three runs are sufficient), the endmarks +are set correctly, and theoremlists are generated. + +Since ntheorem.sty uses the standard LaTeX \newtheorem command, +existing documents can be switched to ntheorem.sty without having +to change the .tex file. Also, it is compatible with LaTeX files +using theorem.sty written by Frank Mittelbach. + +Features: + + * General Layout of Theorems: + different predefined theoremstyles, according to theorem.sty, + defining own theoremstyles by \newtheoremstyle, + * Placement of End Marks: + automatically setting end marks for theorem-like environments + in text, math environments, lists etc., + * Generation of Theorem Lists: + Generation of list-of-theorem similar to list-of-figures, + different predefined liststyles, according to theorem.sty, + defining own liststyles by \newliststyle, + * Referencing: + Extended referencing feature, yielding, e.g. "Theorem 42". diff --git a/macros/latex/contrib/ntheorem/ntheorem.dtx b/macros/latex/contrib/ntheorem/ntheorem.dtx new file mode 100644 index 0000000000..6362cdc369 --- /dev/null +++ b/macros/latex/contrib/ntheorem/ntheorem.dtx @@ -0,0 +1,5258 @@ +\def\filedate{2011/08/15} +\def\docdate{2011/08/15} +\def\fileversion{1.33} +\def\basename{ntheorem} +% \iffalse +% +% Package 'ntheorem' to use with LaTeX2e +% Copyright 1997 - 2011 by Wolfgang May and Andreas Schedler. +% +% Written and maintained by +% Wolfgang May (Uni Goettingen, formerly Uni Freiburg) +% [theorem-marks, general layout] +% and Andreas Schedler (formerly TU Clausthal; formerly +% Andreas Schlechte) +% [theorem-lists, list layout] +% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.2 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.2 or later is part of all distributions of LaTeX +%% version 1999/12/01 or later. +% +% Please send bugreports and suggestions to +% +% Wolfgang May +% Institut f"ur Informatik, Universit"at Goettingen +% e-mail: may@informatik.uni-goettingen.de +% +% Andreas Schedler +% e-mail: ntheorem@andreas-schedler.net +% +% \fi +% +% \CheckSum{2850} +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +% +% \RecordChanges +% \changes{v0.80}{1997/02/11}{Started integration of `thmmarks.sty' with +% `newthm.sty':} +% \changes{v0.82}{1997/02/12}{included handling of theoremlists from +% newthm.sty (WM)} +% \changes{v0.85}{1997/02/14}{replaced `bf' by corresponding \LaTeXe-commands (AS)} +% \changes{v0.87}{1997/02/18}{Renamed style to `ntheorem.sty' (WM)} +% \changes{v0.88}{1997/02/18}{fixed some package-infos (AS)} +% \changes{v0.90}{1997/02/19}{changed `addtheoremline, @nthm, @othm' (WM)} +% \changes{v0.90}{1997/02/19}{counter only active if `if@thmmarks' (WM)} +% \changes{v0.91}{1997/02/24}{moved things from @othm, @xnthm, @ynthm to +% @newtheorem, introduced @@name (WM)} +% \changes{v0.91}{1997/02/24}{added name* (no entry in list) (WM)} +% \changes{v0.91}{1997/02/28}{included .sty in .dtx file (WM)} +% \changes{v1.00}{1997/04/21}{First official version, not changed against 0.94 (WM)} +% \changes{v1.01}{1997/05/01}{changed some `def' to `gdef' and `edef' +% to `xdef' in `newtheorem' and related +% macros (WM)} +% \changes{v1.17}{1999/09/06}{Y2K for changes in documentation (AS)} +% \changes{v1.17}{1999/09/06}{included option noconfig in driver (AS)} +% \changes{v1.18}{1999/12/23}{debugged starred version of 'newtheorem' +% (WM, reported by Jonathan King)} +% \changes{v1.18}{1999/12/25}{adapted for complex theorem keywords +% (WM, reported by Jonathan King)} +% \changes{v1.19}{2001/01/12}{adapted to amsmath-2.0 (WM, several +% solutions by Giovanni Dore)} +% \changes{v1.19}{2001/01/13}{added handling of amsmath-labels with thref; +% moved option thref before amsmath (amsmath needs redefinition of +% `label') (WM)} +% \changes{v1.21}{2002/12/30}{added theoremprework and postwork (WM)} +% \changes{v1.32}{2011/02/28}{implemented new theorem skip scheme (WM)} +% +% \MakeShortVerb{\|} +% \def\envfont{\normalfont\ttfamily} +% \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\packedlist#1{% +% \begin{list}{}{\settowidth\labelwidth{#1}\setlength\leftmargin\labelwidth +% \addtolength\leftmargin\labelsep +% \topsep=0pt\itemsep=0.05cm\parsep=0.05cm +% \let\makelabel\nlabel}} +% \def\endpackedlist{\end{list}} +% \makeatletter +% \def\packeddescr{% +% \begin{list}{}{\leftmargin0.5cm +% \labelwidth\z@\itemindent-\leftmargin +% \topsep=0pt\itemsep=0.05cm\parsep=0.05cm +% \let\makelabel\nlabel}} +% \def\endpackeddescr{\end{list}} +% +% \def\Codelabel#1{\@bsphack +% \protected@write\@auxout{}{\string\newlabel{#1}{{\number\the +% \c@CodelineNo}{\thepage}}}\@esphack} +% \newcounter{tmpcount} +% \def\Coderef#1#2{\setcounter{tmpcount}{0}\@ifundefined{r@#1}\relax +% {\setcounter{tmpcount}{\ref{#1}}}\relax +% \addtocounter{tmpcount}{#2}\arabic{tmpcount}} +% \makeatother +% +% \def\nlabel#1{#1\hfill} +% \def\nlist#1{\begin{list}{}{\settowidth\labelwidth{#1}% +% \setlength\leftmargin\labelwidth +% \addtolength\leftmargin\labelsep +% \let\makelabel\nlabel}} +% \def\endnlist{\end{list}} +% \def\DANGER{{\LARGE\textbf{! }\rule{0pt}{2ex}}} +% \def\env{\meta{env}} +% \def\envx{\meta{env'}} +% +% \theoremstyle{marginbreak} +% \theoremheaderfont{\normalfont\bfseries}\theorembodyfont{\slshape} +% \theoremsymbol{\ensuremath{\diamondsuit}} +% \theoremseparator{:} +% \newtheorem{Theorem}{Theorem} +% +% \theoremstyle{changebreak} +% \theoremsymbol{\ensuremath{\heartsuit}} +% \theoremindent0.5cm +% \theoremnumbering{greek} +% \newtheorem{Lemma}{Lemma} +% +% \theoremindent0cm +% \theoremsymbol{\ensuremath{\spadesuit}} +% \theoremnumbering{arabic} +% \newtheorem{Corollary}[Theorem]{Corollary} +% +% \theoremstyle{change} +% \theorembodyfont{\upshape} +% \theoremsymbol{\ensuremath{\ast}} +% \theoremseparator{} +% \newtheorem{Example}{Example} +% +% \theoremstyle{plain} +% \theoremsymbol{\ensuremath{\clubsuit}} +% \theoremseparator{.} +% \theoremprework{\bigskip\hrule} +% \theorempostwork{\hrule\bigskip} +% \newtheorem{Definition}{Definition} +% +% \theoremheaderfont{\sc}\theorembodyfont{\upshape} +% \theoremstyle{nonumberplain} +% \theoremseparator{} +% \theoremsymbol{\rule{1ex}{1ex}} +% \newtheorem{Proof}{Proof}% +% +% +% \title{An Extension of the \LaTeX-Theorem Evironment\thanks{This +% file has version number \fileversion{}, last revised \filedate.}} +% \author{\setcounter{footnote}{2}% +% Wolfgang May\thanks{\texttt{may@informatik.uni-goettingen.de}}\\ +% Institut f\"ur Informatik, \\ +% Universit\"at G\"ottingen \\ +% Germany +% \and +% Andreas Schedler\thanks{\texttt{ntheorem@andreas-schedler.net}}\\ +% } +% \date{\filedate} +% \maketitle +% +% \begin{abstract} +% \noindent +% |ntheorem.sty| is a package for handling theorem-like +% environments. +% Aditionally to several features for defining the layout of +% theorem-like environments which can be regarded to be standard +% requirements for a theorem-package, it provides solutions for +% two related problems: placement of endmarks and generation of +% lists of theorem-like environments. +% +% In contrast to former approaches, it solves the problem of +% setting endmarks of theorem-like environments (theorems, +% definitions, examples, and proofs) \emph{automatically} at the +% right positions, even if the environment ends with a |displaymath| +% or (even nested) list environments, it also copes with the +% |amsmath| package. +% This is done in the same manner as the handling of labels by +% using the |.aux| file. +% +% It also introduces the generation of lists of theorem-like +% environments in the same manner as |listoffigures|. Additionally, +% more comfortable referencing is supported. +% +% After running \LaTeX\ several times (depending on the complexity +% of references, in general, three runs are sufficient), the endmarks +% are set correctly, and theoremlists are generated. +% +% Since |ntheorem.sty| uses the standard \LaTeX\ |\newtheorem| +% command, existing documents can be switched to +% |ntheorem.sty| without having to change the |.tex| file. +% Also, it is compatible with \LaTeX\ files using |theorem.sty| +% written by Frank Mittelbach. +% \end{abstract} +% \newpage +% +% \tableofcontents +% +% +% \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, examples, +% remarks, and proofs are all instances of ``theorems''. +% The ``header'' of +% these structures is composed of the type of the structure +% (such as \textsc{Theorem} or \textsc{Remark}), a number +% which serializes the instances of the same type throughout the +% document, and an optional name (such as ``Correctness Theorem''). +% +% The layout of theorems can be changed by parameters as the fonts +% of the header and the body, the way how to arrange the headers, +% the indentation, and the way of numbering it. +% Confronted with these requirements, |theorem.sty|, a style for +% dealing with theorem layout was developed by Frank Mittelbach +% which was the standard theorem-environment for long time. +% +% But then the desire for additional features like ``endmarks'' +% and ``theorem-lists'' arose. +% Two extensions of |theorem.sty| were developped: One for handling +% endmarks, |thmmarks.sty| and one for generating lists, |newthm.sty|. +% Thus, Frank Mittelbach suggested to combine the new features into +% one ``standard-to-be'' package. +% And now, here it is. +% +% \section{The User-Interface} +% \subsection{How to include the package} +% +% The package |ntheorem.sty| is included by +% \begin{quote} +% |\usepackage[|\meta{options}|]{ntheorem}|, +% \end{quote} +% where the optional parameter \meta{options} selects predefined +% configurations and special requirements. +% +% The following \meta{options} are available by now, concerning +% partially independent issues: +% \begin{description} +% \item[Predefined environments:] (see Section~\ref{sec:standard}) +% With [standard] and [noconfig], it can be chosen, if and what +% file is used for activating a (user-defined) standard set of +% theorem environments. +% \item[Fancy boxes around theorems:] The [framed] option allows +% to use |framed.sty| that provides boxes even across pagebreaks. +% \item[Activation of endmarks:] +% [thmmarks] enables the automatical placement of endmarks +% (see \ref{sec:general}); when using the |amsmath|-package, +% [thmmarks] must be complemented by [amsmath] +% (see Section~\ref{sec:amslatex}). +% \item[Activation of extended reference features:] +% [thref] enables the extended reference features +% (see Section~\ref{sec-ExtRef}); when using the |amsmath|-package, +% [thref] must be complemented by [amsmath] +% (see Section~\ref{sec:amslatex}). +% \item[Compatibility with amsthm:] option [amsthm] provides +% compatibility with the theorem-layout +% commands of the |amsthm|-package (see Section~\ref{sec:amslatex}). +% \item[Compatibility with hyperref:] option [hyperref] provides +% compability with the |hyperref|-package +% (see Section~\ref{sec:hyperref}). +% \end{description} +% +% The package itself loads |ifthen.sty|. +% +% \subsection{Defining New Theorem Sets} +% +% \DescribeMacro\newtheorem +% The syntax and semantics is exactly the same as in standard +% \LaTeX{}: the command |\newtheorem| defines a new ``theorem set'' +% or ``theorem-like structure''. +% Two required arguments name the new environment set 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\}\{bar\}{[section]}] +% The theorem set {\envfont foo3} (printed name \texttt{bar}) 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} +% +% For every environment \meta{name}\ defined by |\newtheorem|, +% \emph{two} enviroments \meta{name} and \meta{name|*|}\ are defined. +% In the main document, they have exactly the same effect, but +% the latter causes no entry in the respective list of theorems +% (cf.\ |\section| and |\section*|), see also Section +% \ref{sec:thmlists}. +% +% \DescribeMacro\renewtheorem +% Theorem sets can be redefined by |\renewtheorem|, with the same arguments +% as explained for |\newtheorem|. When redefining a theorem set, the +% counter is not re-initialized. +% +% \subsection{Defining the Layout of Theorem Sets}\label{sec:general} +% +% For theorem-like environments, the user can set parameters +% by setting several switches and then calling |\newtheorem|. +% The layout of a theorem set is defined with the values of the switches +% at the time |\newtheorem| is called. +% +% \subsubsection{Parameters for Individual Sets} +% \label{se-new-skips} +% +% The layout of individual theorem sets can be further determined +% by switches controlling the appearance of the headers and the +% header-body-layout: +% +% \begin{itemize} +% \item +% \DescribeMacro\theoremstyle +% |\theoremstyle{|\meta{style}|}|: The general structure of the +% theorem layout is defined via its |\theoremstyle|. |\ntheorem| +% provides several predefined styles including those of +% Frank Mittelbach's |theorem.sty| +% (cf.\ Section \ref{sec:predefdstyles}. +% Additional styles can be defined by |\newtheoremstyle| +% (cf.\ Section\ref{sec:newtheoremstyle}). +% \item +% \DescribeMacro\theoremheaderfont +% |\theoremheaderfont{|\meta{fontcmds}|}|: The theorem header is set +% in the font specified by \meta{fontcmds}. +% +% In contrast to |theorem.sty|, |\theoremheaderfont| can be set +% individually for each environment type. +% \item +% \DescribeMacro\theorembodyfont +% |\theorembodyfont{|\meta{fontcmds}|}|: The theorem body is set +% in the font specified by \meta{fontcmds}. +% \item +% \DescribeMacro\theoremnumbering +% |\theoremnumbering{|\meta{style}|}| specifies the appearance of +% the numbering of the theorem set. Possible \meta{styles} are +% |arabic| (default), |alph|, |Alph|, |roman|, +% |Roman|, |greek|, |Greek|, and |fnsymbol|. +% +% Clearly, if a theorem-environment uses the counter of another +% environment type, also the numbering style of that environment +% is used. +% \item +% \DescribeMacro\theoremseparator +% |\theoremseparator{|\meta{thing}|}|: \meta{thing} separates the +% header from the body of the theorem-environment. +% E.g., \meta{thing} can be +% ``:'' or ``.''. +% \item +% \DescribeMacro\theorempreskip +% \DescribeMacro\theorempostskip +% |\theorempreskip{|\meta{skip}|}| and +% |\theorempostskip{|\meta{skip}|}| can be used to specify the +% vertical space before/after the theorem environment (note that +% Section~\ref{sec-framed} that allows framed and shaded theorems +% also defines additional skip parameters). +% The arguments are rubber lengths, +% (`\textsf{skips}'), and therefore can contain \texttt{plus} and +% \texttt{minus} parts. +% (Note that these parameters changed with version 1.32; see +% Section~\ref{sec-old-skips}.) +% \item +% \DescribeMacro\theoremindent +% |\theoremindent|\meta{dimen} can be used to indent the theorem wrt.\ +% the surrounding text (note that |\theoremindent| is specified +% without |{|\ldots|}|). +% +% \DANGER It's a `\textsf(dimen)', so the user shouldn't try to specify a +% \texttt{plus} or \texttt{minus} part, because this leads to an error. +% \item +% \DescribeMacro\theoremsymbol +% |\theoremsymbol{|\meta{thing}|}|: This is only active if +% |ntheorem.sty| is loaded with option |[thmmarks]|. +% \meta{thing} is set as an endmark at the end of every instance +% of the environment. +% If no symbol should appear, say |\theoremsymbol{}|. +% \end{itemize} +% +% The above properties carry over to all subsequent |\newtheorem| +% statements until they are set differently. Initially, they have +% default values. +% +% The following two properties apply only to the very next |\newtheorem| +% and are then automatically reset: +% +% \begin{itemize} +% \item +% \DescribeMacro\theoremprework +% \changes{v1.30}{2010/08/14}{`theoremprework': added comment on +% `leavevmode' to documentation (WM)} +% |\theoremprework{|\meta{thing}|}|: \meta{thing} is performed +% before starting the theorem structure. +% E.g., \meta{thing} can be |\bigskip\hrule\leavevmode|. +% If the vertical space after your theoremprework does not look as +% intended, try to put |\leavevmode| at its end (as in the above +% example). +% \item +% \DescribeMacro\theorempostwork +% |\theorempostwork{|\meta{thing}|}|: \meta{thing} is performed +% after finishing the theorem structure. +% E.g., \meta{thing} can be |\hrule|. +% \end{itemize} +% +% The flexibility provided by these command should relieve the +% users from the ugly hacking in |\newtheorem| to fit most of +% the requirements stated by publishers or supervisors. +% +% \DescribeMacro\theoremclass +% With the command |\theoremclass{|\meta{theorem-type}|}| +% (where \meta{theorem-type} must be an already defined theorem type), +% these parameters can be set to the values which were used when +% |\newtheorem| was called for \meta{theorem-type}. +% +% With |\theoremclass{LaTeX}|, the standard \LaTeX\ layout can be +% chosen. +% +% \subsubsection{Font Selection} +% +% From the document structuring point of view, theorem environments +% are regarded as special parts inside a document. Furthermore, +% the theorem header is only a distinguished part of a theorem +% environment. +% Thus, |\theoremheaderfont| inherits characteristics of +% |\theorembodyfont| which also inherits in characteristics of +% the font of the surrounding environment. +% 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, the corresponding property has to be +% explicitly overwritten in |\theoremheaderfont|, e.g. +% by |\theoremheaderfont{\normalfont\bfseries}| +% +% \subsubsection{Predefined theorem styles}\label{sec:predefdstyles} +% +% The following theorem styles are predefined, covering those +% from |theorem.sty|: +% \begin{deflist}{nonumberbreak:} +% \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[change] +% Header number and text are interchanged, without a line break. +% \item[changebreak] +% Like \texttt{change}, but with a line break after the header. +% \item[margin] +% The number is set in the left margin, without a line break. +% \item[marginbreak] +% Like \texttt{margin}, but with a line break after the header. +% \item[nonumberplain] +% Like \texttt{plain}, without number (e.g.\ for proofs). +% \item[nonumberbreak] +% Like \texttt{break}, without number. +% \item[empty] +% No number, no name. Only the optional argument is typeset. +% \end{deflist} +% +% \subsubsection{Default Setting} +% +% If no option is given, i.e.\ |ntheorem.sty| is loaded by +% |\usepackage{ntheorem.sty}|, the following default is set up: +% \begin{quote} +% |\theoremstyle{plain}|,\\ +% |\theoremheaderfont{\normalfont\bfseries}| and\\ +% |\theorembodyfont{\itshape}|,\\ +% |\theoremseparator{}|,\\ +% |\theorempreskip{\topsep}|, \\ +% |\theorempostskip{\topsep}|, where |\topsep| refers to the space +% that \LaTeX\ inserts above and below lists, \\ +% |\theoremindent0cm|,\\ +% |\theoremnumbering{arabic}|, \\ +% |\theoremsymbol{}|. +% \end{quote} +% Thus, by only saying |\newtheorem{...}{...}|, the user gets +% the same layout as in standard \LaTeX. +% +% +% \subsubsection{Deprecated: Skips until Version 1.32} +% \label{sec-old-skips} +% +% \DescribeMacro\theorempreskipamount +% \DescribeMacro\theorempostskipamount +% Until version 1.31, there was only a simplified handling +% of vertical space before/after theorems that did not consider +% framed and shaded theorems (that have been introduced with v1.21). +% |\theorempreskipamount|\meta{skip} and +% |\theorempostskipamount|\meta{skip} defined, +% respectively, the spacing before and after such an environment +% (note that both are specified without |{|\ldots|}|). +% These parameters applied 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. +% +% Unchanged, older \LaTeX\ sources that used these commands yield the +% same output as before since the new skip scheme described in +% Section~\ref{se-new-skips} is only activated if one of its commands +% is used. Otherwise, the old scheme is applied. +% +% +% \subsubsection{A Standard Set of Theorems}\label{sec:standard} +% +% A standard configuration of theorem sets is provided within +% the file |ntheorem.std|, which will be included by the option +% |[standard]|. It uses the |amssymb| and |latexsym| (automatically +% loaded) packages and defines the following sets: +% \begin{nlist}{Definitions:} +% \item[Theorems:] % |Theorem|, |Lemma|, |Proposition|, +% |Corollary|, |Satz|, |Korollar|, +% \item[Definitions:] |Definition|, +% \item[Examples:] |Example|, |Beispiel|, +% \item[Remarks:] |Anmerkung|, |Bemerkung|, |Remark|, +% \item[Proofs:] |Proof| and |Beweis|. +% \end{nlist} +% These theorem sets seem to be the most frequently used environments +% in english and german +% documents. +% +% The layout is defined to be theoremstyle |plain|, bodyfont |\itshape|, +% Headerfont |\bfseries|, and endmark (theoremsymbol) +% |\ensuremath{_\Box}| for all theorem-like environments\footnote{Note, +% that mathmode is ensured for the symbol.}. +% For the definition-, remark- and example-like sets, +% the above setting is used, except bodyfont |\upshape|. +% The proof-like sets are handled a bit differently. There, the layout +% is defined as theoremstyle |nonumberplain|, bodyfont |\upshape|, +% headerfont |\scshape| and endmark |\ensuremath{_\blacksquare}|. +% For a more detailed information look at +% |ntheorem.std| or at the code-section. +% +% \subsubsection{Framed and Boxed Theorems}\label{sec:frames-and-boxes} +% +% With the advent of the |framed| package (by Donald Arseneau) in 2001, +% a feature that has often been asked for for ntheorem could be +% implemented: theorems that are framed, or that are put into a colored +% box. +% It requires to load the |framed| package; shaded theorems also +% require the |pstricks| package. +% Frames and colored boxes are orthogonal to the existing +% theoremstyles -- thus, they can be combined in arbitrary ways. +% +% \DescribeMacro\newframedtheorem +% A theorem type can be framed by defining it by +% \begin{quote} +% |\newframedtheorem{...}{...}| +% \end{quote} +% with the same parameters as usually for |\newtheorem|. +% Note that the use of the |framed| package also allows to have longer +% theorems across a page break framed (in this case, by default, there +% are horizontal lines before and after the page break; this can +% even be circumvented by combining with \texttt{mdframed} package +% (since 2010)). +% +% \DescribeMacro\newshadedtheorem +% +% The same ideas hold for theorems in shaded boxes. The declaration +% \begin{quote} +% |\newshadedtheorem{...}{...}| +% \end{quote} +% declares a theorem environment that is shaded. By default, the +% background color is |gray|. This can be changed by defining \\ +% \begin{quote} +% |\shadecolor{|\meta{color}|}| +% \end{quote} +% before declaring the theorem type. Note that later declarations +% of other shaded theorem types can use another shadecolor. +% +% By default, the box is given as a |\psframebox| (see |pstricks| +% package) with shadecolor as |linecolor| and |fillcolor|. All +% these parameters can be changed by setting +% \begin{quote} +% |\def\theoremframecommand{|\meta{any box command}|}| +% \end{quote} +% before declaring the theorem type (for examples, the +% user is referred to section \ref{sec:examples}). +% +% For using pdflatex (where pstricks is not available), e.g. +% |\usepackage{color}| and +% |\theoremframecommand{\colorbox[rgb]{1,.9,.9}}| can be used. +% +% \paragraph{Vertical Spacing of Framed Theorems} +% +% The New Skip Scheme introduced with version 1.32 allows +% a detailed specification of vertical space also for framed +% theorems (specified individually for each theorem class): + +% \begin{itemize} +% \item |\theorempreskip{|\meta{skip}|}| and +% |\theorempostskip{|\meta{skip}|}| have no effect for +% framed theorems. +% \item +% \DescribeMacro\theoremframepreskip +% \DescribeMacro\theoremframepostskip +% |\theoremframepreskip{|\meta{skip}|}| and +% |\theoremframepostskip{|\meta{skip}|}| can be used to specify the +% vertical space before/after the frame/box. +% \item +% \DescribeMacro\theoreminframepreskip +% \DescribeMacro\theoreminframepostskip +% |\theoreminframepreskip{|\meta{skip}|}| and +% |\theoreminframepostskip{|\meta{skip}|}| can be used to specify the +% vertical space around the theorem text \emph{inside} the +% frame/box. +% \item The arguments of the above commands are rubber lengths, +% (`\textsf{skips}'), and therefore can contain \texttt{plus} and +% \texttt{minus} parts. +% \item the default values of all above skips is |\topsep|, i.e., +% the space \LaTeX\ normally inserts before/after lists. +% \end{itemize} +% +% +% Old Skip Scheme (until v 1.31): +% |\theorempreskipamount| and |\theorempostskipamount| are +% applied \emph{inside} the frame/box. +% To obtain vertical space \emph{before} and \emph{after} the +% frame/box in versions 1.30--v.1.31, |\theoremframepreskipamount| and +% |\theoremframepostskipamount| could be used (both defined by default to +% 0pt) analogously (i.e., they are also common to all theorem types.) +% +% \subsubsection{Customization and Local Settings} +% +% Since the user should not change |ntheorem.std|, +% we've added the possibility to use an own configuration-file. +% If one places the file |ntheorem.cfg| in the path searched by +% \TeX, this file is read automatically (if |[standard]| +% is not given). The usage of |ntheorem.cfg| can be prevented by the +% |[noconfig]| option. Thus, just +% a copy of |ntheorem.std| to |ntheorem.cfg| must be made +% which then can freely be modified by the user. Note, that if a +% configuration-file exists, this will always be used (I.e.\ with +% option |standard| and an existing configuration-file, the |.cfg| +% file will be used and the |.std| file won't. +% +% \subsection{Generating Theoremlists}\label{sec:thmlists} +% +% \DescribeMacro\listtheorems +% Similar to the \LaTeX\ command |\listoffigures|, +% any theorem set defined with a |\newtheorem| statement +% may be listed at any place in your document by +% \begin{quote} +% |\listtheorems{|\meta{list}|}| +% \end{quote} +% The argument \meta{list} is a comma-separated list +% of the theorem sets to be listed. +% For a theorem set \meta{name}, only the instances are listed +% which are instantiated by |\begin{|\meta{name}|}|. Those +% instantiated by |\begin{|\meta{name}|*}| are omitted +% (cf.\ |\section| and |\section*|). +% +% For example, +% |\listtheorems{Corollary,Lemma}| +% leads to a list of all instances of one of the theorem sets +% ``Corollary'' or ``Lemma''. +% Note, that the set name given to the command is the first +% argument which is specified by |\newtheorem| which is also +% the one to be used in |\begin{theorem} ... \end{theorem}|. +% +% If |\listtheorems| is called for a set name which is not defined +% via |\newtheorem|, the user is informed that a list is generated, +% but there will be no typeset output at all. +% +% Note that in contrast to similar \LaTeX\ commands like +% |\listoffigures| etc.\, there is no automatically created +% heading. Users have to write it themselves -- but are free +% to choose what they want to have. +% +% \subsubsection{Defining the List Layout} +% +% \DescribeMacro\theoremlisttype +% Theoremlists can be formatted in different ways. Analogous to +% theorem layout, there are several predefined types which can be +% selected by +% \begin{quote} +% |\theoremlisttype{|\meta{type}|}| +% \end{quote} +% The following four \meta{type}s are available (for examples, the +% user is referred to section \ref{sec:examples}). +% \begin{deflist}{allname} +% \item[all] List any theorem of the specified set by number, +% (optional) name and pagenumber. This one is also the +% default value. +% \item[allname] Like |all|, additionally with leading theoremname. +% \item[opt] Analogous to |all|, but only the theorems which have an +% optional name are listed. +% \item[optname] Like |opt|, with leading theoremname. +% \end{deflist} +% +% \subsubsection{Writing Extra Stuff to the Theorem File} +% +% Similar to |\addcontentsline| and |\addtocontents|, +% additional entries to theoremlists are supported. +% Since entries to theoremlists are a bit more intricate than +% entries to the lists maintained by standard \LaTeX\, +% |\addcontentsline| and |\addtocontents| cannot be used in a +% straightforward way\footnote{for a theorem, its number has +% to be stored explicitly since different theorem sets can use +% the same counter. Also, it is optional to reset the counter for +% each section.}. +% +% \DescribeMacro\addtheoremline +% Analogous to |\addcontentsline|, an extra entry for a theorem +% list can be made by +% \begin{quote} +% |\addtheoremline{|\meta{name}|}{|\meta{text}|}| +% \end{quote} +% where \meta{name} is the name of a valid theorem set and \meta{text} +% is the text, which should appear in the list. For example, +% \begin{quote} +% |\addtheoremline{Example}{Extra Entry with number}| +% \end{quote} +% \addtheoremline{Example}{Extra Entry with number} +% generates an entry with the following characteristics: +% \begin{itemize} +% \item The Label of the theorem ``Example'' is used. +% \item The current value of the counter for ``Example'' is used +% \item The current pagenumber is used. +% \item The specified text is the optional text for the theorem. +% \end{itemize} +% Thus, the above command has the same effect as it would be for +% \begin{quote} +% |\begin{Example}[Extra Entry with number] \end{Example}| +% \end{quote} +% except, that there would be no output of the theorem, and the counter +% isn't advanced. +% +% \DescribeMacro{\addtheoremline*} +% Alternatively you can use +% \begin{quote} +% |\addtheoremline*{Example}{Extra Entry}| +% \end{quote} +% \addtheoremline*{Example}{Extra Entry} +% which is the same as above, except that the entry appears without +% number. +% +% \DescribeMacro\addtotheoremfile +% Sometimes, e.g.\ for long lists, special control sequences +% (e.g.\ a pagebreak) or additional text should be inserted into a +% list. This is done by +% \begin{quote} +% |\addtotheoremfile[|\meta{name}|]{|\meta{text}|}| +% \end{quote} +% where \meta{name} is the name of a theorem set and +% \meta{text} is the text to be written into the theorem file. +% If the optional argument \meta{name} is omitted, the given +% text is inserted in every list, otherwise it is only inserted +% for the given theorem set. +% +% \subsection{For Experts: Defining Layout Styles} +% \subsubsection{Defining New Theorem Layouts}\label{sec:newtheoremstyle} +% +% \DescribeMacro\newtheoremstyle +% Additional layout styles for theorems can be defined by +% \begin{quote} +% |\newtheoremstyle{|\meta{name}|}{|\meta{head}|}{|\meta{opt-head}|}|. +% \end{quote} +% After this, |\theoremstyle{|\meta{name}|}| is a valid +% |\theoremstyle|. +% Here, \meta{head} has to be a statement using two arguments, +% |##1|, containing the keyword, and |##2|, containing the number. +% \meta{opt-head} has to be a statement using three arguments where +% the additional argument |##3| contains the optional parameter. +% +% Since \LaTeX\ implements theorem-like environments by |\trivlist|s, +% both header declarations must be of the form +% |\item[... \theorem@headerfont ...]...|, where +% the dotted parts can be formulated by the user. +% If there are some statements producing +% output after the |\item[...]|, you have to care about implicit +% spaces. +% +% Because of the |@|, if |\newtheoremstyle| is used in a +% |.tex| file, it has to be put between |\makeatletter| and +% |\makeatother|. +% +% For details, look at the code documentation or the +% definitions of the predefined theoremstyles. +% +% \DescribeMacro\renewtheoremstyle +% Theorem styles can be redefined by |\renewtheoremstyle|, with the +% same arguments as explained for |\newtheoremstyle|. +% +% \subsubsection{Defining New Theorem List Layouts}\label{sec:listtypes} +% +% \DescribeMacro\newtheoremlisttype +% Analogous, additional layouts for theorem lists can be defined by +% \begin{quote} +% |\newtheoremlisttype{|\meta{name}|}{|\meta{start}|}{|\meta{line}% +% |}{|\meta{end}|}|. +% \end{quote} +% The first argument, \meta{name}, is the name of the listtype, +% which can the be used as a valid |\theoremlisttype|. +% \meta{start} is the sequence of commands to be executed at +% the very beginning of the list. +% Corresponding, \meta{end} will be executed at the end of the list. +% These two are set to do nothing in the standard-types. +% \meta{line} is the part to be called for every entry of the list. +% It has to be a statement using four arguments: |##1| will be +% replaced with the name of the theorem, |##2| with the number, +% |##3| with the theorem's optional text and |##4| with the pagenumber. +% +% WARNING: Self-defined Layouts will break with the |hyperref|-package. +% +% \DescribeMacro\renewtheoremlisttype +% Theorem list types can be redefined by |\renewtheoremlisttype|, with +% the same arguments as explained for |\newtheoremlisttype|. +% +% \subsection{Setting End Marks} +% +% The automatic placement of endmarks is activated by calling +% |ntheorem.sty| with the option |[thmmarks]|. +% Since then, the endmarks are set automatically, there are only +% a few commands for dealing with very special situations. +% +% \DescribeMacro\qed +% \DescribeMacro\qedsymbol +% If in a single environment, the user wants to replace the standard +% endmark by some other, this can be done by saying |\qed|, +% if |\qedsymbol| has been defined by |\qedsymbol{|\meta{something}|}| +% (in option standard, |\qedsymbol| is defined to be the symbol +% used for proofs, since a potential use of this features is to +% close trivial corollaries without explicitly proving them). +% +% Additionally, if in a single environment of a theorem set, that +% is defined without an endmark, the user wants to set an endmark, +% this is done with |\qedsymbol| and |\qed| as described above. +% |\qedsymbol| can be redefined everywhere in the document. +% +% \DescribeMacro\NoEndMark +% \DescribeMacro\TheoremSymbol +% On the other hand, if in some situation, the user decides to set +% the endmark manually (e.g.\ inside a figure or a minipage), the +% automatic handling can be turned off by |\NoEndMark| for the +% current environment. +% Then -- assumed that he current environment is of type \meta{name}, +% the endmark can manually be set by just saying +% |\|\meta{name}|Symbol|. +% +% Note that there must be no empty line in the input before the +% |\end{theorem}|, since then, the end mark is ignored (cf.\ +% Theorem~\ref{ex-empty-line} in Section~\ref{sec:examples}). +% +% \subsection{Extended Referencing Features} +% +% The extended referencing features are activated by calling +% |ntheorem.sty| with the option |[thref]|. +% +% Often, when writing a paper, one changes propositions into +% theorems, theorems into corollaries, lemmata into remarks +% an so on. Then, it is necessary to adjust also the references, +% i.e., from ``|see Proposition~\ref{completeness}|'' to +% ``|see Theorem~\ref{completeness}|''. For relieving the user +% from this burden, the type of the respective labeled entities +% can be associated with the label itself: +% +% \begin{quote} +% |\label{|\meta{label}|}[|\meta{type}|]| +% \end{quote} +% associates the type \meta{type} with \meta{label}. \\ +% This task is automated for theorem-like environments: +% +% \begin{quote} +% |\begin{Theorem}[|\meta{name}|]\label{|\meta{label}|}| +% \end{quote} +% is equivalent to +% \begin{quote} +% |\begin{Theorem}[|\meta{name}|]\label{|\meta{label}|}[Theorem]| +% \end{quote} +% +% The additional information is used by +% \DescribeMacro\thref +% \begin{quote} +% |\thref{|\meta{label}|}| +% \end{quote} +% which outputs the respective environment-type \emph{and} the number, +% e.g., ``Theorem~42''. Note that \LaTeX\ has to be run twice after +% changing labels (similar to getting references OK; in the +% intermediate run, warnings about undefined reference types can +% occur). +% +% The |[thref]| option interferes with the |babel| package, thus in +% this case, |ntheorem| has to be loaded \emph{after} |babel|. It also +% interferes with |amsmath|; see Section~\ref{sec:amslatex}. +% +% +% \subsection{Miscellaneous} +% +% Inside a theorem-like environment \meta{env}, the name given as optional +% argument is accessible by |\|\meta{env}|name|. +% +% \section{Possible Interferences} +% Since |ntheorem| reimplements the handling of theorem-environments +% completely, it is incompatible with every package also concerning +% those macros. +% +% Additionally, the |thmmarks| algorithm for placing endmarks +% requires modifications of several environments (cf.\ Section +% \ref{sec:code}). +% Thus, environments which are reimplemented or additionally defined +% by document options or styles are not covered by the endmark +% algorithm of |ntheorem.sty|. +% +% The |[thref]| option changes the |\label| command and the treatment +% of labels when reading the |.aux| file. Thus it is potentially +% incompatible with all packages also changing |\label| (or +% |\newlabel|). Compatibility with babel's |\newlabel| isa +% achieved if babel is loaded before ntheorem. +% +% \subsection{Interfering Document Options.} +% +% |ntheorem.sty| also copes with the usual document options +% |leqno| and |fleqn|\footnote{although for \texttt{fleqn} and +% long formulas +% reaching to the right margin, equation numbers and endmarks can +% be smashed over the formula since \texttt{fleqn} does not use +% \texttt{\bslash eqno} for controlling the setting of the equation +% number.}. +% If one of those options is used in the |\documentclass| +% declaration, it is automatically recognized by the |thmmarks| part +% of |ntheorem.sty|. +% +% If one of those options is not used in |\documentclass|, but +% with |amsmath| (see next section), it must not be specified +% for |ntheorem|, since all |amsmath| environments detect this option +% by themselves. +% +% \subsection{Combination with amslatex.}\label{sec:amslatex} +% +% |ntheorem.sty| interferes with |amsmath.sty| and |amsthm.sty|. +% +% Note, that the LaTeX amstex package |amstex.sty| (\LaTeX2.09) is +% obsolete and you should use |amsmath| and |amstext| for +% \LaTeXe\ instead. Up to |ntheorem-1.18|, it is compatible with +% |amsmath-1.x|. Since |ntheorem-1.19|, it is (hopefully) compatible +% with |amsmath-2.x|. +% +% We would be happy if someone knowing and using |amsmath| would +% join the development and maintenance of this style. +% +% \subsubsection{amsmath} +% +% Compatibility with amsmath (end marks for math environments, and +% handling of labels in math environments) is provided in the option +% |[amsmath]|, (i.e., if |\usepackage{amsmath}| is used then +% \begin{itemize} +% \item |\usepackage[thmmarks]{ntheorem}| must be completed to \\ +% |\usepackage[amsmath,thmmarks]{ntheorem}|), and also +% \item |\usepackage[thref]{ntheorem}| must be completed to \\ +% |\usepackage[amsmath,thref]{ntheorem}|). +% \end{itemize} +% Note, that |amsmath| has to be loaded \emph{before} |ntheorem| +% since the definitions have to be overwritten. +% +% \subsubsection{amsthm} +% +% |amsthm.sty| conflicts with the definition of theorem +% layouts in |theorem.sty|, some features of |amsthm.sty| +% have been incorporated into option |[amsthm]| which has +% to be used \emph{instead of} |\usepackage{amsthm}|. +% +% The option provides theoremstyles |plain|, |definition|, and +% |remark|, and a |proof| environment as in |amsthm.sty|. +% +% The |\newtheorem*| command is defined even without this +% option. Note that |\newtheorem*| always switches to the +% nonumbered version of the current theoremstyle which +% thus must be defined. +% +% The command |\newtheoremstyle| is not taken over from +% |amsthm.sty|. Also, |\swapnumbers| is not implemented. +% Here, the user has to express his definitions by the +% |\newtheoremstyle| command provided by |ntheorem.sty|, +% including the use of |\theoremheaderfont| and |\theorembodyfont|. +% The options |[amsthm]| and |[standard]| are in conflict +% since they both define an environment |proof|. +% +% Thus, we recommend not to use +% |amsthm|, since the features for defining theorem-like +% environments in |ntheorem.sty|---following +% |theorem.sty|---seem to be more intuitive and user-friendly. +% +% \subsection{Babel}\label{sec:babel} +% +% The |[thref]| option interferes with the |babel| package, thus in +% case that |babel| is used, |ntheorem| has to be loaded \emph{after} +% |babel|. +% +% \subsection{Hyperref}\label{sec:hyperref} +% +% Since |hyperref| redefines the \LaTeX\ |\contentsline|-command, it +% breaks with |ntheorem| below version 1.17. Since version 1.17, the +% option |[hyperref]| makes |ntheorem| work with |hyperref|. +% The entries of theoremlists then act as hyperlinks to the actual +% theorems. Version 1.31 incorporated some bugfixes wrt.\ hyperref +% for theorem lists and for the |thref| option. One should always +% load |\usepackage{hyperref}| \emph{before} the first use of +% |\newtheorem| to obtain correct handling and referencing of +% counters. +% \medskip +% +% WARNING: The definition and redefinition of Theorem List Layouts +% (see Section~\ref{sec:listtypes}) isn't yet working with +% the |hyperref|-package. +% +% \subsection{Mathtools and Empheq}\label{sec:mathtools} +% +% The |mathtools| and |empheq| packages should be loaded \emph{before} +% |ntheorem| as follows: +% \begin{verbatim} +% \usepackage[ntheorem]{empheq} % this loads amsmath as well +% \usepackage[thmmarks,amsmath]{ntheorem} \end{verbatim} +% Note that |empheq| provides an enhanced vertical placement +% of the endmarks (see the paragraph on |ntheorem| in the +% documentation of the |empheq| package) in math environments. +% +% \section{Examples}\label{sec:examples} +% +% The setting is as follows. +% \begin{itemize} +% \item For Theorems: +% \begin{verbatim} +% \theoremstyle{marginbreak} +% \theoremheaderfont{\normalfont\bfseries}\theorembodyfont{\slshape} +% \theoremsymbol{\ensuremath{\diamondsuit}} +% \theoremseparator{:} +% \newtheorem{Theorem}{Theorem}\end{verbatim} +% \item For Lemmas: +% \begin{verbatim} +% \theoremstyle{changebreak} +% \theoremsymbol{\ensuremath{\heartsuit}} +% \theoremindent0.5cm +% \theoremnumbering{greek} +% \newtheorem{Lemma}{Lemma}\end{verbatim} +% \item For Corollaries: +% \begin{verbatim} +% \theoremindent0cm +% \theoremsymbol{\ensuremath{\spadesuit}} +% \theoremnumbering{arabic} +% \newtheorem{Corollary}[Theorem]{Corollary}\end{verbatim} +% \item For Examples: +% \begin{verbatim} +% \theoremstyle{change} +% \theorembodyfont{\upshape} +% \theoremsymbol{\ensuremath{\ast}} +% \theoremseparator{} +% \newtheorem{Example}{Example}\end{verbatim} +% \item For Definitions: +% \begin{verbatim} +% \theoremstyle{plain} +% \theoremsymbol{\ensuremath{\clubsuit}} +% \theoremseparator{.} +% \theoremprework{\bigskip\hrule} +% \theorempostwork{\hrule\bigskip} +% \newtheorem{Definition}{Definition}\end{verbatim} +% \item For Proofs (note that |\theoremprework| and +% |\theorempostwork| are automatically reset with the next +% |\newtheorem| -- proofs do not have lines above and below): +% \begin{verbatim} +% \theoremheaderfont{\sc}\theorembodyfont{\upshape} +% \theoremstyle{nonumberplain} +% \theoremseparator{} +% \theoremsymbol{\rule{1ex}{1ex}} +% \newtheorem{Proof}{Proof}\end{verbatim} +% \end{itemize} +% Note, that parts of the setting are inherited. For instance, the +% fonts are not reset before defining ``Lemma'', so the font setting +% of ``Theorem'' is used. +% +% \begin{Example}[Simple one] +% The first example is just a text. +% +% In the next examples, it is shown how an endmark is put at a +% displaymath, a single equation and both types of eqnarrays. +% \end{Example} +% +% \begin{Theorem}[Long Theorem] +% The examples are put into this theorem environment. +% +% The next example will not appear in the list of examples since +% it is written as +% \begin{quote} +% |\begin{Example*} ... \end{Example*}| +% \end{quote} +% \begin{Example*}[Ending with a displayed formula] +% Look, the endmark is really at the bottom of the line: +% \[ f^{(n)}(z) = +% \frac{n!}{2\pi i} \int \limits _{\partial D} +% \frac{f(\zeta)}{(\zeta-z)^{n+1}} d\zeta \] +% \end{Example*} +% At this point, we add an additional entry without number +% in the Example list: +% \begin{verbatim} +% \addtheoremline*{Example}{Extra Entry}\end{verbatim} +% \addtheoremline*{Example}{Extra Entry} +% \begin{Lemma}[Display with array] +% Lemmata are indented and numbered with greek symbols. +% Also for displayed arrays of this form, it looks good: +% \begin{verbatim} +% \[\begin{array}{l} +% a = \begin{array}[t]{l} +% first\ line \\ +% second\ line +% \end{array}% +% \mbox{try to put this text in the lowest line}\end{array}\] \end{verbatim} +% Just try to get this with the presented array structure ... without +% using dirty tricks, you can position the outer array either [t], [c], +% or [b], and you will not get the desired effect. +% \[\begin{array}{l} +% a = \begin{array}[t]{l} +% first\ line \\ +% second\ line +% \end{array} \mbox{try to put this text in the lowest line} +% \end{array}\] +% \end{Lemma} +% \begin{Lemma}[Equation] +% For |equation|s, we decided to put the endmark after the equation +% number, which is vertically centered. +% Currently, we do not know, how to get the equation number centered and +% the endmark at the bottom (one has to know the internal height of the +% math material) ... If anyone knows, please inform us. +% \begin{equation} +% \int_{\gamma} f(z)\, dz := \int_a^b f(\gamma (t)) \gamma'(t) \, dt +% \end{equation} +% \end{Lemma} +% +% With the |break|-theoremstyles, if the environment is labeled and +% written as +% \begin{quote} +% |\begin{Lemma}[Breakstyle]\label{breakstyle}| +% \end{quote} +% \begin{Lemma}[Breakstyle]\label{breakstyle} +% you see, there is a leading space \dots \\ +% If a percent (comment) (or an explicit |\ignorespaces|) is put directly +% after the label, e.g. +% \begin{quote} +% |\begin{Lemma}[Breakstyle]\label{breakstyle}%|, +% \end{quote} +% the space disappears. +% +% From the predefined styles, this is exactly the case for the break-styles. +% That's no bug, it's \LaTeX-immanent. +% +% The example goes on with an |eqnarray|: +% \begin{eqnarray} +% f(z) &=& +% \frac{1}{2\pi i} +% \int \limits_{\partial D} \frac{f(\zeta)}{\zeta-z} d\zeta \\ +% &= & +% \frac{1}{2\pi} +% \int \limits_0^{2\pi} +% f(z_0 + re^{it}) dt +% \end{eqnarray} +% \end{Lemma} +% +% \begin{Proof}[of nothing] +% \begin{eqnarray*} +% f(z) &=& +% \frac{1}{2\pi i} +% \int \limits_{\partial D} \frac{f(\zeta)}{\zeta-z} d\zeta \\ +% &= & +% \frac{1}{2\pi} +% \int \limits_0^{2\pi} +% f(z_0 + re^{it}) dt +% \end{eqnarray*} +% \end{Proof} +% That's it (the end of the Theorem). +% \end{Theorem} +% +% +% If there are some environments in the same thm-environment, +% the last one gets the endmark: +% \begin{Definition}[With a list] +% \begin{equation} +% \int_{\gamma} f(z)\, dz := \int_a^b f(\gamma (t)) \gamma'(t) \, dt +% \end{equation} +% \begin{itemize} +% \item you've seen, how it works for text and +% \item math environments, +% \item and it works for lists. +% \end{itemize} +% \end{Definition} +% +% \begin{Corollary}[Q.E.D.] +% And here is a trivial corollary, which is ended by +% |\qedsymbol{\textrm{q.e.d}}| and |\qed|. +% \qedsymbol{q.e.d}\qed +% \end{Corollary} +% +% \begin{Example} +% \[ f^{(n)}(z) = +% \frac{n!}{2\pi i} \int \limits _{\partial D} +% \frac{f(\zeta)}{(\zeta-z)^{n+1}} d\zeta \] +% If there is some text after an environment, the endmark is put +% after the text. +% \end{Example} +% +% The next one is done by the following sequence. Note, that +% |~\hfill~| is inserted to prevent \LaTeX\ from using its nested list +% management (a verbatim is also a trivlist), +% i.e.\ this causes \LaTeX\ to start the |verbatim|-Part in a new line. +% \begin{quote} +% |\begin{Example}| \\ +% |~\hfill~| \\ +% |\begin{verbatim}| \\ +% |And, it also works for verbatim|\\ +% |... when the \end{verbatim} is in the|\\ +% |same line as the text ends. \end{verbatim}|\\ +% | ^| this space is important !!\\ +% |\end{Example}| +% \end{quote} +% +% \begin{Example}[Using |verbatim|] +% ~\hfill~ +% \begin{verbatim} +% And, it also works for verbatim +% ... when the end{verbatim} is in the +% same line as the text ends. \end{verbatim} +% \end{Example} +% +% There must be no empty line in the input before the |\end{theorem}| +% (since then, the end mark is ignored) \\ +% \begin{quote} +% |\begin{Theorem}| \\ +% |some text ... but no end mark| \\ +% | | \\ +% |\end{Theorem}| +% \end{quote} +% +% \begin{Theorem}\label{ex-empty-line} +% some text ... but no end mark +% +% \end{Theorem} +% +% +% Now, there is a corollary which should appear with a different +% name in the list of corollaries: +% \begin{quote} +% |\begin{Corollary*}[title in text]\label{otherlabel}| \\ +% |...|\\ +% |\end{Corollary*}| +% |\addtheoremline{Corollary}{title in list}| \\ +% \end{quote} +% \begin{Corollary*}[title in text]\label{otherlabel}\ignorespaces +% let's do something weird: +% \begin{center} +% It also works in the \\ +% center \\ +% environment. +% \end{center} +% \end{Corollary*} +% \addtheoremline{Corollary}{title in list} +% +% \begin{Theorem}[Quote] +% \begin{quote} +% In quote environments, the text is normally indented from left +% and right by the same space. The endmark is not indented from the +% right margin, i.e., it is typeset to the right margin of the +% surrounding text. +% \end{quote} +% \end{Theorem} +% +% Here is an example for turning off the endmark automatics and +% manual handling: +% +% \begin{verbatim} +% \begin{Theorem}[Manual End Mark]\label{somelabel} +% a line of text with a manually set endmark \hfill\TheoremSymbol \\ +% some more text, but no automatic endmark set. \NoEndMark +% \end{Theorem}\end{verbatim} +% +% \begin{Theorem}[Manual End Mark]\label{somelabel} +% a line of text with a manually set endmark \hfill\TheoremSymbol \\ +% some more text, but no automatic endmark set. \NoEndMark +% \end{Theorem} +% Also, one should note, that |\hfill| is inserted to set +% the endmark at the right margin. +% +% \begin{Example}[Quickie] It also works for short one's. +% \end{Example} +% +% If you are tired of the greek numbers and the indentation for lemmata ... +% you can redefine it: +% \theoremstyle{changebreak} +% \theoremheaderfont{\normalfont\bfseries}\theorembodyfont{\slshape} +% \theoremsymbol{\ensuremath{\heartsuit}} +% \theoremsymbol{\ensuremath{\diamondsuit}} +% \theoremseparator{:} +% \theoremindent0cm +% \theoremnumbering{arabic} +% \renewtheorem{Lemma}{Lemma} +% \begin{quote} +% |\theoremstyle{changebreak}| \\ +% |\theoremheaderfont{\normalfont\bfseries}\theorembodyfont{\slshape}| \\ +% |\theoremsymbol{\ensuremath{\heartsuit}}|\\ +% |\theoremsymbol{\ensuremath{\diamondsuit}}|\\ +% |\theoremseparator{:}|\\ +% |\theoremindent0.5cm|\\ +% |\theoremnumbering{arabic}|\\ +% |\renewtheorem{Lemma}{Lemma}| +% \end{quote} +% \begin{Lemma} +% another lemma, with arabic numbering ... note that the numbering +% continues. +% \end{Lemma} +% +% the optional argument (i.e.\ the `theorem'-name) can be accessed by +% |\|\meta{env}|name|. +% +% \begin{quote} +% |\begin{Theorem}[somename]|\\ +% |Obviously, we are in Theorem~\Theoremname|.\\ +% |\end{Theorem}| +% \end{quote} +% \begin{Theorem}[somename] +% Obviously, we are in Theorem~\Theoremname. +% \end{Theorem} +% +% This feature can e.g.\ be used for automatically generating +% executable code and a commented solution sheet: +% \begin{quote} +% |\begin{exercise}[quicksort]| \\ +% \meta{the exercise text} \\ +% |\begin{verbatimwrite}{solutions/\exercisename.c}|\\ +% \meta{C-code} \\ +% |\end{verbatimwrite}|\\ +% |\verbatiminput{solutions/\exercisename.c}|\\ +% |\end{exercise}| +% \end{quote} +% This will write the C-code to a file |solutions/quicksort.c| and +% type it also on the solution sheet. +% +% Now, we define an environment |KappaTheorem| which uses the same +% style parameters as Theorems and is numbered together with +% Corollaries (Theorems are also numbered with Corollaries). +% Note that we define a complex header text and a complex end mark. +% +% |\theoremclass{Theorem}|\\ +% |\theoremsymbol{\ensuremath{a\atop b}}| \\ +% |\newtheorem{KappaTheorem}[Corollary]{\(\kappa\)-Theorem}| +% +% \theoremclass{Theorem} +% \theoremsymbol{\ensuremath{a\atop b}} +% \newtheorem{KappaTheorem}[Theorem]{\(\kappa\)-Theorem} +% +% \begin{KappaTheorem}[1st \(\kappa\)-Theorem]\label{kappatheorem1} +% That's the first Kappa-Theorem. +% \end{KappaTheorem} +% +% \subsection{Extended Referencing Features}\label{sec-ExtRef}[Section] +% +% The standard |\label| command is extended by an optional argument +% which is intended to contain the ``name'' of the structure which +% is labeled, allowing more comfortable referencing; e.g., this +% section has been started with +% +% \begin{quote} +% |\subsection*{Extended Referencing Features}%|\\ +% |\label{sec-ExtRef}[Section]| +% \end{quote} +% +% As already stated, for theorem-like environments the optional +% argument is filled in automatically, i.e., +% \begin{quote} +% |\begin{Theorem}[Manual End Mark]\label{somelabel}| +% \end{quote} +% (cf.\ page~\pageref{somelabel}) is equivalent to +% \begin{quote} +% |\begin{Theorem}[Manual End Mark]\label{somelabel}[Theorem]| +% \end{quote} +% +% |\thref{|\meta{label}|}| additionally outputs the contents +% of the optional argument which has been associated with \meta{label}: +% +% \begin{quote} +% |This is \thref{sec-ExtRef}| \\ +% |A theorem end mark has been set manually in \thref{somelabel}.| \\ +% |A center environment has been shown in \thref{otherlabel}.| \\ +% |The first Kappa-Theorem has been given in \thref{kappatheorem1}.| +% \end{quote} +% +% generates +% \begin{quote} +% This is \thref{sec-ExtRef}. \\ +% A theorem end mark has been set manually in \thref{somelabel}. +% A center environment has been shown in \thref{otherlabel}. +% The first Kappa-Theorem has been given in \thref{kappatheorem1}. +% \end{quote} +% +% Here one must be careful that the handling of the optional +% argument is automated +% only for environments defined by |\newtheorem|, i.e., \emph{not} +% for sectioning, equations, or enumerations. +% +% Calling |\thref{|\meta{label}|}| for a label which has been +% set without an optional argument can result in different unintended +% results: If \meta{label} is not inside a theorem-like environment, an +% error message is obtained, otherwise the type of the surrounding +% theorem-like environment is output, e.g., calling |\thref{label}| +% then results in ``Theorem~\meta{number}''! +% Additionally, currently there is no support for multiple references +% such as ``see Theorems~5 and~7'' (this would require plural-forms +% for different languages and handling of |\ref|-lists, probably +% splitting into different sublists for different environments)\footnote{If +% someone is interested in programming this, please contact us; it +% seems to be algorithmically easy, but tedious.}. +% +% \subsection{Framed and Shaded Theorems} +% \label{sec-framed} +% +% Framed theorem classes are defined as follows: +% \begin{quote} +% |\theoremclass{Theorem}| \\ +% |\theoremstyle{break}| \\ +% |\newframedtheorem{importantTheorem}[Theorem]{Theorem}| +% \end{quote} +% \theoremclass{Theorem} +% \theoremstyle{break} +% \newframedtheorem{importantTheorem}[Theorem]{Theorem} +% defines important theorems to use the same design as for theorems +% (except that the break header style is used except the margin header +% style), number them with the same counter, and put a frame around +% them: +% +% An instance is created by +% \begin{quote} +% |\begin{importantTheorem}[Important Theorem]| \\ +% |This is an important theorem.| \\ +% |\end{importantTheorem}| +% \end{quote} +% \begin{importantTheorem}[Important Theorem] +% This is an important theorem. +% \end{importantTheorem} +% +% Note that all skips have their default values (e.g.\ +% |\theoreminframepreskip| is |\topsep|). +% More important theorems are shaded -- by default in grey: +% +% \begin{quote} +% |\theoremclass{Theorem}| \\ +% |\theoremstyle{break}| \\ +% |\newshadedtheorem{moreImportantTheorem}[Theorem]{Theorem}| \\ +% |\begin{moreImportantTheorem}[More Important Theorem]| \\ +% |This is a more important theorem.| \\ +% |\end{moreImportantTheorem}| +% \end{quote} +% \theoremclass{Theorem} +% \theoremstyle{break} +% \newshadedtheorem{moreImportantTheorem}[Theorem]{Theorem} +% \begin{moreImportantTheorem}[More Important Theorem] +% This is a more important theorem. +% \end{moreImportantTheorem} +% +% Even more important theorems are shaded in red, with 1/2cm +% space inside the frame before and 1 cm space after the text, +% but no additional space before/after the frame: +% +% \begin{quote} +% |\theoremclass{Theorem}| \\ +% |\theoremstyle{break}| \\ +% |\theoreminframepreskip{0.5cm}| \\ +% |\theoreminframepostskip{1cm}| \\ +% |\theoremframepreskip{0cm}| \\ +% |\theoremframepostskip{0cm}| \\ +% |\shadecolor{red}| \\ +% |\newshadedtheorem{evenMoreImportantTheorem}[Theorem]{Theorem}| \\ +% |\begin{evenMoreImportantTheorem}[Even More Important Theorem]| \\ +% |This is an even more important theorem. | \\ +% |\end{evenMoreImportantTheorem}| +% \end{quote} +% \theoremclass{Theorem} +% \theoremstyle{break} +% \theoreminframepreskip{0.5cm} +% \theoreminframepostskip{1cm} +% \theoremframepreskip{0cm} +% \theoremframepostskip{0cm} +% \shadecolor{red} +% \newshadedtheorem{evenMoreImportantTheorem}[Theorem]{Theorem} +% \begin{evenMoreImportantTheorem}[Even More Important Theorem] +% This is an even more important theorem. +% \end{evenMoreImportantTheorem} +% +% Most important theorems get a framed, blue colored box with a shadow, +% no space inside the frame, and 1cm before and after the frame. +% Here, |\def\theoremframecommand| is used: +% +% \begin{quote} +% |\theoremclass{Theorem}| \\ +% |\theoremstyle{break}| \\ +% |\theoreminframepreskip{0pt}| \\ +% |\theoreminframepostskip{0pt}| \\ +% |\theoremframepreskip{1cm}| \\ +% |\theoremframepostskip{1cm}| \\ +% |\theoremstyle{break}| \\ +% |\def\theoremframecommand{%| \\ +% | \psshadowbox[fillstyle=solid,fillcolor=blue,linecolor=black]}| \\ +% |\newshadedtheorem{MostImportantTheorem}[Theorem]{Theorem}| \\ +% |\begin{MostImportantTheorem}[Most Important Theorem]| \\ +% |This is a most important theorem. | \\ +% |\end{MostImportantTheorem}| +% \end{quote} +% \theoremclass{Theorem} +% \theoreminframepreskip{0pt} +% \theoreminframepostskip{0pt} +% \theoremframepreskip{1cm} +% \theoremframepostskip{1cm} +% \theoremstyle{break} +% \def\theoremframecommand{% +% \psshadowbox[fillstyle=solid,fillcolor=blue,linecolor=black]} +% \newshadedtheorem{MostImportantTheorem}[Theorem]{Theorem} +% \begin{MostImportantTheorem}[Most Important Theorem] +% This is a most important theorem. +% \end{MostImportantTheorem} +% +% \subsection{Lists of Theorems and Friends} +% +% Note, that we put the following lists into the |quote|-environment +% to emphazise them from the surrounding text. So the lists +% are indented slightly at the margin. +% +% With +% \begin{quote} +% |\addtotheoremfile{Added into all theorem lists}|, +% \end{quote} +% in every list, an additional line of text would be inserted. +% But it isn't actually done in this documentation since we want +% to use different list formats. +% +% Only for the list of Examples, this one is added: +% \begin{quote} +% |\addtotheoremfile[Example]{Only concerning Example lists}| +% \end{quote} +% \addtotheoremfile[Example]{Only concerning Example lists} +% +% With +% \begin{quote} +% |\theoremlisttype{all}| \\ +% |\listtheorems{Lemma}|, +% \end{quote} +% all lemmas are listed: +% \begin{quote} +% \theoremlisttype{all} +% \listtheorems{Lemma} +% \end{quote} +% +% From the examples, only those are listed which have an optional name: +% \begin{quote} +% |\theoremlisttype{opt}| \\ +% |\listtheorems{Example}| +% \end{quote} +% leads to +% \begin{quote} +% \theoremlisttype{opt} +% \listtheorems{Example} +% \end{quote} +% One should note the line \emph{Only concerning example lists}, which +% was added by the |\addtotheoremfile|-statement above. +% +% For the next list, another layout, using the |tabular|-environment, +% is defined: +% \begin{verbatim} +% \newtheoremlisttype{tab}% +% {\begin{tabular*}{\linewidth}{@{}lrl@{\extracolsep{\fill}}r@{}}}% +% {##1&##2&##3&##4\\}% +% {\end{tabular*}}\end{verbatim} +% Thus, by saying +% \begin{quote} +% |\theoremlisttype{tab}|\\ +% |\listtheorems{Theorem,importantTheorem,moreImportantTheorem,| +% | evenMoreImportantTheorem,MostImportantTheorem,Lemma},| +% \end{quote} +% theorems (of all importance levels) and lemmata are listed: +% \begin{quote} +% \DeleteShortVerb{\|} +% \newtheoremlisttype{tab}% +% {\begin{tabular*}{\linewidth}{@{}lrl@{\extracolsep{\fill}}r@{}}}% +% {##1&##2&##3&##4\\}% +% {\end{tabular*}} +% \theoremlisttype{tab} +% \listtheorems{Theorem,importantTheorem,moreImportantTheorem,evenMoreImportantTheorem,MostImportantTheorem,Lemma} +% \MakeShortVerb{\|} +% \end{quote} +% +% \LaTeX-lists can also be used to format the theoremlist. +% The input +% \begin{verbatim} +% \newtheoremlisttype{list}% +% {\begin{trivlist}\item} +% {\item[##2 ##1:]\ ##3\dotfill ##4}% +% {\end{trivlist}} +% \theoremlisttype{list} +% \listtheorems{Corollary}\end{verbatim} +% leads to% +% \begin{quote}% +% \DeleteShortVerb{\|}% +% \newtheoremlisttype{list}% +% {\begin{trivlist}}% +% {\item[##2 ##1:]\ ##3\dotfill ##4}% +% {\end{trivlist}}% +% \theoremlisttype{list}\listtheorems{Corollary}% +% \MakeShortVerb{\|}% +% \end{quote}% +% In this example, after the item, \verb*!\ ! is used instead of +% \verb*! !, because in the latter case, |\dotfill| will produce an +% error if the optional argument (|##3|) +% is missing. +% +% \section{The End Mark Algorithm} +% +% \subsection{The Idea} +% +% The handling of endmarks with |thmmarks.sty| is based on the same +% two-pass principle as the handling of labels: the necessary information +% about endmarks is contained in the |.aux| file. +% +% With |thmmarks.sty|, \TeX\ is always aware whether it is in +% some theorem-like environment. +% There, potential positions for endmarks can be +% \begin{enumerate} +% \item\label{elist:1} at the end of simple text lines in open text, +% \item\label{elist:2} at the end of displaymaths, +% \item\label{elist:3} at the end of equations or equationarrays, or +% \item\label{elist:4} at the end of text lines at the end of lists (or, more general, +% |trivlists|, such as |verbatim| or |center|). +% \end{enumerate} +% +% The problem is, that in the cases (\ref{elist:2})--(\ref{elist:4}), the endmarks has to +% be placed in a box which is already shipped out, when +% |\end{...}| is processed. +% Thus, in those situations, \TeX\ needs to know from the |.aux| +% file, whether is has to put an endmark. +% +% When \TeX\ is in a theorem-like environment and comes to one of +% the points mentioned in (\ref{elist:2})--(\ref{elist:4}), +% and the |.aux| file says that there is an endmark, then +% it is put there. +% Anyway, it maintains a counter of the potential positions of an end +% mark in the current theorem-like environment. +% When it comes to an |\end{theorem}|, it looks if it is in +% situation (\ref{elist:1}) (then the endmark is simply put at the end of the +% current line). +% Otherwise, the last horizontal box is already shipped out +% (thus it contains a situation (\ref{elist:2})--(\ref{elist:4})) and the endmark must be +% set in it. +% In this case, a note is written in the |.aux| file, where the +% endmark actually has to be set (ie, at the latest potential point for +% setting an endmark inside the theorem). +% +% \subsection{The Realization} +% +% Let \env\ be a theorem-like environment. Then, additional to +% the counter \env, \TeX\ maintains two counters +% |curr|\env|ctr| and |end|\env|ctr|. +% In the $i$th environment of type \env, |curr|\env|ctr|$=i$ +% (the \LaTeX\ counter \env\ cannot be used since a) +% environments can use the counter of other environments, and b) +% often counters are reinitialized inside a document). +% |end|\env|ctr| counts the potential situations for +% putting an endmark inside an environment. +% It is set to 1 when starting an environment. Each time, when +% a situation (\ref{elist:2})--(\ref{elist:4}) is reached, the command +% \begin{quote} +% |\mark|$<$|\thm@romannum{curr|env|ctr}|$>$\env +% $<$|\thm@romannum{end|\env|ctr}|$>$ +% \end{quote} +% is called (where |\thm@romannum| just writes the value of a counter +% as its roman numeral representation, e.g., 17 as xvii). \\ +% ($<$|\thm@romannum{curr|\env|ctr}|$>$\env +% $<$|\thm@romannum{end|\env|ctr}|$>$ +% uniquely identifies all situations (\ref{elist:2})--(\ref{elist:4}) in a document). +% +% If at this position an endmark has to be set, +% \begin{quote} +% |\mark|$<$|\thm@romannum{curr|\env|ctr}|$>$\env +% $<$|\thm@romannum{end|\env|ctr}|$>$ +% \end{quote} +% is defined in the |.aux| file to be |\end|\env|Symbol|, +% otherwise it is undefined and simply ignored. +% +% When \TeX\ comes to an |\end{|\env|}|, it looks if it is in +% situation (\ref{elist:1}). If so, the endmark is simply put at the end of the +% current line. +% Otherwise, +% \begin{quote} +% |\def\mark|$<$|\thm@romannum{curr|env|ctr}|$>$\env|%|\\ +% $<$|\thm@romannum{end|\env|ctr}|$>$|{|\env|Symbol}| +% \end{quote} +% is written to the |.aux| file for setting the endmark +% at the latest potential position inside the theorem in the next run. +% +% \begin{Theorem}[Correctness] +% \begin{enumerate} +% \item For a |.tex| file, which does not contain nested theorem-like +% environments of the same type, in the above situation, the following +% holds: +% When compiling, at the $i$th situation in the $j$th environment of type +% \env, |mark|$\;j\,$\env$\;i$ is handled. +% +% For |.tex| files which contain nested theorem-like environments of +% the same type, |mark|$\;k\,$\env$\;l$ is handled, where +% $k$ is the number of the latest environment of type \env\ which +% has been called at this moment, and $l$ is the number of situations +% (\ref{elist:2})--(\ref{elist:4}) which have occurred in +% environments of type \env\ since +% the the $k$th |\begin{|\env|}|. +% +% \item When finishing an environment, either an endmark is set directly +% (when in a text line) or an order to put the end symbol at the latest +% potential position is written to the |.aux| file. +% \end{enumerate} +% \end{Theorem} +% +% \begin{Theorem}[Completeness] +% The handling of endmarks is complete wrt.\ plain text, |displaymath|, +% |equation|,\\ |eqnarray|, |eqnarray*|, and all environments +% ended by |endtrivlist|, including |center| and +% |verbatim|. +% \end{Theorem} +% +% So, where can be bugs ? +% \begin{itemize} +% \item in the plain \TeX\ handling of endmarks, +% \item in some special situations which have not been tested yet, +% \item in some special environments which have not been tested yet. +% \item in the |amsmath| environments. We seldom use them, so we do not +% know their pitfalls, and we ran only general test cases. +% \end{itemize} +% +% \section{Problems and Questions} +% \subsection{Known Limitations} +% +% \begin{itemize} +% \item Since |ntheorem.sty| uses the |.aux| file for storing +% information about the positions of endmarks, \LaTeX\ must be +% run twice for correctly setting the endmarks. +% \item Since |ntheorem.sty| uses the |.aux| file for storing +% information about lists in the |.thm| file, a minimum of +% two runs is needed. If theorems move in any of these +% runs up to five runs can be needed to generate correct lists. +% \item Since we need to expand the optional argument of theorems +% in various ways for the lists, we decided to copy the text verbatim +% into the |.thm| file. Thus, if you use things like |\thesection| +% etc., the list won't show the correct text. Therefore you shouldn't +% use any command that needs to be expanded. +% \item In nested environments ending at the same time, +% only the endmark for the inner environment is set, as the following +% example shows: +% \begin{verbatim} +% \begin{Lemma} +% Some text. +% \begin{Proof} The Proof \end{Proof} +% \end{Lemma}\end{verbatim} +% yields to +% \begin{Lemma} +% Some text. +% \begin{Proof} The Proof \end{Proof} +% \end{Lemma} +% +% You can handle this by specifying something invisible after the end +% of the inner theorem. Then the endmark for the outer theorem is +% set in the next line: +% \begin{verbatim} +% \begin{Lemma} +% Some text. +% \begin{Proof} The Proof \end{Proof}~ +% \end{Lemma}\end{verbatim} +% yields to +% \begin{Lemma} +% Some text. +% \begin{Proof} The Proof \end{Proof}~ +% \end{Lemma} +% +% \item Document option |fleqn| is problematic: |fleqn| handles +% equations not by |$$| but by lists (check what happens for +% \begin{quote} +% |\begin{theorem} \[ displaymath \] \end{theorem}| +% \end{quote} +% in standard \LaTeX: +% The displaymath is \emph{not} set in an own line). +% Also, for long formulas, the equation number and the endmark are +% smashed into the formula at the right text margin. +% \item Naturally, |ntheorem.sty| will not work correctly in +% combination with other styles which change the handling +% of +% \begin{enumerate} +% \item theorem-like environments, or +% \item environments concerned with the handling of endmarks, e.g. +% |\[...\]|, |eqnarray|, etc. +% \end{enumerate} +% \item |ntheorem.sty| is compatible with Frank Mittelbach's +% |theorem.sty|, which is the most widespread style for setting +% theorems. +% +% It cannot be used \emph{with} |theorem.sty|, but it can be +% used instead of it. +% \end{itemize} +% +% \subsection{Known ``Bugs'' and Problems} +% +% \begin{itemize} +% \item Ending a theorem \emph{directly} after the text, e.g. +% \begin{quote} +% |\begin{Theorem} text\end{Theorem}| +% \end{quote} +% suppresses the endmark: +% \begin{Theorem} text\end{Theorem} +% Therefore a space or a newline should be inserted +% before |\end{...}|. +% \item With theoremstyle break, if the linebreak would cause +% ugly linebreaking in the following text, it is suppressed. +% \end{itemize} +% +% \subsection{Open Questions} +% \begin{itemize} +% \item +% For |equation|s, we decided to put the endmark after the equation +% number, which is vertically centered. +% Currently, we do not know, how to get the equation number centered and +% the endmark at the bottom (one has to know the internal height of the +% math material). +% \item +% The placement of endmarks is mainly based on a check whether \LaTeX\ +% is in an ordinary text line when encountering an end-of-environment. +% This question is \emph{partially} answered by |\ifhmode|: In a text +% line, \LaTeX\ is always in |\hmode|. +% But, after an displaymath, \LaTeX\ is also in |\hmode|. Thus, +% additionally |\lastskip| is checked: after a displaymath, +% |\lastskip|=0 holds. +% In most situations, when text has been written into a line, +% |\lastskip| $\neq$ 0. But, this does not hold, if the source code +% is of the following form: |...text\label{bla}|: then, |\lastskip|=0. +% In those situations, the endmark is suppressed. \\ +% ?? How can it be detected whether \LaTeX\ has just ended a displaymath? +% \item +% The above problem with the label: The break style enforces a linebreak +% by |\hfill\penalty-8000| after the |\trivlist|-item. Thus, \TeX\ +% gets back into the horizontal mode. The label places a ``whatsit'' +% somewhere ... and, it seems that the ``whatsit'' makes \TeX\ think +% that there is a line of text. +% \end{itemize} +% If someone has a solution to one of those questions, please inform us. +% (You can be sure to be mentioned in the Acknowledgements.) +% +% \section{Code Documentation}\label{sec:code} +% \iffalse +% \subsection{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{latexsym} +\usepackage{framed} \usepackage{pstricks} +\usepackage[thmmarks,thref,noconfig,framed]{ntheorem} \parindent0pt\hfuzz2pt +\setlength{\textwidth}{360pt} +\begin{document} + \DocInput{ntheorem.dtx} +\end{document} +% +% \end{macrocode} +%\fi +% \subsection{Documentation of the Macros} +% \setcounter{CodelineNo}{0} +%\iffalse +%<*package>\fi +% \begin{macrocode} +\typeout{Style `\basename', Version \fileversion\space <\filedate>} +\ProvidesPackage{ntheorem}[\filedate \space\fileversion] +\RequirePackage{ifthen}% +\newif\if@thmmarks\@thmmarksfalse +\newif\if@thref\@threffalse +\newif\ifthm@inframe\thm@inframefalse +\newif\ifthm@tempif +% \end{macrocode} +% +% general setup. \medskip +% +% \subsubsection{Thmmarks-Related Stuff} +% +% \setcounter{CodelineNo}{0} +% \changes{v0.87}{1997/02/18}{option 'thmmarks' added (WM)} +% \begin{macrocode} +\DeclareOption{thmmarks}{%********************************* +\PackageInfo{\basename}{Option `thmmarks' loaded}% +% +\@thmmarkstrue +\newcounter{endNonectr} +\newcounter{currNonectr} +\newif\ifsetendmark\setendmarktrue +% \end{macrocode} +% +% activate placement of endmarks and define counters for upper +% level. \\ +% |\ifsetendmark|: true if an endmark has to be set in a complex +% situation which must be handled by the |.aux| file. +% For further comments see |\@endtheorem|. +% +% +% \begin{macro}{\thm@romannum} +% \changes{v1.28}{2009/07/02}{duplicate latex's definition (WM), +% reported by Ch. Garcia Duarte} +% The functionality of |latex.ltx|'s |\roman| command converts +% numbers into strings, e.g., 17 into xvii. It is used to put +% notes into the |.aux| file. It must be +% locally defined, just duplicating the definition of |\roman| in +% latex.ltx since some packages redefine |\roman|: +% \begin{macrocode} +\gdef\thm@romannum#1{\expandafter\thm@roman@num\csname c@#1\endcsname}% +\gdef\thm@roman@num#1{\romannumeral #1}% +% \end{macrocode} +% \end{macro} +% +% In the following, all relevant environments are changed for +% handling potential end mark positions: +% +% \paragraph{Changes to List Environment}\ \\ +% Original: ltlists.dtx +% +% \begin{macro}{\endtrivlist} +% \changes{v1.19}{2001/01/13}{changed hbox into unskip (OK/WM)} +% Replaces \LaTeX's |\endtrivlist|. An augmented functionality of +% \LaTeX's |\endtrivlist| is contained in |\@endtrivlist|. +% +% \begin{macrocode} +\gdef\endtrivlist{% + \@endtrivlist{\PotEndMark{\unskip\nobreak\hfill\nobreak}}} +% \end{macrocode} +% +% At an |\endtrivlist| (which is called at the end +% of |\list| environments and several other environments), +% |\@endtrivlist| is called to end the |\trivlist| and +% set a potential position for an endmark at the end of the line if +% \TeX\ is in a text line. +% \end{macro} +% +% +% \begin{macro}{\@endtrivlist} +% A new command] which augments \LaTeX's functionality of +% |\endtrivlist| by checking if an end mark has to be set: +% +% \Codelabel{atendtrivlist} +% \begin{macrocode} +\gdef\@endtrivlist#1{% % from \endtrivlist + \if@inlabel \indent\fi + \if@newlist \@noitemerr\fi + \ifhmode + \ifdim\lastskip >\z@ #1\unskip \par %<<<<<<<<<<<<<<<<<<<<<< + \else \unskip \par \fi + \fi + \if@noparlist \else + \ifdim\lastskip >\z@ + \@tempskipa\lastskip \vskip -\lastskip + \advance\@tempskipa\parskip \advance\@tempskipa -\@outerparskip + \vskip\@tempskipa + \fi + \@endparenv + \fi} +% \end{macrocode} +% +% New: parameter |#1|. \\ +% |#1| is executed when the |\trivlist| ends with a text line (ie the +% endmark can be put simply at the end of the line): \\ +% Line \Coderef{atendtrivlist}{5}: +% case split: if in |hmode| and |\lastskip| $>$ 0, +% then \TeX\ is in a text line, the endmark is set here. +% \end{macro} +% +% \paragraph{Changes to Math Environments}\ \\ +% Original: ltmath.dtx +% +% \begin{macro}{\endequation} +% For equations, end marks are placed behind the equation number: +% \Codelabel{standard-endequation} +% \begin{macrocode} +\gdef\SetMark@endeqn{\quad}% as default, cf. option leqno +\gdef\endequation{\eqno \hbox{\@eqnnum \PotEndMark{\SetMark@endeqn}}% + $$\global\@ignoretrue} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Line \Coderef{standard-endequation}{1}:] +% As default, work for equation numbers at the right: +% Then, a |\quad| is placed between equation number and endmark. +% \item[Line \Coderef{standard-endequation}{2}:] +% In addition to the equation number (set by |\@eqnnum| at the +% right of the line) |\SetMark@endeqn| is carried out. +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\[} +% \changes{v1.27}{2008/06/18}{fixed: start array with no additional +% space (WM, reported by Tillmann Berg)} +% \changes{v1.28}{2009/07/02}{replaced roman by thm@romannum (WM)} +% If an end mark is set, a displaymath is put into box such that +% the end marks appears at its bottom level at the right. Thus, also +% the definition of |\[| has to be changed: +% \Codelabel{st-b-displ} +% \begin{macrocode} +\gdef\[{% + \relax\ifmmode + \@badmath + \else + \ifvmode + \nointerlineskip + \makebox[.6\linewidth]% + \fi + $$\stepcounter{end\InTheoType ctr}% + \@ifundefined{mark\thm@romannum{curr\InTheoType ctr}% + \InTheoType\thm@romannum{end\InTheoType ctr}}{\relax}% + {\ifx\csname\InTheoType Symbol\endcsname\@empty\else + \boxmaxdepth=.5ex\begin{array}[b]{@{}l}% + \boxmaxdepth=\maxdimen\displaystyle\fi}% + \addtocounter{end\InTheoType ctr}{-1}% + %%$$ BRACE MATCH HACK + \fi} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Lines \Coderef{st-b-displ}{2}--\Coderef{st-b-displ}{8}, +% \Coderef{st-b-displ}{16}, \Coderef{st-b-displ}{17}:] +% the old definition. +% \item[Lines \Coderef{st-b-displ}{9}--\Coderef{st-b-displ}{12}:] +% The end position of a displaymath inside a theorem-environment +% corresponds to |end\InTheoType ctr|+1. +% An endmark has to be set there, if \\ +% \hspace*{0.5cm} |\mark|$<$|\thm@romannum{curr#1ctr}|$>$|#1|% +% $<$|\thm@romannum{end#1ctr}|$+1>$ +% is defined and not the empty symbol. +% \item[Lines \Coderef{st-b-displ}{13}--\Coderef{st-b-displ}{14}:] +% If so, the whole displayed stuff is put in an array with +% maximal depth 0.5|ex| and vertically adjusted with its bottom line +% (then, the endmarks will appear adjusted to its bottom line). +% \item[Line \Coderef{st-b-displ}{15}:]The counter has to be re-decremented. +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\]} +% \changes{v1.28}{2009/07/02}{replaced roman by thm@romannum (WM)} +% At the end of a displaymath, the end marks is set at its bottom level: +% \Codelabel{st-e-displ} +% \begin{macrocode} +\gdef\]{% + \stepcounter{end\InTheoType ctr}% + \@ifundefined{mark\thm@romannum{curr\InTheoType ctr}% + \InTheoType\thm@romannum{end\InTheoType ctr}}{\relax}% + {\ifx\csname\InTheoType Symbol\endcsname\@empty\else + \end{array}\fi}% + \addtocounter{end\InTheoType ctr}{-1}% + \relax\ifmmode + \ifinner + \@badmath + \else + \PotEndMark{\eqno}\global\@ignoretrue$$%%$$ BRACE MATCH HACK + \fi + \else + \@badmath + \fi + \ignorespaces} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Lines \Coderef{st-e-displ}{2}--\Coderef{st-e-displ}{7}:] +% Look, if an endmark has to be set in this displaymath +% (analogous to lines +% \Coderef{st-b-displ}{9}--\Coderef{st-b-displ}{15} of |\def\[|) +% If so, there is an inner array which has to be closed +% (line \Coderef{st-e-displ}{6}). +% \item[Lines \Coderef{st-e-displ}{8}--\Coderef{st-e-displ}{17}:] +% the old definition. +% \item[Line \Coderef{st-e-displ}{12}:] changed to set an endmark at +% the right of the line if necessary (this is done by |\eqno|). +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\endeqnarray} +% For |\eqnarray|s, the end marks is set below the number +% of the last equation: +% \changes{v0.90}{1997/02/19}{fixed endmark for `eqnarrays' (WM)} +% \changes{v0.91}{1997/02/22}{fixed `endeqnarray' (WM)} +% \Codelabel{st-endeqnarray} +% \begin{macrocode} +\gdef\SetMark@endeqnarray#1{\llap{\raisebox{-1.3em}{#1}}} +\gdef\endeqnarray{% + \global\let\Oldeqnnum=\@eqnnum + \gdef\@eqnnum{\Oldeqnnum\PotEndMark{\SetMark@endeqnarray}}% + \@@eqncr + \egroup + \global\advance\c@equation\m@ne + $$\global\@ignoretrue + \global\let\@eqnnum\Oldeqnnum} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Line \Coderef{st-endeqnarray}{1}:] +% As default work for equation numbers at the right: +% Then, the endmark is placed below the last equation number at the +% right margin. +% \item[New: Lines \Coderef{st-endeqnarray}{3},% +% \Coderef{st-endeqnarray}{4}, \Coderef{st-endeqnarray}{9}:]\ +% \item[Line \Coderef{st-endeqnarray}{3}:] save |\@eqnnum|. +% \item[Line \Coderef{st-endeqnarray}{4}:] +% define |\@eqnnum| to carry out |\Oldeqnnum|, then a potential endmark +% position is handled: +% if an endmark is set, between the equation number and the endmark, +% the command sequence |\SetMark@endeqnarray| is carried out -- +% there, since |\SetMark@endeqnarray| is a function of one +% argument, the endmark will be this argument. +% \item[Lines \Coderef{st-endeqnarray}{5}--\Coderef{st-endeqnarray}{8}:] +% from |latex.ltx|. +% Line \Coderef{st-endeqnarray}{5} sets the equation number. +% \item[Line \Coderef{st-endeqnarray}{9}:] restore |\@eqnnum|. +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\endeqnarray*} +% In an |\eqnarray*|, the end mark is set at the right of the +% last equation: +% \Codelabel{st-endeqnarray-star} +% \begin{macrocode} +\@namedef{endeqnarray*}{% + % from \@@eqncr: + \let\reserved@a\relax + \ifcase\@eqcnt \def\reserved@a{& & &}\or \def\reserved@a{& &}% + \or \def\reserved@a{&}\else + \let\reserved@a\@empty + \@latex@error{Too many columns in eqnarray environment}\@ehc\fi + \reserved@a {\normalfont \normalcolor \PotEndMark{}}% + \global\@eqnswtrue\global\@eqcnt\z@\cr + % + \egroup + \global\advance\c@equation\m@ne + $$\global\@ignoretrue} +% \end{macrocode} +% +% This is just \LaTeX's |\endeqnarray| where lines +% \Coderef{st-endeqnarray-star}{3}--\Coderef{st-endeqnarray-star}{9} +% are inserted from |\@@eqncr| and augmented (line +% \Coderef{st-endeqnarray-star}{8}) to set a potential endmark +% (with no additional commands) at the end of the current line. +% \end{macro} +% +% \paragraph{Changes to Tabbing Environment}\ \\ +% Original: lttab.dtx +% +%\begin{macro}{\endtabbing}% +% \changes{v1.04}{1998/05/26}{added 'endtabbing' (WM)} +% Here, the |\endtrivlist| modification is not sufficient: \LaTeX\ is +% not in hmode when it calls |\endtrivlist| from |\endtabbing|; +% additionally, |\@stopline| already outputs a linebreak. +% Thus, the end mark is inserted \emph{before} |\@stopline| at +% the right margin (using |\`|). +% \begin{macrocode} +\gdef\endtabbing{% + \PotEndMark{\`}\@stopline\ifnum\@tabpush >\z@ \@badpoptabs + \fi\endtrivlist} +% \end{macrocode} +% \end{macro} +% +% \paragraph{Changes to Center Environment}\ \\ +% Original: ltmiscen.dtx +% +%\begin{macro}{\endcenter}% +% \changes{v1.28}{2009/07/02}{replaced roman by thm@romannum (WM)} +% In \LaTeX, |\endcenter| just calls |\endtrivlist|. +% Here, the situation is more complex since the the endmark has +% to be put in the last line without affecting its centering: +% if in a text line (only then, here is a potential endmark +% position): +% \begin{macrocode} +\gdef\endcenter{% + \@endtrivlist + {\PotEndMark{\rightskip0pt% + \settowidth{\leftskip}% + { \csname mark\thm@romannum{curr\InTheoType ctr}\InTheoType + \thm@romannum{end\InTheoType ctr}\endcsname}% + \advance\leftskip\@flushglue\hskip\@flushglue}}} +% \end{macrocode} +% +% The |\rightskip| of the line is set to 0, |\leftskip| +% is set to the width of one space (since on the right, one space is +% added after the text) plus the endmark and infinitely stretchable glue +% (|\@flushglue|), and also the line is continued with +% |\@flushglue| (the actual position is one space after the text), +% and then the endmark is placed (by |\PotEndMark|). +% \end{macro} +% +% \paragraph{Handling of Endmarks} +% +% \begin{macro}{\@endtheorem-thmmarks} +% |\@endtheorem| is called for every |\end{|\env|}|, where \env\ is a +% theorem-like environment. |\@endtheorem| is extended to organize +% the placement of the corresponding end mark +% (|\InTheoType| gives the innermost theorem-like environment, +% i.e.\ the one to be ended): +% +% \Codelabel{atendtheorem} +% \begin{macrocode} +\gdef\@empty{} +\gdef\@endtheorem{% + \expandafter + \ifx\csname\InTheoType Symbol\endcsname\@empty\setendmarkfalse\fi + \@endtrivlist + {\ifsetendmark + \unskip\nobreak\hfill\nobreak\csname\InTheoType Symbol\endcsname + \setendmarkfalse \fi}% + \ifsetendmark\OrganizeTheoremSymbol\else\global\setendmarktrue\fi + \csname\InTheoType @postwork\endcsname + } +% \end{macrocode} +% \changes{v0.91}{1997/02/27}{'@empty' fixed (WM)} +% \changes{v0.94}{1997/03/19}{'setendmarktrue' globalized (WM)} +% \changes{v1.19}{2001/01/13}{changed hbox into unskip (OK/WM)} +% \changes{v1.21}{2002/12/30}{added handling of 'theorempostwork' (WM)} +% +% \begin{packeddescr} +% \item[Lines \Coderef{atendtheorem}{3}, \Coderef{atendtheorem}{4}:] +% if the end symbol of the environment $\env$ to be closed is +% empty, simply no end symbol has to be set (it makes a difference, if no +% end symbol is set, or if an empty end symbol is set). +% \item[Lines \Coderef{atendtheorem}{5}, \Coderef{atendtheorem}{9}:] +% (originally, it calls |\endtrivlist|): +% \item[Lines \Coderef{atendtheorem}{5}, \Coderef{atendtheorem}{7}, +% \Coderef{atendtheorem}{8}:] +% |\@endtrivlist| is called to put $\env$|Symbol| +% at the end of the line and set |setendmark| to false +% if \TeX\ is in a text line and |setendmark| is true. \\ +% At this point, |setendmark| is false iff the user has disabled +% it locally or the end symbol is empty. +% \item[Line \Coderef{atendtheorem}{6}:] the endmark is not set, +% if |setendmark| is false. +% \item[Line \Coderef{atendtheorem}{9}:] +% if |setendmark| is true, the correct placement of the end +% symbol is organized, else (ie either |setendmarkfalse| is set +% by the user, or the endmark is already set by |\@endtrivlist|) +% reset |setendmark| to true.\\ +% For further comments see |\@endtrivlist| and +% |\OrganizeTheoremSymbol|. +% \end{packeddescr} +% The construction in line \Coderef{atendtheorem}{7} guarantees that +% the endmark is put at the end of the line, even if it is the only +% letter in this line. +% \end{macro} +% +% \begin{macro}{\NoEndMark} +% By |\NoEndMark|, the automatical setting of an end mark is blocked +% for the \emph{current} environment. +% \begin{macrocode} +\gdef\NoEndMark{\global\setendmarkfalse} +% \end{macrocode} +% \changes{v0.94}{1997/03/19}{'NoEndMark' introduced (WM)} +% \end{macro} +% +% set |setendmark| to false. It is automatically reset to |true| after +% the end of the current environment. +% +% \begin{macro}{\qed} +% With |\qed|, the user can locally change the end symbol to appear: +% \begin{macrocode} +\gdef\qed{\expandafter\def\csname \InTheoType Symbol\endcsname + {\the\qedsymbol}}% +% \end{macrocode}\end{macro} +% +% When calling |\qed|, the end symbol of the innermost theorem-like +% environment at that time is set to the value stored in |\qedsymbol| +% at that time. +% +% \begin{macro}{\PotEndMark} +% Handling a potential endmark position: +% +% \changes{v1.32}{2011/24/02}{added optional argument (WM)} +% \begin{macrocode} +\gdef\PotEndMark#1{ + \@ifnextchar[%] + {\PotEndMark@opt{#1}}{\SetEndMark{\InTheoType}{#1}{\relax}}}% +\gdef\PotEndMark@opt#1[#2]{\SetEndMark{\InTheoType}{#1}{#2}}% +% \end{macrocode} +% +% Arguments: \meta{cmd\_seq}:=|#1| is a command sequence to be +% executed when setting the endmark. \\ +% \meta{else\_cmd\_seq}= |#2|: a command sequence that is executed +% when no end mark is set (default is |\relax|; differs only in +% amsmath equation*). \\ +% It adds the current theorem type \env\ to the parameters, and +% calls \\ +% |\SetEndMark{|\env|}{|\meta{cmd\_seq}|}{|\meta{else\_cmd\_seq}|}|. +% \end{macro} +% +% \begin{macro}{\SetEndMark} +% |\SetEndMark| sets an endmark for an environment. It is +% called by |\PotEndMark|. +% \changes{v1.16}{1999/08/05}{extended for handling right indents (quote) (WM)} +% \changes{v1.16}{2001/11/28}{removed tilde in hbox (WM)} +% \changes{v1.28}{2009/07/02}{replaced roman by thm@romannum (WM)} +% \changes{v1.32}{2011/24/02}{added third argument (WM)} +% \Codelabel{SetEndMark} +% \begin{macrocode} +\gdef\SetEndMark#1#2#3{% + \stepcounter{end#1ctr}% + \@ifundefined{mark\thm@romannum{curr#1ctr}#1\thm@romannum{end#1ctr}}% + {#3}% + {#2{\csname mark\thm@romannum{curr#1ctr}#1\thm@romannum{end#1ctr}\endcsname + \ifdim\rightmargin>\z@\hskip-\rightmargin\fi + \hbox to 0cm{}}}}% +% \end{macrocode} +% +% Arguments: \\ +% \env:=|#1|: current theorem-environment. \\ +% \meta{cmd\_seq}:= |#2|: is a command sequence to be executed when setting +% the endmark. \\ +% \meta{else\_cmd\_seq}= |#3|: a command sequence that is executed +% when no end mark is set (usually |\relax|; differs only in amsmath tags). \\ +% All three arguments are transmitted by |\PotEndMark|. \\ +% \begin{packeddescr} +% \item[Line \Coderef{SetEndMark}{2}:] +% increments |end|\env|ctr| for preparing the next situation +% for setting a potential endmark. +% \item[Line \Coderef{SetEndMark}{3}, \Coderef{SetEndMark}{4}:] +% if +% \begin{quote} +% |\mark|$<$|\thm@romannum{curr|\env|ctr}|$>$\env% +% $<$|\thm@romannum{end|\env|ctr}|$>$ +% \end{quote} +% is undefined +% -- which is the case iff at this position no endmark has to be set --, +% \meta{else\_cmd\_seq} is executed, +% \item[Line \Coderef{SetEndMark}{5}:] +% otherwise, \meta{cmd\_seq} and then +% \begin{quote} +% |\mark|$<$|\thm@romannum{curr|\env|ctr}|$>$|\env|% +% $<$|\thm@romannum{end|\env|ctr}|$>$, +% \end{quote} +% which is defined in the |.aux| file to be the end symbol are called. \\ +% The construction \meta{cmd\_seq}|{|\ldots|}| in line +% \Coderef{SetEndMark}{5} allows the handling of the end symbol as an +% argument of \meta{cmd\_seq} as needed for |\endeqnarray|. +% \item[Line \Coderef{SetEndMark}{6}:] +% By |\hskip-\rightmargin\hbox to 0cm{}|, a negative hspace of +% amount |\rightmargin| is added \emph{after} the end symbol -- thus, +% the symbol is set as there were no right margin (this concerns, +% e.g., |\quote| environments). \\ +% (applied only if |\rightmargin| is more than 0 -- otherwise bug +% if preceding line ends with hyphenation.) +% \end{packeddescr} +% \changes{v1.20}{2001/12/30}{apply negative hskip only if more than 0 (WM)} +%\end{macro} +% +% \paragraph{Writing to .aux file.} +% (copied from |\def\label| (ltxref.dtx)) +% +% \changes{v0.91}{1997/02/20}{fixed `OrganizeTheoremSymbol' (WM)} +% \changes{v1.20}{2001/10/09}{check that not in vmode in bbsphack (WM)} +% \Codelabel{bbsphack} +% \begin{macrocode} +\newskip\mysavskip +\gdef\@bbsphack{% + \ifvmode\else\mysavskip\lastskip + \unskip\fi} +% +\gdef\@eesphack{% + \ifdim\mysavskip>\z@ + \vskip\mysavskip \else\fi} +% \end{macrocode} +% \begin{packeddescr} +% \item[Lines \Coderef{bbsphack}{2}--\Coderef{bbsphack}{4} and +% \Coderef{bbsphack}{5}--\Coderef{bbsphack}{7}] +% are similar to |\@bsphack| and |\@bsphack| +% of latex.ltx. They undo resp.\ redo the last |skip|. +% \end{packeddescr} +% Note that |@bbsphack| and |@eesphack| are also part of the +% thref option. Change both if you change them. +% +% \begin{macro}{\OrganizeTheoremSymbol} +% \changes{v1.28}{2009/07/02}{replaced roman by thm@romannum (WM)} +% The information for setting the end marks is written to the .aux file: +% +% \Codelabel{OrgThSymb} +% \begin{macrocode} +\gdef\OrganizeTheoremSymbol{% + \@bbsphack + \edef\thm@tmp{\expandafter\expandafter\expandafter\thm@meaning + \expandafter\meaning\csname\InTheoType Symbol\endcsname\relax}% + \protected@write\@auxout{}% + {\string\global\string\def\string\mark% + \thm@romannum{curr\InTheoType ctr}\InTheoType \thm@romannum{end\InTheoType ctr}% + {\thm@tmp}}% + \@eesphack} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Lines \Coderef{OrgThSymb}{5}--\Coderef{OrgThSymb}{7}:] +% Write \\ +% |\global\def\mark|$<$|\thm@romannum{curr|\env|ctr}|$>\env +% <$|\thm@romannum{end|\env|ctr}|$>$% +% |{<|\env|Symbol>}| +% to the |.aux| file. \\ +% \env :=|\InTheoType| gives the innermost theorem-like environment, +% i.e. the one the end symbol has to be set for. +% \end{packeddescr}\end{macro} +% +% \begin{macrocode} +} % end of option [thmmarks] +% \end{macrocode} +% +% \subsubsection{Option leqno to Thmmarks} +% +% \Codelabel{Optleqno} +% \begin{macrocode} +\DeclareOption{leqno}{% ********************************************* + \if@thmmarks + \PackageInfo{\basename}{Option `leqno' loaded}% + \gdef\SetMark@endeqn#1{\hss\llap{#1}} + \gdef\SetMark@endeqnarray#1{\hss\llap{#1}} + \fi}% +% \end{macrocode} +% |leqno| is only active it |thmmarks| is also active. \\ +% \begin{packeddescr} +% \item[Line \Coderef{Optleqno}{4}, \Coderef{Optleqno}{5}:] +% Since with |leqno|, the equation number is placed on +% the left, after infinitely stretchable glue, the endmark can be +% set straight at the right margin. +% \end{packeddescr} +% +% \subsubsection{Option fleqn to Thmmarks} +% +% \begin{macrocode} +\DeclareOption{fleqn}{% ********************************************* +\if@thmmarks + \PackageInfo{\basename}{Option `fleqn' loaded}% +% \end{macrocode} +% +% |fleqn| is only active it |thmmarks| is also active. +% +% \begin{macro}{\[} +% \changes{v1.27}{2008/06/18}{fixed: start array with no additional +% space (WM, reported by Tillmann Berg)} +% Since |fleqn| treats displayed math as trivlists, it's quite +% another thing: +% +% \Codelabel{fleqn-b-displ} +% \changes{v1.28}{2009/07/02}{replaced roman by thm@romannum (WM)} +% \begin{macrocode} + \renewcommand\[{\relax + \ifmmode\@badmath + \else + \begin{trivlist}% + \@beginparpenalty\predisplaypenalty + \@endparpenalty\postdisplaypenalty + \item[]\leavevmode + \hb@xt@\linewidth\bgroup $\m@th\displaystyle %$ + \hskip\mathindent\bgroup + \stepcounter{end\InTheoType ctr}% + \@ifundefined{mark\thm@romannum{curr\InTheoType ctr}% + \InTheoType\thm@romannum{end\InTheoType ctr}}{\relax}% + {\ifx\csname\InTheoType Symbol\endcsname\@empty\else + \boxmaxdepth=.5ex\begin{array}[b]{@{}l}% + \boxmaxdepth=\maxdimen\displaystyle\fi}% + \addtocounter{end\InTheoType ctr}{-1}% + \fi} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Lines \Coderef{fleqn-b-displ}{1}--\Coderef{fleqn-b-displ}{9},% +% \Coderef{fleqn-b-displ}{17}:] +% the old definition. +% \item[Line \Coderef{fleqn-b-displ}{10}--\Coderef{fleqn-b-displ}{16}:] +% if an endmark has to be set in this displaymath, it +% is put into an array with depth $\le 0.5$|ex|, and vertically +% adjusted to the bottom line. +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\]} +% \changes{v1.28}{2009/07/02}{replaced roman by thm@romannum (WM)} +% Here, the end mark is placed after a |\hfil| ate the end of the line +% containing the displaymath: +% +% \Codelabel{fleqn-e-displ} +% \begin{macrocode} + \renewcommand\]{% + \stepcounter{end\InTheoType ctr}% + \@ifundefined{mark\thm@romannum{curr\InTheoType ctr}% + \InTheoType\thm@romannum{end\InTheoType ctr}}{\relax}% + {\ifx\csname\InTheoType Symbol\endcsname\@empty\else + \end{array}\fi}% + \addtocounter{end\InTheoType ctr}{-1}% + \relax\ifmmode + \egroup $\hfil\PotEndMark{}% $ + \egroup + \end{trivlist}% + \else \@badmath + \fi} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Lines \Coderef{fleqn-e-displ}{2}--\Coderef{fleqn-e-displ}{6}:] +% Look, if an endmark has to be set in this displaymath. +% If so, close the inner array. +% \item[Lines \Coderef{fleqn-e-displ}{8}--\Coderef{fleqn-e-displ}{13}:] +% the old definition. +% \item[Line \Coderef{fleqn-e-displ}{9}:] Added |\PotEndMark|. +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\endequation} +% for equations, the end mark is also set with the equation number: +% \Codelabel{fleqn-endeqn} +% \begin{macrocode} +\gdef\endequation{% + $\hfil % $ + \displaywidth\linewidth\hbox{\@eqnnum \PotEndMark{\SetMark@endeqn}}% + \egroup + \endtrivlist} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Line \Coderef{fleqn-endeqn}{3}:] +% When the equation number is set, also the endmark is set with +% the same trick as for |\endequation| without |fleqn|. +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\endeqnarray} +% When the equation number is set, also the endmark is set with +% the same trick as for |\endeqnarray| without |fleqn| (see +% Lines \Coderef{fleqn-endeqnarray}{2}, \Coderef{fleqn-endeqnarray}{3},% +% \Coderef{fleqn-endeqnarray}{8}): +% +% \Codelabel{fleqn-endeqnarray} +% \begin{macrocode} +\gdef\endeqnarray{% + \global\let\Oldeqnnum=\@eqnnum + \gdef\@eqnnum{\Oldeqnnum\PotEndMark{\SetMark@endeqnarray}}% + \@@eqncr + \egroup + \global\advance\c@equation\m@ne$$% $$ + \global\@ignoretrue + \global\let\@eqnnum\Oldeqnnum} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\fi}% end of option fleqn +% \end{macrocode} +% +% \subsubsection{Extended Referencing Facilities}\label{sec:Referencing} +% +% \begin{macrocode} +\DeclareOption{thref}{%********************************************** + \PackageInfo{\basename}{Option `thref' loaded}% +\@threftrue +% \end{macrocode} +% +% Option |thref| needs a special handling when combined with amsmath. +% This is also a reason why it is handled first. +% +% \begin{macro}{\bbsphack(2)} +% \changes{v1.19}{2001/01/12}{added to thref option (error if thref +% was used without thmmarks; OK/WM)} +% \changes{v1.20}{2001/10/09}{check that not in vmode in bbsphack; (WM)} +% \begin{macrocode} +\newskip\mysavskip +\gdef\@bbsphack{% + \ifvmode\else\mysavskip\lastskip + \unskip\fi} +% +\gdef\@eesphack{% + \ifdim\mysavskip>\z@ + \vskip\mysavskip \else\fi} +% \end{macrocode} +% Note that |@bbsphack| and |@eesphack| are also part of the +% thmmarks option. Change both if you change them. +% \end{macro} +% +% \paragraph{Communication of theorem types for references.} +% +% The |thref| functionality needs to know the respective theorem type +% of the referenced +% labels. This is incorporated as additional arguments in |label| and +% |newlabel/@newl@abel|. Note that if the |hyperref| package is used, +% the handling is different (see Option |hyperref|). +% +% \begin{macro}{\label} +% \changes{v1.1}{1998/08/30}{added optional argument to 'label'. (WM)} +% \changes{v1.18}{1999/12/25}{Adapted for complex keywords (WM)} +% The original |\label| macro is extended (cf.\ ltxref.dtx) with an +% optional argument, containing the type of the labeled construct. +% (when option |hyperref| is used, ) +% \Codelabel{label} +% \begin{macrocode} +\def\label#1{% + \@ifnextchar[%] + {\label@optarg{#1}}% + {\thm@makelabel{#1}}} +% +\def\thm@makelabel#1{% + \@bbsphack + \edef\thm@tmp{\expandafter\expandafter\expandafter\thm@meaning + \expandafter\meaning\csname\InTheoType Keyword\endcsname\relax}% + \protected@write\@auxout{}% + {\string\newlabel{#1}{{\@currentlabel}{\thepage}}[\thm@tmp]}% + \@eesphack} +% +\def\label@optarg#1[#2]{% + \@bsphack + \protected@write\@auxout{}% + {\string\newlabel{#1}{{\@currentlabel}{\thepage}}[#2]}% + \@esphack} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[|thm@makelabel|:] +% If no optional argument is given, the keyword of the current +% environment type is used instead. +% \item[|label@optarg|:] +% The original definition, extended with the optional argument +% which is appended to the |\newlabel|-command to be written +% to the .aux-file. +% \end{packeddescr} +% \end{macro} +% +% \begin{macro}{\newlabel} +% \changes{v1.1}{1998/08/30}{added modified macro '@newl@bel'. (WM)} +% The original behavior of |\newlabel| (called when evaluating +% the .aux-file) is also adapted. \\ +% Original syntax: +% |\newlabel{|\meta{label}|}{{|\meta{section}|}{|\meta{page}|}}|\\ +% Modified syntax: +% |\newlabel{|\meta{label}|}|% +% |{{|\meta{section}|}{|\meta{page}|}}[|\meta{type}|]|\\ +% Definition of |\newlabel|: |\def\newlabel{\@newl@bel r}|. \\ +% Therefore, the modification is encoded into the |\@newl@bel| macro: +% +% \Codelabel{newlabel} +% \changes{v1.18}{1999/12/26}{adapted to babel-3.6 (WM)} +% \begin{macrocode} +\def\@newl@bel#1#2#3{% + \@ifpackageloaded{babel}{\@safe@activestrue}\relax% + \@ifundefined{#1@#2}% + \relax + {\gdef \@multiplelabels {% + \@latex@warning@no@line{There were multiply-defined labels}}% + \@latex@warning@no@line{Label `#2' multiply defined}}% + \global\@namedef{#1@#2}{#3}% + \@ifnextchar[{\set@label@type{#1}{#2}}%] + \relax}% +\def\set@label@type#1#2[#3]{% + \global\@namedef{#1@#2@type}{#3}} +% \end{macrocode} +% +% the macro is called with three arguments (same as originally):\\ +% |#1|=|r|, \\ +% \meta{labelname} := |#2| is the label name,\\ +% |#3| is a pair (section, page-number) consisting of the values +% needed for |\ref| and |\pageref|, respectively. +% +% \begin{packeddescr} +% \item[Line \Coderef{newlabel}{2}:] adaptation to babel +% \item[Lines \Coderef{newlabel}{3}--\Coderef{newlabel}{8}:] +% The original definition (both standard \LaTeX\ and babel). +% \item[Line \Coderef{newlabel}{9}:] if an optional argument +% follows (containing the environment-type), continue with +% |\set@label@type|, otherwise return (the original behavior). +% \item[Lines \Coderef{newlabel}{11}, \Coderef{newlabel}{12}:] +% set |\r@|\meta{labelname}|@type| to the type of the +% respective environment. +% \end{packeddescr} +% \end{macro} + + +% \begin{macro}{\thref} +% \changes{v1.1}{1998/08/30}{added macro 'thref'. (WM)} +% \changes{v1.13}{1998/12/01}{made 'thref' an option. (WM)} +% +% |\thref| is an adaptation of |\ref|: +% \Codelabel{thref} +% \begin{macrocode} +\def\thref#1{% + \expandafter\ifx\csname r@#1@type\endcsname\None + \PackageWarning{\basename}{thref: Reference Type of `#1' on page + \thepage \space undefined}\G@refundefinedtrue + \else\csname r@#1@type\endcsname~\fi + \expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Lines \Coderef{thref}{1}, \Coderef{thref}{6}:] +% similar to |\ref|. +% \item[Line \Coderef{newlabel}{2}:] if a legal theorem type +% is given, then output +% |\r@|\meta{labelname}|@type| and avoid linebreaking +% between the type and the number. +% \end{packeddescr} +% \end{macro} + +% \begin{macro}{\testdef} +% \changes{v1.19}{2001/01/12}{added (HO/WM, reported by Hans-Christoph Wirth)} +% \changes{v1.31}{2011/02/08}{changed '@gobbleopt' into 'thm@gobbleopt' after +% nameclash with hyperref (AS/WM)} +% A problem occurred, when about 250 labels to theorem-like +% environments have been defined: after the end of a document, +% the .aux file is read once more (to check if references changed). +% Here, \LaTeX\ redefines |\@newl@bel| into |\@testdef| -- and +% \LaTeX\ does not know that ntheorem's |\label| has an additional +% optional argument. Thus, the argument values are not processed, +% but are output as normal text. Normally, this did not matter +% since output has already been finished by a |\clearpage| in +% |\end{document}|. For so many labels, a page gets filled +% and the output routine is called. +% +% \Codelabel{testdef} +% \begin{macrocode} +\newcommand\org@testdef{} +\let\org@testdef\@testdef +\def\@testdef#1#2#3{% + \org@testdef{#1}{#2}{#3}% + \@ifnextchar[{\thm@gobbleopt}{}% +} +\newcommand\thm@gobbleopt{} +\long\def\thm@gobbleopt[#1]{} +% \end{macrocode} +% \begin{packeddescr} +% \item[Line \Coderef{testdef}{4}:] +% process the optional argument. +% \end{packeddescr} +% \end{macro} +% +% \begin{macrocode} +}% end of option thref ************************************************ +% \end{macrocode} +% +% \subsubsection{Option amsmath to Thmmarks} +% Most of the commands are extensions of commands in |amsmath.sty|. +% +% \begin{macrocode} +\DeclareOption{amsmath}{% *************************************************** +\if@thref + \PackageInfo{\basename}{option `amsmath' handling for `thref' loaded}% +% \end{macrocode} +% +% if |thref| is active, the handling of labels in amsmath equations has also +% to be adapted. +% +% \begin{macro}{ams-thref} +% \changes{v1.19}{2001/01/12}{added handling of thref in ams-equations +% (reported by Lars Relund).} +% \begin{macrocode} +\let\ltx@label\label +% \end{macrocode} +% keep the handling of |\label| ... (the one defined above in the thref option). +% +% amsmath implements a special handling of |\label| inside of displaymath +% environments. It is extended to process the optional argument provided +% be the thref option: +% +% \begin{macrocode} +\global\let\thm@df@label@optarg\@empty +\def\label@in@display#1{% + \ifx\df@label\@empty\else + \@amsmath@err{Multiple \string\label's: + label '\df@label' will be lost}\@eha + \fi + \gdef\df@label{#1}% + \@ifnextchar[{\thm@label@in@display@optarg}{\thm@label@in@display@noarg}%] +} +\def\thm@label@in@display@noarg{% + \global\let\thm@df@label@optarg\@empty +} +\def\thm@label@in@display@optarg[#1]{% + \gdef\thm@df@label@optarg{#1}% +} +% \end{macrocode} +% \changes{v1.22}{2003/06/25}{fixed thm@df@label@optarg (WM, reported by +% Marija Kulas)} +% +% The contents of |\df@label| is handled when the equation is finished. +% (Currently) this happens in three macros. The modification consists +% of the check if |\thm@df@label@optarg| is non-empty (i.e., holds the +% optional argument), and to handle it. +% +% \begin{macrocode} +\def\endmathdisplay@a{% + \if@eqnsw \gdef\df@tag{\tagform@\theequation}\fi + \if@fleqn \@xp\endmathdisplay@fleqn + \else \ifx\df@tag\@empty \else \veqno \alt@tag \df@tag \fi + \ifx\df@label\@empty \else + \ifx\thm@df@label@optarg\@empty \@xp\ltx@label\@xp{\df@label}% + \else \@xp\ltx@label\@xp{\df@label}[\thm@df@label@optarg]\fi + \fi + \fi + \ifnum\dspbrk@lvl>\m@ne + \postdisplaypenalty -\@getpen\dspbrk@lvl + \global\dspbrk@lvl\m@ne + \fi +} +\def\make@display@tag{% + \if@eqnsw + \refstepcounter{equation}% + \tagform@\theequation + \else + \iftag@ + \df@tag + \global\let\df@tag\@empty + \fi + \fi + \ifmeasuring@ + \else + \ifx\df@label\@empty\else + \ifx\thm@df@label@optarg\@empty \@xp\ltx@label\@xp{\df@label}% + \else \@xp\ltx@label\@xp{\df@label}[\thm@df@label@optarg]\fi + \global\let\df@label\@empty + \fi + \fi +} +\def\endmathdisplay@fleqn{% + $\hfil\hskip\@mathmargin\egroup + \ifnum\badness<\inf@bad \let\too@wide\@ne \else \let\too@wide\z@ \fi + \ifx\@empty\df@tag + \else + \setbox4\hbox{\df@tag + \ifx\thm@df@label@optarg\@empty \@xp\ltx@label\@xp{\df@label}% + \else \@xp\ltx@label\@xp{\df@label}[\thm@df@label@optarg]\fi + }% + \fi + \csname emdf@% + \ifx\df@tag\@empty U\else \iftagsleft@ L\else R\fi\fi + \endcsname +} +% \end{macrocode} +% \changes{v1.29}{2010/06/24}{fixed endmathdisplay@fleqn, make@display@tag, +% endmathdisplay@fleqn (WM, reported by Claas Hemig)} +% \end{macro} +% \begin{macrocode} +\fi +% end of if-thref in option amsmath ****************************************** +\if@thmmarks + \PackageInfo{\basename}{option `amsmath' handling for `thmmarks' loaded}% +\newdimen\thm@amstmpdepth +% \end{macrocode} +% A temporarily used register. +% +% \begin{macro}{\TagsPlusEndmarks} +% \changes{v1.03}{1997/07/15}{Fixed 'TagsPlusEndMarks', introduced +% 'SetOnlyEndMark' and 'SetTagPlusEndMark' (WM)} +% Since |amsmath| uses ``tags'' for setting end marks, +% some macros are defined which prepare tags which include endmarks: +% \Codelabel{EndTags} +% \begin{macrocode} +\gdef\TagsPlusEndmarks{% + \global\let\Old@maketag@@@=\maketag@@@ + \global\let\Old@df@tag=\df@tag + \if@eqnsw\SetTagPlusEndMark + \else + \iftag@\SetTagPlusEndMark + \else\SetOnlyEndMark + \fi + \fi} +% \end{macrocode} +% \begin{packeddescr} +% \item[Lines \Coderef{EndTags}{2}, \Coderef{EndTags}{3}:] +% store the original macros. +% \item[Line \Coderef{EndTags}{4}:] +% if equation numbers are set as default, call +% |\SetTagPlusEndMark| to set tag and end mark. +% \item[Lines \Coderef{EndTags}{5}, \Coderef{EndTags}{6}:] +% if a tag is set manually, call +% |\SetTagPlusEndMark| to set tag and end mark. +% \item[Line \Coderef{EndTags}{7}:] +% otherwise, call |\SetOnlyEndMark| to set only an end mark. +% \end{packeddescr} +% \end{macro} +% +% \begin{macro}{\SetOnlyEndMark} +% \changes{v1.32}{2011/24/02}{added second argument to call of +% PotEndMark in else case (WM, reported by Rolf Theunissen)} +% \Codelabel{OnlyEnd} +% \begin{macrocode} +\gdef\SetOnlyEndMark{% + \global\tag@true + \iftagsleft@ + \gdef\df@tag{\hbox + to \displaywidth{\hss\PotEndMark{\maketag@@@}}}% + \else + \gdef\df@tag{\PotEndMark{\maketag@@@}[\ifhmode\else\hbox to .1pt{}\fi]}% + \fi} +% \end{macrocode} +% Set only an end mark: +% +% \begin{packeddescr} +% \item[Line \Coderef{OnlyEnd}{2}:] +% force setting the end mark as a tag: +% \item[Lines \Coderef{OnlyEnd}{4}, \Coderef{OnlyEnd}{5}:] +% if tags are set to the left, the tag consists of a +% |\hbox| over the whole displaywidth, with the (potential) endmark +% at its right. +% \item[Line \Coderef{OnlyEnd}{7}:] +% if tags are set to the right, the tag consists only of the +% (potential) endmark. If no endmark is set and \TeX\ is not in hmode, +% an empty hbox is output (otherwise |\abovedisplayskip| will be +% ignored in |equation*|; this is executed in |endmathdisplay@a| when +% it comes to |\veqno\alt@tag\df@tag|). +% \end{packeddescr} +% \end{macro} +% +% \begin{macro}{\SetTagPlusEndMark} +% \Codelabel{TagPlus} +% \changes{v1.26}{2007/10/17}{fixed: box to tagwidth (problem with leqno; WM)} +% \begin{macrocode} +\newdimen{\tagwidth} +\gdef\SetTagPlusEndMark{% + \iftagsleft@ + \gdef\maketag@@@##1{% + \settowidth{\tagwidth}{$##1$}%% %% WM 17.10.2007 + \hbox to \tagwidth{% + \hbox to \displaywidth{\m@th\normalfont##1% + \hss\PotEndMark{\hss}}\hss}}% + \else + \gdef\maketag@@@##1{\hbox{\m@th\normalfont##1% + \llap{\hss\PotEndMark{\raisebox{-1.3em}}}}}% + \fi} +% \end{macrocode} +% +% Set a tag \emph{and} an end mark: +% \begin{packeddescr} +% \item[Lines \Coderef{TagPlus}{2}--\Coderef{TagPlus}{11}:] +% redefine the |\maketag@@@| macro: +% \item[Lines \Coderef{TagPlus}{3}--\Coderef{TagPlus}{7}:] +% if tags are set to the left, build a box of the whole +% displaywidth and put the original tag on the left, and the (potential) +% endmark at the right. Put this box with width 0 and continue. +% \item[Lines \Coderef{TagPlus}{8}, \Coderef{TagPlus}{9}:] +% if the tags are set to the right, the (potential) end +% mark is put below it. +% \end{packeddescr} +% \changes{v1.20}{2001/12/29}{added hss if tags left (GD/WM)} +% \end{macro} +% +% \begin{macro}{\tagform@} +% \begin{packeddescr} +% \item |\maketag@@@| is also used via |\tagform@| in |\eqref| that may be +% called inside an environment. There, the original functionality must +% be used. The (small) commands |\th@ams@tagopen{(}| and +% |\th@ams@tagopen{(}| are provided as a hook for the |empheq| package. +% \end{packeddescr} +% \changes{v1.30}{2010/08/16}{added (WM), bug reported by Martin Schulze} +% \changes{v1.32}{2011/03/10}{revised (WM), bug reported by Lars Madsen} +% \begin{macrocode} +\let\th@ams@@maketag@@@\maketag@@@ +\gdef\th@ams@tagopen{(} +\gdef\th@ams@tagclose{)} +\gdef\th@ams@tagform@#1{% + \th@ams@@maketag@@@{\th@ams@tagopen\ignorespaces#1% + \unskip\@@italiccorr\th@ams@tagclose}} +\gdef\eqref#1{\textup{\th@ams@tagform@{\ref{#1}}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\RestoreTags} +% \Codelabel{RestoreTags} +% \begin{macrocode} +\gdef\RestoreTags{% + \global\let\maketag@@@=\Old@maketag@@@ + \global\let\df@tag=\Old@df@tag} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Lines \Coderef{RestoreTags}{2}, \Coderef{RestoreTags}{3}:] +% restore the original macros. +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\endgather} +% \changes{v1.19}{2001/01/12}{adapted to amsmath-2.0 (GD/WM)} +% In the |gather| environment, just the augmented tag is used: +% \Codelabel{endgather} +% \begin{macrocode} +\gdef\endgather{% + \TagsPlusEndmarks % <<<<<<<<< + \math@cr + \black@\totwidth@ + \egroup + $$% + \RestoreTags % <<<<<<<<< + \ignorespacesafterend} +% +\expandafter\let\csname endgather*\endcsname\endgather +% \end{macrocode} +% +% New: +% \begin{packeddescr} +% \item[Line \Coderef{endgather}{2}:] +% the last tag contains the potential endmark. +% \item[Line \Coderef{endgather}{7}:] +% restore the original macros. +% \item[Line \Coderef{endgather}{10}:] +% Since |let| always takes the expansion of a macro when the +% let is executed, all let's have to be adjusted (this is the same +% for all subsequent let-statements). +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\math@cr@@@align} +% \changes{v1.12}{1998/11/15}{dropped redefinition of 'math@cr@@@align' (WM, +% reported by Frank-Christian Otto)} +% \end{macro} +% +% \begin{macro}{\endalign} +% |\endalign| also uses the augmented tags: +% \Codelabel{endalign} +% \begin{macrocode} +\def\endalign{% + \ifingather@\else % <<<<<<<<< + \TagsPlusEndmarks\fi % <<<<<<<<< + \math@cr + \black@\totwidth@ + \egroup + \ifingather@ + \restorealignstate@ + \egroup + \nonumber + \ifnum0=`{\fi\iffalse}\fi + \else + $$% + \RestoreTags % <<<<<<<<< + \fi + \ignorespacesafterend} +% \end{macrocode} +% +% \changes{v1.19}{2001/01/12}{adapted to amsmath-2.0 (GD/WM)} +% New: +% \begin{packeddescr} +% \item[Lines \Coderef{endalign}{2}, \Coderef{endalign}{3}:] +% if the |align| is not inside another environment, +% its tags have to contain the endmarks. +% \item[Line \Coderef{endalign}{14}:] +% this case, the original macros have to be restored. +% \end{packeddescr}\end{macro} +% +% \begin{macrocode} +\expandafter\let\csname endalign*\endcsname\endalign +\let\endxalignat\endalign +\expandafter\let\csname endxalignat*\endcsname\endalign +\let\endxxalignat\endalign +\let\endalignat\endalign +\expandafter\let\csname endalignat*\endcsname\endalign +\let\endflalign\endalign +\expandafter\let\csname endflalign*\endcsname\endalign +% \end{macrocode} +% +% Adjust let-statements. +% +% \begin{macro}{\lendmultline} +% The |multline| environment has two different |\end| commands, +% depending if the equation numbers are set on the left or on the right: +% \Codelabel{lendmultline} +% \begin{macrocode} +\def\lendmultline@{% + \global\@eqnswfalse\tag@false\tagsleft@false + \rendmultline@} +% \end{macrocode} +% +% End of |multline| environment if tags are set to the left: +% in this case, the last line of a |multline| does not contain a tag. +% Thus the situation of setting an endmark tag at the right is faked: +% \begin{packeddescr} +% \item[Lines \Coderef{lendmultline}{2}, \Coderef{lendmultline}{3}:] +% display no equation number, don't set an equation tag +% (but use the tag mechanism for the end mark - see |\TagsPlusEndmarks| +% and |\SetOnlyEndMark|), set it at the right, +% and call |\rendmultline|. +% \end{packeddescr} +% \changes{v1.20}{2001/12/29}{debugged (GD/WM)} +% \end{macro} +% +% \begin{macro}{\rendmultline} +% |\rendmultline| also uses the augmented tags: +% \Codelabel{rendmultline} +% \begin{macrocode} +\def\rendmultline@{% + \TagsPlusEndmarks % <<<<<<<<< + \iftag@ + $\let\endmultline@math\relax + \ifshifttag@ + \hskip\multlinegap + \llap{\vtop{% + \raise@tag + \normalbaselines + \setbox\@ne\null + \dp\@ne\lineht@ + \box\@ne + \hbox{\strut@\make@display@tag}% + }}% + \else + \hskip\multlinetaggap + \make@display@tag + \fi + \else + \hskip\multlinegap + \fi + \hfilneg + \math@cr + \egroup$$% + \RestoreTags} % <<<<<<<<< +% \end{macrocode} +% +% New: \\ +% Line \Coderef{rendmultline}{2}: +% last tag contains the potential endmark. \\ +% Line \Coderef{rendmultline}{26}: +% restore the original macros +% \changes{v1.19}{2001/01/12}{adapted to amsmath-2.0 (GD/WM)} +% \end{macro} +% +% \begin{macro}{\endmathdisplay} +% +% \Codelabel{ams-e-displ} +% \begin{macrocode} +\def\endmathdisplay#1{% + \ifmmode \else \@badmath \fi + \TagsPlusEndmarks % <<<<<<<<< + \endmathdisplay@a + $$% + \RestoreTags % <<<<<<<<< + \global\let\df@label\@empty \global\let\df@tag\@empty + \global\tag@false \global\let\alt@tag\@empty + \global\@eqnswfalse +} +% \end{macrocode} +% \changes{v0.94}{1997/03/19}{end mark with raisebox (WM)} +% \changes{v1.19}{2001/01/12}{completely new for amsmath-2.0, begin[ deleted (GD/WM)} +% \end{macro} +% +% Added Line \Coderef{ams-e-displ}{4}: set potential end mark at +% bottom niveau of displaymath. +% +% \begin{macro}{equation} +% \changes{v1.19}{2001/01/12}{adapted to amsmath-2.0 (WM)} +% \changes{v1.32}{2011/02/24}{adapted to amsmath-2.13 (WM)} +% \begin{macrocode} +\renewenvironment{equation}{% + \incr@eqnum + \mathdisplay@push + \st@rredfalse \global\@eqnswtrue + \mathdisplay{equation}% +}{% + \endmathdisplay{equation}% + \mathdisplay@pop + \ignorespacesafterend +} +\renewenvironment{equation*}{% + \mathdisplay@push + \st@rredtrue \global\@eqnswfalse + \mathdisplay{equation*}% +}{% + \endmathdisplay{equation*}% + \mathdisplay@pop + \ignorespacesafterend +} +% \end{macrocode} +% unchanged from |amsmath.sty|. +% \end{macro} +% +% \begin{macrocode} +\fi +}% end of option amsmath/thmmarks ************************************** +% \end{macrocode} +% +% +% \subsubsection{Theorem-Layout Stuff} +% +% \changes{v1.11}{1998/10/26}{added 'noconfig' option (AS/WM)} +% \begin{macrocode} +\let\thm@usestd\@undefined +\DeclareOption{standard}{\let\thm@usestd\relax} +\let\thm@noconfig\@undefined +\DeclareOption{noconfig}{\let\thm@noconfig\relax} +% \end{macrocode} +% +% Options for selection of a configuration: if no such option is given +% |ntheorem.cfg| will be loaded (which has to be provided by the +% user), |[standard]| will load |ntheorem.std|, a predefined setting, +% and |[noconfig]| does not preload any configuration. +% +% \begin{macrocode} +\gdef\InTheoType{None} +\gdef\NoneKeyword{None} +\gdef\NoneSymbol{None} +\gdef\None{None} +% \end{macrocode} +% +% Set |\InTheoType| to |none| on the upper document level. +% +% \begin{macro}{\newtheoremstyle} +% \changes{v0.93}{1997/03/12}{'newtheoremstyle' only if not yet defined (WM)} +% With |\newtheoremstyle|, new theorem-layout styles are defined. +% \Codelabel{newthmstyle} +% \begin{macrocode} +\gdef\newtheoremstyle#1#2#3{% + \expandafter\@ifundefined{th@#1}% + {\expandafter\gdef\csname th@#1\endcsname{% + \def\@begintheorem####1####2{#2}% + \def\@opargbegintheorem####1####2####3{#3}}}% + {\PackageError{\basename}{Theorem style #1 already defined}\@eha}} +% \end{macrocode} +% +% Arguments: \\ +% \meta{style}:=|#1|: the name of the theoremstyle to be defined, \\ +% \meta{cmd\_seq1}:=|#2|: command sequence for setting the header +% for environment instances with no optional text, \\ +% \meta{cmd\_seq2}:=|#3|: command sequence for setting the header +% for environment instances with optional text. \\ +% Line \Coderef{newthmstyle}{2}: if this style is not yet defined, define +% it. \\ +% Line \Coderef{newthmstyle}{3}: +% define |\th@|\meta{style} to be a macro which defines \\ +% Line \Coderef{newthmstyle}{4}: +% a) the two-argument macro |\@begintheorem#1#2| to be \meta{cmd\_seq1}, \\ +% Line \Coderef{newthmstyle}{5}: +% b) |\@opargbegintheorem#1#2#3| to be \meta{cmd\_seq2}. +% \end{macro} +% +% The predefined theorem styles use this command.% +% +% \begin{macro}{\renewtheoremstyle} +% \changes{v0.93}{1997/03/12}{introduced 'renewtheoremstyle' (WM)} +% \Codelabel{renewthmstyle} +% \begin{macrocode} +\gdef\renewtheoremstyle#1#2#3{% + \expandafter\@ifundefined{th@#1}% + {\PackageError{\basename}{Theorem style #1 undefined}\@ehc}% + {}% + \expandafter\let\csname th@#1\endcsname\relax + \newtheoremstyle{#1}{#2}{#3}} +% \end{macrocode} +% \end{macro} +% Arguments: \\ +% \meta{style}:=|#1|: the name of the theoremstyle to be defined, \\ +% |#2|, |#3| as for |\newtheoremstyle|. \\ +% Checks, if theoremstyle \meta{style} is already defined. If so, +% |\th@|\meta{style} is made undefined and |\newtheoremstyle| is called +% with the same arguments. +% +% \paragraph{Predefined Theorem Styles} +% \begin{macro}{theoremstyles} +% |th@plain|, |th@change|, and |th@margin| taken from theorem.sty by +% Frank Mittelbach; the break-styles have been changed. +% +% \changes{v1.03}{1997/07/15}{break styles changed (WM)} +% \changes{v1.15}{1999/02/01}{fixed nonumberbreak (WM)} +% \changes{v1.19}{2001/01/13}{break styles and empty style changed, +% now it is analogous to theorem.sty (OK/WM)} +% \begin{macrocode} +\newtheoremstyle{plain}% + {\item[\hskip\labelsep \theorem@headerfont ##1\ ##2\theorem@separator]}% + {\item[\hskip\labelsep \theorem@headerfont ##1\ ##2\ (##3)\theorem@separator]} +% +\newtheoremstyle{break}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\ ##2\theorem@separator}\hbox{\strut}}}]}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\ ##2\ (##3)\theorem@separator}\hbox{\strut}}}]} +% +\newtheoremstyle{change}% + {\item[\hskip\labelsep \theorem@headerfont ##2\ ##1\theorem@separator]}% + {\item[\hskip\labelsep \theorem@headerfont ##2\ ##1\ (##3)\theorem@separator]} +% +\newtheoremstyle{changebreak}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##2\ ##1\theorem@separator}\hbox{\strut}}}]}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##2\ ##1\ (##3)\theorem@separator}\hbox{\strut}}}]} +% +\newtheoremstyle{margin}% + {\item[\theorem@headerfont \llap{##2}\hskip\labelsep ##1\theorem@separator]}% + {\item[\theorem@headerfont \llap{##2}\hskip\labelsep ##1\ (##3)\theorem@separator]} +% +\newtheoremstyle{marginbreak}% + {\item[\rlap{\vbox{\hbox{\theorem@headerfont + \llap{##2}\hskip\labelsep\relax ##1\theorem@separator}\hbox{\strut}}}]} + {\item[\rlap{\vbox{\hbox{\theorem@headerfont + \llap{##2}\hskip\labelsep\relax ##1\ + (##3)\theorem@separator}\hbox{\strut}}}]} +% +\newtheoremstyle{nonumberplain}% + {\item[\theorem@headerfont\hskip\labelsep ##1\theorem@separator]}% + {\item[\theorem@headerfont\hskip \labelsep ##1\ (##3)\theorem@separator]} +% +\newtheoremstyle{nonumberbreak}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\theorem@separator}\hbox{\strut}}}]}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont + ##1\ (##3)\theorem@separator}\hbox{\strut}}}]} +% +\newtheoremstyle{empty}% + {\item[]}% + {\item[\theorem@headerfont \hskip\labelsep\relax ##3]} +\newtheoremstyle{emptybreak}% + {\item[]}% + {\item[\rlap{\vbox{\hbox{\hskip\labelsep\relax \theorem@headerfont + ##3\theorem@separator}\hbox{\strut}}}]} +% +\@namedef{th@nonumbermargin}{\th@nonumberplain} +\@namedef{th@nonumberchange}{\th@nonumberplain} +\@namedef{th@nonumbermarginbreak}{\th@nonumberbreak} +\@namedef{th@nonumberchangebreak}{\th@nonumberbreak} +\@namedef{th@plainNo}{\th@nonumberplain} +\@namedef{th@breakNo}{\th@nonumberplain} +\@namedef{th@marginNo}{\th@nonumberplain} +\@namedef{th@changeNo}{\th@nonumberplain} +\@namedef{th@marginbreakNo}{\th@nonumberbreak} +\@namedef{th@changebreakNo}{\th@nonumberbreak} +% \end{macrocode} +% \changes{v0.81}{1997/02/12}{`theoremnumbering' and styles ...No added +% (WM)} +% \changes{v1.04}{1998/05/26}{theoremstyle empty added (WM)} +%\end{macro} +% +% For instance, |break| is commented: +% +% |\newtheoremstyle{break}| results in +% \begin{quote} +% |\gdef\th@break{%| \\ +% | \def\@begintheorem##1##2{%| \\ +% | \item[\hskip\labelsep \theorem@headerfont| \\ +% | ##1\ ##2\theorem@separator]%| \\ +% | \hfill\penalty-8000}%| \\ +% | \def\@opargbegintheorem##1##2##3{%| \\ +% | \item[\hskip\labelsep \theorem@headerfont| \\ +% | ##1\ ##2\ (##3)\theorem@separator]%| \\ +% | \hfill\penalty-8000}}| +% \end{quote} +% +% Then, calling |\th@break| sets |\@begintheorem| as follows: \\ +% Since each theorem environment is basically a trivlist, +% the header is set as the item contents: |\theorem@headerfont| +% holds the font commands for the header font, |##1| is the +% keyword to be displayed, and |##2| its environment number. +% The linebreak after the header is achieved by offering to fill the +% line with space and the distinct wish to put a linebreak after it. +% Thus, if plain text follows, the line break is executed, but if +% a list or a display follows, it is not executed. +% +% Note: The |\hfill\penalty-8000| causes \TeX\ to leave vertical mode, +% setting the item contents (ie the header) and entering horizontal mode +% to perform the |\hfill|. +% +% \begin{macro}{\theoremstyle} +% The handling of |\theoremstyle|, |\theorembodyfont|, and +% |\theoremskipamounts| is taken from theorem.sty by Frank Mittelbach: +% \changes{v0.80}{1997/02/11}{`theoremseparator' added (WM)} +% \changes{v1.20}{2002/12/30}{`theoremprework' and `theorempostwork' +% added (WM)} +% \begin{macrocode} +\gdef\theoremstyle#1{% + \@ifundefined{th@#1}{\@warning + {Unknown theoremstyle `#1'. Using `plain'}% + \theorem@style{plain}}% + {\theorem@style{#1}}} +\newtoks\theorem@style +\newtoks\theorem@@style +\global\theorem@style{plain} +% \end{macrocode}\end{macro} +% +% If |\theoremstyle| is called, it is checked if the argument +% is a valid |theoremstyle|, and if so, it is stored in the token +% |\theorem@style|. It is initialized to |plain|. +% +% \begin{macro}{\theorembodyfont} +% \begin{macrocode} +\newtoks\theorembodyfont +\global\theorembodyfont{\itshape} +% \end{macrocode}\end{macro} +% +% \begin{macro}{\theoremnumbering} +% \begin{macrocode} +\newtoks\theoremnumbering +\global\theoremnumbering{arabic} +% \end{macrocode}\end{macro} +% +% \begin{macro}{theoremskips} +% \changes{v0.94}{1997/03/20}{'theorem...skip' fixed (WM)} +% \changes{v1.32}{2011/02/28}{implemented new skip scheme (WM)} +% \begin{macrocode} +\newskip\theorempreskipamount +\newskip\theorempostskipamount +\newskip\theoremframepreskipamount +\newskip\theoremframepostskipamount +\newskip\theoreminframepreskipamount +\newskip\theoreminframepostskipamount +\global\theorempreskipamount\topsep +\global\theorempostskipamount\topsep +\global\theoremframepreskipamount\topsep +\global\theoremframepostskipamount\topsep +\global\theoreminframepreskipamount\topsep +\global\theoreminframepostskipamount\topsep +% \end{macrocode} +% \changes{v1.32}{2011/02/28}{implemented new skip scheme (WM)} +% \Codelabel{thmskips} +% \begin{macrocode} +\newif\ifuse@newframeskips\global\use@newframeskipsfalse +\newtoks\theorem@preskip +\global\theorem@preskip{\topsep} +\def\theorempreskip#1{% + \theorem@preskip{#1}\global\use@newframeskipstrue} +\newtoks\theorem@postskip +\global\theorem@postskip{\topsep} +\def\theorempostskip#1{% + \theorem@postskip{#1}\global\use@newframeskipstrue} +\newtoks\theorem@framepreskip +\global\theorem@framepreskip{\topsep} +\def\theoremframepreskip#1{% + \theorem@framepreskip{#1}\global\use@newframeskipstrue} +\newtoks\theorem@framepostskip +\global\theorem@framepostskip{\topsep} +\def\theoremframepostskip#1{% + \theorem@framepostskip{#1}\global\use@newframeskipstrue} +\newtoks\theorem@inframepreskip +\global\theorem@inframepreskip{\topsep} +\def\theoreminframepreskip#1{% + \theorem@inframepreskip{#1}\global\use@newframeskipstrue} +\newtoks\theorem@inframepostskip +\global\theorem@inframepostskip{\topsep} +\def\theoreminframepostskip#1{% + \theorem@inframepostskip{#1}\global\use@newframeskipstrue} +% \end{macrocode} +% \end{macro} +% \begin{packeddescr} +% \item[Line \Coderef{thmskips}{1}:] +% switch whether new skip scheme is used (default for compatibility, +% with old versions: no) +% \item[Line \Coderef{thmskips}{2}, \Coderef{thmskips}{3}:] +% define and initialize internal token (not a skip, just a token), +% \item[Line \Coderef{thmskips}{4}, \Coderef{thmskips}{5}:] +% define command to assign argument to token, and activate use +% of new skip scheme, +% \item[Line \Coderef{thmskips}{6}--\Coderef{thmskips}{25}:] +% analogously for the other skips. +% \end{packeddescr} + +% The new theoremskip scheme is automatically activated if one +% of the above commands is invoked (for that, they are not directly +% implemented as |\newtoks|, but as complex commands). +% +% \begin{macro}{\theoremindent} +% \begin{macrocode} +\newdimen\theoremindent +\global\theoremindent0cm +\newdimen\theorem@indent +\newdimen\theoremrightindent +\global\theoremrightindent0cm +\newdimen\theorem@rightindent +% \end{macrocode}\end{macro} +% +% \begin{macro}{\theoremheaderfont} +% \begin{macrocode} +\newtoks\theoremheaderfont +\global\theoremheaderfont{\normalfont\bfseries} +\def\theorem@headerfont{\normalfont\bfseries} +% \end{macrocode}\end{macro} +% +% \begin{macro}{\theoremseparator} +% \begin{macrocode} +\newtoks\theoremseparator +\global\theoremseparator{} +\def\theorem@separator{} +% \end{macrocode}\end{macro} +% +% \begin{macro}{\theoremprework} +% \begin{macro}{\theorempostwork} +% \begin{macrocode} +\newtoks\theoremprework +\global\theoremprework{\relax} +\newtoks\theorempostwork +\global\theorempostwork{\relax} +\def\theorem@prework{} +% \end{macrocode}\end{macro} +% \end{macro} +% +% \begin{macro}{\theoremsymbol} +% \begin{macrocode} +\newtoks\theoremsymbol +\global\theoremsymbol{} +% \end{macrocode}\end{macro} +% +% \begin{macro}{\qedsymbol} +% \begin{macrocode} +\newtoks\qedsymbol +\global\qedsymbol{} +% \end{macrocode}\end{macro} +% +% \begin{macro}{\theoremkeyword} +% \begin{macrocode} +\newtoks\theoremkeyword +\global\theoremkeyword{None} +% \end{macrocode}\end{macro} +% +% \begin{macro}{\theoremclass} +% \changes{v1.16}{1999/08/07}{introduced 'theoremclass' and +% defined 'th@class@LaTeX' (WM)} +% \changes{v1.32}{2011/02/28}{adapted to new skip scheme (WM)} +% \begin{macrocode} +\gdef\theoremclass#1{% + \csname th@class@#1\endcsname} +\gdef\th@class@LaTeX{% + \theoremstyle{plain}% + \theoremheaderfont{\normalfont\bfseries}% + \theorembodyfont{\itshape}% + \theoremseparator{}% + \theoremprework{\relax}% + \theorempostwork{\relax}% + \ifuse@newframeskips + \theorempreskip{0cm}% + \theorempostskip{0cm}% + \theoremframepreskip{0cm}% + \theoremframepostskip{0cm}% + \theoreminframepreskip{0cm}% + \theoreminframepostskip{0cm}% + \fi + \theoremindent0cm + \theoremrightindent0cm + \theoremnumbering{arabic}% + \theoremsymbol{}} +% \end{macrocode}\end{macro} +% Calling |\theoremclass{|\env|}| calls |\th@class@|\env\ (which is +% defined in |\@newtheorem| in Lines +% \Coderef{atnewthm}{31}--\Coderef{atnewthm}{45}). +% |\th@class@|\env\ restores all style parameters to their values +% given for \env. +% Especially, |\th@class@LaTeX| restores the standard LaTeX parameters. +% +% \begin{macro}{\qedsymbol} +% \begin{macrocode} +\newtoks\qedsymbol +\global\qedsymbol{} +% \end{macrocode}\end{macro} +% +% \paragraph{Compatibility with amsthm.} +% +% \begin{macro}{amsthm} +% \changes{v1.02}{1997/05/31}{proof-environment fixed (WM)} +% \begin{macrocode} +\DeclareOption{amsthm}{% ********************************************* + \PackageInfo{\basename}{Option `amsthm' loaded}% +\def\swapnumbers{\PackageError{\basename}{swapnumbers not implemented. + Use theoremstyle change instead.}\@eha} + +\gdef\th@plain{% + \def\theorem@headerfont{\normalfont\bfseries}\itshape% + \def\@begintheorem##1##2{% + \item[\hskip\labelsep \theorem@headerfont ##1\ ##2.]}% + \def\@opargbegintheorem##1##2##3{% + \item[\hskip\labelsep \theorem@headerfont ##1\ ##2\ (##3).]}} +\gdef\th@nonumberplain{% + \def\theorem@headerfont{\normalfont\bfseries}\itshape% + \def\@begintheorem##1##2{% + \item[\hskip\labelsep \theorem@headerfont ##1.]}% + \def\@opargbegintheorem##1##2##3{% + \item[\hskip\labelsep \theorem@headerfont ##1\ (##3).]}} +\gdef\th@definition{% + \th@plain\def\theorem@headerfont{\normalfont\bfseries}\normalfont} +\gdef\th@nonumberdefinition{% + \th@nonumberplain\def\theorem@headerfont{\normalfont\bfseries}\normalfont} +\gdef\th@remark{% + \th@plain\def\theorem@headerfont{\itshape}\normalfont} +\gdef\th@nonumberremark{% + \th@nonumberplain\def\theorem@headerfont{\itshape}\normalfont} +%%% TODO skips initialisieren +\newcounter{proof}% +\if@thmmarks + \newcounter{currproofctr}% + \newcounter{endproofctr}% +\fi +\newcommand{\openbox}{\leavevmode + \hbox to.77778em{% + \hfil\vrule + \vbox to.675em{\hrule width.6em\vfil\hrule}% + \vrule\hfil}} +\gdef\proofSymbol{\openbox} +\newcommand{\proofname}{Proof} +\newenvironment{proof}[1][\proofname]{ + \th@nonumberplain + \def\theorem@headerfont{\itshape}% + \normalfont + \theoremsymbol{\ensuremath{_\blacksquare}} + \@thm{proof}{proof}{#1}}% + {\@endtheorem} +}% end of option amsthm ********************************************** +% \end{macrocode} +% \end{macro} +% +% Defines theorem styles |plain|, |definition|, and +% |remark|, and environment |proof| according to +% |amsthm.sty|. +% +% \subsubsection{Theorem-Environment Handling Stuff} +% Original: ltthm.dtx +% +% \begin{macrocode} +\newskip\thm@topsep +\newskip\thm@topsepadd +% \end{macrocode} +% +% Two auxiliary variables. +% +% \paragraph{Defining New Theorem-Environments.} +% +% \begin{macro}{\newtheorem} +% \changes{v1.18}{1999/12/23}{debugged starred version of 'newtheorem' (WM)} +% \changes{v1.23}{2004/06/13}{moved normal 'newtheorem' into 'newtheorem@i' (WM)} +% \changes{v1.23}{2004/06/13}{normal 'newtheorem': reset theoremprework and +% theorempostwork, then call 'newtheorem@i' (WM, reported by Christoph Kluss)} +% \changes{v1.24}{2004/09/20}{debugged: reset after call, moved downwards (WM)} +% \begin{macrocode} +\gdef\newtheorem{% + \newtheorem@i% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\newtheorem@i} +% \changes{v1.23}{2004/06/13}{moved normal 'newtheorem' into 'ntheorem@i' (WM)} +% The syntax of the original |\newtheorem| is retained. The macro is extended +% to deal with the additional requirements: +% \begin{macrocode} +\gdef\newtheorem@i{% + \@ifstar + {\expandafter\@ifundefined{th@nonumber\the\theorem@style}% + {\PackageError{\basename}{Theorem style {nonumber\the\theorem@style} + undefined (you need it here for newtheorem*) }\@ehc}% + {}% + \edef\@tempa{{nonumber\the\theorem@style}}% + \expandafter\theorem@@style\@tempa\@newtheorem}% + {\edef\@tempa{{\the\theorem@style}}% + \expandafter\theorem@@style\@tempa\@newtheorem}} +% \end{macrocode} +% \end{macro} +% +% Defines |\theorem@@style| to be the current |\theoremstyle| +% or -- in case of |\newtheorem*| -- to be its non-numbered +% equivalent (which has to be defined!), and then calls |\@newtheorem|. + +% \begin{macro}{\renewtheorem} +% \changes{v0.93}{1997/03/12}{introduced 'renewtheorem' (WM)} +% \changes{v1.18}{1999/12/23}{debugged starred version of 'renewtheorem' (WM)} +% \Codelabel{renewthm} +% \begin{macrocode} +\gdef\renewtheorem{% + \@ifstar + {\expandafter\@ifundefined{th@nonumber\the\theorem@style}% + {\PackageError{\basename}{Theorem style {nonumber\the\theorem@style} + undefined (you need it here for newtheorem*) }\@ehc}% + {}% + \edef\@tempa{{nonumber\the\theorem@style}}% + \expandafter\theorem@@style\@tempa\@renewtheorem}% + {\edef\@tempa{{\the\theorem@style}}% + \expandafter\theorem@@style\@tempa\@renewtheorem}} +% \end{macrocode} +% Analogous to |\newtheorem|. +% \end{macro} +% +% \begin{macro}{\@newtheorem} +% |\@newtheorem| does the main job for initializing a new theorem +% environment type. It is called by |\newtheorem|. +% +% \Codelabel{atnewthm} +% \changes{v0.83}{1997/02/13}{fixed, for bold math in headers (AS)} +% \changes{v0.93}{1997/03/12}{check ifdefinable star-env. added (WM)} +% \changes{v0.93}{1997/03/12}{newcounters only if not yet defined (WM)} +% \changes{v1.02}{1997/05/31}{fixed collision at '@thm', introduced +% 'setparms' and 'mkheader' (WM)} +% \changes{v1.16}{1999/08/07}{introduced 'th@class' (WM)} +% \changes{v1.18}{1999/12/23}{'protected@xdef' for Symbol (WM)} +% \changes{v1.21}{2002/12/30}{added handling of 'theoremprework' and +% 'theorempostwork' (WM)} +% \changes{v1.24}{2004/09/20}{debugged: reset theorempre/postwork (WM)} +% \changes{v1.32}{2011/02/28}{adapted to new skip scheme (WM)} +% \begin{macrocode} +\gdef\@newtheorem#1{% + \thm@tempiffalse + \expandafter\@ifdefinable\csname #1\endcsname + {\expandafter\@ifdefinable\csname #1*\endcsname + {\thm@tempiftrue + \thm@definelthm{#1}% for lists + \if@thmmarks + \expandafter\@ifundefined{c@curr#1ctr}% + {\newcounter{curr#1ctr}}{}% + \expandafter\@ifundefined{c@end#1ctr}% + {\newcounter{end#1ctr}}{}% + \fi + \expandafter\protected@xdef\csname #1Symbol\endcsname{\the\theoremsymbol}% + \expandafter\protected@xdef\csname #1@postwork\endcsname{% + \the\theorempostwork}% + \expandafter\gdef\csname#1\endcsname{% + \let\thm@starredenv\@undefined + \csname mkheader@#1\endcsname}% + \expandafter\gdef\csname#1*\endcsname{% + \let\thm@starredenv\relax + \csname mkheader@#1\endcsname}% + \def\@tempa{\expandafter\noexpand\csname end#1\endcsname}% + \expandafter\xdef\csname end#1*\endcsname{\@tempa}% + \expandafter\xdef\csname setparms@#1\endcsname + {\noexpand \def \noexpand \theorem@headerfont + {\the\theoremheaderfont\noexpand\theorem@checkbold}% + \noexpand \def \noexpand \theorem@separator + {\the\theoremseparator}% + \noexpand \def \noexpand \theorem@prework + {\the\theoremprework}% + \noexpand\ifuse@newframeskips + \noexpand \theorempreskipamount \the\theorem@preskip + \noexpand \theoremframepreskipamount \the\theorem@framepreskip + \noexpand \theoreminframepreskipamount \the\theorem@inframepreskip + \noexpand \theorempostskipamount \the\theorem@postskip + \noexpand \theoremframepostskipamount \the\theorem@framepostskip + \noexpand \theoreminframepostskipamount \the\theorem@inframepostskip + \noexpand\fi + \noexpand \def \noexpand \theorem@indent + {\the\theoremindent}% + \noexpand \def \noexpand \theorem@rightindent + {\the\theoremrightindent}% + \the \theorembodyfont + \noexpand\csname th@\the \theorem@@style \endcsname}% + \expandafter\xdef\csname th@class@#1\endcsname + {\noexpand\theoremstyle{\the\theorem@style}% + \noexpand\theoremheaderfont{\the\theoremheaderfont}% + \noexpand\theorembodyfont{\the \theorembodyfont}% + \noexpand\theoremseparator{\the\theoremseparator}% + \noexpand\theoremprework{\the\theoremprework}% + \noexpand\theorempostwork{\the\theorempostwork}% + \noexpand\ifuse@newframeskips + \noexpand\theorempreskip {\the\theorem@preskip}% + \noexpand\theoremframepreskip {\the\theorem@framepreskip}% + \noexpand\theoreminframepreskip {\the\theorem@inframepreskip}% + \noexpand\theorempostskip {\the\theorem@postskip}% + \noexpand\theoremframepostskip {\the\theorem@framepostskip}% + \noexpand\theoreminframepostskip {\the\theorem@inframepostskip}% + \noexpand\fi + \noexpand\theoremindent\the\theoremindent% + \noexpand\theoremrightindent\the\theoremrightindent% + \noexpand\theoremnumbering{\the\theoremnumbering}% + \noexpand\theoremsymbol{\the\theoremsymbol}}% + }}% + \theoremprework{\relax}% + \theorempostwork{\relax}% + \@ifnextchar[{\@othm{#1}}{\@nthm{#1}}}% MUST NOT BE IN ANY IF !!! +% \end{macrocode} +% +% Argument: \env:=|#1| is the (internal) environment name to be defined, +% which is read from the \LaTeX\ source. +% \begin{packeddescr} +% \item[Line \Coderef{atnewthm}{3}:] +% check if \env\ is not yet defined (or is redefined). +% \item[Lines \Coderef{atnewthm}{5}--\Coderef{atnewthm}{30}] +% are executed exactly if \env\ and \env * are not yet defined. +% \item[Line \Coderef{atnewthm}{5}:] +% |\thm@tempif=true| iff \env\ and \env * are not yet defined. +% \item[Line \Coderef{atnewthm}{6}:] +% Initialize theorem list handling for \env. +% \item[Lines \Coderef{atnewthm}{7}--\Coderef{atnewthm}{12}:] +% if |thmmarks| is active and the counters are not yet defined, +% for every theorem-like, define \\ +% |curr|\env|ctr|: in the $i$th environment of type \env, +% $|curr|\env|ctr|=i$, and \\ +% |end|\env|ctr|: when the innermost environment is of +% type \env, in the $j$th potential position for an end +% mark in this environment, $|end|\env|ctr|=j$. +% (if the counters are already defined, \env\ is redefined, +% and these internal counters have to be continued). +% \item[Lines \Coderef{atnewthm}{13}--\Coderef{atnewthm}{61}:] +% define several commands: +% (|\xdef| expands the definition at the time it is called and +% makes it global): +% \item[Line \Coderef{atnewthm}{13}:] +% store the current value of |\theoremsymbol| as |\|\env|Symbol|. +% \item[Line \Coderef{atnewthm}{14}, \Coderef{atnewthm}{15}:] +% store the current value of |\theorempostwork| as |\|\env|postwork|. +% \item[Lines \Coderef{atnewthm}{16}--\Coderef{atnewthm}{18}, +% \Coderef{atnewthm}{19}--\Coderef{atnewthm}{21}:] +% Define the commands |\env| and |\env*| to set the header +% of \env\ by calling |\mkheader@|\env. +% (using a switch |\thm@starredenv|: |\relax| iff starred). +% \item[Lines \Coderef{atnewthm}{22}, \Coderef{atnewthm}{23}:] +% Set |\end|\env|*| to |\end|\env. +% \item[Lines \Coderef{atnewthm}{24}--\Coderef{atnewthm}{42}:] +% define |\setparms@|\env\ to set the style parameters of the +% header for every \env\ environment (in the sequel, +% \emph{current} means, at the moment |\@newtheorem| is called): +% \item[Lines \Coderef{atnewthm}{25}, \Coderef{atnewthm}{26}:] +% setting |\theorem@headerfont| to the \emph{current} +% value of |\theoremheaderfont|, followed by a check if +% it is a bold style, +% \item[Lines \Coderef{atnewthm}{27}, \Coderef{atnewthm}{28}:] +% setting |\theorem@separator| to the \emph{current} +% value of |\theoremseparator|, +% \item[Lines \Coderef{atnewthm}{29}, \Coderef{atnewthm}{30}:] +% setting |\theorem@prework| to the \emph{current} +% value of |\theoremprework|, +% \item[Lines \Coderef{atnewthm}{31}--\Coderef{atnewthm}{38}:] +% if new skip schema is used: setting the skips to the +% \emph{current} values hold in the respective tokens, +% \item[Line \Coderef{atnewthm}{39}, \Coderef{atnewthm}{40}:] +% setting |\theorem@indent| to the \emph{current} +% value of |\theoremindent|, +% \item[Line \Coderef{atnewthm}{41}:] +% executing the command sequence currently stored in +% |\theorembodyfont|, and +% \item[Line \Coderef{atnewthm}{42}:] +% calling |th@\the\theorem@@style| (which initializes +% |\@begintheorem| and |\@opargbegintheorem| according to the +% \emph{current} value of |\theoremstyle| by calling +% |th@\the\theorem@@style|). +% \item [Line \Coderef{atnewthm}{43}--\Coderef{atnewthm}{60}:] +% define |\th@class@|\env\ to initialize all style +% parameters as they are set for the \env\ environment. +% (call skip-initializing commands only if new skip scheme +% is activated). +% \item[Note,] that the |\@ifdefinable| from lines +% \Coderef{atnewthm}{3}/\Coderef{atnewthm}{4} +% end in line \Coderef{atnewthm}{59}. +% \item[Line \Coderef{atnewthm}{62}, \Coderef{atnewthm}{63}:] +% reset |\@theoremprework/postwork|. +% \item[Line \Coderef{atnewthm}{64}:] +% According to the next character, call |\@othm{|\env|}| +% (if another counter is used) or |\@nthm{|\env|}|. +% \end{packeddescr} +% +% Thus, when calling |\@newthm| with |#1|=\env, +% for current values |\theoremstyle=plain|, +% |\theorembodyfont=\upshape|, |\theoremheaderfont=\bf|, +% |\theoremseparator=:|, |\theoremindent=1cm|, +% |\theoremnumbering=arabic|, and |\theoremsymbol=\Box|, +% +% the macro |\setparms@|\env\ is defined as +% \begin{quote} +% |\setparms@|\env| == \def\theorem@headerfont{\bf\theorem@checkbold}| \\ +% | \def\theorem@separator{:}| \\ +% | \def\theorem@indent{1cm}| \\ +% | \upshape| \\ +% | \th@plain| +% \end{quote} +% and the macro |\th@class@|\env\ is defined as +% \begin{quote} +% |\th@class@|\env| == \def\theoremstyle{plain}|\\ +% | \def\theoremheaderfont{\bf}| \\ +% | \def\theorembodyfont{\upshape}| \\ +% | \def\theoremseparator{:}| \\ +% | \def\theoremindent{1cm}| \\ +% | \def\theoremnumbering{arabic}| \\ +% | \def\theoremsymbol{\Box}| +% \end{quote} +% Note, that line \Coderef{atnewthm}{64} must not be inside +% \emph{any} |\if...\fi| construct. +% \end{macro} +% +% \begin{macro}{\@renewtheorem} +% \changes{v0.93}{1997/03/12}{introduced 'renewtheorem' (WM)} +% \changes{v1.18}{1999/12/23}{calls '@newtheorem' instead of +% 'newtheorem' (WM)} +% \changes{v1.25}{2005/07/07}{error message: 'keyword' (WM)} +% \Codelabel{atrenewthm} +% \begin{macrocode} +\gdef\@renewtheorem#1{% + \expandafter\@ifundefined{#1}% + {\PackageError{\basename}{Theorem keyword #1 undefined}\@ehc}% + {}% + \expandafter\let\csname #1\endcsname\relax + \expandafter\let\csname #1*\endcsname\relax + \@newtheorem{#1}} +% \end{macrocode} +% Argument: \env:=|#1| is the (internal) environment name to be +% redefined, which is read from the \LaTeX\ source. \\ +% If \env\ is already defined, make it (and \env*, too) undefined +% and call |\@newtheorem{|\env|}|. +% \end{macro} +% +% \begin{macro}{\@nthm} +% \changes{v1.1}{1998/08/30}{added 'output@' to '@nthm' and '@othm'. (WM)} +% \changes{v1.18}{1999/12/25}{'protected@xdef' instead of 'xdef' (WM)} +% \changes{v1.18}{1999/12/25}{'output' changed and modified into +% 'Keyword' (WM)} +% \Codelabel{nthm} +% |\@nthm| is called by |\@newtheorem| if the environment to be defined +% has a counter of its own. +% \begin{macrocode} +\gdef\@nthm#1#2{% + \expandafter\protected@xdef\csname num@addtheoremline#1\endcsname{% + \noexpand\@num@addtheoremline{#1}{#2}}% + \expandafter\protected@xdef\csname nonum@addtheoremline#1\endcsname{% + \noexpand\@nonum@addtheoremline{#1}{#2}}% + \theoremkeyword{#2}% + \expandafter\protected@xdef\csname #1Keyword\endcsname + {\the\theoremkeyword}% + \@ifnextchar[{\@xnthm{#1}{#2}}{\@ynthm{#1}{#2}}} +% \end{macrocode} +% +% Arguments: \\ +% \env:=|#1| is the (internal) environment name to be defined +% (transmitted from |\@newtheorem|). \\ +% \meta{output\_name}:=|#2| is its keyword to be used in the +% output (read from the \LaTeX\ source). +% \begin{packeddescr} +% \item[Lines \Coderef{nthm}{2}--\Coderef{nthm}{5}:] +% Define |\|(no)|num@addtheoremline|\env\ to call \\ +% |\@|(no)|num@addtheoremline{|\env|}{|\meta{output\_name}|}|. \\ +% For comments on |\@num@addtheoremline| and +% |\@nonum@addtheoremline| see Section \ref{sec:CodeLists}. +% \item[Lines \Coderef{nthm}{6}--\Coderef{nthm}{8}:] +% Define |\|\env|Keyword|\env\ to typeset/output \meta{output\_name}. +% (note the similarity with the handling of |\theoremsymbol| +% for handling complex keywords) +% \item[Line \Coderef{nthm}{9}:] +% According to the next character, call +% |\@xnthm{|\env|}{|\meta{output\_name}|}| (if \env-environments +% should be numbered relative to some structuring level) or +% |\@ynthm{|\env|}{|\meta{output\_name}|}|. +% \end{packeddescr} +% \end{macro} +% +% \begin{macro}{\@othm} +% \changes{v1.02}{1997/05/31}{fixed collision at '@thm', introduced +% 'setparms' and 'mkheader' (WM)} +% \changes{v1.1}{1998/08/30}{added 'output@' to '@nthm' and '@othm'. (WM)} +% \changes{v1.12}{1998/11/15}{fixed a bug in '@output' (WM, reported by +% David Epstein)} +% \changes{v1.18}{1999/12/25}{'protected@xdef' instead of 'xdef' (WM)} +% \changes{v1.18}{1999/12/25}{'output' changed and modified into +% 'Keyword' (WM)} +% |\@othm| is called by |\@newtheorem| if the environment to be defined +% uses another counter. +% \Codelabel{othm} +% \begin{macrocode} +\gdef\@othm#1[#2]#3{% + \@ifundefined{c@#2}{\@nocounterr{#2}}% + {\ifthm@tempif + \global\@namedef{the#1}{\@nameuse{the#2}}% + \expandafter\protected@xdef\csname num@addtheoremline#1\endcsname{% + \noexpand\@num@addtheoremline{#1}{#3}}% + \expandafter\protected@xdef\csname nonum@addtheoremline#1\endcsname{% + \noexpand\@nonum@addtheoremline{#1}{#3}}% + \theoremkeyword{#3}% + \expandafter\protected@xdef\csname #1Keyword\endcsname + {\the\theoremkeyword}% + \expandafter\gdef\csname mkheader@#1\endcsname + {\csname setparms@#1\endcsname + \@thm{#1}{#2}{#3}}% + \global\@namedef{end#1}{\@endtheorem}\fi}} +% \end{macrocode} +% +% Arguments: \\ +% \env:=|#1| is the (internal) environment name to be defined +% (transmitted from |\@newtheorem|). \\ +% \meta{use\_ctr}:=|#2| is the internal name of the theorem which counter +% is used, and \\ +% \meta{output\_name}:=|#3| is its ``name'' to be used in the +% output (both read from the \LaTeX\ source). +% +% \begin{packeddescr} +% \item[Line \Coderef{othm}{2}:] +% if the counter to be used is undefined, goto error, else +% set |\the|\env\ to use |\the|\meta{use\_ctr} and do the following: +% \item[Lines \Coderef{othm}{4}--\Coderef{othm}{12}] +% happen only if \env\ is not yet defined or gets redefined: +% \item[Line \Coderef{othm}{4}:] (from latex.ltx) +% make \env\ use the counter \meta{use\_ctr}. +% \item[Lines \Coderef{othm}{5}--\Coderef{othm}{11}] +% similar to lines \Coderef{nthm}{2}--\Coderef{nthm}{8} +% of |\@nthm|. +% \item[Lines \Coderef{othm}{12}--\Coderef{othm}{14}] +% define |\mkheader@|\env\ to set the style parameters of the header +% and set the header (by |\@thm|): +% \begin{quote} +% |\mkheader@|\env\ == +% |\setparms@|\env|\@thm{|\env|}{|\meta{use\_ctr}|}{|\meta{output\_name}|}|. +% \end{quote} +% (|\setparms@|\env\ is defined when |\@newtheorem{|\env|}| is +% carried out). +% \item[Line \Coderef{othm}{15}:] +% (from latex.ltx): |\end|\env\ calls |\@endtheorem|. +% \end{packeddescr} +% \end{macro} +% +% \begin{macro}{\@xnthm} +% \changes{v0.93}{1997/03/12}{@definecounter only if not yet defined (WM)} +% \changes{v1.02}{1997/05/31}{fixed collision at '@thm', introduced +% 'setparms' and 'mkheader' (WM)} +% |\@xnthm| is called by |\@nthm| if the numbering is relative to some +% structuring level. +% \Codelabel{xnthm} +% \begin{macrocode} +\gdef\@xnthm#1#2[#3]{% + \ifthm@tempif + \expandafter\@ifundefined{c@#1}% + {\@definecounter{#1}}{}% + \@newctr{#1}[#3]% + \expandafter\xdef\csname the#1\endcsname{% + \expandafter\noexpand\csname the#3\endcsname \@thmcountersep + {\noexpand\csname\the\theoremnumbering\endcsname{#1}}}% + \expandafter\gdef\csname mkheader@#1\endcsname + {\csname setparms@#1\endcsname + \@thm{#1}{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}\fi} +% \end{macrocode} +% +% Arguments: \\ +% \env:=|#1| is the (internal) environment name to be defined +% (transmitted from |\@newtheorem|). \\ +% \meta{output\_name}:=|#2| is its keyword to be used in the +% output, \\ +% \meta{level}:=|#3| is the structuring level relative to which \env\ +% has to be numbered (both read from the \LaTeX\ source). +% +% \begin{packeddescr} +% \item[Lines \Coderef{xnthm}{3}--\Coderef{xnthm}{12}] +% happen only if \env\ is not yet defined or gets redefined: +% \item[Lines \Coderef{xnthm}{3}, \Coderef{xnthm}{4}:] +% in not yet defined, define \env- counter (otherwise, \env\ +% is redefined). +% \item[Line \Coderef{xnthm}{6}:] +% (from latex.ltx): define the counter for \env\ and add +% \meta{level} to its reset-triggers. +% \item[Lines \Coderef{xnthm}{7}, \Coderef{xnthm}{8}:] +% define |\the|\env\ to be the command sequence +% \begin{quote} +% |\the|\meta{level}|\@thmcountersep|\meta{numbering}|{|\env|}|~, +% \end{quote} +% where \meta{numbering} is the value of |\theoremnumbering| when +% |\@xnthm| (and thus, |\newtheorem{|\env|}|) is called. +% \item[Lines \Coderef{xnthm}{9}--\Coderef{xnthm}{11}:] +% define |\mkheader@|\env\ to set the style parameters of the header +% and set the header (by |\@thm|): +% \begin{quote} +% |\mkheader@|\env\ == +% |\setparms@|\env|\@thm{|\env|}{|\env|}{|\meta{output\_name}|}|. +% \end{quote} +% (|\setparms@|\env\ is defined when |\@newtheorem{|\env|}| is +% carried out). +% \item[Line \Coderef{xnthm}{12}:] +% (from latex.ltx): |\end|\env\ calls |\@endtheorem|. +% \end{packeddescr} +% \end{macro} +% +% \begin{macro}{\@ynthm} +% \changes{v0.93}{1997/03/12}{'@definecounter' only if not yet defined (WM)} +% \changes{v1.02}{1997/05/31}{fixed collision at '@thm', introduced +% 'setparms' and 'mkheader' (WM)} +% |\@ynthm| is called by |\@nthm| if the counter is not relative to any +% structuring level.\\ +% \Codelabel{ynthm} +% \begin{macrocode} +\gdef\@ynthm#1#2{% + \ifthm@tempif + \expandafter\@ifundefined{c@#1}% + {\@definecounter{#1}}{}% + \expandafter\xdef\csname the#1\endcsname + {\noexpand\csname\the\theoremnumbering\endcsname{#1}}% + \expandafter\gdef\csname mkheader@#1\endcsname + {\csname setparms@#1\endcsname + \@thm{#1}{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}\fi} +% \end{macrocode} +% +% Arguments: \\ +% \env:=|#1| is the (internal) environment name to be defined +% (transmitted from |\@newtheorem|). \\ +% \meta{output\_name}:=|#2| is its keyword to be used in the +% output. \\ +% |\@ynthm| works analogous to |\@xnthm|. +% \end{macro} +% +% \paragraph{Notes on vertical spacing} +% +% In \LaTeX\ and in |ntheorem|, theorems are organized as +% |\trivlist|s, using the following skips: +% +% \begin{packeddescr} +% \item[$\bullet$] |\@topsep|: above, +% \item[$\bullet$] |\@topsepadd|: below (the name is misleading). +% \end{packeddescr} +% +% In \LaTeX (cf.\ |latex.ltx| and its sources), the handling is as follows: +% +% \begin{packeddescr} +% \item[$\bullet$] |\@begintheorem|: calls |\trivlist| and afterwards |\item|. +% \item[$\bullet$] |\trivlist|: calls |\@trivlist|. +% \item[$\bullet$] |\@trivlist|: sets +% |\@topsepadd := \topsep + ifvmode: \partopsep|, \\ +% |\@topsep := \@topsepadd|, and +% |\@topsep += \parskip| -- this latter will be undone later in |\@item|! +% \item[$\bullet$] |\item|: calls |\@item|. +% \item[$\bullet$] |\@item|: does |\addvspace\@topsep| and |\addvspace{-\parskip}|. +% \item[$\Rightarrow$] only |\@topsep| must be set to \meta{value}+|\parskip| +% before the actual text is output by |\@item| +% \item[$\bullet$] |\@endtheorem|: calls |\endtrivlist|. +% \item[$\bullet$] |\endtrivlist|: note |\@noparlist| is only true if list is +% itself at the beginning of a list item -- this is (usually) not the case +% for theorems. \\ +% The |\ifdim\lastskip ...| part actually leaves skips unchanged in +% default cases (|\@outerparskip := \parskip| in |\@trivlist|). \\ +% Afterwards, it calls |\@endparenv| +% \item[$\bullet$] |\@endparenv|: does |\addvspace\@topsepadd|. +% \end{packeddescr} +% +% In |ntheorem|, |\|\env is used instead of a common |\@begintheorem| +% (defined by |\newtheorem| in Lines +% \Coderef{atnewthm}{16}--\Coderef{atnewthm}{18}, +% \Coderef{atnewthm}{19}--\Coderef{atnewthm}{21}) that +% call |\mkheader@|\env. +% The actual definition of |\mkheader@|\env\ is done in |\@othm|, +% |\@xnthm|, or |\@ynthm| as |\mkheader@|\env\ == +% |\setparms@|\env|\@thm{...}{...}{...}|. \\ +% Amongst this, |\@thm{...}{...}{...}|, whose code is given next, +% \begin{packeddescr} +% \item[$\bullet$] generates the actual output of the theorem header +% (via |\@xthm|/|\@begintheorem| or |\@ythm|/|\@opargbegintheorem|) +% where |\@begintheorem| and |\@opargbegintheorem| are redefined +% by |ntheorem|: +% \item[$\bullet$] |\@begintheorem| and |\@opargbegintheorem| +% do \emph{not} contain the |\trivlist| command, but only set the +% |\item| (internally |\@item| that adds space |\@topsep-\parskip|). +% \item[$\bullet$] the |\trivlist| command itself is contained in +% |\@thm|, recall that as described above, it is not concerned +% with skips at all. +% \item[$\Rightarrow$] |\@thm| has to set +% |\@topsep := |\meta{value}|+\parskip| for the space \emph{above} +% the theorem. +% \item[$\bullet$] |\end|\env is defined in |\@othm|, |\@xnthm|, or |\@ynthm| +% as |\@endtheorem| which is defined in Lines +% \Coderef{atendtheorem}{0} (thmmarks active) and +% \Coderef{atendtheorem-without}{0} (thmmarks off). +% \item[$\bullet$] |\@endtheorem| with thmmarks on calls +% ntheorem's |\@endtrivlist| (Line \Coderef{atendtrivlist}{0}) +% which calls |\@endparenv|. +% \item[$\bullet$] |\@endtheorem| with thmmarks off calls +% the original |\endtrivlist| which calls the original +% |\@endtrivlist| which calls |\@endparenv|. +% \item[$\Rightarrow$] |\@topsepadd| is used for the vertical space +% after the theorem as usual. +% \end{packeddescr} +% +% \paragraph{Handling Instances of Theorem-Environments.} +% +% +% \begin{macro}{\@thm} +% |\@thm| is called by |\@|\env\ (which is defined by +% |\@othm|/|\@xnthm|/|\@ynthm|). +% \changes{v1.21}{2002/12/30}{added handling of 'theoremprework' (WM)} +% \changes{v1.32}{2011/02/28}{adapted to new skip scheme (WM)} +% \Codelabel{atthm} +% \begin{macrocode} +\gdef\@thm#1#2#3{% + \if@thmmarks + \stepcounter{end\InTheoType ctr}% + \fi + \renewcommand{\InTheoType}{#1}% + \if@thmmarks + \stepcounter{curr#1ctr}% + \setcounter{end#1ctr}{0}% + \fi + \refstepcounter{#2}% + \theorem@prework + \trivlist % latex's \trivlist, calling latex's \@trivlist unchanged + \ifuse@newframeskips % cf. latex.ltx for topsepadd: \@trivlist + \ifthm@inframe + \thm@topsep\theoreminframepreskipamount + \thm@topsepadd\theoreminframepostskipamount + \else + \thm@topsep\theorempreskipamount + \thm@topsepadd\theorempostskipamount + \fi + \else% oldframeskips + \thm@topsep\theorempreskipamount + \thm@topsepadd \theorempostskipamount + \ifvmode\advance\thm@topsepadd\partopsep\fi + \fi + \@topsep\thm@topsep + \@topsepadd\thm@topsepadd + \advance\linewidth -\theorem@indent + \advance\linewidth -\theorem@rightindent + \advance\@totalleftmargin \theorem@indent + \parshape \@ne \@totalleftmargin \linewidth + \@ifnextchar[{\@ythm{#1}{#2}{#3}}{\@xthm{#1}{#2}{#3}}} +% \end{macrocode} +% \changes{v0.91}{1997/02/27}{'theorem...skip' fixed (WM)} +% +% Changed to three instead of two parameters (the first one is new): \\ +% \env:=|#1|: (added) internal name of the theorem environment, \\ +% \meta{use\_ctr}:=|#2|: internal name of the theorem which counter +% is used, \\ +% \meta{output\_name}:=|#3|: keyword to be displayed in the output; +% all arguments are transmitted from |\@othm|/|\@xnthm|/|\@ynthm|. +% \begin{packeddescr} +% \item[Lines \Coderef{atthm}{2}--\Coderef{atthm}{4}:] +% if |thmmarks| is active, the counter for the current +% environment \envx\ is incremented, since the last endmark in +% environment \envx\ is definitely not the position for its endmark +% (necessary for nested environments ending at the same time). +% \item[Line \Coderef{atthm}{5}:] +% set |\InTheoType| to \env. +% \item[Lines \Coderef{atthm}{6}--\Coderef{atthm}{9}:] +% if |thmmarks| is active, increment |curr|\env|ctr| and +% set |end|\env|ctr| to 0. +% \item[Line \Coderef{atthm}{10}:] +% adapted from latex.ltx: increment the corresponding counter. +% \item[Line \Coderef{atthm}{11}:] +% perform |prework| (before theorem structure is generated). +% \item[Line \Coderef{atthm}{12}:] +% call \LaTeX's original |\trivlist|. It does just organizational +% things, no actual skips! The skip is added later when the first +% |\item| is typeset. +% \item[Lines \Coderef{atthm}{13}--\Coderef{atthm}{25}:] +% handle |\theorempreskipamount|, |\theorempostskipamount|, \\ +% |\theoreminframepreskipamount|, and +% |\theoreminframepostskipamount| +% (old skip schema: if in |vmode|, there is additional space, +% cf.\ |\trivlist| and |\@trivlist| in latex.ltx). +% \item[Lines \Coderef{atthm}{26}--\Coderef{atthm}{27}:] +% initialize |\@topsep| (the space before the first item) and +% |\@topsepadd| (the space after the first item). (see explanation +% of spacing in the note preceding this macro.) +% \item[Lines \Coderef{atthm}{28}--\Coderef{atthm}{30}:] +% handle |\theoremindent|. +% \item[Line \Coderef{atthm}{31}:] +% if there is an optional argument, call \\ +% |\@ythm{|\env|}{|\meta{use\_ctr}|}{|\meta{output\_name}|}|, +% otherwise call \\ +% |\@xthm{|\env|}{|\meta{use\_ctr}|}{|\meta{output\_name}|}|. +% \end{packeddescr}\end{macro} +% +% \begin{macro}{\@xthm} +% |\@xthm| is called by |\@thm| if there is no optional text in +% the theorem header. +% \Codelabel{xthm} +% \begin{macrocode} +\def\@xthm#1#2#3{% + \@begintheorem{#3}{\csname the#2\endcsname}% + \ifx\thm@starredenv\@undefined + \thm@thmcaption{#1}{{#3}{\csname the#2\endcsname}{}}\fi + \ignorespaces} +% \end{macrocode} +% +% Changed to three instead of two parameters (the first one is new): \\ +% \env:=|#1|: (added) internal name of the theorem environment, \\ +% \meta{use\_ctr}:=|#2|: internal name of the theorem which counter +% is used, \\ +% \meta{output\_name}:=|#3|: keyword to be displayed in the output. \\ +% All arguments are transmitted from |\@thm|. \\ +% For comments, see |\@ythm|. +% \end{macro} +% +% \begin{macro}{\@ythm} +% \changes{v1.1}{1998/03/31}{added definition of 'env\-name' (WM)} +% |\@ythm| is called by |\@thm| if there is an optional text in +% the theorem header. +% \Codelabel{ythm} +% \begin{macrocode} +\def\@ythm#1#2#3[#4]{% + \expandafter\global\expandafter\def\csname#1name\endcsname{#4}% + \@opargbegintheorem{#3}{\csname the#2\endcsname}{#4}% + \ifx\thm@starredenv\@undefined + \thm@thmcaption{#1}{{#3}{\csname the#2\endcsname}{#4}}\fi + \ignorespaces} +% \end{macrocode} +% +% Changed to four instead of three parameters (the first one is new): \\ +% \env:=|#1|: (added) internal name of the theorem environment, \\ +% \meta{use\_ctr}:=|#2|: internal name of the theorem which counter +% is used, \\ +% \meta{output\_name}:=|#3|: keyword to be displayed in the output. \\ +% \meta{opt\_text}:=|#4|: optional text to appear in the header. \\ +% |#1|--|#3| are transmitted from |\@thm|, |#4| is read from the \LaTeX\ +% source. +% \begin{packeddescr} +% \item[Line \Coderef{ythm}{2}:] +% define |\|\meta{env}|name| to be the optional argument. +% \item[Line \Coderef{ythm}{3}:] call +% \begin{quote} +% |\@opargbegintheorem{|\meta{output\_name}|}{\the|\meta{use\_ctr}|}{|\meta{opt\_text}|}| +% \end{quote} +% which outputs the header. +% \item[Line \Coderef{ythm}{4}, \Coderef{ythm}{5}:] +% if \env\ is not the starred version, call +% \begin{quote} +% |\thm@thmcaption{|\meta{env}|}{{|\meta{output\_name}|}|\ignorespaces +% |{\the|\meta{use\_ctr}|}{|\meta{opt\_text}|}}| +% \end{quote} +% which makes an entry into the theorem list. +% \end{packeddescr} \end{macro} +% +% \begin{macro}{\@endtheorem} +% \changes{v1.21}{2002/12/30}{added changes to '@endtheorem' in case that +% [thmmarks] is not active (WM)} +% +% |\@endtheorem| is called for every |\end{|\env|}|, where \env\ is a +% theorem-like environment. +% (note that |\@endtheorem| it is also changed by option [thmmarks] +% to organize the placement of the corresponding end mark). +% |\InTheoType| gives the innermost theorem-like environment, +% i.e.\ the one to be ended: +% +% \Codelabel{atendtheorem-without} +% \begin{macrocode} +\gdef\@endtheorem{% + \endtrivlist + \csname\InTheoType @postwork\endcsname + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Framed and Boxed Theorems} +% +% The option `framed' activates framed and boxed layouts. +% It requires to load the |framed| package and the |pstricks| package. +% +% \changes{v1.21}{2002/12/30}{included option `framed' (WM)} +% \begin{macro}{framed} +% +% \begin{macrocode} +\DeclareOption{framed}{%********************************* +\newtoks\shadecolor +\shadecolor{gray} +\let\theoremframecommand\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newshadedtheorem} +% \changes{v1.30}{2010/08/15}{added `theoremframepre/postskipamount' (WM)} +% \changes{v1.32}{2011/02/23}{consider lastskip in `theoremprework' (WM)} +% \changes{v1.32}{2011/02/23}{consider lastskip in `theorempostwork' (WM)} +% \changes{v1.32}{2011/02/28}{added thm@inframe (WM)} +% \changes{v1.32}{2011/03/15}{separated `thm@framedprework' and `thm@framedpostwork' (WM)} +% \begin{macrocode} +\def\thm@framedprework{% + \ifdim\lastskip <\theoremframepreskipamount + \vskip -\lastskip + \vskip\theoremframepreskipamount + \fi + \ifuse@newframeskips\vspace{-\topsep}\fi + \thm@inframetrue + \framed}% +\def\thm@framedpostwork{% + \endframed + \ifuse@newframeskips\unskip\fi + \vskip\theoremframepostskipamount}% +% \end{macrocode} +% \end{macro} +% +% Note: since |framed.sty| adds |\topsep| before and after a frame, +% |\vspace{-\topsep}| and |\unskip| are used to remove it. For compatibility +% with previous versions, this is only done if the new skip schema is used. +% +% \begin{macro}{\newshadedtheorem} +% \changes{v1.21}{2002/12/30}{added (WM)} +% \changes{v1.32}{2011/03/15}{use `thm@framedprework' and `thm@framedpostwork' (WM)} +% \changes{v1.33}{2011/08/15}{have user-defines `thm@pre/postwork' and shading/framing +% together (cf.\ `newshadedtheorem') (WM)} +% \begin{macrocode} +\def\newshadedtheorem#1{% + \expandafter\xdef\csname#1@shadecolor\endcsname{% + \the\shadecolor}% + \ifx\theoremframecommand\relax + \expandafter\global\expandafter\xdef\csname#1@framecommand\endcsname{% + \noexpand\psframebox[fillstyle=solid, + fillcolor=\csname#1@shadecolor\endcsname, + linecolor=\csname#1@shadecolor\endcsname]}% + \else + \expandafter\global\expandafter\let\csname#1@framecommand\endcsname% + \theoremframecommand% + \fi + \expandafter\xdef\csname#1@@prework\endcsname{% + \the\theoremprework}% + \theoremprework{% + \csname#1@@prework\endcsname + \def\FrameCommand{\csname#1@framecommand\endcsname}% + \thm@framedprework}% + \expandafter\xdef\csname#1@@postwork\endcsname{% + \the\theorempostwork}% + \theorempostwork{% + \thm@framedpostwork + \csname#1@@postwork\endcsname}% + \newtheorem@i{#1}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newframedtheorem} +% \changes{v1.32}{2011/03/15}{use `thm@framedprework' and `thm@framedpostwork', +% cf.\ `newshadedtheorem' (WM)} +% \changes{v1.33}{2011/08/15}{have user-defined `thm@pre/postwork' and shading/framing +% together (cf.\ `newshadedtheorem') (WM)} +% \begin{macrocode} +\def\newframedtheorem#1{% + \expandafter\xdef\csname#1@@prework\endcsname{% + \the\theoremprework}% + \theoremprework{\csname#1@@prework\endcsname\thm@framedprework}% + \expandafter\xdef\csname#1@@postwork\endcsname{% + \the\theorempostwork}% + \theorempostwork{\thm@framedpostwork\csname#1@@postwork\endcsname}% + \newtheorem@i{#1}% + } +}% end of option framed ********************************************** +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Generation of Theorem Lists}\label{sec:CodeLists} +% +% The generation of lists of theorems, definitions, etc.\ is based +% on the |.thm| file. +% +% The following macros are are needed for the generation of theorem-lists. +% We will document it for the theorem +% |\begin{definition}[optional]|, which we assume to be the first +% definition at all and which is placed on page 5. +% +% \begin{macro}{\thm@thmcaption} +% This macro, used internally, strips of the outer brackets +% from the second argument and calls |\thm@@thmcaption|. +% It's typically called like this +% \begin{quote} +% |\thm@thmcaption{definition}{{Definition}{1}{optional}}| +% \end{quote} +% (internal name of the environment, output keyword, running number, +% optional text) +% \begin{macrocode} +\def\thm@thmcaption#1#2{\thm@@thmcaption{#1}#2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thm@@thmcaption} +% \changes{v1.18}{1999/12/25}{'thm@parseforwriting' also for \#2 (WM)} +% |\thm@caption| is called from |\thm@caption|; it writes an +% appropriate entry to the |.thm|-file. +% \Codelabel{thmcaption} +% \begin{macrocode} +\def\thm@@thmcaption#1#2#3#4{% + \thm@parseforwriting{#2}% + \let\thm@tmpii\thm@tmp + \thm@parseforwriting{#4}% + \edef\thm@t{{\thm@tmpii}{#3}{\thm@tmp}}% + \addcontentsline{thm}{#1}{\thm@t}} +% \end{macrocode} +% +% Arguments: +% \env:=|#1| is the internal environment name, +% \meta{output\_name}:=|#2| is its keyword to be used in the +% output, |#3| is the running number, and |#4| is the optional +% text argument in the header. +% +% \begin{packeddescr} +% \item[Lines \Coderef{thmcaption}{1}, \Coderef{thmcaption}{2}:] +% the command sequence for the output keyword is prepared by +% |\thm@parseforwriting| (which returns |\thm@tmpii|) and then +% stored in |\thm@tmpii|. +% \item[Line \Coderef{thmcaption}{3}:] +% the optional text is also prepared by |\thm@parseforwriting| +% \item[Lines \Coderef{thmcaption}{4}, \Coderef{thmcaption}{5}:] +% The output is collected and written into the |.aux| file, +% which will forward it to the theorem-file. +% \end{packeddescr} +% \end{macro} +% +% The following two macros are just shortcuts, often needed +% for the output of one single line in the theorem-lists. The +% first one is used in unnamed lists, the second one in named. +% Warning: Don't remove the leading |\let|, since you will get +% wrong |\if|-|\fi|-nesting without it, if you don't use +% |hyperref|. +% \begin{macro}{\thm@@thmline@noname} +% \changes{v1.17}{1999/09/06}{intruduced shortcuts for single lines in lists (AS)} +% \changes{v1.17}{1999/09/07}{hyperref adjustment (AS)} +% \begin{macrocode} +\def\thm@@thmline@noname#1#2#3#4{% + \@dottedtocline{-2}{0em}{2.3em}% + {\protect\numberline{#2}#3}% + {#4}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thm@@thmline@name} +% \begin{macrocode} +\def\thm@@thmline@name#1#2#3#4{% + \@dottedtocline{-2}{0em}{2.3em}% + {#1 \protect\numberline{#2}#3}% + {#4}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thm@thmline} +% This is another short one, which only discards the outer brackets +% from the first argument and calls |\thm@@thmline|. It's normally +% called like this: +% \begin{quote} +% |\thm@@thmline{{Definition}{1}{optional}}{5}| +% \end{quote} +% \begin{macrocode} +\def\thm@thmline#1#2{\thm@@thmline#1{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thm@lgobble} +% \changes{v1.31}{2011/02/14}{split 'thm@lgobble' into 'thm@lgobble@entry' +% and 'thm@lgobble@freetext' (WM)} +% The following macros are used to ignore entries for theorem sets, that +% should not occur in a given list: +% \begin{macrocode} +\long\def\thm@lgobble@entry#1#2{\ignorespaces} +\long\def\thm@lgobble@freetext#1#2{\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% The following four macros set up the predefined list-types. To do so, +% they define the internal macros |\thm@@thmlstart| (containing the code +% to be executed at the beginning of the list), |\thm@@thmlend| (code +% to be executed at the end of the list) and |\thm@@thmline| (code to +% be executed for every line). In order to gain compatibility with +% |newthm.sty|, we decided not to make this commands inaccessible +% to the user. But we recommend not using these commands, because they may +% disappear in later distributions. +% +% \begin{macro}{\theoremlistall} +% This one implements the type |all|. +% \begin{macrocode} +\def\theoremlistall{% + \let\thm@@thmlstart=\relax + \let\thm@@thmlend=\relax + \let\thm@@thmline=\thm@@thmline@noname} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\theoremlistallname} +% And here's the type |allname|. +% \begin{macrocode} +\def\theoremlistallname{% + \let\thm@@thmlstart=\relax + \let\thm@@thmlend=\relax + \let\thm@@thmline=\thm@@thmline@name} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\theoremlistoptional} +% This one is the list-type |opt|. In case of |[hyperref]|, the fifth +% argument, which is provided by |hyperref.sty| is automatically +% given to |\thm@@thmline@noname|. +% \begin{macrocode} +\def\theoremlistoptional{% + \let\thm@@thmlstart=\relax + \let\thm@@thmlend=\relax + \def\thm@@thmline##1##2##3##4{% + \ifx\empty ##3% + \else + \thm@@thmline@noname{##1}{##2}{##3}{##4}% + \fi}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\theoremlistoptname} +% And the last type, |optname|. In case of |[hyperref]|, the fifth +% argument, which is provided by |hyperref.sty| is automatically +% given to |\thm@@thmline@name|. +% \begin{macrocode} +\def\theoremlistoptname{% + \let\thm@@thmlstart=\relax + \let\thm@@thmlend=\relax + \def\thm@@thmline##1##2##3##4{% + \ifx\empty ##3% + \else% + \thm@@thmline@name{##1}{##2}{##3}{##4}% + \fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\theoremlisttype} +% \changes{v0.92}{1997/03/03}{added error-handling (AS)} +% The next one is the user-interface for selecting the list-type. It simply +% calls |\thm@thml@|\meta{type}, if the given \meta{type} is defined. +% \begin{macrocode} +\def\theoremlisttype#1{% + \@ifundefined{thm@thml@#1}% + {\PackageError{\basename}{Listtype #1 not defined}\@eha}% + {\csname thm@thml@#1\endcsname}} +% \end{macrocode} +% \end{macro} +% Now, here is the code, which maps the types -- selected by +% |\theoremlisttype| -- to the defined macros. +% \begin{macrocode} +\def\thm@thml@all{\theoremlistall} +\def\thm@thml@opt{\theoremlistoptional} +\def\thm@thml@optname{\theoremlistoptname} +\def\thm@thml@allname{\theoremlistallname} +% \end{macrocode} +% +% \begin{macro}{\newtheoremlisttype} +% \changes{v0.86}{1997/02/15}{added (AS)} +% \changes{v0.92}{1997/03/03}{added error-handling (AS)} +% According to the given documentation, this one can be used to define +% new list-types. It's done by defininig the macro +% |\thm@thml@|\meta{type}, which \emph{locally} redefines +% the commands |\thm@thmlstart|, |\thm@@thmline| and |\thm@@thmlend|. +% \begin{macrocode} +\def\newtheoremlisttype#1#2#3#4{% + \@ifundefined{thm@thml@#1}% + {\expandafter\gdef\csname thm@thml@#1\endcsname{% + \def\thm@@thmlstart{#2}% + \def\thm@@thmline####1####2####3####4{#3}% + \def\thm@@thmlend{#4}}% + }{\PackageError{\basename}{list type #1 already defined}\@eha}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\renewtheoremlisttype} +% \changes{v0.93}{1997/03/12}{introduced newtheoremlisttype (WM)} +% \begin{macrocode} +\def\renewtheoremlisttype#1#2#3#4{% + \@ifundefined{thm@thml@#1}% + {\PackageError{\basename}{List type #1 not defined}\@ehc}{}% + \expandafter\let\csname thm@thml@#1\endcsname\relax + \newtheoremlisttype{#1}{#2}{#3}{#4}} +% \end{macrocode} +% if the list type to be redefined is already defined, make it undefined +% and define it. +% \end{macro} +% +% +% \begin{macro}{\thm@definelthm} +% For each theorem-set, we need to initialize two commands: +% \begin{itemize} +% \item how to typeset entries in the list, |\l@|\meta{theorem-set}. +% it is called for each theorem when the list is generated. +% \item how to typeset additional text in the list, +% |\thm@listdo|\meta{theorem-set}. It is called, when something is +% to a list with |\addtotheoremfile|. +% \end{itemize} +% These macros are initially defined by |\newtheorem| to +% discard the input by calling |\thm@lgobble@entry| (for actual +% entries) and |\thm@lgobble@freetext| (for free text added by the user). +% These macros must be adapted if a package uses another format for +% |\contentsline| entries in the |.aux| file (e.g., |hyperref|). +% \begin{macrocode} +\def\thm@definelthm#1{% + \expandafter\gdef\csname l@#1\endcsname{\thm@lgobble@entry}% + \expandafter\gdef\csname thm@listdo#1\endcsname{\thm@lgobble@freetext}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thm@inlistdo} +% When additional text is added to a theorem list via |\addtotheoremfile|, +% this is typeset by the following is macro. It simply discards +% the first argument and strips of the outer brackets from the second one. +% \begin{macrocode} +\long\def\thm@inlistdo#1#2{#2}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\listtheorems} +% \changes{v0.89}{1997/02/18}{fixed a bug for lists (AS)} +% \changes{v0.92}{1997/03/02}{made commands global in order to handle +% tabular-lists (AS)} +% The following macro provides the user interface: +% \Codelabel{listtheorems} +% \begin{macrocode} +\def\listtheorems#1{\begingroup + \c@tocdepth=-2% + \def\thm@list{#1}\thm@processlist + \endgroup} +% \end{macrocode} +% +% \begin{packeddescr} +% \item[Line \Coderef{listtheorems}{1}:] +% |#1| is a list of theorem sets, i.e., of the form |Theorem| or +% |Theorem, Definition, ...|. +% \item[Line \Coderef{listtheorems}{2}:] set |tocdepth| to $-2$ to assure +% that the predefined list-types work. +% \item[Line \Coderef{listtheorems}{3}:] store the list of names in |thm@list| +% and call |\thm@processlist|, which actually generates the list. +% \end{packeddescr} +% \end{macro} +% \begin{macro}{\thm@processlist} +% +% \changes{v1.17}{1999/09/06}{Switch to normal contentsline-behaviour for +% lists (hyperref) (AS)} +% \changes{v1.19}{2001/01/13}{check for yet undefined theoremsets (WM)} +% The file \meta{jobname}|.thm| contains commands of the form \\ +% \hspace*{0.5cm} +% |\contentsline{|\meta{list-of-theoremsets}|}{{|\meta{header}|}{|\meta{number}|}}{|\meta{page}|}|.\\ +% Thus, dependent on which theoremsets should be listed, +% |\contentsline| must be defined to evaluate the first argument and then +% to output all arguments, or to discard the second and third one. +% +% This is done as follows: +% The commands |\l@|\meta{theorem-set} and |\thm@listdo|\meta{theorem-set} +% (which initially were set to ignore everything by |\newtheorem|) +% are redefined for the theorem sets which should be listed to +% generate output. +% |\contentsline| is defined to call |\l@|\meta{theorem-set}, adding a +% line to the list or ignoring the entry. +% Since for theorem sets which are not yet known (i.e., if the list +% is created at the beginning of the document, and the theoremset is +% only defined later), |\l@|\meta{theorem-set} is not yet defined, +% |\contentsline| has to check if the command is defined, otherwise +% ignore the arguments. +% +% Then, the |.thm| file is processed, evaluating the |\contentsline| +% commands. +% After processing the |.thm| file, the mentioned commands are +% again redefined to discard everything. We need to define the macros +% globally for dealing with complex, user-defined, list-types. +% +% \changes{v1.31}{2011/02/14}{split 'thm@lgobble' into 'thm@lgobble@entry' +% and 'thm@lgobble@freetext' (WM, reported by Barbara Santa)} +% \begin{macrocode} +\def\thm@processlist{% + \begingroup + \typeout{** Generating table of \thm@list}% + \def\contentsline##1{% + \expandafter\@ifundefined{l@##1}% + {\thm@lgobble@entry}{\csname l@##1\endcsname}}% + \thm@@thmlstart + \@for\thm@currentlist:=\thm@list + \do{% + \ifx\thm@currentlist\@empty\else + \expandafter\gdef\csname l@\thm@currentlist\endcsname{\thm@thmline}% + \expandafter\gdef\csname thm@listdo\thm@currentlist\endcsname{\thm@inlistdo}% + \fi + }% + \@input{\jobname .thm}% + \thm@@thmlend + \@for\thm@currentlist:=\thm@list + \do{% + \ifx\thm@currentlist\@empty\else + \expandafter\gdef\csname l@\thm@currentlist\endcsname + {\thm@lgobble@entry}% + \expandafter\gdef\csname thm@listdo\thm@currentlist\endcsname + {\thm@lgobble@freetext}% + \fi + }% + \endgroup} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thm@enablelistoftheorems} +% \changes{v0.92}{1997/03/02}{renamed (AS)} +% Up to now, we've set up various macros for writing and reading the +% theorem-file. +% Thus, it's time to set up the file itself. This is done by the next macro. +% We simply took the lines for |\@starttoc| from the \LaTeX-base and +% changed some things. The main intention to copy |\@starttoc| is that +% we don't want the file to be input when it is set up -- like it's done +% by |\@starttoc|. +% \begin{macrocode} +\def\thm@enablelistoftheorems{% + \begingroup + \makeatletter + \if@filesw + \expandafter\newwrite\csname tf@thm\endcsname% + \immediate\openout \csname tf@thm\endcsname \jobname.thm\relax% + \fi + \@nobreakfalse + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addtheoremline} +% \changes{v0.89}{1997/02/18}{added (AS)} +% By |\addtheoremline{|\meta{theorem-set}|}{|\meta{entry}|}|, +% the user can insert an extra entry into the theorem-file. +% |\addtheoremline*| calls the internal macro +% |\nonum@addtheoremline|, otherwise |\num@addtheoremline| is called. +% |\num/nonum@addtheoremline{|\meta{theorem-set}|}{|\meta{entry}|}| +% calls +% |\num/nonum@addtheoremline|\meta{theorem-set}|{|\meta{entry}|}| +% which are +% defined when \meta{theorem-set} is declared (cf.\ |\@nthm|). +% These in turn call |\@num/nonum@addtheoremline{|\meta{theorem-set}% +% |}{|\meta{keyword}|}{|\meta{entry}|}| +% which write information to the theorem file. +% +% \begin{macrocode} +\def\addtheoremline{\@ifstar{\nonum@addtheoremline}{\num@addtheoremline}} +\def\nonum@addtheoremline#1{\csname nonum@addtheoremline#1\endcsname}% +\def\num@addtheoremline#1{\csname num@addtheoremline#1\endcsname}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nonum@addtheoremline} +% |\@num@addtheoremline| and |\@nonum@addtheoremline| write the +% actual entries to the |.thm| file. \\ +% Syntax: |\@num/nonum@addtheoremline{|% +% \meta{theorem-set}|}{|\meta{keyword}|}{|\meta{entry}|}| +% \begin{macrocode} +\def\@nonum@addtheoremline#1#2#3{% + \thm@parseforwriting{#3}% + \edef\thm@t{{#2}{}{\thm@tmp}}% + \addcontentsline{thm}{#1}{\thm@t}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@num@addtheoremline} +% \begin{macrocode} +\def\@num@addtheoremline#1#2#3{% + \thm@parseforwriting{#3}% + \edef\thm@t{{#2}{\csname the#1\endcsname}{\thm@tmp}}% + \addcontentsline{thm}{#1}{\thm@t}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addtotheoremfile} +% \changes{v0.89}{1997/02/18}{added (AS)} +% To write any additional stuff into the theorem-file, the next macro +% is used. It first checks, if the optional name of a theorem-set is given. +% In that case, the macro |\@@addtotheoremfile|, otherwise +% |\@addtotheoremfile| is used to write the stuff into the file. +% \begin{macrocode} +\long\def\addtotheoremfile{% + \@ifnextchar[{\@@addtotheoremfile}{\@addtotheoremfile}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@addtotheoremfile} +% Write additional stuff for all theorems. +% \begin{macrocode} +\long\def\@addtotheoremfile#1{% + \thm@parseforwriting{#1}% + \protected@write\@auxout% + {}{\string\@writefile{thm}{\thm@tmp}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@addtotheoremfile} +% Write additional stuff for a given theorem-set. +% \begin{macrocode} +\long\def\@@addtotheoremfile[#1]#2{% + \thm@parseforwriting{#2}% + \protected@write\@auxout% + {}{\string\@writefile{thm}{\string\theoremlistdo{#1}{\thm@tmp}}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\theoremlistdo} +% \changes{v1.19}{2001/01/13}{check for yet undefined theoremsets (WM)} +% This one is called from the theorem-file to insert the additional +% stuff for a theorem-set. +% \begin{macrocode} +\long\def\theoremlistdo#1#2{\expandafter\@ifundefined{thm@listdo#1}% + \relax{\csname thm@listdo#1\endcsname{#1}{#2}}} +% \end{macrocode} +% \end{macro} +% +% Now we assure, that the theorem-file is activated. This is done by +% inserting a hook at the end of the document. +% \changes{v0.83}{1997/02/13}{added `AtEndDocument'-Hook for lists (AS)} +% \begin{macrocode} +\AtEndDocument{\thm@enablelistoftheorems} +% \end{macrocode} +% +% \paragraph{Theoremlists and Hyperref} +% +% Since the |hyperref|-package redefines |\contentsline|, some +% commands are redefined: +% \begin{enumerate} +% \item Let the different versions of |\thm@@thmline@..| take a 5th +% argument, the one provided by |hyperref|. +% \item handle contentsline: restore the normal +% definition at the beginning of |\thm@processlist| (see there), +% that calls |l@|\meta{theorem-set} that in turn calls the +% adapted commands for typestting the entries (see below). . +% \item Let |\thm@lgobble@entry| take one more argument, +% the one provided by hyperref. +% \item Do the hyperlinks manually in the different versions of +% |\thm@@thmline| as defined by the theoremtypes. +% \end{enumerate} +% +% \begin{macro}{hyperref} +% \changes{v1.17}{1999/09/07}{added 'hyperref' option +% (AS, based on a proposal by Didier Verna)} +% \begin{macrocode} +\DeclareOption{hyperref}{% ********************************************** + \def\thm@@thmline@noname#1#2#3#4#5{% + \ifx\\#5\\% + \@dottedtocline{-2}{0em}{2.3em}% + {\protect\numberline{#2}#3}% + {#4}% + \else + \ifHy@linktocpage\relax\relax + \@dottedtocline{-2}{0em}{2.3em}% + {\protect\numberline{#2}#3}% + {\hyper@linkstart{link}{#5}{#4}\hyper@linkend} + \else + \@dottedtocline{-2}{0em}{2.3em}% + {\hyper@linkstart{link}{#5}{\protect\numberline{#2}#3}% + \hyper@linkend}% + {#4}% + \fi + \fi}% + \def\thm@@thmline@name#1#2#3#4#5{% + \ifx\\#5\\% + \@dottedtocline{-2}{0em}{2.3em}% + {#1 \protect\numberline{#2}#3}% + {#4} + \else + \ifHy@linktocpage\relax\relax + \@dottedtocline{-2}{0em}{2.3em}% + {#1 \protect\numberline{#2}#3}% + {\hyper@linkstart{link}{#5}{#4}\hyper@linkend}% + \else + \@dottedtocline{-2}{0em}{2.3em}% + {\hyper@linkstart{link}{#5}% + {#1 \protect\numberline{#2}#3}\hyper@linkend}% + {#4}% + \fi + \fi} + \def\thm@thmline#1#2#3{\thm@@thmline#1{#2}{#3}} + \long\def\thm@lgobble@entry#1#2#3{\ignorespaces} + \def\theoremlistoptional{% + \let\thm@@thmlstart=\relax + \let\thm@@thmlend=\relax + \def\thm@@thmline##1##2##3##4##5{% + \ifx\empty ##3% + \else% + \thm@@thmline@noname{##1}{##2}{##3}{##4}{##5}% + \fi}} + \def\theoremlistoptname{% + \let\thm@@thmlstart=\relax + \let\thm@@thmlend=\relax + \def\thm@@thmline##1##2##3##4##5{% + \ifx\empty ##3% + \else% + \thm@@thmline@name{##1}{##2}{##3}{##4}{##5}% + \fi}} +% \end{macrocode} +% \changes{v1.20}{2002/01/07}{replaced ifhy by ifHy (AS, reported by J.J.Bataille)} +% \end{macro} +% +% \paragraph{Theorem References and Hyperref} +% +% \begin{macro}{hyperref-thref} +% When |hyperref| is active, the handling of |thref| described above via +% the |.aux| file redefinition of |\@newl@bel| is not possible (|hyperref| +% forces its definitions at |\AtBeginDocument|). Instead, an internal +% identifier of the form |Theorem.1.1| is used in the |.aux| file for +% the hypertarget (using the type of the counter; thus when a theorem type +% uses another counter, this does not give the theorem type itself). +% The same id is stored in the |.thm| file for +% the respective theorem. by this, given the id from the |\newlabel| in +% the |.aux| file, the |.thm| file can be searched for the actual type +% information. +% +% \changes{v1.31}{2011/02/15}{added for fixing problems (WM, reported by +% Gunner Gewiss)} +% \Codelabel{hyperthref} +% \begin{macrocode} +\if@thref +\def\@firstofthree#1#2#3{#1}% +\def\getKeywordOf#1{% + \let\thm@oldcontentsline\contentsline + \def\contentsline##1##2##3##4{% + \ifthenelse{\equal{#1}{##4}}{\@firstofthree##2}{}% + \ignorespaces}% + \@input{\jobname .thm}% + \let\contentsline\thm@oldcontentsline +} +\def\thm@fmt@hyplabel@i#1#2#3#4#5{% + \getKeywordOf{#4}~\thm@fmt@hyplabel@ii#4} +\def\thm@fmt@hyplabel@ii#1.#2{#2}% +\def\thref#1{% + \expandafter\@setref\csname r@#1\endcsname\thm@fmt@hyplabel@i{#1}}% +\fi % end of \if@thref +}% end of option hyperref ********************************************* +% \end{macrocode} +% \begin{packeddescr} +% \item[Lines \Coderef{hyperthref}{2}-\Coderef{hyperthref}{10}:] +% given an id |#1| of the form |Theorem.1.1|, scan the |.thm| file +% for a |\contentsline| whose 4th argument equals the id. If found, +% the third component of its second argument gives its theorem type. +% \item[Lines \Coderef{hyperthref}{11}-\Coderef{hyperthref}{13}:] +% this command must have 5 arguments because it is applied to +% the information stored with |\newlabel| in the |.aux| file. The +% 4th argument is the id |#4| of the form |Theorem.1.1|. \\ +% Get the correct keyword by |\getKeywordOf{#4}| and its number +% (which is the part following the first ``.''). +% \item[Lines \Coderef{hyperthref}{14}-\Coderef{hyperthref}{15}:] +% create a hyperlink via |\@setref| (see |hyperref.sty|): |\@setref| +% takes three arguments: |r@|\meta{label} := $arg_1$ is the information +% from |\newlabel| in the |.aux| file (consisting of 5 components). +% The 2nd argument $arg_2$ must be a command that uses 5 arguments, +% here |\thm@fmt@hyplabel@i{#1}| as defined in Lines +% \Coderef{hyperthref}{11}-\Coderef{hyperthref}{13}. The +% 3rd one is the label, and is only used for error messages. +% |\@setref| then --roughly-- applies $arg_2$ on $arg_1$. +% \end{packeddescr} +% \end{macro} +% +% \subsubsection{Auxiliary macros} +% +% For generating theorem-lists, we need to write information into +% a separate file. Beause we don't want to expand this information, +% we parse it specially for writing. +% \begin{macrocode} +\def\thm@meaning#1->#2\relax{#2}% remove "macro: ->" +\long\def\thm@parseforwriting#1{% + \def\thm@tmp{#1}% + \edef\thm@tmp{\expandafter\thm@meaning\meaning\thm@tmp\relax}} +% \end{macrocode} +% +% In some countries it's usual to number theorems with greek letters: +% +% \begin{macro}{\theorem@checkbold} +% \changes{v0.83}{1997/02/13}{fixed greek numbering for bold headers (AS)} +% For correctness, we need to check if a bold font is active. This +% is done by the following macro: +% \begin{macrocode} +\def\theorem@checkbold{\if b\expandafter\@car\f@series\@nil\boldmath\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@greek} +% Accoding to \LaTeX-base, this is the internal command for generating +% lowercase greek numberings. +% \begin{macrocode} +\def\@greek#1{\theorem@checkbold% + \ifcase#1\or$\alpha$\or$\beta$\or$\gamma$\or$\delta$\or$\varepsilon$% + \or$\zeta$\or$\eta$\or$\vartheta$\or$\iota$\or$\kappa$\or$\lambda$\or$% + \mu$\or$\nu$\or$\xi$\or$ o$\or$\varpi$\or$\varrho$\or$\varsigma$\or$\tau$% + \or$\upsilon$\or$\varphi$\or$\chi$\or$\psi$\or$\omega$\else\@ctrerr\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@Greek} +% According to \LaTeX-base, this is the internal command for generating +% uppercase greek numberings. +% \begin{macrocode} +\def\@Greek#1{\theorem@checkbold% + \ifcase#1\or A\or B\or$\Gamma$\or$\Delta$\or E% + \or Z\or H\or$\Theta$\or I\or K\or$\Lambda$\or M% + \or N\or$\Xi$\or O\or$\Pi$\or P\or$\Sigma$\or T% + \or$\Upsilon$\or$\Phi$\or X\or$\Psi$\or$\Omega$\else\@ctrerr\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\greek} +% According to \LaTeX-base, this is the user interface for lowercase +% greek numberings. +% \begin{macrocode} +\def\greek#1{\@greek{\csname c@#1\endcsname}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Greek} +% According to \LaTeX-base, this is the user interface for uppercase +% greek numberings. +% \begin{macrocode} +\def\Greek#1{\@Greek{\csname c@#1\endcsname}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Other Things} +% +% After declaring several package-options, we need to process the +% specified ones. The additional |\relax| was mentioned by Rainer Sch\"opf +% at DANTE'97. +% \begin{macrocode} +\ProcessOptions\relax +% \end{macrocode} +% Now we set up the default theorem listtype. Make sure this is called after +% processing the options. Otherwise, |ntheorem| will break with |hyperref|. +% \begin{macrocode} +\theoremlistall +% \end{macrocode} +% +% If automatical configuration is not disabled by |[noconfig]|, it is +% checked if the file |ntheorem.cfg| exists and in this case +% the definitions in this file are read. If it does not exist and the +% option |standard| was specified, the file |ntheorem.std| is used. +% +% \changes{v0.84}{1997/02/13}{added 'ntheorem.cfg' feature (AS)} +% \changes{v1.11}{1998/10/26}{added 'noconfig' option (AS/WM)} +% \begin{macrocode} +\ifx\thm@noconfig\@undefined +\InputIfFileExists{ntheorem.cfg}% + {\PackageInfo{\basename}{Local config file ntheorem.cfg used}}% + {\ifx\thm@usestd\@undefined% + \else% + \InputIfFileExists{ntheorem.std}% + {\PackageInfo{\basename}{Standard config file ntheorem.std used}}{} + \fi} +\fi +% \end{macrocode} +%\iffalse +%\fi +% +% \subsection{The Standard Configuration} +% +% \changes{v0.84}{1997/02/13}{moved standard-theorems to extra file (AS)} +% \setcounter{CodelineNo}{0} +%\iffalse +%<*standard>\fi +% \begin{macrocode} +\theoremnumbering{arabic} +\theoremstyle{plain} +\RequirePackage{latexsym} +\theoremsymbol{\ensuremath{_\Box}} +\theorembodyfont{\itshape} +\theoremheaderfont{\normalfont\bfseries} +\theoremseparator{} +\newtheorem{Theorem}{Theorem} +\newtheorem{theorem}{Theorem} +\newtheorem{Satz}{Satz} +\newtheorem{satz}{Satz} +\newtheorem{Proposition}{Proposition} +\newtheorem{proposition}{Proposition} +\newtheorem{Lemma}{Lemma} +\newtheorem{lemma}{Lemma} +\newtheorem{Korollar}{Korollar} +\newtheorem{korollar}{Korollar} +\newtheorem{Corollary}{Corollary} +\newtheorem{corollary}{Corollary} + +\theorembodyfont{\upshape} +\newtheorem{Example}{Example} +\newtheorem{example}{Example} +\newtheorem{Beispiel}{Beispiel} +\newtheorem{beispiel}{Beispiel} +\newtheorem{Bemerkung}{Bemerkung} +\newtheorem{bemerkung}{Bemerkung} +\newtheorem{Anmerkung}{Anmerkung} +\newtheorem{anmerkung}{Anmerkung} +\newtheorem{Remark}{Remark} +\newtheorem{remark}{Remark} +\newtheorem{Definition}{Definition} +\newtheorem{definition}{Definition} + +\theoremstyle{nonumberplain} +\theoremheaderfont{\scshape} +\theorembodyfont{\normalfont} +\theoremsymbol{\ensuremath{_\blacksquare}} +\RequirePackage{amssymb} +\newtheorem{Proof}{Proof} +\newtheorem{proof}{Proof} +\newtheorem{Beweis}{Beweis} +\newtheorem{beweis}{Beweis} +\qedsymbol{\ensuremath{_\blacksquare}} +\theoremclass{LaTeX} +% \end{macrocode} +%\iffalse +%\fi +% +% \section{History and Acknowledgements} +% +% \subsection{The endmark-Story (Wolfgang May)} +% +% In 1995, I started a hack for setting endmarks semiautomatically +% at the end of displayed formulas. +% The work on |thmmarks.sty| begun in October 1996 +% by a thread asking for a routine for setting endmarks in +% \emph{de.comp.tex} +% initiated by Boris Piwinger. +% Version 0.1 incorporated the main features for setting endmarks +% automagically by using the |.aux| file. Version 0.2 included +% some bugfixes and was the first one accessible on the internet. +% Boris suggested to include |fleqn| and |leqno| which has been +% done in version 0.3 (which was never made public). +% Since at this point, |thmmarks.sty| was incompatible to the widely +% used |theorem.sty| written by Frank Mittelbach, in Version 0.4, +% the features of theorem.sty have been integrated. +% +% With version 0.5, the case of ``empty'' end symbols has been handled, +% |\qed| has been added (also suggested by Boris), and +% the handling of theoremstyles by |\newtheoremstyle| has been +% included. +% +% For version 0.6, the handling of endmarks in displaymaths has been +% changed in order to adjust them with the bottom of the displayed +% math. +% +% Version 0.6 was the first one announced in \emph{comp.text.tex}. +% For version 0.7, I added the handling of |amsmath| features, +% suggested by my colleague Peter Neuhaus. +% +% Versions 0.71 and 0.72 incorporated minor bugfixes. +% +% \subsection{Lists, Lists, Lists (Andreas Schedler)} +% +% I often saw questions on theoremlists in the +% german newsgroup \emph{de.comp.text.tex}, but I never +% spent any attention on those postings. This changed in +% summer 1996, when I needed those lists for myself. Thus, I +% asked the holy question. But none of the given answers +% satisfied my wish for a simple, easy to use and short +% solution. +% +% I decided to take a look at Frank Mittelbachs +% |theorem.sty|. First I didn't understand much of the code, +% but Bernd Raichle helped me a lot by answering my +% boring questions and I finally understood it. +% +% I started the coding and within a few days, a first +% experimental version was born. Not only that I had implemented +% the lists, I also inserted a separator and a flexible numbering +% of the theorems. +% +% After a long period of +% testing, I wanted to share the new features with other +% \TeX-Freaks and wrote an article for the ``Die \TeX nische Kom\"odie'' +% (Journal of german tug, DANTE e.V.). As soon as I had sent +% the article to DANTE, I got first reactions on the style. +% Gerd Neugebauer gave me many hints. I hided several +% cryptical notations in easy definitions and improved the +% user interface. +% +% In January 1997, I released ``newthm'' to the world and it +% was uploaded to the CTAN-Archives. Few days later I sent +% my files to Frank Mittelbach in order to show him my extensions. +% He told me, that already other extensions were made, and that +% it would be good to combine alltogether. +% +% \subsection{Let's come together} +% +% With version 0.8, in February 1997, the combination of +% |thmmarks.sty| with |newthm.sty| to |ntheorem.sty| has been started. +% On April 21, 1997, version 0.94 beta has been made public as +% version 1.0. +% +% In course of the development, the following changes were made: +% +% \GlossaryPrologue{} +% +% \IfFileExists{ntheorem.gls}{\PrintChanges} +% {\begin{quote}You should create the list of changes by +% +% ~~~ \texttt{makeindex -s gglo.ist -o ntheorem.gls ntheorem.glo} +% +% and running \texttt{latex ntheorem.drv} again.\end{quote}} +% +% +% \subsection{Acknowledgements} +% +% This place is dedicated to all those, who helped us developing +% our separate styles and this combined package. Thanks to +% (listed in alphabetical order): +% \begin{quote} +% Donald Arseneau, +% Giovanni Dore, +% Oliver Karch, +% Frank Mittelbach, +% Gerd Neugebauer, +% Heiko Oberdiek, +% Boris Piwinger, +% Bernd Raichle, +% Rainer Sch\"opf, +% Didier Verna. +% \end{quote} +% +% \Finale +\endinput + +% Local Variables: +% TeX-command-default: "LaTeX" +% TeX-master: t +% End: +% mode: latex diff --git a/macros/latex/contrib/ntheorem/ntheorem.ins b/macros/latex/contrib/ntheorem/ntheorem.ins new file mode 100644 index 0000000000..6f8d87d4b5 --- /dev/null +++ b/macros/latex/contrib/ntheorem/ntheorem.ins @@ -0,0 +1,18 @@ +\def\filedate{1997/04/21} +\def\batchfile{ntheorem.ins} +\input docstrip.tex +\generateFile{ntheorem.drv}{t}{\from{ntheorem.dtx}{driver}} +\generateFile{ntheorem.sty}{t}{\from{ntheorem.dtx}{package}} +\generateFile{ntheorem.std}{t}{\from{ntheorem.dtx}{standard}} +% +\Msg{***************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* All the files with the extension '.sty' and '.std'} +\Msg{*} +\Msg{* To produce the documentation run the .drv File through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***************************************************************} diff --git a/macros/latex/contrib/ntheorem/ntheorem.pdf b/macros/latex/contrib/ntheorem/ntheorem.pdf new file mode 100644 index 0000000000..2dfe1507d4 Binary files /dev/null and b/macros/latex/contrib/ntheorem/ntheorem.pdf differ -- cgit v1.2.3