summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/README.md39
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.pdfbin164943 -> 164943 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.tex2
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.pdfbin56449 -> 56449 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.tex2
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.pdfbin379366 -> 379366 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.tex6
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.pdfbin134242 -> 134242 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.tex2
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.pdfbin473373 -> 473373 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.tex2
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.pdfbin136982 -> 136982 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.tex2
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.pdfbin40694 -> 39901 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.tex4
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.pdfbin152919 -> 151478 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.tex4
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.pdfbin93639 -> 93639 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.tex2
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.pdfbin248925 -> 248925 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.tex2
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.pdfbin98548 -> 96006 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.tex2
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KZ3.pdfbin74022 -> 72664 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.pdfbin27584 -> 27081 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.tex4
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.pdfbin21992 -> 21394 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.tex4
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-KORP8.tex34
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-class-page2a.tex24
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-class-page2b.tex18
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-imJ.tex32
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-insert.tex33
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-tikz.tex25
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequences-howitworks.tex2
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual-layoutcharts.tex7
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.pdfbin1152722 -> 1232448 bytes
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.tex431
-rw-r--r--Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanualpreamble.tex23
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/spectralsequences.sty47
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqcheckdefinitions.code.tex4
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqdrawing.code.tex32
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqforeach.code.tex12
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqkeys.code.tex166
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqloadstore.code.tex14
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqmacromakers.code.tex4
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqmain.code.tex262
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqmessages.code.tex24
-rw-r--r--Master/texmf-dist/tex/latex/spectralsequences/sseqparsers.code.tex460
49 files changed, 1209 insertions, 522 deletions
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/README.md b/Master/texmf-dist/doc/latex/spectralsequences/README.md
index 074cd2a8591..dbe5c7242a7 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/README.md
+++ b/Master/texmf-dist/doc/latex/spectralsequences/README.md
@@ -1,9 +1,9 @@
-spectralsequences v1.1.1
+spectralsequences v1.2.0
========================
Author: Hood Chatham
Email: hood@mit.edu
-Date: 2017-09-16
+Date: 2017-12-10
License: All files have the Latex Project Public License.
Description: Print spectral sequence diagrams using pgf/tikz.
@@ -12,8 +12,36 @@ See the file manual/spectralsequencesmanual.pdf for a manual. See the examples d
Email me at hood@mit.edu to submit bug reports, request new features, etc. The current development copy is hosted at https://github.com/hoodmane/spectralsequences.
Changelog:
-==========
-## [1.1.1]
+==========
+## [1.2.0]
+### Added:
+- \replacesource and \replacetarget
+- \copypage
+- "name handler" option
+- \SseqAHSSNameHandler
+- \SseqNormalizeMonomialSetVariables
+- "show name" option
+- predicates \IfExistsTF, \IfAliveTF, \IfValidDifferentialTF, and \DrawIfValidDifferentialTF
+- "quiet" environment
+
+### Changed:
+- class label handlers now must output result into \result
+- renamed \sseqnormalizemonomial to \SseqNormalizeMonomial, and now outputs into \result
+- renamed \sseqifempty to \SseqIfEmptyTF
+- renamed \sseqerrortowarning to \SseqErrorToWarning
+- tooltips now disabled unless you use the package option "tooltips" to prevent extraneous auxiliary files.
+
+### Fixed:
+- A bug that made "y axis gap" adjust both axes and "x axis gap" do nothing (reported by Achim Krause).
+- A bug where a random definition of \\ was leaked into global scope (reported by Achim Krause).
+- Now a \structline defined with option page=n will not be deleted by a shorter differential.
+- A parser error that caused infinite recurse under certain conditions
+- Class names now work with commands in their name (particularly, greek letters)
+- \sseq@ifintexpr no longer breaks if the expression ends in \empty
+- Using \sseqset to give default scaling values for xscale and yscale now works as expected.
+
+
+## [1.1.1] (2017-09-18)
### Fixed:
- Groups defined with \SseqNewGroup now correctly handle arithmetic in their arguments.
@@ -21,7 +49,7 @@ Changelog:
- \kill had a bug in it that sometimes caused it to act on the wrong page (reported by Steve Wilson).
-## [1.1.0]
+## [1.1.0] (2017-08-06)
### Added:
- \sseqparseint
@@ -55,3 +83,4 @@ Changelog:
- Fixed a bug with ranges and the sseqpage environment where classes lying outside the printed range would enlarge the range even if an explicit range was specified.
- The chess grid works correctly now
+## [1.0.0] (2017-06-21)
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.pdf
index b7342314ae5..04a0a619feb 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.tex
index 1bd2cf23287..36e56f373d7 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_2.tex
@@ -1,7 +1,7 @@
%%
%% Description: Adams Novikov Spectral Sequence for $S_2$
-\documentclass{spectralsequence-example}
+\documentclass[tooltips]{spectralsequence-example}
% figure out how to get width("\noexpand\small 16") working
\sseqset{ppower/.sseq style={
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.pdf
index d1c7623fab9..a7723477a85 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.tex
index 0dc8e67a959..3c8f3af0a78 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ANSS-S_3.tex
@@ -9,7 +9,7 @@
%% Compare this to page 5 of example_ass3
%%
-\documentclass{spectralsequence-example}
+\documentclass[tooltips]{spectralsequence-example}
\begin{document}
% tower definitions
\NewSseqCommand\alphaclass{d()}{
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.pdf
index 1c730c6cf5c..deee907b930 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.tex
index 67be3dd6b57..be6f88249f4 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_2.tex
@@ -9,7 +9,7 @@
%%
-\documentclass{spectralsequence-example}
+\documentclass[tooltips]{spectralsequence-example}
\begin{document}
@@ -111,7 +111,7 @@
}
\NewSseqGroup \Phonegroup {G{}}{
- \sseqset{class label handler = { \sseqnormalizemonomial{##1} }}
+ \sseqset{class label handler = \SseqNormalizeMonomial }
\czero["#1c_0" above](-1,-2)
\Phone[imJ]{P#1}{}
\nuclass[imJ]\divtwoclass[imJ]\divtwoclass["#1d_0" left,name=d0]
@@ -161,8 +161,6 @@
class labels={above left=0.2em,black},
x range={0}{46},
y range={0}{23},
- % xscale=0.7,
- % yscale=0.8,
differentials = blue,
classes = { tooltip = { (\xcoord,\ycoord) } },
grid = go,
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.pdf
index 067079d35e4..defbb06e7b4 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.tex
index aeab68e5212..4a79c6ebb60 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-S_3.tex
@@ -6,7 +6,7 @@
%% Copied from page 11 of the green book.
%%
-\documentclass{spectralsequence-example}
+\documentclass[tooltips]{spectralsequence-example}
\begin{document}
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.pdf
index 4e24bdf50da..58794af7ca6 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.tex
index d9719ac38ca..14cd23fc47c 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/ASS-tmf_2.tex
@@ -25,7 +25,7 @@
%
% deleting off page edge handling cuts off 1.4s (1s?) so I haven't found any of the big time holes yet. WHY IS THIS SO SLOW??
-\documentclass{spectralsequence-example}
+\documentclass[tooltips]{spectralsequence-example}
\begin{document}
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.pdf
index cf512a5c2d6..cb0742f00bf 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.tex
index b90f129512f..0994d69f0f6 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-EO2_3.tex
@@ -12,7 +12,7 @@
%% HFPSS for KO = KU^{hC_2} (see example_KUHFPSS).
%%
-\documentclass{spectralsequence-example}
+\documentclass[tooltips]{spectralsequence-example}
\begin{document}
\begin{sseqdata}[name=EO(2),Adams grading,
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.pdf
index ad1bde166d0..a313d8d47b8 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.tex
index 7409a2a77de..a227184ea4b 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/HFPSS-KO.tex
@@ -3,7 +3,6 @@
%%
%% File: example_KUHFPSS.tex
%%
-%% I think this is one of Eric Peterson's favorite spectral sequences, and his enthusiasm for it has rubbed off on me a bit.
%% Here our group is C_2 which acts on the periodicity element by -1, so again we have a norm element v in degree 2|G| = 4.
%% There are easier ways to understand this, but I explained the EO_3 one in terms of the comparison map from the ANSS,
%% and that's interesting here too. In the ANSS at 2, there is a differential d3(\alpha_3) = \alpha_1^4. Here a cobar calculation
@@ -43,6 +42,8 @@
% This is just to make sure the bounding box doesn't move around
\path[background] (\xmin-1,\ymin-1) rectangle (\xmax+1,\ymax+1);
+\def\xmin{-12}
+\def\xmax{14}
\sseqparseint\xitstart{\xmin/8*8-16} % division is integer division (I think with rounding towards 0...) so /8*8 rounds up to the nearest multiple of 8?
\sseqparseint\xitgap{\xitstart+4}
\sseqparseint\xitend{\xmax+2}
@@ -73,6 +74,7 @@
\newpage
\begin{sseqpage}[name=KRHFPSS,page=0,keep changes]
+\def\xmin{-12}\def\xmax{14}
\pgfmathsetmacro\antidiag{min(-\xmin,\ymax+0.8)}
\clip[background,xshift=0.2cm,yshift=-0.33cm](-\antidiag,\antidiag)--(-1,1)--(-0.4,0)--(\xmax + 0.28,0)--(\xmax+0.28,\antidiag)--cycle;
\foreach \z in {2,6}{
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.pdf
index 70233a12ab7..c757bc301ef 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.tex
index c2b43692a82..ef150f693fd 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/J_RPinfty.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: example_endofVFoS.tex
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.pdf
index d1d488195ad..03f4e89af6e 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.tex
index f8e97bac890..43043f89b23 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-bo-A1.tex
@@ -7,7 +7,7 @@
%%
-\documentclass{spectralsequence-example}
+\documentclass[tooltips]{spectralsequence-example}
\NewSseqCommand\tower {} {
\class(0,0)
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.pdf
index 7b7ae36f7ab..18074333934 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.tex
index ab8b3e5a910..51e744ae6d5 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/MaySS-tmf-A2.tex
@@ -5,7 +5,7 @@
%%
-\documentclass{spectralsequence-example}
+\documentclass[tooltips]{spectralsequence-example}
\begin{document}
\sseqset{htwostructstyle/.sseq style = {gray,very thin, run off=-}}
%\pgfkeys{/sseqpages/struct line/htwostructstyle/.show code}
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.pdf
index 1b8de9f8aec..8d79d1095bb 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.tex
index e75319226c4..b326c2e9960 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KF3n.tex
@@ -18,7 +18,7 @@
class placement transform={scale=1.3, rotate=90},
class pattern=linear,
classes={draw=none},
- class label handler = {\sseqnormalizemonomial{#1}},
+ class label handler = \SseqNormalizeMonomial,
bocksteinSS/.style={
page=0, y range={-1}{0},
no differentials, no labels, no y ticks, no title,
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KZ3.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KZ3.pdf
index 2cd9f2089b0..f8ce1a4c05b 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KZ3.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/SSS-KZ3.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.pdf
index a1fa4b49090..e9ad2e4eb21 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.tex
index 1d4e5f36cc7..6ff28805bd9 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/hatcher.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: example_hatcher.tex
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.pdf b/Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.pdf
index 2746f1fa60b..0741ba18156 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.tex b/Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.tex
index 5366de670c8..524fcca5346 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/examples/unstable_ASS_SO.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: example_unstable_ASS_SO.tex
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-KORP8.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-KORP8.tex
new file mode 100644
index 00000000000..d1fcebff065
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-KORP8.tex
@@ -0,0 +1,34 @@
+
+
+\NewSseqCommand \KOstar {m}{
+ \begin{scope}[xshift = -#1, xshift=8*\b, yshift = #1]
+ \class[rectangle,name=b^{\b}[0]](0,0)
+ \class[name=b^{\b} e[0]](1,0) \structline
+ \class[name=b^{\b} e^2[0]](2,0) \structline
+ \class[rectangle,fill=none,name=b^{\b} u[0]](4,0)
+ \end{scope}
+}
+\NewSseqCommand \KOpcell {m}{
+ \d1(b^{\b}[#1]) \replacetarget
+ \d1(b^{\b} u[#1]) \replacetarget
+ \structline(b^{\b}[#1+1])(b^{\b} e[#1+1])
+ \structline[page=2,dashed](b^{\b} e[#1])(b^{\b} e^2[#1+1])
+ \structline[page=2,dashed](b^{\b} e^2[#1])(b^{\b} u[#1+1])
+}
+\NewSseqCommand \KOetacell {m}{
+ \DrawIfValidDifferential2(b^{\b}[#1])
+ \d2(b^{\b} e[#1])
+ \DrawIfValidDifferential3(b^{\b} e^2[#1])
+}
+\begin{sseqdata}[name=KO^*RP^8, Adams grading, class name handler=\SseqAHSSNameHandler,
+ classes=fill, x range={-8}{10},xscale=0.7, yscale=0.5, x tick step = 4 ]
+\foreach \b in {-2,...,2}{
+ \foreach \n in {0,...,6}{\KOstar{\n}}
+ \foreach \n in {1,3,...,5}{\KOpcell{\n}}
+ \foreach \n in {2,3}{\KOetacell{\n}}
+ \structline[dashed](b^{\b}e^2[2])(b^{\b}u[4])
+ \structline[dashed](b^{\b}[4])(b^{\b}e[5])
+}
+\end{sseqdata}
+\printpage[name=KO^*RP^8, title=AHSS for $KO^*\mathbb{R}P^8$]\vskip6pt
+\printpage[name=KO^*RP^8,page=6] \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-class-page2a.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-class-page2a.tex
new file mode 100644
index 00000000000..609df037f1a
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-class-page2a.tex
@@ -0,0 +1,24 @@
+\begin{sseqdata}[ name = page_example2, Adams grading, xscale = 0.6, yscale = 0.5 ]
+\class(0,2)\class(1,0)
+\d2(1,0)
+\replacesource
+\class(0,3)
+\d3(1,0)
+\replacesource
+\classoptions[fill,red](1,0) % (a) applies to most recent (last) generation.
+\end{sseqdata}
+
+\printpage[ name = page_example2, page = 1 ] % generation 0 of (1,0), not styled
+\quad
+\begin{sseqpage}[ name = page_example2, page = 1, keep changes ]
+\classoptions[fill,blue](1,0) % (b) applies to the generation present on page 1, that is, generation 0.
+\end{sseqpage} \quad
+
+% generation 0 of (1,0), so class is blue from (b)
+\printpage[ name = page_example2, page = 2 ] \quad
+
+% generation 1 of (1,0), class is not styled
+\printpage[ name = page_example2, page = 3 ] \quad
+
+% generation 2 of (1,0), class is red from (a)
+\printpage[ name = page_example2, page = 4 ] \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-class-page2b.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-class-page2b.tex
new file mode 100644
index 00000000000..c6df218978e
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-class-page2b.tex
@@ -0,0 +1,18 @@
+\begin{sseqdata}[ name = page_example2, Adams grading, update existing ]
+% (c) applies to all generations, overwrites (b) and (a):
+\classoptions[fill, red, generation = 0 ---- -1](1,0)
+\end{sseqdata}
+
+\printpage[ name = page_example2, page = 1 ]% generation 0 of (1,0), so class is red
+\quad
+\begin{sseqpage}[ name = page_example2, page = 1, keep changes ]
+\classoptions[fill,blue](1,0) % (d) applies to the generation present on page 1, that is, generation 0.
+\end{sseqpage} \quad
+
+% generation 0 of (1,0), class is blue from (d)
+\printpage[ name = page_example2,page = 2 ] \quad
+
+% generation 1 of (1,0), class is red from (c)
+\printpage[ name = page_example2, page = 3 ]
+\quad
+\printpage[ name = page_example2, page = 4 ] % generation 2 of (1,0), class is red from (c) \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-imJ.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-imJ.tex
new file mode 100644
index 00000000000..626a9a5fd63
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-imJ.tex
@@ -0,0 +1,32 @@
+\SseqNewFamily{imJ}
+\begin{sseqdata}[
+ name=ANSS-S_2, Adams grading,
+ class labels={below}, label distance=-1pt,
+ class placement transform={rotate=90,scale=2},
+ differentials=blue,
+ x range={0}{9}, y range={0}{4},
+ xscale=0.7, grid=go
+]
+% Image of J classes
+\begin{scope}[imJ]
+\class[rectangle,fill,inner sep=3pt](0,0)
+\DoUntilOutOfBoundsThenNMore{3}{\etaclass}
+\classoptions["\alpha_1" above left](1,1)
+\class["\alpha_{2/2}",circlen=2](3,1)
+\structline(0,0) \structline[dashed](3,3)
+\class["\alpha_3"](5,1) \d3\relax
+\DoUntilOutOfBounds{ \etaclass \d3 }
+\class["\alpha_{4/4}", rectangle, "16" {font=\tiny,inside}, inner sep=1pt](7,1)
+\DoUntilOutOfBoundsThenNMore{3}{\etaclass}
+\end{scope}
+
+% Other classes
+\class["\beta_{2/2}" {below right=-4pt}, insert = 1](6,2)
+\structline(3,1)
+\class["\beta_{2}" left](8,2)
+\etaclass\structline(6,2,2) % This is a *nu
+\end{sseqdata}
+
+\printpage[name=ANSS-S_2, title = with image of J, imJ style=purple]
+
+\printpage[name=ANSS-S_2, no imJ, x range={2}{9}, title = without image of J] \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-insert.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-insert.tex
new file mode 100644
index 00000000000..c97a8be7682
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-insert.tex
@@ -0,0 +1,33 @@
+\DeclareSseqGroup \tower {} {
+ \class(0,0)
+ \DoUntilOutOfBounds {
+ \class(\lastx,\lasty+1)
+ \structline
+ }
+}
+
+\begin{sseqdata}[name=insert-example, y range={0}{4}, class pattern = linear]
+\tower(0,2)
+\tower(0,3)
+\tower(0,1)
+\end{sseqdata}
+\qquad
+\begin{sseqpage}[name=insert-example]
+\tower[red,classes={insert=1}](0,0)
+\end{sseqpage}
+\qquad
+\begin{sseqpage}[name=insert-example]
+\tower[red,classes={insert=2}](0,0)
+\end{sseqpage}
+\qquad
+\begin{sseqpage}[name=insert-example]
+\tower[red,classes={insert=3}](0,0)
+\end{sseqpage}
+\qquad
+\begin{sseqpage}[name=insert-example]
+\tower[red,classes={insert=-2}](0,0)
+\end{sseqpage}
+\qquad
+\begin{sseqpage}[name=insert-example]
+\tower[red,classes={insert=-3}](0,0)
+\end{sseqpage} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-tikz.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-tikz.tex
new file mode 100644
index 00000000000..7c72cc79887
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/examples/spectralsequencesmanual-tikz.tex
@@ -0,0 +1,25 @@
+\begin{sseqdata}[ name = tikz example, Adams grading, math nodes = false,
+ tikz primitives = { blue, font = \tiny, <- }, circle classes = tikz primitive style,
+ x range = {0}{2}, x axis extend end = 2em ]
+\class(0,0)
+\class(1,0)
+\class(0,2)
+\d2(1,0)
+\end{sseqdata}
+
+\begin{sseqpage}[ name = tikz example ]
+\circleclasses[ name path = myellipse, inner sep = 3pt, ellipse ratio = 1.6 ] (1,0) (0,2)
+\path[ name path = myline ] (1.3,1.25) -- (0.6,1);
+\draw[ name intersections = { of = myellipse and myline } ]
+ (intersection-1) to (1.3,1.25) node[ right, text width = 1.6cm ] {Consider this differential};
+\end{sseqpage} \qquad
+
+\begin{sseqpage}[ name = tikz example ]
+\draw[ xshift = 1 ] (0,0) to (0.6,0.2) node[ right, text width = 1.1cm ] {This is the source};
+\draw[ yshift = 2 ] (0,0) to (0.6,0.2) node[ right, text width = 1.1cm ] {This is the target};
+\end{sseqpage} \qquad
+
+\begin{sseqpage}[ page = 3, name = tikz example ]
+\circleclasses[ name path = myellipse, inner sep = 3pt, ellipse ratio = 1.6 ] (1,0)(0,2)
+\node[ right, font = \tiny ] at (1.2,1.2) {Now it's gone!};
+\end{sseqpage} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequences-howitworks.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequences-howitworks.tex
index a4911b459c6..ab2722bd553 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequences-howitworks.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequences-howitworks.tex
@@ -30,7 +30,7 @@ This is the core idea of the package. In addition to these core features are man
So, having heard this simple description, a reasonable question to ask is: why does it take in excess of 8000 lines of TeX code to accomplish these simple tasks? There are a few reasons. Firstly, the package handles a lot of use cases and has a quite a few different features and there is a large amount of intrinsic complexity to getting these things right. Another huge reason is that \TeX\ is a completely unreasonable coding environment. This is responsible for a good deal of the complexity in \file{sseqparsers}, for example.
-Perhaps the biggest single contributor to code complexity is performance. \tikzname\ is very robust, but it is not fast. \spectralsequences\ draws roughly cubically many classes in large diagrams, and my larger test examples have as many as 5,000 classes. If each class takes an extra millisecond a second to draw, that comes out to an extra five seconds of compilation time. Because of this, unless the performance critical drawing code is super optimized, the package will be way too slow on large diagrams. Most of the added complexity due to performance considerations is contained in \file{sseqdrawing}, but the hard parts of the key value code are all related to performance too.
+Perhaps the biggest single contributor to code complexity is performance. \tikzname\ is very robust, but it is not fast. \spectralsequences\ draws roughly cubically many classes in large diagrams, and my larger test examples have as many as 5,000 classes. If each class takes an extra millisecond to draw, that comes out to an extra five seconds of compilation time. Because of this, unless the performance critical drawing code is super optimized, the package will be way too slow on large diagrams. Most of the added complexity due to performance considerations is contained in \file{sseqdrawing}, but the hard parts of the key value code are all related to performance too.
The last major source of complexity is the robust error handling code. Most \LaTeX\ packages have crappy error handling and result in inscrutable errors even in relatively reasonable use conditions. There are a two main reasons for this as far as I can tell: \LaTeX\ doesn't have good error handling tools and most people who write \LaTeX\ packages are not primarily programmers and have other priorities than ensuring that their packages have clean failure modes. The files \file{sseqmessages} and \file{sseqforeach} are entirely devoted to error handling, and almost all of the complexity of \file{sseqmacromakers} is tied up in error handling too.
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual-layoutcharts.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual-layoutcharts.tex
index ba0a774df29..480f7559c4b 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual-layoutcharts.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual-layoutcharts.tex
@@ -1,7 +1,7 @@
\sseqset{
distance label/.sseq style = {orange,{<[width = 4pt]}-},
description/.sseq style = {black, align = center},
- title style={yshift=25pt,font=\Large}
+ title style={yshift=35pt,font=\Large}
}
\catcode`\| = 12 % | is active to be verbatim, but we need to use it here for our arrowhead specification.
%
@@ -9,7 +9,7 @@
x range = {0}{5}, y range = {0}{5}, math nodes = false,
x axis clip padding = 0.15cm, y axis clip padding = 0.15cm,
right clip padding = 0.2cm, top clip padding = 0.2cm, axes gap = 25pt,
- title = {Axis type border layout},
+ title = {Axis type border layout}
]
\begin{scope}[background]
\sseq@savedpaths@add{\color{red}\pgfsetpath\sseq@theclippath\pgfusepath{draw}}
@@ -79,6 +79,7 @@ node[above,description]{y axis gap};
\class(0,5)
\end{sseqpage}
+\vskip20pt
\begin{sseqpage}[ grid = chess, axes type=frame,
title = {Axes type frame layout},
@@ -201,4 +202,4 @@ node[above,description]{y axis gap};
\class(0,0)
\class(5,0)
\class(0,5)
-\end{sseqpage} \ No newline at end of file
+\end{sseqpage} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.pdf b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.pdf
index 5c73742829f..6070eaaa34c 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.pdf
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.tex
index 7d786975e8f..8ebebb4d312 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanual.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: spectralsequencesmanual.tex
@@ -12,14 +12,15 @@
%
% TODO:
-% families
+%
+% maybe move more examples into external files?
%
% consistency issues?
% perhaps think about ordering, particularly of "Misc commands" section
% tutorial
% explain / cross reference examples folder?
%
-
+\def\version{Version 1.2.0}
\input spectralsequencesmanualpreamble
@@ -51,8 +52,8 @@ Many thanks to the authors of \tikzpkg\ for producing such a wonderful package
The \sseqpages\ package consists of two main environments -- the \sseqdataenv\ environment, which specifies the data for a named spectral sequence, and the \sseqpageenv\ environment, which prints a single page of a spectral sequence. The |\printpage| command is also available as a synonym for a \sseqpageenv\ environment with an empty body.
Here is a basic example:
-\begin{codeexample}[width = 9cm]
-\begin{sseqdata}[ name = ex1, scale = 0.6,
+\begin{codeexample}[width = 8.7cm]
+\begin{sseqdata}[ name = basic, xscale = 0.6,
cohomological Serre grading ]
\class(0,0)
\class(0,2)
@@ -60,10 +61,10 @@ Here is a basic example:
\class(3,2)
\d3(0,2)
\end{sseqdata}
-\printpage[ name = ex1, page = 3 ] \quad
-\printpage[ name = ex1, page = 4 ]
+\printpage[ name = basic, page = 3 ] \quad
+\printpage[ name = basic, page = 4 ]
\end{codeexample}
-|\begin{sseqdata}[|| name = ex1, cohomological Serre grading]| starts the declaration of the data of a spectral sequence named |ex1| whose page $\mathtt{r}$ differentials go $\mathtt{r}$ to the right and down $\mathtt{r-1}$ -- that is, it has cohomological Serre grading. Then we specify four classes and one page 3 differential, and we ask \sseqpages\ to print the third and fourth pages of the spectral sequence. Note that on the fourth page, the source and target of the differential have disappeared.
+\codeverb|\begin{sseqdata}[name = basic, cohomological Serre grading]| starts the declaration of the data of a spectral sequence named |basic| with cohomological Serre grading -- that is, the page $\mathtt{r}$ differentials go $\mathtt{r}$ to the right and down $\mathtt{r-1}$. Then we specify four classes and one page 3 differential, and we ask \sseqpages\ to print the third and fourth pages of the spectral sequence. Note that on the fourth page, the source and target of the differential have disappeared.
\subsection{Installation}
In both \miktex\ and \texlive\ installation should be automatic -- your \TeX\ distribution should automatically install the package the first time you include |\usepackage{spectralsequences}| in a document and compile it. However, in 2016, \texlive\ made an incompatible change to their database, so no new packages will run on versions of \texlive\ from before 2016. This includes \sseqpages. If you have an old version of \texlive, you can either perform a manual install,
@@ -77,7 +78,7 @@ The easiest solution is to run \LuaLaTeX. \LuaLaTeX\ dynamically allocates memor
Another option is to increase the static memory caps for \pdfLaTeX. See \href{https://tex.stackexchange.com/a/26213}{this \TeX stack exchange post} for instructions on how to do this.
\subsection{A warning about fragile macros}
-All the data in a \sseqpages\ environment is stored and used later. As a result, most of the \sseqpages\ commands currently cannot tolerate fragile macros. Unfortunately, it is impossible for \sseqpages\ to warn you about this situation -- if you use a fragile command in a place that it doesn't belong, the result will be an incomprehensible error message. If you are getting nonsense error messages, this is probably why. The solution is to convert fragile macros into robust ones. \href{http://www.tex.ac.uk/FAQ-protect.html}{See here for more information.}
+All the data in a \sseqpages\ environment is stored and used later. As a result, most of the \sseqpages\ commands currently cannot tolerate fragile macros. Unfortunately, it is impossible for \sseqpages\ to warn you about this situation -- if you use a fragile command in a place that it doesn't belong, the result will be an incomprehensible error message. If you are getting nonsense error messages, this might be why. The solution is to convert fragile macros into robust ones. \href{http://www.tex.ac.uk/FAQ-protect.html}{See here for more information.}
\section{Package Options and Environments}
@@ -132,17 +133,17 @@ If a class is the source or the target of a differential on a certain page, then
See the \pgfmanualpdfref{class options}{class options} section for a list of the sort of options available for classes.
\end{command}
-\begin{commandlist}{{\replaceclass\ooptions\parargthreeopt{x}{y}{n}},\replaceclass\ooptions\pararg{classname}}
-After a class is the source or target of a differential, it disappears on the next page. However, some differentials are not injective or not surjective. Using the command |\replaceclass| causes a new symbol to appear on the page after a class supported or accepted a differential (or both). If there are multiple classes at the coordinate |(x,y)| you may specify which using an integer or a |tag| $n$. By default, this command will affect the first class placed in that position. You can also provide the |class:name| of a class.
+\begin{commandlist}{{\replaceclass\ooptions\parargthreeopt{x}{y}{n}},\replaceclass\ooptions\pararg{classname}, \replacesource\ooptions, \replacetarget\ooptions}
+After a class is the source or target of a differential, it disappears on the next page. However, some differentials are not injective or not surjective. Using the command |\replaceclass| causes a new symbol to appear on the page after a class supported or accepted a differential (or both). If there are multiple classes at the coordinate |(x,y)| you may specify which using an integer or a |tag| $n$. By default, this command will affect the first class placed in that position. You can also provide the |class:name| of a class. The variants |\replacesource| and |\replacetarget| replace the source and target respectively of the most recent differential.
\begin{codeexample}[]
\begin{sseqdata}[name = replace class example, Adams grading, classes = {draw = none } ]
\class["\mathbb{Z}"](0,3)
\class["\mathbb{Z}"](1,1)
\class["\mathbb{Z}"](1,0)
\d["\cdot 2"]2(1,1)
-\replaceclass["\mathbb{Z}/2"](0,3)
-\d[->>]3(1,0)
-\replaceclass["2\mathbb{Z}"](1,0)
+\replacetarget["\mathbb{Z}/2"] %\replaceclass["\mathbb{Z}/2"](0,3)
+\d[-> >]3(1,0)
+\replacesource["2\mathbb{Z}"] % \replaceclass["2\mathbb{Z}"](1,0)
\end{sseqdata}
\printpage[ name = replace class example, page = 2 ] \qquad
\printpage[ name = replace class example, page = 3 ] \qquad
@@ -265,7 +266,7 @@ This command creates a structure line from \sourcecoord\ to \targetcoord. The s
If the source or target of a structure line is hit by a differential, then on subsequent pages, the structure line disappears.
If the source or target has had multiple generations (i.e., they got hit and you used |\replaceclass|), then the |\structline| will only appear starting on the first page where the current generation of both the source and target are present. If this is undesirable, you can use the |structline:page| option to change it.
-\begin{codeexample}[width = 7cm]
+\begin{codeexample}[width = 7.5cm]
\DeclareSseqGroup\tower {} {
\class(0,0)
\foreach \y in {1,...,5} {
@@ -279,7 +280,7 @@ If the source or target has had multiple generations (i.e., they got hit and you
\begin{sseqdata}[ name = structline example,
classes = { circle, fill },
Adams grading, no axes,
- yscale = 1.39 ]
+ yscale = 1.28 ]
\class(1,1) \class(1,2)
\class(2,3) \class(2,3) \class(2,5)
\tower[classes = blue](0,0)
@@ -302,33 +303,7 @@ This command is a lot like |\structline| except that it puts a circle around the
\begin{commandlist}{\draw,\path,\node,\clip}
Any code that would work in a \tikzpictureenv\ environment will also work unchanged in a \sseqdataenv\ or \sseqpageenv\ environment, with a few minor differences. This is a very flexible way to add arbitrary background or foreground features to the spectral sequence:
-\begin{codeexample}[]
-\begin{sseqdata}[ name = tikz example, Adams grading, math nodes = false,
- tikz primitives = { blue, font = \tiny, <- }, circle classes = tikz primitive style,
- x range = {0}{2}, x axis extend end = 2em ]
-\class(0,0)
-\class(1,0)
-\class(0,2)
-\d2(1,0)
-\end{sseqdata}
-
-\begin{sseqpage}[ name = tikz example ]
-\circleclasses[ name path = myellipse, inner sep = 3pt, ellipse ratio = 1.6 ] (1,0) (0,2)
-\path[ name path = myline ] (1.3,1.25) -- (0.6,1);
-\draw[ name intersections = { of = myellipse and myline } ]
- (intersection-1) to (1.3,1.25) node[ right, text width = 1.6cm ] {Consider this differential};
-\end{sseqpage} \qquad
-
-\begin{sseqpage}[ name = tikz example ]
-\draw[ xshift = 1 ] (0,0) to (0.6,0.2) node[ right, text width = 1.1cm ] {This is the source};
-\draw[ yshift = 2 ] (0,0) to (0.6,0.2) node[ right, text width = 1.1cm ] {This is the target};
-\end{sseqpage} \qquad
-
-\begin{sseqpage}[ page = 3, name = tikz example ]
-\circleclasses[ name path = myellipse, inner sep = 3pt, ellipse ratio = 1.6 ] (1,0)(0,2)
-\node[ right, font = \tiny ] at (1.2,1.2) {Now it's gone!};
-\end{sseqpage}
-\end{codeexample}
+\codeexample[from file=tikz]
\end{commandlist}
@@ -518,19 +493,41 @@ These options control the size of a node. This is typically useful to make the s
\end{keylist}
\begin{key}{class:name = \meta{node name}}
-The |\class| command makes a \tikzpkg\ node on appropriate pages. You can refer to this node using \tikzpkg\ commands by using coordinates. Using the |class:name| option, you can give the node a second shorter name. One potential benefit to this is that it is immune to coordinate transformations. For example, in the following code, |xshift| does not apply to the nodes specified by |(id)| and |(eta)| but does apply to the coordinate specified by |(1,1)|:
+The |\class| command makes a \tikzpkg\ node on appropriate pages. You can refer to this node using \tikzpkg\ commands by using its coordinates. Using the |class:name| option, you can give the node a name, which you can use to refer to the class. Using names creates more readable code. The |show name| option can be used to display the names of classes. You can modify the names of classes systematically using the options |class name prefix|, |class name postfix|, and |class name handler|.
+Named classes are immune to coordinate transformations. For example, in the following code, |xshift| does not apply to the nodes specified by |(id)| and |(eta)| but does apply to the coordinate specified by |(1,1)|:
\begin{codeexample}[width = 6cm]
-\begin{sseqpage}
-\class[class:name = id](0,0)
-\class[class:name = eta](1,1)
+\begin{sseqpage}[classes = { show name=above }]
+\class[class:name = 1](0,0)
+\class[class:name = \eta](1,1)
\class(2,1)
-\draw[xshift = 1] (id) -- (eta);
-\draw[xshift = 1,blue] (id) -- (1,1);
+\structline[xshift = 1] (1) (\eta)
+\structline[xshift = 1,blue] (1) (1,1)
\end{sseqpage}
\end{codeexample}
\end{key}
+\begin{key}{show name = \meta{label options}}
+This option is like saying |"class name"\marg{label options}| if the class has a name, and does nothing if the class has no name. If the class has multiple names, only the most recent is used. This is particularly useful with class styles, . For instance, by saying |this page classes = { show name = above }| you can display names of all of the sources and targets of differentials on each page.
+\begin{codeexample}[width=7cm]
+\begin{sseqdata}[
+ name = show name example,
+ this page classes = { show name = {above right, pin} }
+]
+\class[name=a](0,2)
+\class[name=b](0,3)
+\class[name=x](1,0)
+\d2(x)(a)
+\replacesource[name=2x]
+\d3(x)(b)
+\end{sseqdata}
+
+\printpage[name=show name example,page=2]
+
+\printpage[name=show name example,page=3]
+\end{codeexample}
+\end{key}
+
\begin{key}{tag = \meta{tag}}
This key adds a tag to the current class. Tags are used for identifying which of multiple classes in the same position you are referring to. They are useful when you have groups of related classes and want a family of differentials connecting them. For instance:
\begin{codeexample}[width = 8cm]
@@ -562,44 +559,8 @@ We want each differential to go from the |h21| vee to the |id| vee, independent
\end{key}
\begin{key}{insert = \meta{integer}}
-If there are multiple classes in the same position, this option allows you to insert classes later into earlier positions. This is intended to help you put logically related classes next to each other. If the integer is positive, it inserts the class in the specified position, and if the integer is negative, it counts backwards from the end. Providing |0| is the same as omitting the option entirely. Values larger in absolute value than the total number of classes are truncated.
- Consider:
-\begin{codeexample}[]
-\DeclareSseqGroup \tower {} {
- \class(0,0)
- \DoUntilOutOfBounds {
- \class(\lastx,\lasty+1)
- \structline
- }
-}
-
-\begin{sseqdata}[name=test, y range={0}{4}, class pattern = linear]
-\tower(0,2)
-\tower(0,3)
-\tower(0,1)
-\end{sseqdata}
-\qquad
-\begin{sseqpage}[name=test]
-\tower[red,classes={insert=1}](0,0)
-\end{sseqpage}
-\qquad
-\begin{sseqpage}[name=test]
-\tower[red,classes={insert=2}](0,0)
-\end{sseqpage}
-\qquad
-\begin{sseqpage}[name=test]
-\tower[red,classes={insert=3}](0,0)
-\end{sseqpage}
-\qquad
-\begin{sseqpage}[name=test]
-\tower[red,classes={insert=-2}](0,0)
-\end{sseqpage}
-\qquad
-\begin{sseqpage}[name=test]
-\tower[red,classes={insert=-3}](0,0)
-\end{sseqpage}
-\end{codeexample}
-
+If there are multiple classes in the same position, this option allows you to insert classes later into earlier positions. This is intended to help you put logically related classes next to each other. If the integer is positive, it inserts the class in the specified position, and if the integer is negative, it counts backwards from the end. Providing |0| is the same as omitting the option entirely. Values larger in absolute value than the total number of classes are truncated. Consider:
+\codeexample[from file=insert]
\end{key}
\begin{key}{offset = \{\pars{\meta{x offset},\meta{y offset}}\}}
@@ -614,8 +575,8 @@ By default, a class uses the offset specified by |class pattern|. Occasionally t
\draw(0,1)--(0,2);
\class(1,0)
\d2(1,0,,1)
+\replacetarget
\d2(1,0,,2)
-\replaceclass(0,2)
\end{sseqdata}
\printpage[name = offset example, page=2]
\printpage[name = offset example, page=3]
@@ -628,7 +589,7 @@ By default, a class uses the offset specified by |class pattern|. Occasionally t
\begin{key}{tooltip = \meta{text}}
This key generates a ``tooltip'' over the given class. That is, if you hover your mouse over it, a little window will popup with the tooltip text. This is particularly useful to give the coordinates or names of classes in large charts where it may be hard to tell from looking at the picture what position the class is in, or there may not be room to supply names to classes.
-The tooltip is made using the |\pdftooltip| command from the |pdfcomment| package. This cannot handle math, but it will print math expressions into \TeX input form. Not all pdf viewers will display the tooltip correctly. If this concerns you, the command |\sseqtooltip| is used to produce the tooltip, and you can redefine it as any other command that takes |\sseqtooltip|\marg{text}\marg{tooltip text} and produces a tooltip. For instance, on \href{https://tex.stackexchange.com/a/164186/23866}{this stack exchange post}, there is code that supposedly produces tooltips that work with Evince. I have not tested whether it works by itself or whether it works with my package, but you could. You could potentially figure out how to get math to work in tooltips too -- if you find a satisfactory method, please let me know.
+The tooltip is made using the |\pdftooltip| command from the |pdfcomment| package. The |pdfcomment| package generates two extra auxiliary files, so it is not included by default. In order to use the |tooltip| option, you have to use the |tooltips| package option (e.g., load \sseqpages\ with |\usepackage[tooltips]{spectralsequences}|). This cannot handle math, but it will print math expressions into \TeX\ input form. Not all pdf viewers will display the tooltip correctly. If this concerns you, the command |\sseqtooltip| is used to produce the tooltip, and you can redefine it as any other command that takes |\sseqtooltip|\marg{text}\marg{tooltip text} and produces a tooltip. For instance, on \href{https://tex.stackexchange.com/a/164186/23866}{this stack exchange post}, there is code that supposedly produces tooltips that work with Evince. I have not tested whether it works by itself or whether it works with my package, but you could. You could potentially figure out how to get math to work in tooltips too -- if you find a satisfactory method, please let me know.
Anyways, here's an example:
\begin{codeexample}[]
@@ -658,53 +619,8 @@ These options only work in |\classoptions|. The |page| option gives a range of p
\end{codeexample}
A ``generation'' of a class is the interval from one call of |\class| or |\replaceclass| to the page on which it next supports or is hit by a differential.
By default the |\classoptions| command adds options only to the most recent generation of the class in a \sseqdataenv\ environment, or on the generation appropriate to the current page in a \sseqpageenv\ environment. Using the |generation| option allows you to provide a single generation or range of generations of the class that the options should apply to. The first generation is generation 0, and the most recent generation is generation -1. Larger negative values count backwards.
-\begin{codeexample}[]
-\begin{sseqdata}[ name = page_example2, Adams grading, xscale = 0.6, yscale = 0.5 ]
-\class(0,2)\class(1,0)
-\d2(1,0)
-\replaceclass(1,0)
-\class(0,3)
-\d3(1,0)
-\replaceclass(1,0)
-\classoptions[fill,red](1,0) % (a) applies to most recent (last) generation.
-\end{sseqdata}
-
-\printpage[ name = page_example2, page = 1 ] % generation 0 of (1,0), not styled
-\quad
-\begin{sseqpage}[ name = page_example2, page = 1, keep changes ]
-\classoptions[fill,blue](1,0) % (b) applies to the generation present on page 1, that is, generation 0.
-\end{sseqpage} \quad
-
-% generation 0 of (1,0), so class is blue from (b)
-\printpage[ name = page_example2, page = 2 ] \quad
-
-% generation 1 of (1,0), class is not styled
-\printpage[ name = page_example2, page = 3 ] \quad
-
-% generation 2 of (1,0), class is red from (a)
-\printpage[ name = page_example2, page = 4 ]
-\end{codeexample}
-
-\begin{codeexample}[]
-\begin{sseqdata}[ name = page_example2, Adams grading,update existing ]
-% (c) applies to all generations, overwrites (b) and (a):
-\classoptions[fill, red, generation = 0 ---- -1](1,0)
-\end{sseqdata}
-
-\printpage[ name = page_example2, page = 1 ]% generation 0 of (1,0), so class is red
-\quad
-\begin{sseqpage}[ name = page_example2, page = 1, keep changes ]
-\classoptions[fill,blue](1,0) % (d) applies to the generation present on page 1, that is, generation 0.
-\end{sseqpage} \quad
-
-% generation 0 of (1,0), class is blue from (d)
-\printpage[ name = page_example2,page = 2 ] \quad
-
-% generation 1 of (1,0), class is red from (c)
-\printpage[ name = page_example2, page = 3 ]
-\quad
-\printpage[ name = page_example2, page = 4 ] % generation 2 of (1,0), class is red from (c)
-\end{codeexample}
+\codeexample[from file=class-page2a]
+\codeexample[from file=class-page2b]
\end{keylist}
\begin{commandlist}{\xcoord,\ycoord}
@@ -775,10 +691,8 @@ This key is only for |\structline| and |\structlineoptions|. By default, the |\s
\class(0,4)
\class(1,0)
\class(1,1)
-\d2(1,0)(0,2)
-\d3(1,1)(0,4)
-\replaceclass(1,0)
-\replaceclass(1,1)
+\d2(1,0)(0,2) \replacesource
+\d3(1,1)(0,4) \replacesource
\structline(1,0)(1,1)
\end{sseqdata}
\printpage[name = structpage example,page = 3]
@@ -794,10 +708,8 @@ By specifying a page number, you can adjust which page the |\structline| starts
\class(0,4)
\class(1,0)
\class(1,1)
-\d2(1,0)(0,2)
-\d3(1,1)(0,4)
-\replaceclass(1,0)
-\replaceclass(1,1)
+\d2(1,0)(0,2) \replacesource
+\d3(1,1)(0,4) \replacesource
\structline[structline:page = 2](1,0)(1,1)
\end{sseqdata}
\printpage[name = structpage example2,page = 1]
@@ -919,18 +831,19 @@ One useful tip is that you can ensure consistent bounding boxes between differen
\end{key}
\begin{keylist}{page constraint = \meta{predicate}, page constraint or = \meta{predicate}}
+\declarecustomhandler{page constraint}{\codehandler}
This places a constraint on the pages in which the \tikzpkg\ primitive is printed. This predicate should look something like
-\texttt{(\string\page< = 4)} |&&| \texttt{(\string\page> = 3)}. The predicate is anded together with any previous predicates, so that you can use this as an option for a \scopeenv\ and again for the individual \tikzpkg\ primitive.
+\texttt{(\string\page\ <= 4)} |&&| \texttt{(\string\page\ >= 3)}. The predicate is anded together with any previous predicates, so that you can use this as an option for a \scopeenv\ and again for the individual \tikzpkg\ primitive.
\begin{commandlist}{\isalive\pararg{coordinate},\isalive\{\pararg{coordinate 1}$\cdots$\pararg{coordinate n}\}}
This command can only be used with |page constraint|. Saying
-$$|page constraint = ||{|\pars{\meta{x},\meta{y}\opt{,\meta{index}}}|}}|$$
+\[|page constraint = {\pars{\meta{x},\meta{y}\opt{,}\oarg{index}}}}}|\]
will print the \tikzpkg\ primitive only on pages where the specified class is alive. Saying
-$$|page constraint = ||{\isalive|\pars{\meta{coordinate 1}}\,\cdots\,\pars{\meta{coordinate n}}|}|$$
+\[|page constraint = {\isalive(\meta{coordinate 1})|\,\cdots\,|(\meta{coordinate n})}|\]
is equivalent to
-$$|page constraint = ||{\isalive|\pararg{coordinate 1}| &&|\,\cdots\,|&& \isalive|\pararg{coordinate n}|}|$$
+\[|page constraint = {\isalive\pararg{coordinate 1} &&|\,\cdots\,|&& \isalive\pararg{coordinate n}}|\]
Writing
-$$|\draw[||page constraint = ||{\isalive(1,0)(2,2)}](1,0)|\texttt{-{}-}|(2,2);|$$
+\[\codeverb|\draw[page constraint = {\isalive(1,0)(2,2)}](1,0)|\texttt{-{}-}|(2,2);|\]
is the same as |\structline(1,0)(2,2)|, except that you can't later use |\structlineoptions| on it (and it won't have the |struct lines| style applied).
\end{commandlist}
\end{keylist}
@@ -986,10 +899,16 @@ These handlers create reusable styles to be used in spectral sequences. If this
\end{keylist}
\end{command}
-\begin{command}{\sseqerrortowarning\meta{error-name}}
+\begin{command}{\SseqErrorToWarning\meta{error-name}}
Turns the error with the given name into a warning. An error message will start by saying \let\eatclnifpresent\empty|spectralsequences error: "error-name"|. This is the name you need to put into this command.
\end{command}
+\begin{environment}{{quiet}}
+This environment quiets error messages that occur inside of it. \sseqpages\ is pretty good at error recovery, and so most of commands will fail gracefully and do nothing if their preconditions aren't met. If there are any parsing errors in the body of the |{quiet}| environment, prepare to see low level internal error messages. You might also run into bugs in \sseqpages\ -- the error recovery code hasn't been that carefully tested. If you do get low level error messages, remember to comment out the |{quiet}| environment before trying to debug.
+
+This is particularly useful for code reuse commands. Sometimes there is a source of long differentials that only applies to classes that haven't already supported shorter differentials. Sometimes there should be a structure line if a certain class exists, but it might not exist. In these cases, the |{quiet}| environment will help you out. See also |\DrawIfValidDifferential|, which is a variant of |\d| that behaves as if it were inside a |{quiet}| environment.
+\end{environment}
+
\subsection{Code reuse commands}
\begin{command}{\foreach }
This command is from \tikzpkg\ and works in pretty much the same way in \sseqpages, though with slightly better variants. The |\foreach| command is very flexible and has a lot of variants. The basic usage is |\foreach \x in {\meta{xmin},...,\meta{xmax}} \marg{loop body}| which will execute |\meta{loop body}| with |\x| set to each value between \meta{xmin} and \meta{xmax} inclusive. If you want a step greater than 1, try |\foreach \x in {\meta{xmin},\meta{xmin}+\meta{xstep},...,\meta{xmax}} \marg{loop body}|.
@@ -1073,6 +992,7 @@ If you need to know how many iterations one of these three commands has gone thr
\end{commandlist}
\begin{commandlist}{\NewSseqCommand \cmdarg{command}\marg{argspec}\marg{body},
\DeclareSseqCommand\cmdarg{command}\marg{argspec}\marg{body}}
+% TODO: Explain the difference between NewSseqCommand and DeclareSseqCommand!
The \xparsepkg\ package provides these very powerful commands for defining macros. They are used internally to the \sseqpages\ package to define |\class|, |\d|, etc. To help you create variants of these commands, I will record here the argument specifications for each of them. See the \href{\xparseurl}{\xparsepkg\ manual} for a better explanation and more information.
To make a command like |\class|, you can use the argument specification |O{}r()|. The argument type \texttt{O\marg{default}} stands for a bracket delimited optional argument with default value \meta{default}. In this case, we've specified the default to be empty. |r()| stands for a ``required'' argument delimited by |(| and |)|. In the command definition, access the optional argument with |#1| and the coordinate with |#2|.
@@ -1178,56 +1098,47 @@ For instance:
Here we define a command which takes an options list, a coordinate, and a single mandatory argument. The options are applied to all the classes and structlines, the coordinate shifts the origin, and the mandatory argument is the length of the tower.
\end{commandlist}
-\subsection{Families}
-\spectralsequences\ has a concept of ``class families'' that can be drawn or suppressed as a group, and that can have styling options applied to them as a group.
-\begin{command}{\sseqnewfamily\marg{family name}}
-This makes a new family with name \meta{family name}. The effect of this is to define global options |\meta{family name} style| which apply options to all classes in the family, |draw \meta{family name}| which causes the family to be drawn, and |no \meta{family name}| which suppresses the family (drawing is the default behavior of course). It also defines an option |\meta{family name}| which puts a feature into the family -- so it can be used as an option to any of the normal commands like |\class|, |\d|, |\structline|, etc and to a scope.
-
-\begin{codeexample}[vbox]
-\sseqnewfamily{imJ}
-\begin{sseqdata}[
- name=ANSS-S_2, Adams grading,
- class labels={below}, label distance=-1pt,
- class placement transform={rotate=90,scale=2},
- differentials=blue,
- x range={0}{9}, y range={0}{4},
- xscale=0.7, grid=go
-]
-% Image of J classes
-\begin{scope}[imJ]
-\class[rectangle,fill,inner sep=3pt](0,0)
-\DoUntilOutOfBoundsThenNMore{3}{\etaclass}
-\classoptions["\alpha_1" above left](1,1)
-\class["\alpha_{2/2}",circlen=2](3,1)
-\structline(0,0) \structline[dashed](3,3)
-\class["\alpha_3"](5,1) \d3\relax
-\DoUntilOutOfBounds{ \etaclass \d3 }
-\class["\alpha_{4/4}", rectangle, "16" {font=\tiny,inside}, inner sep=1pt](7,1)
-\DoUntilOutOfBoundsThenNMore{3}{\etaclass}
-\end{scope}
-
-% Other classes
-\class["\beta_{2/2}" {below right=-4pt}, insert = 1](6,2)
-\structline(3,1)
-\class["\beta_{2}" left](8,2)
-\etaclass\structline(6,2,2) % This is a *nu
-\end{sseqdata}
+\begin{command}{\SseqCopyPage\cmdarg{command}\marg{spectral sequence name}\marg{page}}
+This copies all of the classes and structlines on page |\meta{page}| of the spectral sequence named |\meta{spectral sequence name}|, throwing out differentials and tikz primitives. The resulting |\cmdarg{command}| has syntax as if you had used |\DeclareSseqGroup| with no extra arguments -- that is, it takes an optional options list, which are passed to a scope, and an optional coordinate pair.
+\end{command}
-\printpage[name=ANSS-S_2, title = with image of J, imJ style=purple]
+\subsection{Families}
+\spectralsequences\ has a concept of ``class families'' that can be drawn or suppressed as a group, and that can have styling options applied to them as a group.
+\begin{command}{\SseqNewFamily\marg{family name}}
+This makes a new family with name \meta{family name}. The effect of this is to define global options |\meta{family name} style| which apply options to all classes in the family, |draw \meta{family name}| which causes the family to be drawn, and |no \meta{family name}| which suppresses the family (drawing is the default behavior of course). It also defines an option |\meta{family name}| which puts a feature into the family -- so it can be used as an option to any of the normal commands like |\class|, |\d|, |\structline|, etc and to a scope.
-\printpage[name=ANSS-S_2, no imJ, x range={2}{9}, title = without image of J]
-\end{codeexample}
+\codeexample[vbox, from file=imJ]
\end{command}
\subsection{Utilities}
-\begin{command}{\sseqparseint\cmdarg{macro}\marg{integer expression}}
+\begin{command}{\SseqParseInt\cmdarg{macro}\marg{integer expression}}
Stores the result of evaluating an integer expression into \cmdarg{macro}. An integer expression consists of |+|, |-|, |*|, |/|, parentheses, and macros that expand to more of the same. The exact rules regarding what is a valid expression are pretty much what you would expect. Note that juxtaposition is a syntax error, not multiplication, so |2(1+1)| is invalid, you must say |2*(1+1)|.
\end{command}
-\begin{command}{\sseqifempty\marg{expression}\marg{true code}\marg{false code}}
-This tests if an expression is the empty expression. This is mainly useful for giving systematic labels to things. Probably it won't ever matter to you.
-\end{command}
+\begin{commandlist}{
+ \SseqIfEmptyTF\marg{expression}\marg{true code}\marg{false code},
+ \SseqIfEmptyT\marg{expression}\marg{true code},
+ \SseqIfEmptyF\marg{expression}\marg{false code}
+}
+This tests if an expression is the empty expression. This is mainly useful for giving systematic labels to things.
+\end{commandlist}
+
+\begin{commandlist}{
+ \IfExistsTF\marg{page}\pararg{coordinate}\marg{true code}\marg{false code},
+ \IfExistsT\marg{page}\pararg{coordinate}\marg{true code},
+ \IfExistsF\marg{page}\pararg{coordinate}\marg{false code}
+}
+Test whether a class of the given description exists. The description can be any valid coordinate, including a named coordinate. If the coordinate is not valid, this will return false.
+\end{commandlist}
+
+\begin{commandlist}{
+ \IfAliveTF\marg{page}\pararg{coordinate}\marg{true code}\marg{false code},
+ \IfAliveT\marg{page}\pararg{coordinate}\marg{true code},
+ \IfAliveF\marg{page}\pararg{coordinate}\marg{false code}
+}
+Test whether a class is alive on the given page. If the class doesn't exist, this will return false.
+\end{commandlist}
\begin{commandlist}{
\IfOutOfBoundsTF\pararg{coordinate}\marg{true code}\marg{false code},
@@ -1237,19 +1148,49 @@ This tests if an expression is the empty expression. This is mainly useful for g
\IfInBoundsT\pararg{coordinate}\marg{true code},
\IfInBoundsF\pararg{coordinate}\marg{false code}
}
-Test whether an existing class is in bounds or out of bounds. I don't have an obvious use for these. I had to make commands to do this as part of the drawing code and in order to make |\DoUntilOutOfBounds| and it was no extra effort to expose them. Maybe they will be helpful at some point.
+Test whether a class is in bounds or out of bounds. If no such class exists, returns false.
+\end{commandlist}
+
+\begin{commandlist}{
+ \IfValidDifferentialTF\meta{page}\pararg{coordinate}\opt{\pararg{target coordinate}}\marg{true code}\marg{false code},
+ \IfValidDifferentialT\meta{page}\pararg{coordinate}\opt{\pararg{target coordinate}}\marg{true code},
+ \IfValidDifferentialF\meta{page}\pararg{coordinate}\opt{\pararg{target coordinate}}\marg{false code},
+ \DrawIfValidDifferentialTF\ooptions\meta{page}\pararg{coordinate}\opt{\pararg{target coordinate}}\marg{true code}\marg{false code},
+ \DrawIfValidDifferentialT\ooptions\meta{page}\pararg{coordinate}\opt{\pararg{target coordinate}}\marg{true code},
+ \DrawIfValidDifferentialF\ooptions\meta{page}\pararg{coordinate}\opt{\pararg{target coordinate}}\marg{false code},
+ \DrawIfValidDifferential\ooptions\meta{page}\pararg{coordinate}\opt{\pararg{target coordinate}}\marg{false code}
+}
+Test whether a differential is valid. There are many possible reasons for a differential to not be valid -- the source or target class could not exist, the target could not be in the correct grading, etc. If any error would be generated if you supplied the same arguments to |\d|, this tests false. Otherwise, this tests true. The command |\DrawIfValidDifferental| draws the differential if it is valid, whereas |\DrawIfValidDifferentalT| draws the differential and executes the true code if it is valid,
+|\DrawIfValidDifferentalF| draws the differential or executes false code if it isn't valid, etc.
\end{commandlist}
-\begin{command}{\sseqnormalizemonomial}
-This command simplifies a monomial by combining like variables and removing bases that are raised to the 0th power, removing exponents of 1, removing 1's, and replacing the empty monomial with 1. It outputs its result into |\processedlabel|. This command is specifically meant to be used as a value for |class label handler|, so see the example there for the actual purpose. The exponents must be integers or else it will misbehave.
+
+\begin{command}{\SseqNormalizeMonomial}
+This command simplifies a monomial by combining like variables and removing bases that are raised to the 0th power, removing exponents of 1, removing 1's, and replacing the empty monomial with 1. The variables are sorted by first occurrence, use |\SseqNormalizeMonomialSetVariables| to set a different sort order. It outputs its result into |\result|. This command is specifically meant to be used as a value for |class label handler| or |class name handler|. See the example in the documentation for |class label handler| for a realistic example. The exponents must be integers or else it will misbehave.
\begin{codeexample}[]
-\sseqnormalizemonomial{x^0y^0} $\processedlabel$, \quad
-\sseqnormalizemonomial{x^3yx^{-1}z^0} $\processedlabel$, \quad
-\sseqnormalizemonomial{1x_2^2x^2_2} $\processedlabel$
+\SseqNormalizeMonomial{x^0y^0} $\result$, \quad
+\SseqNormalizeMonomial{x^3yx^{-1}z^0} $\result$, \quad
+\SseqNormalizeMonomial{1x_2^2x^2_2} $\result$
\end{codeexample}
\end{command}
+\begin{command}{\SseqNormalizeMonomialSetVariables}
+This command takes an undelimited list sets up |\SseqNormalizeMonomial| to sort the variables in the input in the specified order. This is useful for consistency, and particularly important for when you use it to name classes. For example:
+\begin{codeexample}[]
+% We always want a first, then b, then x_1, then x_2, then x_3
+\SseqNormalizeMonomialSetVariables{abx_1x_2x_3}
+\SseqNormalizeMonomial{ba} $\result$, \quad
+\SseqNormalizeMonomial{bx_1} $\result$, \quad
+\SseqNormalizeMonomial{abx_2x_3x_1} $\result$
+\end{codeexample}
+\SseqNormalizeMonomialSetVariables{}
+\end{command}
+
+
+\begin{command}{\SseqAHSSNameHandler}
+This command expects an argument of the form |\meta{monomial}[\meta{integer expression}]| and defines |\result| to be |m[n]| where |m| is the result of applying |\SseqNormalizeMonomial| to the monomial, and |n| is the result of evaluation the integer expression plus any |yshift| that is present. This is intended for use with in drawing Atiyah Hirzebruch spectral sequences. See |class name handler| for an example of the calculation of $KO^*\mathbb{R}P^8$.
+\end{command}
\subsection{Coordinate parsers and related}
% \parsecoordinate and \parsedifferential
@@ -1291,10 +1232,8 @@ For instance, consider the following example, suggested by Catherine Ray:
(source) -- (intersection-1);
}
\begin{sseqdata}[ name = cathex, Adams grading, differentials = { blue } ]
-\class(0,2)
-\class(0,2)
+\class(0,2)\class(0,2)
\class(1,0)\class(1,0)
-
\twods2(1,0,-1,1){2}
\end{sseqdata}
\printpage[ name = cathex, page = 1 ]
@@ -1313,8 +1252,8 @@ The |\nameclass| command gives a name to a class. It's similar to saying |\dopti
The |\tagclass| command gives a tag to a class. It's similar to saying |\doptions[tag = |\meta{name}|]|, but faster. See \example{tmfmayss} for a use case for this.
\end{command}
-\begin{command}{\gettag\cmdarg{somecontrolsequence}\pararg{coordinate}}
-The |\gettag| command finds the most recent tag applied to the coordinate and stores it into the command. This is useful for connecting groups of nodes. For example, consider the following code, inspired by \example{tmfmayss}.
+\begin{command}{\gettag\cmdarg{macro}\pararg{coordinate}}
+The |\gettag| command finds the most recent tag applied to the coordinate and stores it into |\cmdarg{macro}|. This is useful for connecting groups of nodes. For example, consider the following code, inspired by \example{tmfmayss}.
\begin{codeexample}[width=6cm]
\DeclareSseqCommand \tower { O{} } {
\begin{scope}[#1]
@@ -1388,11 +1327,11 @@ The command |\lastclass| evaluates to the coordinate of the most recent class on
\end{sseqpage}
\end{codeexample}
-You can use |\lastx| and |\lasty| in other contexts than in the body of a \sseqpages\ command, most notably inside |\sseqparseint| (they also go fine inside |\pgfmathparse| if you need it or one of its siblings). For instance, consider the following tower command:
+You can use |\lastx| and |\lasty| in other contexts than in the body of a \sseqpages\ command, most notably inside |\SseqParseInt| (they also go fine inside |\pgfmathparse| if you need it or one of its siblings). For instance, consider the following tower command:
\begin{codeexample}[width=6cm]
\DeclareSseqCommand \tower { } {
\savestack
- \sseqparseint\numclasses{\ymax-\lasty0}
+ \SseqParseInt\numclasses{\ymax-\lasty0}
\foreach \n in {1,...,\numclasses}{
\class(\lastx,\lasty+1)
\structline
@@ -1420,16 +1359,16 @@ This saves and reverts the stack. Saves nest. Most frequently, you will want to
\section{Styles}
The \sseqpages\ package has a large number of styles which control the appearance of specific components (e.g., classes, differentials, or structure lines) of a spectral sequence. Each style has two corresponding keys: |classes| and |change classes|. Saying |classes = |\marg{keys} adds the keys to the list of options used to style every future class, whereas |change classes = |\marg{keys} only makes sense in a \sseqpageenv\ environment, and temporarily overwrites the list of options. Note that |change classes| only applies to classes that existed before the current page, and that even with the |keep changes| option, the |change classes| options are local to the current page. Compare:
\begin{codeexample}[width = 8cm]
-\begin{sseqdata}[ name = stylesex ]
+\begin{sseqdata}[ name = style example ]
\class(0,0)\class(1,1)
\end{sseqdata}
-\begin{sseqpage}[ name = stylesex,
+\begin{sseqpage}[ name = style example,
classes = { fill, blue },
title = change new classes ]
\class(0,1)\class(1,0)
\end{sseqpage}
\quad
-\begin{sseqpage}[ name = stylesex,
+\begin{sseqpage}[ name = style example,
change classes = { fill, blue },
title = change old classes ]
\class(0,1)\class(1,0)
@@ -1524,7 +1463,7 @@ These options change the appearance of all transient cycles (e.g., those classes
\end{stylekeylist}
\begin{stylekeylist}{this page classes, this page cycles, change this page classes,change this page cycles}
-These options change the appearance of all cycles which support or are hit by a differential on this page. Any class that is hit on the current page is also a transient cycle, and so |this page classes| takes precedence over |transient cycles|
+These options change the appearance of all cycles which support or are hit by a differential on this page. Any class that is hit on the current page is also a transient cycle, and so |this page classes| takes precedence over |transient cycles|.
\begin{codeexample}[width = 6cm]
\begin{sseqdata}[ name = this page cycles example, Adams grading,
transient cycles = { red, fill }, this page cycles = { blue } ]
@@ -1612,20 +1551,20 @@ If an edge runs off the edge of the clipping, \sseqpages\ automatically add an a
\begin{key}{class label handler = \meta{function}}
\declarecustomhandler{class label handler}{\codehandler}
-The value of |class label handler| is a function that is applied to all labels before displaying them. It should put its output into |\processedlabel|.
+The value of |class label handler| is a function that is applied to all labels before displaying them. It should put its output into |\result|.
This is intended to help with code reusability. Because these handlers may crash or have annoying side-effects on some input, you may want to toggle the value of this command on and off. To turn this off for the rest of the current spectral sequence you can say |\sseqset{class label handler = {}}|. You can also use the |class label handler| key in a \scopeenv.
-The main function \sseqpages\ provides for use here is |\sseqnormalizemonomial{#1}|. This makes it convenient to translate expressions with polynomial labels. You can write your own handlers if your \TeX\ programming skills are sufficient. Let me know if there are any other functions that you want here, and if you implement them yourself, please send me your implementation.
+The main function \sseqpages\ provides for use here is |\SseqNormalizeMonomial{#1}|. This makes it convenient to translate expressions with polynomial labels. You can write your own handlers if your \TeX\ programming skills are sufficient. Let me know if there are any other functions that you want here, and if you implement them yourself, please send me your implementation.
Here is an example of a function that evaluates an arithmetic expression:
\begin{codeexample}[width=6cm]
\begin{sseqpage}[
- class label handler = { \sseqparseint\processedlabel{#1} }
+ class label handler = { \SseqParseInt\result{#1} }
]
\class["1+1"](0,0)
\class["1+2*(1+3*(4-1))"](1,1)
\end{sseqpage}
\end{codeexample}
-Here's an example using |\sseqnormalizemonomial|:
+Here's an example using |\SseqNormalizeMonomial|:
\begin{codeexample}[width = 6cm]
\NewSseqGroup \test {m} {
\class["1#1"](0,0)
@@ -1634,7 +1573,7 @@ Here's an example using |\sseqnormalizemonomial|:
\class["\alpha y#1"](1,1)
}
\begin{sseqpage}[
- class label handler = { \sseqnormalizemonomial{#1} },
+ class label handler = { \SseqNormalizeMonomial{#1} },
classes = { draw = none }, class labels = { font = \small } ]
\test{}
\test[red](2,0){y^2}
@@ -1643,13 +1582,13 @@ Here's an example using |\sseqnormalizemonomial|:
\end{sseqpage}
\end{codeexample}
-Here is another example which demonstrates a useful idiom for drawing Serre spectral sequences. For a more complete example, see \example{KF3n}. Note the use of braces in |{Sq^1\iota_2}|. Without braces, |\sseqnormalizemonomial| will simplify |Sq^1xSq^2x| into $S^2q^3x^2$, which is obviously undesirable, so the correct way to input this is |{Sq^1x}{Sq^2x}|. Unfortunately, |\foreach| strips a pair of braces from its arguments, so you need to put two pairs of braces.
+Here is another example which demonstrates a useful idiom for drawing Serre spectral sequences. For a more complete example, see \example{KF3n}. Note the use of braces in |{Sq^1\iota_2}|. Without braces, |\SseqNormalizeMonomial| will simplify |Sq^1xSq^2x| into $S^2q^3x^2$, which is obviously undesirable, so the correct way to input this is |{Sq^1x}{Sq^2x}|. Unfortunately, |\foreach| strips a pair of braces from its arguments, so you need to put two pairs of braces.
%\pgfmanualpdflabel{normalizemonomialex-labels}
\begin{codeexample}[width=8cm]
\begin{sseqpage}[
xscale = 1.4,
classes = { draw = none },
- class label handler = {\sseqnormalizemonomial{#1}} ]
+ class label handler = {\SseqNormalizeMonomial{#1}} ]
\foreach \x/\xlabel in
{ 0/1, 2/\iota_2, 3/{{Sq^1\iota_2}}, 4/\iota_2^2 }
@@ -1663,6 +1602,35 @@ Here is another example which demonstrates a useful idiom for drawing Serre spec
\end{key}
+\begin{key}{class name handler = \meta{function}}
+\declarecustomhandler{class name handler}{\codehandler}
+The value of |class name handler| is a function that is applied to all names before using them. It should put its output into |\result|.
+The main functions intended for use here are |\SseqAHSSNameHandler| and |\SseqNormalizeMonomial|, though you can make your own. This is applied both when you name the class, as in \codeverb|\class[name=a](\meta{coordinate})| and when you refer to a class by name, as in |\structline(a)(b)|. One advantage if you are using |\SseqNormalizeMonomial| is that you can ensure that |xy| and |yx| refer to the same class:
+\begin{codeexample}[]
+\SseqNormalizeMonomialSetVariables{xy}
+\begin{sseqpage}[ class name handler = \SseqNormalizeMonomial,
+ classes = {show name = {right,pin}} ]
+\class[name=xy](0,0)
+\class[name=yxy](0,1)
+\class(1,0)
+\structline(yx)(yyx)
+\end{sseqpage}
+\end{codeexample}
+The next page is an example drawing the Atiyah Hirzebruch spectral sequence computing $KO^*\mathbb{R}P^{8}$.
+% Have to load from file so that \afterpage doesn't cause trouble with verbatim reading.
+\afterpage{%
+ An AHSS using \scantokens{|class name handler = \SseqAHSSNameHandler|:}
+ \par
+ \codeexample[from file=KORP8,vbox]
+ \newpage
+}
+\end{key}
+
+\begin{keylist}{class name prefix = \meta{prefix}, class name postfix = \meta{postfix}}
+These keys add respectively a prefix or a postfix to all names of all classes in the scope. This is applied both when you name the class, as in \codeverb|\class[name=a](\meta{coordinate})| and when you refer to a class by name, as in |\structline(a)(b)|.
+The prefix and postfix are added to the command before the |class name handler| is applied, so if you say |name=\meta{the name}| then the name actually given to the class is the value of |\result| after saying |\classnamehander{\meta{name prefix}\meta{the name}\meta{name postfix}}|
+\end{keylist}
+
\section{Global Options}
These options can only be set at the beginning of a \sseqdataenv\ or \sseqpageenv\ environment. When it makes sense, you can also set a default value using |\sseqset|. Generally, these options either modify the plot style or the logic for the spectral sequence.
\begin{key}{name = \meta{sseq name}}
@@ -1698,7 +1666,7 @@ You can make a named grading convention by saying \codeverb|\sseqset{my grading/
\end{sseqpage}
\end{codeexample}
\begin{codeexample}[width = 6cm]
-% equivalent to degree = {-1}{#1-1}:
+% equivalent to degree = {-1}{#1}:
\begin{sseqpage}[ Adams grading ]
\class(0,2)
\class(1,0)
@@ -1827,7 +1795,7 @@ For instance the third row indicates that if there are three classes at the posi
\end{key}
-\begin{key}{class placement transform = \marg{transform keys}, add class placement transform = \marg{transform keys} }
+\begin{keylist}{class placement transform = \marg{transform keys}, add class placement transform = \marg{transform keys} }
\declareasstyle{class placement transform}\declareasstyle{add class placement transform}
The option |class placement transform| allows the user to specify a \tikzpkg\ coordinate transform to adjust the relative position of multiple nodes in the same $\mathtt{(x,y)}$ position. The |class placement transform| key overrides the previous value of transformations, the |add class placement transform| just adds the new transformation to the end of the list. This coordinate transform can only involve rotation and scaling, no translation. Specifying a scaling factor helps if the nodes are too large and overlap. In some cases a rotation makes it easier to see which class is the target of a differential.
\begin{codeexample}[width = 5cm]
@@ -1853,7 +1821,7 @@ The option |class placement transform| allows the user to specify a \tikzpkg\ c
\draw[->,red](3,0,1)--(0,0);
\end{sseqpage}
\end{codeexample}
-With multiple large class names, the best option is to arrange the classes vertically:
+With multiple large class labels, the best option is to arrange the classes vertically:
\begin{codeexample}[width = 5.5cm]
\begin{sseqpage}[ classes = {draw = none }, xscale = 2, yscale=1.55,
class pattern = linear,
@@ -1875,7 +1843,7 @@ With multiple large class names, the best option is to arrange the classes verti
\class["\iota_2\beta P^1\iota_3"](8,2)
\end{sseqpage}
\end{codeexample}
-\end{key}
+\end{keylist}
\begin{key}{math nodes = \meta{boolean} (default true)(initially true)}
This key instructs \sseqpages\ to put all labels in math mode automatically.
@@ -1989,19 +1957,19 @@ Sets the label offset -- by default the ticks will always be the set of numbers
\end{keylist}
\begin{keylist}{
- x major tick step=\meta{nonnegative integer} (initially 0),
- y major tick step=\meta{nonnegative integer} (initially 0),
- major tick step=\meta{nonnegative integer},
- x minor tick step=\meta{nonnegative integer} (initially 0),
- y minor tick step=\meta{nonnegative integer} (initially 0),
- minor tick step=\meta{nonnegative integer}%
+ x major tick step = \meta{nonnegative integer} (initially 0),
+ y major tick step = \meta{nonnegative integer} (initially 0),
+ major tick step = \meta{nonnegative integer},
+ x minor tick step = \meta{nonnegative integer} (initially 0),
+ y minor tick step = \meta{nonnegative integer} (initially 0),
+ minor tick step = \meta{nonnegative integer}%
}
If these are nonzero, they control the placement of tick marks on the axes. The value 0 prevents tick marks from being drawn. Uses |x tick offset| as an offset.
\begin{codeexample}[width=7cm]
-\begin{sseqpage}[
+\begin{sseqpage}[
tick step = 5,
- major tick step = 5,
- minor tick step = 1,
+ major tick step = 5,
+ minor tick step = 1,
scale = 0.4,
axes type = frame
]
@@ -2046,7 +2014,6 @@ The value for |x tick handler| should be a function that takes in the current $\
\end{codeexample}
\end{keylist}
-\newpage
\subsection{Layout}
\begin{keylist}{x axis type = \meta{type} (initially border), y axis type = \meta{type} (initially border),axes type = \meta{type} (initially border), no x axis, no y axis, no axes}
The \meta{type} is either |border|, |center|, |frame|, or |none|. |no axes| is a shorthand for |axes type=none|. The |border| type is the default and puts the axes on the bottom and left of the picture. The |center| type by default places the axes to pass through $(0,0)$; this can be modified using the |x axis origin| and |y axis origin| keys. See \example{KRAHSS} and \example{KUHFPSS} for examples where this is used. The |frame| type draws a frame around the entire chart:
@@ -2061,7 +2028,7 @@ The \meta{type} is either |border|, |center|, |frame|, or |none|. |no axes| is a
\parskip=0pt
\begin{keylist}{x axis origin = \meta{x value} (initially 0), y axis origin = \meta{y value} (initially 0)}
-If you use |axes style = center|, these keys change the position of the axes. Otherwise, they are ignored.
+If you use |axes type = center|, these keys change the position of the axes. Otherwise, they are ignored.
\end{keylist}
%
\begin{keylist}{x axis gap = \meta{dimension} (initially 0.5cm),y axis gap = \meta{dimension} (initially 0.5cm), axes gap = \meta{dimension} (initially 0.5cm)}
@@ -2073,7 +2040,7 @@ If you use |axes style = center|, these keys change the position of the axes. Ot
\end{keylist}
%
\begin{keylist}{
- x axis start extend = \meta{dimension} (initially 0.5cm), y axis start extend = \meta{dimension} (initially 0.5cm),
+ x axis extend start = \meta{dimension} (initially 0.5cm), y axis extend start = \meta{dimension} (initially 0.5cm),
x axis extend end = \meta{dimension} (initially 0.5cm), y axis extend end = \meta{dimension} (initially 0.5cm),
x axis tail = \meta{dimension} (initially 0.9cm), y axis tail = \meta{dimension} (initially 0.9cm)%
}
diff --git a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanualpreamble.tex b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanualpreamble.tex
index a6e0b697138..02747497e0c 100644
--- a/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanualpreamble.tex
+++ b/Master/texmf-dist/doc/latex/spectralsequences/manual/spectralsequencesmanualpreamble.tex
@@ -1,8 +1,8 @@
%%
-%% Package: spectralsequences v1.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: spectralsequencesmanualpreamble.tex
@@ -14,7 +14,7 @@
\documentclass{ltxdoc}
\usepackage[a4paper,left=2.25cm,right=2.25cm,top=2.5cm,bottom=2.5cm,nohead]{geometry}
-\usepackage{spectralsequences}
+\usepackage[tooltips]{spectralsequences}
\usetikzlibrary{shapes.geometric}
\usepackage{amssymb}
\usepackage{afterpage}
@@ -190,6 +190,9 @@
\foreach \xx in {#2} {%
\expandafter\extractkey\xx\space= \marg{keys}\@nil%
\declareasstyle{\@xp\removespace\mykey\nil}% tells latex not to italicize body
+ % The link created in \extractkey is named "key name " with a space at the end.
+ % So it won't work. We need to make our own link without the space in it.
+ \sseq@eval{\@nx\pgfmanualpdflabel{\@xp\removespace\mykey\nil}{}}%
}%
\pgfmanualbody
}{%
@@ -428,6 +431,15 @@
}
%\pgfqkeys{/codeexample}{every codeexample/.style={width=6cm}}
+% This macro in pgfmanual-en-macros.tex seems not to work because the call to \openin is wrong...
+\def\do@codeexamplefromfile{%
+ \immediate\openin\examplesource examples/spectralsequencesmanual-\codeexamplesource.tex\relax % I only changed this line
+ \def\examplelines{}%
+ \readexamplelines
+ \closein\examplesource
+ \expandafter\endofcodeexample\expandafter{\examplelines}%
+}
+
\pgfqkeys{/sseqpages}{
class/class:name/.forward to=/sseqpages/class/name,
@@ -440,7 +452,7 @@
\hypersetup{
- pdftitle={The Sseqpages Package},
+ pdftitle={The Spectralsequences Package},
pdfauthor={Hood Chatham},
pdfsubject={A spectral sequence drawing package build on tikz},
pdfkeywords={spectral sequences,algebraic topology,homotopy theory,math,tikz,sseq},
@@ -463,7 +475,6 @@
\def\targetn{\meta{target n}}
\def\sourcename{\meta{source name}}
-\def\version{version 1.0.0}
\def\today{\the\year/\the\month/\the\day}
\def\pgfmanualurl{http://math.mit.edu/~hood/pgfmanual_v3.0.1a.pdf}
\def\xparseurl{http://mirror.ctan.org/macros/latex2e/contrib/l3packages/xparse.pdf}
@@ -515,5 +526,5 @@
\end{center}\par\vskip1.5em}
\def\abstractname{}
\def\mailtoHC{\href % some PDF viewers don't like spaces:
- {mailto:<hood@mit.edu>\%20Hood\%20Chatham?subject=[sseqpages]}
+ {mailto:<hood@mit.edu>\%20Hood\%20Chatham?subject=[spectralsequences\%20package]}
{\texttt{hood@mit.edu}}} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/spectralsequences.sty b/Master/texmf-dist/tex/latex/spectralsequences/spectralsequences.sty
index 7faf6d6c39e..94b16a24f47 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% A package for drawing spectral sequences
@@ -10,8 +10,10 @@
% TODO:
-%
+% Try catch blocks
% Make an argument type for the \d page argument.
+% deal with xmin, xmax, etc (was there actually a problem we were trying to fix?)
+% Make xmirror not mirror axes labels
%
% Redo sseqerrortest and set up regression test script as part of build (damn I didn't realize we'd lost anything imporant with that find -d disaster)
% Maybe we should add some other regression tests too
@@ -25,13 +27,12 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{spectralsequences}[2017/09/16 v1.1.1]
+\ProvidesPackage{spectralsequences}[2017/12/10 v1.2.0]
\RequirePackage{tikz}
\RequirePackage{etoolbox}
\RequirePackage{xparse}
\RequirePackage{verbatim}
-\RequirePackage{pdfcomment}
\usetikzlibrary{quotes}
\usetikzlibrary{fit}
@@ -44,9 +45,15 @@
%\usetikzlibrary{profiler}
\newif\ifsseq@draftmode
+\newif\ifsseq@tooltip
\DeclareOption{draft}{\sseq@draftmodetrue}
+\DeclareOption{tooltips}{\sseq@tooltiptrue}
\ProcessOptions\relax
+\ifsseq@tooltip
+ \RequirePackage{pdfcomment}
+\fi
+
\def\sseq@authorname{Hood Chatham}
\def\sseq@authoremail{hood@mit.edu}
@@ -54,12 +61,18 @@
% Commands we are going to expose just inside of environments
\def\sseq@macrolist{%
\xcoord\ycoord\page %\xmin\xmax\ymin\ymax % these just get protected
+ % Defined in sseqmessages:
+ \quiet\endquiet
% These are defined in sseqmain:
- \class\classoptions\replaceclass\d\doptions\kill\structline\structlineoptions\circleclasses
+ \class\classoptions\replaceclass\replacesource\replacetarget
+ \d\doptions\kill\structline\structlineoptions\circleclasses
% The following are defined in sseqparsers:
\pgfmathparse\isalive\lastx\lasty\lastclass\savestack\restorestack\pushstack\nameclass\tagclass
\parsecoordinate\parsedifferential\getdtarget\gettag
\IfOutOfBoundsTF\IfOutOfBoundsT\IfOutOfBoundsF\IfInBoundsTF\IfInBoundsT\IfInBoundsF
+ \IfExistsTF\IfExistsT\IfExistsF\IfAliveTF\IfAliveT\IfAliveF
+ \IfValidDifferentialTF\IfValidDifferentialT\IfValidDifferentialF
+ \DrawIfValidDifferentialTF\DrawIfValidDifferentialT\DrawIfValidDifferentialF\DrawIfValidDifferential
% sseqforeach
\Do\DoUntilOutOfBounds\DoUntilOutOfBoundsThenNMore
}
@@ -121,7 +134,7 @@
\newcount\sseq@tempy
\newcount\sseq@tempxb
\newcount\sseq@tempyb
-\newcount\sseq@xoffset % We add these to everything to avoid overflow errors as much as we possible
+\newcount\sseq@xoffset % We add these to everything to avoid overflow errors as much as possible
\newcount\sseq@yoffset
\newcount\sseq@stackdepth
@@ -279,6 +292,7 @@
\input sseqparsers.code.tex % Responsible for making tikz modifications, exposes directly \sseqnormalizemonomial, \sseqparseint
+
\ifsseq@patchforeach
\input sseqforeach.code.tex
\else
@@ -286,9 +300,20 @@
\fi
\input sseqkeys.code.tex % Exposes directly: \sseqset, \sseqnewfamily
-\input sseqmain.code.tex % Defines all the main commands. Exposes directly: the environments, \xmin, \xmax, etc.
+\input sseqmain.code.tex % Defines all the main commands. Exposes directly: the environments, \xmin, \xmax, etc, \SseqCopyPage
\input sseqdrawing.code.tex
+% Give standard definitions for savedpaths wrappers
+\def\sseq@beginscope@object{\begin{scope}}
+\def\sseq@endscope@object{\end{scope}}
+\let\sseq@scope@object\@firstofone
+\let\sseq@style@object\@firstofone
+\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@circleclass@object\sseq@circleclass@draw@ifpage
+\let\sseq@tikzpath@object\@firstofone
+
%%% Some default key settings
\sseqset{
@@ -301,8 +326,14 @@
pins=help lines
}
+\ifsseq@tooltip
+ \let\sseqtooltip\sseq@tooltip@wrapper
+\fi
+
% Extra commands to expose:
\let\sseqifempty\sseq@ifempty
+\let\SseqParseInt\sseqparseint
+\let\SseqNewFamily\sseqnewfamily
\def\sseqpower#1#2{\@xp\sseqtypesetpower@\@xp{\the\numexpr#2}{#1}{1}}
\def\sseqpowerempty#1#2{\@xp\sseqtypesetpower@\@xp{\the\numexpr#2}{#1}{}}
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqcheckdefinitions.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqcheckdefinitions.code.tex
index e9162a02d15..aba45169816 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: sseqcheckdefinitions.code.tex
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqdrawing.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqdrawing.code.tex
index 2574da643a9..9ea6d4397fc 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: sseqdrawing.code.tex
@@ -245,7 +245,7 @@
\sseq@tickloop@generic{\sseq@xmin}{\sseq@xmax}{\sseq@xtickstep}{\sseq@xtickstepoffset}{\sseq@yaxisorigin}{-\sseq@xaxisgap}{
\sseq@xtickstyle
\tikz@options
- \pgftransformshift{\pgfqpoint{0pt}{-\sseq@ylabelgap}}
+ \pgftransformshift{\pgfqpoint{0pt}{-\sseq@xlabelgap}}
\pgftext{\hbox{$\sseq@xtickfn{\the\sseq@tempx}$}}%
}
\ifnum\sseq@xmajortickstep>\z@
@@ -565,7 +565,7 @@
\sseq@tempy=#3\relax
}
-\def\sseqtooltip#1#2{%
+\def\sseq@tooltip@wrapper#1#2{%
\edef\temp{\detokenize\@xpthree{#2}}%
\edef\temp{\@xp\sseqtooltip@replaceslashes\@xp{\temp}}%
\sseq@eval{\@nx\pdftooltip{\unexpanded{#1}}{\temp}}%
@@ -627,7 +627,7 @@
\fi
\def\sseq@collections@featuretype{class}
\the\sseq@scope@toks
- \sseq@obj{#1.options}%
+ \sseq@obj{#1.options}
\pgftransformshift{\pgfqpointxy{\numexpr\sseq@tempx +\sseq@xoffset-\sseq@x\relax}{\numexpr\sseq@tempy + \sseq@yoffset-\sseq@y\relax}}
\iftikz@fullytransformed\pgfgettransform{\savetransform}\fi
\pgftransformresetnontranslations
@@ -638,25 +638,35 @@
}%
\iftikz@fullytransformed\pgfsettransform{\savetransform}\else\pgftransformresetnontranslations\ifsseq@rotatelabels\sseq@globalrotatetransform\fi\fi
\tikz@options
+ % the value of \sseq@class@showname comes from styles. If there was a local option with showname, it's stored in #1.showname.
+ % local value takes priority.
+ \let\sseq@classlabelnodes\pgfutil@empty
+ \edef\sseq@classnodetextoptions{\sseq@obj@ifdef{#1.nodetext.options}{\@xptwo\@nx\sseq@obj{#1.nodetext.options}}{}}
+ \edef\sseq@classnodetext{\sseq@obj@ifdef{#1.nodetext}{\@xptwo\@nx\sseq@obj{#1.nodetext}}{}}
+ \sseq@obj@ifdef{#1.showname}{\sseq@lettoobj\sseq@class@showname{#1.showname}}{}
+ \ifcsname sseq@class@showname\endcsname
+ \sseq@obj@ifdef{#1.name}{
+ \sseq@eval{\@nx\sseq@handleclassquotes@inner{\sseq@obj{#1.name}}{\sseq@class@showname}}
+ }{}
+ \fi
\ifsseq@needstikz
\let\sseq@mode\tikz@mode
- \tikzset{every text node part/.code/.expand once={\sseq@globalrotatetransform\sseq@obj@ifdef{#1.nodetext.options}{\sseq@obj{#1.nodetext.options}}{}}}%
+ \tikzset{every text node part/.code/.expand once={\sseq@globalrotatetransform\sseq@classnodetextoptions{}}}%
\sseq@eval{%
\@nx\node[/utils/exec={\let\@nx\tikz@mode\@nx\sseq@mode},
/handlers/first char syntax/the character "/.initial=\@nx\sseq@handlequote
- ] (\sseq@thisnodename) {\sseq@obj@ifdef{#1.nodetext}{\unexpanded\@xpthree{\sseq@obj{#1.nodetext}}}{}}
+ ] (\sseq@thisnodename) {\unexpanded\@xp{\sseq@classnodetext}}
[every text node part/.code={}];
}%
\else
\tikz@node@textfont
- \edef\sseq@classnodetextoptions{\sseq@obj@ifdef{#1.nodetext.options}{\@xptwo\@nx\sseq@obj{#1.nodetext.options}}{}}
- \edef\sseq@classnodetext{\sseq@obj@ifdef{#1.nodetext}{\@xptwo\@nx\sseq@obj{#1.nodetext}}{}}
\sseq@setnodetext{\sseq@classnodetext}{\sseq@classnodetextoptions}
\let\tikz@fig@name\sseq@thisnodename
\pgfmultipartnode{\tikz@shape}{\tikz@anchor}{\tikz@fig@name}{\sseq@drawnode}%
\tikz@alias
\fi
\sseq@obj{#1.labelnodes}
+ \sseq@classlabelnodes % classlabelnodes comes from show name
\sseq@obj@ifdef{#1.tooltip}{
\pgfpointanchor{\sseq@thisnodename}{west}
\pgf@xa=\pgf@x
@@ -880,10 +890,10 @@
% If either class is part of a family we aren't drawing, don't draw the edge either.
\expandafter\ifx\csname pgf@sh@pi@sseq{#1}\endcsname\pgfpictureid\else
\@xp\sseq@break
- \fi
+ \fi
\expandafter\ifx\csname pgf@sh@pi@sseq{#2}\endcsname\pgfpictureid\else
\@xp\sseq@break
- \fi
+ \fi
\def\sseq@edgetype{#3}
\let\sseq@collections@featuretype\sseq@edgetype
\let\sseq@edgesourceanchor\pgfutil@empty
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqforeach.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqforeach.code.tex
index 71bd11cf52c..851f65ab3ac 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: sseqforeach.code.tex
@@ -68,7 +68,7 @@
\def\sseq@DoUntilOutOfBounds@ #1 {
\sseq@esetthiscall{\string\DoUntilOutOfBoundsThenNMore}
\sseq@opushstacktrace{\string\DoUntilOutOfBounds}
- \ifx\xmin\sseq@xmin\else\ifx\ymin\sseq@ymin\else
+ \ifx\sseq@xminmax\@gobbletwo\else\ifx\sseq@yminmax\@gobbletwo\else
\sseq@error@x{DoUntil-no-bound}{\string\DoUntilOutOfBounds}
\sseq@breakfifi
\fi\fi
@@ -90,7 +90,7 @@
\def\sseq@DoUntilOutOfBoundsThenNMore@ #1#2 {
\sseq@esetthiscall{\string\DoUntilOutOfBoundsThenNMore\unexpanded{#1}}
\sseq@opushstacktrace{\string\DoUntilOutOfBoundsThenNMore{#1}}
- \ifx\xmin\sseq@xmin\else\ifx\ymin\sseq@ymin\else
+ \ifx\sseq@xminmax\@gobbletwo\else\ifx\sseq@yminmax\@gobbletwo\else
\sseq@error@n{DoUntil-no-bound}{\DoUntilOutOfBoundsThenNMore}
\sseq@breakfifi
\fi\fi
@@ -131,7 +131,7 @@
\sseq@tempy=\lasty{0}\relax
\bool_set_false:N \l_tmpb_bool % This is to record whether there is a defined x range or y range. If neither, we'll throw an error.
% \def\sseq@checkbound{\bool_set_false:N \l_tmpb_bool}
- \ifx\xmin\sseq@xmin
+ \ifx\sseq@xminmax\@gobbletwo
\ifnum\sseq@tempx>\sseq@tempxb
\bool_set_true:N \l_tmpb_bool % We have a descent condition
% \sseq@d@addto@macro\sseq@checkbound{
@@ -150,7 +150,7 @@
\fi
\fi
\fi
- \ifx\ymin\sseq@ymin
+ \ifx\sseq@yminmax\@gobbletwo
\ifnum\sseq@tempy>\sseq@tempyb
\bool_set_true:N \l_tmpb_bool
% \sseq@d@addto@macro\sseq@checkbound{
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqkeys.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqkeys.code.tex
index 8c08ffa3a64..fcb843904d2 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: sseqkeys.code.tex
@@ -203,6 +203,7 @@
}%
}
+
\def\sseq@keys@unknown@handlecolor{%
\sseq@add@tikzkey@to@options{\@nx\sseq@options@secondpass{\@nx\tikz@addoption{\@nx\tikz@compat@color@set{\tikz@key}}}}%
\sseq@add@tikzkey@to@options{\@nx\sseq@options@secondpass{\def\@nx\tikz@textcolor{\tikz@key}}}%
@@ -294,6 +295,7 @@
\fi
}
+
% This has to be expandable, so \sseq@tempa and \sseq@tempb are set to "/tikz/" and "/pgf/" ahead of time
% Defer the command if it is in directories /pgf or /tikz, otherwise run it now. TODO: explain here why we need this.
\def\sseq@options@secondpass@iftikz{%
@@ -386,17 +388,19 @@
\@ifnextchar[{\sseq@setlabeldirectionkeys@{#1}}{\sseq@setlabeldirectionkeys@{#1}[/.code]}%]
}
\def\sseq@setlabeldirectionkeys@#1[#2]#3{
+ \bgroup
\def\sseq@temp##1{#3}
\sseq@temptoks{}
\def\\##1{
\sseq@eval{\sseq@temptoks{\the\sseq@temptoks##1#2={\unexpanded\@xp{\sseq@temp{##1}}},}}
}
\sseq@labeldirectionlist
- \sseq@eval{\@nx\pgfqkeys{#1}{\the\sseq@temptoks}}
+ \sseq@eval{\egroup\@nx\pgfqkeys{#1}{\the\sseq@temptoks}}
}
-
+\begingroup
\def\\#1{\@xp\sseq@addtostorelist\csname sseq@default@#1@distance\endcsname{1ex}}
\sseq@labeldirectionlist
+\endgroup
\def\sseq@defaultlabeldistance#1{\@xp\csname sseq@default@#1@distance\endcsname}
\def\sseq@setdefaultlabeldistance#1#2{\sseq@savedpaths@add{\@xp\gdef\csname sseq@default@#1@distance\endcsname{#2}}}
\def\sseq@setdefaultlabeldistances#1{\def\\##1{\sseq@setdefaultlabeldistance{##1}{#1}}\sseq@labeldirectionlist}
@@ -419,8 +423,11 @@
-\sseq@addtostorelist\sseq@classlabeltextfn{} % \sseq@classlabeltextfn is public via "class label handler"
-\def\sseq@classlabeltextfn@default#1{\def\processedlabel{#1}}
+\sseq@addtostorelist\sseq@classlabel@handler{} % \sseq@classlabel@handler is public via "class label handler"
+\def\sseq@classlabel@handler@default#1{\def\result{#1}}
+\sseq@addtostorelist\sseq@classname@handler{} % \sseq@classname@handler is public via "class name handler"
+\def\sseq@classname@handler@default#1{\def\result{#1}}
+
\def\sseq@labeltextfn#1{#1} % labeltextfn is private
\def\sseq@labeltextfn@rotatescale#1{%
\@nx\ifmmode
@@ -488,13 +495,13 @@
}
}
-
+% We just do the parsing in sseqkeys, \sseq@handleclassquotes@inner which does the main work is defined sseqmain.
\def\sseq@handlescopequotes#1#2{% We use this via \let\tikz@quotes@as\sseq@handleclassquotes
/utils/exec={% so it's called inside \pgfkeysalso{stuff}. Need to surround with /utils/exec={} to get out.
\global\let\sseq@classnodetext\pgfutil@empty%
\global\let\sseq@classnodetextoptions\pgfutil@empty%
\global\let\sseq@classlabelnodes\pgfutil@empty%
- \sseq@handleclassquotes@inner{#1}{#2}%
+ \sseq@handleclassquotes@inner{#1}{#2}
}
}
@@ -535,7 +542,6 @@
\let\structline\sseq@structline
}
-
\sseq@pgfqkeysdirlist{/sseqpages,/sseqpages/tikz primitives}{%
standard parse/.code={
\let\sseq@firstpass@shifttransform\@gobbletwo
@@ -556,6 +562,7 @@
/tikz/handle quote/.code={\sseq@error{tikz-edge-quotes}}
}
+
\sseq@pgfqkeysdirlist{/sseqpages/class,/sseqpages/differential}{
standard parse/.sseq @ first pass code={\sseq@error@n{option-tikz-prims-only}{standard parse}},
background/.sseq @ first pass code={\sseq@error@n{option-tikz-prims-only}{background}}
@@ -575,14 +582,25 @@
}
\def\sseq@classinsert{}
+\def\sseq@classnameprefix{}
+\def\sseq@classnamepostfix{}
+\pgfqkeys{/sseqpages}{
+ class name prefix/.store in=\sseq@classnameprefix,
+ class name postfix/.store in=\sseq@classnamepostfix
+}
+
\pgfqkeys{/sseqpages/class}{
- name/.code={\def\sseq@class@name{#1}\pgfkeysalso{/sseqpages/alias=#1}},
+ name/.code={%
+ \sseq@protectedeval{\@nx\sseq@classname@handler{\sseq@classnameprefix#1\sseq@classnamepostfix}}%
+ \edef\sseq@class@name{\unexpanded\@xp{\result}}%
+ \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.
tag/.code={\sseq@d@addto@macro\sseq@class@tag{#1}},
offset/.store in=\sseq@tempoffset,
- tooltip/.sseq @ first pass code={\def\sseq@tooltip{#1}},
+ tooltip/.sseq @ first pass code={\ifx\sseqtooltip\undefined \sseq@error{no-tooltip}\else \def\sseq@tooltip{#1}\fi},
insert/.store in=\sseq@classinsert
}
@@ -792,7 +810,7 @@
#1s/.ecode={%
\@nx\sseq@addstylecodetotoks{\sseq@tempcmd}{\sseq@temppath}{##1}
\@nx\ifsseq@inprogress
- \@nx\sseq@savedpaths@xadd{\sseq@tempcmd{\@nx\the\sseq@tempcmd}}%
+ \@nx\sseq@savedpaths@xadd{\@nx\sseq@style@object{\sseq@tempcmd{\@nx\the\sseq@tempcmd}}}%
\@nx\fi
},%
change #1s/.ecode={%
@@ -826,7 +844,7 @@
}%
\sseq@addstylecodetomacro\sseq@sseqstyle@globalpart{/sseqpages/global}{#1}%
\ifsseq@inprogress
- \sseq@savedpaths@xadd{\sseq@sseqstyle{\the\sseq@sseqstyle}}%
+ \sseq@savedpaths@xadd{\@nx\sseq@style@object{\sseq@sseqstyle{\the\sseq@sseqstyle}}}%
\fi
% Restore hook
\let\sseq@addstylecodetooptions@unknown\sseq@keys@unknown
@@ -892,8 +910,8 @@
%% Families (also called collections in code)
%%
%% These are supposed to make it easy to display / hide and change appearance of logically connected families of classes.
-%% In order to allow a set of options to be given that applies uniformly to all features, we separately apply the options in each of these bins.
-%%
+%% In order to allow a set of options to be given that applies uniformly to all features, we separately apply the options in each of these bins.
+%%
\def\sseq@featurelist{\\{class}\\{differential}\\{structline}\\{circleclass}\\{tikzprimitive}}
@@ -1311,9 +1329,11 @@
}
\def\sseq@keys@removehandler#1{\sseq@keys@removehandler@#1=\sseq@nil}
\def\sseq@keys@removehandler@#1/.#2=#3\sseq@nil{%
+ \bgroup
\def\sseq@temp{#2}%
- \def\\##1{\def\sseq@tempii{##1}\ifx\sseq@tempii\sseq@temp \sseq@tempiffalse\let\\\@gobble\fi}%
+ \def\\##1{\def\sseq@tempii{##1}\ifx\sseq@tempii\sseq@temp \global\sseq@tempiffalse\let\\\@gobble\fi}%
\sseq@keys@ignorehandlers
+ \egroup
\def\sseq@temp{#1}%
}
@@ -1477,6 +1497,7 @@
\sseq@addiftostorelist{specifiedxrange}
\sseq@addiftostorelist{specifiedyrange}
+% We used to \let\xmin\sseq@xmin in here, but that's a bad idea. Hopefully things work now...
\def\sseq@xrange#1#2{%
\global\let\sseq@xminmax\@gobbletwo % Don't need to calculate range of nodes if user specifies it
\global\sseq@specifiedxrangetrue
@@ -1484,22 +1505,19 @@
\sseq@sanitize@intexpr{#2}{x range={#1}{#2}}
\xdef\sseq@xmin{\the\numexpr#1}%
\xdef\sseq@xmax{\the\numexpr#2}%
- \let\xmin\sseq@xmin
- \let\xmax\sseq@xmax
% Need to know decremented \xmin and incremented \xmax to decide which nodes to print
\sseq@tempcount=#1 \advance\sseq@tempcount-1\xdef\sseq@xminmm{\the\sseq@tempcount}%
\sseq@tempcount=#2 \advance\sseq@tempcount1\xdef\sseq@xmaxpp{\the\sseq@tempcount}%
\sseq@breakpoint
}
+
\def\sseq@yrange#1#2{%
\global\let\sseq@yminmax\@gobbletwo %
- \sseq@sanitize@intexpr{#1}{x range={#1}{#2}}
- \sseq@sanitize@intexpr{#2}{x range={#1}{#2}}
+ \sseq@sanitize@intexpr{#1}{y range={#1}{#2}}
+ \sseq@sanitize@intexpr{#2}{y range={#1}{#2}}
\global\sseq@specifiedyrangetrue
- \gdef\sseq@ymin{#1}%
- \gdef\sseq@ymax{#2}%
- \let\ymin\sseq@ymin
- \let\ymax\sseq@ymax
+ \xdef\sseq@ymin{\the\numexpr#1}%
+ \xdef\sseq@ymax{\the\numexpr#2}%
\sseq@tempcount=#1 \advance\sseq@tempcount-1\xdef\sseq@yminmm{\the\sseq@tempcount}%
\sseq@tempcount=#2 \advance\sseq@tempcount1\xdef\sseq@ymaxpp{\the\sseq@tempcount}%
}
@@ -1625,27 +1643,51 @@
x tick handler/.sseq default code={\def\sseq@xtickfn@default##1{#1}},
y tick handler/.code={\def\sseq@ytickfn##1{#1}},
y tick handler/.sseq default code={\def\sseq@ytickfn@default##1{#1}},
- class label handler/.code = { % \long so that \ifx\classlabeltextfn\@gobble compares true if this is empty (\@gobble is long...)
- \long\def\sseq@classlabeltextfn##1{#1}
- \ifx\sseq@classlabeltextfn\@gobble
- \def\sseq@classlabeltextfn##1{\def\processedlabel{##1}}
+ class label handler/.code = { % \long so that \ifx\sseq@classname@handler\@gobble compares true if this is empty (\@gobble is long...)
+ \long\def\sseq@classlabel@handler##1{#1}
+ \ifx\sseq@classlabel@handler\@gobble
+ \def\sseq@classlabel@handler##1{\def\result{##1}}
\else
- \edef\sseq@tempa{\unexpanded\@xp{\sseq@classlabeltextfn{}}}
- \edef\sseq@tempb{\unexpanded\@xp{\sseq@classlabeltextfn{blah}}}
+ \edef\sseq@tempa{\unexpanded\@xp{\sseq@classlabel@handler{}}}
+ \edef\sseq@tempb{\unexpanded\@xp{\sseq@classlabel@handler{blah}}}
\ifx\sseq@tempa\sseq@tempb
- \long\def\sseq@classlabeltextfn##1{#1{##1}}
+ \long\def\sseq@classlabel@handler##1{#1{##1}}
\fi
\fi
},
class label handler/.sseq default code={
- \long\def\sseq@classlabeltextfn@default##1{#1}
- \ifx\sseq@classlabeltextfn@default\@gobble
- \def\sseq@classlabeltextfn@default##1{\def\processedlabel{##1}}
+ \long\def\sseq@classlabel@handler@default##1{#1}
+ \ifx\sseq@classlabel@handler@default\@gobble
+ \def\sseq@classlabel@handler@default##1{\def\result{##1}}
\else
- \edef\sseq@tempa{\unexpanded\@xp{\sseq@classlabeltextfn@default{}}}
- \edef\sseq@tempb{\unexpanded\@xp{\sseq@classlabeltextfn@default{blah}}}
+ \edef\sseq@tempa{\unexpanded\@xp{\sseq@classlabel@handler@default{}}}
+ \edef\sseq@tempb{\unexpanded\@xp{\sseq@classlabel@handler@default{blah}}}
\ifx\sseq@tempa\sseq@tempb
- \long\def\sseq@classlabeltextfn@default##1{#1{##1}}
+ \long\def\sseq@classlabel@handler@default##1{#1{##1}}
+ \fi
+ \fi
+ },
+ class name handler/.code = { % \long so that \ifx\sseq@classname@handler\@gobble compares true if this is empty (\@gobble is long...)
+ \long\def\sseq@classname@handler##1{#1}
+ \ifx\sseq@classname@handler\@gobble
+ \def\sseq@classname@handler##1{\def\result{##1}}
+ \else
+ \edef\sseq@tempa{\unexpanded\@xp{\sseq@classname@handler{}}}
+ \edef\sseq@tempb{\unexpanded\@xp{\sseq@classname@handler{blah}}}
+ \ifx\sseq@tempa\sseq@tempb
+ \long\def\sseq@classname@handler##1{#1{##1}}
+ \fi
+ \fi
+ },
+ class name handler/.sseq default code={
+ \long\def\sseq@classname@handler@default##1{#1}
+ \ifx\sseq@classname@handler@default\@gobble
+ \def\sseq@classname@handler@default##1{\def\result{##1}}
+ \else
+ \edef\sseq@tempa{\unexpanded\@xp{\sseq@classname@handler@default{}}}
+ \edef\sseq@tempb{\unexpanded\@xp{\sseq@classname@handler@default{blah}}}
+ \ifx\sseq@tempa\sseq@tempb
+ \long\def\sseq@classname@handler@default##1{#1{##1}}
\fi
\fi
},
@@ -1700,15 +1742,27 @@
\let\sseq@axistypesanitizer\sseq@axistypesanitizera
\pgfqkeys{/sseqpages}{%
- class label handler/.code = { % \long so that \ifx\classlabeltextfn\@gobble compares true if this is empty (\@gobble is long...)
- \long\def\sseq@classlabeltextfn##1{#1}
- \ifx\sseq@classlabeltextfn\@gobble
- \def\sseq@classlabeltextfn##1{\def\processedlabel{##1}}
+ class label handler/.code = { % \long so that \ifx\sseq@classlabel@handler\@gobble compares true if this is empty (\@gobble is long...)
+ \long\def\sseq@classlabel@handler##1{#1}
+ \ifx\sseq@classlabel@handler\@gobble
+ \def\sseq@classlabel@handler##1{\def\result{##1}}
+ \else
+ \edef\sseq@tempa{\unexpanded\@xp{\sseq@classlabel@handler{}}}
+ \edef\sseq@tempb{\unexpanded\@xp{\sseq@classlabel@handler{blah}}}
+ \ifx\sseq@tempa\sseq@tempb
+ \long\def\sseq@classlabel@handler##1{#1{##1}}
+ \fi
+ \fi
+ },
+ class name handler/.code = { % \long so that \ifx\sseq@classname@handler\@gobble compares true if this is empty (\@gobble is long...)
+ \long\def\sseq@classname@handler##1{#1}
+ \ifx\sseq@classname@handler\@gobble
+ \def\sseq@classname@handler##1{\def\result{##1}}
\else
- \edef\sseq@tempa{\unexpanded\@xp{\sseq@classlabeltextfn{}}}
- \edef\sseq@tempb{\unexpanded\@xp{\sseq@classlabeltextfn{blah}}}
+ \edef\sseq@tempa{\unexpanded\@xp{\sseq@classname@handler{}}}
+ \edef\sseq@tempb{\unexpanded\@xp{\sseq@classname@handler{blah}}}
\ifx\sseq@tempa\sseq@tempb
- \long\def\sseq@classlabeltextfn##1{#1{##1}}
+ \long\def\sseq@classname@handler##1{#1{##1}}
\fi
\fi
}
@@ -1762,7 +1816,11 @@
}
\def\sseq@globalscaleoption#1{%
\sseq@globaldetonefalse
- \@xp\gdef\@xp\sseq@globalscaletransform\@xp{\sseq@globalscaletransform#1}%
+ \@ifundefined{sseq@globalscaletransform}{
+ \@xp\gdef\@xp\sseq@globalscaletransform@default\@xp{\sseq@globalscaletransform@default#1}%
+ }{
+ \@xp\gdef\@xp\sseq@globalscaletransform\@xp{\sseq@globalscaletransform#1}%
+ }
}
\pgfqkeys{/sseqpages/global}{%
x/.sseq @ illegal,
@@ -1802,8 +1860,13 @@
\sseq@break
\fi
\sseq@globalscaleoption{\pgfsetxvec{\pgfpointxy{#1}{0}}}
- \pgfmathparse{\sseq@xscale*#1}
- \edef\sseq@xscale{\pgfmathresult}
+ \@ifundefined{sseq@xscale}{
+ \pgfmathparse{\sseq@xscale@default*#1}
+ \edef\sseq@xscale@default{\pgfmathresult}
+ }{
+ \pgfmathparse{\sseq@xscale*#1}
+ \edef\sseq@xscale{\pgfmathresult}
+ }
\sseq@breakpoint
},
xscale/.value required,
@@ -1821,8 +1884,13 @@
\sseq@break
\fi
\sseq@globalscaleoption{\pgfsetyvec{\pgfpointxy{0}{#1}}}
- \pgfmathparse{\sseq@yscale*#1}
- \edef\sseq@yscale{\pgfmathresult}
+ \@ifundefined{sseq@yscale}{
+ \pgfmathparse{\sseq@yscale@default*#1}
+ \edef\sseq@yscale@default{\pgfmathresult}
+ }{
+ \pgfmathparse{\sseq@yscale*#1}
+ \edef\sseq@yscale{\pgfmathresult}
+ }
\sseq@breakpoint
},
yscale/.value required,
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqloadstore.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqloadstore.code.tex
index c40d0d974c6..066685a57af 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: sseqloadstore.code.tex
@@ -97,6 +97,8 @@
\def\sseq@obj@xoaddto#1{\sseq@obj@ifundef{#1}{\sseq@obj@xodef{#1}}{\@xp\sseq@g@addto@macro\csname \sseq@obj@fullname{#1}\@xp\endcsname\@xp}}
\def\sseq@obj@map#1#2{\def\\##1{#2}\sseq@obj{#1}}
+\def\sseq@lettoobj#1#2{\sseq@obj@ifdef{#2}{\@xp\let\@xp#1\csname\sseq@obj@fullname{#2}\endcsname}{\let#1\empty}}
+
\def\sseq@obj@ifchanged#1#2#3{\sseq@obj@ifundef{#1.changed}{#3}{#2}}
\def\sseq@obj@changedtrue#1{\sseq@obj@gdef{#1.changed}{}}
@@ -124,10 +126,10 @@
% This simplifies the code a lot because I don't have to check again where I should put things.
\sseq@addtostorelist\sseq@savedpaths{}
\def\sseq@tempsavedpaths{}
-\def\sseq@savedpaths@addclass@standard#1{\sseq@x@addto@macro\sseq@savedpaths{\@nx\sseq@class@draw@ifpage{#1}}}
-\def\sseq@savedpaths@adddifferential@standard#1{\sseq@x@addto@macro\sseq@savedpaths{\@nx\sseq@differential@draw@ifpage{#1}}}
-\def\sseq@savedpaths@addstructline@standard#1{\sseq@x@addto@macro\sseq@savedpaths{\@nx\sseq@structline@draw@ifpage{#1}}}
-\def\sseq@savedpaths@xaddtikzpath@standard#1{\sseq@x@addto@macro\sseq@savedpaths{#1}}
+\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@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}
\def\sseq@savedpaths@xadd@standard{\sseq@x@addto@macro\sseq@savedpaths}
\def\sseq@savedpaths@show@standard{\show\sseq@savedpaths}
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqmacromakers.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqmacromakers.code.tex
index 3ac70b363b3..ae914721e25 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: sseqmacromakers.code.tex
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqmain.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqmain.code.tex
index d33fcf15c67..d69b28d2041 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: sseqmain.code.tex
@@ -63,6 +63,12 @@
\sseq@installmacros
\sseq@installmsghooks
\sseq@install@xparse@Uarggrabber
+ % The behavior of xmax and xmin is very particular, so it's best not to mess with them.
+ % In particular, they shouldn't be expanded until printing no matter what, but we don't want
+ % \pgfmathparse to barf on them. \pgfmathparse really doesn't like engine protected macros,
+ % so in no case should this be engine protected. (Wish we could test an argument for the presence
+ % of engine protected macros). If we try to do that, \sseq@ifpgfmathexpr will break in
+ % \sseq@tikzprimitives@coords@notaclass@handle@.
\def\xmin{\protect\sseq@xmin}\def\xmax{\protect\sseq@xmax}
\def\ymin{\protect\sseq@ymin}\def\ymax{\protect\sseq@ymax}
%
@@ -96,7 +102,7 @@
\global\let\@xp\@nx\csname pgfk@/sseqpages/global/{\sseq@currentoptionpath} options/.@cmd\endcsname
\@xp\@nx\csname pgfk@/sseqpages/global/{\sseq@currentoptionpath} options/.@cmd\endcsname
}
- \sseq@savedpaths@xadd{\sseq@stylelist}
+ \sseq@savedpaths@xadd{\@nx\sseq@style@object{\sseq@stylelist}}
\sseq@savedpaths@add{\begingroup} % prevent some of the two-pass user macros horrors
\let\sseq@error@setup\sseq@error@setup@withinfo
}
@@ -218,6 +224,10 @@
%
\ifx\sseq@xmin\sseq@infinity\sseq@error{no-range}\def\sseq@xmin{0}\def\sseq@xmax{0}\@xp\sseq@break\fi % could be warning
\ifx\sseq@ymin\sseq@infinity\sseq@error{no-range}\def\sseq@ymin{0}\def\sseq@ymax{0}\@xp\sseq@break\fi
+ \let\xmin\sseq@xmin
+ \let\xmax\sseq@xmax
+ \let\ymin\sseq@ymin
+ \let\ymax\sseq@ymax
%
\ifnum\numexpr\sseq@xmax-\sseq@xmin\relax>\numexpr\maxdimen/\dimexpr1pt\relax-1\relax
\sseq@error@xx{range-super-overflow}{x}
@@ -266,7 +276,6 @@
\sseq@setlayoutparameters
\begin{tikzpicture}[/sseqpages/global/{default} options,\ifsseq@hasname/sseqpages/global/{\sseq@thename} options\fi,/sseqpages/global/{this page} options]%
\sseq@sseqstyle@globalpart
- %\pgftransformreset
\sseq@globaldetonetransform
\sseq@globalscaletransform
%
@@ -315,7 +324,6 @@
\ifsseq@mathnodes
\tikzset{execute at begin node=$,execute at end node=$}%
\fi
- %\let\sseq@error@setup\sseq@error@setup@withinfo
%
\begingroup
\sseq@savedbackgroundpaths
@@ -324,10 +332,10 @@
\sseq@useclip
%
\ifsseq@drawdifferentials\else
- \let\sseq@differential@draw@ifpage\@gobble
+ \let\sseq@differential@object\@gobble
\fi
\ifsseq@drawstructlines\else
- \let\sseq@structline@draw@ifpage\@gobble
+ \let\sseq@structline@object\@gobble
\fi
%
\sseq@usesavedpaths
@@ -351,12 +359,48 @@
\end{sseqpage}%
}
+
+\def\SseqCopyPage#1#2#3{
+ \begingroup
+ \def#1{\begingroup}
+ \global\let\sseq@copymacro\empty
+ \def\sseq@thename{#2}
+ \global\let\sseq@savedpaths@save\sseq@savedpaths
+ \sseq@storelist@get\sseq@savedpaths
+ \def\sseq@thepage{#3}
+ \sseq@thepagecount=#3\relax
+ \def\sseq@beginscope@object{\sseq@g@addto@macro#1{\sseq@savedpaths@add{\sseq@beginscope@object}}}
+ \def\sseq@endscope@object{\sseq@g@addto@macro#1{\sseq@savedpaths@add{\sseq@endscope@object}}}
+ \def\sseq@scope@object##1{\sseq@g@addto@macro#1{\sseq@savedpaths@add{\sseq@scope@object{##1}}}}
+ \def\sseq@style@object##1{\sseq@g@addto@macro#1{\sseq@savedpaths@add{\sseq@style@object{##1}}}}
+ \let\sseq@class@drawnode\sseq@copypage@addclass
+ \let\sseq@differential@object\@gobble
+ \let\sseq@structline@draw\sseq@copypage@addstructline
+ \let\sseq@tikzpath@object\@gobble
+ \let\sseq@pgfkeysdocommand\@gobbletwo
+ \sseq@savedpaths
+ \sseq@g@addto@macro#1{\endgroup}
+ \endgroup
+ \@xp\let\csname\sseq@macroname#1 code\endcsname\sseq@copymacro
+ \DeclareSseqGroup #1 {} { \csname\sseq@macroname#1 code\endcsname }
+ \let\sseq@savedpaths\sseq@savedpaths@save
+}
+
+\def\sseq@copypage@addclass#1{
+ \sseq@x@addto@macro\sseq@copymacro{\@nx\sseq@class@copy{\sseq@thename}{#1}}
+}
+
+\def\sseq@copypage@addstructline#1{
+ \sseq@x@addto@macro\sseq@copymacro{\@nx\sseq@structline@copy{\sseq@thename}{#1}}
+}
+
+
%%% Scope
\newcount\sseq@scope@savestackid
\def\sseq@scope@secondpasstoks{}
\def\sseq@scope{\@ifnextchar[{\sseq@scope@}{\sseq@scope@[]}}%]
\def\sseq@scope@[#1]{%
- \sseq@scope@savedpaths@add{\begin{scope}}%
+ \sseq@scope@savedpaths@add{\sseq@beginscope@object}%
% This is a funky hack to fix a problem with shifts. On tmfass, if we don't handle shifts specially, we actually put so much stuff into
% this \sseq@scope@secondpasstoks macro that we exceed TeX's upper bound for the maximum total macro memory. Or something like that -- I don't understand the error,
% but it definitely only depends on how much stuff there is overall and on there being lots of scopes, not on any particular part of the diagram.
@@ -364,12 +408,12 @@
\let\sseq@options@scopeshiftsecondpass\sseq@scope@savedpaths@add
\sseq@processoptions{scope}{#1}% outputs into \sseq@savedoptioncode
\edef\sseq@scope@secondpasstoks{\unexpanded\@xp{\sseq@scope@secondpasstoks}\unexpanded\@xp{\sseq@savedoptioncode}}
- \sseq@eval{\@nx\sseq@scope@savedpaths@add{\sseq@scope@toks{\unexpanded\@xp{\sseq@scope@secondpasstoks}}}}%
+ \sseq@eval{\@nx\sseq@scope@savedpaths@add{\@nx\sseq@scope@object{\sseq@scope@toks{\unexpanded\@xp{\sseq@scope@secondpasstoks}}}}}%
%\advance\sseq@scope@savestackid\@ne
%\sseq@savestack@name{scope@save\the\sseq@scope@savestackid}
}
\def\sseq@endscope{%
- \sseq@scope@savedpaths@add{\end{scope}}
+ \sseq@scope@savedpaths@add{\sseq@endscope@object}
%\sseq@restorestack@name{scope@save\the\sseq@scope@savestackid
}
@@ -411,11 +455,11 @@
\sseq@obj@xdef{partcoord.(\partialcoord).tag.\sseq@class@tagprefix\sseq@class@tag}{\nodenum}%
\fi
\ifx\sseq@class@name\pgfutil@empty\else
- \sseq@cleanup@obj{class.\classname.name}
- \sseq@cleanup@obj{class.namedclass.\sseq@class@name}
+ \sseq@cleanup@obj{\classname.name}
+ \sseq@cleanup@obj{class.namedclass.\detokenize\@xp{\sseq@class@name}}
\sseq@namehandler
- \sseq@obj@xdef{class.\classname.name}{\sseq@class@name}
- \sseq@obj@xdef{class.namedclass.\sseq@class@name}{\coordnopar}
+ \sseq@obj@xdef{\classname.name}{\sseq@class@name}
+ \sseq@obj@xdef{class.namedclass.\detokenize\@xp{\sseq@class@name}}{\coordnopar}
\fi
\sseq@breakpoint
\endgroup
@@ -463,7 +507,14 @@
\sseq@breakfi
\fi
%%%% No more breaks after this point
+
+ \sseq@processlabels % This sets up the label nodes, now that we know the position of the class (I think that's what we needed?)
+ \sseq@class@main % We segment off the main part of the class so that we can call it separately from the copy method
+ \sseq@breakpoint
+ \endgroup
+}
%
+\def\sseq@class@main{
\ifx\sseq@classinsert\empty
% by default, just insert to the right of previous classes
\edef\sseq@classinsert{\nodenum}
@@ -483,7 +534,6 @@
\fi
\fi
%
- \sseq@processlabels % This sets up the label nodes, now that we know the position of the class (I think that's what we needed?)
%
\sseq@xminmax{\xcoord}{\ycoord}%
\sseq@yminmax{\xcoord}{\ycoord}%
@@ -500,14 +550,10 @@
\sseq@obj@xdef{partcoord.(\partialcoord).tag.\sseq@class@tagprefix\sseq@class@tag}{\nodenum}%
\fi
\ifx\sseq@class@name\pgfutil@empty\else
- \sseq@cleanup@obj{class.\classname.name}
- \sseq@cleanup@obj{class.namedclass.\sseq@class@name}
- \sseq@namehandler
- \sseq@obj@xdef{class.\classname.name}{\sseq@class@name}
- \sseq@obj@xdef{class.namedclass.\sseq@class@name}{\coordnopar}
- \fi
- \ifcsname sseq@class@showname\endcsname
- \sseq@eval{\@nx\sseq@handleclassquotes{\sseq@obj{class.\classname.name}}{\sseq@class@showname}}
+ \sseq@cleanup@obj{\classname.name}
+ \sseq@cleanup@obj{class.namedclass.\detokenize\@xp{\sseq@class@name}}
+ \sseq@obj@xdef{\classname.name}{\sseq@class@name}
+ \sseq@obj@xdef{class.namedclass.\detokenize\@xp{\sseq@class@name}}{\coordnopar}
\fi
\sseq@pushstack@\coord
%
@@ -530,6 +576,9 @@
\ifx\sseq@classlabelnodes\pgfutil@empty\else
\sseq@obj@xodef{\classname.labelnodes}{\sseq@classlabelnodes}%
\fi
+ \ifcsname sseq@class@showname\endcsname
+ \sseq@obj@xodef{\classname.showname}{\sseq@class@showname}
+ \fi
\ifsseq@needstikz
\sseq@obj@xdef{\classname.needstikz}{\sseq@needstikztrue}%
\fi
@@ -541,11 +590,36 @@
\fi
%
\sseq@savedpaths@addclass{class.\coord}%
- \sseq@breakpoint
- \endgroup
}
\def\sseq@setoffset#1{\sseq@obj@gdef{\classname.offset}{\pgftransformshift{#1}}}
+\def\sseq@copy@nameprefix{}
+
+\def\sseq@class@copy#1#2{
+ \begingroup
+ \let\sseq@thename@saved\sseq@thename
+ \def\sseq@thename{#1}
+ \sseq@lettoobj\sseq@familylist{#2.familylist}
+ \sseq@lettoobj\sseq@savedoptioncode{#2.options}
+ \sseq@lettoobj\sseq@classnodetext{#2.nodetext}
+ \sseq@lettoobj\sseq@classnodetextoptions{#2.nodetext.options}
+ \sseq@lettoobj\sseq@classlabelnodes{#2.labelnodes}
+ \sseq@obj@ifdef{#2.showname}{\sseq@lettoobj\sseq@class@showname{#2.showname}}{}
+ \sseq@lettoobj\sseq@class@name{#2.name}
+ \edef\sseq@class@name{\unexpanded\@xp{\sseq@copy@nameprefix}\unexpanded\@xp{\sseq@class@name}}
+ \sseq@obj{#2.needstikz}
+ \sseq@lettoobj\sseq@tooltip{#2.tooltip}
+ \sseq@class@getparts#2.
+ \sseq@quieterror{class-tag-already-defined}
+ \edef\sseq@class@tag{copiedfrom\sseq@thisposnum}
+ \let\sseq@thename\sseq@thename@saved
+ \sseq@eval{\@nx\sseq@cparsecoord{\the\sseq@tempx,\the\sseq@tempy}}
+ \let\sseq@pushstack@\@gobble
+ \sseq@class@main
+ \endgroup
+}
+
+
% This is for use with "insert" key. Add one to offset index of each class later than the one currently being inserted
% Takes the partial coordinate "x,y" in #1, and the position that the new class is being inserted into in \sseq@classinsert.
\def\sseq@class@adjustclasses#1{
@@ -643,14 +717,13 @@
\sseq@obj@xdef{partcoord.(\partialcoord).tag.\sseq@class@tagprefix\sseq@class@tag}{\sseq@index}%
\fi
\ifx\sseq@class@name\pgfutil@empty\else
- \sseq@obj@ifdef{class.\classname.name}{
- \sseq@error@nn{classoptions-class-already-named}{\coord}{\sseq@obj{class.\classname.name}}%could be warning
+ \sseq@obj@ifdef{\classname.name}{
+ \sseq@error@nn{classoptions-class-already-named}{\coord}{\sseq@obj{\classname.name}}%could be warning
}{}
- \sseq@cleanup@obj{class.\classname.name}
- \sseq@cleanup@obj{class.namedclass.\sseq@class@name}
- \sseq@namehandler
- \sseq@obj@xdef{class.\classname.name}{\sseq@class@name}
- \sseq@obj@xdef{class.namedclass.\sseq@class@name}{\coordnopar}
+ \sseq@cleanup@obj{\classname.name}
+ \sseq@cleanup@obj{class.namedclass.\detokenize\@xp{\sseq@class@name}}
+ \sseq@obj@xdef{\classname.name}{\sseq@class@name}
+ \sseq@obj@xdef{class.namedclass.\detokenize\@xp{\sseq@class@name}}{\coordnopar}
\fi
\sseq@tempcount=\sseq@gen\relax
\advance\sseq@tempcount\m@ne
@@ -679,6 +752,9 @@
\sseq@cleanup@obj{\classname.labelnodes}
\sseq@classoptions@obj@addto@withpagerange{\classname.labelnodes}{\sseq@classlabelnodes}
\fi
+ \ifcsname sseq@class@showname\endcsname
+ \sseq@obj@xodef{\classname.showname}{\sseq@class@showname}
+ \fi
\ifx\sseq@familylist\pgfutil@empty\else
\sseq@cleanup@obj{\classname.familylist}
\sseq@classoptions@obj@addto@withpagerange{\classname.familylist}{\sseq@familylist}
@@ -725,10 +801,38 @@
\sseq@smuggle@macro\sseq@gen
\egroup
}
+
\sseq@DeclareDocumentCommand\replaceclass{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}%
+ \sseq@replaceclassmain{#1}
+}
+
+\sseq@DeclareDocumentCommand\replacesource{o}{
+ \begingroup
+ \sseq@loadinputline
+ \sseq@xsetthiscall{\string\replacesource\IfNoValueF{#1}{[\unexpanded{#1}]}}
+ \sseq@parsedcoord@restore{\coord}{lastsource}
+ \sseq@replaceclassmain{#1}
+}
+
+\sseq@DeclareDocumentCommand\replacetarget{o}{
+ \begingroup
+ \sseq@loadinputline
+ \sseq@xsetthiscall{\string\replacetarget\IfNoValueF{#1}{[\unexpanded{#1}]}}
+ \sseq@parsedcoord@restore{\coord}{lasttarget}
+ \sseq@replaceclassmain{#1}
+}
+
+\def\sseq@replaceclassmain#1{
\sseq@options@firstpassmode
\the\sseq@sseqstyle
\the\sseq@classstyle
@@ -737,24 +841,23 @@
\IfNoValueF{#1}{%
\sseq@processoptions{class}{#1}% Outputs result into \sseq@savedoptioncode
}%
-%
- \IfNoValueTF{#2}{
- \def\sseq@coord{\lastclass0}
- }{
- \def\sseq@coord{#2}
- }
- \sseq@parsecoord\coord{\sseq@coord}{\string\classoptions}%
\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}]}
+ \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{class.\coord[\sseq@obj{class.\coord.num}].page}<\sseq@thepagecount\else
- \edef\sseq@temp{\sseq@obj{class.\coord[\sseq@obj{class.\coord.num}].page}}
+ \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
+%
\let\partialcoord\coord@partial
\ifx\sseq@class@tag\pgfutil@empty\else
\sseq@obj@ifdef{partcoord.(\partialcoord).tag.\sseq@class@tagprefix\sseq@class@tag}{%
@@ -763,18 +866,20 @@
\sseq@cleanup@obj{partcoord.(\partialcoord).tag.\sseq@class@tagprefix\sseq@class@tag}%
\sseq@obj@xdef{partcoord.(\partialcoord).tag.\sseq@class@tagprefix\sseq@class@tag}{\nodenum}%
\fi
- \ifx\sseq@class@name\pgfutil@empty\else
- \sseq@cleanup@obj{class.\classname.name}
- \sseq@cleanup@obj{class.namedclass.\sseq@class@name}
- \sseq@namehandler
- \sseq@obj@xdef{class.\classname.name}{\sseq@class@name}
- \sseq@obj@xdef{class.namedclass.\sseq@class@name}{\coordnopar}
- \fi
- \ifcsname sseq@class@showname\endcsname
- \sseq@eval{\@nx\sseq@handleclassquotes{\sseq@obj{class.\classname.name}}{\sseq@class@showname}}
+ \ifx\sseq@class@name\pgfutil@empty
+ \sseq@obj@ifdef{\oldclassname.name}{
+ \sseq@lettoobj\sseq@class@name{\oldclassname.name}
+ \sseq@cleanup@obj{\classname.name}
+ \sseq@cleanup@obj{class.namedclass.\detokenize\@xp{\sseq@class@name}}
+ \sseq@obj@xdef{\classname.name}{\sseq@class@name}
+ \sseq@obj@xdef{class.namedclass.\detokenize\@xp{\sseq@class@name}}{\coordnopar}
+ }{}
+ \else
+ \sseq@cleanup@obj{\classname.name}
+ \sseq@cleanup@obj{class.namedclass.\detokenize\@xp{\sseq@class@name}}
+ \sseq@obj@xdef{\classname.name}{\sseq@class@name}
+ \sseq@obj@xdef{class.namedclass.\detokenize\@xp{\sseq@class@name}}{\coordnopar}
\fi
- \sseq@cleanup@obj{class.\coord.num}
- \sseq@obj@inc{class.\coord.num}
\let\partialcoord\coord@partial
\ifx\sseq@class@tag\pgfutil@empty\else
\sseq@obj@ifdef{partialcoord.(\partialcoord).tag.\sseq@class@tagprefix\sseq@class@tag}{%
@@ -782,8 +887,10 @@
}{}%
\sseq@obj@xdef{partialcoord.(\partialcoord).tag.\sseq@class@tagprefix\sseq@class@tag}{\nodenum}%
\fi
- \edef\classname{class.\coord[\sseq@obj{class.\coord.num}]}
%
+ \ifcsname sseq@class@showname\endcsname
+ \sseq@obj@xodef{\classname.showname}{\sseq@class@showname}
+ \fi
\sseq@obj@xodef{\classname.familylist}{\sseq@familylist}
\sseq@obj@xdef{\classname.page}{\sseq@infinity}
\sseq@obj@xodef{\classname.options}{\sseq@savedoptioncode}
@@ -794,6 +901,9 @@
\sseq@obj@xodef{\classname.nodetext.options}{\sseq@classnodetextoptions}
\fi
\sseq@obj@xodef{\classname.labelnodes}{\sseq@classlabelnodes}
+ \ifcsname sseq@class@showname\endcsname
+ \sseq@obj@xodef{\classname.showname}{\sseq@class@showname}
+ \fi
\sseq@obj@gdef{\classname.dependencies}{}
\ifsseq@needstikz
\sseq@obj@xdef{\classname.needstikz}{\sseq@needstikztrue}
@@ -819,6 +929,7 @@
\fi
\egroup
}
+
% #1 -- class
% #2 -- page
% If there is a class #1 drawn on page #2, set \sseq@gen to be the generation of that class, otherwise set \sseq@gen to be -1.
@@ -856,6 +967,8 @@
\sseq@DeclareDocumentCommandAs\sseq@kill@\kill {d()} {
\sseq@xsetthiscall{\string\kill\unexpanded\@xp{\sseq@dpage}\IfNoValueF{#1}{(#1)}}%
\sseq@parsecoord\coordinate{\IfNoValueTF{#1}{\lastclass}{#1}}{}%
+ \sseq@parsedcoord@save{lastsource}{\coordinate}
+ \sseq@parsedcoord@save{lasttarget}{\coordinate}
\sseq@ifintexpr{\sseq@dpage}{%
\sseq@tempcount=\numexpr\sseq@dpage\relax % this is a convenient way to get rid of spaces because #3 has to be a number
}{%
@@ -934,6 +1047,8 @@
\def\sseq@d@d#1#2{%%
\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.
+ %%% Note that we can break inside \sseq@d@setpageclass inside \sseq@d@setpageminrec
%
\ifsseq@drawdifferential % TODO: probably should get rid of invisible now that we have \kill...
\sseq@obj@xodef{d.#2\source\target.familylist}{\sseq@familylist}
@@ -1017,7 +1132,7 @@
\fi
\fi
\sseq@obj@xdef{\sseq@classgenname.page}{#2}
- \sseq@obj@xdef{\sseq@classgenname.deathinfo}{#3 of differential \sseq@thiscall\space on page #2}
+ \sseq@obj@xdef{\sseq@classgenname.deathinfo}{#3 of differential \sseq@thiscall\ on page #2}
\bgroup
\def\foreach{\@nx\@nx\@nx\foreach}
\protected\def\\{}
@@ -1033,7 +1148,7 @@
\ifx\sseq@restofstacktrace\pgfutil@empty\else\sseq@tempiftrue\fi
\sseq@obj@xdef{\sseq@classgenname.deathstacktrace}{%
\ifsseq@tempif
- \unexpanded{\\\\}Stack trace for differential \sseq@thiscall\ that killed #3:\unexpanded{\\}%
+ \unexpanded{\\\\}Stack trace for differential \@nx\unexpanded{\sseq@thiscall} that killed #3:\unexpanded{\\}%
\ifx\sseq@temp\sseq@empty\else\unexpanded{\ \ \ }\@nx\sseq@stack@unexpanded{\unexpanded\@xp{\the\sseq@foreachcall}}\fi
\unexpanded\@xp{\sseq@restofstacktrace}%
\fi
@@ -1056,8 +1171,10 @@
\def\sseq@d@setpagemin#1#2{
\ifnum\sseq@obj{#1.page}>#2\relax
- \sseq@cleanup@obj{#1.page}
- \sseq@obj@xdef{#1.page}{#2}
+ \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@obj@xdef{#1.page}{#2}
+ \fi
\fi
}
\def\sseq@differential@draw@ifpage#1{
@@ -1262,6 +1379,27 @@
\sseq@obj@xoaddto{\sseq@structlinename.familylist}{\sseq@familylist}
\ifnum\sseq@tempcount<\sseq@genmax\repeat
}
+
+\def\sseq@structline@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@structline@structline
+ \endgroup
+}
+
+\def\sseq@structline@copy@decomposename#1.(#2,#3,#4)(#5,#6,#7){
+ \def\sourcename{#2,#3,copiedfrom#4}
+ \def\targetname{#5,#6,copiedfrom#7}
+}
+
\def\sseq@structline@getgen#1{
\bgroup
\sseq@tempcount=\sseq@obj{structline.\source\target.num}\relax
@@ -1366,7 +1504,7 @@
\sseq@obj@xodef{\circleclassobjname.tikzprimoptions}{\sseq@keysfortikzprim}
\sseq@obj@xdef{\circleclassobjname.fitnodes}{\@nx\tikz@lib@fit{(sseq{\coordanopar})(sseq{\coordbnopar})\sseq@fitalso}}
%\edef\temp{\@nx\sseq@circleclass@draw{\coorda@internalname}{\coordb@internalname}{\unexpanded\@xp{\sseq@savedoptioncode}}}
- \sseq@savedpaths@xadd{\@nx\sseq@circleclass@draw@ifpage{\circleclassobjname}{\coordanopar}{\coordbnopar}}
+ \sseq@savedpaths@xadd{\@nx\sseq@circleclass@object{\circleclassobjname}{\coordanopar}{\coordbnopar}}
\sseq@obj@xdef{\circleclassobjname.page}{\sseq@pagemax}
\sseq@obj@xdef{\circleclassobjname.pagemin}{\sseq@pagemin}
\@ifundefined{sseq@fit@pagemax}{
@@ -1425,13 +1563,13 @@
\the\sseq@scope@toks
\sseq@options@normalmode
\sseq@processoptions{class/label}{#2}%
- \sseq@classlabeltextfn{#1}% labeltextfn is a private handler, classlabeltextfn is exposed via "class label handler"
+ \sseq@classlabel@handler{#1}% labeltextfn is a private handler for transformations, sseq@classlabel@handler is exposed via "class label handler"
\ifsseq@classlabel
\sseq@options@firstpassmode
\the\sseq@outerclasslabelstyle
\sseq@x@addto@macro\sseq@classlabelnodes{%
\@nx\sseq@drawlabel{%
- \sseq@maybemathswitch\unexpanded\@xp{\processedlabel}\sseq@maybemathswitch}%
+ \sseq@maybemathswitch\unexpanded\@xp{\result}\sseq@maybemathswitch}%
{% This is setup to prevent a bug where \classoptions and class label style don't work correctly together
\the\sseq@sseqstyle\@nx\the\sseq@sseqstyle@page
\the\sseq@labelstyle\@nx\the\sseq@labelstyle@page
@@ -1449,7 +1587,7 @@
\the\sseq@innerclasslabelstyle
\sseq@options@normalmode
\sseq@protectedeval{\@nx\pgfqkeys{/sseqpages/class/label}{#2}}%
- \sseq@protected@xdef\sseq@classnodetext{\sseq@maybemathswitch\processedlabel\sseq@maybemathswitch}%
+ \sseq@protected@xdef\sseq@classnodetext{\sseq@maybemathswitch\result\sseq@maybemathswitch}%
\xdef\sseq@classnodetextoptions{%
%\unexpanded{\def\pgfkeysdefaultpath{/sseqpages/class/node texts/}}%
\sseq@thelabelstyle\sseq@theclasslabelstyle\sseq@theinnerclasslabelstyle
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqmessages.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqmessages.code.tex
index 8bde90b1c24..bfa11df4e4b 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: sseqmessages.code.tex
@@ -260,7 +260,9 @@
\ExplSyntaxOn
\char_set_catcode_space:N\ % Needed to make pretocmd work -- there are always spaces after every command, and they need to be retokenized as spaces
-\def\sseqerrortowarning#1{ \msg_redirect_name:nnn { spectralsequences } { #1 } { warning } }
+\def\SseqErrorToWarning#1{\msg_redirect_name:nnn{spectralsequences}{#1}{warning}}
+\let\sseqerrortowarning\SseqErrorToWarning
+\def\sseq@quieterror#1{\msg_redirect_name:nnn{spectralsequences}{#1}{none}}
\def\sseq@error {\msg_error:nn {spectralsequences}}
\def\sseq@error@n {\msg_error:nnn {spectralsequences}}
@@ -416,6 +418,13 @@
\sseq@newerror{anchor-ignored} {The coordinate #1 is not a class, but it has an anchor '#3'. Ignoring the anchor and treating it as the literal position #2.}
\sseq@newerror{invalid-tikz-coord}{The coordinate #1 does not refer to a tikz class but its #2 coordinate is not valid \string\pgfmathparse\ input.}
+% handlers
+\sseq@newerror{NormalizeMonomial-invalid-exponent}{The exponent #1 of the variable #2 in the monomial #3 is not a valid integer expression. Giving up on processing this monomial -- I will leave it alone and hope for the best.}
+\sseq@newerror{AHSSNameHandler-missing-cell}{The name #1 has no cell (an integer expression surrounded by brackets). Giving up on processing it and returning my input in \string\result.}
+\sseq@newerror{AHSSNameHandler-invalid-integer}{The cell degree #1 of #2 is not a valid integer expression. I am leaving it alone, but I processed the monomial.}
+
+
+
%%
%%
%% foreach
@@ -491,10 +500,14 @@
\sseq@newerror{unknown-grid}{Undefined grid style '#1'.}
\sseq@newerror{unknown-class-pattern}{Unknown class pattern '\sseq@classpattern'.}
\sseq@newerror{class-placement-shift}{Shifts are illegal in the transformations applied in "class placement" key. If you want to shift your nodes, use \string\sseqnewclasspattern.} % #1 <- x shift, #2 <- shift amount
-\sseq@newerror{do-command-failed}{\string\sseq@pgfkeysdocommand{#1}{#2} failed.}
+\sseq@newerror@internal{do-command-failed}{\string\sseq@pgfkeysdocommand{#1}{#2} failed.}
\sseq@newerror{standard-parse}{You cannot use \string#1 inside a scope that has either the background key or coordinate transformations other than integer shifts.}
+\sseq@newerror{no-tooltip}{You cannot use the 'tooltip' option without either using the 'tooltips' package option or giving your own definition for '\string\sseqtooltip'.
+ Tooltips aren't enabled by default because they use the 'pdfcomment' package which creates two extra auxiliary files.%
+}
+
%%
%%
%% main
@@ -559,4 +572,7 @@
\sseq@newerror{structline-source-target-equal}{The source and target of a \@nx\structline cannot be equal.}
+\protected\def\sseq@quiet{\msg_redirect_module:nnn{spectralsequences}{error}{info}}
+\protected\def\sseq@endquiet{}
+
\ExplSyntaxOff
diff --git a/Master/texmf-dist/tex/latex/spectralsequences/sseqparsers.code.tex b/Master/texmf-dist/tex/latex/spectralsequences/sseqparsers.code.tex
index a31b2db2183..316d2fe27e2 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.1.1 2017-09-16 2017-09-16
+%% Package: spectralsequences v1.2.0 2017-09-16 2017-09-16
%% Author: Hood Chatham
%% Email: hood@mit.edu
-%% Date: 2017-09-16
+%% Date: 2017-12-10
%% License: Latex Project Public License
%%
%% File: sseqparsers.code.tex
@@ -99,10 +99,12 @@
% Spaces matter to us, because \sseq@ifintexpr{1 1} is false but \sseqsifintexpr{11} is true
% so we make spaces into catcode other and use \scantokens
+\def\sseq@fexpsafenil{\@nx\sseq@fexpsafenil}
+
\def\sseq@ifintexpr#1{%
\bgroup
\sseq@tempcount\z@
- \sseq@ifintexpr@{needsint}#1\sseq@nil%
+ \sseq@ifintexpr@{needsint}#1\sseq@fexpsafenil%
\@xp\egroup\next
}
@@ -113,7 +115,7 @@
\ifx\testtok\bgroup%
\let\next\sseq@ifintexpr@false
\else
- \ifx\testtok\sseq@nil
+ \ifx\testtok\sseq@fexpsafenil
\@xp\let\@xp\next\csname sseq@ifintexpr@@\sseq@ifintexpr@state @done\endcsname
\else
% We need to check here for a space because \string<space> produces NO OUTPUT regardless of the catcode of the space.
@@ -155,8 +157,8 @@
% so then "\csname hello\testtok\endcsname" is an error. This indexes into our state machine,
% cases: a digits, + or -, * or /, (, ), or something else (anything else always leads to false
\def\sseq@ifintexpr@@@@#1{%
- \ifx#1\sseq@nil
- \def\next{\csname sseq@ifintexpr@@\sseq@ifintexpr@state @done\endcsname\sseq@nil}%
+ \ifx#1\sseq@fexpsafenil
+ \def\next{\csname sseq@ifintexpr@@\sseq@ifintexpr@state @done\endcsname\sseq@fexpsafenil}%
\else
\sseq@ifdigit{#1}%
{\sseq@ifintexpr@next{digit}}%
@@ -187,8 +189,8 @@
\next
}
-\def\sseq@ifintexpr@true#1\sseq@nil{\ifnum\sseq@tempcount=\z@ \let\next\@firstoftwo\else\let\next\@secondoftwo\fi}
-\def\sseq@ifintexpr@false#1\sseq@nil{\let\next\@secondoftwo}
+\def\sseq@ifintexpr@true#1\sseq@fexpsafenil{\ifnum\sseq@tempcount=\z@ \let\next\@firstoftwo\else\let\next\@secondoftwo\fi}
+\def\sseq@ifintexpr@false#1\sseq@fexpsafenil{\let\next\@secondoftwo}
\def\sseq@makeifint#1#2#3{\@xp\def\csname sseq@ifintexpr@@#1@#2\endcsname{#3}}
\def\sseq@ifintexpr@next#1{\@xp\let\@xp\next\csname sseq@ifintexpr@@\sseq@ifintexpr@state @#1\endcsname}
@@ -234,6 +236,8 @@
%%
%% This parser defines the syntax for the page argument of \d.
%%
+%% #1 -- callback. Will pass control to this function when done.
+%% stores output in \sseq@dpage
\def\sseq@d@grabpage#1{
\let\sseq@grabdpage@return#1
\futurelet\testtok\sseq@grabdpage@
@@ -497,33 +501,47 @@
\ifpgfutil@in@
\sseq@parsecoord@maincoord@@#1,\sseq@nil
\else
- \sseq@obj@ifdef{class.namedclass.\detokenize{#1}}{
- \def\sourcename{#1}
- \@xpthree\sseq@parsecoord@maincoord@named\sseq@obj{class.namedclass.#1}\sseq@nil
+ \pgfutil@in@{lastclass}{#1}
+ \ifpgfutil@in@
+ \def\handledname{#1}
+ \else
+ \sseq@protectedeval{\@nx\sseq@classname@handler{\sseq@classnameprefix#1\sseq@classnamepostfix}}
+ \let\handledname\result
+ \fi
+ \sseq@obj@ifdef{class.namedclass.\detokenize\@xp{\handledname}}{
+ \let\sourcename\handledname
+ \@xpthree\sseq@parsecoord@maincoord@named\sseq@obj{class.namedclass.\detokenize\@xp{\sourcename}}\sseq@nil
}{
- \sseq@error{invalid-coordinate}\sseq@breakfifi
+ \sseq@error{invalid-coordinate}\sseq@breakfifi
}
\fi
\fi
}
\def\sseq@parsecoord@maincoord@@#1,#2,#3\sseq@nil{%
- \sseq@obj@ifdef{class.namedclass.\detokenize{#1}}{
- \def\sourcename{#1}
- \@xpthree\sseq@parsecoord@maincoord@named\sseq@obj{class.namedclass.#1}\sseq@nil
- \edef\sseq@restcoord{\sseq@removecomma#2,#3\sseq@nil}
- }{
- \sseq@ifintexpr{#1}{
- \sseq@ifintexpr{#2}{}{\sseq@error@n{invalid-coordinate}{y~}\sseq@breakfifi} % breakfifi to get out of ifs from maincoord@
- \edef\sseq@xcoord{\the\numexpr\sseq@x+(#1)\relax}%
- \edef\sseq@ycoord{\the\numexpr\sseq@y+(#2)\relax}%
- \edef\sseq@xycoord{\sseq@xcoord,\sseq@ycoord}%
- \sseq@ifempty{#3}{\let\sseq@restcoord\pgfutil@empty}{%
- \edef\sseq@restcoord{\sseq@removecomma#3\sseq@nil}%
- }%
- }{
+ \sseq@ifintexpr{#1}{%
+ \sseq@ifintexpr{#2}{}{\sseq@error@n{invalid-coordinate}{y~}\sseq@breakfifi} % breakfifi to get out of ifs from maincoord@
+ \edef\sseq@xcoord{\the\numexpr\sseq@x+(#1)\relax}%
+ \edef\sseq@ycoord{\the\numexpr\sseq@y+(#2)\relax}%
+ \edef\sseq@xycoord{\sseq@xcoord,\sseq@ycoord}%
+ \sseq@ifempty{#3}{\let\sseq@restcoord\pgfutil@empty}{%
+ \edef\sseq@restcoord{\sseq@removecomma#3\sseq@nil}%
+ }%
+ }{%
+ \pgfutil@in@{lastclass}{#1}%
+ \ifpgfutil@in@
+ \def\handledname{#1}%
+ \else
+ \sseq@protectedeval{\@nx\sseq@classname@handler{\sseq@classnameprefix#1\sseq@classnamepostfix}}%
+ \let\handledname\result
+ \fi
+ \sseq@obj@ifdef{class.namedclass.\detokenize\@xp{\handledname}}{%
+ \def\sourcename{#1}
+ \@xpthree\sseq@parsecoord@maincoord@named\sseq@obj{class.namedclass.\detokenize{#1}}\sseq@nil
+ \edef\sseq@restcoord{\sseq@removecomma#2,#3\sseq@nil}%
+ }{%
\sseq@error@n{invalid-coordinate}{x~}\sseq@breakfifi % breakfifi to get out of ifs from maincoord@
- }
+ }%
}%
}%
@@ -587,14 +605,19 @@
% #1 -- name to define
% #2 -- coordinate
% #3 -- the error message
+\def\sseq@eatparens(#1){#1}
\def\sseq@parsecoord#1#2#3{%
- \def\sseq@index{}
- \def\sseq@errortype{#3}
+ \def\sseq@index{}%
+ \def\sseq@errortype{#3}%
\sseq@parsecoord@maincoord{#2}%
\let\sseq@rawindex\sseq@restcoord
\ifx\sseq@index\pgfutil@empty
\@xp\sseq@parsecoord@index
\fi
+ \sseq@parsecoord@setupvariables{#1}{#2}
+}
+
+\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.
\@xp\let\csname x\sseq@macroname#1\endcsname\sseq@xcoord
@@ -603,29 +626,55 @@
\@xp\let\csname \sseq@macroname#1@partial\endcsname\sseq@xycoord
\edef#1{(\sseq@xycoord,\sseq@index)}%
\@xp\edef\csname\sseq@macroname#1nopar\endcsname{\sseq@xycoord,\sseq@index}
- \@xp\def\csname\sseq@macroname#1name\endcsname{(#2)}%
- \@xp\def\csname\sseq@macroname#1nameunbraced\endcsname{#2}%
+ \@xp\edef\csname\sseq@macroname#1name\endcsname{(#2)}%
+ \@xp\edef\csname\sseq@macroname#1nameunbraced\endcsname{\@xptwo\sseq@eatparens\csname\sseq@macroname#1name\endcsname}% edef?
\@xp\edef\csname\sseq@macroname#1@internalname\endcsname{sseq{\sseq@xycoord,\sseq@index}}%
}
+
+% This quiets parsecoord for the rest of the current scope.
+% The reason we did it this way is because parsecoord makes too many local definitions...
+\def\sseq@quiet@parsecoord{
+ \msg_redirect_name:nnn {spectralsequences}{invalid-coordinate}{none}
+ \msg_redirect_name:nnn {spectralsequences}{no-classes}{none}
+ \msg_redirect_name:nnn {spectralsequences}{index-too-large}{none}
+ \msg_redirect_name:nnn {spectralsequences}{undefined-tag}{none}
+}
+
+
+% These are used for \replacesource and \replacetarget, though they might be useful for other things too.
+\def\sseq@parsedcoord@save#1#2{
+ \cs_gset_eq:cc { sseq@parsedcoord@save@x#1 } { x\sseq@macroname#2 }
+ \cs_gset_eq:cc { sseq@parsedcoord@save@y#1 } { y\sseq@macroname#2 }
+ \cs_gset_eq:cc { sseq@parsedcoord@save@n#1 } { n\sseq@macroname#2 }
+ \cs_gset_eq:cc { \sseq@macroname#1@partial } { \sseq@macroname#2@partial }
+ \cs_gset_eq:cN { sseq@parsedcoord@save@#1 } #2
+ \cs_gset_eq:cc { sseq@parsedcoord@save@#1nopar } { \sseq@macroname#2nopar }
+ \cs_gset_eq:cc { sseq@parsedcoord@save@#1name } { \sseq@macroname#2name }
+ \cs_gset_eq:cc { sseq@parsedcoord@save@#1nameunbraced } { \sseq@macroname#2nameunbraced }
+ \cs_gset_eq:cc { sseq@parsedcoord@save@#1@internalname } { \sseq@macroname#2@internalname }
+}
+
+\def\sseq@parsedcoord@restore#1#2{
+ \cs_set_eq:cc { x\sseq@macroname#1 } { sseq@parsedcoord@save@x#2 }
+ \cs_set_eq:cc { y\sseq@macroname#1 } { sseq@parsedcoord@save@y#2 }
+ \cs_set_eq:cc { n\sseq@macroname#1 } { sseq@parsedcoord@save@n#2 }
+ \cs_set_eq:cc { \sseq@macroname#1@partial } { #2@partial }
+ \cs_set_eq:Nc #1 { sseq@parsedcoord@save@#2 }
+ \cs_set_eq:cc { \sseq@macroname#1nopar } { sseq@parsedcoord@save@#2nopar }
+ \cs_set_eq:cc { \sseq@macroname#1name } { sseq@parsedcoord@save@#2name }
+ \cs_set_eq:cc { \sseq@macroname#1nameunbraced } { sseq@parsedcoord@save@#2nameunbraced }
+ \cs_set_eq:cc { \sseq@macroname#1@internalname } { sseq@parsedcoord@save@#2@internalname }
+}
+
% #1 & #2 -- the two base commands that were handed to \sseq@parsecoord to swap.
% This is only used in \structline to normalize the name of structure lines, so that sseqpages knows what you are talking about
% if you say \structline(coorda)(coordb) and then later \structline(coordb)(coorda)
-\cs_new:Npn \sseq_swapmacros:NN #1#2 {
- \let\sseq@temp#1 \let#1#2 \let#2\sseq@temp
-}
-\cs_generate_variant:Nn \sseq_swapmacros:NN { cc }
-
\def\sseq@parsedcoords@swap#1#2{
- \sseq_swapmacros:cc { x\sseq@macroname#1 } { x\sseq@macroname#2 }
- \sseq_swapmacros:cc { y\sseq@macroname#1 } { y\sseq@macroname#2 }
- \sseq_swapmacros:cc { n\sseq@macroname#1 } { n\sseq@macroname#2 }
- \sseq_swapmacros:cc { \sseq@macroname#1@partial } { \sseq@macroname#2@partial }
- \sseq_swapmacros:NN #1 #2
- \sseq_swapmacros:cc { \sseq@macroname#1nopar } { \sseq@macroname#2nopar }
- \sseq_swapmacros:cc { \sseq@macroname#1name } { \sseq@macroname#2name }
- \sseq_swapmacros:cc { \sseq@macroname#1nameunbraced } { \sseq@macroname#2nameunbraced }
- \sseq_swapmacros:cc { \sseq@macroname#1@internalname } { \sseq@macroname#2@internalname }
+ \sseq@parsedcoord@save{swaptempa}{#1}
+ \sseq@parsedcoord@save{swaptempb}{#2}
+ \sseq@parsedcoord@restore{#1}{swaptempb}
+ \sseq@parsedcoord@restore{#2}{swaptempa}
}
% EXPOSE: a wrapper around \sseq@parsecoord. Use full name of coordinate to avoid name class with sseq@parsecoord.
@@ -672,16 +721,8 @@
\sseq@error{d-named-coord-two-indexes}
\fi
\fi
- \let\sourcecoord\sseq@xycoord
-%
- \let\xsource\sseq@xcoord
- \let\ysource\sseq@ycoord
- \let\nsource\sseq@index
-%
- \edef\source{(\sseq@xycoord,\sseq@index)}%
- \ifx\sourcename\undefined
- \edef\sourcename{(\sseq@xycoord\ifx\sseq@rawindex\pgfutil@empty\else,\sseq@rawindex\fi)}
- \fi
+ \sseq@parsecoord@setupvariables{\source}{(\sseq@xycoord\ifx\sseq@rawindex\pgfutil@empty\else,\sseq@rawindex\fi)}
+ \let\sourcecoord\source@partial
\IfNoValueTF{#3}{
\ifsseq@hasdegree\else\sseq@error{d-no-degree}\@xp\sseq@break\fi
\sseq@eval{\edef\@nx\sseq@xycoord{\@nx\sseq@differential@gettarget{#1}{\sseq@xycoord}}}
@@ -689,11 +730,7 @@
\def\sseq@errortype{target ~ of ~ differential}
\sseq@parsecoord@index
\let\targetcoord\sseq@xycoord
- \edef\target{(\sseq@xycoord,\sseq@index)}%
- \let\xtarget\sseq@xcoord
- \let\ytarget\sseq@ycoord
- \let\ntarget\sseq@index
- \edef\targetname{(\sseq@xycoord\ifx\sseq@rawindex\pgfutil@empty\else,\sseq@rawindex\fi)}
+ \sseq@parsecoord@setupvariables{\target}{(\sseq@xycoord\ifx\sseq@rawindex\pgfutil@empty\else,\sseq@rawindex\fi)}
}{
\ifx\sseq@rawtindex\pgfutil@empty\else
\sseq@error{d-target-index-target-coord}
@@ -709,6 +746,8 @@
\fi
\fi
}
+ \sseq@parsedcoord@save{lastsource}{\source}
+ \sseq@parsedcoord@save{lasttarget}{\target}
}
\def\sseq@differential@gettarget#1#2{\sseq@differential@gettarget@{#1}#2\sseq@nil}
@@ -735,8 +774,12 @@
% EXPOSE: a wrapper around \sseq@dparsecoord.
-\sseq@DeclareDocumentCommand \parsedifferential { m r() d() }{%
- \sseq@dparsecoord{#1}{#2}{#3}%
+\protected\def\sseq@parsedifferential{%
+ \sseq@d@grabpage\sseq@parsedifferential@
+}
+
+\DeclareDocumentCommand \sseq@parsedifferential@ { d() d() } {%
+ \sseq@eval{\@nx\sseq@dparsecoord{\sseq@dpage}{\IfNoValueTF{#1}{\lastclass0}{\unexpanded{#1}}}{\unexpanded{#2}}}%
}
% Expandable coordinate parsing for \isalive.
@@ -913,21 +956,46 @@
\egroup
}
+\prg_new_conditional:Npnn \sseq_if_empty:n #1 {T,F,TF} {
+ \sseq@ifempty{\prg_return_true:}{\prg_return_false:}
+}
+
+\let\SseqIfEmptyTF\sseq_if_empty:nTF
+\let\SseqIfEmptyT\sseq_if_empty:nT
+\let\SseqIfEmptyF\sseq_if_empty:nF
+
+% Test if a class exists.
+\prg_new_conditional:Npnn \sseq_if_exists:n #1 { T , F , TF } {
+ \bgroup
+ \sseq@tempiftrue
+ \sseq@quiet@parsecoord
+ \sseq@parsecoord\coord{#1}{}
+ \@gobbletwo\sseq@breakpoint\sseq@tempiffalse % this executes \sseq@tempiffalse if we broke, otherwise it gets gobbled
+ \ifsseq@tempif
+ \egroup
+ \prg_return_true:
+ \else
+ \egroup
+ \prg_return_false:
+ \fi
+}
+
+% Test if a class is out of bounds. Return false if the class doesn't exist.
\prg_new_conditional:Npnn \sseq_if_out_of_bounds:n #1 { T , F , TF } {
\bgroup
\sseq@tempiftrue
+ \sseq@quiet@parsecoord
\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:}
\else
\egroup
- \prg_return_false
+ \prg_return_false:
\fi
}
% For internal use b/c it's faster not to call \sseq@parsecoord
-% There's no noticeable performance boost though... =(
\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
@@ -940,6 +1008,115 @@
\fi
}
+\prg_new_conditional:Npnn \sseq_if_alive:nn #1 #2 { T, F, TF } {
+ \bgroup
+ \sseq@tempiftrue
+ \sseq@quiet@parsecoord
+ \sseq@parsecoord\coord{#2}{}
+ \@gobbletwo\sseq@breakpoint\sseq@tempiffalse
+ \ifsseq@tempif
+ \sseq@obj@pagetogen{class.\coord}{#1}
+ \ifnum\sseq@gen>-1\relax
+ \egroup
+ \prg_return_true:
+ \else
+ \egroup
+ \prg_return_false:
+ \fi
+ \else
+ \egroup
+ \prg_return_false:
+ \fi
+}
+
+
+\protected\def\sseq@DrawIfValidDifferential{\sseq@DrawIfValidDifferential@{}{}}
+\protected\def\sseq@DrawIfValidDifferentialT{\sseq@DrawIfValidDifferential@{T}{}}
+\protected\def\sseq@DrawIfValidDifferentialF{\sseq@DrawIfValidDifferential@{}{F}}
+\protected\def\sseq@DrawIfValidDifferentialTF{\sseq@DrawIfValidDifferential@{T}{F}}
+
+\DeclareDocumentCommand\sseq@DrawIfValidDifferential@{mmO{}}{%
+ \begingroup
+ \sseq@loadinputline
+ \def\sseq@dtype{d}
+ \def\sseq@trueclause{#1}
+ \def\sseq@falseclause{#2}
+ \def\sseq@doptions{#3}
+ \sseq@d@grabpage\sseq@DrawIfValidDifferential@@
+}
+
+
+% #4 -- first coord
+% #5 -- possible second coord
+\DeclareDocumentCommand \sseq@DrawIfValidDifferential@@ { d() d() } {%
+ \ifx\sseq@trueclause\pgfutil@empty
+ \@xp\@firstoftwo
+ \else
+ \@xp\@secondoftwo
+ \fi{\sseq@DrawIfValidDifferential@@@{#1}{#2}{}}
+ {\sseq@DrawIfValidDifferential@@@{#1}{#2}}
+}
+
+% #1 -- first coord
+% #2 -- possible second coord
+% #3 -- rest of true clause
+\def \sseq@DrawIfValidDifferential@@@#1#2#3{
+ \sseq@eval{\endgroup%\@nx\tracingall
+ \exp_not:c{sseq_if_valid_differential:nnT\sseq@falseclause}{\sseq@dpage}{\IfNoValueTF{#1}{\lastclass0}{\unexpanded{#1}}}{\unexpanded{#2}}{%
+ \@nx\d[\exp_not:o{\sseq@doptions}]\sseq@dpage\IfNoValueF{#1}{(\unexpanded{#1})}\IfNoValueF{#2}{(\unexpanded{#2})}%
+ \unexpanded{#3}%
+ }%
+ }%
+}
+
+\protected\def\sseq@IfValidDifferentialTF{\sseq@IfValidDifferential{TF}}
+\protected\def\sseq@IfValidDifferentialT{\sseq@IfValidDifferential{T}}
+\protected\def\sseq@IfValidDifferentialF{\sseq@IfValidDifferential{F}}
+
+\protected\def\sseq@IfValidDifferential#1{%
+ \bgroup
+ \def\sseq@truefalseclauses{#1}
+ \sseq@d@grabpage{\sseq@IfValidDifferential@}
+}
+
+\DeclareDocumentCommand \sseq@IfValidDifferential@ { d() d() } {%
+ \sseq@eval{\egroup\exp_not:c{sseq_if_valid_differential:nn\sseq@truefalseclauses}{\sseq@dpage}{\IfNoValueTF{#1}{\lastclass0}{\unexpanded{#1}}}{\unexpanded{#2}}}%
+}
+
+\prg_new_conditional:Npnn \sseq_if_valid_differential:nn #1 #2 #3 { T, F, TF } {
+ \bgroup
+ \sseq@tempiftrue
+ \sseq@ifintexpr{#1}{%
+ \edef\sseq@pagenum{\the\numexpr#1\relax}
+ }{%
+ \sseq@break% return false
+ }%
+ \sseq@quiet@parsecoord
+ \msg_redirect_name:nnn {spectralsequences} {d-wrong-degree} {none}
+ \msg_redirect_name:nnn {spectralsequences} {d-target-index-target-coord} {none}
+ \msg_redirect_name:nnn {spectralsequences} {d-named-coord-two-indexes} {none}
+ \msg_redirect_name:nnn {spectralsequences} {d-hit-wrong-order} {none}
+ \msg_redirect_name:nnn {spectralsequences} {d-class-already-hit} {none}
+ \msg_redirect_name:nnn {spectralsequences} {d-hit-same-page-replaceclass}{none}
+ \sseq@dparsecoord{\sseq@pagenum}{#2}{#3}
+ \let\sseq@obj@xdef\@gobbletwo
+ \sseq@d@setpageclass{class.\source}{\sseq@pagenum}{source}
+ \sseq@d@setpageclass{class.\target}{\sseq@pagenum}{target}
+ \@gobbletwo\sseq@breakpoint\sseq@tempiffalse
+ \ifsseq@tempif
+ \egroup
+ \prg_return_true:
+ \else
+ \egroup
+ \prg_return_false:
+ \fi
+}
+
+
+
+\sseq@DeclareDocumentCommand \IfExistsTF { r() } { \sseq_if_exists:nTF { #1 } }
+\sseq@DeclareDocumentCommand \IfExistsT { r() } { \sseq_if_exists:nT { #1 } }
+\sseq@DeclareDocumentCommand \IfExistsF { r() } { \sseq_if_exists:nF { #1 } }
\sseq@DeclareDocumentCommand \IfOutOfBoundsTF { r() } { \sseq_if_out_of_bounds:nTF { #1 } }
\sseq@DeclareDocumentCommand \IfOutOfBoundsT { r() } { \sseq_if_out_of_bounds:nT { #1 } }
@@ -948,6 +1125,10 @@
\sseq@DeclareDocumentCommand \IfInBoundsT { r() } { \sseq_if_out_of_bounds:nF { #1 } }
\sseq@DeclareDocumentCommand \IfInBoundsF { r() } { \sseq_if_out_of_bounds:nT { #1 } }
+\sseq@DeclareDocumentCommand \IfAliveTF { mr() }{ \sseq_if_alive:nnTF{#1}{#2}}
+\sseq@DeclareDocumentCommand \IfAliveT { mr() } { \sseq_if_alive:nnT{#1}{#2}}
+\sseq@DeclareDocumentCommand \IfAliveF { mr() } { \sseq_if_alive:nnF{#1}{#2}}
+
%%%%%%
%%%
@@ -1201,13 +1382,15 @@
}
}
-\def\sseq@tikzprimitives@coords@maybenamedclass#1{
+\def\sseq@tikzprimitives@coords@maybenamedclass#1{%
\sseq@tikzprimitive@getcoord@anchor#1.\sseq@nil % puts coord into \sseq@tempcoord, anchor if any into \sseq@tempanchor
- \sseq@protectedeval{\@nx\sseq@obj@ifdef{class.namedclass.\@nx\detokenize{\sseq@tempcoord}}}{% need this detokenize here to prevent it from throwing errors when there's a command inside...
- \sseq@x@addto@macro\sseq@thepathsofar{(sseq{\sseq@obj{class.namedclass.\sseq@tempcoord}\sseq@tempanchor})}
- }{
- \sseq@tikzprimitives@coords@notaclass{#1}
- }
+ \protected@edef\sseq@tempcoord{\sseq@tempcoord}%
+ % need this detokenize here to prevent it from throwing errors when there's a command inside...
+ \sseq@obj@ifdef{class.namedclass.\detokenize\@xp{\sseq@tempcoord}}{
+ \sseq@x@addto@macro\sseq@thepathsofar{(sseq{\sseq@obj{class.namedclass.\detokenize\@xp{\sseq@tempcoord}}\sseq@tempanchor})}%
+ }{%
+ \sseq@tikzprimitives@coords@notaclass{#1}%
+ }%
}
\let\sseq@tikzprimitives@coords@maybeclass@save\sseq@tikzprimitives@coords@maybeclass
@@ -1255,7 +1438,7 @@
\edef\sseq@index{,\unexpanded\@xp{\sseq@removecomma#3\sseq@nil}}
\edef\sseq@indexnocomma{\unexpanded\@xp{\sseq@removecomma#3\sseq@nil}}
}
- \sseq@ifpgfmathexpr{#1}{
+ \sseq@ifpgfmathexpr{#1}{%
% Decide whether we can keep the result, which is stored in \sseq@mathresult
\protected@edef\sseq@tempa{#1}
\edef\sseq@tempb{#1}
@@ -1388,25 +1571,46 @@
% We need to check for math subscript characters
\char_set_catcode_math_subscript:N \_
-\protected\def\sseqnormalizemonomial#1{
+\def\sseq@support@std{}
+\protected\def\SseqNormalizeMonomialSetVariables#1{%
\bgroup
- \def\sseq@support{}
- \sseq@ifempty{#1}{1}{
+ \gdef\sseq@support@std{}%
+ \def\sseqnormalizemonomial@add{%
+ \def\temp{1}%
+ \ifx\sseq@var\temp\else
+ \edef\sseq@var{\unexpanded\@xp{\sseq@var}\unexpanded\@xp{\sseq@subscript}}%
+ \@ifundefined{\sseqnormalizemonomial@varcs}{%
+ \@xp\xdef\csname\sseqnormalizemonomial@varcs\endcsname{0}%
+ \sseq@x@addto@macro\sseq@support@std{\@nx\\{\unexpanded\@xp{\sseq@var}}{\sseqnormalizemonomial@varcs}}%
+ }{}%
+ \fi
+ \sseqnormalizemonomial@testend
+ }%
+ \SseqNormalizeMonomial{#1}%
+ \egroup
+}
+
+
+\protected\def\SseqNormalizeMonomial#1{%
+ \bgroup
+ \def\sseq@ourinput{#1}%
+ \let\sseq@support\sseq@support@std
+ \sseq@ifempty{#1}{\egroup\def\result{1}}{%
\sseqnormalizemonomial@#1\sseq@nil
- }
+ }%
}
-\def\sseqnormalizemonomial@#1{
- \pgfkeys@spdef\sseq@var{#1}
- \def\sseq@power{1}
- \def\sseq@subscript{}
+\def\sseqnormalizemonomial@#1{%
+ \pgfkeys@spdef\sseq@var{#1}%
+ \def\sseq@power{1}%
+ \def\sseq@subscript{}%
\futurelet\testtok\sseqnormalizemonomial@@
}
-\def\sseqnormalizemonomial@@{
- \ifx\testtok^
+\def\sseqnormalizemonomial@@{%
+ \ifx\testtok^%
\let\next\sseqnormalizemonomial@sup
\else
- \ifx\testtok_
+ \ifx\testtok_%
\let\next\sseqnormalizemonomial@sub
\else
\let\next\sseqnormalizemonomial@add
@@ -1415,40 +1619,46 @@
\next
}
-\def\sseqnormalizemonomial@sup^#1{
- \edef\sseq@power{\the\numexpr#1\relax}
+\def\sseqnormalizemonomial@sup^#1{%
+ \sseq@ifintexpr{#1}{%
+ \edef\sseq@power{\the\numexpr#1\relax}%
+ }{%
+ \sseq@error@xxx{NormalizeMonomial-invalid-exponent}{\unexpanded{#1}}{\unexpanded\@xp{\sseq@var}}{\unexpanded\@xp{\sseq@ourinput}}
+ \let\result\sseq@ourinput
+ \sseq@gobble@to@nil
+ }
\futurelet\testtok\sseqnormalizemonomial@@
}
-\def\sseqnormalizemonomial@sub_#1{
- \def\sseq@subscript{_{#1}}
+\def\sseqnormalizemonomial@sub_#1{%
+ \def\sseq@subscript{_{#1}}%
\futurelet\testtok\sseqnormalizemonomial@@
}
-\def\sseqnormalizemonomial@add{
- \def\temp{1}
+\def\sseqnormalizemonomial@add{%
+ \def\temp{1}%
\ifx\sseq@var\temp\else
- \edef\sseq@var{\unexpanded\@xp{\sseq@var}\unexpanded\@xp{\sseq@subscript}}
- \@ifundefined{\sseqnormalizemonomial@varcs}{
- \@xp\edef\csname\sseqnormalizemonomial@varcs\endcsname{\sseq@power}
+ \edef\sseq@var{\unexpanded\@xp{\sseq@var}\unexpanded\@xp{\sseq@subscript}}%
+ \@ifundefined{\sseqnormalizemonomial@varcs}{%
+ \@xp\edef\csname\sseqnormalizemonomial@varcs\endcsname{\sseq@power}%
\sseq@e@addto@macro\sseq@support{\@nx\\{\unexpanded\@xp{\sseq@var}}{\sseqnormalizemonomial@varcs}}%
- }{
- \@xp\edef\csname\sseqnormalizemonomial@varcs\endcsname{\the\numexpr\csname\sseqnormalizemonomial@varcs\endcsname + \sseq@power}
- }
+ }{%
+ \@xp\edef\csname\sseqnormalizemonomial@varcs\endcsname{\the\numexpr\csname\sseqnormalizemonomial@varcs\endcsname + \sseq@power}%
+ }%
\fi
\sseqnormalizemonomial@testend
}
-\def\sseqnormalizemonomial@testend{
+\def\sseqnormalizemonomial@testend{%
\ifx\testtok\sseq@nil
\sseqnormalizemonomial@done
- \sseq@smuggle@macro\processedlabel
+ \sseq@smuggle@macro\result
\egroup
\let\next\@gobble
\else
\@xp\ifx\space\testtok
- \def\next{\@xp\futurelet\@xp\testtok\@xp\sseqnormalizemonomial@testend\romannumeral-`0}
+ \def\next{\@xp\futurelet\@xp\testtok\@xp\sseqnormalizemonomial@testend\romannumeral-`0}%
\else
\let\next\sseqnormalizemonomial@
\fi
@@ -1458,22 +1668,22 @@
\def\sseqnormalizemonomial@varcs{sseqnormalizemonomial@var@\detokenize\@xp{\sseq@var}}
-\def\sseqnormalizemonomial@done{
- \def\processedlabel{}
- \def\\##1##2{
+\def\sseqnormalizemonomial@done{%
+ \def\result{}%
+ \def\\##1##2{%
\sseq@tempcount=\csname ##2\endcsname\relax
\ifnum\sseq@tempcount=\z@
\else
\ifnum\sseq@tempcount=\@ne
- \sseq@d@addto@macro\processedlabel{##1}
+ \sseq@d@addto@macro\result{##1}%
\else
- \sseq@e@addto@macro\processedlabel{\unexpanded{##1}^{\the\sseq@tempcount}}
+ \sseq@e@addto@macro\result{\unexpanded{##1}^{\the\sseq@tempcount}}%
\fi
\fi
- }
+ }%
\sseq@support
- \ifx\processedlabel\pgfutil@empty % use 1 for empty monomial
- \def\processedlabel{1}
+ \ifx\result\pgfutil@empty % use 1 for empty monomial
+ \def\result{1}%
\fi
}
@@ -1481,6 +1691,44 @@
\catcode`\_ = 11\relax
+\def\SseqAHSSNameHandler#1{
+ \pgfutil@in@[{#1}
+ \ifpgfutil@in@
+ \@xp\@firstofone
+ \else
+ \sseq@error{AHSSNameHandler-missing-cell}{#1}
+ \def\result{#1}
+ \@xp\@gobble
+ \fi{
+ \SseqAHSSNameHandler@#1\sseq@nil
+ }
+}
+
+
+\def\SseqAHSSNameHandler@#1[#2\sseq@nil{
+ \pgfutil@in@]{#2}
+ \ifpgfutil@in@
+ \@xp\@firstofone
+ \else
+ \sseq@error{AHSSNameHandler-missing-cell}{#1[#2}
+ \def\result{#1[#2}
+ \@xp\@gobble
+ \fi{
+ \SseqAHSSNameHandler@@{#1}#2\sseq@nil
+ }
+}
+
+\def\SseqAHSSNameHandler@@#1#2]#3\sseq@nil{
+ \SseqNormalizeMonomial{#1#3}
+ \sseq@ifintexpr{#2}{
+ \edef\result{\unexpanded\@xp{\result}[\the\numexpr#2+\sseq@y]}
+ }{
+ \sseq@error{AHSSNameHandler-invalid-integer}{#2}{#1[#2]#3}
+ \edef\result{\unexpanded\@xp{\result[#2]}}
+ }
+}
+
+
-\ExplSyntaxOff \ No newline at end of file
+\ExplSyntaxOff