% \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.16 2010/04/05 18:02:27 ulmi Exp ulmi ${}$. }} \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: they will appear in the % LoF several times with new numbers. % Equations should work, but the code handling them might turn out to be % brittle, in particular when you add/remove hyperref. % %In the same vein, numbered equations % %within the statement appear again and are numbered again, with new % %numbers. (This is vaguely non-trivial to do correctly if equations are not % %numbered consecutively, but per-chapter, or there are multiple numbered % %equations.) % Note that you cannot successfully reference the equations % since all labels are disabled in the starred appearance. (The reference % will point at the unstarred occurence.) % % 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}[2010/04/05 v0.1beta13 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}% }% } \def\thmt@trivialref#1{% \@xa\@xa\@xa\thmt@trivi@lr@f\csname r@#1\endcsname\@nil } \def\thmt@trivi@lr@f#1#2\@nil{#1} \def\thmt@innercounters{% equation} \def\thmt@counterformatters{% @alph,@Alph,@arabic,@roman,@Roman,@fnsymbol} \@for\displ:=\thmt@counterformatters\do{% \@xa\let\csname thmt@\displ\@xa\endcsname\csname \displ\endcsname }% \def\thmt@sanitizethe#1{% \@for\displ:=\thmt@counterformatters\do{% \@xa\protected@edef\csname\displ\endcsname##1{% \@nx\ifx\@xa\@nx\csname c@#1\endcsname ##1% \@xa\protect\csname \displ\endcsname{##1}% \@nx\else \@nx\csname thmt@\displ\endcsname{##1}% \@nx\fi }% }% \expandafter\protected@edef\csname the#1\endcsname{\csname the#1\endcsname}% \ifcsname theH#1\endcsname \expandafter\protected@edef\csname theH#1\endcsname{\csname theH#1\endcsname}% \fi } \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 \bgroup % ugly hack: save chapter,..subsection numbers % for equation numbers. \refstepcounter{thmt@dummyctr}% \def\@currentlabel{}% \@for\ctr:=\thmt@innercounters\do{% \thmt@sanitizethe{\ctr}% \protected@edef\@currentlabel{% \@currentlabel \protect\def\@xa\protect\csname the\ctr\endcsname{\csname the\ctr\endcsname}% \ifcsname theH\ctr\endcsname \protect\def\@xa\protect\csname theH\ctr\endcsname{\csname theH\ctr\endcsname}% \fi \protect\setcounter{\ctr}{\number\csname c@\ctr\endcsname}% }% }% \label{thmt@@#3@data}% \egroup \else \@xa\protected@edef\csname the#2\endcsname{% \thmt@trivialref{thmt@@#3}}% \@xa\let\csname c@#2\endcsname=\c@thmt@dummyctr \@xa\let\csname theH#2\endcsname=\theHthmt@dummyctr \let\label=\@gobble \let\ltx@label=\@gobble% amsmath needs this \def\thmt@restorecounters{}% \@for\ctr:=\thmt@innercounters\do{% \protected@edef\thmt@restorecounters{% \thmt@restorecounters \protect\setcounter{equation}{\arabic{equation}}% }% } \thmt@trivialref{thmt@@#3@data}% \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 \ifthmt@thisistheone\else\thmt@restorecounters\fi \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