summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/yquant/yquant-registers.tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2020-04-14 21:06:44 +0000
committerKarl Berry <karl@freefriends.org>2020-04-14 21:06:44 +0000
commitbbe9e3a2874a81d4559603fc57aa37a0f53ae4bb (patch)
tree3b44a4b917247d46f8b79043e2a2774a9e118d3c /Master/texmf-dist/tex/latex/yquant/yquant-registers.tex
parent70ceb95a32e274762041dec44d43760f70c2dd31 (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.tex365
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