%% memoize-doc.sty %% %% This file is a part of Memoize, a TeX package for externalization of %% graphics and memoization of compilation results in general, available at %% https://ctan.org/pkg/memoize and https://github.com/sasozivanovic/memoize. %% %% Copyright (c) 2020- Saso Zivanovic %% (Sa\v{s}o \v{Z}ivanovi\'{c}) %% %% This work may be distributed and/or modified under the conditions of the %% LaTeX Project Public License, either version 1.3c of this license or (at %% your option) any later version. The latest version of this license is in %% https://www.latex-project.org/lppl.txt and version 1.3c or later is part of %% all distributions of LaTeX version 2008 or later. %% %% This work has the LPPL maintenance status `maintained'. %% The Current Maintainer of this work is Saso Zivanovic. %% %% The files belonging to this work and covered by LPPL are listed in %% (/doc/generic/memoize/)FILES. % \usepackage{lstdoc} % this must be loaded before hyperref \usepackage{shortvrb} \AtBeginDocument{\MakeShortVerb{\|}} % \usepackage{hypdoc} \usepackage[hyperindex=false]{hyperref} \hypersetup{ colorlinks=true, allcolors=black, linkcolor=Hyperlink, } \usepackage{microtype} %\SetExpansion[context=sloppy,stretch=30,shrink=50,step=1]{encoding=*}{}% \usepackage{fnpct} \usepackage{memoize-doc-common} % explicitly load advice (and thereby collargs) for when we load nomemoize \usepackage{advice} \usepackage{forest} \useforestlibrary{edges} \usepackage[infoshow]{tracefnt} \tcbuselibrary{xparse,breakable} \mmzset{ auto={tcolorbox}{memoize, options=verbatim}, auto={tcboxedraster}{memoize, options=verbatim}, auto={tcbraster}{memoize, options={verbatim,ignore spaces}}, auto={tcblisting}{memoize, options={verbatim,ignore spaces}}, auto csname={tcbinputexample code}{memoize, args=mmm+m, ignore spaces}, auto=\tcbinputlisting{memoize, args=m, options=ignore spaces}, % The following doesn't work perfectly, but it's good enough. auto key={/tcb/breakable}{run if memoizing, outer handler=\makeunmemoizableunless{false}}, auto key={/tcb/float}{run if memoizing, outer handler=\makeunmemoizableunless{}}, auto=\Emph{nomemoize,args=m}, % why do I need to specify args? auto=\EmphTT{nomemoize,args=m}, auto=\EmphVerbatim{nomemoize,args=v}, } \def\makeunmemoizableunless#1#2\pgfeov{% \ifstrequal{#1}{#2}{}{\mmzUnmemoizable}% \AdviceOriginal#1\pgfeov } \NewDocumentCommand\introboxtitle{om}{% \strut \textcolor{emphcolor}{% \IfValueT{#1}{\hypertarget{#1}}{\textbf{#2}}% }% } \usepackage{fancyhdr} \usepackage[skip=0.3\baselineskip plus 2pt]{parskip} \usepackage[bottom]{footmisc} \usepackage{xparse} \usepackage{multicol} \usepackage{graphicx} \usepackage{cprotect} \setlist[description]{ itemsep=0.3\baselineskip plus 2pt minus 1pt, parsep=0.3\baselineskip plus 2pt } \SetEnumitemKey{comma}{itemjoin={{, }}} \SetEnumitemKey{and}{itemjoin={{, }}, itemjoin*={{, and }}} \setlist[itemize,enumerate]{itemsep=0pt plus 1pt minus 2pt} % \usepackage{lstdoc} % this must be loaded before hyperref %\usepackage{lstautogobble} % todo: does not work! \def\listings@file@value@in@reset{} \tcbset{ listing file/.append code={% \ifmemoizing \ifstrequal{#1}{\jobname.listing}{% % We're in tcolorbox's reset, do nothing }{% \mmzset{ context={% listing file={#1}, md5sum=\csuse{pdf@filemdfivesum}{#1}, }, }% }% \fi }, centering/.style={before=\centering}, } \colorlet{pointcolor}{green!50!black} \def\pstyle{\color{pointcolor}}% todo: hyperlink? \setlength\textfloatsep{0.5\baselineskip plus 2pt minus 2pt} \tcbset{ top=1mm, bottom=1mm, beforeafter skip balanced=0.5\baselineskip plus 2pt minus 2pt, raster every box/.style={top=1mm, bottom=1mm}, before upper={\parskip0.3\baselineskip plus 2pt\relax}, every box on layer 1/.style={ fonttitle=\bfseries, }, my listing options/.style={ listing options app={ moredelim={[is][\pstyle]{~}{~}}, commentstyle=\color{purple}, morekeywords={unexpanded,expanded,expandonce,NewDocumentCommand,IfValueTF}, breakindent=10pt, }, }, my listing options, % for listings inside a tcboxedraster ... reset/.append style=my listing options, % titles attach shifted boxed title to top right/.style={ attach boxed title to top right={ xshift=1.5mm, yshift=-\tcboxedtitleheight/2, #1}, }, attach shifted boxed title to top right/.default={}, attach shifted boxed title to top left/.style={ attach boxed title to top left={ xshift=-1.5mm, yshift=-\tcboxedtitleheight/2, #1}, }, attach shifted boxed title to top left/.default={}, my boxed title/.style={ enhanced, title={#1}, fonttitle=\scriptsize, boxed title style={size=small}, }, my boxed title/.value required, extern page/.style={ my boxed title=extern page, boxed title style={colback=blue!70!black, colframe=blue!25!white}, attach shifted boxed title to top right, }, document page/.style={ my boxed title=document page, boxed title style={colback=green!60!black, colframe=green!25!white}, attach shifted boxed title to top right, }, % end titles bad/.style={enhanced, finish={ \begin{tcbclipinterior} \draw[red!40!white, opacity=0.4, line width=1cm] (interior.south west)--(interior.north east); \end{tcbclipinterior} }, }, mark region/.style 2 args={ enhanced, underlay={ \fill[pointcolor,opacity=0.1] ([yshift=-\kvtcb@boxsep-\kvtcb@top-2.5ex*(#1-1)]interior.north west) rectangle ([yshift=-\kvtcb@boxsep-\kvtcb@top-2.5ex*#2]interior.north east); }, }, warning/.style={colback=red!15}, to be continued on right/.style={ frame code={% line thickness is uniform and depends on tcolorbox's leftrule \draw[color=tcbcolframe, line width=2*\kvtcb@left@rule, rounded corners=2*\kvtcb@left@rule, ] (interior.north east)--(interior.north west) --(interior.south west)--(interior.south east); }, interior code app={ \draw[color=tcbcolframe,line width=\kvtcb@left@rule,dashed] ([xshift=-0.5*\kvtcb@left@rule]interior.south east) --([xshift=-0.5*\kvtcb@left@rule]interior.north east); }, }, } \NewDocumentCommand{\includeexamplepdf}{ O{} O{\examplename} D(){\exampledotc} m}{% \mbox{% \tcbincludegraphics[reset,capture=hbox,graphics options={clip,#4},#1]{\exampledir#2#3.pdf}% }% }% \def\examplepath{\exampledir\examplename} \RequirePackage{intopdf} \RequirePackage{fontawesome} \tcbset{ example title/.style={ enhanced, % uniform height and (zero) depth before title={\begingroup \setbox0\hbox\bgroup}, after title={\egroup\ht0 1.2ex \dp0 0pt \box0 \endgroup}, title={\texttt{#1}}, top=2mm, attach shifted boxed title to top left, fonttitle={\small\hypercolor{link}{white}}, }, example title/.default=\examplename.tex, attachment/.estore in=\attachmentname, no attachment/.style={attach/.style={}}, attach/.style={ overlay app={% \node at (frame.north east) [ fill=white, draw=gray, thick, ellipse, inner xsep=-0.5mm, inner ysep=0, shift={(-2mm,-2mm)}, rotate=45, ]{% \expandafter\attachandlink\expandafter[\attachmentname]{\attachmentsdir\attachmentname}[application/x-tex]{Click here to open the code.}{\rotatebox{-45}{\faPaperclip}} }; } }, } \NewDocumentCommand\attachexample{O{\examplename.tex} O{\examplepath.tex.c1.attachment}}{% {\textsuperscript{\kern-0.25em \expandafter\attachandlink\expandafter[#1]{#2}[application/x-tex]{Click here to open the code.}{\rotatebox{-45}{\faPaperclip}}\kern-0.25em \relax}}} \NewTCBInputListing{\tcbinputexample}{ >{\edef\ProcessedArgument} m O{.tex} D(){} +m } {% /utils/exec={% \edef\examplename{#1}% \edef\exampledotc{#3}% },% /mmz/context={dtxmd5sum=\csuse{pdf@filemdfivesum}{\exampledir#1#2.dtx}}, example title={#1#2}, % enlarge left by=\leftmargin,% this takes care of using this box in lists listing and comment, no .listing/.style={ listing file={\exampledir#1#2#3}, %attachment path={\exampledir#1#2#3}, %attachment path={\exampledir attachments/#1#2}, %attachment={#1#2}, }, listing file=\exampledir#1#2#3.listing, %attachment path=\exampledir#1#2#3.attachment, %attachment path=\exampledir attachments/#1#2, %attachment name=#1#2,% attachment=#1#2,% #4, attach, } \nommzkeys{context} \tcbset{ full width/.style={grow to left by=\leftmargin}, listing and compile/.style={ listing and comment, comment={% \input\examplepath.tex#1% } }, listing and compile/.default=, } \pgfkeys{ /handlers/.detokenize/.style={\pgfkeyscurrentpath/.expand once=\detokenize{#1}}, /utils/typeout/.code={\typeout{#1}}, } \let\pdfsystem\pdf@system \let\pdffilemdfivesum\pdf@filemdfivesum \usepackage{booktabs} \usepackage{tabularx} \usetikzlibrary{decorations.pathmorphing, arrows.meta} \usepackage{tikzlings-penguins,tikzlings-koalas,tikzlings-owls} \tikzset{ ->/.tip={Kite}, snake arrow/.style= {->, decorate, decoration={snake, amplitude=.4mm, segment length=2mm, post length=2mm}, }, } % title page \renewcommand\abstractname{\vskip-\baselineskip} % sections \newtcbox{\section@box}[3]{/mmz/disable,tile,before=\noindent,after=, fontupper=\normalfont#1\bfseries,capture=minipage, colback=emphcolor, boxsep=0mm,top=#2,bottom=#2,left=\oddsidemargin+1in,right=\oddsidemargin+1in, spread sidewards,#3 } \newif\ifsectionclearpage \sectionclearpagetrue \newif\ifsubsectionclearpage \subsectionclearpagetrue \renewcommand\section{% \ifsectionclearpage\clearpage\fi \@startsection{section}{1}{\z@}% {5mm}{5mm}% {\section@box{\Large}{4mm}{fuzzy halo=1mm with blue!50!gray}}} \renewcommand\subsection{% \ifsubsectionclearpage\ifnum\c@subsection=0 \else\clearpage\fi\fi \@startsection{subsection}{2}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}{1.5ex \@plus .2ex}% {\section@box{\large}{2mm}{fuzzy halo=1mm with blue!50!gray}}} \renewcommand\subsubsection{% \mmznext{disable}% \@startsection{subsubsection}{2}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}{1.5ex \@plus .2ex}% {\section@box{}{2mm}{}}} \newtcbox{\paragraph@box}{/mmz/disable,tile,before=,after=,capture=hbox, fontupper=\normalfont\normalsize\bfseries\hypercolor{link}{black}\vphantom{dj}, box align=base, boxsep=0mm, left=\oddsidemargin+1in, enlarge left by=-\oddsidemargin-1in, top=1.2mm, enlarge top by=-1.2mm, bottom=1mm, enlarge bottom by=-1mm, right=12mm, enlarge right by=-8mm, arc=0mm, rightrule=0mm, interior style={left color=emphcolor, right color=white}, } \let\oldparagraph\paragraph \def\paragraphskip{3.25ex \@plus1ex \@minus1ex} \RenewDocumentCommand\paragraph{sm}{% \mmznext{disable}% \@startsection{paragraph}{4}{\z@}{\paragraphskip}{-1em}{\paragraph@box}{#2}% \IfBooleanT{#1}{\hspace*{\dimexpr-8mm+0.5em}}% \hskip 0pt plus .5em \IfBooleanF{#1}{\nopagebreak}% % todo: this is bad, if the paragraph is long } \NewTotalTCBox{\Emph}{m}{my code box, fontupper=\rm}{#1} \NewTotalTCBox{\EmphTT}{m}{my code box}{#1} \NewTotalTCBox{\EmphVerbatim}{v}{my code box}{#1} \tikzset{ emphshade/.style={ opacity=0.6, top color=#1, bottom color=#1, middle color=emphcolor, }, emphshade/.default=white, } \tcbset{ my code box/.style={ reset, enhanced, verbatim, boxsep=0pt, left=0.3ex,right=0.3ex, box align=base, interior hidden, frame hidden, overlay={\shade[emphshade] ([yshift=0.7ex]frame.north west) rectangle ([yshift=-0.7ex]frame.south east); }, }, } % verbatim code in the implementation \lstdefinestyle{code}{style=tcblatex,xleftmargin=\leftmargin,aboveskip=\parskip} \newcommand\therefore{\ensuremath{\Rightarrow}} \newcommand\nohyphen{\discretionary{}{}{}} \hyphenation{Coll-Args} \let\gobble\@gobble \lstset{ rangebeginprefix=\ \ \%\%\%\ begin\ listing\ region:\ , rangebeginsuffix=, rangeendprefix=\ \ \%\%\%\ end\ listing\ region:\ , rangeendsuffix=, includerangemarker=false, keepspaces=true, } \def\relaxmmzcommands{% \let\mmzPrefix\gobble \let\mmzNewCMemo\gobble \let\mmzNewCCMemo\gobble \def\mmzNewExtern##1##2##3##4{}% \let\mmzUsedCMemo\gobble \let\mmzUsedCCMemo\gobble \let\mmzUsedExtern\gobble } \usepackage{xstring} \usepackage{placeins} \usepackage{pifont} \newcommand\yes{{\small\ding{51}}} % pifont \newcommand\no{{\small\ding{55}}} % pifont \definecolor{Option}{rgb}{0.118,0.546,0.222} \definecolor{Definition}{rgb}{0.784,0.06,0.176} \definecolor{ExampleFrame}{rgb}{0.628,0.705,0.942} \definecolor{ExampleBack}{rgb}{0.963,0.971,0.994} \definecolor{Hyperlink}{rgb}{0.281,0.275,0.485} \definecolor{Fade}{rgb}{0.5,0.5,0.5} \definecolor{EasyDefinition}{rgb}{0.06,0.784,0.176} {\catcode`\|=\z@ \catcode`\\=12 |gdef|bslash{\}} \DeclareRobustCommand\cs[1]{\texttt{\bslash\detokenize{#1}}}% \DeclareRobustCommand\env[1]{\texttt{#1}}% %\def\marg#1{{\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}} \def\marg#1{\hskip 0pt plus 1pt{\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}} \def\oarg#1{\hskip 0pt plus 1pt{\ttfamily[}\meta{#1}{\ttfamily]}} \def\bracestt#1{\hskip 0pt plus 1pt{\ttfamily\char`\{#1\char`\}}} \def\braces#1{\hskip 0pt plus 1pt{\ttfamily\char`\{}#1{\ttfamily\char`\}}} \def\bracketstt#1{\hskip 0pt plus 1pt{\ttfamily[#1]}} \def\brackets#1{\hskip 0pt plus 1pt{\ttfamily[}#1{\ttfamily]}} \DeclareRobustCommand\meta[1]{% \ensuremath\langle \ifmmode \expandafter \nfss@text \fi {% \meta@font@select \edef\meta@hyphen@restore{\hyphenchar\the\font\the\hyphenchar\font}% \hyphenchar\font\m@ne \language\l@nohyphenation #1\/% \meta@hyphen@restore }% \ensuremath\rangle } \def\meta@font@select{\rm\itshape} \DeclareRobustCommand\metabf[1]{% \begingroup \def\meta@font@select{\rm\itshape\bfseries}% \meta{#1}% \endgroup } {\catcode`\%=12 \gdef\percentchar{%}} \def\coloredpercentchar{\hbox{\textcolor{purple}{\percentchar}}} \newcommand\alt{\ensuremath{\vert}}% without space around, unlike \Alt \newcommand\code[1]{\texttt{\spaceskip 0.5em plus 0.2em minus 0.2em #1}} \newcommand\Arg[1]{\texttt{\##1}} \NewDocumentCommand{\TikZ}{s}{% \IfBooleanF{#1}{\href{https://ctan.org/pkg/pgf}}{{\upshape Ti\textit{k}Z}}\xspace } \def\PGF{\href{https://ctan.org/pkg/pgf}{PGF}\xspace} \def\Emacs{\href{https://www.gnu.org/software/emacs}{Emacs}\xspace} \def\AucTeX{\href{https://www.gnu.org/software/auctex}{AUC\hologo{TeX}}\xspace} % collargs reference, pi = programmer's interface % Shrink the glyphs in the footnote if necessary. \tcbset{ pi/.style={ overlay={% \node at (frame.north east) [anchor=north west, inner sep=0] {\footnotemark}; }, after app={% \footnotetext{% % \adjustspacing=2 % already 2 ... microtype? \myfontexpansionon \yadocset{before/.code={\cspreto{yadoc@name@prefix}{\myfontexpansionon}}}% \mbox{The programmer's interface:} #1.% }% }, }, } \DeclareRobustCommand\myfontexpansionon{% \directlua{font.setexpansion(font.current(),50,50,1)}% } \DeclareRobustCommand\myfontexpansionoff{% \directlua{font.setexpansion(font.current(),0,0,1)}% } \AtBeginDocument{% \setbox0=\hbox{% \footnotesize\ttfamily \directlua{ninettfont=font.current()}% }% } % \AtBeginDocument{% % \setbox0=\hbox{% % \footnotesize\ttfamily % \global\expandafter\let\expandafter\fnttfont\font@name % %\expandglyphsinfont\fnttfont 30 500 1 autoexpand % }% % } \usepackage{yadoc} \newif\ifyadoc@short \newif\ifyadoc@long \yadocset{ name color=Definition, before body=\parskip 0.3\baselineskip plus 2pt, % after body=\medskip, head/.style={ interior style={fill, left color=red!5,right color=red!5!black!2}, }, easy/.style={ name color=green!50!black, head/.style={ interior style={fill, left color=green!5,right color=black!5}, }, }, keypath color opacity=30, index encapsulator={`}, index annotation font=\color{gray}, def options/.append style={index page number format=colorhyperpage{red}}, aux options/.append style={index page number format=colorhyperpage{red}}, ref options/.append style={index page number format=hyperpage}, par/.style={parameters={#1}}, desc/.style={description={#1}}, keypath=/mmz, xparse modifier item/.style={ index annotation=\texttt{xparse} modifier, label prefix=xparse, }, xparse type item/.style={ index annotation=\texttt{xparse} type, label prefix=xparse, }, script item/.style={ index annotation=script, label prefix=script, parameters prefix=\space, }, key path item/.style={ index annotation=keypath, label prefix:=keypath:/, name prefix=/, description=keypath, }, option item/.style={ name prefix={\ifdefempty\yadoc@short@name{}{-\yadoc@short@name\,\Alt\,}--}, ref prefix={\protect\ifyadoc@short-\yadoc@short@name\protect\else--}, ref suffix={\protect\fi}, index prefix={--}, index suffix={\ifdefempty\yadoc@short@name{}{\Alt-\yadoc@short@name}}, parameters prefix=\ , label prefix:={\yadoc@of--}, index annotation=option of {\docref[into index=false,link color=gray]{\yadoc@of}}, }, short name/.store in=\yadoc@short@name, short/.is if=yadoc@short, long/.is if=yadoc@long, conditional/.style={ parameters={\texttt{true}\Alt\texttt{false}}, /utils/exec={% \appto\yadoc@description{default \texttt{true}, initially \texttt{#1}}% }, }, conditional/.value required, package item/.style={ index annotation=package, label prefix=pkg, description=package, }, pkg/.style={ after/.style={index annotation/.append={\space of package \pkg{#1}}} }, hook item/.style={ label prefix=hook, index annotation=hook, }, pdfvariable item/.style={ label prefix=pdfvar, index annotation={\hologo{LuaTeX}'s \refcmd{pdfvariable} register}, }, pdfcmd item/.style={ label prefix=cmd, name prefix={% \textbackslash \protect\ifyadoc@short \protect\else \protect\ifyadoc@long pdf% \protect\else % todo: revert to the real original font rather than just say \rmfamily \rmfamily(\ttfamily pdf\rmfamily)\ttfamily \protect\fi \protect\fi }, index prefix=\textbackslash, }, } \def\colorhyperpage#1#2{% \begingroup \hypercolor{link}{#1}% \hyperpage{#2}% \endgroup } \patchcmd{\@setref}{??}{#3??}{}{} \patchcmd{\real@setref}{??}{#3??}{}{} \mmzset{ auto={tcb@manual@entry}{nomemoize}, auto={doc}{nomemoize}, } \DeclareRobustCommand\refkey[2][]{\docref[#1]{key:#2}} \DeclareRobustCommand\refmmz[2][]{\docref[#1]{key:/mmz/#2}} \DeclareRobustCommand\refmmzauto[2][]{\docref[#1]{key:/mmz/auto/#2}} \DeclareRobustCommand\refmmzpath[2][]{\docref[#1]{key:/mmz/path/#2}} \DeclareRobustCommand\refcollargs[2][]{\docref[#1]{key:/collargs/#2}} \DeclareRobustCommand\refenv[2][]{\docref[#1]{env:#2}} \DeclareRobustCommand\refcmd[2][]{\docref[#1]{cmd:#2}} \DeclareRobustCommand\reffile[2][]{\docref[#1]{file:#2}} \DeclareRobustCommand\refkeypath[2][]{\docref[#1]{keypath:#2}} \DeclareRobustCommand\refpkg[2][]{\docref[#1]{pkg:#2}} \DeclareRobustCommand\refscript[2][]{\docref[#1]{script:#2}} \usepackage{xspace} \newcommand\dmmz{\docref{file:mmz}\xspace} \newcommand\hreftt[2]{\href{#1}{\texttt{#2}}} \ifcsname ifregion\endcsname \ifregion{% \AddToHook{begindocument/before}{% \makeatletter \InputIfFileExists{memoize-doc.aux}{}{}% \makeatother }% \AddToHook{enddocument}{% \printindex }% } \fi \AddToHook{begindocument}{% \robustify\hyperref \robustify\hologo \robustify\Alt } \newcommand\noprint[1]{\setbox0=\hbox{#1}} \usepackage{wrapfig} \newcommand\footnoteagain[1]{% \def\@thefnmark{\ref{#1}}% \@footnotemark }% \usepackage{varioref} \NewDocumentCommand\TeXLive{o}{% {% \IfValueT{#1}{\hypercolor{url}{#1}}% \href{https://www.tug.org/texlive/}{\hologo{TeX}~Live}% }% \xspace } \NewDocumentCommand\MiKTeX{o}{% {% \IfValueT{#1}{\hypercolor{url}{#1}}% \href{https://miktex.org}{MiK\hologo{TeX}}% }% \xspace } % \usepackage{caption} % \captionsetup{labelformat=empty} % Local Variables: % TeX-master: "memoize-doc.tex" % TeX-engine: luatex % End: