diff options
author | Karl Berry <karl@freefriends.org> | 2020-04-14 21:06:44 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-04-14 21:06:44 +0000 |
commit | bbe9e3a2874a81d4559603fc57aa37a0f53ae4bb (patch) | |
tree | 3b44a4b917247d46f8b79043e2a2774a9e118d3c /Master/texmf-dist/tex/latex/yquant/yquant-registers.tex | |
parent | 70ceb95a32e274762041dec44d43760f70c2dd31 (diff) |
yquant (14apr20)
git-svn-id: svn://tug.org/texlive/trunk@54737 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/yquant/yquant-registers.tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/yquant/yquant-registers.tex | 365 |
1 files changed, 293 insertions, 72 deletions
diff --git a/Master/texmf-dist/tex/latex/yquant/yquant-registers.tex b/Master/texmf-dist/tex/latex/yquant/yquant-registers.tex index 7f640fe4996..18a23662d3b 100644 --- a/Master/texmf-dist/tex/latex/yquant/yquant-registers.tex +++ b/Master/texmf-dist/tex/latex/yquant/yquant-registers.tex @@ -17,7 +17,8 @@ {#1}% type {#2}% x pos {\yquant@config@register@minimum@height}% height; at the end, the y position - {}% wire start positions + {{0pt}{0pt}{}{}}% wire start positions and clipping + {}% wire style }% \global\csletcs{\yquant@prefix registername@#3[#4]}{\yquant@prefix registers}% \csxdef{\yquant@prefix registerhigh@\reg}{#4}% @@ -63,34 +64,34 @@ } \def\yquant@register@get@id@lazycreate@parse#1[#2;{% - \if\relax\detokenize{#2}\relax% + \ifstrempty{#2}{% \yquant@register@get@id@lazycreate@do#1[0][;% - \else% + }{% \yquant@register@get@id@lazycreate@do#1[#2;% - \fi% + }% } \protected\def\yquant@register@get@id@lazycreate@do#1[#2]#3[;{% - % parse length - \if\relax\detokenize{#3}\relax% - \yquant@langhelper@validate\len\count{#2}% - \numdef\len{\len+1}% - \else% - \PackageError{yquant.sty}{Invalid register name}% - {Register names must not contain `[' apart from register length indication.}% - \fi% - \edef\reg{\trim@spaces{#1}}% - % Was this register already defined? - \ifcsname\yquant@prefix registerhigh@\reg\endcsname% - \numdef\idx{\csname\yquant@prefix registerhigh@\reg\endcsname+1}% - \unless\ifnum\idx<\len\relax% - \PackageError{yquant.sty}{Internal inconsistency detected}% - {Tried to create a register on-the-fly that already existed.}% - \fi% - \else% - \def\idx{0}% - \fi% \begingroup% + % parse length + \ifstrempty{#3}{% + \yquant@langhelper@validate\len\count{#2}% + \numdef\len{\len+1}% + }{% + \PackageError{yquant.sty}{Invalid register name}% + {Register names must not contain `[' apart from register length indication.}% + }% + \edef\reg{\trim@spaces{#1}}% + % Was this register already defined? + \ifcsname\yquant@prefix registerhigh@\reg\endcsname% + \numdef\idx{\csname\yquant@prefix registerhigh@\reg\endcsname+1}% + \unless\ifnum\idx<\len\relax% + \PackageError{yquant.sty}{Internal inconsistency detected}% + {Tried to create a register on-the-fly that already existed.}% + \fi% + \else% + \def\idx{0}% + \fi% % pre-set y position \yquant@for \idx := \idx to \numexpr \len -1\relax {% \yquant@register@define% @@ -129,6 +130,7 @@ \count4=0 % number of total registers \ifblank{#1}{}{% \let\ifinmulti=\iffalse% + \let\ifallowmain=\iffalse% \let\do=\yquant@register@get@ids@outerlist% \begingroup% \catcode`[=\active% @@ -169,9 +171,15 @@ \count0=2147483647 % minimal id \count2=0 % maximal id \count4=0 % number of total registers + \count6=-1 % index of main register \let\ifinmulti=\iftrue% + \let\ifallowmain=\iftrue% \let\do=\yquant@register@get@ids@multilist% \docsvlist{#1}% + \ifnum\count6=-1 % + \count6=\count0 % + \fi% + \yquant@register@multi@splitparts% \edef\process{% \endgroup% \noexpand\listadd\noexpand\yquant@register@get@ids@list{% @@ -195,13 +203,13 @@ } \def\yquant@register@get@ids@checkrange#1-#2\yquant@sep{% - \if\relax\detokenize{#2}\relax% + \ifstrempty{#2}{% % the string does not contain a dash \yquant@register@get@ids@norange{#1}% - \else% + }{% % this is a range argument \yquant@register@get@ids@range#1-#2\yquant@sep% - \fi% + }% } \def\yquant@register@get@ids@norange#1{% @@ -214,7 +222,30 @@ \protected\def\yquant@register@get@ids@norange@checkindex#1\yquant@register@get@ids@@index#2\yquant@sep{% \edef\current{\trim@spaces{#1}}% - \if\relax\detokenize{#2}\relax% + \ifallowmain% + \expandafter\ifyquant@firsttoken\expandafter*\expandafter{\current}{% + \edef\current{% + \expandafter\expandafter\expandafter\trim@spaces% + \expandafter\expandafter\expandafter{% + \expandafter\@gobble\current% + }% + }% + % catch the minimal index + \edef\yquant@register@get@ids@norange@checkindex@setmain{% + \count6=\count2% + \ifnum\count0<\the\count0 % + \count0=\the\count0 % + \fi% + }% + \count0=2147483647 % + \csletcs{ifallowmain}{iffalse}% + }{ + \let\yquant@register@get@ids@norange@checkindex@setmain=\relax% + }% + \else% + \let\yquant@register@get@ids@norange@checkindex@setmain=\relax% + \fi% + \ifstrempty{#2}{% % the string does not contain a sub-index; we add the full register \yquant@register@get@id\first{\current[0]}% \letcs\high{\yquant@prefix registerhigh@\current}% @@ -230,9 +261,10 @@ \yquant@register@get@id\idx{\current[\i]}% \listeadd\yquant@register@get@ids@list{\idx}% }% - \else% + }{% \yquant@register@get@ids@norange@index#2% - \fi% + }% + \yquant@register@get@ids@norange@checkindex@setmain% } \protected\def\yquant@register@get@ids@norange@index#1\yquant@register@get@ids@@index{% @@ -269,9 +301,15 @@ \count0=2147483647 % minimal id \count2=0 % maximal id \count4=0 % number of total registers + \count6=-1 % index of main register \let\ifinmulti=\iftrue% + \let\ifallowmain=\iftrue% \let\do=\yquant@register@get@ids@subindex@nomulti% \docsvlist{#1}% + \ifnum\count6=-1 % + \count6=\count0 % + \fi% + \yquant@register@multi@splitparts% \edef\process{% \endgroup% \noexpand\listadd\noexpand\yquant@register@get@ids@list{% @@ -291,17 +329,29 @@ } \def\yquant@register@get@ids@subindex@checkrange#1-#2\yquant@sep{% - \if\relax\detokenize{#2}\relax% + \ifstrempty{#2}{% % the string does not contain a dash, this is a single sub-item - \yquant@register@get@ids@subindex@norange{\trim@spaces{#1}}% - \else% + \edef\idx{\trim@spaces{#1}}% + \expandafter\yquant@register@get@ids@subindex@norange\expandafter{\idx}% + }{% % this is a range argument \yquant@register@get@ids@subindex@range#1-#2\yquant@sep% - \fi% + }% } \protected\def\yquant@register@get@ids@subindex@norange#1{% - \yquant@register@get@id\idx{\current[#1]}% + \ifallowmain%% + \ifyquant@firsttoken*{#1}{% + \edef\idx{\current[\expandafter\trim@spaces\expandafter{\@gobble#1}]}% + \expandafter\yquant@register@get@id\expandafter\idx\expandafter{\idx}% + \count6=\idx% + \csletcs{ifallowmain}{iffalse}% + }{ + \yquant@register@get@id\idx{\current[#1]}% + }% + \else% + \yquant@register@get@id\idx{\current[#1]}% + \fi% \ifnum\idx<\count0 % \count0=\idx\relax% \fi% @@ -313,16 +363,55 @@ } \protected\def\yquant@register@get@ids@subindex@range#1-#2-\yquant@sep{% - \ifblank{#1}{% - \def\first{0}% - }{% - \yquant@langhelper@validate\first\count{#1}% - }% - \ifblank{#2}{% - \yquant@register@get@id@high\last\current% - }{% - \yquant@langhelper@validate\last\count{#2}% - }% + \ifallowmain% + \ifyquant@firsttoken*{#1}{% + \expandafter\ifblank\expandafter{\@gobble#1}{% + \def\first{0}% + }{% + \expandafter\yquant@langhelper@validate\expandafter\first\expandafter\count\expandafter{\@gobble#1}% + }% + \yquant@register@get@id\idx{\current[\first]}% + \count6=\idx% + \csletcs{ifallowmain}{iffalse}% + }{% + \ifblank{#1}{% + \def\first{0}% + }{% + \yquant@langhelper@validate\first\count{#1}% + }% + }% + \else% + \ifblank{#1}{% + \def\first{0}% + }{% + \yquant@langhelper@validate\first\count{#1}% + }% + \fi% + \ifallowmain% + % in #1, all initial spaces are gobbled automatically, but not in #2 + \expandafter\ifyquant@firsttoken\expandafter*\expandafter{\empty#2}{% + \expandafter\ifblank\expandafter{\@gobble#2}{% + \yquant@register@get@id@high\last\current% + }{% + \expandafter\yquant@langhelper@validate\expandafter\last\expandafter\count\expandafter{\@gobble#2}% + }% + \yquant@register@get@id\idx{\current[\last]}% + \count6=\idx% + \csletcs{ifallowmain}{iffalse}% + }{% + \ifblank{#2}{% + \yquant@register@get@id@high\last\current% + }{% + \yquant@langhelper@validate\last\count{#2}% + }% + }% + \else% + \ifblank{#2}{% + \yquant@register@get@id@high\last\current% + }{% + \yquant@langhelper@validate\last\count{#2}% + }% + \fi% \yquant@for \i := \first to \last {% \yquant@register@get@ids@subindex@norange\i% }% @@ -330,14 +419,33 @@ \protected\def\yquant@register@get@ids@range#1-#2-\yquant@sep{% % being a range between two registers, those must be uniquely identifiable, i.e. either a single sub-indexed part of a vector register, or no vector specification at all. - \ifblank{#1}{% - \def\first{1}% - }{% - \yquant@register@get@ids@range@getfirst#1\yquant@register@get@ids@@index\yquant@sep% - }% + \ifallowmain% + \ifyquant@firsttoken*{#1}{% + \expandafter\ifblank\expandafter{\@gobble#1}{% + \def\first{1}% + }{% + \expandafter\yquant@register@get@ids@range@getfirst\@gobble#1\yquant@register@get@ids@@index\yquant@sep% + }% + \count6=\first% + \csletcs{ifallowmain}{iffalse}% + }{% + \ifblank{#1}{% + \def\first{1}% + }{% + \yquant@register@get@ids@range@getfirst#1\yquant@register@get@ids@@index\yquant@sep% + }% + }% + \else% + \ifblank{#1}{% + \def\first{1}% + }{% + \yquant@register@get@ids@range@getfirst#1\yquant@register@get@ids@@index\yquant@sep% + }% + \fi% + % it does not make sense to allow to set the main part on the second half of the range, since a range over registers (not indices) is automatically visual, so this range will be contiguous. \ifblank{#2}{% \letcs\last{\yquant@prefix registers}% - }{%% + }{% \yquant@register@get@ids@range@getlast#2\yquant@register@get@ids@@index\yquant@sep% }% \ifnum\first<\last\relax% @@ -363,20 +471,20 @@ } \def\yquant@register@get@ids@range@getfirst#1\yquant@register@get@ids@@index#2\yquant@sep{% - \if\relax\detokenize{#2}\relax% + \ifstrempty{#2}{% \yquant@register@get@id\first{\trim@spaces{#1}[0]}% - \else% + }{% \yquant@register@get@ids@range@get\first#1\yquant@register@get@ids@@index#2% - \fi% + }% } \protected\def\yquant@register@get@ids@range@getlast#1\yquant@register@get@ids@@index#2\yquant@sep{% - \if\relax\detokenize{#2}\relax% + \ifstrempty{#2}{% \yquant@register@get@id@high\last{\trim@spaces{#1}}% \yquant@register@get@id\last{\trim@spaces{#1}[\last]}% - \else% + }{% \yquant@register@get@ids@range@get\last#1\yquant@register@get@ids@@index#2% - \fi% + }% } \def\yquant@register@get@ids@range@get#1#2\yquant@register@get@ids@@index#3\yquant@register@get@ids@@index{% @@ -384,6 +492,94 @@ } \let\yquant@register@multi=\empty% +\protected\def\yquant@register@multi@contiguous{}% + +% splits \yquant@register@get@ids@list into a list of contiguous parts +\protected\def\yquant@register@multi@splitparts{% + \begingroup% + \let\registers=\yquant@register@get@ids@list% + \yquant@sort@list\registers\yquant@sort@ascending% + \let\newlist=\empty% + \count2=-1 % + \def\do##1{% + \ifnum\count2=-1 % + \count2=##1 % + \count4=\count2 % + \else% + \advance\count2 by 1 % + \ifnum##1>\count2 % + % this is a discontiguous change (we disallow duplicate entries) + \eappto\newlist{% + \yquant@register@multi@contiguous% + {\the\count4}{\the\numexpr\count2-1\relax}% + {\ifnum\count6<\count2 % + \ifnum\count4>\count6 % + 0% + \else% + 1% + \fi% + \else% + 0% + \fi}% + }% + \count2=##1 % + \count4=\count2 % + \fi% + \fi% + }% + \dolistloop\registers% + % we disallow empty lists + \eappto\newlist{% + \yquant@register@multi@contiguous% + {\the\count4}{\the\count2}% + {\ifnum\count6>\count2 % + 0% + \else% + \ifnum\count4>\count6 % + 0% + \else% + 1% + \fi% + \fi}% + }% + \expandafter% + \endgroup% + \expandafter\def\expandafter\yquant@register@get@ids@list\expandafter{% + \newlist% + }% +} + +% splits \yquant@register@get@ids@list into a list of discontiguous parts +\protected\def\yquant@register@multi@splitparts@sepall{% + \begingroup% + \let\registers=\yquant@register@get@ids@list% + \yquant@sort@list\registers\yquant@sort@ascending% + \let\newlist=\empty% + \def\do##1{% + \eappto\newlist{% + \yquant@register@multi@contiguous% + {##1}{##1}% + {\ifnum##1=\count6 % + 1% + \else% + 0% + \fi% + }% + }% + }% + \dolistloop\registers% + \expandafter% + \endgroup% + \expandafter\def\expandafter\yquant@register@get@ids@list\expandafter{% + \newlist% + }% +} + +\protected\def\yquant@register@get@multiassingle{% + \yquant@register@get@allowmultitrue% + \let\yquant@register@multi@splitparts=\yquant@register@multi@splitparts@sepall% + \preto\yquant@attrs@remaining{/yquant/operator/multi as single,}% +} % END_FOLD % BEGIN_FOLD Getters: extract the requested information from the register with given id @@ -392,21 +588,21 @@ \yquant@register@get@type@aux\csname\yquant@prefix register@#1\endcsname% } -\def\yquant@register@get@type@aux#1#2#3#4{#1} +\def\yquant@register@get@type@aux#1#2#3#4#5{#1} \def\yquant@register@get@x#1{% \expandafter\expandafter\expandafter% \yquant@register@get@x@aux\csname\yquant@prefix register@#1\endcsname% } -\def\yquant@register@get@x@aux#1#2#3#4{#2} +\def\yquant@register@get@x@aux#1#2#3#4#5{#2} \def\yquant@register@get@height#1{% \expandafter\expandafter\expandafter% \yquant@register@get@height@aux\csname\yquant@prefix register@#1\endcsname% } -\def\yquant@register@get@height@aux#1#2#3#4{#3} +\def\yquant@register@get@height@aux#1#2#3#4#5{#3} % The y parameter get macros exist in two forms: The protected one is used during the storage to the draw macro; it should never be executed. The env environment then maps them to their proper expandable forms. \protected\def\yquant@register@get@@protected{% @@ -443,7 +639,27 @@ \yquant@register@get@lastwire@aux\csname\yquant@prefix register@#1\endcsname% } -\def\yquant@register@get@lastwire@aux#1#2#3#4{#4} +\protected\def\yquant@register@get@lastwire@aux#1#2#3#4#5#6{% + \def#6{#4}% +} + +\def\yquant@register@get@style#1{% + \expandafter\expandafter\expandafter% + \yquant@register@get@style@aux\csname\yquant@prefix register@#1\endcsname% +} + +\def\yquant@register@get@style@aux#1#2#3#4#5{#5} + +\def\yquant@register@get@typeywire#1{% + \expandafter\expandafter\expandafter% + \yquant@register@get@typeywire@aux\csname\yquant@prefix register@#1\endcsname% +} + +\protected\def\yquant@register@get@typeywire@aux#1#2#3#4#5#6#7#8{% + \def#6{#1}% + \def#7{#3}% + \def#8{#4}% +}% % Set #1 to the maximum x value found between #2 and #3 \protected\def\yquant@register@get@maxxrange#1#2#3{% @@ -487,8 +703,8 @@ \csname\yquant@prefix register@#1\endcsname\yquant@register@set@type@aux% } -\long\def\yquant@register@set@type@aux#1#2#3#4#5{% - {#5}{#2}{#3}{#4}% +\long\def\yquant@register@set@type@aux#1#2#3#4#5#6{% + {#6}\unexpanded{{#2}{#3}{#4}{#5}}% } \protected\def\yquant@register@set@x#1{% @@ -496,8 +712,8 @@ \csname\yquant@prefix register@#1\endcsname\yquant@register@set@x@aux% } -\long\def\yquant@register@set@x@aux#1#2#3#4#5{% - {#1}{#5}{#3}{#4}% +\long\def\yquant@register@set@x@aux#1#2#3#4#5#6{% + \unexpanded{{#1}}{#6}\unexpanded{{#3}{#4}{#5}}% } \protected\def\yquant@register@update@height#1#2{% @@ -513,12 +729,8 @@ } % Set the currently used register -\protected\def\yquant@register@use#1{% - \edef\yquant@register@y{\yquant@register@get@y{#1}}% -} - -\long\def\yquant@register@set@height@aux#1#2#3#4#5{% - {#1}{#2}{#5}{#4}% +\long\def\yquant@register@set@height@aux#1#2#3#4#5#6{% + \unexpanded{{#1}{#2}}{#6}\unexpanded{{#4}{#5}}% } \protected\def\yquant@register@set@lastwire#1{% @@ -526,7 +738,16 @@ \csname\yquant@prefix register@#1\endcsname\yquant@register@set@lastwire@aux% } -\long\def\yquant@register@set@lastwire@aux#1#2#3#4#5{% - {#1}{#2}{#3}{#5}% +\long\def\yquant@register@set@lastwire@aux#1#2#3#4#5#6{% + \unexpanded{{#1}{#2}{#3}}{#6}\unexpanded{{#5}}% +} + +\protected\def\yquant@register@set@style#1{% + \expandafter\yquant@register@set@@aux% + \csname\yquant@prefix register@#1\endcsname\yquant@register@set@style@aux% +} + +\long\def\yquant@register@set@style@aux#1#2#3#4#5#6{% + \unexpanded{{#1}{#2}{#3}{#4}}{#6}% } % END_FOLD
\ No newline at end of file |