diff options
author | Karl Berry <karl@freefriends.org> | 2024-01-03 21:18:51 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-01-03 21:18:51 +0000 |
commit | 1e7f7766f2fd93956c4b9bbb7c91ea1f682cef47 (patch) | |
tree | 547c621d1f24f92f9f003cbfe9e4508d44111bba /Master/texmf-dist/tex/latex/memoize | |
parent | 9fe5b3b4175b31a43a984d069b3aaae580e130a7 (diff) |
memoize (3jan24)
git-svn-id: svn://tug.org/texlive/trunk@69285 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/memoize')
-rw-r--r-- | Master/texmf-dist/tex/latex/memoize/memoizable.sty | 13 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/memoize/memoize.sty | 401 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/memoize/nomemoize.sty | 41 |
3 files changed, 291 insertions, 164 deletions
diff --git a/Master/texmf-dist/tex/latex/memoize/memoizable.sty b/Master/texmf-dist/tex/latex/memoize/memoizable.sty index 1b3da7cb3c8..dcf74a4765d 100644 --- a/Master/texmf-dist/tex/latex/memoize/memoizable.sty +++ b/Master/texmf-dist/tex/latex/memoize/memoizable.sty @@ -24,16 +24,9 @@ %% %% The files belonging to this work and covered by LPPL are listed in %% (<texmf>/doc/generic/memoize/)FILES. -\ProvidesPackage{memoizable}[2023/10/10 v1.0.0 A programmer's stub for Memoize] -\@ifpackageloaded{memoize}% -{\endinput}{} -\@ifpackageloaded{nomemoize}% -{\endinput}{}% -\def\mmzset#1{\ignorespaces} -\def\nommzkeys{\pgfqkeys{/mmz}} -\pgfqkeys{/mmz}{.unknown/.code={\pgfkeysdef{\pgfkeyscurrentkey}{}}} -\newif\ifmemoize -\newcommand\IfMemoizing[2][]{\@secondoftwo} +\ProvidesPackage{memoizable}[2024/1/02 v1.1.0 A programmer's stub for Memoize] +\RequirePackage{pgfkeys} +\input memoizable.code.tex \endinput %% %% End of file `memoizable.sty'. diff --git a/Master/texmf-dist/tex/latex/memoize/memoize.sty b/Master/texmf-dist/tex/latex/memoize/memoize.sty index b0cf09962e4..936dae64ef2 100644 --- a/Master/texmf-dist/tex/latex/memoize/memoize.sty +++ b/Master/texmf-dist/tex/latex/memoize/memoize.sty @@ -24,8 +24,7 @@ %% %% The files belonging to this work and covered by LPPL are listed in %% (<texmf>/doc/generic/memoize/)FILES. -\ProvidesPackage{memoize}[2023/10/10 v1.0.0 Fast and flexible externalization] -\RequirePackage{pgfopts} % pgfkeys-based package options +\ProvidesPackage{memoize}[2024/1/02 v1.1.0 Fast and flexible externalization] \RequirePackage{etoolbox} \ifdefined\luatexversion \directlua{memoize = {}} @@ -49,8 +48,14 @@ }% } \RequirePackage{advice} -\@ifpackageloaded{nomemoize}% -{% +\def\ifmmz@loadstatus#1{% + \ifnum#1=0\csname mmz@loadstatus\endcsname\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\ifmmz@loadstatus{3}{% \PackageError{memoize}{Cannot load the package, as "nomemoize" is already loaded. Memoization will NOT be in effect}{Packages "memoize" and "nomemoize" are mutually exclusive, please load either one or the other.}% @@ -58,8 +63,7 @@ \ProcessPgfPackageOptions{/memoize/package options} \endinput }{}% -\@ifpackageloaded{memoizable}% -{% +\ifmmz@loadstatus{2}{% \PackageError{memoize}{Cannot load the package, as "memoizable" is already loaded}{Package "memoizable" is loaded by packages which support memoization. Memoize must be loaded before all such packages. The @@ -73,8 +77,10 @@ \ProcessPgfPackageOptions{/memoize/package options} \endinput }{}% +\ifmmz@loadstatus{1}{\endinput}{}% +\def\mmz@loadstatus{1}% \def\filetotoks#1#2{% - \immediate\openin0{#2}% + \immediate\mmz@openin0{#2}% #1={}% \loop \unless\ifeof0 @@ -83,6 +89,8 @@ \repeat \immediate\closein0 } +\let\mmz@openin\openin +\let\mmz@openout\openout \newif\ifmmz@temp \newtoks\mmz@temptoks \newbox\mmz@box @@ -98,6 +106,7 @@ disable/.code=\memoizefalse, }, enable, + options/.style={#1}, } \def\mmz@mode@normal{0} \def\mmz@mode@readonly{1} @@ -109,69 +118,83 @@ recompile/.code={\let\mmz@mode\mmz@mode@recompile}, } \mmzset{% - path/.code={\pgfqkeys{/mmz/path}{#1}}, - path/.cd, - relative/.is if=mmz@relativepath, - dir/.store in=\mmz@dir, - dir/.value required, - prefix/.store in=\mmz@prefix, - prefix/.value required, -} -\newif\ifmmz@relativepath + prefix/.code={\mmz@parse@prefix{#1}}, +} +\begingroup +\catcode`\/=12 +\gdef\mmz@parse@prefix#1{% + \edef\mmz@prefix{\detokenize\expandafter{\expanded{#1}}}% + \def\mmz@prefix@dir{}% + \def\mmz@prefix@name{}% + \expandafter\mmz@parse@prefix@i\mmz@prefix/\mmz@eov +} +\gdef\mmz@parse@prefix@i#1/#2{% + \ifx\mmzeov#2% + \def\mmz@prefix@name{#1}% + \else + \appto\mmz@prefix@dir{#1/}% + \expandafter\mmz@parse@prefix@i\expandafter#2% + \fi +} +\endgroup \mmzset{% begindocument/.append style={ - path/.append code=\mmz@maybe@mkmemodir\mmz@record@prefix, + prefix/.append code=\mmz@maybe@mkmemodir\mmz@record@prefix, }, begindocument/.append code=\mmz@maybe@mkmemodir, } -\def\mmz@dir@path{\ifmmz@relativepath.\fi/\mmz@dir} -\def\mmz@prefix@path{\mmz@dir@path/\mmz@prefix} \mmzset{ mkdir/.is if=mmz@mkdir, - mkdir command/.code={\def\mmz@mkdir@command##1{#1}}, - mkdir command={mkdir "#1"}, + mkdir command/.store in=\mmz@mkdir@command, + mkdir command={}, } \newif\ifmmz@mkdir +\mmz@mkdirtrue \def\mmz@maybe@mkmemodir{% \ifmmz@mkdir - \pdf@system{\mmz@mkdir@command{\mmzOutputDirectory\mmz@dir@path}}% + \ifdefempty\mmz@mkdir@command{}{% + \ifdefempty\mmz@prefix@dir{}{% + \mmz@remove@quotes{\mmz@prefix@dir}\mmz@temp + \pdf@system{\mmz@mkdir@command\space"\mmz@temp"}% + }% + }% \fi } \mmzset{% - memo dir/.style={ - mkdir, - path={ - relative, - dir={#1.memo.dir}, - prefix={}, - }, - }, - memo dir/.default=\mmzUnquote\jobname, - no memo dir/.style={ - mkdir=false, - path={ - relative, - dir={}, - prefix={#1.}, - }, - }, - no memo dir/.default=\mmzUnquote\jobname, + memo dir/.style={prefix={#1.memo.dir/}}, + memo dir/.default=\jobname, + no memo dir/.style={prefix={#1.}}, + no memo dir/.default=\jobname, no memo dir, } -\def\mmzUnquote#1{\expanded{\noexpand\mmz@unquote#1}\mmz@unquote@end} -\def\mmz@unquote#1{% - \ifx\mmz@unquote@end#1% +\def\mmz@remove@quotes#1#2{% + \def\mmz@remove@quotes@end{\let#2\mmz@temp}% + \def\mmz@temp{}% + \expanded{% + \noexpand\mmz@remove@quotes@i + \detokenize\expandafter{\expanded{#1}}% + "\noexpand\mmz@eov + }% +} +\def\mmz@remove@quotes@i{% + \CollectArgumentsRaw + {\collargsBraceCollectedfalse + \collargsNoDelimiterstrue + \collargsAppendPostwrap{{##1}}% + }% + {u"u\mmz@eov}% + \mmz@remove@quotes@ii +} +\def\mmz@remove@quotes@ii#1#2{% + \appto\mmz@temp{#1}% + \ifx&% + \mmz@remove@quotes@end + \expandafter\@gobble \else - \ifx"#1% - \expandafter\expandafter\expandafter\mmz@unquote@quotes - \else - \expandafter\expandafter\expandafter\mmz@unquote@noquotes - \expandafter\expandafter\expandafter#1% - \fi + \expandafter\@firstofone \fi + {\mmz@remove@quotes@i#2\mmz@eov}% } -\def\mmz@unquote@quotes#1"\mmz@unquote@end{#1} -\def\mmz@unquote@noquotes#1\mmz@unquote@end{#1} \newif\ifmmz@ignorespaces \mmzset{ ignore spaces/.is if=mmz@ignorespaces, @@ -388,12 +411,13 @@ \gtoksapp\mmzCMemo{\global\mmzUnmemoizabletrue}% \mmz@write@cmemo \mmz@trace@endmemoize@unmemoizable - \PackageWarning{memoize}{Marking this code as unmemoizable}% + \PackageInfo{memoize}{Marking this code as unmemoizable}% \else \ifmmz@abort \mmz@trace@endmemoize@aborted - \PackageWarning{memoize}{Memoization was aborted}% - \mmz@write@empty@cmemo + \PackageInfo{memoize}{Memoization was aborted}% + \mmz@compute@context@mdfivesum + \mmz@write@cmemo \else \mmz@compute@context@mdfivesum \mmz@write@cmemo @@ -487,7 +511,7 @@ \fi } \def\mmz@Ifmemoizing@nogrouplevel{0\relax\relax\fi\iftrue} -\def\mmz@trace#1{\immediate\write16{[tracing memoize] #1}} +\def\mmz@trace#1{\advice@typeout{[tracing memoize] #1}} \def\mmz@trace@context{\mmz@trace{\space\space Context: "\expandonce{\mmz@context@key}" --> \mmz@context@mdfivesum}} \def\mmz@trace@Memoize@on{% @@ -600,22 +624,23 @@ }, clear context/.value forbidden, meaning to context/.code={\forcsvlist\mmz@mtoc{#1}}, - csname meaning to context/.code={\mmz@mtoc@cs{#1}}, - key meaning to context/.code={\forcsvlist\mmz@mtoc\mmz@mtoc@keycmd{#1}}, + csname meaning to context/.code={\mmz@mtoc@csname{#1}}, + key meaning to context/.code={% + \forcsvlist\mmz@mtoc\mmz@mtoc@keycmd{#1}}, key value to context/.code={\forcsvlist\mmz@mtoc@key{#1}}, - /handlers/.meaning to context/.code={% - \expanded{\noexpand\mmz@mtoc@cs{pgfk@\pgfkeyscurrentpath/.@cmd}}}, + /handlers/.meaning to context/.code={\expanded{% + \noexpand\mmz@mtoc@csname{pgfk@\pgfkeyscurrentpath/.@cmd}}}, /handlers/.value to context/.code={% - \expanded{\noexpand\mmz@mtoc@cs{pgfk@\pgfkeyscurrentpath}}}, + \expanded{\noexpand\mmz@mtoc@csname{pgfk@\pgfkeyscurrentpath}}}, } \def\mmz@mtoc#1{% \collargs@cs@cases{#1}% {\mmz@mtoc@cmd{#1}}% {\mmz@mtoc@error@notcsorenv{#1}}% {% - \mmz@mtoc@cs{% + \mmz@mtoc@csname{% #1}% - \mmz@mtoc@cs{% + \mmz@mtoc@csname{% end% #1}% }% @@ -624,19 +649,20 @@ \begingroup \escapechar=-1 \expandafter\endgroup - \expandafter\mmz@mtoc@cs\expandafter{\string#1}% + \expandafter\mmz@mtoc@csname\expandafter{\string#1}% } -\def\mmz@mtoc@cs#1{% +\def\mmz@mtoc@csname#1{% \pgfkeysvalueof{/mmz/context/.@cmd}% - \expandafter\string\csname#1\endcsname={\expandafter\meaning\csname#1\endcsname}% + \detokenize{#1}={\expandafter\meaning\csname#1\endcsname}% \pgfeov } -\def\mmz@mtoc@key#1{\mmz@mtoc@cs{pgfk@#1}} -\def\mmz@mtoc@key#1{\mmz@mtoc@cs{pgfk@#1/.@cmd}} +\def\mmz@mtoc@key#1{\mmz@mtoc@csname{pgfk@#1}} +\def\mmz@mtoc@keycmd#1{\mmz@mtoc@csname{pgfk@#1/.@cmd}} \def\mmz@mtoc@error@notcsorenv#1{% - \PackageError{memoize}{'\detokenize{#1}' passed to key 'meaning to context' is neither a command nor an environment}{}% + \PackageError{memoize}{'\detokenize{#1}' passed to key 'meaning to context' + is neither a command nor an environment}{}% } -\def\mmz@cmemo@path{\mmz@prefix@path\mmz@code@mdfivesum.memo} +\def\mmz@cmemo@path{\mmz@prefix\mmz@code@mdfivesum.memo} \newtoks\mmzCMemo \mmzset{% include source in cmemo/.is if=mmz@include@source, @@ -644,7 +670,7 @@ \newif\ifmmz@include@source \mmz@include@sourcetrue \def\mmz@write@cmemo{% - \immediate\openout\mmz@out{\mmz@cmemo@path}% + \immediate\mmz@openout\mmz@out{\mmz@cmemo@path}% \immediate\write\mmz@out{\noexpand\mmzMemo}% \immediate\write\mmz@out{% \global\mmzContextExtra{\the\mmzContextExtra}\collargs@percentchar @@ -657,10 +683,6 @@ \immediate\closeout\mmz@out \pgfkeysalso{/mmz/record/new cmemo={\mmz@cmemo@path}}% } -\def\mmz@write@empty@cmemo{% - \immediate\openout\mmz@out{\mmz@cmemo@path}% - \immediate\closeout\mmz@out -} \let\mmzSource\endinput \def\mmz@process@cmemo{% \mmz@trace@process@cmemo @@ -692,7 +714,7 @@ \xdef\mmz@context@mdfivesum{\pdf@mdfivesum{\expandonce\mmz@context@key}}% } \def\mmz@ccmemo@path{% - \mmz@prefix@path\mmz@code@mdfivesum-\mmz@context@mdfivesum.memo} + \mmz@prefix\mmz@code@mdfivesum-\mmz@context@mdfivesum.memo} \newtoks\mmzCCMemo \newif\ifmmz@include@context \mmzset{% @@ -703,7 +725,7 @@ direct ccmemo input/.is if=mmz@direct@ccmemo@input, } \def\mmz@write@ccmemo{% - \immediate\openout\mmz@out{\mmz@ccmemo@path}% + \immediate\mmz@openout\mmz@out{\mmz@ccmemo@path}% \begingroup \the\mmz@ccmemo@resources \endgroup @@ -723,7 +745,7 @@ \string\mmzResource{\mmz@extern@name}\collargs@percentchar}% } \def\mmzResource#1{% - \ifnum0\pdf@filesize{\mmz@dir@path/#1}=0 + \ifnum0\pdf@filesize{\mmz@prefix@dir/#1}=0 \ifmmz@direct@ccmemo@input \let\mmzMemo\endinput \else @@ -784,11 +806,11 @@ } \newcount\mmz@seq \def\mmz@extern@basename{% - \mmz@prefix\mmz@code@mdfivesum-\mmz@context@mdfivesum + \mmz@prefix@name\mmz@code@mdfivesum-\mmz@context@mdfivesum \ifnum\mmz@seq>0 -\the\mmz@seq\fi } \def\mmz@extern@name{\mmz@extern@basename.pdf} -\def\mmz@extern@basepath{\mmz@dir@path/\mmz@extern@basename} +\def\mmz@extern@basepath{\mmz@prefix@dir\mmz@extern@basename} \def\mmz@extern@path{\mmz@extern@basepath.pdf} \mmzset{ padding left/.store in=\mmz@padding@left, @@ -870,8 +892,10 @@ \endgroup \global\advance\mmzExternPages1 \edef\externbasepath{\mmz@extern@basepath}% - \edef\pagenumber{\the\numexpr\mmzRegularPages - +\mmzExternPages+\mmzExtraPages}% + \edef\pagenumber{% + \the\numexpr\mmzRegularPages + +\mmzExternPages+\mmzExtraPages + }% \mmzset{record/new extern/.expanded=\mmz@extern@path}% \global\advance\mmz@seq1 } @@ -903,7 +927,7 @@ enddocument/afterlastpage/.append code={% \ifnum\mmzExternPages>0 \PackageWarning{memoize}{The compilation produced \the\mmzExternPages\space - new extern\ifnum\mmzExternPages>1 s\fi.}% + new extern\ifnum\mmzExternPages>1 s\fi}% \fi }, } @@ -982,7 +1006,7 @@ \mmzset{ extract/.estore in=\mmz@extraction@method, extract/.value required, - begindocument/.append style={extract/.code=\mmz@preamble@only@warning}, + begindocument/.append style={extract/.code=\mmz@preamble@only@error}, extract/perl/.code={% \mmz@clear@extraction@log \pdf@system{% @@ -990,13 +1014,12 @@ \mmzvalueof{perl extraction options}% }% \mmz@check@extraction@log{perl}% - \def\mmz@mkdir@command##1{\mmzvalueof{perl extraction command}\space --mkdir "##1"}% + \def\mmz@mkdir@command{\mmzvalueof{perl extraction command} --mkdir}% }, perl extraction command/.initial=memoize-extract.pl, - perl extraction options/.initial={% - -e -l "\mmzOutputDirectory\mmzUnquote\jobname.mmz.log" -w - "\string\PackageWarning{memoize (perl-based extraction)}{\string\warningtext}" - "\mmzOutputDirectory\mmzUnquote\jobname.mmz" + perl extraction options/.initial={\space + -F latex + \jobname\space }, extract=perl, extract/python/.code={% @@ -1006,23 +1029,22 @@ \mmzvalueof{python extraction options}% }% \mmz@check@extraction@log{python}% - \def\mmz@mkdir@command##1{\mmzvalueof{python extraction command}\space --mkdir "##1"}% + \def\mmz@mkdir@command{\mmzvalueof{python extraction command} --mkdir}% }, python extraction command/.initial=memoize-extract.py, - python extraction options/.initial={% - -e -l "\mmzOutputDirectory\mmzUnquote\jobname.mmz.log" -w - "\string\PackageWarning{memoize (python-based extraction)}{\string\warningtext}" - "\mmzOutputDirectory\mmzUnquote\jobname.mmz" + python extraction options/.initial={\space + -F latex + \jobname\space }, } -\def\mmz@preamble@only@warning{% - \PackageWarning{memoize}{% +\def\mmz@preamble@only@error{% + \PackageError{memoize}{% Ignoring the invocation of "\pgfkeyscurrentkey". - This key may only be executed in the preamble}% + This key may only be executed in the preamble}{}% } \def\mmz@clear@extraction@log{% \begingroup - \immediate\openout0{\mmzUnquote\jobname.mmz.log"}% + \immediate\mmz@openout0{\jobname.mmz.log}% \immediate\closeout0 \endgroup } @@ -1033,14 +1055,16 @@ \@input{\jobname.mmz.log}% \ifmmz@temp \else \mmz@extraction@error \fi \endgroup } \def\mmz@extraction@error{% - \PackageWarning{memoize}{Extraction of externs from document "\mmzUnquote\jobname.pdf" - using method "\extractionmethod" was unsuccessful. Have you set the - shell escape mode as suggested in chapter 1 of the manual?}{}} + \PackageError{memoize}{Extraction of externs from document + "\jobname.pdf" using method "\extractionmethod" was + unsuccessful}{The extraction script "\mmzvalueof{\extractionmethod\space + extraction command}" wasn't executed or didn't finish execution + properly.}} \mmzset{ record/.style={% record/begin/.append style={ /mmz/record/#1/begin/.try, - /mmz/record/#1/prefix/.try/.expanded=\mmz@prefix@path, + /mmz/record/#1/prefix/.try/.expanded=\mmz@prefix, }, record/prefix/.append style={/mmz/record/#1/prefix/.try={##1}}, record/new extern/.append style={/mmz/record/#1/new extern/.try={##1}}, @@ -1066,7 +1090,7 @@ } } \def\mmz@record@prefix{% - \mmzset{/mmz/record/prefix/.expanded=\mmz@prefix@path}% + \mmzset{/mmz/record/prefix/.expanded=\mmz@prefix}% } \mmzset{ no record, @@ -1077,7 +1101,7 @@ \mmzset{ record/mmz/begin/.code={% \newwrite\mmz@mmzout - \immediate\openout\mmz@mmzout{\jobname.mmz}% + \immediate\mmz@openout\mmz@mmzout{\jobname.mmz}% }, record/mmz/prefix/.code={% \immediate\write\mmz@mmzout{\noexpand\mmzPrefix{#1}}% @@ -1112,7 +1136,7 @@ bat=memoize-extract.\jobname.bat, record/sh/begin/.code={% \newwrite\mmz@shout - \immediate\openout\mmz@shout{\mmz@shname}% + \immediate\mmz@openout\mmz@shout{\mmz@shname}% }, record/sh/new extern/.code={% \begingroup @@ -1124,7 +1148,7 @@ }, record/bat/begin/.code={% \newwrite\mmz@batout - \immediate\openout\mmz@batout{\mmz@batname}% + \immediate\mmz@openout\mmz@batout{\mmz@batname}% }, record/bat/new extern/.code={% \begingroup @@ -1145,7 +1169,7 @@ record/makefile/begin/.code={% \newwrite\mmz@makefileout \newtoks\mmz@makefile@externs - \immediate\openout\mmz@makefileout{\mmz@makefilename}% + \immediate\mmz@openout\mmz@makefileout{\mmz@makefilename}% \immediate\write\mmz@makefileout{.DEFAULT_GOAL = externs}% \immediate\write\mmz@makefileout{.PHONY: externs}% }, @@ -1192,11 +1216,11 @@ } \def\mmz@pageextraction@error{% \PackageError{memoize}{Extraction of extern page \pagenumber\space from - document "\mmzUnquote\jobname.pdf" using method "\extractionmethod" was unsuccessful. - Have you set the shell escape mode as suggested in chapter 1 of the - manual?}{If "\mmzvalueof{tex extraction command}" was executed, - shell escape mode is not the problem, and inspecting "\externbasepath.log" - might give you a clue what's wrong}} + document "jobname.pdf" using method "\extractionmethod" was + unsuccessful.}{Check the log file to see if the extraction script was + executed at all, and if it finished successfully. You might also want to + inspect "\externbasepath.log", the log file of the embedded TeX compilation + which ran the extraction script}} \def\mmz@tex@extraction@systemcall{% \mmzvalueof{tex extraction command}\space \mmzvalueof{tex extraction options}\space @@ -1208,10 +1232,9 @@ -halt-on-error -interaction=batchmode -jobname "\externbasepath" - \ifdefempty\mmzOutputDirectory{}{-output-directory "\mmzOutputDirectory"} }, tex extraction script/.initial={% - \def\noexpand\fromdocument{"\mmzOutputDirectory"\jobname.pdf}% + \def\noexpand\fromdocument{\jobname.pdf}% \def\noexpand\pagenumber{\pagenumber}% \def\noexpand\expectedwidth{\expectedwidth}% \def\noexpand\expectedheight{\expectedheight}% @@ -1272,6 +1295,7 @@ outer handler=\mmz@auto@noop@env, bailout handler=\mmz@auto@bailout}, nomemoize/.style={noop, options=disable}, replicate/.style={run if memoizing, inner handler=\mmz@auto@replicate}, + to context/.style={run if memoizing, outer handler=\mmz@auto@tocontext}, } \mmzset{ auto/abort/.style={run conditions=\mmzAbort}, @@ -1348,6 +1372,19 @@ \pgfqkeys{/mmz/auto/replicate}{ expanded/.code={\let\mmz@auto@replicate@expansion\@firstofone}, } +\def\mmz@auto@tocontext{% + \expanded{% + \noexpand\pgfkeysvalueof{/mmz/context/.@cmd}% + original "\AdviceNamespace" csname "\AdviceCsname"={% + \noexpand\expanded{% + \noexpand\noexpand\noexpand\meaning + \noexpand\AdviceCsnameGetOriginal{\AdviceNamespace}{\AdviceCsname}% + }% + }% + }% + \pgfeov + \AdviceOriginal +} \mmzset{ auto/.cd, ref/.style={outer handler=\mmz@auto@ref\mmzNoRef, run if memoizing}, @@ -1365,12 +1402,7 @@ \AdviceOriginal#2{#3}% } \def\mmzForceNoRef#1{% - \ifmemoizing - \expandafter\gtoksapp\expandafter\mmzContextExtra - \else - \expandafter\toksapp\expandafter\mmzContext - \fi - {r@#1={\csname r@#1\endcsname}}% + \mmz@mtoc@csname{r@#1}% \ignorespaces } \def\mmzNoRef#1{% @@ -1414,23 +1446,30 @@ \label{#1}% \endgroup } +\AddToHook{shipout/before}[memoize]{\global\advance\mmzExtraPages-1\relax} +\AddToHook{shipout/after}[memoize]{\global\advance\mmzExtraPages1\relax} +\mmzset{auto=\DiscardShipoutBox{ + outer handler=\global\advance\mmzExtraPages1\relax\AdviceOriginal}} \mmzset{ begindocument/before/.append code={% \@ifpackageloaded{tikz}{% \input advice-tikz.code.tex }{}% \mmzset{% - auto=\tikz{memoize, collector=\AdviceCollectTikZArguments}, - auto={tikzpicture}{memoize}, - auto=\pgfsys@getposition{ - run if memoizing, outer handler=\mmz@pgfsys@getposition}, - }% - \def\mmz@pgfsys@getposition##1{% - \expandafter\ifx\csname pgf@sys@pdf@mark@pos@##1\endcsname\relax - \else - \mmzAbort - \fi - \AdviceOriginal{##1}% + auto/memoize tikz/.style={ + memoize, + at begin memoization=\edef\mmz@pgfpictureid{% + \the\pgf@picture@serial@count + }, + at end memoization=\xtoksapp\mmzCCMemo{% + \unexpanded{% + \global\expandafter\advance\csname pgf@picture@serial@count\endcsname + }% + \the\numexpr\pgf@picture@serial@count-\mmz@pgfpictureid\relax\relax + }, + }, + auto=\tikz{memoize tikz, collector=\AdviceCollectTikZArguments}, + auto={tikzpicture}{memoize tikz}, }% }, } @@ -1480,30 +1519,102 @@ \fi }% }{}} +\AddToHook{begindocument/before}{% + \@ifpackageloaded{morewrites}{% + \def\mmz@openin#1#2{\openin#1=#2\relax}% + \def\mmz@openout#1#2{\openout#1=#2\relax}% + }{}% +} +\mmzset{ + begindocument/before/.append style={% + auto=\blx@bbl@entry{outer handler=\mmz@biblatex@entry}, + auto/cite/.style={run if memoizing, outer handler=\mmz@biblatex@cite}, + auto/cites/.style={run if memoizing, outer handler=\mmz@biblatex@cites}, + auto=\cite{cite}, + auto=\cites{cites}, + }% +} +\def\mmz@biblatex@entry#1#2\endentry{% + \csxdef{mmz@bbl@#1}{\pdf@mdfivesum{#2}}% + \AdviceOriginal{#1}#2\endentry +} +\def\mmz@biblatex@cite#1#{\mmz@biblatex@cite@i{#1}} +\def\mmz@biblatex@cite@i#1#2{% + \forcsvlist\mmz@biblatex@cite@do@key{#2}% + \xtoksapp\mmzCCMemo{% + \noexpand\setbox0\noexpand\hbox{% + \expandonce\AdviceOriginal\unexpanded{#1}{#2}% + }}% + \AdviceOriginal#1{#2}% +} +\def\mmz@biblatex@cite@do@key#1{% + \mmz@mtoc@csname{mmz@bbl@#1}% + \ifcsdef{mmz@bbl@#1}{}{\mmzAbort}% +} +\def\mmz@biblatex@cites{% + \mmz@temptoks{}% + \mmz@biblatex@cites@i +} +\def\mmz@biblatex@cites@i{% + \futurelet\mmz@temp\mmz@biblatex@cites@ii +} +\def\mmz@biblatex@cites@ii{% + \mmz@tempfalse + \ifx\mmz@temp\bgroup + \mmz@temptrue + \else + \ifx\mmz@temp[%] + \mmz@temptrue + \fi + \fi + \ifmmz@temp + \expandafter\mmz@biblatex@cites@iii + \else + \expandafter\mmz@biblatex@cites@z + \fi +} +\def\mmz@biblatex@cites@iii#1#{\mmz@biblatex@cites@iv{#1}} +\def\mmz@biblatex@cites@iv#1#2{% + \forcsvlist\mmz@biblatex@cite@do@key{#2}% + \toksapp\mmz@temptoks{#1{#2}}% + \mmz@biblatex@cites@i +} +\def\mmz@biblatex@cites@z{% + \xtoksapp\mmzCCMemo{% + \noexpand\setbox0\noexpand\hbox{% + \expandonce\AdviceOriginal\the\mmz@temptoks + }}% + \expandafter\AdviceOriginal\the\mmz@temptoks +} \AddToHook{begindocument/before}{\mmzset{begindocument/before}} \AddToHook{begindocument}{\mmzset{begindocument}} \AddToHook{begindocument/end}{\mmzset{begindocument/end}} \AddToHook{enddocument/afterlastpage}{\mmzset{enddocument/afterlastpage}} +\mmzset{extract/no/.code={}} \InputIfFileExists{memoize.cfg}{}{} +\let\mmz@initial@extraction@method\mmz@extraction@method +\DeclareUnknownKeyHandler[mmz]{% + \expanded{\noexpand\pgfqkeys{/mmz}{#1\IfBlankF{#2}{={#2}}}}} +\ProcessKeyOptions[mmz] \mmzset{ - extract/no/.code={}, - output-directory/.store in=\mmzOutputDirectory, + extract/.is choice, + extract/.default=\mmz@extraction@method, + extract/.append style={ + extract/.code={\PackageError{memoize}{Key "extract" was invoked twice.}{In + principle, externs should be extracted only once. If you really want + to extract again, execute "extract/<method>".}}, + }, + /utils/exec={\pgfkeysgetvalue{/mmz/extract/.@cmd}\mmz@temp@extract}, + extract=\mmz@extraction@method, } -\ProcessPgfPackageOptions{/mmz} -\ifdefined\mmzOutputDirectory -\else - \def\mmzOutputDirectory{}% +\def\mmz@temp{no} +\ifx\mmz@extraction@method\mmz@temp + \pgfkeyslet{/mmz/extract/.@cmd}\mmz@temp@extract + \let\mmz@extraction@method\mmz@initial@extraction@method \fi -\mmzset{output directory/.code={\PackageError{memoize}{Key "output-directory" - may only be used as a package option}{}}} -\mmzset{ - extract/\mmz@extraction@method, - extract/.code={\PackageError{memoize}{Key "extract" is only allowed as a - package option.}{If you really want to extract in the preamble, execute - "extract/<method>".}}, -} +\let\mmz@temp@extract\relax \ifnum\pdf@draftmode=1 - \PackageWarning{memoize}{No memoization will be performed in the draft mode}% + \PackageWarning{memoize}{No externalization will be performed in the draft mode}% \fi \endinput %% diff --git a/Master/texmf-dist/tex/latex/memoize/nomemoize.sty b/Master/texmf-dist/tex/latex/memoize/nomemoize.sty index e553a61e6e8..bfe7ef87af3 100644 --- a/Master/texmf-dist/tex/latex/memoize/nomemoize.sty +++ b/Master/texmf-dist/tex/latex/memoize/nomemoize.sty @@ -24,18 +24,21 @@ %% %% The files belonging to this work and covered by LPPL are listed in %% (<texmf>/doc/generic/memoize/)FILES. -\ProvidesPackage{nomemoize}[2023/10/10 v1.0.0 A no-op stub for Memoize] -\RequirePackage{pgfopts} % pgfkeys-based package options -\pgfkeys{/memoize/package options/.unknown/.code={}} -\ProcessPgfPackageOptions{/memoize/package options} -\@ifpackageloaded{memoize} -{% +\ProvidesPackage{nomemoize}[2024/1/02 v1.1.0 A no-op stub for Memoize] +\RequirePackage{pgfkeys} +\def\ifmmz@loadstatus#1{% + \ifnum#1=0\csname mmz@loadstatus\endcsname\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\ifmmz@loadstatus{1}{% \PackageError{nomemoize}{Cannot load the package, as "memoize" is already loaded; memoization will remain in effect}{Packages "memoize" and "nomemoize" are mutually exclusive, please load either one or the other.}% \endinput }{}% -\@ifpackageloaded{memoizable}% -{% +\ifmmz@loadstatus{2}{% \PackageError{nomemoize}{Cannot load the package, as "memoizable" is already loaded}{Package "memoizable" is loaded by packages which support memoization. (No)Memoize must be loaded before all such packages. The @@ -47,6 +50,8 @@ of that package.}% \endinput }{}% +\ifmmz@loadstatus{3}{\endinput}{}% +\def\mmz@loadstatus{3}% \def\mmzset#1{\ignorespaces} \def\nommzkeys{\pgfqkeys{/mmz}} \pgfqkeys{/mmz}{.unknown/.code={\pgfkeysdef{\pgfkeyscurrentkey}{}}} @@ -70,9 +75,27 @@ \let\endmemoize\endnomemoize \newif\ifmemoizing \newif\ifinmemoize -\newcommand\IfMemoizing[2][]{\@secondoftwo} \def\mmznext#1{\ignorespaces} \InputIfFileExists{memoize.cfg}{}{} +\DeclareUnknownKeyHandler[mmz]{} +\ProcessKeyOptions[mmz] +\pgfkeys{% + /handlers/.meaning to context/.code={}, + /handlers/.value to context/.code={}, +} +\let\mmzAbort\relax +\let\mmzUnmemoizable\relax +\newcommand\IfMemoizing[2][]{\@secondoftwo} +\let\mmzNoRef\@gobble +\let\mmzForceNoRef\@gobble +\newtoks\mmzContext +\newtoks\mmzContextExtra +\newtoks\mmzCMemo +\newtoks\mmzCCMemo +\newcount\mmzExternPages +\newcount\mmzExtraPages +\let\mmzTracingOn\relax +\let\mmzTracingOff\relax \endinput %% %% End of file `nomemoize.sty'. |