diff options
author | Karl Berry <karl@freefriends.org> | 2020-08-07 22:18:43 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-08-07 22:18:43 +0000 |
commit | d7359b696521401de6deaa4f70a6b40319cfa2a0 (patch) | |
tree | 8d45b41c17197de7a8514fb22f9c305a6ae9865d /Master/texmf-dist/source | |
parent | d6a7e0e5536b4924edec286797ed38021b94509d (diff) |
thmtools
git-svn-id: svn://tug.org/texlive/trunk@56068 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
5 files changed, 227 insertions, 95 deletions
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-kv.dtx b/Master/texmf-dist/source/latex/thmtools/thm-kv.dtx index bdac30899d8..78591262743 100644 --- a/Master/texmf-dist/source/latex/thmtools/thm-kv.dtx +++ b/Master/texmf-dist/source/latex/thmtools/thm-kv.dtx @@ -210,25 +210,47 @@ } \@for\tmp@keyname:=parent,numberwithin,within\do{% -\define@key{thmdef}{\tmp@keyname}{\thmt@trytwice{\thmt@setparent{#1}}{}}% + \define@key{thmdef}{\tmp@keyname}{% + \thmt@trytwice{% + \thmt@setparent{#1} + \thmt@setsibling{}% + }{}% + }% +} +\newcommand\thmt@setparent{% + \def\thmt@parent } \@for\tmp@keyname:=sibling,numberlike,sharenumber\do{% -\define@key{thmdef}{\tmp@keyname}{\thmt@trytwice{\thmt@setsibling{#1}}{}}% + \define@key{thmdef}{\tmp@keyname}{% + \thmt@trytwice{% + \thmt@setsibling{#1}% + \thmt@setparent{}% + }{}% + }% +} +\newcommand\thmt@setsibling{% + \def\thmt@sibling } \@for\tmp@keyname:=title,name,heading\do{% -\define@key{thmdef}{\tmp@keyname}{\thmt@trytwice{\thmt@setthmname{#1}}{}}% + \define@key{thmdef}{\tmp@keyname}{\thmt@trytwice{\thmt@setthmname{#1}}{}}% +} +\newcommand\thmt@setthmname{% + \def\thmt@thmname } \@for\tmp@keyname:=unnumbered,starred\do{% -\define@key{thmdef}{\tmp@keyname}[]{\thmt@trytwice{\thmt@isnumberedfalse}{}}% + \define@key{thmdef}{\tmp@keyname}[]{\thmt@trytwice{\thmt@isnumberedfalse}{}}% } \def\thmt@YES{yes} \def\thmt@NO{no} \def\thmt@UNIQUE{unless unique} -\define@key{thmdef}{numbered}[\thmt@YES]{ +\newif\ifthmt@isnumbered +\newif\ifthmt@isunlessunique + +\define@key{thmdef}{numbered}[yes]{ \def\thmt@tmp{#1}% \thmt@trytwice{% \ifx\thmt@tmp\thmt@YES @@ -237,27 +259,38 @@ \thmt@isnumberedfalse \else\ifx\thmt@tmp\thmt@UNIQUE \RequirePackage[unq]{unique} - \ifuniq{\thmt@envname}{% - \thmt@isnumberedfalse - }{% - \thmt@isnumberedtrue - }% + \thmt@isunlessuniquetrue \else \PackageError{thmtools}{Unknown value `#1' to key numbered}{}% \fi\fi\fi }{% trytwice: after definition \ifx\thmt@tmp\thmt@UNIQUE - \addtotheorempreheadhook[\thmt@envname]{\setuniqmark{\thmt@envname}}% - \addtotheorempreheadhook[\thmt@envname]{\def\thmt@dummyctrautorefname{\thmt@thmname\@gobble}} + \ifx\thmt@parent\@empty + \addtotheorempreheadhook[\thmt@envname]{\setuniqmark{\thmt@envname}}% + \else + \protected@edef\thmt@tmp{% + % expand \thmt@envname and \thmt@parent + \@nx\addtotheorempreheadhook[\thmt@envname @unique]{\@nx\setuniqmark{\thmt@envname.\@nx\@nameuse{the\thmt@parent}}}% + \@nx\addtotheorempreheadhook[\thmt@envname @numbered]{\@nx\setuniqmark{\thmt@envname.\@nx\@nameuse{the\thmt@parent}}}% + \@nx\addtotheorempreheadhook[\thmt@envname @unique]{\def\@nx\thmt@dummyctrautorefname{\thmt@thmname\@nx\@gobble}}% + \@nx\addtotheorempreheadhook[\thmt@envname @numbered]{\def\@nx\thmt@dummyctrautorefname{\thmt@thmname\@nx\@gobble}}% + }% + \thmt@tmp + \fi + % \addtotheorempreheadhook[\thmt@envname]{\def\thmt@dummyctrautorefname{\thmt@thmname\@gobble}}% \fi }% } -\define@key{thmdef}{preheadhook}{\thmt@trytwice{}{\addtotheorempreheadhook[\thmt@envname]{#1}}} -\define@key{thmdef}{postheadhook}{\thmt@trytwice{}{\addtotheorempostheadhook[\thmt@envname]{#1}}} -\define@key{thmdef}{prefoothook}{\thmt@trytwice{}{\addtotheoremprefoothook[\thmt@envname]{#1}}} -\define@key{thmdef}{postfoothook}{\thmt@trytwice{}{\addtotheorempostfoothook[\thmt@envname]{#1}}} +\define@key{thmdef}{preheadhook}{% + \thmt@trytwice{}{\addtotheorempreheadhook[\thmt@envname]{#1}}} +\define@key{thmdef}{postheadhook}{% + \thmt@trytwice{}{\addtotheorempostheadhook[\thmt@envname]{#1}}} +\define@key{thmdef}{prefoothook}{% + \thmt@trytwice{}{\addtotheoremprefoothook[\thmt@envname]{#1}}} +\define@key{thmdef}{postfoothook}{% + \thmt@trytwice{}{\addtotheorempostfoothook[\thmt@envname]{#1}}} \define@key{thmdef}{style}{\thmt@trytwice{\thmt@setstyle{#1}}{}} @@ -296,52 +329,116 @@ } \fi -\newif\ifthmt@isnumbered -\newcommand\thmt@setparent[1]{% - \def\thmt@parent{#1}% -} -\newcommand\thmt@setsibling{% - \def\thmt@sibling -} -\newcommand\thmt@setthmname{% - \def\thmt@thmname -} \thmt@mkextendingkeyhandler{thmdef}{thmdef}{\string\declaretheorem\space key} \let\thmt@newtheorem\newtheorem +% \declaretheorem[option list 1]{thmname list}[option list 1] +% #1 = option list 1 +% #2 = thmname list \newcommand\declaretheorem[2][]{% + % TODO: use \NewDocumentCommand from xparse? + % xparse will be part of latex2e format from latex2e 2020 Oct. + \@ifnextchar[% + {\declaretheorem@i{#1}{#2}} + {\declaretheorem@i{#1}{#2}[]}% +} +\@onlypreamble\declaretheorem + +% #1 = option list 1 +% #2 = thmname list +% #3 = option list 2 +\def\declaretheorem@i#1#2[#3]{% + \@for\thmt@tmp:=#2\do{% + % strip spaces, \KV@@sp@def is defined in keyval.sty + \@xa\KV@@sp@def\@xa\thmt@tmp\@xa{\thmt@tmp}% + \@xa\declaretheorem@ii\@xa{\thmt@tmp}{#1,#3}% + }% +} + +% #1 = single thmname (#1 and #2 are exchanged) +% #2 = option list +\def\declaretheorem@ii#1#2{% % why was that here? %\let\thmt@theoremdefiner\thmt@original@newtheorem - \def\thmt@envname{#2}% - \thmt@setthmname{\thmt@modifycase #2}% + % init options \thmt@setparent{}% \thmt@setsibling{}% - \thmt@isnumberedtrue% - \@thmt@firstkeysettrue% - \kvsetkeys{thmdef0}{#1}% - \kvsetkeys{thmdef}{#1}% + \thmt@isnumberedtrue + \thmt@isunlessuniquefalse + \def\thmt@envname{#1}% + \thmt@setthmname{\thmt@modifycase #1}% + % use true code in \thmt@trytwice{<true>}{<false>} + \@thmt@firstkeysettrue + % parse options + \kvsetkeys{thmdef0}{#2}% parse option "style" first + \kvsetkeys{thmdef}{#2}% + % call patched \newtheorem + \ifthmt@isunlessunique + \ifx\thmt@parent\@empty + % define normal "unless unique" thm env + \ifuniq{#1}{\thmt@isnumberedfalse}{\thmt@isnumberedtrue}% + \declaretheorem@iii{#1}% + \else + % define special "unless unique" thm env, + % when "numbered=unless unique" and "numberwithin=<counter>" are both used + \declaretheorem@iv{#1}% + \thmt@isnumberedtrue + \declaretheorem@iii{#1@numbered}% + \thmt@isnumberedfalse + \declaretheorem@iii{#1@unique}% + \fi + \else + % define normal thm env + \declaretheorem@iii{#1}% + \fi + % use false code in \thmt@trytwice{<true>}{<false>} + \def\thmt@envname{#1}% + \@thmt@firstkeysetfalse + % uniquely ugly kludge: some keys make only sense afterwards. + % and it gets kludgier: again, the default-inherited + % keys need to have a go at it. + \kvsetkeys{thmdef0}{#2}% + \kvsetkeys{thmdef}{#2}% +} + +% define normal thm env, call \thmt@newtheorem +\def\declaretheorem@iii#1{% \protected@edef\thmt@tmp{% \@nx\thmt@newtheorem - \ifthmt@isnumbered\else *\fi - {#2}% - \ifx\thmt@sibling\@empty\else [\thmt@sibling]\fi - {\thmt@thmname}% - \ifx\thmt@parent\@empty\else [\thmt@parent]\fi + \ifthmt@isnumbered + {#1}% + \ifx\thmt@sibling\@empty\else [\thmt@sibling]\fi + {\thmt@thmname}% + \ifx\thmt@parent\@empty\else [\thmt@parent]\fi + \else + *{#1}{\thmt@thmname}% + \fi \relax% added so we can delimited-read everything later - % (recall newtheorem is patched) - }%\show\thmt@tmp + }% + \thmt@debug{Define theorem `#1' by ^^J\meaning\thmt@tmp}% + \thmt@tmp +} + +% define special thm env +\def\declaretheorem@iv#1{% + \protected@edef\thmt@tmp{% + % expand \thmt@envname and \thmt@parent + \@nx\newenvironment{#1}{% + \@nx\ifuniq{\thmt@envname.\@nx\@nameuse{the\thmt@parent}}{% + \def\@nx\thmt@rawenvname{#1@unique}% + }{% + \def\@nx\thmt@rawenvname{#1@numbered}% + }% + \begin{\@nx\thmt@rawenvname}% + }{% + \end{\@nx\thmt@rawenvname}% + }% + }% + \thmt@debug{Define special theorem `#1' by ^^J\meaning\thmt@tmp}% \thmt@tmp - % uniquely ugly kludge: some keys make only sense - % afterwards. - % and it gets kludgier: again, the default-inherited - % keys need to have a go at it. - \@thmt@firstkeysetfalse% - \kvsetkeys{thmdef0}{#1}% - \kvsetkeys{thmdef}{#1}% } -\@onlypreamble\declaretheorem \providecommand\thmt@quark{\thmt@quark} @@ -379,13 +476,14 @@ \def\thmt@shortoptarg{#1}% \fi } -\def\thmt@splitopt#1=#2\thmt@quark{% - \def\thmt@tmpkey{#1}% - \ifx\thmt@tmpkey\@empty - \def\thmt@tmpkey{\thmt@quark}% - \fi - \@onelevel@sanitize\thmt@tmpkey -} +% FIXME: not used? +% \def\thmt@splitopt#1=#2\thmt@quark{% +% \def\thmt@tmpkey{#1}% +% \ifx\thmt@tmpkey\@empty +% \def\thmt@tmpkey{\thmt@quark}% +% \fi +% \@onelevel@sanitize\thmt@tmpkey +% } \def\thmt@thmuse@families{thm@track@keys} diff --git a/Master/texmf-dist/source/latex/thmtools/thm-listof.dtx b/Master/texmf-dist/source/latex/thmtools/thm-listof.dtx index 39603b4341d..cb5b7e380a4 100644 --- a/Master/texmf-dist/source/latex/thmtools/thm-listof.dtx +++ b/Master/texmf-dist/source/latex/thmtools/thm-listof.dtx @@ -80,16 +80,15 @@ \newcommand\listoftheorems[1][]{% %% much hacking here to pick up the definition from the class %% without oodles of conditionals. - \bgroup + \begingroup \setlisttheoremstyle{#1}% \let\listfigurename\listtheoremname \def\contentsline##1{% \csname thmt@contentsline@##1\endcsname{##1}% }% \@for\thmt@envname:=\thmt@allenvs\do{% - \@xa\protected@edef\csname l@\thmt@envname\endcsname{% CHECK: why p@edef? - \@nx\@dottedtocline{1}{1.5em}{\@nx\thmt@listnumwidth}% - }% + % CHECK: is \cs{l@\thmt@envname} repeatedly defined? + \thmtlo@newentry }% \let\thref@starttoc\@starttoc \def\@starttoc##1{\thref@starttoc{loe}}% @@ -108,7 +107,7 @@ }% %\expandafter \listoffigures - \egroup + \endgroup } \newcommand\setlisttheoremstyle[1]{% @@ -123,25 +122,60 @@ % FMi 2019-09-31 allow local title \define@key{thmt-listof}{title}{\def\listtheoremname{#1}} % -- FMi +\newif\ifthmt@listswap +\def\thmt@TRUE{true} +\def\thmt@FALSE{false} +\define@key{thmt-listof}{swapnumber}[true]{% + \def\thmt@tmp{#1}% + \ifx\thmt@tmp\thmt@TRUE + \thmt@listswaptrue + \else\ifx\thmt@tmp\thmt@FALSE + \thmt@listswapfalse + \else + \PackageError{thmtools}{Unknown value `#1' to key swapnumber}{}% + \fi\fi +} -\providecommand\thmt@listnumwidth{2.3em} +\ifdefined\@tocline + % for ams classes (amsart.cls, amsproc.cls, amsbook.cls) which + % don't use \@dottedtocline and don't provide \@dotsep + \def\thmtlo@newentry{% + \@xa\def\csname l@\thmt@envname\endcsname{% CHECK: why p@edef? + % similar to \l@figure defined in ams classes + \@tocline{0}{3pt plus2pt}{0pt}{\thmt@listnumwidth}{}% + }% + } + \providecommand*\thmt@listnumwidth{1.5pc} +\else + \def\thmtlo@newentry{% + \@xa\def\csname l@\thmt@envname\endcsname{% CHECK: why p@edef? + \@dottedtocline{1}{1.5em}{\thmt@listnumwidth}% + }% + } + \providecommand*\thmt@listnumwidth{2.3em} +\fi \providecommand\thmtformatoptarg[1]{ (#1)} \newcommand\thmt@mklistcmd{% - \@xa\protected@edef\csname l@\thmt@envname\endcsname{% CHECK: why p@edef? - \@nx\@dottedtocline{1}{1.5em}{\@nx\thmt@listnumwidth}% - }% + \thmtlo@newentry \ifthmt@isstarred \@xa\def\csname ll@\thmt@envname\endcsname{% - \protect\numberline{\protect\let\protect\autodot\protect\@empty}% + \protect\ifthmt@listswap + \protect\else + \protect\numberline{\protect\let\protect\autodot\protect\@empty}% + \protect\fi \thmt@thmname \ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi }% \else \@xa\def\csname ll@\thmt@envname\endcsname{% - \protect\numberline{\csname the\thmt@envname\endcsname}% - \thmt@thmname + \protect\ifthmt@listswap + \thmt@thmname~\csname the\thmt@envname\endcsname + \protect\else + \protect\numberline{\csname the\thmt@envname\endcsname}% + \thmt@thmname + \protect\fi \ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi }% \fi diff --git a/Master/texmf-dist/source/latex/thmtools/thm-llncs.dtx b/Master/texmf-dist/source/latex/thmtools/thm-llncs.dtx index 134acb18b7c..994067050e9 100644 --- a/Master/texmf-dist/source/latex/thmtools/thm-llncs.dtx +++ b/Master/texmf-dist/source/latex/thmtools/thm-llncs.dtx @@ -71,7 +71,7 @@ {\thmt@thmname}% \ifthmt@hasparent [\thmt@parent]\fi {\thmt@style@headfont}{\thmt@style@bodyfont}% - } + }% \thmt@args \thmt@newtheorem@postdefinition } diff --git a/Master/texmf-dist/source/latex/thmtools/thmdef-mdframed.dtx b/Master/texmf-dist/source/latex/thmtools/thmdef-mdframed.dtx index 85c5d9bd2d1..cae264b04eb 100644 --- a/Master/texmf-dist/source/latex/thmtools/thmdef-mdframed.dtx +++ b/Master/texmf-dist/source/latex/thmtools/thmdef-mdframed.dtx @@ -24,8 +24,7 @@ \thmt@trytwice{}{% \RequirePackage{mdframed}% \RequirePackage{thm-patch}% - \addtotheorempreheadhook[\thmt@envname]{% - \begin{mdframed}[#1]}% + \addtotheorempreheadhook[\thmt@envname]{\begin{mdframed}[#1]}% \addtotheorempostfoothook[\thmt@envname]{\end{mdframed}}% }% } diff --git a/Master/texmf-dist/source/latex/thmtools/unique.dtx b/Master/texmf-dist/source/latex/thmtools/unique.dtx index bf013ca6d48..f2fff48a07e 100644 --- a/Master/texmf-dist/source/latex/thmtools/unique.dtx +++ b/Master/texmf-dist/source/latex/thmtools/unique.dtx @@ -15,7 +15,7 @@ %<*code> %\fi % Two macros are provided: |\setuniqmark| takes a single parameter, -% the name, which should be a string of letters. |\ifuniqmark| takes +% the name, which should be a string of letters. |\ifuniq| takes % three parameters: a name, a true-part and a false-part. The true % part is executed if and only if there was exactly one call to % |\setuniqmark| with the given name during the previous \LaTeX\ run. @@ -58,17 +58,18 @@ % \begin{macrocode} \newcommand\setuniqmark[1]{% \expandafter\ifx\csname uniq@now@#1\endcsname\relax - \global\@namedef{uniq@now@#1}{\uniq@ONE}% + \global\@namedef{uniq@now@#1}{\uniq@ONE}% \else - \expandafter\ifx\csname uniq@now@#1\endcsname\uniq@MANY\else - \immediate\write\uniq@channel{% - \string\uniq@setmany{#1}% - }% - \ifuniq{#1}{% - \uniq@warnnotunique{#1}% - }{}% - \fi - \global\@namedef{uniq@now@#1}{\uniq@MANY}% + \expandafter\ifx\csname uniq@now@#1\endcsname\uniq@MANY + \else + \immediate\write\uniq@channel{% + \string\uniq@setmany{#1}% + }% + \ifuniq{#1}{% + \uniq@warnnotunique{#1}% + }{}% + \fi + \global\@namedef{uniq@now@#1}{\uniq@MANY}% \fi } % \end{macrocode} @@ -77,19 +78,19 @@ % \begin{macro}{\ifuniq} % Companion to |\setuniqmark|: if the uniqmark given in the first % argument was called more than once, execute the second argument, -% otherwise execute the first argument. Note than no call to +% otherwise execute the third argument. Note that no call to % |\setuniqmark| for a particular uniqmark at all means that this % uniqmark is unique. % -% This is a lazy version: we could always say false if we already had two calls -% to setuniqmark this run, but we have to rerun for any ifuniq prior -% to the first setuniqmark anyway, so why bother? +% This is a lazy version: we could always say false if we already had two +% calls to |\setuniqmark| this run, but we have to rerun for any |\ifuniq| +% prior to the first setuniqmark anyway, so why bother? % \begin{macrocode} \newcommand\ifuniq[1]{% \expandafter\ifx\csname uniq@last@#1\endcsname\uniq@MANY - \expandafter \@secondoftwo + \expandafter\@secondoftwo \else - \expandafter\@firstoftwo + \expandafter\@firstoftwo \fi } % \end{macrocode} @@ -124,11 +125,11 @@ % \begin{macrocode} \def\uniq@warnifunique#1{% \expandafter\ifx\csname uniq@now@#1\endcsname\uniq@MANY\else - \PackageWarningNoLine{uniq}{% - `#1' is unique now.\MessageBreak - Rerun LaTeX to pick up the change% - }% - \@uniq@reruntrue + \PackageWarningNoLine{uniq}{% + `#1' is unique now.\MessageBreak + Rerun LaTeX to pick up the change% + }% + \@uniq@reruntrue \fi } % \end{macrocode} @@ -153,10 +154,10 @@ % \begin{macrocode} \def\uniq@maybesuggestrerun{% \if@uniq@rerun - \PackageWarningNoLine{uniq}{% - Uniquenesses have changed. \MessageBreak - Rerun LaTeX to pick up the change% - }% + \PackageWarningNoLine{uniq}{% + Uniquenesses have changed. \MessageBreak + Rerun LaTeX to pick up the change% + }% \fi } % \end{macrocode} |