diff options
author | Norbert Preining <norbert@preining.info> | 2022-02-01 03:02:08 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-02-01 03:02:08 +0000 |
commit | 811714247a66acfce87bba00b9758441ff9d1413 (patch) | |
tree | ec506acda8d10ad1ae18a0f4c3f266f1f59934e1 /macros/latex/contrib | |
parent | bf3e5a0ef8f4536286b8606775c8d34fd9840b18 (diff) |
CTAN sync 202202010302
Diffstat (limited to 'macros/latex/contrib')
19 files changed, 1728 insertions, 227 deletions
diff --git a/macros/latex/contrib/animate/ChangeLog b/macros/latex/contrib/animate/ChangeLog index 0d6aa65da5..b43af114e4 100644 --- a/macros/latex/contrib/animate/ChangeLog +++ b/macros/latex/contrib/animate/ChangeLog @@ -1,3 +1,6 @@ +2022-01-31 + * improvement: optimizing XObject nesting for smaller output files + 2022-01-25 * improvement: svg clipping optimized for smaller output size diff --git a/macros/latex/contrib/animate/animate.pdf b/macros/latex/contrib/animate/animate.pdf Binary files differindex eb1b44c371..7fe63d0830 100644 --- a/macros/latex/contrib/animate/animate.pdf +++ b/macros/latex/contrib/animate/animate.pdf diff --git a/macros/latex/contrib/animate/animate.sty b/macros/latex/contrib/animate/animate.sty index fe5636586d..9a4fed2374 100644 --- a/macros/latex/contrib/animate/animate.sty +++ b/macros/latex/contrib/animate/animate.sty @@ -13,7 +13,7 @@ \NeedsTeXFormat{LaTeX2e}[2020-10-01] -\def\@anim@version{2022/01/25} +\def\@anim@version{2022/01/31} \ProvidesPackage{animate} [\@anim@version\space PDF & SVG animations from files and inline graphics] @@ -312,16 +312,16 @@ %helper macro that typesets graphics file into savebox \if@anim@dvips - \def\@anim@filebox#1#2#3{% dvips: no multi-page support + \def\@anim@filebox#1#2#3#4{% dvips: no multi-page support \edef\@anim@curfile{[#3]{#1}}% - \global\setbox\@anim@box=\hbox{% + \setbox#4=\hbox{% \expandafter\includegraphics\@anim@curfile}% } \else %pdfTeX, LuaTeX, dvipdfmx, xetex, dvisvgm - \def\@anim@filebox#1#2#3{% + \def\@anim@filebox#1#2#3#4{% \edef\@anim@curfile{[#3,page=#2]{#1}}% - \global\setbox\@anim@box=\hbox{% + \setbox#4=\hbox{% \expandafter\includegraphics\@anim@curfile}% } \fi @@ -357,14 +357,16 @@ \edef\@anim@curxform{\@anim@getkeyval{xform:\@anim@fingerprint}}% \ifthenelse{\equal{\@anim@curxform}{}}{% % new "<file chksum>.<page>.<graphicx opts>" - \@anim@filebox{#3}{#4}{#5}% store file in a box - \@anim@newkey{natdims:\@anim@fingerprint}{% - {\the\wd\@anim@box}{\the\ht\@anim@box}{\the\dp\@anim@box}% + \@anim@filebox{#3}{#4}{#5}{\@anim@box}% store file in a box + \edef\@anim@natdims{{\the\wd\@anim@box}{\the\ht\@anim@box}{\the\dp\@anim@box}}% + \@anim@xinline{#1}{#2}{\@anim@box}{newfile}% Form XObject creation + \@anim@newkey{natdims:\@anim@lastxform}{\@anim@natdims}% + \@anim@newkey{scaleddims:\@anim@lastxform}{% scaled dimensions + {\@anim@animwidth}{\@anim@animheight}{\@anim@animdepth}% }% - \@anim@xinline{#1}{#2}{\@anim@box}{newfile}% delegate Form XObject creation - \@anim@newkey{xform:\@anim@fingerprint}{\@anim@@lastxform}% - }{% file known, re-using existing form xobject - \edef\@anim@curndims{\@anim@getkeyval{natdims:\@anim@fingerprint}}% + \@anim@newkey{xform:\@anim@fingerprint}{\@anim@lastxform}% + }{% file known, re-using existing xform + \edef\@anim@curndims{\@anim@getkeyval{scaleddims:\@anim@curxform}}% \setbox\@anim@box=\hbox to \@anim@xformnatwd{\@anim@curndims}{% \vrule width \z@ height \@anim@xformnatht{\@anim@curndims} @@ -372,76 +374,67 @@ \@anim@refxform{\@anim@curxform}% \hss% }% - \global\let\@anim@@lastxform\@anim@curxform% - \@anim@xinline{#1}{#2}{\@anim@box}{knownfile}% + \@anim@xinline{#1}{#2}{\@anim@box}{\@anim@curxform}% }% } %creates Form XObject from box contents -\def\@anim@xinline#1#2#3#4{% - \def\@anim@status{#4}% "newfile", "knownfile" or "inline" (inline graphics) - \edef\@anim@curwd{\the\wd#3}% +\def\@anim@xinline#1#2#3#4{% #1 anim num, #2 frame num, #3 box num, #4 status ( + \edef\@anim@curwd{\the\wd#3}% `newfile', xform ref of known file or `inline') \edef\@anim@curht{\the\ht#3}% \edef\@anim@curdp{\the\dp#3}% + % measure 0th frame, to determine final animation widget dims \ifnum#2=\z@\relax% - %measure 0th frame - \setbox\@anim@measbox=\hbox to \wd#3{% - \vrule width \z@ height \ht#3 depth \dp#3\hss}% - %determine final dims of animation widget + \ifthenelse{\equal{#4}{newfile}\OR\equal{#4}{inline}}{% + \setbox\@anim@measbox=\hbox to \wd#3{% + \vrule width \z@ height \ht#3 depth \dp#3\hss}% + }{% known file + \edef\@anim@curndims{\@anim@getkeyval{natdims:#4}}% + \setbox\@anim@measbox=\hbox to \@anim@xformnatwd{\@anim@curndims}{% + \vrule width \z@ + height \@anim@xformnatht{\@anim@curndims} + depth \@anim@xformnatdp{\@anim@curndims}% + \hss% + }% + }% \@anim@scale{\@anim@measbox}% - \@anim@keytoaux{a#1.wdbp}{\strip@pt\dimexpr0.996264\dimexpr\@anim@animwidth}% - \@anim@keytoaux{a#1.htbp}{\strip@pt\dimexpr0.996264\dimexpr\@anim@animheight}% - \@anim@keytoaux{a#1.thtbp}{\strip@pt\dimexpr0.996264\dimexpr\@anim@animtotalheight}% + \if@anim@dvisvgm% for clipping purposes + \@anim@keytoaux{a#1.wdbp}{\strip@pt\dimexpr0.996264\dimexpr\@anim@animwidth}% + \@anim@keytoaux{a#1.htbp}{\strip@pt\dimexpr0.996264\dimexpr\@anim@animheight}% + \@anim@keytoaux{a#1.thtbp}{\strip@pt\dimexpr0.996264\dimexpr\@anim@animtotalheight}% + \fi% \fi% - %test if natural dimensions of the current frame differ from - %final widget size \def\@anim@needresize{0}% + % test if content dimensions differ from those of the final widget \ifdim\@anim@curwd=\@anim@animwidth\else\def\@anim@needresize{1}\fi% \ifdim\@anim@curht=\@anim@animheight\else\def\@anim@needresize{1}\fi% \ifdim\@anim@curdp=\@anim@animdepth\else\def\@anim@needresize{1}\fi% - %if it's a new file, make xobject from it at its natural size - \ifthenelse{\equal{\@anim@status}{newfile}}{% - \@anim@xform{1}{0}{}{}{#3}% `{1}'-->with additional resources (opacity etc.) - \global\let\@anim@@lastxform\@anim@lastxform% - \def\@anim@status{knownfile}% - \ifnum\@anim@needresize>\z@\relax% - \global\setbox#3=\hbox to \@anim@curwd{% - \vrule width \z@ height \@anim@curht depth \@anim@curdp% - \@anim@refxform{\@anim@lastxform}% - \hss% - }% - \fi% - }{% - \ifthenelse{\equal{\@anim@status}{knownfile}}{% - \global\let\@anim@lastxform\@anim@@lastxform% - }{}% - }% - %adjust size of current frame to final animation dims, if necessary + % resize content to final dimensions, if necessary \ifnum\@anim@needresize>\z@\relax% - \global\setbox#3=\hbox{% + \setbox#3=\hbox{% \raisebox{-\@anim@animdepth}{% \resizebox*{\@anim@animwidth}{% \@anim@animtotalheight}{\raisebox{\depth}{\box#3}}% }% }% - \ifthenelse{\equal{\@anim@status}{knownfile}}{% - \@anim@xform{0}{0}{}{}{#3}% without additional Resources - }{}% - \fi% - %distill box with inline graphics to xobject - \ifthenelse{\equal{\@anim@status}{inline}}{% - \@anim@xform{1}{0}{}{}{#3}% with additional Resources - }{}% - %keep a record of XObject number - \@anim@newkey{img@#2}{\@anim@lastxform}% - \if@anim@timeline\else% - \@anim@newkey{frmcontent@#2}{\@anim@getkeyval{img@#2},}% - \@anim@makeframe{#1}{#2}% \fi% + \ifthenelse{\equal{#4}{newfile}\OR\equal{#4}{inline}}{% + \@anim@xform{1}{1}{}{}{#3}% + %keep a record of XObject number, needed when timeline is built + \@anim@newkey{img@#2}{\@anim@lastxform}% + }{% + %known file + \ifnum\@anim@needresize>\z@% + \@anim@xform{0}{1}{}{}{#3}% + \@anim@newkey{img@#2}{\@anim@lastxform}% + \else% + \@anim@newkey{img@#2}{#4}% + \fi% + }% \message{<a#1,fr#2>}% } -\def\@anim@insertfrmcontent#1,#2\@nil{% +\def\@anim@refxformlist#1,#2\@nil{% \ifthenelse{\equal{#1}{}}{}{% \if@anim@dvips% \@anim@refxform{{#1}}% @@ -449,38 +442,79 @@ \@anim@refxform{#1}% \fi% }% - \ifthenelse{\equal{#2}{}}{}{\@anim@insertfrmcontent#2\@nil}% + \ifthenelse{\equal{#2}{}}{}{\@anim@refxformlist#2\@nil}% } -%inserts one animation frame into the output acc. to -% \ifcase\@anim@method as -% 0 & 1: non-interactive Widget annotation -% 2: Form XObject referenced in the page content, tagged as OC -% or dvisvgm -\def\@anim@makeframe#1#2{% - %container box - \edef\@anim@tmpvar{\@anim@getkeyval{frmcontent@#2},}% - \global\setbox\@anim@box=\hbox to \@anim@animwidth{% - \vrule width \z@ height \@anim@animheight depth \@anim@animdepth% - \expandafter\@anim@insertfrmcontent\@anim@tmpvar\@nil% - \hss% - }% - %inside a `landscape' environment together with the icon and widget methods, - %the frame content needs to be rotated counter-clockwise by 90 deg - \ifnum\@anim@method>\@ne\else% - \ifx\@anim@lscape\@anim@@lscape% - \global\setbox\@anim@box=\hbox{\rotatebox{90}{\box\@anim@box}}% +% this counts the length of a clist <item a>,<item b>,<item b>,..., (note the +% trailing comma) +\def\@anim@countxformlist#1{% + \expandafter\@anim@@countxformlist\expandafter0\expandafter:#1,\@nil% +} +\def\@anim@@countxformlist#1:#2,#3\@nil{% + \ifx\relax#2\relax% + \the\numexpr#1% + \else% + \ifx\relax#3\relax% + \the\numexpr#1% + \else% + \expandafter\@anim@@countxformlist\the\numexpr #1+1:#3\@nil% + \fi% + \fi% +} + +\def\@anim@zaptrailingcommafromxref#1,\@nil{\if@anim@dvips{#1}\else#1\fi}% + +% inserts one animation frame into the output acc. to \ifcase\@anim@method +% as a non-interactive Widget annotation (0 or 1) or an an xform (2) that is +% referenced in the page content (and tagged as OCG or for multipage PDF export) +% args: #1 animation num, #2 frame number, #3 comma-separated list of xform +% refs (transparencies) +\def\@anim@makeframe#1#2#3{% + \edef\@anim@arg{#3}% + \setboolean{@anim@singleref}{false}\def\@anim@framexform{}% + % count number of xforms in the frame content; a single xform can be referenced + % at once, while a transparency list (multiple, overlayed xforms) must be boxed + % and nested in an additional xform + \ifnum\@anim@countxformlist{\@anim@arg}=\@ne% + \setboolean{@anim@singleref}{true}% + \edef\@anim@framexform{\expandafter\@anim@zaptrailingcommafromxref\@anim@arg\@nil}% + \fi% + % however, this isn't possible on landscape pages with \@anim@method==0|1 + % because frame content needs to be rotated by 90 deg counterclockwise + \ifnum\@anim@method>\@ne\else\ifx\@anim@lscape\@anim@@lscape% + \setboolean{@anim@singleref}{false}\def\@anim@framexform{}% + \fi\fi% + % ... nor if the animation is to be exported to multipage PDF + \if@anim@export% + \setboolean{@anim@singleref}{false}\def\@anim@framexform{}% + \fi% + \if@anim@singleref\else% + % put frame content in a box if necessary + \setbox\@anim@box=\hbox to \@anim@animwidth{% + \vrule width \z@ height \@anim@animheight depth \@anim@animdepth% + \expandafter\@anim@refxformlist\@anim@arg,\@nil% + \hss% + }% + % rotate content on lscape pages + \ifnum\@anim@method>\@ne\else% + \ifx\@anim@lscape\@anim@@lscape% + \setbox\@anim@box=\hbox{\rotatebox{90}{\box\@anim@box}}% + \fi% + \fi% + % convert it to an xform + \if@anim@export\else% + \@anim@xform{0}{1}{}{}{\@anim@box}% + \let\@anim@framexform\@anim@lastxform% \fi% \fi% \ifcase\@anim@method% icon based - \@anim@xform{0}{1}{}{}{\@anim@box}% %initial visibility \ifnum\@anim@poster>\@anim@mtwo\relax% insert poster frame \ifnum#2=\@anim@poster\relax% - \let\@anim@posterap\@anim@lastxform% + \let\@anim@posterap\@anim@framexform% \else% \ifnum\@anim@poster=\@anim@mone\relax% use last frame as poster - \let\@anim@posterap\@anim@lastxform% + \let\@anim@posterap\@anim@framexform% \fi% \fi% \fi% @@ -490,8 +524,9 @@ /F 2% /FT/Btn/Ff 65537% /BS <</W 0>>% - /AP <</N \@anim@lastxform>>% - /MK <</TP 1/I \@anim@lastxform/IF<</S/A/FB true>>>>% + /AP <</N \@anim@framexform>>% + /MK <</TP 1/I \@anim@framexform% + /IF<</S/A/FB true>>>>% /T (#1.#2)% }% \or% widget based @@ -512,20 +547,22 @@ \fi% \fi% %frame insertion - \@anim@xform{0}{1}{}{}{\@anim@box}% \@anim@widget{\@anim@animwidth}{\@anim@animheight}{\@anim@animdepth}{% /Subtype/Widget% \@anim@annotflag% /FT/Btn/Ff 65537% /BS <</W 0>>% - /AP <</N \@anim@lastxform>>% - /MK <</TP 1/I \@anim@lastxform/IF<</S/A/FB true>>>>% + /AP <</N \@anim@framexform>>% + /MK <</TP 1/I \@anim@framexform% + /IF<</S/A/FB true>>>>% /T (#1.#2)% }% - \or% ocg based (abused for dvisvgm backend as well as for + \or% ocg-based (abused for dvisvgm backend as well as for % multipage PDF export) \if@anim@export% + \if@anim@insideexport\else\anim@export\fi% \box\@anim@box% + \endanim@export% \else% \@anim@newocg{#1}{#2}% %initial visibility @@ -542,25 +579,13 @@ \fi% \fi% %frame insertion - \if@anim@dvisvgm% - % `marked content' method for dvisvgm - \@anim@xform{0}{0}{}{}{\@anim@box}% - \ocgbase@oc@bdc{\@anim@curocg}% - \@anim@refxform{\@anim@lastxform}% - \ocgbase@oc@emc% - \else% - % /OC method for PDF output - \@anim@xform{0}{0}{}{/OC \@anim@curocg}{\@anim@box}% - \@anim@refxform{\@anim@lastxform}% - %% `marked content' method (slower, perhaps) - %\@anim@xform{0}{0}{}{}{\@anim@box}% - %\ocgbase@oc@bdc{\@anim@curocg}% - %\@anim@refxform{\@anim@lastxform}% - %\ocgbase@oc@emc% - \fi% + \ocgbase@oc@bdc{\@anim@curocg}% + \@anim@refxform{\@anim@framexform}% + \ocgbase@oc@emc% \fi% \fi% } +\newboolean{@anim@singleref} %create XObjects of all button faces \ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1 @@ -843,7 +868,7 @@ \@anim@xbutton{ResetFG}{\@anim@btnreset}{#2}% \endgroup% \ifx\empty\@anim@bg\empty\else% - \global\setbox\@anim@box=\hbox to \@anim@btnsize {% + \setbox\@anim@box=\hbox to \@anim@btnsize {% \vbox to \@anim@btnsize {\vss% \@anim@refxform{\@anim@getkeyval{btnResetBG:#2}}% \@anim@refxform{\@anim@lastxform}% @@ -878,7 +903,7 @@ \def\@anim@xbutton#1#2#3{% #1: name; #2: stroking commands, % only create if button face doesn't exist yet \ifcsname btn#1:#3\endcsname\else% #3: current colour+alpha+ ... combination - \global\setbox\@anim@box=\hbox to 15bp {\vbox to 15bp {\vss% + \setbox\@anim@box=\hbox to 15bp {\vbox to 15bp {\vss% \@anim@literal{}{% save \ifx\empty\@anim@alpha\empty% @@ -909,7 +934,7 @@ }% }\hss}% \if@anim@dvisvgm% - \global\setbox\@anim@box=\hbox{% + \setbox\@anim@box=\hbox{% \resizebox*{!}{\@anim@btnsize}{\box\@anim@box}}% \fi% %distill box into XObject @@ -1607,23 +1632,22 @@ \fi% \if@anim@dvisvgm% \def\@anim@method{\tw@}% using ocg-like method for dvisvgm - \setboolean{@anim@doscaling}{false}% \fi% \if@anim@draft% \if@anim@multipage% %store file in a box - \@anim@filebox{\@anim@pathtofile}{\@anim@first}{\@anim@gropts}% + \@anim@filebox{\@anim@pathtofile}{\@anim@first}{\@anim@gropts}{\@anim@box}% \else% %get file name extension \@anim@getpath{\@anim@base\@anim@first}{\@anim@ftype}% - \@anim@filebox{\@anim@pathtofile}{1}{\@anim@gropts}% + \@anim@filebox{\@anim@pathtofile}{1}{\@anim@gropts}{\@anim@box}% \fi% \@anim@scale{\@anim@box}% %draw draftbox according to dimensions of the first frame \@anim@draftbox% \else% \xdef\@anim@nfps{#2\space}% current frame rate - \xdef\@anim@nfps{\expandafter\zap@space\@anim@nfps\@empty}% + \xdef\@anim@nfps{\expandafter\@anim@zap@space\@anim@nfps\@empty}% \ifdim\@anim@nfps pt<\z@% \PackageError{animate}{% Negative frame rate `\@anim@nfps' is not allowed% @@ -1631,19 +1655,11 @@ \fi% \global\let\@anim@fps\@anim@nfps% % - \if@anim@export\if@anim@timeline% + \if@anim@export% \anim@export% - \fi\fi% - %make all frames of the sequence - \if@anim@dvisvgm\if@anim@timeline\else% - \ifcsname a\the\@anim@num.htbp\endcsname% - \@anim@beginsvgclip{\the\@anim@num}% - \fi% - \fi\fi% + \fi% + %embed content (graphics sequence) \loop\ifnum\@anim@curframe\@anim@relop\@anim@last\relax\else% - \if@anim@export\if@anim@timeline\else% - \anim@export% - \fi\fi% \if@anim@multipage% %embed graphics \@anim@ximage{\the\@anim@num}{\the\@anim@curframe@zb}{% @@ -1657,31 +1673,31 @@ \@anim@ximage{\the\@anim@num}{\the\@anim@curframe@zb}{% \@anim@pathtofile}{1}{\@anim@gropts}% \fi% - \if@anim@export\if@anim@timeline\else% - \endanim@export% - \fi\fi% \global\advance\@anim@curframe by \@anim@every% \global\advance\@anim@curframe@zb by \@ne% \repeat% - \if@anim@dvisvgm\if@anim@timeline\else% - \ifcsname a\the\@anim@num.htbp\endcsname% - \@anim@endsvgclip% - \fi% - \fi\fi% \xdef\@anim@frames{\the\@anim@curframe@zb}% total number \global\@anim@tmpcnt=\@anim@frames% \global\advance\@anim@tmpcnt by -\@ne% \xdef\@anim@maxframe{\the\@anim@tmpcnt}% highest frame index - %build timeline from optional timeline file - \if@anim@timeline% - \if@anim@dvisvgm\ifcsname a\the\@anim@num.htbp\endcsname% - \@anim@beginsvgclip{\the\@anim@num}% - \fi\fi% + %make animation frames from embedded content ... + \if@anim@dvisvgm\ifcsname a\the\@anim@num.htbp\endcsname% + \@anim@beginsvgclip{\the\@anim@num}% + \fi\fi% + \if@anim@timeline% ... by building timeline (optional timeline file) \@anim@buildtmln{\the\@anim@num}% - \if@anim@dvisvgm\ifcsname a\the\@anim@num.htbp\endcsname% - \@anim@endsvgclip% - \fi\fi% + \else% ... or by direct insertion + \global\@anim@curframe@zb=\z@% + \whiledo{\@anim@curframe@zb<\@anim@frames}{% + \@anim@makeframe{\the\@anim@num}{\the\@anim@curframe@zb}{% + \@anim@getkeyval{img@\the\@anim@curframe@zb},% + }% + \global\advance\@anim@curframe@zb by \@ne% + }% \fi% + \if@anim@dvisvgm\ifcsname a\the\@anim@num.htbp\endcsname% + \@anim@endsvgclip% + \fi\fi% % if last frame used as poster, write frame num to aux file \ifnum\@anim@poster=\@anim@mone\relax% \@anim@keytoaux{a\the\@anim@num.poster}{\@anim@maxframe}% @@ -1776,9 +1792,6 @@ \newcount\@anim@resizeflags% resizing flags according to options given. -%post-scaling, not possible for embedded files with dvisvgm -\newboolean{@anim@doscaling} - %set animation widget dimensions \def\@anim@scale#1{% #1: box number \begingroup% @@ -1796,11 +1809,11 @@ %now resize \ifcase\@anim@resizeflags% bit 2^2=width, 2^1=height, 2^0=totalhight given \or% 1 - \global\setbox#1=\hbox{\resizebox*{!}{\@anim@animtotalheight}{\box#1}}% + \setbox#1=\hbox{\resizebox*{!}{\@anim@animtotalheight}{\box#1}}% \or% 2 - \global\setbox#1=\hbox{\resizebox{!}{\@anim@animheight}{\box#1}}% + \setbox#1=\hbox{\resizebox{!}{\@anim@animheight}{\box#1}}% \or\or% 4 - \global\setbox#1=\hbox{\resizebox{\@anim@animwidth}{!}{\box#1}}% + \setbox#1=\hbox{\resizebox{\@anim@animwidth}{!}{\box#1}}% \or% 5 \if@anim@iso% \setlength{\@anim@tmpdima}{% @@ -1809,13 +1822,13 @@ \setlength{\@anim@tmpdimb}{\@anim@animtotalheight}% \ifdim\@anim@tmpdimb<\z@\@anim@tmpdimb=-\@anim@tmpdimb\fi% \ifdim\@anim@tmpdima<\@anim@tmpdimb% - \global\setbox#1=\hbox{\resizebox*{\@anim@animwidth}{!}{\box#1}}% + \setbox#1=\hbox{\resizebox*{\@anim@animwidth}{!}{\box#1}}% \else% - \global\setbox#1=\hbox{% + \setbox#1=\hbox{% \resizebox*{!}{\@anim@animtotalheight}{\box#1}}% \fi% \else% - \global\setbox#1=\hbox{% + \setbox#1=\hbox{% \resizebox*{\@anim@animwidth}{\@anim@totheightarg}{\box#1}}% \fi% \or% 6 @@ -1825,18 +1838,18 @@ \setlength{\@anim@tmpdimb}{\@anim@animheight}% \ifdim\@anim@tmpdimb<\z@\@anim@tmpdimb=-\@anim@tmpdimb\fi% \ifdim\@anim@tmpdima<\@anim@tmpdimb% - \global\setbox#1=\hbox{\resizebox{\@anim@animwidth}{!}{\box#1}}% + \setbox#1=\hbox{\resizebox{\@anim@animwidth}{!}{\box#1}}% \else% - \global\setbox#1=\hbox{\resizebox{!}{\@anim@animheight}{\box#1}}% + \setbox#1=\hbox{\resizebox{!}{\@anim@animheight}{\box#1}}% \fi% \else% - \global\setbox#1=\hbox{% + \setbox#1=\hbox{% \resizebox{\@anim@animwidth}{\@anim@animheight}{\box#1}}% \fi% \fi% %apply scale \ifdim\@anim@boxscale pt=\p@\else% - \global\setbox#1=\hbox{\scalebox{\@anim@boxscale}{\box#1}}% + \setbox#1=\hbox{\scalebox{\@anim@boxscale}{\box#1}}% \fi% %dimensions after resizing \xdef\@anim@animwidth{\the\wd#1}% @@ -1886,7 +1899,7 @@ \ifnum\@anim@poster=\@anim@mtwo\relax% \ifdefined\@anim@apdummy\else% empty appearance widget \setbox\@anim@box=\hbox{\phantom{x}}% - \@anim@xform{0}{0}{}{}{\@anim@box}% + \@anim@xform{0}{1}{}{}{\@anim@box}% \global\let\@anim@apdummy\@anim@lastxform% \@anim@widget{1ex}{1ex}{\z@}{% /Subtype/Widget% @@ -1905,7 +1918,7 @@ \else% \ifdefined\@anim@apdummy\else% empty appearance dummy \setbox\@anim@box=\hbox{\phantom{x}}% - \@anim@xform{0}{0}{}{}{\@anim@box}% + \@anim@xform{0}{1}{}{}{\@anim@box}% \global\let\@anim@apdummy\@anim@lastxform% \fi% \def\@anim@apmk{\@anim@apdummy}% @@ -2015,7 +2028,7 @@ \if@anim@mk\else% \ifdefined\@anim@apdummy\else% empty appearance dummy \setbox\@anim@box=\hbox{\phantom{x}}% - \@anim@xform{0}{0}{}{}{\@anim@box}% + \@anim@xform{0}{1}{}{}{\@anim@box}% \global\let\@anim@apdummy\@anim@lastxform% \fi% \fi% @@ -2119,43 +2132,41 @@ \xdef\@anim@nfps{-1}% \@anim@processfpsarg{#2}% \fi% - \if@anim@export\if@anim@timeline% + \if@anim@export% \anim@export% - \fi\fi% + \fi% \fi% \let\newframe\@anim@@newframe% \let\multiframe\@anim@multiframe% - \if@anim@dvisvgm\if@anim@timeline\else\if@anim@draft\else% - \ifcsname a\the\@anim@num.htbp\endcsname% - \@anim@beginsvgclip{\the\@anim@num}% - \fi% - \fi\fi\fi% \@anim@beginframe% \ignorespaces% }{% \unskip% \@anim@endframe{\the\@anim@num}{\the\@anim@curframe@zb}% - \if@anim@dvisvgm\if@anim@timeline\else\if@anim@draft\else% - \ifcsname a\the\@anim@num.htbp\endcsname% - \@anim@endsvgclip% - \fi% - \fi\fi\fi% \global\advance\@anim@curframe@zb by \@ne% \if@anim@draft\else% \xdef\@anim@frames{\the\@anim@curframe@zb}% total number \global\@anim@tmpcnt=\@anim@frames% \global\advance\@anim@tmpcnt by -\@ne% \xdef\@anim@maxframe{\the\@anim@tmpcnt}% highest frame index - %build timeline from optional timeline file - \if@anim@timeline% - \if@anim@dvisvgm\ifcsname a\the\@anim@num.htbp\endcsname% - \@anim@beginsvgclip{\the\@anim@num}% - \fi\fi% + %make animation frames from embedded content ... + \if@anim@dvisvgm\ifcsname a\the\@anim@num.htbp\endcsname% + \@anim@beginsvgclip{\the\@anim@num}% + \fi\fi% + \if@anim@timeline% ... by building timeline (optional timeline file) \@anim@buildtmln{\the\@anim@num}% - \if@anim@dvisvgm\ifcsname a\the\@anim@num.htbp\endcsname% - \@anim@endsvgclip% - \fi\fi% + \else% ... or by direct insertion + \global\@anim@curframe@zb=\z@% + \whiledo{\@anim@curframe@zb<\@anim@frames}{% + \@anim@makeframe{\the\@anim@num}{\the\@anim@curframe@zb}{% + \@anim@getkeyval{img@\the\@anim@curframe@zb},% + }% + \global\advance\@anim@curframe@zb by \@ne% + }% \fi% + \if@anim@dvisvgm\ifcsname a\the\@anim@num.htbp\endcsname% + \@anim@endsvgclip% + \fi\fi% %insert animation widget & controls \if@anim@export\else% % insert <script> part @@ -2207,7 +2218,7 @@ %process frame rate argument \global\let\@anim@pfps\@anim@nfps% \xdef\@anim@nfps{#1\space}% - \xdef\@anim@nfps{\expandafter\zap@space\@anim@nfps\@empty}% + \xdef\@anim@nfps{\expandafter\@anim@zap@space\@anim@nfps\@empty}% \ifx\@anim@nfps\@empty% no change of frame rate \global\let\@anim@nfps\@anim@pfps% \fi% @@ -2273,9 +2284,6 @@ %starts new frame \def\@anim@beginframe{% - \if@anim@export\if@anim@timeline\else\ifnum\@anim@skipfram=\z@\relax% - \anim@export% - \fi\fi\fi% \begingroup% \lrbox{\@anim@box}% store graphics in a box \ifdefined\@anim@curTxtDir\textdir\@anim@curTxtDir\fi% @@ -2291,7 +2299,7 @@ \ifnum#2=\z@\relax% \ifdim\wd\@anim@box=\z@% \PackageError{animate}{% - Contents of first frame must not have zero width% + Content of first frame must not have zero width% }{% Possible reason: \protect\begin{animateinline}{...} immediately followed by \protect\newframe% @@ -2299,7 +2307,7 @@ \fi% \ifdim\ht\@anim@box=\z@\ifdim\dp\@anim@box=\z@% \PackageError{animate}{% - Contents of first frame must not have zero height% + Content of first frame must not have zero height% }{}% \fi\fi% %draw draftbox according to dimensions of the first frame @@ -2309,18 +2317,15 @@ \fi% \else% remaining frames %deal with zero width or totalheight boxes - \ifdim\wd\@anim@box=\z@\global\setbox\@anim@box=\hbox{\phantom{X}}\fi% + \ifdim\wd\@anim@box=\z@\setbox\@anim@box=\hbox{\phantom{X}}\fi% \ifdim\ht\@anim@box=\z@\ifdim\dp\@anim@box=\z@% - \global\setbox\@anim@box=\hbox{\phantom{X}}% + \setbox\@anim@box=\hbox{\phantom{X}}% \fi\fi% \fi% %now create Form XObject of box contents \if@anim@draft\else% \@anim@xinline{#1}{#2}{\@anim@box}{inline}% \fi% - \if@anim@export\if@anim@timeline\else% - \endanim@export% - \fi\fi% \fi% \global\advance\@anim@skipfram by \@ne% \ifnum\@anim@skipfram=\@anim@every\relax% @@ -2347,7 +2352,7 @@ \global\@anim@mulframecnt=\z@% %remove spaces from variable declaration list (2nd arg) \xdef\@anim@vardecls{#2\space}% - \xdef\@anim@vardecls{\expandafter\zap@space\@anim@vardecls\@empty}% + \xdef\@anim@vardecls{\expandafter\@anim@zap@space\@anim@vardecls\@empty}% \ifnum#1<\z@\relax% \PackageError{animate}{% \protect\multiframe: first argument must be greater than zero% @@ -2386,7 +2391,7 @@ \edef\@anim@vartype{\@anim@getvartype#1\@nil}% \ifthenelse{\equal{\@anim@vartype}{d}\OR\equal{\@anim@vartype}{D}}{% % dimensions, prefix d, D - %initialize variable + %initialise variable \setlength{\@anim@tmpdima}{#2}% \expandafter\edef\csname#1\endcsname{\number\@anim@tmpdima sp}% %global copy that saves current variable value between loops @@ -2408,7 +2413,7 @@ \equal{\@anim@vartype}{n}\OR\equal{\@anim@vartype}{N}% \OR\equal{\@anim@vartype}{r}\OR\equal{\@anim@vartype}{R}% }{% real numbers, prefix n, N, r, R - %initialize variable + %initialise variable \expandafter\edef\csname#1\endcsname{\@anim@fpeval{#2}}% %global copy that saves current variable value between loops \expandafter\xdef\csname#1@old\endcsname{\@anim@fpeval{#2}}% @@ -2424,7 +2429,7 @@ }{% \ifthenelse{\equal{\@anim@vartype}{i}\OR\equal{\@anim@vartype}{I}}{% % integers, prefix i, I - %initialize variable + %initialise variable \setcounter{@anim@ltxcnt}{#2}% \expandafter\edef\csname#1\endcsname{\the@anim@ltxcnt}% %global copy that saves current variable value between loops @@ -2530,14 +2535,11 @@ \@anim@endsanitize% \edef\@anim@inputline{\@anim@inputline\space}% %remove all spaces from input line - \edef\@anim@inputline{\expandafter\zap@space\@anim@inputline\@empty}% + \edef\@anim@inputline{\expandafter\@anim@zap@space\@anim@inputline\@empty}% \ifeof\@anim@@tmlnfile\setboolean{@anim@eof}{true}\else% \setboolean{@anim@eof}{false}\fi% \whiledo{\NOT\boolean{@anim@eof}}{% \ifthenelse{\equal{\@anim@inputline}{}}{}{% - %initialise contents & transparency lists for each frame - \@anim@newkey{trlst@\the\@anim@curframe@zb}{}% - \@anim@newkey{frmcontent@\the\@anim@curframe@zb}{}% \global\advance\@anim@curframe@zb by \@ne% }% \@anim@sanitizeJS% @@ -2545,7 +2547,7 @@ \global\read\@anim@@tmlnfile to \@anim@inputline% \@anim@endsanitize% \edef\@anim@inputline{\@anim@inputline\space}% - \edef\@anim@inputline{\expandafter\zap@space\@anim@inputline\@empty}% + \edef\@anim@inputline{\expandafter\@anim@zap@space\@anim@inputline\@empty}% \ifeof\@anim@@tmlnfile\setboolean{@anim@eof}{true}\else% \setboolean{@anim@eof}{false}\fi% }% @@ -2566,12 +2568,15 @@ \@anim@endsanitize% \edef\@anim@inputlinenospc{\@anim@inputline\space}% \edef\@anim@inputlinenospc{% - \expandafter\zap@space\@anim@inputlinenospc\@empty}% + \expandafter\@anim@zap@space\@anim@inputlinenospc\@empty}% \ifeof\@anim@@tmlnfile\setboolean{@anim@eof}{true}\else% \setboolean{@anim@eof}{false}\fi% \message{<building timeline a#1 from file `\@anim@tmlnfile':}% \whiledo{\NOT\boolean{@anim@eof}}{% \global\advance\@anim@lineno by \@ne% + %initialise content and transparency lists for current frame + \def\@anim@frmcontent{}% + \def\@anim@trlst{}% \ifthenelse{\equal{\@anim@inputlinenospc}{}}{}{% %process input line \global\@anim@curfield=\z@% @@ -2579,13 +2584,13 @@ %combine the layers of the current frame \global\@anim@curlayer=\z@% \loop\ifnum\@anim@curlayer>\@anim@maxlayer\relax\else% - \@anim@newkey{frmcontent@\the\@anim@curframe@zb}{% - \@anim@getkeyval{frmcontent@\the\@anim@curframe@zb}% + \edef\@anim@frmcontent{% + \@anim@frmcontent% \@anim@getkeyval{% layercontent@\the\@anim@curframe@zb.\the\@anim@curlayer}% }% - \@anim@newkey{trlst@\the\@anim@curframe@zb}{% - \@anim@getkeyval{trlst@\the\@anim@curframe@zb}% + \edef\@anim@trlst{% + \@anim@trlst% \@anim@getkeyval{% layertrlst@\the\@anim@curframe@zb.\the\@anim@curlayer}% }% @@ -2596,17 +2601,12 @@ \global\advance\@anim@curlayer by \@ne% \repeat% %detect multiple inclusion of the same transp. in the current frame - \xdef\@anim@trlst{% - \the\@anim@curframe@zb.\@anim@getkeyval{trlst@\the\@anim@curframe@zb}}% - \expandafter\@anim@findmult\@anim@trlst,\@nil% - \if@anim@export\if@anim@insideexport\else\anim@export\fi\fi% + \xdef\@anim@@trlst{\the\@anim@curframe@zb.\@anim@trlst}% + \expandafter\@anim@findmult\@anim@@trlst,\@nil% %insert frame Widget - \@anim@makeframe{#1}{\the\@anim@curframe@zb}% - \if@anim@export\endanim@export\fi% + \@anim@makeframe{#1}{\the\@anim@curframe@zb}{\@anim@frmcontent}% %clean-up - \expandafter\@anim@resetmult\@anim@trlst,\@nil% - \@anim@newkey{trlst@\the\@anim@curframe@zb}{}% - \@anim@newkey{frmcontent@\the\@anim@curframe@zb}{}% + \expandafter\@anim@resetmult\@anim@@trlst,\@nil% \message{.}% \global\advance\@anim@curframe@zb by \@ne% }% @@ -2616,7 +2616,7 @@ \@anim@endsanitize% \edef\@anim@inputlinenospc{\@anim@inputline\space}% \edef\@anim@inputlinenospc{% - \expandafter\zap@space\@anim@inputlinenospc\@empty}% + \expandafter\@anim@zap@space\@anim@inputlinenospc\@empty}% \ifeof\@anim@@tmlnfile\setboolean{@anim@eof}{true}\else% \setboolean{@anim@eof}{false}% \fi% @@ -2653,7 +2653,7 @@ %first field: a star (pause frame) \if@anim@step\else% \edef\@anim@tmp{#1\space}% - \edef\@anim@tmp{\expandafter\zap@space\@anim@tmp\@empty}% + \edef\@anim@tmp{\expandafter\@anim@zap@space\@anim@tmp\@empty}% \ifthenelse{\equal{\@anim@tmp}{*}}{% \xdef\@anim@pauseat{% \@anim@pauseat% @@ -2675,10 +2675,10 @@ %parse the third field (list of layer specifications) \global\@anim@curlayer=\z@% \edef\@anim@tmp{#1\space}% - \edef\@anim@tmp{\expandafter\zap@space\@anim@tmp\@empty}% + \edef\@anim@tmp{\expandafter\@anim@zap@space\@anim@tmp\@empty}% \expandafter\@anim@parsethird\@anim@tmp;\@nil% \edef\@anim@tmp{#2\space}% - \edef\@anim@tmp{\expandafter\zap@space\@anim@tmp\@empty}% + \edef\@anim@tmp{\expandafter\@anim@zap@space\@anim@tmp\@empty}% %fourth field: JavaScript provided by the user \ifx\@anim@tmp\empty\else\@anim@parseforth#2\@nil\fi% \fi% @@ -2700,7 +2700,7 @@ %process JavaScript field \def\@anim@parseforth#1:\@nil{% \edef\@anim@tmp{#1\space}% - \edef\@anim@tmp{\expandafter\zap@space\@anim@tmp\@empty}% + \edef\@anim@tmp{\expandafter\@anim@zap@space\@anim@tmp\@empty}% \ifx\@anim@tmp\@empty\else% \xdef\@anim@usrjsat{% \@anim@usrjsat% @@ -2826,6 +2826,12 @@ }% } +\def\@anim@zap@space#1 #2{% + #1% + \ifx#2\@empty\else\expandafter\@anim@zap@space\fi + #2% +} + %command options \define@key{anim@user}{label}{% \gdef\@anim@label{#1}% @@ -3189,7 +3195,6 @@ %macro to reset macros and booleans \def\@anim@reset{% \gdef\@anim@label{}% - \setboolean{@anim@doscaling}{true}% \global\let\@anim@boxscale\@anim@@boxscale% \global\let\if@anim@iso=\if@anim@@iso% \global\let\@anim@bb\@anim@@bb% @@ -3436,7 +3441,7 @@ \define@key{anim@pkg}{buttonsize}{% \gdef\@anim@@btnsize{#1}% } -\edef\@anim@@alttext{/Contents(animation by animate[\@anim@version])} +\edef\@anim@@alttext{/Contents (animation by animate, v. \@anim@version)} \define@key{anim@pkg}{alttext}{% \ifthenelse{\equal{#1}{none}}{% \gdef\@anim@@alttext{}% diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx index 66e8b05c30..7c5b54eddd 100644 --- a/macros/latex/contrib/easybook/easybook.dtx +++ b/macros/latex/contrib/easybook/easybook.dtx @@ -15,7 +15,7 @@ %<*class> \NeedsTeXFormat{LaTeX2e}[2020/10/01] \RequirePackage{l3keys2e} -\ProvidesExplClass{easybook}{2022/01/30}{1.56} +\ProvidesExplClass{easybook}{2022/01/31}{1.58} {Typeset Chinese theses or books} \bool_set_false:N \l__eb_compile_draft_bool @@ -305,7 +305,7 @@ %<*package> \NeedsTeXFormat{LaTeX2e}[2020/10/01] \RequirePackage{l3keys2e,etoolbox} -\ProvidesExplPackage{easybase}{2022/01/30}{1.56} +\ProvidesExplPackage{easybase}{2022/01/31}{1.58} {Typeset Chinese theses or books} \cs_generate_variant:Nn \dim_set:Nn { NV } @@ -2343,7 +2343,7 @@ } %</package> %<*tcolorbox> -\ProvidesExplFile{eb-tcolorbox.cfg}{2022/01/30}{1.56} +\ProvidesExplFile{eb-tcolorbox.cfg}{2022/01/31}{1.58} {Customization of tcolorbox for easybook} \cs_set_protected:Npn \addtotcbstyle #1#2 diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf Binary files differindex 03cc97c9cc..2380b1c3d2 100644 --- a/macros/latex/contrib/easybook/easybook.pdf +++ b/macros/latex/contrib/easybook/easybook.pdf diff --git a/macros/latex/contrib/easybook/easybook.tex b/macros/latex/contrib/easybook/easybook.tex index 2f36d84435..0a8668bd86 100644 --- a/macros/latex/contrib/easybook/easybook.tex +++ b/macros/latex/contrib/easybook/easybook.tex @@ -21,8 +21,8 @@ name = easybook, color-scheme = blue, title = EASYBOOK 使用手册, - version = v1.56, - date = 2022/01/30, + version = v1.58, + date = 2022/01/31, authors = 瞿毅, info = 排版简体中文学位论文和书籍, email = q1jx@foxmail.com, @@ -698,8 +698,8 @@ \begin{options}\noitemsep \keyval-{headruleskip}{页眉线间距}\Module{geoset}\Default*{0pt} \keyval-{footruleskip}{页脚线间距}\Default*{3.5pt} - \kvsplit*{hdivide}{左边距,页面文本宽度,右边距} - \kvsplit*{hmargin}{左边距,右边距} + \kvsplit*{hdivide}{左边距,页面文本宽度,右边距}\default{} + \kvsplit*{hmargin}{左边距,右边距}\default{} \keyval*-{textheight}{页面文本高度}\default{} \keybool*{nofoot}\Default*{false} \begin{ctexexam} diff --git a/macros/latex/contrib/spbmark/spbmark.pdf b/macros/latex/contrib/spbmark/spbmark.pdf Binary files differindex 956ba69d9e..2baaca2e23 100644 --- a/macros/latex/contrib/spbmark/spbmark.pdf +++ b/macros/latex/contrib/spbmark/spbmark.pdf diff --git a/macros/latex/contrib/spbmark/spbmark.sty b/macros/latex/contrib/spbmark/spbmark.sty index 6b1f60022e..8655a6245d 100644 --- a/macros/latex/contrib/spbmark/spbmark.sty +++ b/macros/latex/contrib/spbmark/spbmark.sty @@ -9,7 +9,7 @@ % https://creativecommons.org/licenses/by/4.0/legalcode \NeedsTeXFormat{LaTeX2e}[2018/12/31] \RequirePackage{xparse,l3keys2e} -\ProvidesExplPackage{spbmark}{2022/01/28}{1.33} +\ProvidesExplPackage{spbmark}{2022/01/31}{1.34} {Customize superscripts and subscripts} \cs_generate_variant:Nn \box_set_ht:Nn { cv } diff --git a/macros/latex/contrib/spbmark/spbmark.tex b/macros/latex/contrib/spbmark/spbmark.tex index fd16319223..42cc8b7dbe 100644 --- a/macros/latex/contrib/spbmark/spbmark.tex +++ b/macros/latex/contrib/spbmark/spbmark.tex @@ -1,13 +1,13 @@ \documentclass[load-preamble+]{cnltx-doc} -\usepackage{spbmark,siunitx} +\usepackage{spbmark,siunitx,pifont} \usepackage[noto]{newtxmath} \setcnltx { package = spbmark, title = the spbmark package, - version = v1.33, - date = 2022/01/28, + version = v1.34, + date = 2022/01/31, authors = Qu Yi, info = Customize superscript and subscript, email = q1jx@foxmail.com, @@ -34,6 +34,7 @@ \newsplitarg{\splitoarg}{[}{]} \newsplitarg{\splitmarg}{\{}{\}} \newsplitarg{\splitdarg}{(}{)} +\newnote*{\newtag}{\textcolor{red}{\ding{73}\ New}} \makeatother \begin{document} @@ -71,7 +72,7 @@ There are currently three commands to set superscript and subscript. Their forma Defines the style of the superscript or subscript used for the \option{style} option. \command{spbifmath}[\marg{math code}\marg{text code}] In some cases, \code{math} or \code{text} output modes require different code for format or move. This command can be used when using the \code{match} option or changing the output mode locally, whitch should be used in the move or format options. It can switch the corresponding code according to different output modes. - \command{spbshortkv}[\marg{short opt}\marg{key value}] + \command{spbshortkv}[\marg{short opt}\marg{key value}]\newtag% Converts any existing key-value pair to a shorthand option. The value of key \code{\#1} indicates that the shorthand option needs to be assigned a value. \begin{example} \spbshortkv{x}{sphmove=#1} @@ -84,7 +85,7 @@ There are currently three commands to set superscript and subscript. Their forma Since the \cs{super} and \cs{sub} commands enclose the scripts in a horizontal box, the horizontal positions are staggered when using both superscript and subscript, which is different from the simultaneous use of \code{\^{}} and \code{\_} symbols in math mode. In this case, you need to adjust the horizontal offset of the latter command or use the \cs{supersub} command. -The options common to \meta{kv list} of the three commands are as follows. They can be used in \meta{key-value list} for the \cs{spbset} command. When the following options are used in the \cs{spbset} command, in addition to \option{style} and \option{mode}, they are set according to the type of the previous most recent command. +The options common to \meta{kv list} of the three commands are as follows. They can also be used in \meta {key-value list} of the \cs{spbset} command. In this situation, in addition to \option{style} and \option{mode}, they will be set according to the type of the previous most recent command. \begin{options} \keyval{vmove}{fixed length}\Default{0pt} Vertical move of superscript or subscript. Represents the extra vertical distance \option{vsep} between superscript and subscript in the superscript and subscript commands. diff --git a/macros/latex/contrib/zref-vario/CHANGELOG.md b/macros/latex/contrib/zref-vario/CHANGELOG.md new file mode 100644 index 0000000000..7702b1e815 --- /dev/null +++ b/macros/latex/contrib/zref-vario/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +## [Unreleased] + +## [v0.1.0-alpha](https://github.com/gusbrs/zref-vario/releases/tag/v0.1.0-alpha) (2022-01-31) + +### Added +- Initial release. diff --git a/macros/latex/contrib/zref-vario/DEPENDS.txt b/macros/latex/contrib/zref-vario/DEPENDS.txt new file mode 100644 index 0000000000..b593a243a7 --- /dev/null +++ b/macros/latex/contrib/zref-vario/DEPENDS.txt @@ -0,0 +1,2 @@ +hard zref-clever +hard varioref diff --git a/macros/latex/contrib/zref-vario/MANIFEST.md b/macros/latex/contrib/zref-vario/MANIFEST.md new file mode 100644 index 0000000000..050277efd7 --- /dev/null +++ b/macros/latex/contrib/zref-vario/MANIFEST.md @@ -0,0 +1,148 @@ +# Manifest for zref-vario + +This file is a listing of all files considered to be part of this package. +It is automatically generated with `l3build manifest`. + + +## Repository manifest + +The following groups list the files included in the development repository of the package. +Files listed with a ‘†’ marker are included in the TDS but not CTAN files, and files listed +with ‘‡’ are included in both. + +### Source files + +These are source files for a number of purposes, including the `unpack` process which +generates the installation files of the package. Additional files included here will also +be installed for processing such as testing. + +* zref-vario.dtx ‡ +* zref-vario.ins ‡ + +### Typeset documentation source files + +These files are typeset using LaTeX to produce the PDF documentation for the package. + +* zref-vario-code.tex ‡ +* zref-vario.tex ‡ + +### Text files + +Plain text files included as documentation or metadata. + +* CHANGELOG.md ‡ +* MANIFEST.md ‡ +* README.md ‡ +* readme-ctan.md +* DEPENDS.txt ‡ + +### Derived files + +The files created by ‘unpacking’ the package sources. This typically includes +`.sty` and `.cls` files created from DocStrip `.dtx` files. + +* zref-vario.sty † + +### Typeset documents + +The output files (PDF, essentially) from typesetting the various source, demo, +etc., package files. + +* zref-vario-code.pdf ‡ +* zref-vario.pdf ‡ + +### Test files + +These files form the test suite for the package. `.lvt` or `.lte` files are the individual +unit tests, and `.tlg` are the stored output for ensuring changes to the package produce +the same output. These output files are sometimes shared and sometime specific for +different engines (pdfTeX, XeTeX, LuaTeX, etc.). + +* zv-basic01.lvt +* zv-basic02.lvt +* zv-basic03.lvt +* zv-basic04.lvt +* zv-hyperref01.lvt +* zv-languages01.lvt +* zv-zcref-options01.lvt +* zv-basic01.luatex.tlg +* zv-basic01.luatexdev.tlg +* zv-basic01.tlg +* zv-basic01.xetex.tlg +* zv-basic01.xetexdev.tlg +* zv-basic02.luatex.tlg +* zv-basic02.luatexdev.tlg +* zv-basic02.tlg +* zv-basic02.xetex.tlg +* zv-basic02.xetexdev.tlg +* zv-basic03.luatex.tlg +* zv-basic03.luatexdev.tlg +* zv-basic03.tlg +* zv-basic03.xetex.tlg +* zv-basic03.xetexdev.tlg +* zv-basic04.luatex.tlg +* zv-basic04.luatexdev.tlg +* zv-basic04.tlg +* zv-basic04.xetex.tlg +* zv-basic04.xetexdev.tlg +* zv-hyperref01.luatex.tlg +* zv-hyperref01.luatexdev.tlg +* zv-hyperref01.tlg +* zv-hyperref01.xetex.tlg +* zv-hyperref01.xetexdev.tlg +* zv-languages01.tlg +* zv-zcref-options01.luatex.tlg +* zv-zcref-options01.luatexdev.tlg +* zv-zcref-options01.tlg +* zv-zcref-options01.xetex.tlg +* zv-zcref-options01.xetexdev.tlg + + +## TDS manifest + +The following groups list the files included in the TeX Directory Structure used to install +the package into a TeX distribution. + +### Source files (TDS) + +All files included in the `zref-vario/source` directory. + +* zref-vario.dtx +* zref-vario.ins + +### TeX files (TDS) + +All files included in the `zref-vario/tex` directory. + +* zref-vario.sty + +### Doc files (TDS) + +All files included in the `zref-vario/doc` directory. + +* CHANGELOG.md +* DEPENDS.txt +* MANIFEST.md +* README.md +* zref-vario-code.pdf +* zref-vario-code.tex +* zref-vario.pdf +* zref-vario.tex + + +## CTAN manifest + +The following group lists the files included in the CTAN package. + +### CTAN files + +* CHANGELOG.md +* DEPENDS.txt +* MANIFEST.md +* README.md +* zref-vario-code.pdf +* zref-vario-code.tex +* zref-vario.dtx +* zref-vario.ins +* zref-vario.pdf +* zref-vario.tex diff --git a/macros/latex/contrib/zref-vario/README.md b/macros/latex/contrib/zref-vario/README.md new file mode 100644 index 0000000000..a76d0b945c --- /dev/null +++ b/macros/latex/contrib/zref-vario/README.md @@ -0,0 +1,19 @@ +# zref-vario + +**Extended LaTeX page cross-references with varioref and zref-clever** + +Author: Gustavo Barros +Maintainer: Gustavo Barros + +`zref-vario` offers a compatibility layer for `varioref` to be used alongside +`zref-clever`. It provides "`\z...`" counterparts to `varioref`'s main +reference commands, each of which essentially does some (scoped) setup for +`varioref`, then calls the original one. + +License: LPPL Version 1.3c + +Repository: https://github.com/gusbrs/zref-vario + +Bug tracker: https://github.com/gusbrs/zref-vario/issues + +CTAN: https://ctan.org/pkg/zref-vario diff --git a/macros/latex/contrib/zref-vario/zref-vario-code.pdf b/macros/latex/contrib/zref-vario/zref-vario-code.pdf Binary files differnew file mode 100644 index 0000000000..00e63f3389 --- /dev/null +++ b/macros/latex/contrib/zref-vario/zref-vario-code.pdf diff --git a/macros/latex/contrib/zref-vario/zref-vario-code.tex b/macros/latex/contrib/zref-vario/zref-vario-code.tex new file mode 100644 index 0000000000..949376f197 --- /dev/null +++ b/macros/latex/contrib/zref-vario/zref-vario-code.tex @@ -0,0 +1,52 @@ +% \iffalse meta-comment +% +% File: zref-vario-code.tex +% +% This file is part of the LaTeX package "zref-vario". +% +% Copyright (C) 2022 Gustavo Barros +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file: +% +% https://www.latex-project.org/lppl.txt +% +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% +% This work is "maintained" (as per LPPL maintenance status) by +% Gustavo Barros. +% +% This work consists of the files zref-vario.dtx, +% zref-vario.ins, +% zref-vario.tex, +% zref-vario-code.tex, +% and the files listed in MANIFEST.md. +% +% The released version of this package is available from CTAN. +% +% ----------------------------------------------------------------------- +% +% The development version of the package can be found at +% +% https://github.com/gusbrs/zref-vario +% +% for those people who are interested. +% +% ----------------------------------------------------------------------- +% +% \fi + +\documentclass{l3doc} + +% Have \GetFileInfo pick up date and version data. +\usepackage{zref-vario} + +\begin{document} + +\DocInput{zref-vario.dtx} + +\end{document} diff --git a/macros/latex/contrib/zref-vario/zref-vario.dtx b/macros/latex/contrib/zref-vario/zref-vario.dtx new file mode 100644 index 0000000000..f58b39af25 --- /dev/null +++ b/macros/latex/contrib/zref-vario/zref-vario.dtx @@ -0,0 +1,908 @@ +% \iffalse meta-comment +% +% File: zref-vario.dtx +% +% This file is part of the LaTeX package "zref-vario". +% +% Copyright (C) 2022 Gustavo Barros +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file: +% +% https://www.latex-project.org/lppl.txt +% +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% +% This work is "maintained" (as per LPPL maintenance status) by +% Gustavo Barros. +% +% This work consists of the files zref-vario.dtx, +% zref-vario.ins, +% zref-vario.tex, +% zref-vario-code.tex, +% and the files listed in MANIFEST.md. +% +% The released version of this package is available from CTAN. +% +% ----------------------------------------------------------------------- +% +% The development version of the package can be found at +% +% https://github.com/gusbrs/zref-vario +% +% for those people who are interested. +% +% ----------------------------------------------------------------------- +% +% \fi +% +% \iffalse +%<*driver> +\documentclass{l3doc} + +% Have \GetFileInfo pick up date and version data and used in the +% documentation. +\usepackage{zref-vario} + +\begin{document} + +\DocInput{zref-vario.dtx} + +\end{document} +%</driver> +% \fi +% +% \DoNotIndex{\\,\{,\}} +% +% \NewDocumentCommand\githubissue{m}{^^A +% issue~\href{https://github.com/gusbrs/zref-vario/issues/#1}{\##1}} +% +% \NewDocumentCommand\githubPR{m}{^^A +% PR~\href{https://github.com/gusbrs/zref-vario/pull/#1}{\##1}} +% +% ^^A Currently just for keeping semantic markup on this. +% \NewDocumentCommand\contributor{m}{#1} +% +% \NewDocumentCommand\opt{m}{\texttt{#1}} +% +% \pdfstringdefDisableCommands{^^A +% \def\opt#1{#1} +% } +% +% ^^A Have the Index at 'section' level rather than 'part'. Otherwise it is +% ^^A just the same definition from 'l3doc.cls'. +% \IndexPrologue{^^A +% \section*{Index} +% \markboth{Index}{Index} +% \addcontentsline{toc}{section}{Index} +% The italic numbers denote the pages where the corresponding entry is +% described, numbers underlined point to the definition, all others indicate +% the places where it is used.^^A +% } +% +% +% \GetFileInfo{zref-vario.sty} +% +% \title{^^A +% The \pkg{zref-vario} package^^A +% \thanks{This file describes \fileversion, released \filedate.}^^A +% \texorpdfstring{\\{}\medskip{}}{ - }^^A +% Code documentation^^A +% \texorpdfstring{\medskip{}}{}^^A +% } +% +% \author{^^A +% Gustavo Barros^^A +% \thanks{\url{https://github.com/gusbrs/zref-vario}}^^A +% } +% +% \date{\filedate} +% +% \maketitle +% +% \begin{center} +% \textbf{EXPERIMENTAL} +% \end{center} +% +% +% \tableofcontents +% +% \clearpage{} +% +% \section{Initial setup} +% +% Start the \pkg{DocStrip} guards. +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% Identify the internal prefix (\LaTeX3 \pkg{DocStrip} convention). +% \begin{macrocode} +%<@@=zrefvario> +% \end{macrocode} +% +% +% Identify the package. +% \begin{macrocode} +\ProvidesExplPackage {zref-vario} {2022-01-31} {0.1.0-alpha} + {Extended LaTeX page cross-references with varioref and zref-clever} +% \end{macrocode} +% +% +% Required packages. +% +% \begin{macrocode} +\RequirePackage { varioref } +\RequirePackage { zref-clever } [ 2022-01-28 ] % v0.2.0-alpha +% \end{macrocode} +% +% +% \section{Customization} +% +% Provide some functions to define options names in a standard form. +% +% \begin{macro}[EXP]{\@@_ref_opt_default_cs:nn} +% \begin{syntax} +% \cs{@@_ref_opt_default_cs:nn} \Arg{option} \Arg{signature} +% \end{syntax} +% \begin{macrocode} +\cs_new:Npn \@@_ref_opt_default_cs:nn #1#2 + { @@_ref_opt_default_ #1 : #2 } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}[EXP]{\@@_base_lang:n} +% \begin{syntax} +% \cs{@@_base_lang:n} \Arg{language} +% \end{syntax} +% \begin{macrocode} +\cs_new:Npn \@@_base_lang:n #1 + { + \zrefclever_language_if_declared:nTF {#1} + { \tl_use:c { \zrefclever_language_varname:n {#1} } } + { zv_unknown_language } + } +\cs_generate_variant:Nn \@@_base_lang:n { e } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l_@@_ref_language_tl} +% An internal version of \cs{l_zrefclever_ref_language_tl}, since we need to +% retreive the current value of the variable in multiple places. +% \begin{macrocode} +\tl_new:N \l_@@_ref_language_tl +\tl_set:Nn \l_@@_ref_language_tl { \l_zrefclever_ref_language_tl } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_ref_opt_name_lang_tl:nn} +% \begin{syntax} +% \cs{@@_ref_opt_name_lang_tl:nn} \Arg{lang} \Arg{option} +% \end{syntax} +% \begin{macrocode} +\cs_new:Npn \@@_ref_opt_name_lang_tl:nn #1#2 + { g_@@_ref_opt_lang_ \@@_base_lang:n {#1} _ #2 _tl } +\cs_generate_variant:Nn \@@_ref_opt_name_lang_tl:nn { en } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_ref_opt_name_lang_cs:nnn} +% \begin{syntax} +% \cs{@@_ref_opt_name_lang_cs:nnn} \Arg{lang} \Arg{option} \Arg{signature} +% \end{syntax} +% \begin{macrocode} +\cs_new:Npn \@@_ref_opt_name_lang_cs:nnn #1#2#3 + { @@_ref_opt_lang_ \@@_base_lang:n {#1} _ #2 : #3 } +\cs_generate_variant:Nn \@@_ref_opt_name_lang_cs:nnn { enn } +% \end{macrocode} +% \end{macro} +% +% +% Retrieving options values. +% +% \begin{macro} +% { +% \@@_ref_opt_tl_get:nnN , +% \@@_ref_opt_cs_get:nnnN , +% } +% \begin{syntax} +% \cs{@@_ref_opt_tl_get:nnN} \Arg{lang} \Arg{option} \Arg{tl var to set} +% \cs{@@_ref_opt_cs_get:nnnN} \Arg{lang} \Arg{option} +% ~~\Arg{cs signature} \Arg{cs to set} +% \end{syntax} +% \begin{macrocode} +\cs_new_protected:Npn \@@_ref_opt_tl_get:nnN #1#2#3 + { + \tl_if_exist:cTF + { \@@_ref_opt_name_lang_tl:nn {#1} {#2} } + { + \tl_set_eq:Nc #3 + { \@@_ref_opt_name_lang_tl:nn {#1} {#2} } + } + { + \tl_set_eq:Nc #3 + { \@@_ref_opt_name_lang_tl:nn { zv_unknown_language } {#2} } + } + } +\cs_generate_variant:Nn \@@_ref_opt_tl_get:nnN { xnN } +\cs_new_protected:Npn \@@_ref_opt_cs_get:nnnN #1#2#3#4 + { + \cs_if_exist:cTF + { \@@_ref_opt_name_lang_cs:nnn {#1} {#2} {#3} } + { + \cs_set_eq:Nc #4 + { \@@_ref_opt_name_lang_cs:nnn {#1} {#2} {#3} } + } + { + \cs_if_exist:cTF + { \@@_ref_opt_default_cs:nn {#2} {#3} } + { + \cs_set_eq:Nc #4 + { \@@_ref_opt_default_cs:nn {#2} {#3} } + } + { + \cs_set_eq:Nc #4 + { + \@@_ref_opt_name_lang_cs:nnn + { zv_unknown_language } {#2} {#3} + } + } + } + } +\cs_generate_variant:Nn \@@_ref_opt_cs_get:nnnN { xnnN } +% \end{macrocode} +% \end{macro} +% +% +% Handle the options set of the user commands, and add support for +% \pkg{varioref} optional arguments. All commands can receive the same set of +% options \cs{zcref} can, and these are processed the same way and +% ``consumed'' by any \cs{zcref} or \cs{zcpageref} calls. Besides those, +% \opt{vother} is made available for \cs{zvpageref}, corresponding to its +% second optional argument, and \opt{vcurrent} which is available to all +% commands except \cs{fullref}, corresponding to their first optional +% arguments. The distinction between \cs{l_@@_reftextcurrent_tl} and +% \cs{l_@@_vref_reftextcurrent_tl} is in their default/initial values. The +% default values for the optional arguments of \cs{vpageref}, \cs{vrefrange}, +% and \cs{vpagerefrange} are set to \cs{reftextcurrent}, while the default +% value of the optional argument of \cs{vref} is empty. +% +% \begin{macrocode} +\tl_new:N \l_@@_reftextcurrent_tl +\tl_set:Nn \l_@@_reftextcurrent_tl { \reftextcurrent } +\tl_new:N \l_@@_vref_reftextcurrent_tl +\tl_new:N \l_@@_reftextother_tl +\keys_define:nn { zref-vario/current } + { + vcurrent .code:n = + { + \tl_set:Nn \l_@@_reftextcurrent_tl {#1} + \tl_set:Nn \l_@@_vref_reftextcurrent_tl {#1} + } , + vcurrent .value_required:n = true , + } +\keys_define:nn { zref-vario/other } + { + vother .tl_set:N = \l_@@_reftextother_tl , + vother .value_required:n = true , + } +\keys_define:nn { } + { + zref-vario/ref .inherit:n = + { zref-clever/reference } , + zref-vario/ref-oneoptarg .inherit:n = + { zref-clever/reference , zref-vario/current } , + zref-vario/ref-twooptargs .inherit:n = + { zref-clever/reference , zref-vario/current , zref-vario/other } , + } +% \end{macrocode} +% +% +% \begin{macro}[int]{\zvLanguageSetup} +% User interface for setting ``strings'' (\texttt{reftext\dots{}} options) and +% ``formats'' (\texttt{\dots{}format} options) for each language. +% \begin{syntax} +% \cs{zvLanguageSetup}\marg{language}\marg{options} +% \end{syntax} +% \begin{macrocode} +\tl_new:N \l_@@_setup_language_tl +\seq_new:N \g_@@_setup_languages_seq +\NewDocumentCommand \zvLanguageSetup { m m } + { + \group_begin: + \zrefclever_language_if_declared:nTF {#1} + { + \tl_set:Nn \l_@@_setup_language_tl {#1} + \keys_set:nn { zref-vario/langsetup } {#2} + \seq_gput_right:Nx \g_@@_setup_languages_seq + { \@@_base_lang:n {#1} } + } + { \msg_warning:nnn { zref-vario } { unknown-language-setup } {#1} } + \group_end: + } +\msg_new:nnn { zref-vario } { unknown-language-setup } + { + Language~'#1'~is~unknown~\msg_line_context:.~Can't~set~it~up.~ + The~language~must~be~declared~for~'zref-clever',~see~its~documentation. + } +\@onlypreamble \zvLanguageSetup +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +\keys_define:nn { zref-vario/langsetup } + { + reftextfaceafter .code:n = + { + \tl_gset:cn + { + \@@_ref_opt_name_lang_tl:en + { \l_@@_setup_language_tl } + { reftextfaceafter } + } {#1} + } , + reftextfacebefore .code:n = + { + \tl_gset:cn + { + \@@_ref_opt_name_lang_tl:en + { \l_@@_setup_language_tl } + { reftextfacebefore } + } {#1} + } , + reftextafter .code:n = + { + \tl_gset:cn + { + \@@_ref_opt_name_lang_tl:en + { \l_@@_setup_language_tl } + { reftextafter } + } {#1} + } , + reftextbefore .code:n = + { + \tl_gset:cn + { + \@@_ref_opt_name_lang_tl:en + { \l_@@_setup_language_tl } + { reftextbefore } + } {#1} + } , + reftextcurrent .code:n = + { + \tl_gset:cn + { + \@@_ref_opt_name_lang_tl:en + { \l_@@_setup_language_tl } + { reftextcurrent } + } {#1} + } , + reftextfaraway .code:n = + { + \cs_gset_nopar:cpn + { + \@@_ref_opt_name_lang_cs:enn + { \l_@@_setup_language_tl } + { reftextfaraway } { n } + } + ##1 + {#1} + } , + reftextpagerange .code:n = + { + \cs_gset_nopar:cpn + { + \@@_ref_opt_name_lang_cs:enn + { \l_@@_setup_language_tl } + { reftextpagerange } { nn } + } + ##1##2 + {#1} + } , + reftextlabelrange .code:n = + { + \cs_gset_nopar:cpn + { + \@@_ref_opt_name_lang_cs:enn + { \l_@@_setup_language_tl } + { reftextlabelrange } { nn } + } + ##1##2 + {#1} + } , + vrefformat .code:n = + { + \cs_gset_nopar:cpn + { + \@@_ref_opt_name_lang_cs:enn + { \l_@@_setup_language_tl } + { vrefformat } { nn } + } + ##1##2 + {#1} + } , + vrefrangeformat .code:n = + { + \cs_gset_nopar:cpn + { + \@@_ref_opt_name_lang_cs:enn + { \l_@@_setup_language_tl } + { vrefrangeformat } { nnn } + } + ##1##2##3 + {#1} + } , + fullrefformat .code:n = + { + \cs_gset_nopar:cpn + { + \@@_ref_opt_name_lang_cs:enn + { \l_@@_setup_language_tl } + { fullrefformat } { n } + } + ##1 + {#1} + } , + } +% \end{macrocode} +% +% +% Default reference formats for all languages. These will be used by +% \cs{@@_ref_opt_cs_get:nnnN}, unless a language specific setting for the same +% format has been set. \cs{zreftextfaraway} is defined so it can be called +% with different arguments in \cs{zvpageref} (where it is alone) and in +% \cs{zfullref} (where it is the second of the pair). +% +% \begin{macrocode} +\cs_new_nopar:cpn + { \@@_ref_opt_default_cs:nn { vrefformat } { nn } } #1#2 + { + \zcref {#2} ~ + \zvpageref [ S=false, typeset=both, vcurrent={#1} ] {#2} + } +\cs_new_nopar:cpn + { \@@_ref_opt_default_cs:nn { vrefrangeformat } { nnn } } #1#2#3 + { + \reftextlabelrange {#2} {#3} ~ + \zvpagerefrange [ S=false, typeset=both, vcurrent={#1} ] {#2} {#3} + } +\cs_new_nopar:cpn + { \@@_ref_opt_default_cs:nn { fullrefformat } { n } } #1 + { + \zcref {#1} ~ + \zreftextfaraway [ S=false, typeset=both ] {#1} + } +\NewDocumentCommand \zreftextfaraway { s O { } m } + { \zref@wrapper@babel \@@_zreftextfaraway:nnn {#3} {#1} {#2} } +\cs_new_protected:Npn \@@_zreftextfaraway:nnn #1#2#3 + { + \group_begin: + \keys_set:nn { zref-vario/ref } {#3} + \bool_if:nT {#2} + { \keys_set:nn { zref-vario/ref } { nohyperref } } + \@@_varioref_setup: + \reftextfaraway {#1} + \group_end: + } +% \end{macrocode} +% +% +% Warnings and values for missing strings / unknown languages. +% +% \begin{macrocode} +\group_begin: +\tl_set:Nn \l_@@_setup_language_tl { zv_unknown_language } +\keys_set:nn { zref-vario/langsetup } + { + reftextfaceafter = + { + \msg_warning:nnxx { zref-vario } { missing-string } + { reftextfaceafter } { \l_@@_ref_language_tl } + \zref@default + } , + reftextfacebefore = + { + \msg_warning:nnxx { zref-vario } { missing-string } + { reftextfacebefore } { \l_@@_ref_language_tl } + \zref@default + } , + reftextafter = + { + \msg_warning:nnxx { zref-vario } { missing-string } + { reftextafter } { \l_@@_ref_language_tl } + \zref@default + } , + reftextbefore = + { + \msg_warning:nnxx { zref-vario } { missing-string } + { reftextbefore } { \l_@@_ref_language_tl } + \zref@default + } , + reftextcurrent = + { + \msg_warning:nnxx { zref-vario } { missing-string } + { reftextcurrent } { \l_@@_ref_language_tl } + \zref@default + } , + reftextfaraway = + { + \msg_warning:nnxx { zref-vario } { missing-string } + { reftextfaraway } { \l_@@_ref_language_tl } + \zref@default + } , + reftextpagerange = + { + \msg_warning:nnxx { zref-vario } { missing-string } + { reftextpagerange } { \l_@@_ref_language_tl } + \zref@default + } , + reftextlabelrange = + { + \msg_warning:nnxx { zref-vario } { missing-string } + { reftextlabelrange } { \l_@@_ref_language_tl } + \zref@default + } , + } +\group_end: +\msg_new:nnn { zref-vario } { missing-string } + { Missing~'#1'~string~for~language~'#2'~\msg_line_context:. } +% \end{macrocode} +% +% +% A general initial warning in case the language is altogether not set up. +% +% \begin{macrocode} +\AddToHook { begindocument } + { + \seq_if_in:NxF \g_@@_setup_languages_seq + { \@@_base_lang:e { \l_@@_ref_language_tl } } + { + \msg_warning:nnx { zref-vario } { language-not-setup } + { \l_@@_ref_language_tl } + } + } +\msg_new:nnn { zref-vario } { language-not-setup } + { + Language~'#1'~is~not~set~up~for~'zref-vario'.~ + See~documentation~for~'\iow_char:N\\zvLanguageSetup'. + } +% \end{macrocode} +% +% +% +% \section{User interface} +% +% \begin{macro} +% { +% \@@_vref_pagenum:Nn , +% \@@_vrefpagenum:Nn , +% \@@_vref_label:n , +% } +% These three small functions are responsible for ``connecting'' +% \pkg{varioref} with \pkg{zref}, instead of with the standard referencing +% system. They are meant to locally replace their \pkg{varioref} +% counterparts: \cs{vref@pagenum}, \cs{vrefpagenum}, and \cs{vref@label}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_vref_pagenum:Nn #1#2 + { + \exp_args:NNNo \exp_args:NNo \tl_set:Nn #1 + { \zref@extractdefault {#2} { page } { ?? } } + } +\cs_new_protected:Npn \@@_vrefpagenum:Nn #1#2 + { + \zref@refused {#2} + \@@_vref_pagenum:Nn #1 {#2} + } +\cs_new_protected:Npn \@@_vref_label:n #1 + { \zref@labelbyprops {#1} { page } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_varioref_setup:} +% Sets things up for \pkg{varioref} to work with \pkg{zref}/\pkg{zref-clever}. +% It is pretty straightforward, but it is the core of the package. +% \cs{l_@@_varioref_setup_bool} ensures this setup runs only once in case of +% nested calls to the package's commands. +% \begin{macrocode} +\bool_new:N \l_@@_varioref_setup_bool +\cs_new_protected:Npn \@@_varioref_setup: + { + \bool_if:NF \l_@@_varioref_setup_bool + { + \bool_set_true:N \l_@@_varioref_setup_bool + \@vrefhandlespacefalse + \cs_set_eq:NN \vref@pagenum \@@_vref_pagenum:Nn + \cs_set_eq:NN \vrefpagenum \@@_vrefpagenum:Nn + \cs_set_eq:NN \vref@label \@@_vref_label:n + \@@_ref_opt_tl_get:xnN + { \l_@@_ref_language_tl } + { reftextfaceafter } + \reftextfaceafter + \@@_ref_opt_tl_get:xnN + { \l_@@_ref_language_tl } + { reftextfacebefore } + \reftextfacebefore + \@@_ref_opt_tl_get:xnN + { \l_@@_ref_language_tl } + { reftextafter } + \reftextafter + \@@_ref_opt_tl_get:xnN + { \l_@@_ref_language_tl } + { reftextbefore } + \reftextbefore + \@@_ref_opt_tl_get:xnN + { \l_@@_ref_language_tl } + { reftextcurrent } + \reftextcurrent + \@@_ref_opt_cs_get:xnnN + { \l_@@_ref_language_tl } + { reftextfaraway } { n } + \reftextfaraway + \@@_ref_opt_cs_get:xnnN + { \l_@@_ref_language_tl } + { reftextpagerange } { nn } + \reftextpagerange + \@@_ref_opt_cs_get:xnnN + { \l_@@_ref_language_tl } + { reftextlabelrange } { nn } + \reftextlabelrange + \@@_ref_opt_cs_get:xnnN + { \l_@@_ref_language_tl } + { vrefformat } { nn } + \vrefformat + \@@_ref_opt_cs_get:xnnN + { \l_@@_ref_language_tl } + { vrefrangeformat } { nnn } + \vrefrangeformat + \@@_ref_opt_cs_get:xnnN + { \l_@@_ref_language_tl } + { fullrefformat } { n } + \fullrefformat + } + } +% \end{macrocode} +% \end{macro} +% +% +% User commands. +% +% \begin{macro}[int]{\zvref} +% \begin{syntax} +% \cs{zvref}\meta{*}\oarg{options}\marg{label} +% \end{syntax} +% \begin{macrocode} +\NewDocumentCommand \zvref { s O { } m } + { \zref@wrapper@babel \@@_zvref:nnn {#3} {#1} {#2} } +\cs_new_protected:Npn \@@_zvref:nnn #1#2#3 + { + \group_begin: + \keys_set:nn { zref-vario/ref-oneoptarg } {#3} + \bool_if:nT {#2} + { \keys_set:nn { zref-vario/ref } { nohyperref } } + \@@_varioref_setup: + \@@_vref:Vn \l_@@_vref_reftextcurrent_tl {#1} + \group_end: + } +% \end{macrocode} +% ``Ideally'', we'd be using \cs{vref} here, but \pkg{hyperref} redefines +% \cs{vref@star} and \cs{vr@f}, hard-coding what was supposed to be +% configurable\dots{}, so we use \cs{vrefformat} instead, which is the +% original definition of \cs{vref@star}, and \cs{vr@f} also boils down to +% \cs{vref@star} when \cs{@vrefhandlespace} is false, which is our case. +% \begin{macrocode} +\cs_new_protected:Npn \@@_vref:nn #1#2 + { \vrefformat {#1} {#2} } +\cs_generate_variant:Nn \@@_vref:nn { Vn } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}[int]{\zvpageref} +% \begin{syntax} +% \cs{zvpageref}\meta{*}\oarg{options}\marg{label} +% \end{syntax} +% \begin{macrocode} +\NewDocumentCommand \zvpageref { s O { } m } + { \zref@wrapper@babel \@@_zvpageref:nnn {#3} {#1} {#2} } +\cs_new_protected:Npn \@@_zvpageref:nnn #1#2#3 + { + \group_begin: + \keys_set:nn { zref-vario/ref-twooptargs } {#3} + \bool_if:nT {#2} + { \keys_set:nn { zref-vario/ref } { nohyperref } } + \@@_varioref_setup: + \@@_vpageref:VVn \l_@@_reftextcurrent_tl + \l_@@_reftextother_tl {#1} + \group_end: + } +\cs_new_protected:Npn \@@_vpageref:nnn #1#2#3 + { \vpageref [{#1}] [#2] {#3} } +\cs_generate_variant:Nn \@@_vpageref:nnn { VVn } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}[int]{\zvrefrange} +% \begin{syntax} +% \cs{zvrefrange}\meta{*}\oarg{options}\marg{label}\marg{label} +% \end{syntax} +% \begin{macrocode} +\NewDocumentCommand \zvrefrange { s O { } m m } + { + \zref@wrapper@babel + { \zref@wrapper@babel \@@_zvrefrange:nnnn {#3} } + {#4} {#1} {#2} + } +\cs_new_protected:Npn \@@_zvrefrange:nnnn #1#2#3#4 + { + \group_begin: + \keys_set:nn { zref-vario/ref-oneoptarg } {#4} + \bool_if:nT {#3} + { \keys_set:nn { zref-vario/ref } { nohyperref } } + \@@_varioref_setup: + \@@_vrefrange:Vnn \l_@@_reftextcurrent_tl {#1} {#2} + \group_end: + } +\cs_new_protected:Npn \@@_vrefrange:nnn #1#2#3 + { \vrefrange [{#1}] {#2} {#3} } +\cs_generate_variant:Nn \@@_vrefrange:nnn { Vnn } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}[int]{\zvpagerefrange} +% \begin{syntax} +% \cs{zvpagerefrange}\meta{*}\oarg{options}\marg{label}\marg{label} +% \end{syntax} +% \begin{macrocode} +\NewDocumentCommand \zvpagerefrange { s O { } m m } + { + \zref@wrapper@babel + { \zref@wrapper@babel \@@_zvpagerefrange:nnnn {#3} } + {#4} {#1} {#2} + } +\cs_new_protected:Npn \@@_zvpagerefrange:nnnn #1#2#3#4 + { + \group_begin: + \keys_set:nn { zref-vario/ref-oneoptarg } {#4} + \bool_if:nT {#3} + { \keys_set:nn { zref-vario/ref } { nohyperref } } + \@@_varioref_setup: + \@@_vpagerefrange:Vnn \l_@@_reftextcurrent_tl {#1} {#2} + \group_end: + } +\cs_new_protected:Npn \@@_vpagerefrange:nnn #1#2#3 + { \vpagerefrange [{#1}] {#2} {#3} } +\cs_generate_variant:Nn \@@_vpagerefrange:nnn { Vnn } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}[int]{\zfullref} +% \begin{syntax} +% \cs{zfullref}\meta{*}\oarg{options}\marg{label} +% \end{syntax} +% \begin{macrocode} +\NewDocumentCommand \zfullref { s O { } m } + { \zref@wrapper@babel \@@_zfullref:nnn {#3} {#1} {#2} } +\cs_new_protected:Npn \@@_zfullref:nnn #1#2#3 + { + \group_begin: + \keys_set:nn { zref-vario/ref } {#3} + \bool_if:nT {#2} + { \keys_set:nn { zref-vario/ref } { nohyperref } } + \@@_varioref_setup: + \fullref {#1} + \group_end: + } +% \end{macrocode} +% \end{macro} +% +% +% +% \section{Languages} +% +% +% \begin{macrocode} +\zvLanguageSetup { english } + { + reftextfaceafter = {on~the~\reftextvario{facing}{next}~page} , + reftextfacebefore = {on~the~\reftextvario{facing}{preceding}~page} , + reftextafter = {on~the~\reftextvario{following}{next}~page} , + reftextbefore = {on~the~\reftextvario{preceding}{previous}~page} , + reftextcurrent = {on~\reftextvario{this}{the~current}~page} , + reftextfaraway = {on~\zcpageref{#1}} , + reftextpagerange = {on~\zcpageref[range]{#1,#2}} , + reftextlabelrange = {\zcref[range]{#1,#2}} , + } +% \end{macrocode} +% +% +% \begin{macrocode} +\zvLanguageSetup { german } + { + reftextfaceafter = {auf~der~nächsten~Seite} , + reftextfacebefore = {auf~der~vorherigen~Seite} , + reftextafter = {auf~der~nächsten~Seite} , + reftextbefore = {auf~der~vorherigen~Seite} , + reftextcurrent = {auf~dieser~Seite} , + reftextfaraway = {auf~\zcpageref[d=D,g=f]{#1}} , + reftextpagerange = {auf~den~\zcpageref[range,d=D,g=f]{#1,#2}} , + reftextlabelrange = {\zcref[range]{#1,#2}} , + } +% \end{macrocode} +% +% +% \begin{macrocode} +\zvLanguageSetup { french } + { + reftextfaceafter = {page~\reftextvario{ci-contre}{suivante}} , + reftextfacebefore = {page~\reftextvario{ci-contre}{précédente}} , + reftextafter = {page~suivante} , + reftextbefore = {page~précédente} , + reftextcurrent = {de~la~présente~page} , + reftextfaraway = {\zcpageref[g=f]{#1}} , + reftextpagerange = {\zcpageref[range,g=f]{#1,#2}} , + reftextlabelrange = {\zcref[range]{#1,#2}} , + } +% \end{macrocode} +% +% +% \begin{macrocode} +\zvLanguageSetup { portuguese } + { + reftextfaceafter = {na~\reftextvario{página~oposta}{próxima~página}} , + reftextfacebefore = {na~página~\reftextvario{oposta}{anterior}} , + reftextafter = {na~\reftextvario{página~seguinte}{próxima~página}} , + reftextbefore = {na~página~\reftextvario{anterior}{precedente}} , + reftextcurrent = {nesta~página} , + reftextfaraway = {na~\zcpageref[g=f]{#1}} , + reftextpagerange = {nas~\zcpageref[range,g=f]{#1,#2}} , + reftextlabelrange = {\zcref[range]{#1,#2}} , + } +% \end{macrocode} +% +% +% \begin{macrocode} +\zvLanguageSetup { spanish } + { + reftextfaceafter = {en~la~página~siguiente} , + reftextfacebefore = {en~la~página~anterior} , + reftextafter = {en~la~página~siguiente} , + reftextbefore = {en~la~página~anterior} , + reftextcurrent = {en~esta~página} , + reftextfaraway = {en~la~\zcpageref[g=f]{#1}} , + reftextpagerange = {en~las~\zcpageref[range,g=f]{#1,#2}} , + reftextlabelrange = {\zcref[range]{#1,#2}} , + } +% \end{macrocode} +% +% +% \begin{macrocode} +\zvLanguageSetup { dutch } + { + reftextfaceafter = {op~de~\reftextvario{rechter~pagina}{pagina~hiernaast}} , + reftextfacebefore = {op~de~\reftextvario{linker~pagina}{pagina~hiernaast}} , + reftextafter = {op~de~\reftextvario{volgende~pagina}{pagina~hierna}} , + reftextbefore = {op~de~\reftextvario{vorige~pagina}{pagina~hiervoor}} , + reftextcurrent = {op~deze~pagina} , + reftextfaraway = {op~\zcpageref[g=f]{#1}} , + reftextpagerange = {op~\zcpageref[range,g=f]{#1,#2}} , + reftextlabelrange = {\zcref[range]{#1,#2}} , + } +% \end{macrocode} +% +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% +% \PrintIndex +% diff --git a/macros/latex/contrib/zref-vario/zref-vario.ins b/macros/latex/contrib/zref-vario/zref-vario.ins new file mode 100644 index 0000000000..c04eb45c3e --- /dev/null +++ b/macros/latex/contrib/zref-vario/zref-vario.ins @@ -0,0 +1,94 @@ +% \iffalse meta-comment +% +% File: zref-vario.ins +% +% This file is part of the LaTeX package "zref-vario". +% +% Copyright (C) 2022 Gustavo Barros +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file: +% +% https://www.latex-project.org/lppl.txt +% +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% +% This work is "maintained" (as per LPPL maintenance status) by +% Gustavo Barros. +% +% This work consists of the files zref-vario.dtx, +% zref-vario.ins, +% zref-vario.tex, +% zref-vario-code.tex, +% and the files listed in MANIFEST.md. +% +% The released version of this package is available from CTAN. +% +% ----------------------------------------------------------------------- +% +% The development version of the package can be found at +% +% https://github.com/gusbrs/zref-vario +% +% for those people who are interested. +% +% ----------------------------------------------------------------------- +% +% \fi + +\input l3docstrip.tex + +\keepsilent + +\askforoverwritefalse + +\preamble + +This file was generated from file(s) of the LaTeX package "zref-vario". + +Copyright (C) 2022 Gustavo Barros + +It may be distributed and/or modified under the conditions of the +LaTeX Project Public License (LPPL), either version 1.3c of this +license or (at your option) any later version. The latest version +of this license is in the file: + + https://www.latex-project.org/lppl.txt + +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. + + +This work is "maintained" (as per LPPL maintenance status) by + Gustavo Barros. + +This work consists of the files zref-vario.dtx, + zref-vario.ins, + zref-vario.tex, + zref-vario-code.tex, + and the files listed in MANIFEST.md. + +The released version of this package is available from CTAN. + +----------------------------------------------------------------------- + +The development version of the package can be found at + + https://github.com/gusbrs/zref-vario + +for those people who are interested. + +----------------------------------------------------------------------- + +\endpreamble + +\postamble +\endpostamble + +\generate{\file{zref-vario.sty}{\from{zref-vario.dtx}{package}}} + +\endbatchfile diff --git a/macros/latex/contrib/zref-vario/zref-vario.pdf b/macros/latex/contrib/zref-vario/zref-vario.pdf Binary files differnew file mode 100644 index 0000000000..8ff1c89bca --- /dev/null +++ b/macros/latex/contrib/zref-vario/zref-vario.pdf diff --git a/macros/latex/contrib/zref-vario/zref-vario.tex b/macros/latex/contrib/zref-vario/zref-vario.tex new file mode 100644 index 0000000000..522e46a207 --- /dev/null +++ b/macros/latex/contrib/zref-vario/zref-vario.tex @@ -0,0 +1,261 @@ +% \iffalse meta-comment +% +% File: zref-vario.tex +% +% This file is part of the LaTeX package "zref-vario". +% +% Copyright (C) 2022 Gustavo Barros +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file: +% +% https://www.latex-project.org/lppl.txt +% +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% +% This work is "maintained" (as per LPPL maintenance status) by +% Gustavo Barros. +% +% This work consists of the files zref-vario.dtx, +% zref-vario.ins, +% zref-vario.tex, +% zref-vario-code.tex, +% and the files listed in MANIFEST.md. +% +% The released version of this package is available from CTAN. +% +% ----------------------------------------------------------------------- +% +% The development version of the package can be found at +% +% https://github.com/gusbrs/zref-vario +% +% for those people who are interested. +% +% ----------------------------------------------------------------------- +% +% \fi + +\documentclass{l3doc} + +% The package itself *must* be loaded so that \GetFileInfo can pick up date +% and version data. +\usepackage{zref-vario} + +\usepackage[T1]{fontenc} + +\usepackage[sc]{mathpazo} +\linespread{1.05} +\usepackage[scale=.88]{tgheros} % sans +\usepackage[varqu,scaled=1.03]{inconsolata} % tt + +\usepackage{listings} + +\usepackage{microtype} + +\hypersetup{hidelinks} + +\NewDocumentCommand\opt{m}{\texttt{#1}} + +\lstdefinestyle{code}{ + language=[LaTeX]TeX, + % moretexcs={ + % } +} +\lstdefinestyle{zrefvario}{ + style=code, + % moretexcs={ + % } +} +\lstset{ + style=zrefvario, + basicstyle=\ttfamily\small, + columns=fullflexible, + keepspaces, + xleftmargin=\leftmargin, + xrightmargin=.5\leftmargin, +} +\lstnewenvironment{zvexample}[1][]{% + \renewcommand{\lstlistingname}{Example}% + \lstset{#1}% +}{} + +\begin{document} + +\GetFileInfo{zref-vario.sty} + +\title{% + The \pkg{zref-vario} package% + \thanks{This file describes \fileversion, released \filedate.}% + \texorpdfstring{\\{}\medskip{}}{ - }% + User manual% + \texorpdfstring{\medskip{}}{}% +} + +\author{% + Gustavo Barros% + \thanks{\url{https://github.com/gusbrs/zref-vario}}% +} + +\date{\filedate} + +\maketitle + +\begin{center} + {\bfseries \abstractname\vspace{-.5em}\vspace{0pt}} +\end{center} + +\begin{quotation} + \pkg{zref-vario} offers a compatibility layer for \pkg{varioref} to be used + alongside \pkg{zref-clever}. It provides ``\texttt{\cs{z}}\dots{}'' + counterparts to \pkg{varioref}'s main reference commands, each of which + essentially does some (scoped) setup for \pkg{varioref}, then calls the + original one. +\end{quotation} + +\bigskip{} + +\begin{center} + \textbf{EXPERIMENTAL} +\end{center} + +\tableofcontents + +\clearpage{} + +\section{Loading the package} + +As usual: + +\begin{zvexample} +\usepackage{zref-vario} +\end{zvexample} + + +\section{Dependencies} + +\pkg{zref-vario} requires \pkg{varioref} and \pkg{zref-clever}. + + +\section{User interface} + +\begin{function}{\zvref} + \begin{syntax} + \cs{zvref}\meta{*}\oarg{options}\marg{label} + \end{syntax} +\end{function} + +\begin{function}{\zvpageref} + \begin{syntax} + \cs{zvpageref}\meta{*}\oarg{options}\marg{label} + \end{syntax} +\end{function} + +\begin{function}{\zvrefrange} + \begin{syntax} + \cs{zvrefrange}\meta{*}\oarg{options}\marg{label}\marg{label} + \end{syntax} +\end{function} + +\begin{function}{\zvpagerefrange} + \begin{syntax} + \cs{zvpagerefrange}\meta{*}\oarg{options}\marg{label}\marg{label} + \end{syntax} +\end{function} + +\begin{function}{\zfullref} + \begin{syntax} + \cs{zfullref}\meta{*}\oarg{options}\marg{label} + \end{syntax} +\end{function} + +These user commands work pretty much as their \pkg{varioref} +counterparts.\footnote{If you are not acquainted with them, see + \pkg{varioref}'s documentation.} Indeed, they are just wrappers around +them. As such, differently from \pkg{zref-clever}'s commands, these can +receive single labels as arguments, not lists of them. In all of them the +starred version inhibits hyperlinking, and they (locally) set \pkg{varioref}'s +\opt{nospace} option, so that the this syntax can be used unambiguously. + +All of them have a single optional argument, which can receive any of +\cs{zcref}'s options, and those are set for calls to \cs{zcref} or +\cs{zpageref} which are part of the building blocks of the reference formats +and strings set for \pkg{varioref}. However, there is indeed some potential +friction and caveats stemming from the use of these options, which were +designed to work for single calls of \cs{zcref}, to apply to \emph{pairs} of +them. Hence, whether each and every of these options is meaningful, useful, +or potentially harmful in this context depends on the case, and it is up to +the user to make proper use of them. Of course, one can always split the pair +using \cs{zcref} and then \cs{zvpageref}, \cs{zvpagerefrange}, or +\cs{zcpageref}, and have more control over each part. Anyway, the package +does what it says: passes the options along to the underlying call(s) to +\cs{zcref}.\footnote{Note that the options given to each call of these user + macros are set \emph{before} the call to the original \pkg{varioref} + counterpart. This means that options given to \cs{zcref} or \cs{zpageref} + in the strings and formats in \cs{zvLanguageSetup} will have precedence over + the former. Which is useful, so that we can distinguish to some degree the + first from the second call of \cs{zcref}/\cs{zpageref} done in the formats, + but does not eliminate the limitations which arise from the underlying + problem.} + +Besides these options, two other are provided corresponding to +\pkg{varioref}'s commands' optional arguments: \opt{vcurrent} (the first +optional argument) and \opt{vother} (the second optional argument). Of +course, these are only available when the underlying \pkg{varioref} command +supports them. + +\section{Customization} + + +\begin{function}{\zvLanguageSetup} + \begin{syntax} + \cs{zvLanguageSetup}\marg{language}\marg{options} + \end{syntax} +\end{function} + +User interface for customization of ``strings'' and ``formats'' for +\meta{language}. \meta{language} must be known to \pkg{zref-clever}. The +\meta{options} are familiar to users of \pkg{varioref}: +\opt{reftextfaceafter}, \opt{reftextfacebefore}, \opt{reftextafter}, +\opt{reftextbefore}, \opt{reftextcurrent}, \opt{reftextfaraway}, +\opt{reftextpagerange}, \opt{reftextlabelrange}, \opt{vrefformat}, +\opt{vrefrangeformat}, and \opt{fullrefformat}.\footnote{For details, see + \pkg{varioref}'s documentation.} Their meaning is the same as the ones they +have in \pkg{varioref} and, indeed, they work by setting those \pkg{varioref} +macros to the values given to the corresponding options in +\cs{zvLanguageSetup}. If you are setting up a language which has no built-in +support, you should set at least the whole set of ``\texttt{reftext}\dots{}'' +options. Language independent default values are provided for the +``\dots{}\texttt{format}'' options (equivalent to the ones from +\pkg{varioref}, which are adequate to most use cases), so you may omit them. +But, if you need to adjust them, the default values can be overridden by +setting the corresponding options in \cs{zvLanguageSetup}. + + +% \section{Acknowledgments} +% +% A number of people have contributed to \pkg{zref-vario}. Suggestions, +% ideas, solutions to problems, bug reports or even encouragement were +% generously provided by (in chronological order): +% +% The package's language settings have been provided or improved thanks to: +% +% If I have inadvertently left anyone off the list I apologize, and please let +% me know, so that I can correct the oversight. +% +% Thank you all very much! + + +\section{Change history} + +A change log with relevant changes for each version, eventual upgrade +instructions, and upcoming changes, is maintained in the package's repository, +at \url{https://github.com/gusbrs/zref-vario/blob/main/CHANGELOG.md}. An +archive of historical versions of the package is also kept at +\url{https://github.com/gusbrs/zref-vario/releases}. + +\end{document} |