diff options
author | Karl Berry <karl@freefriends.org> | 2021-07-19 20:15:07 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-07-19 20:15:07 +0000 |
commit | 8e5b8d42fd285921dde3b5fa0a45034f98dba2d1 (patch) | |
tree | 75918d0205c8711ceeb614a73250813d16280e2a /Master/texmf-dist/tex/latex/spectralsequences | |
parent | ef21a6a342dc9620b74140da085c526371b579f5 (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/spectralsequences')
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& - \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 |