% \iffalse
%%
%% File: nccthm.dtx Copyright (C) 2002--2004 by Alexander I. Rozhenko
%%
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{nccthm}
%<package>         [2004/12/16 v1.1 NCC Extention to Theorems (NCC)]
%
% \changes{v1.02}{2002/01/31}{This version is uploaded to CTAN}
% \changes{v1.03}{2002/02/17}{Break mode is turned off globally}
% \changes{v1.04}{2002/05/19}{An extra group added in theorem headers
%                             to scope font changes}
% \changes{v1.05}{2002/06/07}{Bug in referencing in APAR mode fixed}
% \changes{v1.06}{2003/01/13}{Spaces after label are ignored now}
% \changes{v1.07}{2004/04/08}{Improvements in interpreting spaces after label}
% \changes{v1.1}{2004/12/16}{In apar mode, ignore indent option if margin option used}
% \changes{v1.1}{2004/12/16}{Documentation was prepared}
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{desclist}
\usepackage[blackqed,whiteqed]{nccthm}
\countstyle[apar]{section}
\newtheorem{theorem}{Theorem}
\newtheorem*{atheorem}{Theorem}
\TheoremBreakStyle
\newtheorem{definition}{Definition}[remark]
\TheoremNoBreakStyle
\newtheorem{lemma}[theorem]{Lemma}
\newcommand\Line{\qef\hrule height .4pt width \linewidth\nobreak
 \qef}
\GetFileInfo{nccthm.sty}
\begin{document}
\title{The \textsf{nccthm} package\thanks{This file
        has version number \fileversion, last
        revised \filedate.}}
