summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-07-19 20:15:07 +0000
committerKarl Berry <karl@freefriends.org>2021-07-19 20:15:07 +0000
commit8e5b8d42fd285921dde3b5fa0a45034f98dba2d1 (patch)
tree75918d0205c8711ceeb614a73250813d16280e2a /Master/texmf-dist/tex/latex
parentef21a6a342dc9620b74140da085c526371b579f5 (diff)
spectralsequences (19jul21)
git-svn-id: svn://tug.org/texlive/trunk@59992 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex')
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/spectralsequences.sty26
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqcheckdefinitions.code.tex61
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqdrawing.code.tex148
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqforeach.code.tex6
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqkeys.code.tex94
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqloadstore.code.tex9
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqmacromakers.code.tex69
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqmain.code.tex348
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqmessages.code.tex35
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqparsers.code.tex144
10 files changed, 731 insertions, 209 deletions
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/spectralsequences.sty b/Master/texmf-dist/tex/latex/spectralsequences/spectralsequences.sty
index 10268984bda..e66aa5c780e 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/spectralsequences.sty
+++ b/Master/texmf-dist/tex/latex/spectralsequences/spectralsequences.sty
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% A package for drawing spectral sequences
@@ -23,7 +23,7 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{spectralsequences}[2019/02/18 v1.2.2]
+\ProvidesPackage{spectralsequences}[2021/07/18 v1.3.0]
\RequirePackage{tikz}
\RequirePackage{etoolbox}
@@ -63,7 +63,8 @@
\quiet\endquiet
% These are defined in sseqmain:
\class\classoptions\replaceclass\replacesource\replacetarget
- \d\doptions\kill\structline\structlineoptions\circleclasses
+ \replacestructlines
+ \d\doptions\kill\structline\structlineoptions\extension\extensionoptions\circleclasses
\lastlabel
% The following are defined in sseqparsers:
\pgfmathparse\isalive\lastx\lasty\lastclass\savestack\restorestack\pushstack\nameclass\tagclass
@@ -108,6 +109,9 @@
\newif\ifsseq@drawedge
\newif\ifsseq@tikzprims@integershift
\newif\ifsseq@anchor
+\newif\ifsseq@rangecheck
+\newif\ifsseq@rangecheck@sideways
+
\sseq@drawedgetrue
\sseq@tikzprims@integershifttrue
@@ -241,12 +245,13 @@
\let\sseq@breakpoint\relax
\let\sseq@breakpointfinally\@gobble
-\def\sseq@break#1\sseq@breakpoint{}
-\def\sseq@break@finally#1\sseq@breakpoint#2{#2}
+\long\def\sseq@break#1\sseq@breakpoint{}
+\def\sseq@fbreak{\@xp\sseq@break\romannumeral-`0}
+\long\def\sseq@break@finally#1\sseq@breakpoint#2{#2}
-\def\sseq@breakfi{\fi\sseq@break}
-\def\sseq@breakfifi{\fi\fi\sseq@break}
-\def\sseq@breakfififi{\fi\fi\fi\sseq@break}
+\long\def\sseq@breakfi{\fi\sseq@break}
+\long\def\sseq@breakfifi{\fi\fi\sseq@break}
+\long\def\sseq@breakfififi{\fi\fi\fi\sseq@break}
\long\def\sseq@breakdataenv#1\end#2{
\def\sseq@tempa{sseqdata}\def\sseq@tempb{#2}\ifx\sseqtempa\sseqtempb
\@xp\sseq@breakdataenv@
@@ -274,7 +279,7 @@
\let\sseqnewgroup\@gobblethree
}
-
+\AtBeginEnvironment{sideways}{\sseqset{range check sideways}}
\input sseqmessages.code.tex % Exposes directly: \sseqerrortowarning
\input sseqcheckdefinitions.code.tex
@@ -309,6 +314,7 @@
\let\sseq@class@object\sseq@class@draw@ifpage
\let\sseq@differential@object\sseq@differential@draw@ifpage
\let\sseq@structline@object\sseq@structline@draw@ifpage
+\let\sseq@extension@object\sseq@extension@draw@ifpage
\let\sseq@circleclass@object\sseq@circleclass@draw@ifpage
\let\sseq@tikzpath@object\@firstofone
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqcheckdefinitions.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqcheckdefinitions.code.tex
index 5cd92a3bf37..ad4570d5fae 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/sseqcheckdefinitions.code.tex
+++ b/Master/texmf-dist/tex/latex/spectralsequences/sseqcheckdefinitions.code.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% File: sseqcheckdefinitions.code.tex
@@ -28,29 +28,33 @@
%%
\ExplSyntaxOn
-% I should work out how old the version of xparse has to be before this breaks, but I'm too lazy.
-% It would also be nice if I could figure out how to ensure that my trick of setting \l__xparse_grab_expandably_bool to false works correctly, but this might be difficult
+% I should work out how old the version of xparse has to be before this breaks,
+% but I'm too lazy. It would also be nice if I could figure out how to ensure
+% that my trick of setting \l__cmd_grab_expandably_bool to false works
+% correctly, but this might be difficult
\@ifpackagelater{xparse}{2017/02/08}{
- \sseq@checkprotecteddef \__xparse_grab_u:w #1#2 \__xparse_run_code:{
- \__xparse_grab_u_aux:nnN {#1} {#2} \cs_set_protected_nopar:Npn
+ \cs_if_exist:NTF \__xparse_grab_u:w {
+ \global\sseq@patchxparseUtrue
+ }{
+ \sseq@checkprotecteddef \__cmd_grab_u:w #1#2 \__cmd_run_code:{
+ \__cmd_grab_u_aux:nnN {#1} {#2} \cs_set_protected_nopar:Npn
}
- \sseq@checkprotecteddef\__xparse_grab_u_aux:nnN #1#2#3
- {
- \tl_set:Nn \l__xparse_signature_tl {#2}
- \exp_after:wN #3 \l__xparse_fn_tl ##1 #1
- { \__xparse_add_arg:n {##1} }
- \l__xparse_fn_tl
+ \sseq@checkprotecteddef\__cmd_grab_u_aux:nnN #1#2#3 {
+ \tl_set:Nn \l__cmd_signature_tl {#2}
+ \exp_after:wN #3 \l__cmd_fn_tl ##1 #1
+ { \__cmd_add_arg:n {##1} }
+ \l__cmd_fn_tl
}
- \sseq@checkprotecteddef \__xparse_normalize_type_u:w #1 {
- \quark_if_recursion_tail_stop_do:nn {#1} { \__xparse_bad_arg_spec:wn }
- \__xparse_normalize_check_lu:N u
- \__xparse_add_arg_spec_mandatory:n { u {#1} } % Oct 17, 2018
-% \int_incr:N \l__xparse_mandatory_args_int
-% \tl_clear:N \l__xparse_last_delimiters_tl
- \__xparse_normalize_arg_spec_loop:n
+ \sseq@checkprotecteddef \__cmd_normalize_type_u:w #1 {
+ \quark_if_recursion_tail_stop_do:nn {#1} { \__cmd_bad_arg_spec:wn }
+ \__cmd_normalize_check_lu:N u
+ \__cmd_add_arg_spec_mandatory:n { u {#1} } % Oct 17, 2018
+% \int_incr:N \l__cmd_mandatory_args_int
+% \tl_clear:N \l__cmd_last_delimiters_tl
+ \__cmd_normalize_arg_spec_loop:n
}
\ifsseq@tempif
@@ -59,6 +63,7 @@
\global\sseq@patchxparseUfalse
\fi
\sseq@tempiftrue
+ }
}{}
\@ifpackagelater{expl3}{2018/10/01}{
@@ -100,6 +105,7 @@
\sseq@tempiffalse % We'll throw a critical error in spectralsequences.sty to end input
\endinput
\fi
+\sseq@tempiftrue
%%
%% sseqdrawing.code.tex
%%
@@ -126,8 +132,21 @@
\ifsseq@tempif
\global\sseq@patchfittrue
\else
- \sseq@warning{fit-patch-failed}
- \global\sseq@patchfitfalse
+ % New version of \tikz@calc@anchor
+ \sseq@tempiftrue
+ \sseq@checkdef\tikz@calc@anchor#1.#2\tikz@stop{%
+ \ifcsname pgf@sh@ns@\tikz@pp@name {#1}\endcsname
+ \pgfpointanchor {\tikz@pp@name {#1}}{#2}%
+ \else
+ \pgfpointanchor {#1}{#2}%
+ \fi
+ }
+ \ifsseq@tempif
+ \global\sseq@patchfittrue
+ \else
+ \sseq@warning{fit-patch-failed}
+ \global\sseq@patchfitfalse
+ \fi
\fi
\sseq@tempiftrue
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqdrawing.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqdrawing.code.tex
index 3f3060dc7f1..db01b04481b 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/sseqdrawing.code.tex
+++ b/Master/texmf-dist/tex/latex/spectralsequences/sseqdrawing.code.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% File: sseqdrawing.code.tex
@@ -38,20 +38,33 @@
\sseq@setlayoutparameter{bottomclippadding}{x\sseq@xaxistype}
\sseq@setlayoutparameter{topclippadding}{x\sseq@xaxistype}
\sseq@setlayoutparameter{xlabelposition}{x\sseq@xaxistype}
+ \sseq@setlayoutparameter{totalverticalmargin}{x\sseq@xaxistype}
%
\sseq@setlayoutparameter{xaxisorigin}{y\sseq@yaxistype}
- \sseq@setlayoutparameter{drawxaxis}{y\sseq@xaxistype}
+ \sseq@setlayoutparameter{drawxaxis}{y\sseq@yaxistype}
\sseq@setlayoutparameter{xaxisstartoffset}{y\sseq@yaxistype}
\sseq@setlayoutparameter{xaxisendoffset}{y\sseq@yaxistype}
\sseq@setlayoutparameter{leftgridpadding}{y\sseq@yaxistype}
\sseq@setlayoutparameter{rightgridpadding}{y\sseq@yaxistype}
\sseq@setlayoutparameter{leftclippadding}{y\sseq@yaxistype}
\sseq@setlayoutparameter{rightclippadding}{y\sseq@yaxistype}
- \sseq@setlayoutparameter{ylabelposition}{y\sseq@xaxistype}
+ \sseq@setlayoutparameter{ylabelposition}{y\sseq@yaxistype}
+ \sseq@setlayoutparameter{totalhorizontalmargin}{y\sseq@yaxistype}
}
% The appropriate one of these is chosen by the "axis type" keys in sseqkeys.
+% Used to calculate available area in range check
+\def\sseq@totalhorizontalmargin@yborder{(\sseq@xaxis@tail + \sseq@yaxisgap + \sseq@xaxis@end@extend + \sseq@clip@padding@right)}
+\def\sseq@totalhorizontalmargin@yframe{(\sseq@ylabelgap + \sseq@maxylabelwidth + \sseq@yaxisgap * 2)}
+\def\sseq@totalhorizontalmargin@ycenter{(\sseq@xaxis@start@extend + \sseq@clip@padding@left + \sseq@xaxis@end@extend + \sseq@clip@padding@right)}
+\def\sseq@totalhorizontalmargin@ynone{(\sseq@xaxis@start@extend + \sseq@clip@padding@left + \sseq@xaxis@end@extend + \sseq@clip@padding@right)}
+
+\def\sseq@totalverticalmargin@xborder{(\sseq@yaxis@tail + \sseq@xaxisgap + \sseq@yaxis@end@extend + \sseq@clip@padding@top)}
+\def\sseq@totalverticalmargin@xframe{(\sseq@xlabelgap + \sseq@xlabelheight + \sseq@xaxisgap * 2)}
+\def\sseq@totalverticalmargin@xcenter{(\sseq@yaxis@start@extend + \sseq@clip@padding@bottom + \sseq@yaxis@end@extend + \sseq@clip@padding@top)}
+\def\sseq@totalverticalmargin@xnone{(\sseq@yaxis@start@extend + \sseq@clip@padding@bottom + \sseq@yaxis@end@extend + \sseq@clip@padding@top)}
+
% Used to determine axis and ticks placement
\def\sseq@xaxisorigin@yborder{\sseq@xmin}
\def\sseq@xaxisorigin@yframe{\sseq@xmin}
@@ -77,7 +90,7 @@
\def\sseq@topgridpadding@xcenter{\sseq@yaxis@end@extend}
\def\sseq@bottomgridpadding@xframe{\dimexpr\sseq@xaxisgap-\sseq@xclip@axisgap\relax}
\def\sseq@topgridpadding@xframe{5cm}
-\def\sseq@bottomgridpadding@xnone{\sseqxaxisgap}
+\def\sseq@bottomgridpadding@xnone{\sseq@xaxisgap}
\def\sseq@topgridpadding@xnone{\sseq@xaxisgap}
\def\sseq@leftclippadding@yborder{\dimexpr-\sseq@yaxisgap+\sseq@yclip@axisgap\relax}
@@ -369,21 +382,13 @@
\def\sseq@grid@chess{
\bgroup
\pgfscope
- % Pad on the right and top by either the grid padding, or the remaining piece of the checkerboard before it would start a new square
- % (it looks ugly to have a tiny sliver). Annoyingly, mod returns its result with the same sign as its input, so in order to reduce mod
- % \sseq@xgridstep and get a positive result, we have to do it twice. The 0.5cm*scale here matches the -0.5 in the \pgfpathgrid call.
- \pgfmathsetmacro\sseq@rightpadding{min(
- \sseq@rightgridpadding,
- 1cm* mod(mod(-\sseq@xmax,\sseq@xgridstep)+\sseq@xgridstep,\sseq@xgridstep)+0.5cm*\sseq@xscale-0.05cm
- )}
- \pgfmathsetmacro\sseq@toppadding{min(
- \sseq@topgridpadding,
- 1cm * mod(mod(-\sseq@ymax,\sseq@ygridstep)+\sseq@ygridstep,\sseq@ygridstep)+0.5cm*\sseq@yscale-0.02cm
- )}
% Because of complicated aliasing issues that arise when misusing the \pgfgrid command in this way,
% it's more convenient to add a clip than to actually stop things in the right place.
- \clip (\sseq@xmin-\sseq@xoffset,\sseq@ymin-\sseq@yoffset) ++ (-0.48, -0.48)
- rectangle ([shift={(\sseq@rightpadding pt,\sseq@toppadding pt)}]\sseq@xmax,\sseq@ymax);
+ \clip (\sseq@xmin-0.49,\sseq@ymin-0.49)
+ rectangle (\sseq@xmax+0.49,\sseq@ymax+0.49);
+% \clip (\sseq@xmin,\sseq@ymin) ++ (-0.49, -0.49)
+% rectangle ([shift={(0.5cm*\sseq@yscale,0.5*\sseq@xscale)}]
+% \sseq@xmax,\sseq@ymax);
%
\sseq@useclip
\pgfsetcolor{\sseq@gridcolor}
@@ -433,14 +438,16 @@
\pgfsetdash{{1cm*\sseq@stepscale}{1cm*\sseq@stepscale}}{1cm*\sseq@stepscale}
%
% Naturally some trial and error occurred here too.
- % Note the huge multiples of \sseq@xgridstep I added in -- they probably aren't necessary, but I don't understand what's going on so whatever.
+ % Note the huge multiples of \sseq@xgridstep I added in -- they probably aren't necessary, but I don't understand what's going on so whatever. They make sure that the pattern always extends past the edge of the clipping region. Otherwise the gird occasionally stops short for some reason.
% The basic idea is that things need to be divisible by twice the grid step. The part I added in the shift above
% was the remainder when you divide \sseq@xmin by twice the grid step, now we need to add in the multiple of twice the grid step.
% The -0.5 is ensuring that the checkerboard boundaries lie at half-integer coordinates (I think).
\pgfpathgrid[stepx= 2cm*\sseq@stepscale,stepy=2cm*\sseq@stepscale]
{ \pgfpointxy
- { -0.5 + \sseq@intdivfloor{\numexpr\sseq@xmin - \sseq@xgridstep\relax}{2*\sseq@xgridstep}*2*\sseq@xgridstep + \sseq@xoffset - 50*\sseq@xgridstep }
- { -0.5 + \sseq@intdivfloor{\numexpr\sseq@ymin - \sseq@ygridstep\relax}{2*\sseq@ygridstep}*2*\sseq@ygridstep + \sseq@yoffset - 50*\sseq@ygridstep}
+ { -0.5 + \sseq@intdivfloor{\numexpr\sseq@xmin - \sseq@xgridstep\relax}{2*\sseq@xgridstep}*2*\sseq@xgridstep + \sseq@xoffset -50*\sseq@xgridstep
+ }
+ { -0.5 + \sseq@intdivfloor{\numexpr\sseq@ymin - \sseq@ygridstep\relax}{2*\sseq@ygridstep}*2*\sseq@ygridstep + \sseq@yoffset -50*\sseq@ygridstep
+ }
}{ \pgfpointxy
{ \sseq@xmax + \sseq@xoffset + 50*\sseq@xgridstep }
{ \sseq@ymax + \sseq@yoffset + 50*\sseq@ygridstep }
@@ -531,7 +538,7 @@
%%% Draw Classes
%%%
%%% Class offsets
-\sseqnewclasspattern{standard}{
+\SseqNewClassPattern{standard}{
(0,0);
(-0.13,0)(0.13,0);
(-0.2,0)(0,0)(0.2,0);
@@ -945,7 +952,11 @@
\def\pgfkeysdefaultpath{/sseqpages/#3/}%
\sseq@options@bothpassmode
\sseq@thesseqstyle
- \sseq@theedgestyle\csname sseq@the#3style\endcsname\the\sseq@scope@toks
+ \sseq@theedgestyle\csname sseq@the#3style\endcsname
+ \ifsseq@thispage
+ \csname sseq@thethispage#3style\endcsname
+ \fi
+ \the\sseq@scope@toks
#4%
\csname sseq@collections@#3@hook\endcsname
\pgftransformshift{\pgfqpointxy{-\the\sseq@x}{-\the\sseq@y}}%
@@ -989,9 +1000,16 @@
\fi
\fi
\ifsseq@needstikz
- \draw[/sseqpages,
- /utils/exec={\sseq@thesseqstyle\sseq@theedgestyle\csname sseq@the#3style\endcsname\the\sseq@scope@toks
- \temparrowstartspec\temparrowendspec #4}%
+ \draw[/sseqpages,%
+ /utils/exec={%
+ \sseq@thesseqstyle\sseq@theedgestyle
+ \csname sseq@the#3style\endcsname
+ \ifsseq@thispage
+ \csname sseq@thethispage#3style\endcsname
+ \fi
+ \the\sseq@scope@toks
+ \temparrowstartspec\temparrowendspec #4%
+ }%
] (tempa) to (tempb);%
\else
\temparrowstartspec
@@ -1126,12 +1144,33 @@
\tikz@lib@fit@scan%
}
+%\def\tikz@calc@anchor#1.#2\tikz@stop{%
+% \ifcsname pgf@sh@ns@\tikz@pp@name {#1}\endcsname
+% \pgfpointanchor {\tikz@pp@name {#1}}{#2}%
+% \else
+% \pgfpointanchor {#1}{#2}%
+% \fi
+%}
+%l.8 \show\tikz@calc@anchor
+
% This is copied with modification from \pgf\frontendlayer\tikz\tikz.code.tex line 5164
\def\sseq@fit@tikz@calc@anchor#1.#2\tikz@stop{%
- \pgfutil@ifundefined{pgf@sh@ns@#1}{\sseq@tempiffalse}{%If the node doesn't exist, don't throw an error but record that we should skip it
- \pgfpointanchor{\tikz@pp@name{#1}}{#2}%
- }%s
+ \ifcsname pgf@sh@ns@\tikz@pp@name {#1}\endcsname
+ \pgfpointanchor {\tikz@pp@name {#1}}{#2}%
+ \else
+ \ifcsname pgf@sh@ns@#1\endcsname
+ \pgfpointanchor {#1}{#2}%
+ \else
+ \sseq@tempiffalse
+ \fi
+ \fi
}
+%\def\sseq@fit@tikz@calc@anchor#1.#2\tikz@stop{%
+% \pgfutil@ifundefined{pgf@sh@ns@#1}{\sseq@tempiffalse}{%If the node doesn't exist, don't throw an error but record that we should skip it
+% \pgfpointanchor{\tikz@pp@name{#1}}{#2}%
+% }%s
+%}
+
%%
@@ -1148,15 +1187,28 @@
\let\tikz@grid\sseq@tikz@grid
\let\tikz@scan@handle@options\sseq@tikz@scan@handle@options
\let\tikz@@@parse@polar\sseq@tikz@@@parse@polar
+ \let\tikz@scan@relative\sseq@tikz@scan@relative
}
+\newif\ifsseq@draw@addoffset % control whether to offset coordinates by (\sseq@xoffset,\sseq@yoffset).
+\sseq@draw@addoffsettrue
% Some of the stuff in tikzlibrarycalc will probably be broken, hopefully not too much
\let\sseq@tikz@scan@one@point@noshift\tikz@scan@one@point
\let\sseq@tikz@@@parse@regular@save\tikz@@@parse@regular
+\def\sseq@tikz@scan@relative#1+{%
+ \global\sseq@draw@addoffsetfalse
+ %\global\let\tikz@@@parse@regular\sseq@tikz@@@parse@regular@save
+ \pgfutil@ifnextchar+{%
+ \tikz@scan@plusplus{\global\sseq@draw@addoffsettrue#1}%
+ }{%
+ \tikz@scan@oneplus{\global\sseq@draw@addoffsettrue#1}%
+ }%
+}
+
\def\sseq@tikz@scan@one@point@noshift@active#1{%
- \let\tikz@@@parse@regular\sseq@tikz@@@parse@regular@save
- \def\sseq@scanonepoint@cmd{\let\tikz@@@parse@regular\sseq@tikz@@@parse@regular#1}
+ \global\sseq@draw@addoffsetfalse
+ \def\sseq@scanonepoint@cmd{\global\sseq@draw@addoffsettrue#1}
\tikz@scan@one@point\sseq@scanonepoint@cmd%
}
@@ -1167,8 +1219,9 @@
\def\sseq@tikz@to@curve@path{%
[every curve to]
\pgfextra{
+ %\sseq@draw@addoffsetfalse
\let\tikz@@@parse@regular\sseq@tikz@@@parse@regular@save % I added this to prevent repeated offsets from screwing us up
- %\let\sseq@tikz@scan@one@point@noshift\tikz@scan@one@point
+ \let\sseq@tikz@scan@one@point@noshift\tikz@scan@one@point
\iftikz@to@relative\tikz@to@compute@relative\else\tikz@to@compute\fi
}
\tikz@computed@path
@@ -1197,24 +1250,25 @@
\def\sseq@tikz@@@parse@regular#1#2#3){%
\pgfutil@in@,{#3}%
\ifpgfutil@in@%
- \tikz@parse@splitxyz{#1}{#2}#3,%
+ \tikz@parse@splitxyz{#1}{#2}#3,% Perhaps put an error here? We probably don't handle 3d coords correctly.
\else%
\tikz@checkunit{#2}%
\iftikz@isdimension%
- \tikz@checkunit{#3}%
- \iftikz@isdimension%
- \def\@next{#1{\pgfpointxy{(#2)/1cm+\sseq@xoffset}{(#3)/1cm+\sseq@yoffset}}}%
- \else%
- \def\@next{#1{\pgfpointxy{(#2)/1cm+\sseq@xoffset}{#3+\sseq@yoffset}}}%
- \fi%
- \else%
- \tikz@checkunit{#3}%
- \iftikz@isdimension%
- \def\@next{#1{\pgfpointxy{#2+\sseq@xoffset}{(#3)/1cm+\sseq@yoffset}}}%
- \else%
- \def\@next{#1{\pgfpointxy{#2+\sseq@xoffset}{#3+\sseq@yoffset}}}%
- \fi%
- \fi%
+ \def\temp@xcoord{(#2)/1cm}%
+ \else
+ \def\temp@xcoord{#2}%
+ \fi
+ \tikz@checkunit{#3}%
+ \iftikz@isdimension
+ \def\temp@ycoord{(#3)/1cm}%
+ \else
+ \def\temp@ycoord{#3}%
+ \fi
+ \ifsseq@draw@addoffset
+ \edef\temp@xcoord{\unexpanded\@xp{\temp@xcoord}+\unexpanded\@xp{\sseq@xoffset}}%
+ \edef\temp@ycoord{\unexpanded\@xp{\temp@ycoord}+\unexpanded\@xp{\sseq@yoffset}}%
+ \fi
+ \edef\@next{\unexpanded{#1}{\@nx\pgfpointxy{\unexpanded\@xp{\temp@xcoord}}{\unexpanded\@xp{\temp@ycoord}}}}%
\fi%
\@next%
}
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqforeach.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqforeach.code.tex
index 7b72f6eb19d..ff849acd25c 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/sseqforeach.code.tex
+++ b/Master/texmf-dist/tex/latex/spectralsequences/sseqforeach.code.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% File: sseqforeach.code.tex
@@ -66,7 +66,7 @@
}
\def\sseq@DoUntilOutOfBounds@ #1 {
- \sseq@esetthiscall{\string\DoUntilOutOfBoundsThenNMore}
+ \sseq@esetthiscall{\string\DoUntilOutOfBounds}
\sseq@opushstacktrace{\string\DoUntilOutOfBounds}
\ifx\sseq@xminmax\@gobbletwo\else\ifx\sseq@yminmax\@gobbletwo\else
\sseq@error@x{DoUntil-no-bound}{\string\DoUntilOutOfBounds}
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqkeys.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqkeys.code.tex
index 1581a516ec9..03c8c7591ad 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/sseqkeys.code.tex
+++ b/Master/texmf-dist/tex/latex/spectralsequences/sseqkeys.code.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% File: sseqkeys.code.tex
@@ -595,8 +595,8 @@
\pgfkeysalso{/sseqpages/alias/.expand once=\detokenize\@xp{\sseq@class@name}}%
},
show name/.store in=\sseq@class@showname,
- page/.code={\sseq@getnumrange\sseq@class@page{#1}},% page & gen are only for \classoptions.
- generation/.code={\sseq@getnumrange\sseq@gen{#1}}, % \class tests if \sseq@class@page is set and throw an error if so.
+ page/.code={\sseq@getnumrange@defaultupperboundinfty\sseq@class@page{#1}},% page & gen are only for \classoptions.
+ generation/.code={\sseq@getnumrange@defaultupperboundinfty\sseq@gen{#1}}, % \class tests if \sseq@class@page is set and throw an error if so.
tag/.code={\sseq@d@addto@macro\sseq@class@tag{#1}},
offset/.store in=\sseq@tempoffset,
tooltip/.sseq @ first pass code={\ifx\sseqtooltip\undefined \sseq@error{no-tooltip}\else \def\sseq@tooltip{#1}\fi},
@@ -604,23 +604,46 @@
}
\pgfqkeys{/sseqpages/struct line}{
- page/.code={\sseq@getnumrange\sseq@structline@page{#1}}
+ page/.code={\sseq@getnumrange@defaultupperboundinfty\sseq@structline@page{#1}}
}
\def\sseq@fitalso{}
\pgfqkeys{/sseqpages/fit}{
fit/.sseq @ first pass code={\sseq@d@addto@macro\sseq@fitalso{#1}},
- page/.code={\sseq@getnumrange\sseq@fit@page{#1}}
+ page/.code={\sseq@getnumrange@defaultupperboundinfty\sseq@fit@page{#1}}
}
-\def\sseq@getnumrange#1#2{
+\def\sseq@getnumrange#1#2{%
+ \pgfutil@in@{--}{#2}\ifpgfutil@in@
+ \sseq@getnumrange@range#1#2\sseq@nil
+ \else
+ \sseq@getnumrange@range#1#2--#2\sseq@nil
+ \fi
+}
+
+\def\sseq@getnumrange@defaultupperboundinfty#1#2{%
\pgfutil@in@{--}{#2}\ifpgfutil@in@
\sseq@getnumrange@range#1#2\sseq@nil
\else
\sseq@getnumrange@range#1#2--\sseq@infinity\sseq@nil
\fi
}
-\def\sseq@getnumrange@range#1#2--#3\sseq@nil{\edef#1{\the\numexpr#2}\@xp\edef\csname\sseq@macroname#1max\endcsname{\the\numexpr#3}}
+
+\def\sseq@getnumrange@range#1#2--#3\sseq@nil{%
+ \ifx\infty#2
+ \edef#1{\sseq@infinity}%
+ \@xp\edef\csname\sseq@macroname#1max\endcsname{\sseq@infinity}%
+ \else
+ \edef#1{\the\numexpr#2}%
+ \ifx\infty#3
+ \@xp\edef\csname\sseq@macroname#1max\endcsname{\sseq@infinity}%
+ \else
+ \@xp\edef\csname\sseq@macroname#1max\endcsname{\the\numexpr#3}%
+ \fi
+ \fi
+}
+
+
%% Needs tikz
% Force \class or \d to fall back to using tikz to render their output
@@ -1116,7 +1139,6 @@
\sseq@temp@ii/.code/.expanded={%
\unexpanded{#3{##1}}{\sseq@temp=\unexpanded{##1}}%
\unexpanded{\edef#1{\unexpanded\@xp{\sseq@sanitize@output}}}%
- %\show\@nx#1
\sseq@breakpoint
},
\sseq@temp@ii/.value required,
@@ -1380,6 +1402,15 @@
update existing/.sseq default code={\sseq@updateexistingtrue}
}
+\def\sseq@printnum@inftytosymbol#1{%
+ \ifnum#1=\sseq@infinity\relax
+ $\infty$%
+ \else
+ #1%
+ \fi
+}
+
+
\sseq@addtostorelist\sseq@grid{\relax}
\sseq@addiftostorelist{hasdegree}
\let\sseq@maybemathswitch\relax
@@ -1388,18 +1419,28 @@
name/.sseq default error,
~page/.code={
\ifsseq@hasname
- \sseq@getnumrange\sseq@thepage{#1}
+ \sseq@getnumrange\sseq@thepage{#1}%
\sseq@thepagecount=\sseq@thepage\relax
\let\page\sseq@thepage
+ \ifnum\sseq@thepage=\sseq@infinity
+ \def\page{$\infty$}%
+ \fi
+ \def\sseq@temp{\sseq@novalue}
+ \ifx\sseq@printpageas\sseq@temp
+ \def\sseq@printpageas{Page \page}
+ \ifnum\sseq@thepage<\sseq@thepagemax
+ \ifnum\sseq@thepagemax=\sseq@infinity\relax
+ \def\sseq@printpageas{Page \page\space(all differentials)}
+ \else
+ \def\sseq@printpageas{Page \page\space(differentials of length $\leq\sseq@thepagemax$)}
+ \fi
+ \fi
+ \fi
\edef\sseq@thepagemm{\the\numexpr\sseq@thepagecount-1\relax}
- \ifx\sseq@thepagemax\sseq@infinity
- \edef\sseq@thepagemaxpp{\the\numexpr\sseq@thepagecount+1\relax}
+ \ifnum\sseq@thepagemax=\z@
+ \let\sseq@thepagemaxpp\sseq@infinity
\else
- \ifnum\sseq@thepagemax=\z@
- \let\sseq@thepagemaxpp\sseq@infinity
- \else
- \edef\sseq@thepagemaxpp{\the\numexpr\sseq@thepagemax+1\relax}
- \fi
+ \edef\sseq@thepagemaxpp{\the\numexpr\sseq@thepagemax+1\relax}
\fi
\else
\sseq@error{page-no-name}
@@ -1465,6 +1506,21 @@
add class placement transform/.value required,
}
+
+\sseq@addiftostorelist@truedefault{rangecheck}
+\sseq@addiftostorelist{rangecheck@sideways}
+\sseq@globalkeys{%
+ range check standard/.code={\sseq@rangechecktrue\sseq@rangecheck@sidewaysfalse},
+ range check standard/.sseq default code={%
+ \def\sseq@rangecheck@default{\global\sseq@rangechecktrue}%
+ \def\sseq@rangecheck@sideways@default{\global\sseq@rangecheck@sidewaysfalse}%
+ },
+ range check sideways/.code=rangecheck@sideways,
+ range check sideways/.sseq default code={\def\sseq@rangecheck@sideways@default{\global\sseq@rangecheck@sidewaystrue}},
+ range check off/.code={\sseq@rangecheckfalse},
+ range check off/.sseq default code={\def\sseq@rangecheck@default{\global\sseq@rangecheckfalse}},
+}
+
\sseq@mathnodestrue
\sseq@addtostorelist\sseq@targetx{}\sseq@addtostorelist\sseq@targety{}
@@ -1600,10 +1656,12 @@
\sseq@addtostorelist{\sseq@xtickfn}{} % These should initially be the identity macro, but addtostorelist doesn't accept functions as default
\sseq@addtostorelist{\sseq@ytickfn}{} % so the default is instated in begin{sseqdata} / begin{sseqpicture}.
+\let\sseq@printpageas\relax
\sseq@globalkeys{%
title/.sseq store in=\sseq@title{},
title style/.sseq append to style={/sseqpages/global/every title}{at={(0.5*\xmin+0.5*\xmax,\ymax)}},
draw title/.sseq is if=drawtitle,
+ print page as/.sseq store in=\sseq@printpageas{\sseq@novalue},
no title/.code=\sseq@drawtitlefalse,
%
x label/.sseq store in=\sseq@xaxislabel{},
@@ -2052,7 +2110,7 @@
page constraint or/.code={
\sseq@updatepageconstraint{#1}{||}
},
- page/.code={\sseq@getnumrange\temp{#1}\sseq@updatepageconstraintrange},
+ page/.code={\sseq@getnumrange@defaultupperboundinfty\temp{#1}\sseq@updatepageconstraintrange},
set page constraint/.store in=\sseq@pageconstraint,
background/.code={\sseq@standardparse\sseq@setsavedpaths{background}\pgfkeysalso{standard parse}},
}
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqloadstore.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqloadstore.code.tex
index 79bd2c0cfce..19a466112b4 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/sseqloadstore.code.tex
+++ b/Master/texmf-dist/tex/latex/spectralsequences/sseqloadstore.code.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% File: sseqloadstore.code.tex
@@ -129,6 +129,7 @@
\def\sseq@tempsavedpaths{}
\def\sseq@savedpaths@addclass@standard#1{\sseq@x@addto@macro\sseq@savedpaths{\@nx\sseq@class@object{#1}}}
\def\sseq@savedpaths@adddifferential@standard#1{\sseq@x@addto@macro\sseq@savedpaths{\@nx\sseq@differential@object{#1}}}
+\def\sseq@savedpaths@addextension@standard#1{\sseq@x@addto@macro\sseq@savedpaths{\@nx\sseq@extension@object{#1}}}
\def\sseq@savedpaths@addstructline@standard#1{\sseq@x@addto@macro\sseq@savedpaths{\@nx\sseq@structline@object{#1}}}
\def\sseq@savedpaths@xaddtikzpath@standard#1{\sseq@x@addto@macro\sseq@savedpaths{\@nx\sseq@tikzpath@object{#1}}}
\def\sseq@savedpaths@add@standard{\sseq@g@addto@macro\sseq@savedpaths}
@@ -138,6 +139,7 @@
\def\sseq@savedpaths@addclass@temporary#1{\sseq@x@addto@macro\sseq@tempsavedpaths{\@nx\sseq@class@draw@ifpage{#1}}}
\def\sseq@savedpaths@adddifferential@temporary#1{\sseq@x@addto@macro\sseq@tempsavedpaths{\@nx\sseq@differential@draw@ifpage{#1}}}
+\def\sseq@savedpaths@addextension@temporary#1{\sseq@x@addto@macro\sseq@tempsavedpaths{\@nx\sseq@extension@draw@ifpage{#1}}}
\def\sseq@savedpaths@addstructline@temporary#1{\sseq@x@addto@macro\sseq@tempsavedpaths{\@nx\sseq@structline@draw@ifpage{#1}}}
\def\sseq@savedpaths@xaddtikzpath@temporary#1{\sseq@x@addto@macro\sseq@tempsavedpaths{#1}}
\def\sseq@savedpaths@add@temporary{\sseq@g@addto@macro\sseq@tempsavedpaths}
@@ -149,6 +151,7 @@
\def\sseq@savedpaths@addclass@background#1{\sseq@error@internal@n{illegal-add-background-mode}{\sseq@savedpaths@addclass}}
\def\sseq@savedpaths@adddifferential@background#1{\sseq@error@internal@n{illegal-add-background-mode}{\sseq@savedpaths@adddifferential}}
\def\sseq@savedpaths@addstructline@background#1{\sseq@error@internal@n{illegal-add-background-mode}{\sseq@savedpaths@addstructline}}
+\def\sseq@savedpaths@addextension@background#1{\sseq@error@internal@n{illegal-add-background-mode}{\sseq@savedpaths@addextension}}
\def\sseq@savedpaths@xaddtikzpath@background#1{\sseq@x@addto@macro\sseq@savedbackgroundpaths{#1}}
\def\sseq@savedpaths@add@background{\sseq@g@addto@macro\sseq@savedbackgroundpaths}
\def\sseq@savedpaths@xadd@background{\sseq@x@addto@macro\sseq@savedbackgroundpaths}
@@ -157,6 +160,7 @@
\def\sseq@savedpaths@addclass@ignore#1{}
\def\sseq@savedpaths@adddifferential@ignore#1{}
\def\sseq@savedpaths@addstructline@ignore#1{}
+\def\sseq@savedpaths@addextension@ignore#1{}
\def\sseq@savedpaths@xaddtikzpath@ignore#1{}
\def\sseq@savedpaths@add@ignore#1{}
\def\sseq@savedpaths@xadd@ignore#1{}
@@ -167,6 +171,7 @@
\@xp\let\@xp\sseq@savedpaths@addclass \csname sseq@savedpaths@addclass@#1\endcsname
\@xp\let\@xp\sseq@savedpaths@adddifferential\csname sseq@savedpaths@adddifferential@#1\endcsname
\@xp\let\@xp\sseq@savedpaths@addstructline \csname sseq@savedpaths@addstructline@#1\endcsname
+ \@xp\let\@xp\sseq@savedpaths@addextension \csname sseq@savedpaths@addextension@#1\endcsname
\@xp\let\@xp\sseq@savedpaths@xaddtikzpath \csname sseq@savedpaths@xaddtikzpath@#1\endcsname
\@xp\let\@xp\sseq@savedpaths@add \csname sseq@savedpaths@add@#1\endcsname
\@xp\let\@xp\sseq@savedpaths@xadd \csname sseq@savedpaths@xadd@#1\endcsname
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqmacromakers.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqmacromakers.code.tex
index b83e34abb73..b3449eda426 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/sseqmacromakers.code.tex
+++ b/Master/texmf-dist/tex/latex/spectralsequences/sseqmacromakers.code.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% File: sseqmacromakers.code.tex
@@ -40,6 +40,9 @@
{ \__xparse_add_arg:n {##1} #1 }
\l__xparse_fn_tl
}
+ \ifx\__xparse_add_grabber_mandatory:N\undefined
+ \let \__xparse_add_grabber_mandatory:N \__xparse_add_grabber:N
+ \fi
\cs_new_protected:Npn \sseq__xparse_add_type_U:w #1
{
\__xparse_flush_m_args:
@@ -48,19 +51,38 @@
\tl_put_right:Nn \l__xparse_signature_tl { {#1} }
\__xparse_prepare_signature:N
}
+%
+%
+ \cs_new_protected:Npn \sseq__cmd_grab_U:w #1#2 \__cmd_run_code:
+ { \sseq__cmd_grab_U_aux:nnN {#1} {#2} \cs_set_protected_nopar:Npn }
+ \cs_new_protected:Npn \sseq__cmd_grab_U_aux:nnN #1#2#3
+ {
+ \tl_set:Nn \l__cmd_signature_tl {#2}
+ \exp_after:wN #3 \l__cmd_fn_tl ##1 #1
+ { \__cmd_add_arg:n {##1} #1 }
+ \l__cmd_fn_tl
+ }
+ \cs_new_protected:Npn \sseq__cmd_add_type_U:w #1
+ {
+ \__cmd_flush_m_args:
+ \__cmd_add_default:
+ \__cmd_add_grabber:N U
+ \tl_put_right:Nn \l__cmd_signature_tl { {#1} }
+ \__cmd_prepare_signature:N
+ }
}
-
\@ifpackagelater{xparse}{2017/02/08}{
- \@ifpackagelater{xparse}{2018/10/17}{
+ \@ifpackagelater{xparse}{2018/10/17}{
\ifsseq@patchxparseU
\the\sseq@patchxparseUnewcode
\else
% Assumptions failed, so just make U give an error (this isn't such a big deal since we don't use it for \d anymore).
- \cs_new_protected:Npn \sseq__xparse_add_type_U:w #1
+ \cs_new_protected:Npn \sseq__cmd_add_type_U:w #1
{
\sseq@error{U-xparse-incompatible}
}
+ \cs_new_eq:NN \sseq__xparse_add_type_U:w \sseq__cmd_add_type_U
\fi
}{
\the\sseq@patchxparseUnewcode
@@ -105,7 +127,14 @@
\__xparse_add_arg_spec_mandatory:n { U {#1} }
\__xparse_normalize_arg_spec_loop:n
}
-}{
+
+ \cs_new_protected:Npn \sseq__cmd_normalize_type_U:w #1 {
+ \quark_if_recursion_tail_stop_do:nn {#1} { \__cmd_bad_arg_spec:wn }
+ \__cmd_normalize_check_lu:N U
+ \__cmd_add_arg_spec_mandatory:n { U {#1} }
+ \__cmd_normalize_arg_spec_loop:n
+ }
+}{
\cs_new_protected:Npn \sseq__xparse_normalize_type_U:w #1 {
\quark_if_recursion_tail_stop_do:nn {#1} { \__xparse_bad_arg_spec:wn }
\__xparse_normalize_check_lu:N U
@@ -116,14 +145,20 @@
}
}
% Expandable commands are a menace to us because they define a bunch of helper commands that we then have to keep track of.
-% We are too lazy to do this, so force \l__xparse_grab_expandably_bool to be false.
+% We are too lazy to do this, so force \l__cmd_grab_expandably_bool to be false.
% This is backwards compatible (I think) because \bool_set_false:N just performs a chardef (no existence check)
-% so in old versions, \l__xparse_grab_expandably_bool will be created harmlessly.
-\let\sseq__xparse_prepare_signature:n\__xparse_prepare_signature:n
-\pretocmd\sseq__xparse_prepare_signature:n { \bool_set_false:N \l__xparse_grab_expandably_bool } {}{\error}
+% so in old versions, \l__cmd_grab_expandably_bool will be created harmlessly.
+\let\sseq__cmd_prepare_signature:n\__cmd_prepare_signature:n
+\ifx\sseq__cmd_prepare_signature:n\undefined
+ \let\sseq__cmd_prepare_signature:n\__xparse_prepare_signature:n
+\fi
+\pretocmd\sseq__cmd_prepare_signature:n { \bool_set_false:N \l__cmd_grab_expandably_bool } {}{\error}
% I would like to patch the \__xparse_grab_U:w's in my commands into \sseq__xparse_grab_U:w's but I can't because of -NoValue-.
-\def\sseq@install@xparse@Uarggrabber{ \cs_set_eq:NN \__xparse_grab_U:w \sseq__xparse_grab_U:w }
+\def\sseq@install@xparse@Uarggrabber{%
+ \cs_set_eq:NN \__xparse_grab_U:w \sseq__xparse_grab_U:w
+ \cs_set_eq:NN \__cmd_grab_U:w \sseq__cmd_grab_U:w
+}
%%% \sseq@DeclareDocumentCommand
%
@@ -151,10 +186,13 @@
\cs_new_protected:Npn\sseq@DeclareDocumentCommandAs#1#2#3#4{
\group_begin:
+ \cs_set_eq:NN \__cmd_add_type_U:w \sseq__cmd_add_type_U:w
\cs_set_eq:NN \__xparse_add_type_U:w \sseq__xparse_add_type_U:w
+ \cs_set_eq:NN \__cmd_normalize_type_U:w \sseq__cmd_normalize_type_U:w
\cs_set_eq:NN \__xparse_normalize_type_U:w \sseq__xparse_normalize_type_U:w
- \cs_set_eq:NN \__xparse_prepare_signature:n \sseq__xparse_prepare_signature:n
- %\cs_set:Npn \__xparse_declare_cmd_code:Nnn {\bool_set_false:N \l__xparse_grab_expandably_bool\__xparse_declare_cmd_code_aux:Nnn}
+ \cs_set_eq:NN \__cmd_prepare_signature:n \sseq__cmd_prepare_signature:n
+ \cs_set_eq:NN \__xparse_prepare_signature:n \sseq__cmd_prepare_signature:n
+ %\cs_set:Npn \__cmd_declare_cmd_code:Nnn {\bool_set_false:N \l__cmd_grab_expandably_bool\__cmd_declare_cmd_code_aux:Nnn}
\sseq@installmsghooks
\def\sseq@error@setup{}
\def\sseq@error@cleanup{\sseq@errortrue}
@@ -209,7 +247,7 @@
\newtoks\sseq@macro@defaultarggetters@toks
\cs_new_protected:Npn\DeclareSseqCommand#1#2#3{%
- \cs_if_exist:cTF { sseq @ builtin @ \cs_to_str:N #1 } {\sseq@error@x{wont-override-system-macro}{\string#1}\sseq@break} {}
+ \cs_if_exist:cTF { sseq @ \cs_to_str:N #1 @@unique@@ start} {\sseq@error@x{wont-override-builtin}{\string#1}\sseq@break} {}
\cs_if_free:cT { sseq @ usermacro @ \cs_to_str:N #1 } {
\sseq@x@addto@macro { \sseq@installmacros } { \let \exp_not:N #1 \exp_not:c { sseq @ usermacro @ \cs_to_str:N #1 } }
}
@@ -344,7 +382,8 @@
\egroup
-% When there are arguments with default values (O, D, R, G), we need to put them into temporary macros to compare them and see if they are the default value
+% When there are arguments with default values (O, D, R, G), we need to put them
+% into temporary macros to compare them and see if they are the default value
% that's what \sseq@macro@defaultarggetters@toks is for.
\def\sseq@parseargspec#1#2{%
\sseq@tempcount=\z@
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqmain.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqmain.code.tex
index d9429f2215f..6456f99b4b5 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/sseqmain.code.tex
+++ b/Master/texmf-dist/tex/latex/spectralsequences/sseqmain.code.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% File: sseqmain.code.tex
@@ -103,9 +103,10 @@
\@xp\@nx\csname pgfk@/sseqpages/global/{\sseq@currentoptionpath} options/.@cmd\endcsname
}
\sseq@savedpaths@xadd{\@nx\sseq@style@object{\sseq@stylelist}}
- \sseq@savedpaths@add{\begingroup} % prevent some of the two-pass user macros horrors
+ \sseq@savedpaths@add{\begingroup\sseq@startcontentmarker} % prevent some of the two-pass user macros horrors
\let\sseq@error@setup\sseq@error@setup@withinfo
}
+\let\sseq@startcontentmarker\relax
% Just store all the settings
\def\endsseqdata{%
@@ -152,6 +153,8 @@
\gdef\sseq@pagecleanup{}% For undoing local option settings
%
\def\sseq@thepage{0}% page defaults to 0
+ \def\thepage{\sseq@printpageas}
+ \def\page{\sseq@printnum@inftytosymbol{\sseq@thepage}}
\sseq@thepagecount=\z@
\pgfqkeys{/sseqpages/global/name only}{#1}% Get the name
\sseq@tempiftrue
@@ -240,26 +243,66 @@
\@xp\sseq@break
\fi
%
- \sseq@tempdimen = \dimexpr \textwidth -\sseq@clip@padding@right - \sseq@xaxis@end@extend - \sseq@xaxis@start@extend - \sseq@yaxisgap \relax
- \sseq@tempcount = \numexpr \sseq@tempdimen /\sseq@xscalecm \relax
- \ifnum \numexpr\sseq@xmax-\sseq@xmin + 1 > \sseq@tempcount
- \pgfmathparse{\sseq@tempdimen/1cm/(\sseq@xmax-\sseq@xmin+1)}
- \sseq@error@xxxx{range-overflow}{x}
- {from \sseq@xmin\space to \sseq@xmax\space (xmax - xmin = \the\numexpr\sseq@xmax-\sseq@xmin)}
- {\the\sseq@tempcount}% max x range
- {\pgfmathresult}% max xscale
- %\@xp\sseq@break
- \fi
+ \sseq@setlayoutparameters
+ \ifsseq@rangecheck
+ % Calculate available space
+
+ % We might need to know the dimensions of the tick marks in order to calculate "margin" size.
+ \bgroup
+ \@xp\tikzset\@xp{\sseq@xtickstyle}
+ \pgfmathparse{height("\sseq@xmin") + depth("\sseq@xmin")}
+ \edef\sseq@xlabelheight{\pgfmathresult pt}
+ \sseq@smuggle@macro\sseq@xlabelheight
+ \egroup
+ \bgroup
+ \@xp\tikzset\@xp{\sseq@ytickstyle}
+ \pgfmathparse{max(width("\sseq@ymax"), width("\sseq@ymin"))}
+ \edef\sseq@maxylabelwidth{\pgfmathresult pt}
+ \sseq@smuggle@macro\sseq@maxylabelwidth
+ \egroup
+
+ % "totaldirmargin" isn't really quite margin: it's the distance between
+ % the bounding box (xmin, ymin) -- (xmax, ymax) and the bounding box of
+ % the resulting figure.
%
- \sseq@tempdimen = \dimexpr \textheight - \sseq@clip@padding@top - \sseq@yaxis@end@extend - \sseq@yaxis@start@extend - \sseq@xaxisgap \relax
- \sseq@tempcount = \numexpr \sseq@tempdimen /\sseq@yscalecm \relax
- \ifnum \numexpr\sseq@ymax-\sseq@ymin +1 > \sseq@tempcount
- \pgfmathparse{\sseq@tempdimen/1cm/(\sseq@ymax-\sseq@ymin+1)}
- \sseq@error@xxxx{range-overflow}{y}
- {from \sseq@ymin\space to \sseq@ymax\space (ymax - ymin = \the\numexpr\sseq@ymax-\sseq@ymin)}
- {\the\sseq@tempcount}% max x range
- {\pgfmathresult}% max xscale
- \@xp\sseq@break
+ % By subtracting the "margin" distance from the page width / height, we
+ % get the amount of space available for the content.
+ \sseq@tempxdimen = \dimexpr \linewidth - \sseq@totalhorizontalmargin@yborder - 0.1pt
+ \sseq@tempydimen = \dimexpr \textheight - \sseq@totalverticalmargin@xborder - 0.1pt
+%
+ \ifsseq@rangecheck@sideways
+ % Swap availability measurements
+ \sseq@tempdimen=\sseq@tempxdimen
+ \sseq@tempxdimen=\sseq@tempydimen
+ \sseq@tempydimen=\sseq@tempdimen
+ \fi
+%
+ % \showthe\dimexpr\dimexpr \sseq@tempxdimen - \sseq@xscale cm * (\sseq@xmax-\sseq@xmin)\relax
+ % Compare space available to range * scale.
+ \ifdim \sseq@tempxdimen < \dimexpr \sseq@xscale cm * (\sseq@xmax-\sseq@xmin)\relax
+ % this will divide by zero if somehow we overflow the space on page
+ % while the range is 0. Hopefully no one will ever manage that.
+ \pgfmathparse{\sseq@tempxdimen/1cm/(\sseq@xmax-\sseq@xmin)} % max x range
+ \sseq@tempx = \numexpr \sseq@tempxdimen /\sseq@xscalecm \relax % max xscale
+ \sseq@error@xxxx{range-overflow}{x}
+ {from \sseq@xmin\space to \sseq@xmax\space (xmax - xmin = \the\numexpr\sseq@xmax-\sseq@xmin)}
+ {\the\sseq@tempx}% max x range
+ {\pgfmathresult}% max xscale
+ %\@xp\sseq@break
+ \fi
+%
+ \relax % Not sure why we need this...
+%
+ % \showthe\dimexpr\dimexpr \sseq@tempydimen - \sseq@yscale cm * (\sseq@ymax-\sseq@ymin)\relax
+ \ifdim \sseq@tempydimen < \dimexpr \sseq@yscale cm * (\sseq@ymax-\sseq@ymin)\relax
+ \sseq@tempy = \numexpr \sseq@tempydimen /\sseq@yscalecm \relax % max y range
+ \pgfmathparse{\sseq@tempydimen/1cm/(\sseq@ymax-\sseq@ymin)} % max yscale
+ \sseq@error@xxxx{range-overflow}{y}
+ {from \sseq@ymin\space to \sseq@ymax\space (ymax - ymin = \the\numexpr\sseq@ymax-\sseq@ymin)}
+ {\the\sseq@tempy}% max y range
+ {\pgfmathresult} % max yscale
+ %\@xp\sseq@break
+ \fi
\fi
%
% Really this could be anything between -\sseq@xmin and -\sseq@xmax and it wouldn't matter. We'll split the difference.
@@ -267,13 +310,18 @@
\sseq@yoffset=\numexpr\sseq@intdivceiling{\numexpr-\sseq@ymin-\sseq@ymax\relax}{\numexpr4*\sseq@ygridstep\relax}*(2*\sseq@ygridstep)\relax
%
%
+ \def\sseq@temp{\sseq@novalue}
+ \ifx\sseq@printpageas\sseq@temp
+ \def\sseq@printpageas{Page $2$ (all differentials)}%
+ \fi
+%
+%
\tikzset{
z=0pt,
every path/.style={},
every node/.style={}
}
\let\errmessage\sseq@errmessage@std
- \sseq@setlayoutparameters
\begin{tikzpicture}[/sseqpages/global/{default} options,\ifsseq@hasname/sseqpages/global/{\sseq@thename} options\fi,/sseqpages/global/{this page} options]%
\sseq@sseqstyle@globalpart
\sseq@globaldetonetransform
@@ -290,7 +338,7 @@
% Axes labels only occur once per page, so the cost of typesetting them with tikz doesn't matter ... THANK GOD
\ifx\sseq@title\pgfutil@empty\else
\ifsseq@drawtitle
- \sseq@eval{\@nx\path (0,-\sseq@yoffset) node[
+ \sseq@eval{\@nx\node[
/sseqpages/global/every title,
above=\sseq@topclippadding+5pt
] {\unexpanded\expandafter{\sseq@title}};
@@ -376,6 +424,7 @@
\let\sseq@class@drawnode\sseq@copypage@addclass
\let\sseq@differential@object\@gobble
\let\sseq@structline@draw\sseq@copypage@addstructline
+ \let\sseq@extension@draw\sseq@copypage@addextension
\let\sseq@tikzpath@object\@gobble
\let\sseq@pgfkeysdocommand\@gobbletwo
\sseq@savedpaths
@@ -394,6 +443,10 @@
\sseq@x@addto@macro\sseq@copymacro{\@nx\sseq@structline@copy{\sseq@thename}{#1}}
}
+\def\sseq@copypage@addextension#1{
+ \sseq@x@addto@macro\sseq@copymacro{\@nx\sseq@extension@copy{\sseq@thename}{#1}}
+}
+
%%% Scope
\newcount\sseq@scope@savestackid
@@ -478,6 +531,7 @@
}
+
%%%%%
%%
%% The main commands
@@ -583,7 +637,7 @@
\sseq@obj@xdef{\classname.needstikz}{\sseq@needstikztrue}%
\fi
\@ifundefined{sseq@tempoffset}{}{%
- \tikz@scan@one@point\sseq@setoffset\sseq@tempoffset
+ \@xp\tikz@scan@one@point\@xp\sseq@setoffset\sseq@tempoffset
}%
\ifx\sseq@tooltip\pgfutil@empty\else
\sseq@obj@protectedxdef{\classname.tooltip}{\sseq@tooltip}
@@ -761,7 +815,7 @@
\fi
\@ifundefined{sseq@tempoffset}{}{
\sseq@cleanup@obj{\classname.offset}
- \tikz@scan@one@point\sseq@setoffset\sseq@tempoffset
+ \@xp\tikz@scan@one@point\@xp\sseq@setoffset\sseq@tempoffset
}
\ifnum\sseq@tempcount<\sseq@genmax\repeat
\sseq@breakpoint
@@ -833,6 +887,7 @@
}
\def\sseq@replaceclassmain#1{
+ \sseq@pushstack@\coord
\sseq@options@firstpassmode
\the\sseq@sseqstyle
\the\sseq@classstyle
@@ -844,19 +899,19 @@
\sseq@processlabels
\sseq@obj@ifundef{class.\coord.num}{\sseq@error@x{replaceclass-no-class}{\coordname}\sseq@break}{}
\sseq@ifdead\coord{}{\sseq@error@x{replaceclass-not-dead-yet}{\coordname}\sseq@break}
-%
\edef\oldclassname{class.\coord[\sseq@obj{class.\coord.num}]}
+% \ifsseq@keepchanges\else
+% \ifnum\the\numexpr\sseq@obj{\oldclassname.page}<\sseq@thepagecount\else
+% \edef\sseq@temp{\sseq@obj{\oldclassname.page}}
+% \sseq@error@xxx{replaceclass-no-effect-on-this-page}{\coord}{\sseq@temp}{\the\numexpr\sseq@temp+\@ne}% warning
+% \sseq@breakfifi
+% \fi
+% \fi
+%
\sseq@cleanup@obj{class.\coord.num}
\sseq@obj@inc{class.\coord.num}
\edef\classname{class.\coord[\sseq@obj{class.\coord.num}]}
-%
- \ifsseq@keepchanges\else
- \ifnum\the\numexpr\sseq@obj{\oldclassname.page}<\sseq@thepagecount\else
- \edef\sseq@temp{\sseq@obj{\oldclassname.page}}
- \sseq@error@xxx{replaceclass-no-effect-on-this-page}{\coord}{\sseq@temp}{\the\numexpr\sseq@temp+\@ne}% warning
- \sseq@breakfifi
- \fi
- \fi
+ %\show\classname
%
\let\partialcoord\coord@partial
\ifx\sseq@class@tag\pgfutil@empty\else
@@ -908,11 +963,44 @@
\ifsseq@needstikz
\sseq@obj@xdef{\classname.needstikz}{\sseq@needstikztrue}
\fi
- \@ifundefined{sseq@tempoffset}{}{\tikz@scan@one@point\sseq@setoffset\sseq@tempoffset}
+ \@ifundefined{sseq@tempoffset}{}{\@xp\tikz@scan@one@point\@xp\sseq@setoffset\sseq@tempoffset}
%
\sseq@breakpoint
\endgroup
}
+
+\sseq@DeclareDocumentCommand\replacestructlines{od()}{%
+ \begingroup
+ \sseq@loadinputline
+ \sseq@xsetthiscall{\string\replaceclass\IfNoValueF{#1}{[\unexpanded{#1}]}\unexpanded{(#2)}}
+%
+ \IfNoValueTF{#2}{
+ \def\sseq@coord{\lastclass0}
+ }{
+ \def\sseq@coord{#2}
+ }
+ \sseq@parsecoord\coord{\sseq@coord}{coordinate passed to \string\replaceclass}%
+%
+ % TODO: error handling here...
+%
+ \edef\sseq@classnum{\sseq@obj{class.\coord.num}}%
+ \ifnum\sseq@classnum=0\relax
+ \sseq@error@x{replacestructlines-class-not-replaced}{\coordname}\sseq@breakfi
+ \fi
+ \edef\classname{class.\coord[\sseq@classnum]}%
+ %\show\classname
+ \edef\oldclassname{class.\coord[\the\numexpr\sseq@obj{class.\coord.num}-1]}%
+ \sseq@cleanup@obj{\classname.dependencies}%
+ \sseq@obj@gletobj{\classname.dependencies}{\oldclassname.dependencies}%
+ %\sseq@obj@show{\classname.dependencies}
+ \sseq@obj@map{\classname.dependencies}{
+ \sseq@cleanup@obj{##1.page}%
+ \sseq@obj@gletobj{##1.page}{##1.page.old}%
+ }
+ \sseq@breakpoint
+ \endgroup
+}
+
\def\sseq@class@draw@ifpage#1{
\bgroup
\sseq@obj@pagetogen{#1}{\sseq@thepage} % sets \sseq@gen
@@ -1045,6 +1133,14 @@
% #2 -- page
% #3 -- source coordinate
\def\sseq@d@d#1#2{%%
+ \sseq@obj@ifdef{class.\source.hasextension}{
+ \sseq@error@xxx{d-class-has-extension}{source}{\sourcename}{#2}
+ \sseq@break
+ }{}
+ \sseq@obj@ifdef{class.\target.hasextension}{
+ \sseq@error@xxx{d-class-has-extension}{target}{\targetname}{#2}
+ \sseq@break
+ }{}
\sseq@d@setpageminrec{class.\source}{#2}{source}% automatically handles \sseq@cleanup@obj
\sseq@d@setpageminrec{class.\target}{#2}{target}
%%% This is the last point we might break, so now the differential is good.
@@ -1076,7 +1172,7 @@
\sseq@cleanup@obj{d.#2\source\target.familylist}
\sseq@obj@xoaddto{d.#2\source\target.familylist}{\sseq@familylist}
\sseq@cleanup@obj{d.#2\source\target.options}
- \sseq@obj@xoaddto{d.#2\source\target.options}{\sseq@savedoptioncode}
+ \sseq@obj@xaddto{d.#2\source\target.options}{\ifsseq@needstikz\@nx\sseq@needstikztrue\fi\unexpanded\@xp{\sseq@savedoptioncode}}
}
% Some helper macros:
@@ -1089,6 +1185,8 @@
\sseq@cleanup@obj{#1[\sseq@obj{#1.num}].deathline}
\sseq@d@setpageclass{#1}{#2}{#3}
\sseq@obj@map{#1[\sseq@obj{#1.num}].dependencies}{
+ %\def\temp{##1}\show\temp
+ %\sseq@obj@show{#1[\sseq@obj{#1.num}].dependencies}
\sseq@d@setpagemin{##1}{#2} % automatically handles cleanup
}
}
@@ -1173,6 +1271,8 @@
\ifnum\sseq@obj{#1.page}>#2\relax
\ifnum\sseq@obj{#1.pagemin}>#2\relax\else % prevent a d1 from getting rid of a structline that was supposed to start on page 5
\sseq@cleanup@obj{#1.page}
+ \sseq@cleanup@obj{#1.page.old}
+ \sseq@obj@gletobj{#1.page.old}{#1.page}
\sseq@obj@xdef{#1.page}{#2}
\fi
\fi
@@ -1258,6 +1358,7 @@
}%
\sseq@parsecoord\source{\sourcename}{source of structure line}%
\sseq@parsecoord\target{\targetname}{target of structure line}%
+ % Sort \xsource and \xtarget. This is to ensure that if a person adds
\ifnum\xsource>\xtarget\relax
\sseq@parsedcoords@swap\source\target
\else
@@ -1270,14 +1371,15 @@
\sseq@parsedcoords@swap\source\target
\else
\ifnum\nsource=\ntarget\relax
- \sseq@error{structline-source-target-equal}%
- \@xp\sseq@break\romannumeral-`0
+ \sseq@error@n{edge-source-target-equal}{\structline}%
+ \sseq@fbreak
\fi
\fi
\fi
\fi
\fi
\fi
+ \relax % stop fbreak
\@ifundefined{sseq@structline@page}{%this is repeated in circleclasses
\def\sseq@pagemin{0}
\ifnum\sseq@obj{class.\source.num}>\z@
@@ -1462,6 +1564,152 @@
\def\sseq@structline@draw#1{\sseq@eval{\@nx\sseq@drawedge\sseq@obj{#1.source}\sseq@obj{#1.target}{structline}{\@nx\sseq@obj{#1.options}}}}
+
+\sseq@DeclareDocumentCommand\extension{od()}{%
+ \begingroup
+ \sseq@loadinputline
+ \IfNoValueTF{#2}{
+ \sseq@extension@main{extension}{#1}{#2}{#2}
+ }{
+ \def\next{\sseq@extension@@{extension}{#1}{#2}}%
+ \@xptwo\next\sseq@trimleadingspaces
+ }
+}
+\sseq@DeclareDocumentCommand\extensionoptions{od()}{%
+ \begingroup
+ \sseq@loadinputline
+ \IfNoValueTF{#2}{
+ \sseq@structline@main{extensionoptions}{#1}{#2}{#2}
+ }{
+ \def\next{\sseq@extensionoptions@@{extensionoptions}{#1}{#2}}%
+ \@xptwo\next\sseq@trimleadingspaces
+ }
+}
+
+\sseq@DeclareDocumentCommandAs\sseq@extension@@\extension{mmmd()}{%
+ \sseq@extension@main{#1}{#2}{#3}{#4}
+}
+
+\sseq@DeclareDocumentCommandAs\sseq@extensionoptions@@\extensionoptions{mmmd()}{%
+ \sseq@extension@main{#1}{#2}{#3}{#4}
+}
+
+\def\sseq@extension@main#1#2#3#4{
+ \sseq@xsetthiscall{\string\extension\IfNoValueF{#2}{\unexpanded{[#2]}}\IfNoValueF{#3}{\unexpanded{(#3)}\IfNoValueF{#4}{\unexpanded{(#4)}}}}%
+ \def\sseq@edgetype{structline}
+ \sseq@options@firstpassmode
+ \the\sseq@sseqstyle
+ \the\sseq@edgestyle
+ \the\sseq@structlinestyle
+ \the\sseq@scope@toks
+ \sseq@options@normalmode
+ \IfNoValueF{#2}{%
+ \sseq@processoptions{extension}{#2}% Outputs result into \sseq@savedoptioncode
+ }%
+ \def\sourcename{#3}%
+ \def\targetname{#4}%
+ \IfNoValueTF{#3}{%
+ \def\sourcename{\lastclass1}%
+ \def\targetname{\lastclass}%
+ }{%
+ \IfNoValueT{#4}{%
+ \def\targetname{\lastclass}%
+ }%
+ }%
+ \sseq@parsecoord\source{\sourcename}{source of extension}%
+ \sseq@parsecoord\target{\targetname}{target of extension}%
+ \ifnum\xsource>\xtarget\relax
+ \sseq@parsedcoords@swap\source\target
+ \else
+ \ifnum\xsource=\xtarget\relax
+ \ifnum\ysource>\ytarget\relax
+ \sseq@parsedcoords@swap\source\target
+ \else
+ \ifnum\ysource=\ytarget\relax
+ \ifnum\nsource>\ntarget\relax
+ \sseq@parsedcoords@swap\source\target
+ \else
+ \ifnum\nsource=\ntarget\relax
+ \sseq@error@n{edge-source-target-equal}{\extension}%
+ \sseq@fbreak
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \relax % stop fbreak
+ \csname sseq@extension@#1\endcsname
+ \sseq@breakpoint
+ \endgroup
+}
+\def\sseq@extension@extension{
+ \ifnum\sseq@obj{class.\source[\sseq@obj{class.\source.num}].page}<\sseq@infinity\relax
+ \sseq@error{extension-stillborn}
+ \sseq@breakfi
+ \fi
+ \ifnum\sseq@obj{class.\target[\sseq@obj{class.\target.num}].page}<\sseq@infinity\relax
+ \sseq@error{extension-stillborn}
+ \sseq@breakfi
+ \fi
+ \edef\sseq@extensionname{extension.\source\target}
+ \sseq@obj@ifdef{\sseq@extensionname.source}{%
+ \sseq@error@xx{extension-already-exists}{\sourcename}{\targetname}
+ \sseq@breakfi
+ }{
+ \sseq@savedpaths@addextension{extension.\source\target}
+ }
+ \sseq@cleanup@obj{class.\source.hasextension}
+ \sseq@obj@gdef{class.\source.hasextension}{}
+ \sseq@cleanup@obj{class.\target.hasextension}
+ \sseq@obj@gdef{class.\target.hasextension}{}
+ \sseq@cleanup@obj{\sseq@extensionname.source}
+ \sseq@obj@xdef{\sseq@extensionname.source}{\source}
+ \sseq@obj@xdef{\sseq@extensionname.target}{\target}
+ \sseq@obj@xodef{\sseq@extensionname.familylist}{\sseq@familylist}
+ \sseq@cleanup@obj{\sseq@extensionname.options}
+ \sseq@obj@xdef{\sseq@extensionname.options}{\ifsseq@needstikz\@nx\sseq@needstikztrue\fi\unexpanded\@xp{\sseq@savedoptioncode}}
+}
+\def\sseq@extension@extensionoptions{
+ \edef\sseq@extensionname{extension.\source\target}
+ \sseq@obj@ifundef{\sseq@extensionname.source}{
+ \sseq@error@n{cmdoptions-feature-doesn't-exist}{\extension}
+ \sseq@break
+ }{}
+ \sseq@cleanup@obj{\sseq@extensionname.options}
+ \sseq@cleanup@obj{\sseq@extensionname.familylist}
+ \ifsseq@needstikz
+ \sseq@obj@gaddto{\sseq@extensionname.options}{\sseq@needstikztrue}
+ \fi
+ \sseq@obj@xoaddto{\sseq@extensionname.options}{\sseq@savedoptioncode}
+ \sseq@obj@xoaddto{\sseq@extensionname.familylist}{\sseq@familylist}
+}
+
+\def\sseq@extension@copy#1#2{
+ \begingroup
+ \sseq@structline@copy@decomposename#2
+ \let\sseq@thename@saved\sseq@thename
+ \def\sseq@pagemin{0}
+ \sseq@parsecoord\source{\sourcename}{source of structure line}%
+ \sseq@parsecoord\target{\targetname}{target of structure line}
+ \def\sseq@thename{#1}
+ \sseq@lettoobj\sseq@familylist{#2.familylist}
+ \sseq@lettoobj\sseq@savedoptioncode{#2.options}
+ \let\sseq@thename\sseq@thename@saved
+ \sseq@extension@extension
+ \endgroup
+}
+
+
+\def\sseq@extension@draw@ifpage#1{
+ \bgroup
+ \ifnum\sseq@thepage=\sseq@infinity\relax
+ \sseq@extension@draw{#1}
+ \fi
+ \egroup
+}
+\def\sseq@extension@draw#1{\sseq@eval{\@nx\sseq@drawedge\sseq@obj{#1.source}\sseq@obj{#1.target}{structline}{\@nx\sseq@obj{#1.options}}}}
+
%% This is a dumb place to put this. It has to be after the differential commands are defined.
\ifsseq@draftmode % Okay, have to dummy out all the main commands.
% Only add tikz background paths to the savedpaths. We need to draw background paths because they might change the bounding box!
@@ -1515,12 +1763,30 @@
\sseq@DeclareDocumentCommand\replacesource{o}{}
\sseq@DeclareDocumentCommand\replacetarget{o}{}
\def\sseq@d@main#1#2#3#4#5{}
- \DeclareDocumentCommand \sseq@DrawIfValidDifferential@@ { d() d() } {}
+ \DeclareDocumentCommand \sseq@DrawIfValidDifferential@ { mmO{} } {
+ \sseq@loadinputline
+ \def\sseq@dtype{d}
+ \def\sseq@trueclause{#1}
+ \def\sseq@falseclause{#2}
+ \sseq@d@grabpage\sseq@DrawIfValidDifferential@@
+ }
+ \DeclareDocumentCommand \sseq@DrawIfValidDifferential@@ { d() d() } {
+ \csname sseq@DrawIfValidDifferential@@handle@truefalse%
+ @@\sseq@trueclause\sseq@falseclause
+ \endcsname
+ }
+ % Have to do something in case it branches. We somewhat arbitrarily always
+ % pretend it branched yes.
+ \def\sseq@DrawIfValidDifferential@@handle@truefalse@@{}
+ \def\sseq@DrawIfValidDifferential@@handle@truefalse@@T{\@firstofone}
+ \def\sseq@DrawIfValidDifferential@@handle@truefalse@@F{\@gobble}
+ \def\sseq@DrawIfValidDifferential@@handle@truefalse@@TF{\@firstoftwo}
+
\sseq@DeclareDocumentCommand\structline{od()d()}{}
\sseq@DeclareDocumentCommand\structlineoptions{od()d()}{}
\sseq@DeclareDocumentCommand\circleclasses{or()r()}{}
\sseq@DeclareDocumentCommand\gettag{mr()}{}
- \endinput
+ \expandafter\endinput
\fi
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqmessages.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqmessages.code.tex
index 0033bb4a2ed..fc735f3014d 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/sseqmessages.code.tex
+++ b/Master/texmf-dist/tex/latex/spectralsequences/sseqmessages.code.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% File: sseqmessages.code.tex
@@ -275,7 +275,7 @@
\def\sseq@error@xxxx{\msg_error:nnxxxx{spectralsequences}}
\def\sseq@warning {\msg_warning:nn{spectralsequences}}
-\def\sseq@newerror#1#2{\msg_new:nnn{spectralsequences}{#1}{#2}}
+\def\sseq@newerror#1#2{\msg_new:nnn{spectralsequences}{#1}{#2\sseq@errorinfo}}
\def\sseq@newerror@internal#1#2{\msg_new:nnn{spectralsequences}{#1}{Internal error: #2 \sseq@contactpackageauthor}}
\edef\sseq@contactpackageauthor{Contact package author \sseq@authorname\space at \sseq@authoremail.}
@@ -285,6 +285,7 @@
\cs_new_eq:NN \__sseq_hooked_msg_error_code:nnnnnn \__msg_error_code:nnnnnn
\cs_new_eq:NN \__sseq_hooked_msg_warning_code:nnnnnn \__msg_warning_code:nnnnnn
\cs_new_eq:NN \__sseq_hooked_msg_info_code:nnnnnn \__msg_info_code:nnnnnn
+\cs_new_eq:NN \__sseq_hooked_interupt_wrap:nnn \__msg_interrupt_wrap:nnn
\cs_new:Npn \sseq@installmsghooks {%
@@ -294,12 +295,13 @@
\cs_set_eq:NN \__msg_error_code:nnnnnn \__sseq_hooked_msg_error_code:nnnnnn
\cs_set_eq:NN \__msg_warning_code:nnnnnn \__sseq_hooked_msg_warning_code:nnnnnn
\cs_set_eq:NN \__msg_info_code:nnnnnn \__sseq_hooked_msg_info_code:nnnnnn
+ \cs_set_eq:NN \__msg_interrupt_wrap:nnn \__sseq_hooked_interupt_wrap:nnn
}
\sseq@newerror@internal{msg-patch-failed}{Failed to patch the latex 3 message system. The errors will not be as expressive.}
\def\sseq@msgpatchfailed{
- \msg_error:nn{spectralsequences}{msg-patch-failed}
+ \msg_warning:nn{spectralsequences}{msg-patch-failed}
\def\sseq@installmsghooks{}
\sseq@break
}
@@ -310,7 +312,6 @@
\pretocmd\__sseq_hooked_msg_see_documentation_text:n{\sseq@errorinfo}{}{\sseq@msgpatchfailed}
-
\pretocmd\__sseq_hooked_msg_fatal_code:nnnnnn {\sseq@error@setup} {}{\sseq@msgpatchfailed}
\pretocmd\__sseq_hooked_msg_error_code:nnnnnn {\sseq@error@setup} {}{\sseq@msgpatchfailed}
%\pretocmd\__sseq_hooked_msg_warning_code:nnnnnn{\sseq@msg@setup} {}{\sseq@msgpatchfailed}
@@ -319,6 +320,7 @@
\apptocmd\__sseq_hooked_msg_error_code:nnnnnn {\sseq@error@cleanup}{}{\sseq@msgpatchfailed}
%\apptocmd\__sseq_hooked_msg_warning_code:nnnnnn{\sseq@error@cleanup}{}{\sseq@msgpatchfailed}
%\apptocmd\__sseq_hooked_msg_info_code:nnnnnn {\sseq@error@cleanup}{}{\sseq@msgpatchfailed}
+\patchcmd \__sseq_hooked_interupt_wrap:nnn {\str_count:N\l__msg_text_str-\str_count:N\l__msg_name_str +2} {2} {}{\sseq@msgpatchfailed}
\sseq@breakpoint
@@ -355,7 +357,6 @@
\sseq@newerror@internal{expl3-incompatibility}{Since this version of spectralsequences, the expl3 definition of #1 was updated in an incompatible way.}
-
\sseq@newerror@internal{this-shouldnt-happen}{This branch of the code should be unreachable. Something really weird has happened. Error occurred in #1.}
% Convexity thing
@@ -377,7 +378,7 @@
%%
%%
\sseq@newerror@internal{U-xparse-incompatible}{The 'U' argument type is incompatible with the current version of xparse.}
-\sseq@newerror{won't-override-builtin}{Macro '#1' is a spectralsequences builtin and I won't override it. Try a different name.}
+\sseq@newerror{wont-override-builtin}{Macro '#1' is a spectralsequences built in and I won't override it. Try a different name.}
\sseq@newerror{usermacro-not-free}{Macro '#1' has already been defined using \string\DeclareSseqCommand, \string\NewSseqCommand, \string\DeclareSseqGroup, or \string\NewSseqGroup. I am overriding it. If this is what you intended, you should either use \@nx\DeclareSseqGroup or \string\DeclareSseqCommand, which won't complain.}
\sseq@newerror{macro-patch-failed}{Failed to patch macro '#1'. This is probably some annoying catcode issue. Try \@nx\tracingpatches to see more information about why the patch failed.}
@@ -389,9 +390,10 @@
%%
%%
\sseq@newerror{classpattern-already-defined}{Class pattern '#1' already defined. Overwriting it.}
+\sseq@newerror{classpattern-invalid-math-expression}{Expression '#1' encountered in class pattern definition is not a valid math expression. Skipping the definition.}
\sseq@newerror{classpattern-unexpected-token}{Unexpected token '#1' in class pattern definition. Skipping the definition.}
\sseq@newerror{classpattern-missing-tokens}{Incomplete class pattern definition. Skipping the definition.}
-\sseq@newerror{classpattern-extra-coord-ignored}{Extra coordinate '#1' ignored. You probably forgot a semicolon.}
+\sseq@newerror{classpattern-extra-coord-ignored}{Extra coordinate '#1' ignored in row #2. You probably forgot a semicolon.}
\sseq@newerror{classpattern-too-few-coords}{Too few coordinates in row #1.}
\sseq@newerror{classpattern-too-many-classes}{%
@@ -406,11 +408,12 @@
\sseq@newerror{class-no-tag}{The class #1 has no tag so I cannot get it.}
\sseq@newerror{class-extra-coords}{Too many coordinates. Ignoring the extra ones.}
-\sseq@newerror{named-coordinate-class}{You can't pass a named coordinate to \string\class.} % Probably not actually possible to obtain this error
+\sseq@newerror{named-coordinate-class}{You can't pass a named coordinate to \string\class.}
+
\sseq@newerror{d-no-degree}{%
- You must specify the degree of your spectral sequence if you want to use the differential command \string\d.
+ If you want to use the differential command \string\d\ you must either specify the grading of the differential or explicitly provide a target coordinate for the differential.
Specify the degree by providing 'degree={f(\#1)}{g(\#1)}' as an option to '\string\begin{sseqdata}',
- where f(\#1) and g(\#1) are formulas for the x and y degree of the \#1th page differential.%
+ where f(\#1) and g(\#1) are formulas for the x and y degree of the \#1th page differential. Alternatively, you may say e.g., '\string\d2(source)(target)'%
}
\sseq@newerror{d-named-coord-two-indexes}{You provided a named class and two indexes, but the named class already comes with an index so you can only provide one more for the target. Ignoring the second index.}% should be a warning
\sseq@newerror{d-target-index-target-coord}{You provided both a target index and a target coordinate, but this overdetermines the differential. Ignoring the target index.}
@@ -461,7 +464,7 @@
or '\string\begin{sseqpage}[#1\sseq@possiblecurrentvaluemean]').%
}
-% Applies to name and page, and saying "sseqs={name=somename}" is just a bad idea.
+% Applies to name and page. Saying "sseqs={name=somename}" is a bad idea.
\sseq@newerror{option-no-default-allowed}{%
You cannot set a default value for '#1'.% Try \@nx\sseqset{sseqs={#1\ifx\pgfkeyscurrentvalue\pgfkeysnovalue@text\else=\pgfkeyscurrentvalue\fi}}.%
}
@@ -550,7 +553,7 @@
\sseq@newerror{replaceclass-not-dead-yet}{I cannot replace the class at #1 because it seems to be alive and well.}
\sseq@newerror{replaceclass-no-effect-on-this-page}{The class at #1 died on page #2 so replacing it only affects pages after #3, but the current page is \sseq@thepage.} % warning
-
+\sseq@newerror{replacestructlines-class-not-replaced}{I cannot replace the structlines on #1 because it has not been replaced.}
\sseq@newerror{d-invalid-page}{Invalid page '#1'.}
@@ -558,6 +561,7 @@
The #1 #2 of differential \sseq@thiscall\ on page #3 has already been the #4.
Use \string\replaceclass#2 before \sseq@thiscall.%
}
+\sseq@newerror{d-class-has-extension}{The #1 #2 of differential \sseq@thiscall\ on page #3 has already been involved in an extension. If you are planning to replace it, move the \string\extension\ after the call to \string\replaceclass.}
\sseq@newerror{d-hit-same-page-replaceclass}{%#1 <- #3, #2 <- \csname #3name\endcsname, #3 <- #2, #3 <-\sseq@obj{#1[\the\sseq@tempcount].deathinfo},
The #1 #2 of differential \sseq@thiscall\ was the #3.
If multiple differentials touch a class on the same page, they cannot be separated by a \@nx\replaceclass command.%
@@ -570,8 +574,9 @@
\sseq@newerror{structline-no-page-max}{You cannot provide \@nx\structline with the option "page=min--max", only with "page=min".} %warning
\sseq@newerror{structline-already-exists}{Cannot add a structline from #1 to #2 because such a structline already exists.}
-\sseq@newerror{structline-stillborn}{Structline dies before it is born. Perhaps you meant to specify a different source or target?}
-\sseq@newerror{structline-source-target-equal}{The source and target of a \@nx\structline cannot be equal.}
+\sseq@newerror{structline-stillborn}{#1 dies before it is born. Perhaps you meant to specify a different source or target?}
+\sseq@newerror{extension-stillborn}{Either the source or target of extension is not currently alive. Perhaps you meant to specify a different source or target? Perhaps you forgot a call to \@nx\replaceclass?}
+\sseq@newerror{edge-source-target-equal}{The source and target of a #1 cannot be equal.}
\protected\def\sseq@quiet{\msg_redirect_module:nnn{spectralsequences}{error}{info}}
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqparsers.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqparsers.code.tex
index f6376a303cc..b7452d89ae8 100644
--- a/Master/texmf-dist/tex/latex/spectralsequences/sseqparsers.code.tex
+++ b/Master/texmf-dist/tex/latex/spectralsequences/sseqparsers.code.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.2.2 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.3.0 2021-07-18
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2019-02-18
+%% Date: 2021-07-18
%% License: Latex Project Public License
%%
%% File: sseqparsers.code.tex
@@ -38,7 +38,16 @@
% Prevent \protect from causing trouble for \pgfmathparse
\let\sseq@pgfmathparse@orig\pgfmathparse
-\protected\def\sseq@pgfmathparse#1{\let\@@protect\protect\def\protect{}\sseq@pgfmathparse@orig{#1}\restore@protect}
+\protected\def\sseq@pgfmathparse#1{%
+ \bgroup
+ \let\@@protect\protect
+ \def\protect{}%
+ \let\pgfmath@protected@edef\edef
+ \sseq@pgfmathparse@orig{#1}%
+ \restore@protect
+ \sseq@smuggle@macro\pgfmathresult
+ \egroup
+}
%%% ifpgfmathexpr
@@ -344,7 +353,7 @@
\newcount\sseq@cp@row
\newcount\sseq@cp@n
-\def\sseqnewclasspattern#1#2{
+\def\SseqNewClassPattern#1#2{
\ifcsname sseq@#1xoffset1/1\endcsname\sseq@error@n{classpattern-already-defined}{#1}\fi % could be a warning
\begingroup
\def\sseq@name{#1}
@@ -355,6 +364,7 @@
\let\next\sseq@newclasspattern@
\sseq@newclasspattern@#2\sseq@nil
}
+\let\sseqnewclasspattern\SseqNewClassPattern
\def\sseq@newclasspattern@{
\@ifnextchar\bgroup{\sseq@error@n{classpattern-unexpected-token}{\{}}{\sseq@newclasspattern@processstate}
@@ -371,7 +381,7 @@
\def\sseq@temp{}
\def\sseq@state{ycoord}
}{
- \sseq@error{classpattern-not-integer-expression}
+ \sseq@error@x{classpattern-invalid-math-expression}{\sseq@temp}
\let\next\sseq@newclasspattern@abort
}
\else
@@ -391,9 +401,9 @@
\let\sseq@tempy\sseq@mathresult
\def\sseq@temp{}
\def\sseq@state{nocoord}
- \advance\sseq@cp@n\@ne
+ \advance\sseq@cp@n1\relax
\ifnum\sseq@cp@n>\sseq@cp@row\relax
- \sseq@error@x{classpattern-extra-coord-ignored}{(\sseq@tempx,\sseq@tempy)}
+ \sseq@error@xx{classpattern-extra-coord-ignored}{(\sseq@tempx,\sseq@tempy)}{\the\sseq@cp@row}
\else
\sseq@e@addto@macro\sseq@newclasspattern@dodefs{
\def\@xp\@nx\csname sseq@\sseq@name xoffset\the\sseq@cp@n/\the\sseq@cp@row\endcsname{\sseq@tempx}
@@ -401,7 +411,7 @@
}
\fi
}{
- \sseq@error{classpattern-not-integer-expression}
+ \sseq@error@x{classpattern-invalid-math-expression}{\sseq@temp}
\let\next\sseq@newclasspattern@abort
}
\else
@@ -420,12 +430,12 @@
\def\sseq@state{xcoord}
\else
\ifx#1;
- \ifnum\sseq@cp@n=\sseq@cp@row\relax
- \advance\sseq@cp@row\@ne
- \sseq@cp@n=\z@
- \else
+ \ifnum\sseq@cp@n<\sseq@cp@row\relax
\sseq@error@x{classpattern-too-few-coords}{\the\sseq@cp@row}
\let\next\sseq@newclasspattern@abort
+ \else
+ \advance\sseq@cp@row\@ne
+ \sseq@cp@n=\z@
\fi
\else
\ifx#1\sseq@nil
@@ -480,13 +490,14 @@
% \sseq@parsecoord@maincoord -- separates a coordinate into {x,y}{n or tag}, numerically evaluates x and y, and adds in the values of \sseq@x and \sseq@y
% \sseq@parsecoord@index -- decides which class {n or tag} represents
%
-% There are three interface commands:
+% There are several interface commands:
% \sseq@parsecoord -- for most things
% \sseq@cparsecoord -- for \class (but not for \replaceclass or \classoptions). Doesn't use \sseq@parsecoord@index at all.
% \sseq@dparsecoord -- for \d and \doptions
% \sseq@parsecoordex -- for \isalive: the body of a page constraint needs to be \edef'd so we need a completely expandable version.
% The expandable version doesn't have any error checking -- to get the error checking, we pass the coordinates once through the unexpandable version
% inside of an hbox.
+% \sseq@parsecoord@allownonexisting -- doesn't raise an error if the class doesn't exist.
\def\sseq@errortype{}
\def\sseq@printerrortype#1{\@xp\sseq@ifempty\@xp{\sseq@errortype}{}{#1 \sseq@errortype}}
@@ -577,10 +588,14 @@
\def\sseq@errortype@tikzprim{tikz ~ primitive}% This is sort of a silly hack, but this first error check shouldn't happen in a tikz primitive.
\def\sseq@parsecoord@index{%
\sseq@obj@ifundef{partcoord.(\sseq@xycoord).numnodes}{
- \ifx\sseq@errortype\sseq@errortype@tikzprim
- \def\sseq@index{}% Communicates to \sseq@tikzprimitives@coords@maybeclass that this is not a class
+ \ifsseq@parsecoord@allownonexisting
+ \ifx\sseq@rawindex\pgfutil@empty
+ \def\sseq@index{} % Communicates to \sseq@tikzprimitives@coords@maybeclass that this is not a class
+ \else
+ \sseq@error@x{no-classes}{(\sseq@xycoord)} \sseq@fbreak
+ \fi
\else
- \sseq@error@x{no-classes}{(\sseq@xycoord)}\@xp\sseq@break
+ \sseq@error@x{no-classes}{(\sseq@xycoord)} \sseq@fbreak
\fi
}{
\ifx\sseq@rawindex\pgfutil@empty
@@ -595,14 +610,16 @@
\edef\sseq@index{\the\numexpr\sseq@obj{partcoord.(\sseq@xycoord).numnodes} + \sseq@rawindex + \@ne\relax}%
\ifnum\sseq@index<\@ne
\sseq@error@xxx{index-too-large}{\sseq@rawindex}{\sseq@obj{partcoord.(\sseq@xycoord).numnodes}}{(\sseq@xycoord)}%
- \edef\sseq@index{1}% or maybe I should break?
+ \edef\sseq@index{1}
+ \sseq@fbreak
\fi
\else
+ \edef\sseq@index{\the\numexpr\sseq@rawindex}
\ifnum\sseq@rawindexeval>\sseq@obj{partcoord.(\sseq@xycoord).numnodes}\relax
\sseq@error@xxx{index-too-large}{\sseq@rawindex}{\sseq@obj{partcoord.(\sseq@xycoord).numnodes}}{(\sseq@xycoord)}%
- \edef\sseq@rawindex{\sseq@obj{partcoord.(\sseq@xycoord).numnodes}}% or maybe I should break?
+ \edef\sseq@rawindex{\sseq@obj{partcoord.(\sseq@xycoord).numnodes}}
+ \sseq@fbreak
\fi
- \edef\sseq@index{\the\numexpr\sseq@rawindex}
\fi
}{
\sseq@error@xx{undefined-tag}{\sseq@rawindex}{(\sseq@xycoord)}%
@@ -621,13 +638,21 @@
\def\sseq@index{}%
\def\sseq@errortype{#3}%
\sseq@parsecoord@maincoord{#2}%
- \let\sseq@rawindex\sseq@restcoord
+ \exp_args:NNf\def\sseq@rawindex{\exp_args:No\sseq@trimspaces{\sseq@restcoord}}
\ifx\sseq@index\pgfutil@empty
\@xp\sseq@parsecoord@index
\fi
\sseq@parsecoord@setupvariables{#1}{#2}
}
+\newif\ifsseq@parsecoord@allownonexisting
+\def\sseq@parsecoord@allownonexisting#1#2#3{%
+ \sseq@parsecoord@allownonexistingtrue
+ \sseq@parsecoord{#1}{#2}{#3}
+ \sseq@parsecoord@allownonexistingfalse
+}
+
+
\def\sseq@parsecoord@setupvariables#1#2{
% TODO: clean this up a bit? it's pretty ad-hoc.
% Whenever you update this, make sure to update sseq@paredcoords@swap below too.
@@ -807,11 +832,26 @@
\def\sseq@parsecoordex{\exp_last_unbraced:NNNf\sseq@parsecoordex@}
\def\sseq@parsecoordex@#1(#2){\sseq@parsecoordex@@#1#2,\@nil}
+
+% Older versions of etex don't provide \expanded so need more expensive version of \exp_args:NNof.
+\ifx\expanded\undefined
+ \cs_set:Npn\exp_args:NNof { \::N \::o \::f \::: }
+\else
+ \cs_set:Npn\exp_args:NNof #1#2#3#4 {
+ \expanded {
+ \exp_not:N #1
+ \exp_not:N #2
+ { \unexpanded \expandafter { #3 } }
+ { \unexpanded \expandafter { \exp:w \exp_end_continue_f:w #4} }
+ }
+ }
+\fi
+
\def\sseq@parsecoordex@@#1#2,#3,#4\@nil{
\ifx&#4&
- \exp_last_unbraced:NNo\sseq@parsecoord@indexex#1(\the\numexpr#2\@xp,\the\numexpr#3,1)
+ \exp_args:NNo\sseq@parsecoord@indexex#1{\the\numexpr#2\@xp,\the\numexpr#3}{1}
\else
- \exp_args:NNo\sseq@parsecoord@indexex#1{\the\numexpr#2\@xp,\the\numexpr#3\@xp\relax\@xp}\@xp{\sseq@removecomma#4\sseq@nil}
+ \exp_args:NNof\sseq@parsecoord@indexex#1{\the\numexpr#2\@xp,\the\numexpr#3\@xp\relax}{\exp_args:Nf\sseq@trimspaces{\sseq@removecomma#4\sseq@nil}}
\fi
}
@@ -863,8 +903,9 @@
\protected\def\sseq@pushstack(#1){
\bgroup
- \sseq@parsecoord\temp{#1}{}
+ \sseq@parsecoord@allownonexisting\temp{#1}{}
\sseq@pushstack@\temp
+ \sseq@breakpoint
\egroup
}
@@ -872,6 +913,7 @@
\def\sseq@pushstack@{\@xp\sseq@pushstack@@}
\def\sseq@pushstack@@(#1,#2,#3){
+ %\def\temp{#1,#2,#3}\show\temp
\global\advance\sseq@stackdepth\@ne
\@xp\gdef\csname sseq.\sseq@thename.stack.\the\sseq@stackdepth.lastx\endcsname{#1}
\@xp\gdef\csname sseq.\sseq@thename.stack.\the\sseq@stackdepth.lasty\endcsname{#2}
@@ -1000,7 +1042,7 @@
\sseq@parsecoord\coord{#1}{}
\@gobbletwo\sseq@breakpoint\sseq@tempiffalse % this executes \sseq@tempiffalse if we broke, otherwise it gets gobbled
\ifsseq@tempif
- \sseq_if_out_of_bounds_noparse:nnTF { \xcoord } { \ycoord }{\egroup\prg_return_true:}{\egroup\prg_return_false:}
+ \sseq_if_out_of_bounds_inner:nnTF { \xcoord } { \ycoord }{\egroup\prg_return_true:}{\egroup\prg_return_false:}
\else
\egroup
\prg_return_false:
@@ -1008,16 +1050,24 @@
}
% For internal use b/c it's faster not to call \sseq@parsecoord
+% Make sure to add \sseq@x and \sseq@y to the coordinate before passing along
+% to if_out_of_bounds_inner to correctly account for translations.
\prg_new_conditional:Npnn \sseq_if_out_of_bounds_noparse:nn #1#2 {TF} {
- \sseq@tempiftrue
- \ifnum#1<\sseq@xmaxpp\relax\ifnum#1>\sseq@xminmm\relax\ifnum#2<\sseq@ymaxpp\relax\ifnum#2>\sseq@yminmm\relax
- \sseq@tempiffalse
- \fi\fi\fi\fi
- \ifsseq@tempif
- \prg_return_true:
- \else
- \prg_return_false:
- \fi
+ \sseq_if_out_of_bounds_inner:nnTF { #1 + \sseq@x } { #2 + \sseq@y }
+ { \prg_return_true: }
+ { \prg_return_false: }
+}
+
+
+\prg_new_conditional:Npnn \sseq_if_out_of_bounds_inner:nn #1#2 {TF} {
+ \bool_lazy_all:nTF {
+ { \int_compare_p:nNn { #1 } < { \sseq@xmaxpp } }
+ { \int_compare_p:nNn { #1 } > { \sseq@xminmm } }
+ { \int_compare_p:nNn { #2 } < { \sseq@ymaxpp } }
+ { \int_compare_p:nNn { #2 } > { \sseq@yminmm } }
+ }
+ { \prg_return_false: }
+ { \prg_return_true: }
}
\prg_new_conditional:Npnn \sseq_if_alive:nn #1 #2 { T, F, TF } {
@@ -1178,6 +1228,9 @@
\futurelet\testtok\sseq@defer@tikzcommand@@
}
+% This serves as a marker to break out of parser.
+% TODO: support \pgfextra? Should we pass \pgfextra along to be handled by tikz parser?
+\def\sseq@defer@tikzcommand@escape{sseq@defer@tikzcommand@escape}
\def\sseq@defer@tikzcommand@@{%
\ifx\testtok;
\let\next\sseq@defer@tikzcommand@finish
@@ -1191,10 +1244,19 @@
\@xp\ifx\space\testtok
\let\next\sseq@defer@tikzcommand@space
\else
- \ifx\testtok\bgroup
- \let\next\sseq@defer@tikzcommand@group
+ % TODO: also support "foreach" keyword without the backslash.
+ \ifx\testtok\foreach
+ \let\next\sseq@defer@tikzcommand@foreach
\else
- \let\next\sseq@defer@tikzcommand@other
+ \ifx\testtok\sseq@defer@tikzcommand@escape % escape is like \pgfextra, breaks out of the parsing.
+ \let\next\@gobble
+ \else
+ \ifx\testtok\bgroup
+ \let\next\sseq@defer@tikzcommand@group
+ \else
+ \let\next\sseq@defer@tikzcommand@other
+ \fi
+ \fi
\fi
\fi
\fi
@@ -1204,6 +1266,12 @@
}
+\def\sseq@defer@tikzcommand@foreach{
+ \def\pgffor@beginhook{\expandafter\sseq@defer@tikzcommand@\pgfutil@firstofone}
+ \def\pgffor@endhook{\sseq@defer@tikzcommand@escape}
+ \def\pgffor@afterhook{\sseq@defer@tikzcommand@}
+}
+
\def\sseq@defer@tikzcommand@option[#1]{%
\sseq@processoptions{tikz ~ primitives}{#1}%
\ifx\sseq@savedoptioncode\pgfutil@empty\else
@@ -1301,8 +1369,10 @@
% If the expression was incomplete, we'll jump here to avoid adding the semicolon to the error printout
\def\sseq@defer@tikzcommand@finish@{
\sseq@g@addto@macro\sseq@thepathsofar{;}
+ %\show\sseq@thepathsofar
\global\sseq@thiscalltoks\@xp{\sseq@whattheusersaid}
\ifx\sseq@pageconstraint\sseq@pageconstraint@true
+ %\show\sseq@thepathsofar
\sseq@savedpaths@xaddtikzpath{\unexpanded\@xp{\sseq@thepathsofar}}%
\else
\sseq@savedpaths@xaddtikzpath{%
@@ -1371,7 +1441,7 @@
\fi
\ifsseq@tempif
\@xp\sseq@tikzprimitives@ifintcoords\@xp{\sseq@tempcoord}{ % check we're all integer coordinates
- \sseq@parsecoord\coord{\sseq@tempcoord}{tikz ~ primitive}%
+ \sseq@parsecoord@allownonexisting\coord{\sseq@tempcoord}{tikz ~ primitive}%
\ifx\sseq@index\pgfutil@empty\else
\sseq@x@addto@macro\sseq@thepathsofar{(sseq{\sseq@removeparens\coord}\sseq@tempanchor)}% Okay, we're all set, it's a class
\let\next\@gobble % don't run \sseq@tikzprimitives@notaclass