% This is file `theomac.sty',
%
% The usage is explained after coding-stuff, right after
% "\endinput". This way you don't need all these percent-chars
% all the time...
%
\NeedsTeXFormat{LaTeX2e}
%My Note: Next two commented out to avoid useless warnings.
%\RequirePackage{amsmath}
%\ProvidesPackage{theomac} [2007/06/04 v1.00beta2 Define macros from theorems.]
%
% Find out how to catch the arguments - there are the following
% possibilities:
% - \newtheorem{env_name}[numbered_like]{caption}
% - \newtheorem{env_name}{caption}[within]
% - \newtheorem{env_name}{caption}
%
\newcommand*\newtheoremWithMacro[1]{%
\@ifnextchar[%
{\newtheoremwithmacrooptbrace{#1}}%
{\newtheoremwithmacrobraceopt{#1}}%
}%
\newcommand*\newtheoremwithmacrobraceopt[2]{%
\@ifnextchar[%
{\newtheoremwithmacrolastopt{#1}{#2}}%
{\newtheoremwithmacronolastopt{#1}{#2}}%
}%
%
% Depending on the order of the arguments, one of the following
% three macros is called for defining the theorem and
% afterwards calling "\@newtheoremWithMacro{}" for trans-
% forming that environment into one that catches up an additional
% optional argument for defining a macro which can henceforth be
% used for restating that theorem:
%
\@ifdefinable\newtheoremwithmacrooptbrace{%
\gdef\newtheoremwithmacrooptbrace#1[#2]#3{%
\newtheorem{#1}[#2]{#3}\@newtheoremWithMacro{#1}{#2}%
}%
}%
\@ifdefinable\newtheoremwithmacrolastopt{%
\gdef\newtheoremwithmacrolastopt#1#2[#3]{%
\newtheorem{#1}{#2}[#3]\@newtheoremWithMacro{#1}{#1}%
}%
}%
\@ifdefinable\newtheoremwithmacronolastopt{%
\gdef\newtheoremwithmacronolastopt#1#2{%
\newtheorem{#1}{#2}\@newtheoremWithMacro{#1}{#1}%
}%
}%
%
%"\@newtheoremWithMacro{}" "transforms" the theorem-environ-
% ment "" into one that catches up an additional optional
% argument for defining a macro which can henceforth be used for
% restating that theorem:
%
\newcommand\@newtheoremWithMacro[2]{%
% First "copy" the theorem-environment "" to the environ-
% ment "theorem":
\expandafter\@ifdefinable\csname #1theorem\endcsname{%
\expandafter\global
\expandafter\let
\csname #1theorem\expandafter\endcsname
\csname #1\endcsname
}%
\@ifundefined{end#1theorem}{%
\expandafter\global
\expandafter\let
\csname end#1theorem\expandafter\endcsname
\csname end#1\endcsname
}%
{%
\edef\reserved@a{%
\expandafter\expandafter
\expandafter\@gobble
\expandafter\string
\csname end#1theorem\endcsname
}%
\@notdefinable
}%
%
% Then define the macro "\@" to catch the first optional
% argument into the macro \@tempa and to start collecting the
% "body" of the environment into the token-register "\toks@"
% whereby a call to the former ""-theorem-environment
% which was saved in/copied to "theorem" must precede
% everything in order to make sure that a theorem is formed
% when later the token-register is "flushed":
%
\expandafter\@ifdefinable\csname @#1\endcsname{%
\expandafter\gdef\csname @#1\endcsname[##1]{%
\def\@tempa{##1}%
\collect@body\toks@{#1theorem}%
}%
}%
%
% Afterwards redefine the internal starter-macro of the
% ""-theorem-environment (and thus that environment it-
% self) to call the "\@"-macro and hereby supply an empty
% optional argument if no optional argument is provided:
%
\expandafter\gdef\csname #1\endcsname{%
\@ifnextchar[%
{\@tempswatrue\csname @#1\endcsname}%
{\@tempswafalse\csname @#1\endcsname[]}%
}%
% Redefine the internal-ending-macro of the ""-theorem-
% environment so that to the content of the token-register
% both the leading token "\begin" [Within the \collect@body-
% part there was inserted "{#1theorem}" -- Together this yields
% "\begin{#1theorem}" ] and a trailing phrase "\end{#1theorem}"
% get added. Afterwards flush the register once in order to
% print the theorem...
%
\expandafter\gdef\csname end#1\endcsname{%
\toks@\expandafter{%
\expandafter\begin
\the\toks@\end{#1theorem}}%
\the\toks@
% In case there was no optional argument, we have
% "\@tempswafalse".
% In case "\@tempa" is empty, the optional argument for
% defining the macro is empty. In both cases we don't need to
% define a "theorem-printing"-macro. Otherwise we have to.
% Then within "\@tempa" the name of that macro is stored so
% that "\@tempa" needs to be expanded once before defining
% can take place. The environment itself is within the
% token-register.
% All we have to do is making sure that
% - we always get the same value for the counter
% - the counter does not get stepped
% - label has no effect (otherwise: multiply defined
% references-errors!!!!!)
% whenever the theorem is restated:
\ifx\@tempa\@empty\@tempswafalse\fi
\if@tempswa
{%
\restatedtrue
\expandafter\edef
\csname the#2\endcsname{%
\csname the#2\endcsname
}%
\expandafter\@ifdefinable\@tempa{%
\expandafter\expandafter
\expandafter \gdef
\expandafter\@tempa
\expandafter{%
\expandafter\bgroup
\expandafter\restatedtrue
\expandafter\def
\csname the#2%
\expandafter\expandafter
\expandafter \endcsname
\expandafter\expandafter
\expandafter {%
\csname the#2%
\expandafter\endcsname
\expandafter}%
\expandafter\let
\expandafter\label
\expandafter\@gobble
\expandafter\let
\expandafter\refstepcounter
\expandafter\@gobble
\the\toks@
\egroup
}%
}%
}%
\fi
}%
}%
%
% The following switch is set true when a theorem is restated
% by calling the associated macro:
%
\@ifdefinable\ifrestated{%
\@ifdefinable\restatedfalse{%
\@ifdefinable\restatedtrue{%
\newif\ifrestated
\global\restatedfalse
}%
}%
}%
\endinput
%
Usage etc:
==========
change history
--------------
2006/07/29 v1.00beta1 - initial release
2007/06/04 v1.00beta2 - bugfix related to counter-management
with [numbered_like]-option.
if-switch "\ifrestated" which is "true"
when theorem is restated and otherwise
"false".
I think you can use this switch
- within the theorem-environment's
arguments
- within the theorem-environmnent's body
- when (re)defining or patching the
\the macro which is associated
to the theorem's counter.
legal stuff
-----------
theomac.sty � Copyright (C) 2006, 2007 by Ulrich Diez
(ulrich.diez@alumni.uni-tuebingen.de)
theomac may be distributed and/or modified under the conditions
of the LaTeX Project Public Licence (LPPL), either version 1.3
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.3 or later is part of all distributions of LaTeX
version 1999/12/01 or later.)
The author and Current Maintainer of this work is Ulrich Diez.
This work has the LPPL maintenance status �maintained�.
Usage of theomac.sty is at your own risk.
There is no warranty � neither for the documentation nor for any
other part of theomac.sty. If something breaks, you usually may
keep the pieces.
What is it? / Acknowledgment / Intro:
-------------------------------------
The file theomac.sty is a package for LaTeX2e. It came into being
as a result of internet-discussion that took place at
comp.text.tex (usenet).
Subject: Restating Theorems
Initial posting in July 8 2006 by Louis Theran
(ID: 1152428341.793307.221130@p79g2000cwp.googlegroups.com)
Special thanks to Ulrich M. Schwarz, Louis Theran, Michael
and Emanuale for
their comments and for reporting problems and thus providing
important contributions to the making of this package.
The introducing-phrase in Louis Theran's initial posting:
...
> In longer papers, I like to state results in an early section
> and then restate them before the proof later on.
...
Usually you define theorem-like-environments by means of the
"\newtheorem"-macro.
theomac.sty provides a macro "\newtheoremWithMacro" which is
similar to "\newtheorem" but which creates environments which
also allow specifying an additional optional-argument which is
to hold the name of a newly to be defined control-sequence.
Internally these environments fork:
If optional argument is not supplied or supplied empty:
Simply create the theorem-text and hereby internally use an
environment defined in terms of "\newtheorem".
If optional argument is supplied a macro-name:
Additionally define a macro to spit out the theorem-text. (For
getting the environment-text into a defining-control-sequence's
argument, amsmath.sty's "\collect@body"-macro is used. I tried
to take care so that referencing-labels won't get defined more
than once and counters will be balanced correctly.)
If you wish to repeat/restate the theorem, you can do so by
simply calling that macro given in the optional argument when
stating it the first time.
"\newtheoremWithMacro" has the same syntax as "\newtheorem".
Difference is:
\newtheorem{foo}...
creates theorem-environment with syntax
\begin{foo} ... \end{foo}
________________________
\newtheoremWithMacro{foo}...
creates theorem(-like)-environment with syntax
\begin{foo}[\macro] ... \end{foo}
If you supply the optional-argument "\macro", you can later
repeat/restate your theorem-statement by calling "\macro".
"\macro" will be defined in terms of "\global".
If "\macro" is already defined, an error is raised.
Usage
-----
Possible syntax-patterns for "\newtheorem" are:
\newtheorem{env_name}[numbered_like]{caption}
\newtheorem{env_name}{caption}[within]
\newtheorem{env_name}{caption}
Possible syntax-patterns for "\newtheoremWithMacro"are the same:
\newtheoremWithMacro{env_name}[numbered_like]{caption}
\newtheoremWithMacro{env_name}{caption}[within]
\newtheoremWithMacro{env_name}{caption}
Syntax-patterns for a theorem "foo" defined in terms of
"\newtheorem" are:
\begin{foo}
This is my theorem
\end{foo}
\begin{foo}[Galois]
This is my theorem
\end{foo}
Syntax-patterns for a theorem "bar" defined in terms of
"\newtheoremWithMacro" are:
\begin{bar}
This is my theorem
\end{bar]
\begin{bar}[]
This is my theorem
\end{bar}
(But this is obsolete and yields the same as above!)
\begin{bar}[][Galois]
This is my theorem
\end{bar}
\begin{bar}[\macro][Galois]
This is my theorem
\end{bar}
\begin{bar}[\macro]
This is my theorem
\end{bar}
The last two variants also define "\macro" to restate the
theorem.
Restrictions
------------
A noteworthy restriction is:
"Verbatim" is broken within the body of environments that are
defined in terms of "\newtheoremWithMacro".
This is because amslatex' "\collect@body" will read ahead and
tokenize the whole stuff before catcode-changes of verbatim-
environment get into effect.
E.g., the following code does work as expected...
\newtheorem{foo}...
...
\begin{foo}
\begin{verbatim}
\TeX is funny.
\end{verbatim}
\end{foo}
...while this one does not:
\newtheoremWithMacro{bar}...
...
\begin{bar}
\begin{verbatim}
\TeX is funny.
\end{verbatim}
\end{bar}
Usage-Example:
--------------
\documentclass{article}
\usepackage{theomac}
\usepackage{hyperref}
\newtheorem{theorem}{Theorems Caption}[section]
\newtheoremWithMacro{Mytheorem}[theorem]{My Theorem}
%\newtheoremWithMacro{Mytheorem}{My Theorem}[section]
\makeatletter
\g@addto@macro\thetheorem{\ifrestated, restated\fi}%
%\g@addto@macro\theMytheorem{\ifrestated, restated\fi}%
\makeatother
\begin{document}
\section{test}
\begin{Mytheorem}[\firsttheorem][Not Galois]%
This is my first theorem.
\label{firsttheoremsfirstocurrence}%
\end{Mytheorem}
Let's restate the first theorem: \firsttheorem
\begin{Mytheorem}[\secondtheorem][Not Galois]
This is my second theorem.
\end{Mytheorem}
\begin{Mytheorem}
This is my third theorem.
\end{Mytheorem}
Let's restate the first theorem: \firsttheorem
\newpage
\section{test}
\begin{Mytheorem}
This is my fourth theorem.
\end{Mytheorem}
Let's restate the first theorem: \firsttheorem
\begin{Mytheorem}
This is my fifth theorem.
\end{Mytheorem}
This is page-reference to the page where my first theorem
occurred the first time: \pageref{firsttheoremsfirstocurrence}%
This is reference to the number of my first theorem---the
hyperlink goes to the place where the theorem was stated
the first time: \ref{firsttheoremsfirstocurrence}%
\end{document}
%
%% End of file `theomac.sty'.