\author{Alexander I. Rozhenko\\rozhenko@oapmg.sscc.ru}
\date{\filedate}
\maketitle
\DocInput{nccthm.dtx}
\end{document}
%</driver>
% \fi
%
% \section{Overview}
%
% This is yet another extension of the \LaTeX\ theorem making
% environment. Further, we'll call the \textit{theorem\/}
% any mathematical statement consisting of one or more paragraphs,
% and starting with a header containing an optional number.
% A theorem is set off from the main text with an extra space.
% Its title and body are often emphasized with a font change.
%
% In comparison with the |theorem| package by Frank Mittelbach and the
% |amsthm| package by American Mathematical Society, the
% |nccthm| package is distinct in the following:
%
% \paragraph{1} All new theorem environments generated with the
% |nccthm| package use the \textit{dynamic counters\/} (see |dcounter|
% package from this bungle for more details). As a result, this allows
% a package writer to generate predefined theorems
% and do not think on how they will be numbered, because the
% decision is later made by a user.
% For example, if you want all theorems to have enumeration
% subordinated to sections, you need to write down the command
% \begin{quote}
% |\countstyle{section}|
% \end{quote}
% in the preamble. In this case, counters of all new theorems will be
% set to zero at the beginning of every section and their enumeration
% will be composed from the section number and the theorem counter number
% itself. You can also change a enumeration style for concrete
% counters (not only for dynamic counters) with the |\countstyle|
% command specifying the list of counters in its optional parameter.
% For example, if you prepare a book and want to subordinate
% the equation and table counters to sections (they are subordinated to
% chapters by default), write down in the preamble the following
% \begin{quote}
% |\countstyle[equation,table]{section}|
% \end{quote}
% The last example: to make a plain enumeration of sections
% and reject their dependance on any other counter, write down
% in the preamble |\countstyle[section]{}|.
%
% \paragraph{2} We have divided all theorem modification features into
% three orthogonal groups.
%
% A \textit{type\/} defines font shapes used in the theorem.
% Two types are predefined: \textit{theorem\/} and \textit{remark}.
% You can define more types or redefine existing types.
%
% A \textit{mode\/} defines the precedence of number in the header.
% In standard mode, a number goes after a theorem title.
% The reverse mode (number starts header), named here the
% \textit{APAR\/} mode, is special. All theorems using this mode
% are counted with the same |apar| counter. To generate theorems
% in the standard mode, the |\newtheorem| command is used.
% The |\newtheorem*| command is used for generation \textit{apar\/}
% theorems.
%
% A \textit{style\/} specifies the appearance of theorems.
% It consists of three modifiers: \textit{breaking},
% \textit{indentation},
% and \textit{marginal numbering}. The breaking modifier determines
% the separation of theorem header from theorem body (run-in header
% or line break after header). The indentation modifier has two
% values: \textit{noindent\/} and \textit{parindent}. It
% defines an indentation style of a theorem header.
% The marginal numbering modifier affects on apar theorems:
% in \textit{margin\/} style, the number of an apar theorem
% is typed on margins; in \textit{nomargin\/}
% style, the number starts a paragraph.
%
% The breaking modifier is controlled with special commands but other
% modifiers are specified with package options.
%
% \paragraph{3} We do not base the implementation of theorems
% on the |trivlist| environment. This allows us to use two methods
% of theorem markup: environment-like markup (|\begin{theorem}| \ldots\
% |\end{theorem}|) or command-like markup (|\theorem| \ldots |\qef|).
% The |\qef| command is used as the end of any theorem. It resets the
% font to the normal font and produces a vertical skip.
% The command-like markup is useful in apar theorems.
%
% \paragraph{4} Service commands are introduced. Using package options
% you can select a type of Q.E.D.\ symbol: black or white. You can use
% both of them. The |\proof| command starts a proof of statement.
% We have no |proof| environment, because the proof is prepared in
% the normal font. To complete a proof, use |\qed| or |\qef|
% (the first one additionally prints the right adjusted Q.E.D. symbol).
% You can easy customize delimiters of theorem and proof headers.
%
% \section{Quod Erat Demonstrandum}
%
% The Q.E.D. symbol is usually used at the end of proof of a
% math statement. Sometimes, another symbol finishes a math
% statement itself. The package allows using two types of Q.E.D.
% symbols: black (\blackqedsymbol) and white (\whiteqedsymbol).
%
% \DescribeMacro\qedsymbol
% The default Q.E.D. symbol is white. It is printed with the
% |\qedsymbol| command.
%
% \DescribeMacro\qed
% \DescribeMacro\qef
% The |\qed| command is used to finish a proof. It prints
% right-adjusted Q.E.D. symbol and applies the |\qef| command
% (it finishes this paragraph).
% The |\qef| command finishes a paragraph,
% changes the current font to the normal font, and skips
% a |\paragraph|-like vertical space.
% \qed
%
% \DescribeMacro{\qed*}
% The star-form of |\qed| command prints the Q.E.D. symbol
% but not applies the |\qef| command.
%
% The usage of the above mentioned commands at the end of
% proof is the following: if the proof end with an ordinary
% paragraph, use the |\qed| command at its end; if the
% proof ends with a list, use the |\qed*| command at
% the end of the last list item and the |\qef|
% command after the end of list; and if the proof ends
% with a display formula, use the |\qedsymbol| command
% as its tag (|\tag*{\qedsymbol}| when use the
% |amsmath| package).
%
%
% \DescribeMacro{\blackqed}
% \DescribeMacro{\blackqedsymbol}
% If you load the package with the `|blackqed|' option, two
% additional commands are generated, |\blackqedsymbol| and |\blackqed|.
% The default |\qedsymbol| and |\qed| commands are let to be
% equal to their black versions.
%
% \DescribeMacro{\whiteqed}
% \DescribeMacro{\whiteqedsymbol}
% Analogously, the `|whiteqed|' option generates the
% |\whiteqedsymbol| and\linebreak |\whiteqed| commands and lets
% the default |\qedsymbol| and |\qed| commands to be
% equal to their white versions.
%
% If both these options are used, the default
% |\qedsymbol| and |\qed| commands are let to be equal
% the version loaded last. For example, the following command
% loads both versions of Q.E.D. and lets the white
% version to be the default version:
% \begin{quote}
% |\usepackage[blackqed,whiteqed]{nccthm}|
% \end{quote}
%
% \section{Other Package Options}
%
% The package loads options in the order they are written
% in the options list. Along with the `|blackqed|' and `|whiteqed|'
% options described above, the following options are available:
% \begin{desclist}{\tt}{\hfill}[nomargin]
% \item[noindent] theorems are typed without indentation;
% \item[indent]   theorems are typed with paragraph indentation;
% \item[nomargin] numbers for theorems in apar mode are typed normally;
% \item[margin]   numbers for theorems in apar mode are typed on margin.
% \end{desclist}
%
% The default options are |noindent| and |nomargin|. The following
% examples show how the combinations of |(no)indent| and |(no)margin|
% options interact.
%
% \liketheorem{Theorem}{1} The standard theorem in the |noindent + nomargin| style.\qef
% \likeremark*{Remark} The apar theorem in the |noindent + nomargin| style.\qef
% \makeatletter\NCC@thmindenttrue\NCC@thmmarginfalse\makeatother
% \liketheorem{Theorem}{2} The standard theorem in the |indent + nomargin| style.\qef
% \likeremark*{Remark} The apar remark in the |indent + nomargin| style.\qef
% \makeatletter\NCC@thmindentfalse\NCC@thmmargintrue\makeatother
% \liketheorem*{Theorem} The apar theorem in the |noindent + margin| style.\qef
% \makeatletter\NCC@thmindenttrue\NCC@thmmargintrue\makeatother
% \likeremark*{Remark} The apar remark in the |indent + margin| style.\qef
% \makeatletter\NCC@thmindentfalse\NCC@thmmarginfalse\makeatother
%
% As you can see, mixing of all these styles in the same document
% leads to bad results. This is the reason why these styles are
% implemented using options.
%
% As you can also see from the last example,
% the |indent| style is ignored for apar theorems typed in
% the |margin| style.
%
% \section{Structure and Types of Theorems}
%
% The structure of a theorem is the following:
% \begin{desclist}{}{\hfill}[\meta{normal-header}\quad]
% \item[\meta{theorem}] \meta{header} \meta{space-or-break} \meta{body}
% \item[\meta{header}] \meta{normal-header} \verb+|+ \meta{apar-header}
% \item[\meta{normal-header}] \meta{title} \oarg{number} \oarg{comment} \meta{after-char}
% \item[\meta{apar-header}] \meta{apar-tag} \meta{title} \oarg{comment} \meta{after-char}
% \end{desclist}
% A theorem type controls the appearance of the following elements
% of theorems: \meta{title}, \meta{comment}, and \meta{body}.
% The \meta{number} element inherits the style from \meta{title}.
% The \meta{after-char} element inherits either the style of \meta{comment}
% if it presents or the style of \meta{title} otherwise. The style of \meta{apar-tag}
% is controlled with the special way and will be described later.
%
% \DescribeMacro{\newtheoremtype}
% \DescribeMacro{\renewtheoremtype}
% The package provides the following theorem type generation commands:
% \begin{quote}
% |\newtheoremtype|\marg{type}\marg{title-style}\marg{comment-style}\marg{body-style}\\
% |\renewtheoremtype|\marg{type}\marg{title-style}\marg{comment-style}\marg{body-style}
% \end{quote}
% The \meta{type} parameter is a type name. Other parameters
% specify fonts to be used in the corresponding parts of a
% theorem.
% Font style parameters are considered to be used after the
% |\normalfont| command.
%
% \DescribeMacro{\like...}
% When a new theorem type is generated, the |\like|\meta{type} command
% is created for it. It has two forms: normal and starred. The normal version
% prints a theorem in the standard mode and the starred version prints
% an apar theorem. The syntax:
% \begin{quote}
% |\like|\meta{type}\marg{title}\marg{number}\oarg{comment}\\
% |\like|\meta{type}*\marg{title}\oarg{comment}
% \end{quote}
% The starred version of this command has no \meta{number} argument, because
% it is numbered using the |apar| counter.
% If the \meta{number} argument in the non-starred version of this command
% is empty, the number will be omitted in the theorem header.
% If the \meta{comment} argument presents, the comment is typed enclosed
% in round brackets. This behaviour can be changed with customization
% commands.
%
% Two theorem types, `|theorem|' and `|remark|', are predefined as follows:
% \begin{quote}
% |\newtheoremtype{theorem}{\bfseries}{}{\itshape}|\\
% |\newtheoremtype{remark}{\itshape}{}{}|
% \end{quote}
%
% \DescribeMacro\liketheorem
% \DescribeMacro\likeremark
% Using the |\liketheorem| and |\likeremark| commands, you can
% produce a\linebreak theorem of the given type with arbitrary title without
% generation a special environment for it. It is very useful
% if a theorem with the given title appears in a document only once.
%
% \textbf{Note:} Type generation commands are available in the
% preamble only.
%
% \section{Generate New Theorems}
%
% \DescribeMacro\newtheorem
% A standard theorem environment is generated with the
% |\newtheorem| command:
% \begin{quote}
% |\newtheorem|\marg{env-name}\oarg{counter}\marg{title}\oarg{type}
% \end{quote}
% In comparison with the standard \LaTeX\ version of this command,
% the last optional
% parameter has another meaning: it specifies a theorem type.
% This is because its standard meaning (the base counter)
% useless here. If the \meta{type} parameter is omitted,
% the `|theorem|' type is used. The optional argument \meta{counter}
% is a counter this environment will be counted with. If it is
% omitted, the counter name equal to the \meta{env-name} is used.
% We do not test the \meta{counter} on existence when
% a new theorem environment is generated. The theorem counter is declared
% to be the dynamic counter. It is defined at the first use and
% inherits the style declared by the latest use of the command
% \begin{quote}
% |\countstyle|\marg{base-counter}
% \end{quote}
% Its argument contains a name of base-counter for all dynamically
% created counters. Dynamically created counter is set to zero when the
% base counter is stepped. Its |\the| command is the following:
% \begin{quote}
% |\the|\meta{base-counter}.|\arabic|\marg{dynamic-counter}
% \end{quote}
% If the \meta{base-counter} is empty, a dynamic counter will be
% numbered in the plain style.
%
% \qef
% \textbf{Note:} In contrast with the standard definition,
% the described |\newtheorem| command may be used with all
% four parameters.
%
% \qef
% \DescribeMacro{\newtheorem*}
% To generate a new apar theorem environment, the starred version of
% the |\newtheorem| command is applied:
% \begin{quote}
% |\newtheorem*|\marg{env-name}\marg{title}\oarg{type}
% \end{quote}
% All apar theorems are counted with the `|apar|' counter.
%
% \DescribeMacro{\renewtheorem}
% \DescribeMacro{\renewtheorem*}
% You can also redefine already defined theorem environments
% using the commands
% \begin{quote}
% |\renewtheorem|\marg{env-name}\oarg{counter}\marg{title}\oarg{type}\\
% |\renewtheorem*|\marg{env-name}\marg{title}\oarg{type}
% \end{quote}
% While redefinition a theorem environment, you can change values of
% all other parameters after \meta{env-name}.
%
% \DescribeMacro\TheoremBreakStyle
% \DescribeMacro\TheoremNoBreakStyle
% When a theorem environment is defined or redefined, a decision
% what must be inserted after the theorem header (space or break)
% is made on the base of current break style. The
% |\TheoremBreakStyle| and |\TheoremNoBreakStyle| commands change
% this style to the `break' and `no-break' respectively. The default
% style is `no-break'.
%
% \textbf{Note:} Theorem generation commands are available in the preamble only.
%
% \section{Using Theorems}
%
% The syntax of using theorem environments is the following:
% \begin{quote}
% |\begin|\marg{env-name}\oarg{comment} \meta{body}
% |\end|\marg{env-name}
% \end{quote}
% You can also use the command-like syntax:
% \begin{quote}
% |\|\meta{env-name}\oarg{comment} \meta{body} |\qef|
% \end{quote}
% which is more likely for apar theorems.
%
% \DescribeMacro\breakafterheader
% \DescribeMacro\nobreakafterheader
% You can change a break style for a theorem applying
% the |\breakafterheader| and |\nobreakafterheader| commands
% just before using the theorem.
%
% Let us do the following in the preamble:
% \begin{quote}
% |\countstyle[apar]{section}|\\
% |\newtheorem{theorem}{Theorem}|\\
% |\newtheorem*{atheorem}{Theorem}|\\
% |\TheoremBreakStyle|\\
% |\newtheorem{definition}{Definition}[remark]|\\
% |\TheoremNoBreakStyle|\\
% |\newtheorem{lemma}[theorem]{Lemma}|
% \end{quote}
% This code generates 4 theorem environments: the `|theorem|' provides a
% standard Theorem statement;
% the `|atheorem|' provides a Theorem statement in the apar mode
% with per-section numbering;
% the `|definition|' provides a standard Definition statement
% prepared as a remark; and the `|lemma|' provides a standard
% Lemma statement counted with the |theorem| counter. Definitions
% are printed in the break style.
%
% \begin{quote}
% |\begin{theorem} A theorem. \end{theorem}|\\
% |\begin{lemma} A lemma. \end{lemma}|\\
% |\breakafterheader|\\
% |\begin{theorem}[A comment] A theorem with break.\end{theorem}|\\
% |\atheorem A theorem in apar mode. \qef|\\
% |\begin{definition} A definition. \end{definition}|
% \end{quote}
% This code produces the following:
% \Line
% \begin{theorem} A theorem. \end{theorem}
% \begin{lemma} A lemma. \end{lemma}
% \breakafterheader
% \begin{theorem}[A comment] A theorem with break.\end{theorem}
% \atheorem A theorem in apar mode. \qef
% \begin{definition} A definition. \end{definition}
% \Line
%
% To prepare a theorem without number or having a special number,
% use the |\like|\meta{type} command. Examples:
% \begin{quote}
% |\liketheorem{Theorem}{A} Special theorem.\qef|\\
% |\liketheorem{Proposition}{}[Comment] It has no number.\qef|\\
% |\breakafterheader|\\
% |\likeremark{Example}{2.3.5} An example.\qef|\\
% |\likeremark*{Remark} An apar remark. \qef|
% \end{quote}
% This code produces the following:
% \Line
% \liketheorem{Theorem}{A} Special theorem.\qef
% \liketheorem{Proposition}{}[Comment] It has no number.\qef
% \breakafterheader
% \likeremark{Example}{2.3.5} An example.\qef
% \likeremark*{Remark} An apar remark. \qef
% \Line
%
% \DescribeMacro\proof
% The |\proof| command prints the proof of a math statement. Syntax:
% \begin{quote}
% |\proof|\oarg{of-theorem} \meta{body} |\qed|
% \end{quote}
% The optional parameter \meta{of-theorem} contains a
% text appended to the title of proof. The break-style change
% commands can be applied to this command. Examples:
% \begin{quote}
% |\proof An ordinary proof.\qed|\\
% |\proof[of Theorem A] A special proof.\qed|\\
% |\breakafterheader|\\
% |\proof[of the Pythagor Theorem] A proof.\qed|
% \end{quote}
% This code produces the following:
% \Line
% \proof An ordinary proof.\qed
% \proof[of Theorem A] A special proof.\qed
% \breakafterheader
% \proof[of the Pythagor Theorem] A proof.\qed
% \Line
%
% \section{Apar Sections}
%
% Header of an apar theorem is similar to the header printed
% by the |\paragraph| or |\subparagraph| command (except
% paragraph numbering that is usually omitted).
% Moreover, from the logical point of view, the apar
% theorems are specially designed enumerated paragraphs.
% Therefore, it is a good idea to use apar markup
% as some kind of special sectioning.
%
% \DescribeMacro\apar
% The following command supports sectioning in the apar mode:
% \begin{quote}
% |\apar|\oarg{title}
% \end{quote}
% It produces a new paragraph starting with the \meta{apar-tag}
% element and having the optional title. The indentation style and
% marginal style of apar section is the same as for apar theorems.
% The vertical skip before
% the apar section is just the same as before theorems.
% If the |nccsect| package is loaded, the apar skip is equal
% to the skip produced with the |\paragraph| and |\subparagraph|
% commands.
%
% These properties of apar sections are useful in design of
% articles having short sections. For example, if an article
% consists of many short sections prepared with the |\subsection|
% command, it looks very loose, because subsections are produced
% in the display style. It will be better to allow subsections
% run-in paragraph. Using the |\apar| command, you can do this
% very easy: add the following command to the preamble
% \begin{quote}
% |\countstyle[apar]{section}|
% \end{quote}
% and prepare subsections with the |\apar| command. Example:
% \begin{quote}
% |\apar[Subsection title] Subsection body ...|\\
% |\apar[Next title:] The body ...|\\
% |\atheorem In fact, this is a special apar section ...|\\
% |\apar Subsection without title ...|\\
% |\breakafterheader|\\
% |\apar[One more title] Break before its body|
% \end{quote}
% This code produces the following:
% \Line
% \apar[Subsection title] Subsection body ...
% \apar[Next title:] The body ...
% \atheorem In fact, this is a special apar section ...
% \apar Subsection without title ...
% \breakafterheader
% \apar[One more title] Break before its body
% \Line
%
% \section{Customization Commands}
%
% \DescribeMacro{\NCC@runskip}
% The vertical skips before and after theorems are identic. They are
% produced with the |\qef| command. The length of the skip is coded
% in the inner command |\NCC@runskip|. This command is also used in
% the |nccsect| package as a skip inserted before the |\paragraph|
% and |\subparagraph| commands. Its default value
% \begin{quote}
% |2.75ex plus 1ex minus 0.2ex|
% \end{quote}
%
% \DescribeMacro{\TheoremCommentDelimiters}
% The |\TheoremCommentDelimiters|\marg{left}\marg{right} command
% specifies delimiters inserted before and after a theorem comment.
% The default setting is:
% \begin{quote}
% |\TheoremCommentDelimiters{(}{)}|
% \end{quote}
%
% \DescribeMacro{\AfterTheoremHeaderChar}
% The |\AfterTheoremHeaderChar|\marg{after-char} command
% specifies an \meta{after-char} element that ends
% header of theorem and header of proof. The default setting is
% an empty element.
%
% \DescribeMacro{\AfterTheoremHeaderSkip}
% The |\AfterTheoremHeaderSkip|\marg{skip-command} command
% specifies a command inserted between theorem header and body.
% In break style, this command is ignored.
% The default setting is:
% \begin{quote}
% |\AfterTheoremHeaderSkip{\hskip 1em plus 0.2em minus 0.2em}|
% \end{quote}
%
% \DescribeMacro\ProofStyleParameters
% The |\ProofStyleParameters|\marg{style}\marg{title} command
% specifies style parameters used in the |\proof|
% command: the first one is a font style and the last one
% is a proof title. The default setting is:
% \begin{quote}
% |\ProofStyleParameters{\bfseries}{Proof}|
% \end{quote}
%
% \DescribeMacro\AparStyleParameters
% The |\AparStyleParameters|\marg{style}\marg{prefix}\marg{suffix}
% command specifies the style of apar sections: the \meta{style}
% is a style of apar section title; the tag of apar theorems
% and sections is prepared using \meta{prefix} and \meta{suffix}
% specified with this command as follows
% \meta{prefix}|\theapar|\meta{suffix}. The default setting is:
% \begin{quote}
% |\AparStyleParameters{\bfseries}{\bfseries}{\enskip}|
% \end{quote}
%
% \qef
% \textbf{Note:} All customization commands except the
% |\NCC@runskip| are allowed in the preamble only.
% \StopEventually{}
%
% \section{The Implementation}
%
% \begin{macro}{\NCC@secskip}
% \begin{macro}{\NCC@runskip}
% The package shares the following commands with the
% |nccsect| package:
% \begin{quote}
% |\NCC@secskip|\marg{skip} adds the \meta{skip} before a section,\\
% |\NCC@runskip| is a skip inserted before run-in sections.
% \end{quote}
% We protect the definitions of these commands with testing
% the |nccsect| package to be already loaded.
%    \begin{macrocode}
%<*package>
\@ifpackageloaded{nccsect}{}{%
  \def\NCC@secskip#1{%
    \if@noskipsec \leavevmode \fi \par
    \if@nobreak \everypar{}\else
      \addpenalty\@secpenalty
      \addvspace{#1}%
    \fi
  }
  \def\NCC@runskip{2.75ex \@plus 1ex \@minus .2ex}
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsection{Q.E.D. Support}
%
% \begin{macro}{\NCC@qedsymbol}
% \begin{macro}{\qedsymbol}
% The |\NCC@qedsymbol| command is the base implementation
% of white Q.E.D. symbol.
% If no Q.E.D. selection options used, the
% |\qedsymbol| is equal to the base version.
%    \begin{macrocode}
\DeclareRobustCommand{\NCC@qedsymbol}{%
  \mbox{\normalsize\normalfont\thinlines \@tempdima 1.5ex
    \advance\@tempdima-2\@wholewidth
    \edef\@tempa{\the\@tempdima}%
    \kern \@wholewidth
    \raisebox\@wholewidth[1.5ex]{%
      \frame{\rule\z@\@tempa\rule\@tempa\z@}}%
    \kern \@wholewidth
  }%
}
\let\qedsymbol\NCC@qedsymbol
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\qed}
% \begin{macro}{\qed*}
% The |\qed| command produces the flush-right Q.E.D. symbol
% and applies the |\qef| command in the non-starred case.
%    \begin{macrocode}
\newcommand{\qed}{\NCC@qed{\qedsymbol}}
\def\NCC@qed#1{\unskip\allowbreak%
  \hspace*{1em plus 1fill minus .2em}#1\@ifstar{}{\qef}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\qef}
% The |\qef| finishes a paragraph, adds the |\@secpenalty|,
% and produces the vertical skip of |\NCC@runskip| size.
% If also sets the normal font and removes the no-break
% condition suppressing indentation in the next
% paragraph.
%    \begin{macrocode}
\newcommand{\qef}{\NCC@secskip{\NCC@runskip}\@nobreakfalse\normalfont}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Package Options}
%
% \begin{macro}{\whiteqedsymbol}
% \begin{macro}{\whiteqed}
% The `|whiteqed|' option:
%    \begin{macrocode}
\DeclareOption{whiteqed}{%
  \let\whiteqedsymbol\NCC@qedsymbol
  \newcommand{\whiteqed}{\NCC@qed{\whiteqedsymbol}}
  \let\qedsymbol\whiteqedsymbol
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\blackqedsymbol}
% \begin{macro}{\blackqed}
% The `|blackqed|' option:
%    \begin{macrocode}
\DeclareOption{blackqed}{%
  \DeclareRobustCommand{\blackqedsymbol}{%
    \begingroup\normalsize\normalfont\thinlines
      \rule{1.5ex}{1.5ex}\endgroup
  }
  \newcommand{\blackqed}{\NCC@qed{\blackqedsymbol}}
  \let\qedsymbol\blackqedsymbol
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ifNCC@thmindent}
% \begin{macro}{\ifNCC@thmmargin}
% Theorem indentation and marginal numbering options
% are based on two if-macros:
% the |NCC@thmindent| controls the indentation of headers and
% the |NCC@thmmargin| controls the marginal numbering in
% the apar mode.
%    \begin{macrocode}
\newif\ifNCC@thmindent
\newif\ifNCC@thmmargin
\DeclareOption{noindent}{\NCC@thmindentfalse}
\DeclareOption{indent}{\NCC@thmindenttrue}
\DeclareOption{nomargin}{\NCC@thmmarginfalse}
\DeclareOption{margin}{\NCC@thmmargintrue}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% Set defaults and process all options in the order
% they appear in the options list.
%    \begin{macrocode}
\ExecuteOptions{noindent,nomargin}
\ProcessOptions*
%    \end{macrocode}
%
% \subsection{The Kernel}
%
% We use the |\@ifempty| command from the |amsgen| package
% and dynamic counters from the |dcounter| package.
%    \begin{macrocode}
\RequirePackage{amsgen}
\RequirePackage{dcounter}[1998/12/19]
%    \end{macrocode}
%
% \begin{macro}{\NCC@thmbrmode}
% \begin{macro}{\ifNCC@thmbr}
% A theorem break mode is controlled with the |\NCC@thmbrmode|
% macro and the |\ifNCC@thmbr|. The |\NCC@thmbrmode| can have
% three possible values:
% \begin{desclist}{}{\hfill}[\cs{relax}\ ]
% \item[\cs{relax}] undefined mode;
% \item[\cs{z@}] break mode;
% \item[\cs{@ne}] no-break mode.
% \end{desclist}
% If the break mode is undefined, the decision is made on the
% analyzes of the |NCC@thmbr| value: true value means break,
% false value means no-break.
%    \begin{macrocode}
\let\NCC@thmbrmode\relax
\newif\ifNCC@thmbr
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\breakafterheader}
% \begin{macro}{\nobreakafterheader}
% The |\breakafterheader| and |\nobreakafterheader|
% commands test the current break mode and set an
% appropriate mode if it is undefined yet. As a result,
% usage of these commands before a theorem leads to
% overriding the default break mode specified in
% theorem's macro.
%    \begin{macrocode}
\newcommand\breakafterheader{%
  \ifx\NCC@thmbrmode\relax \global\chardef\NCC@thmbrmode\z@\fi
}
\newcommand\nobreakafterheader{%
  \ifx\NCC@thmbrmode\relax \global\chardef\NCC@thmbrmode\@ne\fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\TheoremBreakStyle}
% \begin{macro}{\TheoremNoBreakStyle}
% \begin{macro}{\TheoremCommentDelimiters}
% \begin{macro}{\AfterTheoremHeaderChar}
% \begin{macro}{\AfterTheoremHeaderSkip}
% Theorem customization commands:
%    \begin{macrocode}
\newcommand{\TheoremBreakStyle}{\NCC@thmbrtrue}
\newcommand{\TheoremNoBreakStyle}{\NCC@thmbrfalse}
\newcommand*{\TheoremCommentDelimiters}[2]{%
  \def\NCC@thmcmt@##1{#1\ignorespaces##1\unskip#2}%
}
\newcommand*{\AfterTheoremHeaderChar}[1]{\def\NCC@thmchar{#1}}
\newcommand*{\AfterTheoremHeaderSkip}[1]{\def\NCC@thmskip{#1}}
\@onlypreamble\TheoremBreakStyle
\@onlypreamble\TheoremNoBreakStyle
\@onlypreamble\TheoremCommentDelimiters
\@onlypreamble\AfterTheoremHeaderChar
\@onlypreamble\AfterTheoremHeaderSkip
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\NCC@thmhdr}
% The |\NCC@thmhdr|\marg{style}\marg{header} prints a theorem header
% in the required \meta{style} and implements the current break mode.
% At the end of macro, the break mode is reset to |\relax|.
% The header is prepared in a group.
%    \begin{macrocode}
\def\NCC@thmhdr#1#2{%
  \qef
%    \end{macrocode}
% Insert a negative low penalty to increase a chance of
% page break before the beginning of theorem.
%    \begin{macrocode}
  \addpenalty{-\@lowpenalty}%
  \begingroup
    #1%
%    \end{macrocode}
% Test the break mode. If it is undefined, we set it basing
% on the value of |\ifNCC@thmbr| switch.
%    \begin{macrocode}
    \ifx\NCC@thmbrmode\relax
      \ifNCC@thmbr \chardef\NCC@thmbrmode\z@
      \else \chardef\NCC@thmbrmode\@ne
      \fi
    \fi
%    \end{macrocode}
% The break case: to implement the break in the vertical
% mode, it is enough to put the header in hbox. To allow
% multi-line header, we prepare it in inner vbox.
%    \begin{macrocode}
    \ifnum\NCC@thmbrmode=\z@
      \@tempdima\parindent
      \hbox{\vbox{\hsize\linewidth\@parboxrestore
        \ifNCC@thmindent\parindent\@tempdima\fi
        \leavevmode\strut#2\strut
      }}\nobreak\noindent
%    \end{macrocode}
% The no-break case: The |\ncc@thmskip| command
%    \begin{macrocode}
    \else
      \ifNCC@thmindent\else\noindent\fi
      \leavevmode{#2\normalfont\NCC@thmskip}\nobreak
    \fi
  \endgroup
%    \end{macrocode}
% Reset the break mode to the initial value:
%    \begin{macrocode}
  \global\let\NCC@thmbrmode\relax
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\NCC@thmcmt}
% The |\NCC@thmcmt|\marg{comment-style}\marg{comment} tests
% a comment to be nonempty and produces it in corresponding style.
%    \begin{macrocode}
\def\NCC@thmcmt#1#2{%
  \@ifempty{#2}{}{\/\space\normalfont#1\NCC@thmcmt@{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\NCC@lthm}
% Standard mode basic command:
% \begin{quote}
% |\NCC@lthm|\marg{header-style}\marg{comment-style}\marg{body-style}\marg{title}\\
% |         |\marg{number}\oarg{comment}
% \end{quote}
%    \begin{macrocode}
\def\NCC@lthm#1#2#3#4#5{%
  \@ifnextchar[{\NCC@lthm@{#1}{#2}{#3}{#4}{#5}}%
               {\NCC@lthm@{#1}{#2}{#3}{#4}{#5}[]}%
}
\def\NCC@lthm@#1#2#3#4#5[#6]{%
%    \end{macrocode}
% Prepare theorem header.
%    \begin{macrocode}
  \NCC@thmhdr{}{%
    #1#4\@ifempty{#5}{}{\space#5}%
    \NCC@thmcmt{#2}{#6}\NCC@thmchar
  }%
%    \end{macrocode}
% Set the body style and do a small skip to avoid extra
% space after the |\label| command.
%    \begin{macrocode}
  #3\hskip 0.001\p@ \ignorespaces
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\NCC@thxhdr}
% The |\NCC@thxhdr|\marg{style}\marg{header} produces an apar theorem
% header.
%    \begin{macrocode}
\def\NCC@thxhdr#1#2{%
  \refstepcounter{apar}%
  \NCC@thmhdr{%
%    \end{macrocode}
% In margin style, the indent style is turned off for apar theorems:
%    \begin{macrocode}
    \ifNCC@thmmargin \NCC@thmindentfalse \fi
    #1%
  }{%
%    \end{macrocode}
% Put the \meta{apar-tag} (prepared in the |\NCC@thmapar| command)
% before the header using |\llap| or |\hbox|. Then put the header.
%    \begin{macrocode}
    \ifNCC@thmmargin \llap{\NCC@thmapar}\else \hbox{\NCC@thmapar}\fi
    #2%
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\NCC@lthx}
% Apar mode basic command:
% \begin{quote}
% |\NCC@lthx|\marg{header-style}\marg{comment-style}\marg{body-style}\marg{title}\\
% |         |\oarg{comment}
% \end{quote}
%    \begin{macrocode}
\def\NCC@lthx#1#2#3#4{%
  \@ifnextchar[{\NCC@lthx@{#1}{#2}{#3}{#4}}%
               {\NCC@lthx@{#1}{#2}{#3}{#4}[]}%
}
\def\NCC@lthx@#1#2#3#4[#5]{%
  \NCC@thxhdr{}{%
    \normalfont#1#4\NCC@thmcmt{#2}{#5}\NCC@thmchar
  }%
  #3\hskip 0.001\p@ \ignorespaces
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\NCC@likethm}
% The base for |\like|\meta{type} commands. It passes the control
% to |\NCC@lthm| or |\NCC@lthx| depending on the star appearing
% after the third parameter:
% \begin{quote}
% |\NCC@likethm|\marg{header-style}\marg{comment-style}\marg{body-style}\marg{title}\\
% |            |\marg{number}\oarg{comment}\\
% |\NCC@likethm|\marg{header-style}\marg{comment-style}\marg{body-style}|*|\marg{title}\\
% |            |\oarg{comment}
% \end{quote}
%    \begin{macrocode}
\def\NCC@likethm#1#2#3{%
  \@ifstar{\NCC@lthx{#1}{#2}{#3}}{\NCC@lthm{#1}{#2}{#3}}%
}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Apar Sections}
%
% The counter used in the apar mode is dynamic:
%    \begin{macrocode}
\DeclareDynamicCounter{apar}
%    \end{macrocode}
%
% \begin{macro}{\AparStyleParameters}
% Apar style parameters provider:
%    \begin{macrocode}
\newcommand*{\AparStyleParameters}[3]{%
  \def\NCC@thmaparstyle{#1}%
  \def\NCC@thmapar{#2\theapar#3}%
}
\@onlypreamble\AparStyleParameters
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\apar}
% The |\apar|\oarg{title} command starts a new apar-numbered
% paragraph. If the \meta{title} is omitted or empty,
% we must ignore the |\NCC@thmskip|.
%    \begin{macrocode}
\newcommand*{\apar}[1][]{%
  \NCC@thxhdr{\NCC@thmaparstyle}
    {\@ifempty{#1}{\let\NCC@thmskip\@empty}{\ignorespaces#1\unskip}}%
  \hskip 0.001\p@ \ignorespaces
}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Proof of Theorem}
%
% \begin{macro}{\ProofStyleParameters}
% Proof style parameters provider:
%    \begin{macrocode}
\newcommand*{\ProofStyleParameters}[2]{%
  \def\NCC@thmproofstyle{#1}%
  \def\NCC@thmproof{#2}%
}
\@onlypreamble\ProofStyleParameters
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\proof}
% The |\proof|\oarg{of-theorem} command:
%    \begin{macrocode}
\newcommand*{\proof}[1][]{%
  \NCC@thmhdr{\NCC@thmproofstyle}{%
    \NCC@thmproof
    \@ifempty{#1}{}{\space\ignorespaces#1\unskip}%
    \NCC@thmchar
  }%
  \hskip 0.001\p@ \ignorespaces
}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Generate New Theorem Types}
%
% \begin{macro}{\like...}
% New theorem type generation means definition a |\like|\meta{type}
% command preparing theorems of corresponding type.
% The syntax of a |\like|\meta{type} command is
% the following:
% \begin{quote}
% |\like|\meta{type}\marg{title}\marg{number}\oarg{comment}\\
% |\like|\meta{type}|*|\marg{title}\oarg{comment}
% \end{quote}
% The first one produces a standard theorem and the last one produces
% an apar theorem.
% \end{macro}
%
% \begin{macro}{\newtheoremtype}
% \begin{macro}{\renewtheoremtype}
% Theorem type generation commands:
% \begin{quote}
% |\newtheoremtype|\marg{type}\marg{title-style}\marg{comment-style}\marg{body-style}\\
% |\renewtheoremtype|\marg{type}\marg{title-style}\marg{comment-style}\marg{body-style}
% \end{quote}
%    \begin{macrocode}
\newcommand*{\newtheoremtype}[1]{%
  \edef\@tempa{\noexpand\newcommand*{\expandafter\noexpand
    \csname like#1\endcsname}}\NCC@nthmtype
}
\newcommand*{\renewtheoremtype}[1]{%
  \edef\@tempa{\noexpand\renewcommand*{\expandafter\noexpand
    \csname like#1\endcsname}}\NCC@nthmtype
}
\def\NCC@nthmtype#1#2#3{\@tempa{\NCC@likethm{#1}{#2}{#3}}}
\@onlypreamble\newtheoremtype
\@onlypreamble\renewtheoremtype
\@onlypreamble\NCC@nthmtype
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsection{Generate New Theorems}
%
% \begin{macro}{\NCC@thmdef}
% Basic theorem generation command:
% \begin{quote}
% |\NCC@thmdef|\marg{env-name}\marg{action}\marg{parameters}\oarg{type}
% \end{quote}
% The |\@tempa| command must contain either |\noexpand\newenvironment| or
% |\noexpand\renewenvironment| before the call.
% The \meta{action} is an action applied at the beginning
% of theorem. The \meta{parameters} contains parameters passed
% to the |\like|\meta{type} command.
%    \begin{macrocode}
\def\NCC@thmdef#1#2#3{%
  \@ifnextchar[{\NCC@thmdef@{#1}{#2}{#3}}%
               {\NCC@thmdef@{#1}{#2}{#3}[theorem]}%
}
\def\NCC@thmdef@#1#2#3[#4]{%
%    \end{macrocode}
% Generate an error if the given type is unknown.
%    \begin{macrocode}
  \@ifundefined{like#4}{%
    \PackageError{nccthm}{Unknown theorem type `#4'}{}%
  }%
