% \iffalse meta-comment % % Copyright (C) 2008 by Ulrich M. Schwarz % % This file may be distributed and/or modified under the conditions of % the LaTeX Project Public License, version 1.3a. % The license can be obtained from % http://www.latex-project.org/lppl/lppl-1-3a.txt % % \fi % %\iffalse (hide this from DocInput) %<*driver> \documentclass{ltxdoc} \usepackage[T1]{fontenc} \usepackage{fourier} \usepackage[scaled=0.8]{helvet} \usepackage{luximono} \usepackage{amsmath, amsthm} \usepackage{thm-restate} \newtheorem{lemma}{Lemma} \providecommand\pkg{\textsf} \GetFileInfo{thm-restate.sty} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \newcommand\thmrestate{\textsf{thm-restate}} \title{The \thmrestate\ package\thanks{% This file documents version~\fileversion\ of~\filedate, RCS ${}$Id: thm-restate.dtx,v 1.12 2008/03/09 20:06:09 ulmi Exp ${}$. }} \author{Ulrich M. Schwarz\thanks{ulmi@absatzen.de}} \maketitle \begin{abstract} This package provides one single environment, restatable, which lets you repeat whole theorems without retyping them. \end{abstract} \DocInput{thm-restate.dtx} \end{document} % %<*restate> %\fi % % \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 \~} % \CheckSum{160} % % \DoNotIndex{\@for,\addtocounter,\arabic,\csname,\endcsname,\cup,\CurrentOption} % \DoNotIndex{\{,\},\do,\define@key,\def,\DeclareOption,\else,\ensuremath,\expandafter} % \DoNotIndex{\hspace,\fi,\rule,\ifcase,\ifx,\in,\InputIfFileExists,\leq,\let,\mathpalette} % \DoNotIndex{\NeedsTeXFormat,\ldots,\ldotp,\newcommand,\newcounter,\or} % \DoNotIndex{\PackageInfo,\PackageWarning,\parm,\ProcessOptions,\protected@edef} % \DoNotIndex{\providecommand,\ProvidesPackage,\relax,\renewcommand,\RequirePackage} % \DoNotIndex{\setcounter,\setkeys,\rlap,\setminus,\widthof,\mathrm} % %\section{Usage} %\DescribeEnv{restatable} %Only one environment is provided: \verb|restatable|, which takes one %optional and two mandatory arguments. The first mandatory argument is the %type of the theorem, i.e. if you want |\begin{lemma}| to be called on %the inside, give |lemma|. The second argument is the name of the macro %that the text should be stored in, for example \verb|mylemma|. Be careful %not to specify existing command names! The optional argument will become the %optional argument to your theorem command. Consider the following example: %\begin{verbatim} % \documentclass{article} % \usepackage{amsmath, amsthm, thm-restate} % \newtheorem{lemma}{Lemma} % \begin{document} % \begin{restatable}[Zorn]{lemma}{zornlemma}\label{thm:zorn} % If every chain in $X$ is upper-bounded, % $X$ has a maximal element. % % It's true, you know! % \end{restatable} % \begin{lemma} % This is some other lemma of no import. % \end{lemma} % And now, here's Mr. Zorn again: \zornlemma* % \end{document} %\end{verbatim} %which yields % \begin{restatable}[Zorn]{lemma}{zornlemma}\label{thm:zorn} % If every chain in $X$ is upper-bounded, $X$ has a maximal element. % % It's true, you know! % \end{restatable} % \begin{lemma} % This is some other lemma of no import. % \end{lemma} % Actually, we have set a label in the environment, so we know that % it's Lemma~\ref{thm:zorn} on page~\ref{thm:zorn}. % And now, here's Mr. Zorn again: \zornlemma* % Since we prevent the label from being set again, we find that % it's still Lemma~\ref{thm:zorn} on page~\ref{thm:zorn}, even though % it occurs later also. % % \DescribeEnv{restatable*} % As you can see, we use the starred form |\mylemma*|. As in many cases in % \LaTeX, the star means ``don't give a number'', since we want to retain % the original number. There is also a starred variant of the |restatable| % environment, where the first call doesn't determine the number, but a % later call to |\mylemma| without star would. Since the number is carried % around using \LaTeX' |\label| machanism, you'll need a rerun for things to % settle. % % \subsection{Restrictions} % The only counter that is saved is the one for the theorem number. So, % putting floats inside a restatable is not advised. You cannot nest % restatables either. You \emph{can} use the |\restatable|\dots|\endrestatable| % version, but everything up to the next matching |\end{...}| is scooped up. % I've also probably missed many border cases. % % %\StopEventually{} %\section{Implementation} % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{thm-restate}[2008/03/09 v0.1beta2 thm-restate (ulmi)] \let\@xa\expandafter \let\@nx\noexpand \@ifundefined{c@thmt@dummyctr}{% \newcounter{thmt@dummyctr}% }{} \gdef\theHthmt@dummyctr{dummy.\arabic{thmt@dummyctr}}% \gdef\thethmt@dummyctr{}% \newtoks\thmt@toks \long\def\thmt@collect@body#1#2\end#3{% \@xa\thmt@toks\@xa{\the\thmt@toks #2}% \def\thmttmpa{#3}%\def\thmttmpb{restatable}% \ifx\thmttmpa\@currenvir%thmttmpb \@xa\@firstoftwo% this is the end of the environment. \else \@xa\@secondoftwo% go on collecting \fi{% \@xa#1\@xa{\the\thmt@toks}% }{% \@xa\thmt@toks\@xa{\the\thmt@toks\end{#3}}% \thmt@collect@body{#1}% }% } \newif\ifthmt@thisistheone \newenvironment{thmt@restatable}[3][]{% \long\def\thmrst@store##1{% \@xa\gdef\csname #3\endcsname{% \@ifstar{% \thmt@thisistheonefalse\csname thmt@stored@#3\endcsname }{% \thmt@thisistheonetrue\csname thmt@stored@#3\endcsname }% }% \@xa\long\@xa\gdef\csname thmt@stored@#3\@xa\endcsname\@xa{% \begingroup \ifthmt@thisistheone\else \@xa\protected@edef\csname the#2\endcsname{% \ifx\@refstar\@undefined\@xa\ref\else\@xa\@refstar\fi{thmt@@#3}}% \@xa\let\csname c@#2\endcsname=\c@thmt@dummyctr \@xa\let\csname theH#2\endcsname=\theHthmt@dummyctr \let\label=\@gobble \fi %\def\@currenvir{#2}% \csname #2\@xa\endcsname\ifx\@nx#1\@nx\else[#1]\fi \ifthmt@thisistheone \label{thmt@@#3}% \fi ##1 \csname end#2\endcsname \endgroup }% \csname #3\@xa\endcsname\ifthmt@thisistheone\else*\fi \@xa\end\@xa{\@currenvir} }% \thmt@collect@body\thmrst@store }{% %% now empty, just used as a marker. } \newenvironment{restatable}{% \thmt@thisistheonetrue\thmt@restatable }{% \endthmt@restatable } \newenvironment{restatable*}{% \thmt@thisistheonefalse\thmt@restatable }{% \endthmt@restatable } % \end{macrocode} %\iffalse % %\fi