diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/thmtools/thm-restate.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/thmtools/thm-restate.dtx | 112 |
1 files changed, 81 insertions, 31 deletions
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-restate.dtx b/Master/texmf-dist/source/latex/thmtools/thm-restate.dtx index 1abbee30f6c..8faec5f2fd4 100644 --- a/Master/texmf-dist/source/latex/thmtools/thm-restate.dtx +++ b/Master/texmf-dist/source/latex/thmtools/thm-restate.dtx @@ -101,21 +101,42 @@ \@xa\@firstoftwo% this is the end of the environment. \else \@xa\@secondoftwo% go on collecting - \fi{% + \fi{% this is the end, my friend, drop the \end. + % and call #1 with the collected body. \@xa#1\@xa{\the\thmt@toks}% - }{% + }{% go on collecting \@xa\thmt@toks\@xa{\the\thmt@toks\end{#3}}% \thmt@collect@body{#1}% }% } - +% \end{macrocode} +% A totally ignorant version of |\ref|, defaulting to \#2 if label not +% known yet. Otherwise, return the formatted number. +% \begin{macrocode} \def\thmt@trivialref#1#2{% \ifcsname r@#1\endcsname \@xa\@xa\@xa\thmt@trivi@lr@f\csname r@#1\endcsname\relax\@nil \else #2\fi } \def\thmt@trivi@lr@f#1#2\@nil{#1} - +% \end{macrocode} +% +% Counter safeties: some counters' values should be stored, such as +% equation, so we don't get a new number. (We cannot reference it anyway.) +% We cannot store everything, though, think page counter or section number! +% There is one problem here: we have to remove all references to other +% counters from |\theequation|, otherwise your equation could get a number +% like (3.1) in one place and (4.1) in another section. +% +% The best solution I can come up with is to override the usual macros +% that counter display goes through, to check if their argument is one +% that should be fully-expanded away or retained. +% +% The following should only be called from within a group, and the sanitized +% |\thectr| must not be called from within that group, since it needs the +% original |\@arabic| et al. +% +% \begin{macrocode} \def\thmt@innercounters{% equation} \def\thmt@counterformatters{% @@ -140,10 +161,38 @@ \fi } +\def\thmt@rst@storecounters#1{% + \bgroup + % ugly hack: save chapter,..subsection numbers + % for equation numbers. + \refstepcounter{thmt@dummyctr}% why is this here? + \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{% + (restate \protect\theHthmt@dummyctr)\csname theH\ctr\endcsname}% + \fi + \protect\setcounter{\ctr}{\number\csname c@\ctr\endcsname}% + }% + }% + \label{thmt@@#1@data}% + \egroup +}% +% \end{macrocode} +% +% Now, the main business. +% +% \begin{macrocode} \newif\ifthmt@thisistheone \newenvironment{thmt@restatable}[3][]{% - \thmt@toks{}% - \stepcounter{thmt@dummyctr}% + \thmt@toks{}% will hold body +% + \stepcounter{thmt@dummyctr}% used for data storage label. +% \long\def\thmrst@store##1{% \@xa\gdef\csname #3\endcsname{% \@ifstar{% @@ -155,57 +204,58 @@ \@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{% - (restate \protect\theHthmt@dummyctr)\csname theH\ctr\endcsname}% - \fi - \protect\setcounter{\ctr}{\number\csname c@\ctr\endcsname}% - }% - }% - \label{thmt@@#3@data}% - \egroup + % these are the valid numbers, store them for the other + % occasions. + \thmt@rst@storecounters{#3}% \else + % this one should use other numbers... + % first, fake the theorem number. \@xa\protected@edef\csname the#2\endcsname{% \thmt@trivialref{thmt@@#3}{??}}% + % if the number wasn't there, have a "re-run to get labels right" + % warning. \ifcsname r@thmt@@#3\endcsname\else \G@refundefinedtrue \fi + % prevent stepcountering the theorem number, + % but still, have some number for hyperref, just in case. \@xa\let\csname c@#2\endcsname=\c@thmt@dummyctr \@xa\let\csname theH#2\endcsname=\theHthmt@dummyctr + % disable labeling. \let\label=\@gobble \let\ltx@label=\@gobble% amsmath needs this + % We shall need to restore the counters at the end + % of the environment, so we get + % (4.2) [(3.1 from restate)] (4.3) \def\thmt@restorecounters{}% \@for\ctr:=\thmt@innercounters\do{% \protected@edef\thmt@restorecounters{% \thmt@restorecounters - \protect\setcounter{equation}{\arabic{equation}}% + \protect\setcounter{\ctr}{\arabic{\ctr}}% }% - } + }% + % pull the new semi-static definition of \theequation et al. + % from the aux file. \thmt@trivialref{thmt@@#3@data}{}% \fi - %\def\@currenvir{#2}% - \csname #2\@xa\endcsname\ifx\@nx#1\@nx\else[#1]\fi + % call the proper begin-env code, possibly with optional argument + \csname #2\@xa\endcsname\ifx\@nx#1\@nx\else[{#1}]\fi \ifthmt@thisistheone + % store a label so we can pick up the number later. \label{thmt@@#3}% \fi + % this will be the collected body. ##1 \csname end#2\endcsname + % if we faked the counter values, restore originals now. \ifthmt@thisistheone\else\thmt@restorecounters\fi \endgroup - }% + }% thmt@stored@#3 + % in either case, now call the just-created macro, \csname #3\@xa\endcsname\ifthmt@thisistheone\else*\fi + % and artificially close the current environment. \@xa\end\@xa{\@currenvir} - }% + }% thm@rst@store \thmt@collect@body\thmrst@store }{% %% now empty, just used as a marker. |