%    \end{macrocode}
% |\@tempa := \[re]newenvironment|\marg{env-name}|{#1\like|\meta{type}|#2}|
%    \begin{macrocode}
  \edef\@tempa##1##2{%
    \@tempa{#1}{##1\expandafter\noexpand\csname like#4\endcsname##2}%
  }%
%    \end{macrocode}
% Generate a theorem envirinment:
%    \begin{macrocode}
  \ifNCC@thmbr
    \@tempa{#2\breakafterheader}{#3}{\qef\ignorespacesafterend}%
  \else
    \@tempa{#2\nobreakafterheader}{#3}{\qef\ignorespacesafterend}%
  \fi
}
\@onlypreamble\NCC@thmdef
\@onlypreamble\NCC@thmdef@
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\newtheorem}
% \begin{macro}{\renewtheorem}
% \begin{macro}{\newtheorem*}
% \begin{macro}{\renewtheorem*}
% Theorem generation commands:
% \begin{quote}
% |\newtheorem|\marg{env-name}\oarg{counter}\marg{title}\oarg{type}\\
% |\renewtheorem|\marg{env-name}\oarg{counter}\marg{title}\oarg{type}\\
% |\newtheorem*|\marg{env-name}\marg{title}\oarg{type}\\
% |\renewtheorem*|\marg{env-name}\marg{title}\oarg{type}
% \end{quote}
%    \begin{macrocode}
\renewcommand*{\newtheorem}{\def\@tempa{\noexpand\newenvironment}%
  \@ifstar{\NCC@nthx}{\NCC@nthm}}
\newcommand*{\renewtheorem}{\def\@tempa{\noexpand\renewenvironment}%
  \@ifstar{\NCC@nthx}{\NCC@nthm}}
\def\NCC@nthx#1#2{\NCC@thmdef{#1}{}{*{#2}}}
\def\NCC@nthm#1{\@ifnextchar[{\NCC@nthm@{#1}}{\NCC@nthm@{#1}[#1]}}
\def\NCC@nthm@#1[#2]#3{%
  \DeclareDynamicCounter{#2}%
  \NCC@thmdef{#1}{\refstepcounter{#2}}{{#3}{\csname the#2\endcsname}}%
}
\@onlypreamble\newtheorem
\@onlypreamble\renewtheorem
\@onlypreamble\NCC@nthx
\@onlypreamble\NCC@nthm
\@onlypreamble\NCC@nthm@
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \subsection{Defaults}
%
%    \begin{macrocode}
\newtheoremtype{theorem}{\bfseries}{}{\itshape}
\newtheoremtype{remark}{\itshape}{}{}
\TheoremNoBreakStyle
\TheoremCommentDelimiters{(}{)}
\AfterTheoremHeaderChar{}
\AfterTheoremHeaderSkip{\hskip 1em \@plus .2em \@minus .2em}
\AparStyleParameters{\bfseries}{\bfseries}{\enskip}
\ProofStyleParameters{\bfseries}{Proof}
%</package>
%    \end{macrocode}
\endinput
