summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib/spectralsequences/examples
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/pgf/contrib/spectralsequences/examples
Initial commit
Diffstat (limited to 'graphics/pgf/contrib/spectralsequences/examples')
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ANSS-S_2.pdfbin0 -> 107163 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ANSS-S_2.tex174
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ANSS-S_3.pdfbin0 -> 48774 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ANSS-S_3.tex92
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ASS-S_2.pdfbin0 -> 193243 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ASS-S_2.tex397
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ASS-S_3.pdfbin0 -> 77839 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ASS-S_3.tex158
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ASS-tmf_2.pdfbin0 -> 221884 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/ASS-tmf_2.tex284
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/HFPSS-EO2_3.pdfbin0 -> 91999 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/HFPSS-EO2_3.tex75
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/HFPSS-KO.pdfbin0 -> 38364 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/HFPSS-KO.tex90
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/J_RPinfty.pdfbin0 -> 149054 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/J_RPinfty.tex136
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/MaySS-bo-A(1).pdfbin0 -> 56664 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/MaySS-bo-A(1).tex76
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/MaySS-tmf-A(2).pdfbin0 -> 139996 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/MaySS-tmf-A(2).tex233
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/SSS-KF3n.pdfbin0 -> 87417 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/SSS-KF3n.tex323
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/SSS-KZ3.pdfbin0 -> 67087 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/SSS-KZ3.tex133
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/hatcher.pdfbin0 -> 25895 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/hatcher.tex126
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/unstable_ASS_SO.pdfbin0 -> 20766 bytes
-rw-r--r--graphics/pgf/contrib/spectralsequences/examples/unstable_ASS_SO.tex78
28 files changed, 2375 insertions, 0 deletions
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_2.pdf b/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_2.pdf
new file mode 100644
index 0000000000..63b932aaa3
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_2.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_2.tex b/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_2.tex
new file mode 100644
index 0000000000..777a3303fa
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_2.tex
@@ -0,0 +1,174 @@
+%%
+%% Description: Adams Novikov Spectral Sequence for $S_2$
+
+\documentclass[tooltips]{spectralsequence-example}
+
+% figure out how to get width("\noexpand\small 16") working
+\sseqset{ppower/.sseq style={
+ rectangle,"#1" {inside, font=\tiny},
+ minimum height=width("16"),
+ minimum width=width("16")
+}}
+\sseqnewfamily{imJ}
+\begin{document}
+
+\NewSseqCommand\etaclass{O{}d()}{
+ \IfNoValueF{#2}{\pushstack(#2)}
+ \class[#1](\lastx+1,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+\NewSseqCommand\divetaclass{O{}d()}{
+ \IfNoValueF{#2}{\pushstack(#2)}
+ \class[#1](\lastx-1,\lasty-1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+\NewSseqCommand\nuclass{O{}d()}{
+ \IfNoValueF{#2}{\pushstack(#2)}
+ \class[#1](\lastx+3,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+\NewSseqCommand\nustruct{d()}{
+ \IfNoValueF{#1}{\pushstack(#1)}
+ \structline(\lastx-3,\lasty-1,-1)(\lastclass)
+}
+
+\begin{sseqdata}[
+ name=ANSS-S_2, Adams grading,
+ class labels={below},
+ %label distance=-1pt,
+ below label distance=0pt,
+ classes={tooltip={(\xcoord,\ycoord)}},
+ class pattern = linear,
+ class placement transform={rotate=90,scale=2},
+ differentials=blue,
+ x range={0}{40},
+ y range={0}{10},
+ xscale=0.7,
+ yscale=1.7,
+ grid=go,
+ right clip padding=2em
+]
+\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)
+\nustruct
+\structline[dashed](3,1)(3,3)
+
+
+\class["\alpha_3"](5,1)
+\d3(\lastclass)
+\DoUntilOutOfBounds{\etaclass\d3(\lastclass)}
+
+\class["\alpha_{4/4}",ppower=16](7,1)
+\DoUntilOutOfBoundsThenNMore{3}{\etaclass}
+
+\class["\alpha_{5}"](9,1)
+\DoUntilOutOfBoundsThenNMore{3}{\etaclass}
+
+\class["\alpha_{6/3}", circlen=3](11,1)
+\d3(\lastclass)
+\DoUntilOutOfBounds{\etaclass\d3(\lastclass)}
+\replaceclass["\alpha_{6/2}", circlen=2](11,1)
+\structline[dashed](11,1)(11,3)
+
+\class["\alpha_7"](13,1)
+\d3(\lastclass)
+\DoUntilOutOfBounds{\etaclass\d3(\lastclass)}
+
+
+\class["\alpha_{8/5}",ppower=32](15,1)
+\DoUntilOutOfBoundsThenNMore{3}{\etaclass}
+
+\class["\alpha_9"](17,1)
+\DoUntilOutOfBoundsThenNMore{3}{\etaclass}
+
+\class["\alpha_{10/3}",circlen=3](19,1)
+\d3(\lastclass)
+\DoUntilOutOfBounds{\etaclass\d3(\lastclass)}
+\replaceclass["\alpha_{10/2}",circlen=2](19,1)
+\structline[dashed](19,1)(19,3)
+
+\class["\alpha_{11}"](21,1)
+\d3(\lastclass)
+\DoUntilOutOfBounds{\etaclass\d3(\lastclass)}
+\end{scope}
+
+\class["\beta_{2/2}"](6,2)
+\nustruct
+\class["\beta_{2}" below](8,2)
+\etaclass\structline(\lastclass)(6,2,2) % This is a *nu
+
+\class["\beta_3" left,insert = 1](14,2)
+\etaclass[insert=1](14,2,-1)
+\divetaclass["\beta_{4/4}" left, insert = 2]
+\nuclass(14,2,2)\nuclass[circlen=2]\nuclass[circlen=3]\nuclass["P\beta_{2/2}" above left]
+\nuclass\divetaclass["P\beta_2"]
+
+
+\class["\beta_{4/3}",insert=1](16,2)
+\etaclass[insert=1]\etaclass[insert=1]
+\class["\beta_{4/2,2}",circlen=2](18,2)
+\structline[dashed,](18,2,-1)(18,4,-1)
+
+\class["\eta_2"](19,3)
+\etaclass
+
+\class["\beta_{4}"below](20,2)
+\structline[dashed,bend left=20](20,2,-1)(20,4,2)
+%\structlineoptions[](20,2,-1)(20,4,2)%page=0--3
+\etaclass\etaclass\structline(\lastclass)(\lastx+1,\lasty+1,-1)
+
+\nuclass["\alpha_{4/4}^3" {above left=-1pt}](18,2,-1)
+
+
+
+\class["\eta_{3/2}"](23,3)
+\etaclass\etaclass
+
+\class["\beta_5" below](26,2)
+\d3(\lastclass,-1)
+
+\class["\beta_{8/8}" ](30,2)
+\etaclass
+\class["\beta_{6/2}" left](30,2)
+\d5(\lastclass)
+
+\class["\gamma_3" left](31,3)
+\nuclass
+\class["\eta_{5/3}"](33,4)
+
+\class["\beta_{8/7}"](32,2)
+\etaclass\etaclass\etaclass\etaclass\etaclass\etaclass
+\class["\beta_{6}"left](32,2)\etaclass
+
+\class["x_{32}"](32,4)\etaclass\etaclass["P\beta_{4/4}" right]
+\class["x_{36}"](36,4)
+\nuclass(32,4,-1)\nuclass
+
+\class["P\beta_3" above left](34,6)\etaclass\nuclass(34,6,-1)
+
+\class["\beta_{8/6,2}",circlen=2](34,2)
+\etaclass\nuclass(\lastclass1)
+
+\class["\gamma_{4/2,2}" right](37,3)
+\class["\beta_{8/4,2}",circlen=2](38,2)
+\class["\beta_{7}" right](38,2)
+\class["d_{4/4}\beta_{8/7}" right](39,3)
+\class["x''_{39}" right](39,3)
+\class["\gamma_{4,2}" right](39,3)
+\class["x_{39}'"](39,5)
+\class["P\eta_2"](39,7)
+\end{sseqdata}
+
+\printpage[name=ANSS-S_2]
+
+\printpage[name=ANSS-S_2,page=5]
+
+\printpage[name=ANSS-S_2, no imJ]
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_3.pdf b/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_3.pdf
new file mode 100644
index 0000000000..9423dd535a
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_3.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_3.tex b/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_3.tex
new file mode 100644
index 0000000000..3c8f3af0a7
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ANSS-S_3.tex
@@ -0,0 +1,92 @@
+%%
+%% Description: Adams Novikov Spectral Sequence for $S_3$
+%%
+%% File: example_anss3.tex
+%%
+%% Draws the Adams Novikov spectral sequence at the prime 3 through the 45 stem.
+%% In this range, all we see is the Toda differential d_{2p-1}(\beta_{p/p}) = \alpha\beta^p
+%% Thanks to Eric Peterson for contributing this diagram. Presumably he copied it from page 13 of the green book.
+%% Compare this to page 5 of example_ass3
+%%
+
+\documentclass[tooltips]{spectralsequence-example}
+\begin{document}
+% tower definitions
+\NewSseqCommand\alphaclass{d()}{
+ \IfNoValueTF{#1}{}{\pushstack(#1)}
+ \class(\lastx+3,\lasty+1)
+ \structline(\lastclass)(\lastclass1)
+}
+
+\NewSseqCommand\betaclass{d()}{
+ \IfNoValueTF{#1}{}{\pushstack(#1)}
+ \class(\lastx+7,\lasty+1)
+ \structline(\lastclass)(\lastclass1)
+}
+
+\centering
+\begin{sseqpage}[
+ Adams grading,
+ classes = { tooltip = {(\xcoord,\ycoord)}, inner sep=1.2pt },
+ class labels = below,
+ label distance=3pt,
+ differentials={-{>[width=4]}, target anchor=-60},
+ y range={0}{11},
+ x range={0}{45},
+ x tick step=5,
+ xscale=0.7,
+ yscale=1.2,
+ y axis gap=2em
+]
+\class[rectangle,fill,inner sep=3pt](0,0)
+
+\class["\alpha_1"](3,1) \structline(0,0)(3,1)
+\class["\alpha_2"](7,1)
+\class[circlen=2,"\alpha_{3/2}"](11,1)
+\class["\alpha_4"](15,1)
+\class["\alpha_5"](19,1)
+\class[circlen=2,"\alpha_{6/2}"](23,1)
+\class["\alpha_7"](27,1)
+\class["\alpha_8"](31,1)
+\class[circlen=3,"\alpha_{9/3}"](35,1)
+\class["\alpha_{10}"](39,1)
+\class["\alpha_{11}"](43,1)
+
+\class["\beta_1"](10,2) \structline(3,1)(10,2)
+\class["\beta_2" left](26,2)
+\class["\beta_{3/3}" left](34,2)
+\class["\beta_{3/2}" {left}](38,2)
+\class["\beta_3" left](42,2)
+
+% tower off of beta_1
+\alphaclass(10,2)\betaclass
+\alphaclass\betaclass
+\alphaclass\betaclass
+\alphaclass\betaclass
+
+% tower off of beta_2
+\alphaclass(26,2)\betaclass
+\alphaclass\betaclass
+\alphaclass
+
+
+% tower off of beta_3/3
+\alphaclass(34,2)\betaclass
+\alphaclass\betaclass
+
+% tower off of beta_3
+\class[fill,circlen=2](45,3) \structline(42,2,-1)(45,3,-1)
+\betaclass
+
+% d5s
+\d5(34,2)
+\d5(44,4)
+
+%% Doug's contributions
+\classoptions["{\left<\alpha_1,\alpha_1,\beta_1^3\right>}" {below right=0em}](37,3)
+\structline[dashed](37,3)(40,8)
+
+
+\end{sseqpage}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ASS-S_2.pdf b/graphics/pgf/contrib/spectralsequences/examples/ASS-S_2.pdf
new file mode 100644
index 0000000000..34323e4f33
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ASS-S_2.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ASS-S_2.tex b/graphics/pgf/contrib/spectralsequences/examples/ASS-S_2.tex
new file mode 100644
index 0000000000..be6f88249f
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ASS-S_2.tex
@@ -0,0 +1,397 @@
+%%
+%% Description: Adams Novikov Spectral Sequence for $S_2$
+%%
+%%
+%% Draws the Adams Spectral Sequence at the prime 2 through the 45 stem.
+%% See pages 146 - 147 of Green book
+%% https://mathoverflow.net/questions/102316/differentials-in-the-adams-spectral-sequence-for-spheres-at-the-prime-p-2
+%% https://en.wikipedia.org/wiki/Homotopy_groups_of_spheres#Table_of_stable_homotopy_groups
+%%
+
+
+\documentclass[tooltips]{spectralsequence-example}
+
+
+\begin{document}
+\sseqset{imJ/.sseq style={purple}}
+
+
+\NewSseqCommand\twoclass{O{}d()}{
+ \IfNoValueF{#2}{\pushstack(#2)}
+ \class[#1](\lastx,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+\NewSseqCommand\divtwoclass{O{}d()}{
+ \IfNoValueF{#2}{\pushstack(#2)}
+ \class[#1](\lastx,\lasty-1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+
+\NewSseqCommand\etaclass{O{}d()}{
+ \IfNoValueF{#2}{\pushstack(#2)}
+ \class[#1](\lastx+1,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+}
+\NewSseqCommand\divetaclass{O{}d()}{
+ \IfNoValueF{#2}{\pushstack(#2)}
+ \class[#1](\lastx-1,\lasty-1)
+ \structline(\lastclass1)(\lastclass)
+}
+\NewSseqCommand\etastruct{d()}{
+ \IfNoValueF{#1}{\pushstack(#1)}
+ \structline(\lastx-1,\lasty-1,-1)(\lastclass)
+}
+
+
+\NewSseqCommand\nuclass{O{}d()}{
+ \IfNoValueF{#2}{\pushstack(#2)}
+ \class[#1](\lastx+3,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+\NewSseqCommand\nustruct{d()}{
+ \IfNoValueF{#1}{\pushstack(#1)}
+ \structline(\lastx-3,\lasty-1,-1)(\lastclass)
+}
+
+\NewSseqCommand\hznudiamond{d()}{
+ \IfNoValueF{#1}{\pushstack(#1)}
+ \savestack
+ \class(\lastx,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+ \nustruct
+ \restorestack
+}
+
+\NewSseqCommand\etanudiamond{d()}{
+ \IfNoValueF{#1}{\pushstack(#1)}
+ \savestack
+ \class(\lastx+1,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+ \nustruct
+ \restorestack
+}
+
+\NewSseqCommand \czero {O{} r() }{
+ \savestack
+ \class[#1](#2)
+ \etaclass
+ \restorestack
+}
+
+\NewSseqCommand\tower {O{}d()mO{}} {
+ \begin{scope}[#4]
+ \IfNoValueF{#2}{\class[#1](#2)}
+ \savestack
+ \Do{#3-1}{
+ \class(\lastx, \lasty+1)
+ \structline(\lastclass)(\lastclass1)
+ }
+ \restorestack
+ \end{scope}
+}
+
+
+\NewSseqCommand \towergroup {o r() m O{}} {
+ \tower(#2){#3}[#4]
+ \IfNoValueF{#1}{\classoptions[#1](#2)}
+ \etaclass\etaclass\etaclass
+ \nustruct\divtwoclass\nustruct\divtwoclass
+ \nustruct\nuclass
+}
+
+
+\protected\def\Psqvphant{\vphantom{P^2}}
+\NewSseqGroup \Phone { mm } {
+ \class["#1h_1#2"](0,0)
+ \etaclass\etaclass
+ \divtwoclass\divtwoclass["\Psqvphant#1h_2#2" {below=-4pt}]
+}
+
+\NewSseqGroup \Phonegroup {G{}}{
+ \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]
+ \etaclass\etaclass\etaclass
+ \nustruct\divtwoclass\nustruct\divtwoclass\nustruct\divtwoclass["#1e_0" left,name=e0]
+ \nuclass\hznudiamond
+ \divtwoclass
+ \classoptions["#1g" {below=0.3em},page=0-3](\lastclass)
+ %\etanudiamond
+
+ % Have to go back and draw path e0 to g
+ \savestack
+ \d2(e0,-1)
+ \etaclass(e0)\d2(\lastclass,-1)
+ \divtwoclass[name=f0]\d2(\lastclass,-1)
+ \nuclass[name=nuf0]
+ \etastruct % Now we're back at g
+ \restorestack
+ \nuclass[name=nug]\hznudiamond\nuclass[name=nu2g]
+}
+
+
+\NewSseqGroup \Phonegroupb {G{}}{
+ \Phonegroup{P#1}
+
+ \divtwoclass["\Psqvphant#1j" {below left=-1pt,yshift=2pt}](f0) \d2(\lastclass,-1)
+ \divtwoclass(nuf0) \d2(\lastclass,-1)
+ \nustruct\divtwoclass["\Psqvphant#1k" {below=-1pt}] \d2(\lastclass,-1)
+ \nuclass\d2(\lastclass,-1)
+ \hznudiamond
+ \divtwoclass["\Psqvphant#1l" {below left=-1pt,yshift=2pt}]\d2(\lastclass,-1)
+ \nuclass\d2(\lastclass,-1)\hznudiamond
+ \divtwoclass["\Psqvphant#1m" {below left=-3pt},name=m]
+
+ \divtwoclass(nug)\structline(\lastclass)(\lastx+1,\lasty+1)
+ \divtwoclass(nu2g)\nustruct
+ \divtwoclass\structline(\lastclass)(\lastx+1,\lasty+1)
+ \d2(m,-1)
+}
+
+
+
+\begin{sseqdata}[
+ name = ASS-S_2,
+ Adams grading,
+ classes=fill,
+ class labels={above left=0.2em,black},
+ x range={0}{46},
+ y range={0}{23},
+ differentials = blue,
+ classes = { tooltip = { (\xcoord,\ycoord) } },
+ grid = go,
+ run off = -
+]
+\towergroup(0,0){\ymax-\ymin+2}
+\classoptions["h_2" below](3,1)
+\nuclass
+\divetaclass\divetaclass["h_3" below]
+\tower{4}
+
+
+\Phonegroup(9,5)
+\classoptions["f_0"](f0)
+
+\Phonegroupb(17,9)
+\pushstack(d0)
+\tower["i" {below left,yshift=2pt}](23,7){6}[imJ]
+\structline(\lastclass)(\lastx+3,\lasty+1,-1)
+\structline(\lastx,\lasty+1)(\lastx+3,\lasty+2,-1)
+\d2(23,7)
+\d2(23,8)
+
+\Phonegroupb(25,13){P}
+\Phonegroupb(33,17){P^2}
+\tower["P^2i" {below left,yshift=2pt}](39,15){6}[imJ]
+\structline(\lastclass)(\lastx+3,\lasty+1,-1)
+\structline(\lastx,\lasty+1)(\lastx+3,\lasty+2,-1)
+\d2(39,15)
+\d2(39,16)
+\d4(39,12)
+\d4(40,13,,1)
+
+\Phonegroup(41,21){P^4}
+\tower["P^2i" {below left,yshift=2pt}](47,19){6}[imJ]
+\d2(47,19)
+\d2(47,20)
+
+\towergroup["h_4" below](15,1){8}[imJ]
+\classoptions["h_3^3" below](\lastclass)
+
+\tower["h_3^2" left](14,2){2}
+\d2(15,1) % d2(h_4) = h_0h_3^2
+\d3(15,2)\d3(15,3) % d2(h_0h_4) = h_0d_0
+
+\class["c_1"](19,3)\nuclass
+\czero["h_4c_0"](23,4)
+
+
+
+\towergroup["h_5" below](31,1){16}[imJ]
+\nuclass
+\divetaclass\divetaclass["h_3h_5" {below=-2pt}]
+\tower{4}
+
+\class["n"{above=-0.5pt}](31,5)
+\nuclass\nuclass
+\divetaclass["t"]
+\nuclass["c_1g"]
+
+\class["q" {below right=-0.7pt}](32,6)
+\etaclass
+
+\class["p"](33,4)
+\twoclass\divetaclass["d_1"]
+\nuclass\nuclass
+\divetaclass["x" below]\tower{6}
+
+\d[bend left=15]4(38,3,,2)
+\d[bend left=30]4(38,2)
+
+
+\tower["h_4^2" below](30,2){4}
+\etaclass
+\tower["r" left](30,6){6}
+\d3(\lastclass)
+
+\d2(31,1)\d2(31,2)\d2(31,3)
+\d3(31,4)\d3(31,5)\d3(31,6)\d3(31,7)\d3(31,8,-1)
+\d4(31,8,1)\d4(32,9,,1)
+\d4(31,9,-1,-1)\d4(31,10,-1,-1)
+
+\d3(34,2)
+
+
+\class(38,6)\d2(\lastclass,-1)
+\twoclass\d2(\lastclass,-1)
+\twoclass\nustruct\d2(\lastclass,-1)
+\twoclass\nustruct\d4(\lastclass,-1)
+\divetaclass["e_0g"]\d4(\lastclass,-1)
+
+\czero[pin distance=3em,pin=below right:h_5c_0"](39,4)
+
+\class["e_1" {below=-1pt}](38,4)
+\d3(\lastclass,1)
+\etaclass\etaclass\divtwoclass\divtwoclass["f_1" below]
+\etaclass
+\divtwoclass\d2(\lastclass)
+\divtwoclass\d2(\lastclass,-1)
+
+
+\Phone(40,6){P}{h_5}
+
+\class["u"](39,9)\etaclass\etaclass\divtwoclass
+
+\class["g^2"](40,8)
+\class["v"](42,9)
+\d2(\lastclass)
+
+\tower["P^2r" {below=-4pt}](46,14){6}
+\d3(\lastclass)
+
+\class["Pe_0g" right](45,12)
+\d4(\lastclass)
+
+\class["w"](45,9)
+
+\class["d_0r" right](44,10)
+\d3(\lastclass)
+
+
+\class["h_4^3" below](45,3)\twoclass
+
+\tower["h_5d_0" {below right=-2pt}](45,5){3}
+\etaclass\etaclass
+\nuclass(45,5)\hznudiamond
+\nustruct(45,7)
+
+\tower["g_2" below](44,4){3}
+\etaclass
+
+\class["N"](46,8)
+\class["gj"](46,11)
+
+\tower(47,13){12}
+\foreach \y in {13,...,18} { \d2(47,\y)}
+\end{sseqdata}
+\centering
+
+\begin{sseqpage}[
+ page=7,
+ name=ASS-S_2, Adams grading,
+ class labels={below},
+ %label distance=-1pt,
+ below label distance=0pt,
+ differentials=blue,
+ x range={0}{40},
+ y range={0}{10},
+ xscale=0.7,
+ yscale=1.7,
+ grid=go,
+ right clip padding=2em
+]
+\structline[dashed,bend right=20](15,4)(16,7,1)
+\structline[dashed,bend right=20](23,9,2)(24,11)
+\structline[dashed,bend right=20](31,11)(32,15)
+\structline[dashed,bend right=20](39,17,2)(40,19)
+
+\structline[dashed](14,2)(15,5,1)
+\structline[dashed](21,5)(22,8)
+\structline[dashed,bend right=20](20,6)(23,9,1)
+\structline[dashed](23,6)(23,9,1)
+\structline[dashed,bend right=20](30,2)(33,4)
+\structline[dashed,bend left=20](32,6)(35,9)
+
+\structline[dashed](38,4)(39,7)
+
+\structline[dashed](40,8)(40,10)
+\structline[dashed](40,8)(41,10)
+\structline[dashed,bend left=40](39,9)(42,12)
+\structline[dashed](41,10)(42,12)
+
+\classoptions["h_0^2i" right=1pt](23,9)
+\classoptions["h_0^{10}h_5" left](31,11)
+\classoptions["h_1h_5" below](32,2)
+\classoptions["h_0h_2h_5" below](34,3)
+\classoptions["h_2^2h_5" below](37,3)
+\classoptions["h_0^2h_3h_5" {left=-0.1em}](38,4,1)
+\classoptions["h_1h_3h_5" {below=-.4em}](39,3,1)
+
+\classoptions["Ph_3" left](15,5,1)
+\classoptions["P^2h_3" left](23,9,1)
+%\classoptions["P^3h_3" left](31,13,1)
+%\classoptions["P^4h_3" left](39,17,1)
+\end{sseqpage}
+%\end{document}
+
+\newgeometry{margin = 0.1cm}
+\printpage[name=ASS-S_2,page=2,xscale=0.7,yscale=0.8,keep changes]
+
+%\printpage[name=ASS-S_2,page=2]
+
+\printpage[name=ASS-S_2,page=3]
+
+\printpage[name=ASS-S_2,page=4]
+
+\begin{sseqpage}[name=ASS-S_2,page=5]
+\structline[dashed,bend right=20](15,4)(16,7,1)
+\structline[dashed,bend right=20](23,9,2)(24,11)
+\structline[dashed,bend right=20](31,11)(32,15)
+\structline[dashed,bend right=20](39,17,2)(40,19)
+
+\structline[dashed](14,2)(15,5,1)
+\structline[dashed](21,5)(22,8)
+\structline[dashed,bend right=20](20,6)(23,9,1)
+\structline[dashed](23,6)(23,9,1)
+\structline[dashed,bend right=20](30,2)(33,4)
+\structline[dashed,bend left=20](32,6)(35,9)
+
+\structline[dashed](38,4)(39,7)
+
+\structline[dashed](40,8)(40,10)
+\structline[dashed](40,8)(41,10)
+\structline[dashed,bend left=40](39,9)(42,12)
+\structline[dashed](41,10)(42,12)
+
+\classoptions["g" {below=0.3em}](20,4)
+\classoptions["{d_0^2=Pg=c_0g}" {xshift=5pt, below=-2.15em}](28,8)
+
+
+\classoptions["h_0^2i" right=1pt](23,9)
+\classoptions["h_0^{10}h_5" left](31,11)
+\classoptions["h_1h_5" below](32,2)
+\classoptions["h_0h_2h_5" below](34,3)
+\classoptions["h_2^2h_5" below](37,3)
+\classoptions["h_0^2h_3h_5" {left=-0.1em}](38,4,1)
+\classoptions["h_1h_3h_5" {below=-.4em}](39,3,1)
+
+\classoptions["Ph_3" left](15,5,1)
+\classoptions["P^2h_3" left](23,9,1)
+%\classoptions["P^3h_3" left](31,13,1)
+%\classoptions["P^4h_3" left](39,17,1)
+\end{sseqpage}
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ASS-S_3.pdf b/graphics/pgf/contrib/spectralsequences/examples/ASS-S_3.pdf
new file mode 100644
index 0000000000..88cd00c005
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ASS-S_3.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ASS-S_3.tex b/graphics/pgf/contrib/spectralsequences/examples/ASS-S_3.tex
new file mode 100644
index 0000000000..4a79c6ebb6
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ASS-S_3.tex
@@ -0,0 +1,158 @@
+%%
+%% Description: The Adams Novikov Spectral Sequence for $S_3$, styled to superimpose on ANSS-S_3
+%%
+%% The Adams spectral sequence at the prime 3 through the 45 stem.
+%% Compare page 5 to example_ass3
+%% Copied from page 11 of the green book.
+%%
+
+\documentclass[tooltips]{spectralsequence-example}
+
+\begin{document}
+
+\NewSseqCommand\tower {d()m} {
+ \IfNoValueF{#1}{\class(#1)}
+ \savestack
+ \Do { #2 } {
+ \class(\lastx, \lasty+1)
+ \structline(\lastclass1)(\lastclass)
+ }
+ \restorestack
+}
+
+\NewSseqCommand\hclass {d()}{
+ \IfNoValueF{#1}{\pushstack(#1)}
+ \class(\lastx+3,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+\NewSseqCommand\bclass {d()}{
+ \IfNoValueF{#1}{\pushstack(#1)}
+ \class(\lastx+7,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+\NewSseqCommand\hbachair {d()}{
+ \IfNoValueF{#1}{\pushstack(#1)}
+ \nameclass{tempclass}(\lastclass)
+ \bclass(\lastx,\lasty+1)
+ \hclass
+ \hclass(tempclass)
+ \bclass
+ \structline(\lastclass3)(\lastclass)
+}
+
+\NewSseqCommand\bahclaw { r() } {
+ \class(#1)
+ \bclass
+ \class(\lastx,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+ \class(\lastx-3,\lasty-1)
+ \structline(\lastclass1)(\lastclass)
+ \pushstack(\lastclass2)
+}
+\begin{sseqdata}[
+ name=ass3,
+ Adams grading,
+ classes={fill, inner sep=1.2pt, tooltip={(\xcoord,\ycoord)}},
+ class labels={below,black},
+ differentials=blue,
+ grid = go,
+ x tick step = 5,
+ x range={0}{45},
+ y range={0}{11},
+ xscale=0.7,
+ yscale=1.2,
+ y axis gap=2em
+]
+\tower(0,0){\ymax+1}
+\classoptions["a_0" {left=0pt}](0,1)
+\hbachair
+\classoptions["h_0"](3,1)
+\classoptions["b_0"](\lastclass)
+\classoptions[purple,page=3](7,2)
+\DoUntilOutOfBounds{\hbachair}
+
+\begin{scope}[sseq=purple]
+\class["h_1"](11,1)
+\tower{2}
+\d2(\lastclass)
+\DoUntilOutOfBounds{
+ \bclass\d2(\lastclass)
+ \hclass\d2(\lastclass)
+}
+\end{scope}
+
+\begin{scope}[orange]
+\class["k_0"](26,2)
+\DoUntilOutOfBounds{
+ \hclass\bclass
+}
+\end{scope}
+
+
+\begin{scope}[sseq=purple]
+\bahclaw(15,4)
+\DoUntilOutOfBounds{\hbachair}
+\bahclaw(27,7)
+\DoUntilOutOfBounds{\hbachair}
+\bahclaw(39,10)
+\DoUntilOutOfBounds{\hbachair}
+\bahclaw(38,7)
+\d2(\lastclass1)\d2(\lastclass2)\d2(\lastclass3)\d2(\lastclass4)
+\DoUntilOutOfBounds{
+ \hbachair
+ \d2(\lastclass)\d2(\lastclass1)
+ \d2(\lastclass3)\d2(\lastclass4)
+}
+\end{scope}
+
+
+
+
+\begin{scope}[sseq=purple]
+\class[](23,3) % label me
+\tower{3}
+\d2(\lastclass)\d2(\lastx,\lasty+1)
+\DoUntilOutOfBounds{
+ \hbachair
+ \d2(\lastclass)\d2(\lastclass1)
+ \d2(\lastclass3)\d2(\lastclass4)
+}
+\end{scope}
+
+
+\class["h_2"](35,1)
+\tower{8}
+\DoUntilOutOfBounds{\hbachair}
+
+\begin{scope}[sseq=orange]
+\class["b_{11}"](34,2)
+\tower{4}
+\DoUntilOutOfBounds{
+ \hclass\bclass
+}
+\d5(34,2)
+\d5(44,4)
+\end{scope}
+\foreach \y in {1,...,4}{
+ \d2(35,\y)
+}
+\d3(35,5)\d3(35,6)
+\foreach \y in {7,...,9}{
+ \classoptions[purple,page=4](35,\y,-1)
+}
+
+
+
+
+\end{sseqdata}
+\centering
+\printpage[name=ass3,page=1]
+\newpage
+\printpage[name=ass3,page=2]
+\newpage
+\printpage[name=ass3,page=3]
+\newpage
+\printpage[name=ass3,page=5]
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ASS-tmf_2.pdf b/graphics/pgf/contrib/spectralsequences/examples/ASS-tmf_2.pdf
new file mode 100644
index 0000000000..ba38e1dc08
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ASS-tmf_2.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/ASS-tmf_2.tex b/graphics/pgf/contrib/spectralsequences/examples/ASS-tmf_2.tex
new file mode 100644
index 0000000000..14cd23fc47
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/ASS-tmf_2.tex
@@ -0,0 +1,284 @@
+%%
+%% Description: The Adams spectral sequence for $\tmf_2$
+%%
+%% File: example_tmfass.tex
+%%
+%% From "The Homotopy Groups of tmf and of its Localizations" http://math.mit.edu/conferences/talbot/2007/tmfproc/Chapter16/TmfHomotopy.pdf
+%% This file has really bad performance.
+%%
+
+
+% 9.8 sec
+
+% 1.7 seconds to set up
+% 1.8 seconds to draw the classes
+% 2.1 seconds to draw the edges
+% --> ~5.7 seconds to draw page 0.
+
+% edge drawing time:
+% 1.0s to calculate but discard without off page handling
+% 0.6s to deal with off-page edges
+% 0.3s to draw
+
+% 17 seconds to draw all pages =(
+% 17 ~~ 1.7s setup + 5 page * 3 s/pp
+%
+% 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[tooltips]{spectralsequence-example}
+
+\begin{document}
+
+\NewSseqGroup\tower {} {% 25
+ \class(0,0)
+ \DoUntilOutOfBoundsThenNMore{2}{
+ \class(\lastx,\lasty+1)
+ \structline(\lastclass1) (\lastclass)
+ }
+}
+
+\NewSseqGroup\towergroup {} {%9 + 25 = 36
+ \tower(0,0)
+ \class(1,1)
+ \class(3,1)
+ \class(2,2)
+ \class(3,2)
+ \class(3,3)
+ \class(6,2)
+ \structline(3,1,-1)(3,2,-1)
+ \structline(3,2,-1)(3,3,-1)
+ \structline(0,0,-1)(1,1,-1)
+ \structline(1,1,-1)(2,2,-1)
+ \structline(2,2,-1)(3,3,-1)
+ \structline(0,0,-1)(3,1,-1)
+ \structline(3,1,-1)(6,2,-1)
+ \structline(0,1,-1)(3,2,-1)
+ \structline(0,2,-1)(3,3,-1)
+}
+
+
+\NewSseqGroup\towergroupa {} {%25*2+9+21 = 80
+ \towergroup(0,0)
+ \tower(4,-1)
+%
+ \class(6,0)
+ \class(6,1)
+ \class(7,-1)
+ \class(7,0)
+ \class(7,1)
+ \class(9,0)
+ \class(9,1)
+ \class(9,2)
+ \class(10,0)
+ \class(10,1)
+ \class(12,0)
+ \class(12,1)
+ \class(12,2)
+ \class(13,1)
+ \structline(6,0,-1)(6,1,-1)
+ \structline(6,1,-1)(6,2,-1)
+ \structline(7,-1,-1)(7,0,-1)
+ \structline(7,0,-1)(7,1,-1)
+ \structline(9,0,-1)(9,1,-1)
+ \structline(9,1,-1)(9,2,-1)
+ \structline(10,0,-1)(10,1,-1)
+ \structline(12,0,-1)(12,1,-1)
+ \structline(12,1,-1)(12,2,-1)
+%
+ \structline(4,-1,-1)(7,0,-1)
+ \structline(4,0,-1)(7,1,-1)
+ \structline(6,0,-1)(9,1,-1)
+ \structline(6,1,-1)(9,2,-1)
+ \structline(6,0,-1)(7,1,-1)
+ \structline(7,-1,-1)(10,0,-1)
+ \structline(7,0,-1)(10,1,-1)
+ \structline(9,0,-1)(12,1,-1)
+ \structline(9,1,-1)(12,2,-1)
+ \structline(9,0,-1)(10,1,-1)
+ \structline(10,0,-1)(13,1,-1)
+ \structline(12,0,-1)(13,1,-1)
+%
+ \d2(4,-1,-1,-1)
+ \d2(4,0,-1,-1)
+ \d2(4,1,-1,-1)
+ \d2(7,-1,-1,-1)
+ \d2(7,0,-1,-1)
+ \d2(10,0,-1,-1)
+}
+
+\NewSseqGroup\towergroupb {} {%80 + 25 + 15 = 120
+ \towergroupa(0,0)
+ \tower(8,-2)
+ \class(10,-1)
+ \class(11,-1)
+ \class(10,-2)
+ \class(9,-3)
+ \class(11,-2)
+ \structline(8,-2)(11,-1)
+ \structline(11,-1)(10,-2)
+ \structline(10,-2)(9,-3)
+ \structline(11,-2)(11,-1)
+
+ \class(13,-1)
+ \class(13,0)
+ \class(14,-2)
+ \class(15,0)
+ \class(16,-1)\class(16,-1)
+ \class(16,0)
+ \class(16,1)
+ \class(17,0)
+ \class(18,0)
+ \class(18,1)
+ \class(19,-1)
+ \structline(10,-1,-1)(10,0,-1)
+ \structline(13,0,-1)(13,1,-1)
+ \structline(13,-1,-1)(13,0,-1)
+ \structline(16,0,-1)(16,1,-1)
+ \structline(16,-1,-2)(16,0,-1)
+ \structline(16,-1,-1)(16,0,-1)
+
+ \structline(10,-1,-1)(13,0,-1)
+ \structline(13,-1,-1)(16,0,-1)
+ \structline(13,0,-1)(16,1,-1)
+ \structline(15,0,-1)(18,1,-1)
+ \structline(15,0,-1)(16,1,-1)
+ \structline(16,-1,-1)(17,0,-1)
+ \structline(17,0,-1)(18,1,-1)
+ \structline(18,1,-1)(18,0,-1)
+ \d2(10,-1,-1,-1)
+ \d2(13,-1,-1,-1)
+ \d2(13,0,-1,-1)
+ \d3(14,-2,-1,-1)
+ \d2(19,-1,-1,-1)
+}
+
+\begin{sseqdata}[
+ x range={0}{50},
+ y range={0}{20},
+ x tick step=2,
+ Adams grading,
+ classes={fill,inner sep=0.3ex,tooltip={(\xcoord,\ycoord)}},
+ class placement transform={scale=1.5},
+ differentials={->,blue},
+ struct lines=red, %no struct lines, no differentials,
+ yscale=0.6, xscale=0.5,
+ x axis extend end=0.2cm,
+ name=tmfass,
+ grid=go,
+ run off differentials=->
+]
+
+\towergroup(0,0) % 36
+
+\class(8,3)\class(9,4)
+\structline(8,3)(9,4)
+\towergroupa(8,4) % 80
+
+\foreach \n in {2,3,4}{
+ \towergroupb(8*\n,4*\n) % 120
+}
+
+\foreach \n in {1,2,3,4}{
+ \begin{scope}[xshift=8*\n,yshift=4*\n]
+ \class(8,3)
+ \class(9,4)
+ \structline(8,3,-1)(9,4,-1)
+ \d3(9,0,-1,-1)
+ \d3(10,1,-1,-1)
+ \end{scope}
+}
+
+
+\foreach \n in {1,2,3,5,6,7}{
+ \class(35+2*\n,7+\n)
+}
+
+%\d2(18,4)
+\d3(24,6)
+
+\class(36,9)
+\d2(36,9)
+\d4(37,8)
+\d4(45,12)
+
+
+\class(44,13)
+\d2(44,13)
+\class(45,9)
+\class(47,10)
+\class(49,11)
+\d4(49,11,,1)
+\d4(49,11,,2)
+\replaceclass(48,15,1)
+\towergroupb(40,20)
+\towergroup(48,8)
+\foreach \n in {0,...,5}{
+ \class(40+2*\n,8+\n)
+}
+
+\d3(42,9)
+\d4(44,10)
+\d4(47,16)
+\d2(48,8)
+\d4(48,9)
+\d3(49,9,,2)
+\d3(50,13)
+\class(50,10)
+\d4(50,10,1)
+\d4(50,10,2)
+\replaceclass[offset={(0,0)}](50,10)
+\class(51,12)
+\d4(51,12)
+\class(52,17)
+\d2(52,17)
+
+\foreach \n in {0,4,8}{
+ \d3(32+2*\n,10+\n,1)
+ \d4(31+2*\n,8+\n)
+}
+\end{sseqdata}
+
+
+\printpage[name=tmfass,page=0]
+
+\printpage[name=tmfass,page=2]
+
+\printpage[name=tmfass,page=3]
+
+\printpage[name=tmfass,page=4]
+
+\begin{sseqpage}[name=tmfass,page=5,class labels={below=0.2em},tikz primitives=dashed]
+\classoptions["\eta" {right=0.1em}](1,1)
+\classoptions["\nu" below right](3,1)
+\classoptions["\epsilon"](8,3)
+\classoptions["c_4+\epsilon" left](8,4)
+\classoptions["2c_6"](12,6)
+\classoptions["\kappa"](14,4)
+\classoptions["c_4^2"](16,8)
+\classoptions["\overline\kappa"](20,4)
+\classoptions["8\Delta"](24,7)
+\classoptions["\eta\Delta"](25,5)
+\classoptions["2\nu\Delta"](27,6)
+\classoptions["c_4\Delta+q" left](32,7,1)
+\classoptions["q"](32,7,2)
+\classoptions["\overline\kappa^2"](40,8)
+\classoptions["4\Delta^2"](48,10)
+\draw(6,2)--(9,4);
+\draw(21,5)--(22,8);
+\draw[bend left=20] (25,5) to (28,8);
+\draw (27,6) -- (28,8);
+\draw(32,7,1)--(33,9);
+\draw[bend right=10](32,7,2) to (35,10);
+\draw(34,8) -- (35,10);
+\draw(39,9)--(40,11,2);
+\draw(39,9)--(42,12);
+\draw(40,8)--(40,11,2);
+\draw(40,11,1)--(41,13);
+\draw(40,8)--(41,10) -- (42,12);
+\draw(45,9)--(46,11);
+\draw(48,15,1)--(48,16,1);
+\draw[bend right=20] (48,15,1) to (49,17);
+\structline[black](50,10,2)(51,11)
+\end{sseqpage}
+
+\end{document}
diff --git a/graphics/pgf/contrib/spectralsequences/examples/HFPSS-EO2_3.pdf b/graphics/pgf/contrib/spectralsequences/examples/HFPSS-EO2_3.pdf
new file mode 100644
index 0000000000..8769aa6c7e
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/HFPSS-EO2_3.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/HFPSS-EO2_3.tex b/graphics/pgf/contrib/spectralsequences/examples/HFPSS-EO2_3.tex
new file mode 100644
index 0000000000..0994d69f0f
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/HFPSS-EO2_3.tex
@@ -0,0 +1,75 @@
+%%
+%% Description: The homotopy fixed point spectral sequence for a maximal finite subgroup of $\mathbb{G}_{p-1}$ acting on $E_{p-1}$ with $p=3$
+%%
+%% This is the homotopy fixed point spectral sequence for EO_2 at the prime 3. The maximal finite subgroup of the Morava stabilizer for E_{p-1} is
+%% of size 2p(p-1)^2 = 24, and so there is a norm element v in degree 24. There's also a bunch of trace classes on the zero line, but the trace map
+%% E_* --> H^*( G ; E_* ) is induced by the trace map E_n --> EO_n, so all of these classes are permanent cycles. They are hard to compute and we don't draw them.
+%% We also have classes \alpha and \beta coming from the stabilizer action, which are the images of \alpha_1 and \beta_1 in the ANSS.
+%% By looking at cobar representatives, we can see that v*\beta_1 is the image of \beta_{3/3}.
+%% Thus, the Toda differential in the ANSS d_3(\beta_{3/3}) = \alpha \beta^3 forces also that d_3(v) = \alpha \beta^2. Likewise, the Toda "Kudo" differential
+%% d_9( \alpha \beta_{3/3}^2 ) = \beta^7 gives us upon dividing by \beta twice that d_9(\alpha v^2) = \beta^5. At this point, there are no possible differentials.
+%% We see that v^3 survives so EO_n* is 72 = 2p^2(p-1)^2 periodic. The picture is exactly the same at other odd primes. At 2, this degenerates to the
+%% HFPSS for KO = KU^{hC_2} (see example_KUHFPSS).
+%%
+
+\documentclass[tooltips]{spectralsequence-example}
+
+\begin{document}
+\begin{sseqdata}[name=EO(2),Adams grading,
+ y range={0}{14},x range={0}{160},
+ xscale=0.15, x tick step=5,
+ classes={fill, tooltip={(\xcoord,\ycoord)}},
+ title=Page \page
+]
+\foreach \v in {0,...,8}{
+ \foreach \b in {0,...,11}{
+ \foreach \a in {0,1}{
+ \class(3*\a + 10*\b+24*\v,\a+2*\b)
+ \ifnum\b>0\relax
+ \structline(3*\a+10*\b-10+24*\v,\a+2*\b-2) (3*\a + 10*\b+24*\v,\a+2*\b)
+ \fi
+ }
+ \structline(10*\b+24*\v,2*\b)(3 + 10*\b + 24*\v,2*\b+1)
+ \ifnum \v = \numexpr\v/3*3\relax
+
+ \else
+ \ifnum\b<9\relax
+ \d5(10*\b+24*\v,2*\b)
+ \fi
+ \fi
+ }
+}
+
+% v^2ab^2 is in degree 2*24 + 3 + 2*10 = 71, 5
+% b^{pn+1} = b^{7} is in degree 7*10 = 70,14
+\foreach \v in {2,5}{
+ \foreach \b in {0,...,6}{
+ \d9(\v*24 + 3 +10*\b,1+2*\b)
+ }
+}
+\end{sseqdata}
+\printpage[name=EO(2),page=0,title={\phantom{Page 5}}]
+\newpage
+\printpage[name=EO(2),page=5]
+\newpage
+\printpage[name=EO(2),page=9]
+\newpage
+\begin{sseqpage}[name=EO(2),page=10,title={Page $\infty$}]
+\classoptions["a" left](3,1)
+\classoptions["b" right](10,2)
+\classoptions["ab" left](13,3)
+\classoptions["b^2" right](20,4)
+\classoptions["b^3" right](30,6)
+\classoptions["b^4" right](40,8)
+\classoptions["v^3" right](72,0)
+
+% Doug's additions:
+\classoptions["{\left<a,a,b^2\right>}" below](27,1)
+\structline[dashed](27,1)(30,6)
+\structline[dashed](37,3)(40,8)
+
+\structline[dashed](99,1)(102,6)
+\structline[dashed](109,3)(112,8)
+
+\end{sseqpage}
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/spectralsequences/examples/HFPSS-KO.pdf b/graphics/pgf/contrib/spectralsequences/examples/HFPSS-KO.pdf
new file mode 100644
index 0000000000..4fb86edd2a
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/HFPSS-KO.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/HFPSS-KO.tex b/graphics/pgf/contrib/spectralsequences/examples/HFPSS-KO.tex
new file mode 100644
index 0000000000..a227184ea4
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/HFPSS-KO.tex
@@ -0,0 +1,90 @@
+%%
+%% Description: The homotopy fixed point spectral sequence for $C_2$ acting on $KU$ by complex conjugation, compare the odd-primary case HFPSS-EO2_3
+%%
+%% File: example_KUHFPSS.tex
+%%
+%% 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
+%% shows that \alpha v = \alpha_3, so dividing the differential by \alpha gives d3(v) = \alpha_1^3. Now there's no Kudo differential
+%% because the prime is 2, and the spectral sequence immediately collapses.
+%%
+%% Second, a demonstration of the falsehood of ku^{hC_2} = ko -- ku^{hC_2} has an extra generator as a ring, which is in degree -4.
+%% In particular, it's not even connective.
+%%
+
+\documentclass{spectralsequence-example}
+\begin{document}
+\sseqset{
+ Z2class/.sseq style={circle,inner sep=0.3ex,fill=black},
+ Zclass/.sseq style={fill=none,draw,inner sep=0.6ex},
+ 2Zclass/.sseq style={fill=none,rectangle,draw,inner sep=0.6ex,outer sep=0.5ex}
+}
+\begin{sseqdata}[
+ name=KRHFPSS,
+ x range={-12}{14},
+ y range={0}{10},
+ y axis type=center,
+ y axis gap=0.425cm,
+ tick step=4,
+ classes=Z2class,
+ differentials=->,
+ degree={-1}{#1-1},
+ scale=1.45,
+ right clip padding=0.1cm,
+ top clip padding=0.05cm,
+ x axis extend start=0cm,
+ x axis extend end=0.33cm,
+ y axis extend end=0.3cm,
+ grid=go
+]
+
+% 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}
+\sseqparseint\xmaxpp{\xmax+2}
+
+\foreach \x in {\xitstart,\xitgap,...,\xitend} {
+ \class[Zclass](\x,0)
+ \foreach \z in {0,...,\xmaxpp} {
+ \class(\x+\z+1,\z+1)
+ \structline(\x+\z,\z)(\x+\z+1,\z+1)
+ }
+}
+
+\sseqparseint\xitstart{\xitgap}
+\sseqparseint\xitgap{\xitstart+8}
+
+\foreach \x in {\xitstart,\xitgap,...,\xitend} {
+ \foreach\z in {0,...,\xmax}{
+ \d4(\x+\z,\z)
+ }
+ \replaceclass[2Zclass](\x,0)
+}
+\end{sseqdata}
+\printpage[name=KRHFPSS,page=0]
+\newpage
+\printpage[name=KRHFPSS,page=5]
+
+
+\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}{
+ \doptions[draw=none]4(-\z-1,\z-1)
+ \structlineoptions[draw=none](-\z-1,\z-1)(-\z,\z)
+ \structlineoptions[draw=none](-\z-3,\z+1)(-\z-2,\z+2)
+ \replaceclass(-\z-2,\z+2)
+}
+\structlineoptions[draw=none](-3,1)(-2,2)
+\end{sseqpage}
+\newpage
+\printpage[name=KRHFPSS,page=5]
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/spectralsequences/examples/J_RPinfty.pdf b/graphics/pgf/contrib/spectralsequences/examples/J_RPinfty.pdf
new file mode 100644
index 0000000000..b5729dae9a
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/J_RPinfty.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/J_RPinfty.tex b/graphics/pgf/contrib/spectralsequences/examples/J_RPinfty.tex
new file mode 100644
index 0000000000..d71c48d808
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/J_RPinfty.tex
@@ -0,0 +1,136 @@
+%%
+%% Package: spectralsequences v1.2.2 2017-09-16 2017-09-16
+%% Author: Hood Chatham
+%% Email: hood@mit.edu
+%% Date: 2019-02-18
+%% License: Latex Project Public License
+%%
+%% File: example_endofVFoS.tex
+%%
+%% This is the drawing that got me started making the package. To this day, I don't know what it is. I copied it from Matt Ando's handwritten notes on
+%% Haynes 1990(?) class on Vector Fields on Spheres. It's on the very last page of the second part of the notes, so it must have been the last day of class.
+%% Looking back, I seem to have inferred a bunch of stuff that wasn't actually written down on the page, but I'm not sure how so there's a chance some of it is wrong.
+%%
+
+\documentclass{spectralsequence-example}
+\usepackage{amssymb}
+
+\NewSseqCommand\row { m } {\foreach \x in {1,...,35}{\class(\x,#1)}}
+\NewSseqCommand\twoptrow { m } {\foreach \x in {1,...,35}{\class(\x,#1)\class(\x,#1)}}
+\begin{document}
+\begin{sseqdata}[
+ name=mysseq,
+ x range={1}{25},
+ y range={0}{19},
+ homological Serre grading,
+ classes=fill,
+ permanent classes={circle,red},
+ transient cycles={black},
+ differentials={blue},
+ grid = go,
+ scale=0.9
+]
+
+\foreach \x in {1,3,5,...,35} {\class(\x,0)}
+
+\row{1}
+\row{2}
+\row{3}
+
+\foreach \y in {7,15,23}{
+ \row{\y}
+ \row{\y+1}
+ \twoptrow{\y+2}
+ \row{\y+3}
+ \row{\y+4}
+}
+
+\foreach \x in {9,13,...,25}{
+ \d2(\x,0)
+%
+ \foreach \y in {7,15}{
+ \d2 (\x,\y)
+ \d2 (\x,\y+1,,2)
+ \d2 (\x,\y+2,1,)
+ }
+}
+
+
+
+\foreach \x in {4,8,...,24}{
+ \d2 (\x,1)
+ \d2 (\x,2)
+ \foreach \y in {7,15}{
+ \d2 (\x,\y+1,,2)
+ \d2 (\x,\y+2,1,)
+ \d2 (\x,\y+3)
+ }
+}
+
+
+\foreach \x in {4,8,..., 24,28}
+ \foreach \y in {7,15}{
+ \d3 (\x+2,\y,,1)
+ \d3 (\x,\y+2,2,)
+}
+
+\foreach \x in {11,19,27}{
+ \d4(\x,0)
+}
+
+\foreach \x in {12,20,28}
+ \foreach \y in {7,15}{
+ \d5(\x,\y)
+}
+
+
+
+\foreach \x in {10,18,26,34}{
+ \d7(\x,1)
+ \d7(\x-1,2)
+ \d7(\x-2,3,,2)
+
+ \foreach \y in {9,17}{
+ \d7(\x,\y,1)
+ \d7(\x-1,\y+1)
+ \d7(\x-2,\y+2,,2)
+ }
+}
+
+\d9(15,0)
+\d9(14,1,,2)
+\d10(13,2)
+
+\d8(23,0)
+\d8(22,1)
+\foreach \x in {23,31} {
+ \d8(\x-2,2,,2)
+ \d9(\x-3,3)
+}
+\foreach \x in {16,24,32} {
+ \d9(\x,7)
+ \d8(\x-2,9,1,)
+ \d8(\x-3,10,,2)
+ \d9(\x-4,11)
+}
+\end{sseqdata}
+
+
+\printpage[name=mysseq, page=0]
+\newpage
+\printpage[name=mysseq, page=2]
+\newpage
+\printpage[name=mysseq, page=3]
+\newpage
+\printpage[name=mysseq, page=4]
+\newpage
+\printpage[name=mysseq, page=5]
+\newpage
+\printpage[name=mysseq, page=7]
+\newpage
+\printpage[name=mysseq, page=8]
+\newpage
+\printpage[name=mysseq, page=9]
+\newpage
+\printpage[name=mysseq, page=10]
+\end{document}
diff --git a/graphics/pgf/contrib/spectralsequences/examples/MaySS-bo-A(1).pdf b/graphics/pgf/contrib/spectralsequences/examples/MaySS-bo-A(1).pdf
new file mode 100644
index 0000000000..701b66fc36
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/MaySS-bo-A(1).pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/MaySS-bo-A(1).tex b/graphics/pgf/contrib/spectralsequences/examples/MaySS-bo-A(1).tex
new file mode 100644
index 0000000000..43043f89b2
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/MaySS-bo-A(1).tex
@@ -0,0 +1,76 @@
+%%
+%% Description: The May spectral sequence for $Ext(\HF_{2*}bo)$
+%%
+%% This is the May spectral sequence computing Ext_{A(1)} ( F_2, F_2 ), which by a change of rings and a simple argument that the ASS has to collapse,
+%% is telling us pi_* bo. See the Green Book for reference.
+%% The main purpose of this example from my perspective is to illustrate the utility of class "tags".
+%%
+
+
+\documentclass[tooltips]{spectralsequence-example}
+
+\NewSseqCommand\tower {} {
+ \class(0,0)
+ \foreach\i in {1,...,11}{
+ \class(0,\i)
+ \structline(0,\i-1,-1)(0,\i,-1)
+ }
+}
+\NewSseqGroup\hvee {} {
+ \tower
+ \foreach\i in {1,...,11}{
+ \class(\i,\i)
+ \structline(\i-1,\i-1,-1)(\i,\i,-1)
+ }
+}
+
+\begin{document}
+\begin{sseqdata}[
+ name=A1 May,
+ x range={0}{10}, y range={0}{10},
+ degree={-1}{1},
+ classes={fill, tooltip = {(\xcoord,\ycoord)}},
+ class labels={below=3pt},
+ run off differentials= ->,
+ no orphan edges,
+]
+\foreach\i in {0,1,2}{
+ \begin{scope}[xshift=4*\i,yshift=2*\i,tag prefix=\i.]
+ \hvee[tag=id](0,0)
+ \hvee[tag=h0h1](1,2)
+ \hvee[tag=h20](2,1)
+ \foreach\j in {1,...,10}{
+ \d1(2,\j,h20,h0h1)
+ }
+ \foreach\j in {1,...,10}{
+ \d1(2+\j,1+\j,h20,h0h1)
+ }
+ \end{scope}
+}
+
+
+\foreach\i in {0,...,7}{
+ \d2(4+\i,2+\i,1.id,0.id)
+}
+\class(12,6)
+\d2(12,6,,1)
+
+%\classoptions["h_0"](0,1)
+\classoptions["h_1"](1,1)
+\classoptions["h_{20}"](2,1)
+\classoptions["h_{20}^2"](4,2)
+\classoptions["h_{20}^3"](6,3)
+\classoptions["h_{20}^4"](8,4)
+\classoptions["h_{20}^5"](10,5)
+
+\doptions[shorten >=3pt]1(10,10,2.h20,2.h0h1)
+\end{sseqdata}
+
+\printpage[name=A1 May,page=1]
+\newpage
+\printpage[name=A1 May,page=2]
+\newpage
+\begin{sseqpage}[name=A1 May,page=3]
+\classoptions["h_0h_{20}^2"](4,3,1.id)
+\end{sseqpage}
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/spectralsequences/examples/MaySS-tmf-A(2).pdf b/graphics/pgf/contrib/spectralsequences/examples/MaySS-tmf-A(2).pdf
new file mode 100644
index 0000000000..b145578082
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/MaySS-tmf-A(2).pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/MaySS-tmf-A(2).tex b/graphics/pgf/contrib/spectralsequences/examples/MaySS-tmf-A(2).tex
new file mode 100644
index 0000000000..c2ce0a1d55
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/MaySS-tmf-A(2).tex
@@ -0,0 +1,233 @@
+%%
+%% Description: The May spectral sequence for $Ext(\HF_{2*}\tmf)$
+%%
+%% I got this from Mike Hill's note: https://pdfs.semanticscholar.org/ddbb/8d584e4e81a71400088117b16cd241238c6c.pdf
+%%
+
+
+\documentclass[tooltips]{spectralsequence-example}
+\begin{document}
+\sseqset{htwostructstyle/.sseq style = {gray,very thin, run off=-}}
+
+
+\NewSseqCommand\twods{ O{} U( r() m m }{
+ \def\temp{#1,#2,#3,#4,#5}
+ \getdtarget\target#2{#3} % Store the target position in \target
+ \nameclass{source}(#3) % naming the classes gives us a speed boost
+ \nameclass{target1}(\target,#4) % by preventing sseqpages from reparsing the coordinate
+ \nameclass{target2}(\target,#5) % it also makes the code easier to read
+%
+ \circleclasses[ differential style, #1,
+ name path = circ, page = #2--#2 ]
+ (target1)(target2) % Circle the classes, use differential style
+%
+ \d[invisible]#2(source)(target1) % don't draw anything, but record source and targets as hit.
+ \d[invisible]#2(source)(target2)
+%
+ \path(target1)--(target2)
+ coordinate[midway](midpt);% put a coordinate in the center of the two classes
+ \path[name path = lin] (source) -- (midpt);% save path from start to midpoint
+%
+ % draw line in "differential style" from start to intersection point of circ and lin
+ \draw[ differential style, #1, page constraint= { \page == #2 },
+ name intersections = { of = circ and lin } ]
+ (source) -- (intersection-1);
+}
+
+
+\NewSseqCommand \tower { O{} d() } {
+ \IfNoValueF{#2}{
+ \pushstack(#2)
+ }
+ \savestack
+ \begin{scope}[#1]
+ \DoUntilOutOfBounds{
+ \class(\lastx,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+ }
+ \end{scope}
+ \restorestack
+}
+
+\NewSseqCommand\honetower {O{}} {
+ \savestack
+ \begin{scope}[#1]
+ \DoUntilOutOfBounds{
+ \class(\lastx+1,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+ }
+ \end{scope}
+ \restorestack
+}
+
+\NewSseqCommand\htwo { O{} d() } {
+ \IfNoValueF{#2}{
+ \pushstack(#2)
+ }
+ \class[#1](\lastx+3,\lasty+1)
+ \structline[htwostructstyle](\lastclass1)(\lastclass)
+}
+
+\NewSseqCommand \htwotower { O{} d() } {
+ \IfNoValueF{#2}{
+ \pushstack(#2)
+ }
+ \begin{scope}[#1]
+ \gettag\thetag(\lastclass)
+ \class(\lastx+3,\lasty+1)
+ \structline[htwostructstyle](\lastclass)(\lastclass1)
+ \savestack
+ \DoUntilOutOfBounds{
+ \class(\lastx,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+ \structline[htwostructstyle](\lastx-3,\lasty-1,\thetag)(\lastclass)
+ }
+ \restorestack
+ \end{scope}
+}
+
+
+\NewSseqCommand\dtower {u(u)} {
+ \foreach\i in {0,...,10}{
+ \d[yshift=\i]#1(#2)
+ }
+}
+
+\begin{sseqdata}[name=tmfmayss,y range={0}{8}, x range={0}{25}, degree={-1}{1},
+ classes=fill,
+ class labels={below=3pt},differentials=blue,
+ class pattern=linear, classes={ tooltip = {(\xcoord,\ycoord)} },
+ xscale=1.48,
+ yscale=2.2,
+ title = {Page \page},
+ run off differentials = ->
+]
+\class[tag= h0^i](0,0) \tower[tag=h0^i]
+\honetower \classoptions["h_1"](1,1)
+
+\htwotower[tag=h0^i h2]
+\classoptions["h_2"](3,1)
+\htwotower[tag=h0^i h2^2]
+\htwotower[tag=h0^i h2^3]
+\htwotower[tag=h0^i h2^4]
+\htwotower[tag=h0^i h2^5]
+\htwotower[tag=h0^i h2^6]
+\htwotower[tag=h0^i h2^7]
+\htwotower[tag=h0^i h2^8]
+\htwo%\htwotower[tag=h0^i h2^9]
+
+
+\class["b_{20}",name=b20,tag=h1^i b20](4,2)
+\tagclass{h0^i b20}(4,2)
+\honetower[tag=h1^i b20]
+\tower[tag=h0^i b20]
+\class["x_7",tag=h0^i x7,name=x7](7,2) \honetower
+\htwotower[tag=h0^i x7](b20)
+\structline(\lastclass)(x7) % h0 x7 = h2 b20
+
+
+\class["b_{21}", tag=h0^i b21,name=b21](10,2)
+\honetower[tag=h1^i b21]
+%\structline(\lastclass)(h2^2 b20) % h2 (h0 x7) = h2 (h2 b20)
+
+\htwotower[tag=h0^i b21](x7)
+\structline(b21)(\lastclass)
+
+
+
+\htwotower[tag=h0^i h2 b21](b21)
+\htwotower[tag=h0^i h2^2 b21]
+\htwotower[tag=h0^i h2^3 b21]
+\htwotower[tag=h0^i h2^4 b21]
+\htwotower[tag=h0^i h2^5 b21]
+\htwotower[tag=h0^i h2^6 b21]
+
+\class["b_{30}",tag=h1^i b30](12,2)
+\tagclass{h0^i b30}(12,2)
+\tower[tag=h0^i b30]\honetower[tag=h1^i b30]
+\htwotower[tag=h0^i h2 b30]
+\htwotower[tag=h0^i h2^2 b30]
+\htwotower[tag=h0^i h2^3 b30]
+\htwotower[tag=h0^i h2^4 b30]
+\htwotower[tag=h0^i h2^5 b30]
+
+
+
+%
+
+\class[tag=h0^i x7^2](14,4)
+\classoptions["x_7^2",page=0--3](\lastclass)
+\classoptions["d",page=4--100](\lastclass)
+\tower[tag=h0^i x7^2] \honetower
+
+\htwotower[tag=h0^i h2 x7^2]
+\htwotower[tag=h0^i h2^2 x7^2]
+\htwotower[tag=h0^i h2^3 x7^2]
+\htwotower[tag=h0^i h2^4 x7^2]
+\htwo%\htwotower[tag=h0^i h2^5 x7^2]
+
+
+\class["b_{20}^2",tag=h0^i b_{20}^2](8,4)
+\tower[tag=h0^i b_{20}^2]
+\honetower
+\htwotower[tag=h0^i h2 b_{20}^2]
+\htwotower[tag=h0^i h2^2 b_{20}^2]
+\htwotower[tag=h0^i h2^3 b_{20}^2]
+\htwotower[tag=h0^i h2^4 b_{20}^2]
+\htwo%\htwotower[tag=h0^i h2^5, b_{20}^2]
+
+\class[tag=h0^i b21^2](20,4)
+\classoptions["b_{21}^2",page=0--3](\lastclass)
+\classoptions["g",page=4--100](\lastclass)
+\honetower
+\tower[tag=h0^i b21^2]
+
+\htwotower[tag=h0^i h2 b21^2]
+\htwotower[tag=h0^i h2^2 b21^2]
+
+\class["b_{30}^2",tag=h0^i b30^2](24,4)
+\tower[tag=h0^i b30^2]
+\honetower
+\htwotower
+%\htwotower[tag=h0^i h2^3 b21^2]
+
+
+
+\twods3(4,2,-1){1}{2} % d3(b20) = h1^3 + h0^2 h2
+\replaceclass[offset={(0,0)}](3,3)
+\structline(3,2)(3,3)
+\structline(2,2)(3,3)
+\structline[htwostructstyle](0,2)(3,3)
+
+\foreach\y in {3,...,8} {\d3(4,\y,-1,-1)} % d3( h0^i b20 ) = h0^{2+i} h2
+\foreach\n in {3,...,8} {\d3(2+\n,\n,h1^i b20,1)} % d3(h1^i b20) = h1^{3+i}
+\foreach \y in {2,...,8} {\d3(7,\y,h0^i x7,h0^i h2^2)}
+
+\foreach \y in {2,...,8} {\d3(10,\y,h0^i b21,h0^i h2^3)}
+
+\foreach \y in {3,...,8} {\d3(13,\y, h0^i h2 b21 ,h0^i h2^4)}
+\foreach \y in {3,...,7} {\d3(16,\y+1,h0^i h2^2 b21,h0^i h2^5)}
+\foreach \y in {3,...,6} {\d3(19,\y+2,h0^i h2^3 b21,h0^i h2^6)}
+\foreach \y in {3,...,5} {\d3(22,\y+3,h0^i h2^4 b21,h0^i h2^7)}
+\foreach \y in {3,...,4} {\d3(25,\y+4,h0^i h2^5 b21,h0^i h2^8)}
+
+\foreach \n in {0,...,6} {\d3(12+\n,2+\n,h1^i b30,h1^i b21)}
+
+\foreach \n in {0,...,4} {\d5(24,4+\n,-1,-1)}
+
+
+\classoptions[page=4--100,"c_0"](8,3)
+\classoptions[page=4--100,"a"](12,3)
+\classoptions[page=4--100,"b"](15,3)
+
+
+
+\end{sseqdata}
+\printpage[name=tmfmayss,page=2]
+\newpage
+\printpage[name=tmfmayss,page=3]
+\newpage
+\printpage[name=tmfmayss,page=5]
+\newpage
+\printpage[name=tmfmayss,page=8,title={Page $\infty$}]
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/spectralsequences/examples/SSS-KF3n.pdf b/graphics/pgf/contrib/spectralsequences/examples/SSS-KF3n.pdf
new file mode 100644
index 0000000000..bd14cc30b1
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/SSS-KF3n.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/SSS-KF3n.tex b/graphics/pgf/contrib/spectralsequences/examples/SSS-KF3n.tex
new file mode 100644
index 0000000000..b326c2e996
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/SSS-KF3n.tex
@@ -0,0 +1,323 @@
+%%
+%% Description: The Serre spectral sequence for $\HF_3$ cohomology of $K(\F_3,n-1)\to pt \to K(\F_3,n)$ for $n=2,3,4$, with Bockstein SS's for going up to $\Zbb_3$ coefficients.
+%%
+%% This is a computation of the Z_3 cohomology of K(F_3,n). This was part of a way-too-hard problem on Haynes Algebraic Topology II problem set which asked to compute
+%% the smallest k>0 such that H_{n+k}(K(--,n);Z_p) : Ab --> Ab is not the zero functor and to compute what functor it is. One of the main ideas is to use the Bockstein
+%% spectral sequence, because it handles the badness of integral Kunneth for us too.
+%%
+
+\documentclass{article}
+\usepackage[margin=0.2in,top=0.4in,landscape]{geometry}
+\usepackage{spectralsequences}
+\usepackage{amssymb}
+\def\Z{\mathbb{Z}}
+\begin{document}
+\sseqset{
+ cohomological Serre grading,
+ title={Page \page},
+ class placement transform={scale=1.3, rotate=90},
+ class pattern=linear,
+ classes={draw=none},
+ class label handler = \SseqNormalizeMonomial,
+ bocksteinSS/.style={
+ page=0, y range={-1}{0},
+ no differentials, no labels, no y ticks, no title,
+ yscale=1.5, x axis extend end=40pt, y axis extend end = 40pt, x axis gap =50pt,
+ class label handler = {},
+ }
+}
+
+\begin{sseqdata}[name=K(Z/3;2),
+ x range={0}{8}, xscale=2.2, yscale=1.5,
+ x label={$H^*(K(\Z/3,2),\Z/3)$},
+ y label={$H^*(K(\Z/3,1),\Z/3)$},
+ right clip padding=20pt, x axis gap=20pt,
+]
+\foreach \x/\xlabel in
+ { 0/1, 2/\iota_2, 3/\beta\iota_2, 4/\iota_2^2, 5/\iota_2\beta\iota_2, 6/\iota_2^3,
+ 7/\iota_2^2\beta\iota_2, 7/P^1\beta\iota_2, 8/\iota_2^4, 8/\beta P^1\beta\iota_2 }
+\foreach \y/\ylabel in
+ { 0/1, 1/\alpha, 2/x, 3/\alpha x, 4/x^2, 5/\alpha x^2, 6/x^3} {
+ \class["\ylabel\xlabel"](\x,\y)
+}
+
+\class(9,0)\class(9,0)
+\class(9,1)
+\class(9,2)
+\class(9,3)
+\class(9,4)
+\class(9,5)
+
+\class(10,0)\class(10,0)\class(10,0)
+\class(10,2)\class(10,2)
+\class(10,4)\class(10,4)
+
+\class(11,0)\class(11,0)
+\class(11,2)
+
+\class(12,0)
+\class(13,0)
+\class(14,0)
+\class(15,0)
+%\class["(\beta\iota_2)^2"](6,0)
+
+
+\d2(0,1) %d2(a)=i
+
+
+
+\d3(0,2) %d3(x) = b(i)
+\d2(0,3) % d2(ax) = ix
+\d3(0,4) % d2(x^2) = xb(i)
+\d2(0,5) % d2(ax^2) = ix^2
+%\d7
+
+
+\d2(2,1) % d2(ai) = i^2
+\d2(2,3) % d2(axi) = xi^2
+\d2(2,5) % d2(ax^2i)=x^2i^2)
+
+\d2(3,1) % d2(abi)=ib(i)
+\d2(3,3)
+\d2(3,5)
+
+\d2(4,1) % d2(ai^2)=i^3
+\d2(4,3)
+\d2(4,5)
+
+\d2(5,1,,1) %d2(ai_2bi_2) = i_2^2 bi_2
+\d2(5,3,,1)
+\d2(5,5,,1)
+
+\d2(6,1,,1) %d2(ai_2^3) = i_2^4
+\d2(6,3,,1)
+\d2(6,5,,1)
+
+\d2(7,1,1) % d2(ai_2^2bi_2) = i_2^3 bi_2
+\d2(7,3,1)
+\d2(7,5,1)
+
+\d2(7,1,2) % d2(aP^1bi_2) = i_2 P^1bi_2
+\d2(7,3,2)
+\d2(7,5,2)
+
+\d3(7,2,2) % d3(x P^1bi_2) = bi_2 P^1bi_2
+\d3(7,4,2)
+
+\d2(8,1,1,2) % d2(a i_2^4) = i_2^5
+\d2(8,3,1,2)
+\d2(8,5,1,2)
+
+\d2(8,1,2,2) % d2(a bP^1bi_2) = i_2 bP^1bi_2
+\d2(8,3,2,2)
+\d2(8,5,2,2)
+
+\d3(8,2,2) % d3(x bP^1bi_2) = bi_2 bP^1bi_2
+\d3(8,4,2)
+
+
+\d5(3,4,,2) % d5(x^2i_2) = bP^1bi_2 -- Kudo differential
+
+\d7(0,6,,2) % d7(x^3) = P^1bi_2
+\d7(2,6,,2)
+\d7(3,6,,3)
+\d7(4,6,,2)
+\d7(5,6)
+\d7(6,6)
+\d7(7,6,1)
+\d7(7,6,2)
+\d7(8,6,1)
+\d7(8,6,2)
+
+
+\end{sseqdata}
+
+\printpage[name=K(Z/3;2),page=2]
+\newpage
+\printpage[name=K(Z/3;2),page=3]
+\newpage
+\printpage[name=K(Z/3;2),page=5]
+\newpage
+\printpage[name=K(Z/3;2),page=6]
+\newpage
+\printpage[name=K(Z/3;2),page=7]
+\newpage
+
+\begin{sseqpage}[
+ name=K(Z/3;2), bocksteinSS,
+ x axis extend end = 30pt, y axis gap=30pt,
+]
+\begin{scope}[background]
+\node[anchor=west] at (-2,0) { H^*(K(\Z/3,2),\Z/3)};
+\node[anchor=west] at (-2,-1) { H^*(K(\Z/3,2),\Z)};
+\end{scope}
+
+\draw[->] (2,0) to[bend left=30, "\beta^1"] (3,0);
+\draw[->] (4,0) to[bend left=30, "\beta^1"{pos = 0.55}] (5,0);
+\draw[->] (6,0) to[bend right=30, "\beta^2"'] (7,0,1);
+\draw[->] (7,0,2) to[bend left=30, "\beta^1"] (8,0,2);
+\draw[->] (8,0,1) to[bend right=30, "\beta^1"' {pos = 0.46}] (9,0);
+
+\class["\Z\{1\}"](0,-1)
+\class["\Z/3\{\beta\iota_2\}"](3,-1)
+\class["\Z/3\{\beta\iota_2^2\}"](5,-1)
+\class["\Z/9\{\beta\iota_2^3\}"](7,-1)
+\class["\Z/3\{\beta P^1\iota_2\}"](8,-1)
+\end{sseqpage}
+
+
+\newpage
+\begin{sseqdata}[name=K(Z/3;3),xscale=2.2,yscale=1.7,y axis gap=40pt,x axis gap=30pt, x range={0}{9},
+ x label={$H^*(K(\Z/3,2),\Z/3)$},
+ y label={$H^*(K(\Z/3,1),\Z/3)$}
+]
+
+\foreach \x/\ymax/\xlabel in { 0/6/1, 3/6/\iota_3, 4/3/{{\beta\iota_3}} }
+\foreach \y/\ylabel in { 0/1, 2/\iota_2, 3/{{\beta\iota_2}}, 4/\iota_2^2, 5/\iota_2{\beta\iota_2}, 6/\iota_2^3 } {
+ \class["\ylabel\xlabel"](\x,\y)
+}
+
+\sseqset{class label handler = {}}
+
+\class["P^1\beta\iota_2"](0,7)
+\class["\iota_2^2\beta\iota_2"](0,7)
+\class["\beta P^1\beta\iota_2"](0,8)
+\class["\iota_2^4"](0,8)
+
+
+\class["P^1\iota_3"](7,0)
+\class["\iota_3\beta\iota_3"](7,0)
+\class["\beta P^1\iota_3"](8,0)
+\class["(\beta\iota_3)^2"](8,0)
+\class["P^1\beta\iota_3"](8,0)
+\class["\beta P^1\beta\iota_3"](9,0)
+
+
+\d3(0,2)
+\d4(0,3)
+\d3(0,4)
+\d3(0,5)
+\d7(0,6,,1)
+\d3(0,7,2)
+\d8(0,7,1,3)
+\d3(0,8,2)
+\d9(0,8,1)
+\d5(3,4,,1)
+
+\d3(4,2,,2)
+\d4(4,3,,2)
+\end{sseqdata}
+
+\printpage[name=K(Z/3;3),page=3]
+\newpage
+\printpage[name=K(Z/3;3),page=4]
+\newpage
+\printpage[name=K(Z/3;3),page=5]
+\newpage
+\printpage[name=K(Z/3;3),page=7]
+\newpage
+\printpage[name=K(Z/3;3),page=9]
+\newpage
+
+\begin{sseqpage}[ name=K(Z/3;3), bocksteinSS ]
+\begin{scope}[background]
+\node[anchor=west] at (-2.2,0) { H^*(K(\Z/3,3),\Z/3)};
+\node[anchor=west] at (-2.2,-1) { H^*(K(\Z/3,3),\Z)};
+\end{scope}
+
+\draw[->] (3,0) to[bend left=30, "\beta^1"] (4,0);
+\draw[->] (7,0,1) to[bend right=30, "\beta^1"' {pos=0.6}] (8,0,1);
+\draw[->] (7,0,2) to[bend left=30, "\beta^1" {pos=0.43}] (8,0,2);
+\draw[->] (8,0,3) to[bend left=30, "\beta^1"{pos=0.37}] (9,0);
+
+\class["\Z\{1\}"](0,-1)
+\class["\Z/3\{\beta\iota_3\}"](4,-1)
+\class["\Z/3\{\beta P^1\iota_3\}"](8,-1)
+\class["\Z/3\{\beta(\iota_3\beta\iota_3)\}"](8,-1)
+\class["\Z/3\{\beta P^1\beta\iota_3\}"](9,-1)
+\end{sseqpage}
+
+
+
+\begin{sseqdata}[name=K(Z/3;4),
+ xscale=2,yscale=1.5,y axis gap=20pt,x axis gap=30pt, x range={0}{10},
+ x label = {$H^*(K(\Z/3,3),\Z/3)$},
+ y label = {$H^*(K(\Z/3,4),\Z/3)$},
+ class label handler = {}
+]
+
+\class["1"](0,0)
+\class["\iota_3"](0,3)
+\class["\beta\iota_3"](0,4)
+\class["P^1\iota_3"](0,7)
+\class["\beta P^1\iota_3"](0,8)
+\class["\iota_3\beta\iota_3"](0,7)
+\class["(\beta\iota_3)^2"](0,8)
+\class["P^1\beta\iota_3"](0,8)
+\class["\beta P^1\beta\iota_3"](0,9)
+
+
+\class["\iota_4"](4,0)
+\class["\iota_3\iota_4"](4,3)
+\class["\beta\iota_3\iota_4"](4,4)
+
+\class["\beta\iota_4"](5,0)
+\class["\iota_3\beta\iota_4"](5,3)
+\class["\beta\iota_3\beta\iota_4"](5,4)
+
+\class["\iota_4^2"](8,0)
+\class["P^1\iota_4"](8,0)
+
+\class["\iota_4 \beta\iota_4"](9,0)
+\class["P^1\beta\iota_4"](9,0)
+\class["\beta P^1\iota_4"](9,0)
+
+\class["\beta P^1\beta\iota_4"](10,0)
+
+\d4(0,3) % d4(i_3) = i_4
+\d4(0,7,2)
+\d4(4,3,,1)
+\d4(5,3,,1)
+
+\d5(0,4)
+
+\d8(0,7,1,2)
+
+\d9(0,8,1,2)
+\d5(0,8,2)
+\d9(0,8,3,3)
+\d10(0,9)
+
+%\d
+\end{sseqdata}
+
+\printpage[name=K(Z/3;4),page=4]
+\newpage
+\printpage[name=K(Z/3;4),page=5]
+\newpage
+\printpage[name=K(Z/3;4),page=8]
+\newpage
+\printpage[name=K(Z/3;4),page=9]
+\newpage
+\printpage[name=K(Z/3;4),page=10]
+\newpage
+
+\begin{sseqpage}[ name=K(Z/3;4), bocksteinSS, yscale=1.3 ]
+\begin{scope}[background]
+\node[anchor=west] at (-2.2,0) { H^*(K(\Z/3,4),\Z/3)};
+\node[anchor=west] at (-2.2,-1) { H^*(K(\Z/3,4),\Z)};
+\end{scope}
+
+\draw[->] (4,0) to[bend left=30, "\beta^1"] (5,0);
+\draw[->] (8,0,1) to[bend right=30, "\beta^1"' {pos=0.6}] (9,0,1);
+\draw[->] (8,0,2) to[bend left=30, "\beta^1" {pos=0.6}] (9,0,3);
+\draw[->] (9,0,2) to[ "\beta^1"] (10,0);
+
+\class["\Z\{1\}"](0,-1)
+\class["\Z/3\{\beta\iota_4\}"](5,-1)
+\class["\Z/3\{\beta P^1\iota_4\}"](9,-1)
+\class["\Z/3\{\beta(\iota_4^2)\}"](9,-1)
+\class["\Z/3\{\beta P^1\beta\iota_4\}"](10,-1)
+\end{sseqpage}
+
+\end{document} \ No newline at end of file
diff --git a/graphics/pgf/contrib/spectralsequences/examples/SSS-KZ3.pdf b/graphics/pgf/contrib/spectralsequences/examples/SSS-KZ3.pdf
new file mode 100644
index 0000000000..d29570b7b8
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/SSS-KZ3.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/SSS-KZ3.tex b/graphics/pgf/contrib/spectralsequences/examples/SSS-KZ3.tex
new file mode 100644
index 0000000000..25c7143378
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/SSS-KZ3.tex
@@ -0,0 +1,133 @@
+%%
+%% Description: The Serre spectral sequence for $\HZ$ cohomology of $\CP^\infty \to pt \to K(\Z,3)$
+%%
+%% File: example_KZ3.tex
+%%
+%% This was one of the first spectral sequences I ever worked out (probably after the one for loops S^n), in the summer of 2013 with Kevin Donoghue.
+%%
+
+\documentclass{article}
+\usepackage[landscape,margin=0.5cm,top=2cm]{geometry}
+\usepackage{spectralsequences}
+\usepackage{amssymb}
+\def\Z{\mathbb{Z}}
+% Last time test: 1.1 sec
+\begin{document}
+\def\column#1[#2]{\foreach \y in {0,...,6} {\class[#2](#1,2*\y)}}
+\sseqset{classes={draw=none}}
+\begin{sseqdata}[
+ name={K(Z,3)},
+ x range={0}{12},
+ y range={0}{10},
+ cohomological Serre grading,
+ differentials={->},
+ xscale=1.8,
+ y axis gap=0.7cm,
+ math nodes,
+ x axis extend end=0.8cm,
+ this page cycles=red,
+ title=\textup{Serre SS Page \page{}},
+ x label = {$H^*(K(\Z,3))$},
+ y label = {$H^*(K(\Z,2))$}
+]
+
+\column0["\Z\{\ifnum\y>0\relax x\ifnum\y>1\relax ^{\y}\fi\else1\fi\}"]
+\column3["\Z\{a\ifnum\y>0x\ifnum\y>1 ^{\y}\fi\fi\}"]
+
+
+\foreach\y in {1,...,6} {\d["\cdot \y"']3(0,2*\y)}
+\replaceclass["\Z/3"](3,4)
+\replaceclass["\Z/5"](3,8)
+
+
+\column6["\Z/2"]
+\d3(3,2)
+\d3(3,6)
+\d3(3,10)
+\replaceclass["\Z/2"](3,6)
+\replaceclass["\Z/3"](3,10)
+\column8["\Z/3"]
+\d5(3,4)
+\d5(3,10)
+\column9["\Z/2"]
+\d3(6,2)
+\d3(6,6)
+\d3(6,10)
+\column10["\Z/2"]
+\d7(3,6)
+\column11["\Z/3"]
+\d3(8,2)
+\d3(8,4)
+\d3(8,8)
+\d3(8,10)
+\column12["\Z/2\oplus\Z/5"]
+\column13["\Z/2"]
+\column15["\Z/2\oplus\Z/2\oplus\Z/5"]
+\d3(9,2)
+\d3(9,6)
+\d3(9,10)
+\d3(10,2)
+\d3(10,6)
+\d3(10,10)
+\d3(10,12)
+\d3(12,2)
+\d3(12,4)
+\d3(12,6)
+\d3(12,8)
+\d3(12,10)
+\d3(12,4)
+\replaceclass["\Z/5"](12,0)
+\replaceclass["\Z/5"](12,4)
+\replaceclass["\Z/5"](12,8)
+\d9(3,8)
+
+
+\replaceclass["\Z/5"](12,10)
+\replaceclass["\Z/2"](15,0)
+\replaceclass["\Z/2\oplus\Z/2"](15,4)
+
+\d5(10,4)
+
+\class["\Z/3"](16,0)
+\class["\Z/3"](16,6)
+\d5(11,4)
+\d5(11,10)
+
+\class["\Z/2"] (17,0)
+
+\class["\Z/2"](17,8)
+
+\d5(12,12)
+
+\class["\Z/2"](19,0)
+\d9(10,8)
+
+\class["\Z/5"](23,0)
+\d11(12,10)
+
+\replaceclass["\Z/6"](16,0)
+\d13(3,12)
+
+%\replaceclass["\Z/6"](21,0)
+%\d13(8,12)
+\class["\Z/3"](24,0)
+\d13(11,12)
+\end{sseqdata}
+
+
+\printpage[name={K(Z,3)}, page=0,no differentials]
+\newpage
+\printpage[name={K(Z,3)}, page=0]
+\newpage
+\printpage[name={K(Z,3)}, page=3]
+\newpage
+\printpage[name={K(Z,3)}, page=5]
+\newpage
+\printpage[name={K(Z,3)}, page=7]
+\newpage
+\printpage[name={K(Z,3)}, page=9]
+\newpage
+\printpage[name={K(Z,3)}, page=11]
+\newpage
+\printpage[name={K(Z,3)}, page=12]
+\end{document}
diff --git a/graphics/pgf/contrib/spectralsequences/examples/hatcher.pdf b/graphics/pgf/contrib/spectralsequences/examples/hatcher.pdf
new file mode 100644
index 0000000000..17c750ae63
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/hatcher.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/hatcher.tex b/graphics/pgf/contrib/spectralsequences/examples/hatcher.tex
new file mode 100644
index 0000000000..3515aaacd0
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/hatcher.tex
@@ -0,0 +1,126 @@
+%%
+%% Package: spectralsequences v1.2.2 2017-09-16 2017-09-16
+%% Author: Hood Chatham
+%% Email: hood@mit.edu
+%% Date: 2019-02-18
+%% License: Latex Project Public License
+%%
+%% File: example_hatcher.tex
+%%
+%% This comes from Hatcher's spectral sequences book. I think it's a good demonstration of the flexibility of sseqpages.
+%% Thanks to Antonio Ruiz for suggesting it.
+%%
+
+\documentclass{spectralsequence-example}
+\usepackage{amssymb}
+\def\Z{\mathbb{Z}}
+
+\begin{document}
+\sseqset{
+ 0/.sseq style={"0",draw=none},
+ homological Serre grading,
+ classes={draw=none,inner sep=0.2em},
+ %tick gap=0.7em,
+}
+\begin{sseqdata}[
+ name=hatcherex1,
+ permanent cycles={draw,minimum width={width("$Z_2$")+0.85em}},
+ yscale=0.6,
+ axes gap=0.5cm,
+ tick gap=1em,
+]
+\begin{scope}[background,opacity=0.1]
+\foreach \n in {1,3,...,9}{
+ \fill(-1.3,\n-0.5)--(-1.3,\n+0.5)--(0,\n+0.5)--(\n+0.5,0)--(\n+0.5,-2)--(\n-0.5,-2)--(\n-0.5,0)--(0,\n-0.5)--cycle;
+}
+\end{scope}
+
+\class["\Z"](0,0)
+\foreach\x in {1,3,...,9}{
+ \class["\Z_2"](\x,0)
+}
+\foreach \x in {2,4,...,8}{
+ \class[0](\x,0)
+}
+\foreach\y in {1,3,...,9}{
+ \pgfmathparse{9-\y}
+ \let\xmax\pgfmathresult
+ \foreach\x in {0,...,\xmax}{
+ \class["\Z_2"](\x,\y)
+ }
+}
+
+\foreach \y in {2,4,...,8}{
+ \pgfmathparse{9-\y}
+ \let\xmax\pgfmathresult
+ \foreach\x in {0,...,\xmax}{
+ \class[0](\x,\y)
+ }
+}
+
+\foreach \x in {3,5,...,9}{
+ \d2(\x,0)
+}
+
+\d3(4,1)
+\d3(6,1)
+\d3(8,1)
+\d3(4,3)
+\d3(6,3)
+\d3(4,5)
+\end{sseqdata}
+\printpage[name=hatcherex1,page=0]
+
+\vskip30pt
+
+\begin{sseqdata}[
+ name=hatcherex2,
+ yscale=0.6,
+ x axis gap=0.3cm,
+]
+
+\begin{scope}[background,opacity=0.1]
+\foreach \n in {1,3,...,9}{
+ \fill(-1.3,\n-0.5)--(-1.3,\n+0.7)--(0,\n+0.7)--(\n+0.5,0)--(\n+0.5,-2)--(\n-0.5,-2)--(\n-0.5,0)--(0,\n-0.5)--cycle;
+}
+\end{scope}
+
+
+\foreach\x in {0,2,...,8}{
+ \class["\Z"](\x,0)
+}
+\foreach \x in {1,3,...,9}{
+ \class[0](\x,0)
+}
+\foreach\y in {1,3,...,9}{
+ \pgfmathparse{9-\y}
+ \let\xmax\pgfmathresult
+ \foreach\x in {0,...,\xmax}{
+ \pgfmathparse{int(mod(\x,2))}
+ \ifnum\pgfmathresult=0\relax
+ \class["\Z_2"](\x,\y)
+ \else
+ \class[0](\x,\y)
+ \fi
+ }
+}
+
+\d2(2,0)
+\foreach \x in {4,6,...,8}{
+ \foreach\r in {2,4,...,\x}{
+ \d\r(\x,0)
+ \replaceclass["\Z"](\x,0)
+ }
+}
+
+\foreach \y in {2,4,...,8}{
+ \pgfmathparse{9-\y}
+ \let\xmax\pgfmathresult
+ \foreach\x in {0,...,\xmax}{
+ \class[0](\x,\y)
+ }
+}
+
+\end{sseqdata}
+\printpage[name=hatcherex2,page=0]
+\end{document}
diff --git a/graphics/pgf/contrib/spectralsequences/examples/unstable_ASS_SO.pdf b/graphics/pgf/contrib/spectralsequences/examples/unstable_ASS_SO.pdf
new file mode 100644
index 0000000000..48a9746aa9
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/unstable_ASS_SO.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/spectralsequences/examples/unstable_ASS_SO.tex b/graphics/pgf/contrib/spectralsequences/examples/unstable_ASS_SO.tex
new file mode 100644
index 0000000000..7bd7350dd1
--- /dev/null
+++ b/graphics/pgf/contrib/spectralsequences/examples/unstable_ASS_SO.tex
@@ -0,0 +1,78 @@
+%%
+%% Package: spectralsequences v1.2.2 2017-09-16 2017-09-16
+%% Author: Hood Chatham
+%% Email: hood@mit.edu
+%% Date: 2019-02-18
+%% License: Latex Project Public License
+%%
+%% File: example_unstable_ASS_SO.tex
+%%
+%% From Kathryn Lesh: A conjecture on the unstable Adams spectral sequences for SO and U top of page 21.
+%% http://hopf.math.purdue.edu//Lesh/uass-so-model.pdf
+%%
+
+\documentclass{spectralsequence-example}
+
+\begin{document}
+\sseqset{
+ M3M2/.sseq style = { fill },
+ M4M3/.sseq style = { circlen = 2, fill }
+}
+%\pgfkeys{/sseqpages/class/M4M3/.show code}
+
+\NewSseqCommand \tower { O{} d() } {
+ \IfNoValueF{#2}{\class(#2)}
+ \savestack
+ \begin{scope}[#1]
+ \DoUntilOutOfBounds{
+ \class(\lastx,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+ }
+ \end{scope}
+ \restorestack
+}
+
+\NewSseqCommand \etaclass {} {
+ \class(\lastx+1,\lasty+1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+\NewSseqCommand \divtwoclass {} {
+ \class(\lastx,\lasty-1)
+ \structline(\lastclass1)(\lastclass)
+}
+
+\begin{sseqdata}[ name = SO_UASS, tick step = 5, x range = {0}{20}, Adams grading, y range={0}{10} ]
+\class(1,0)
+\tower(3,0)
+
+\begin{scope}[M3M2]
+\tower(7,0)
+\etaclass\etaclass
+
+\tower(11,3)
+
+\class(14,4)
+\divtwoclass\divtwoclass
+\etaclass\etaclass\etaclass
+\divtwoclass\divtwoclass
+
+\class(16,5)\etaclass
+\end{scope}
+
+\begin{scope}[M4M3]
+\tower(15,0)
+\etaclass\etaclass\etaclass
+\divtwoclass\divtwoclass
+\end{scope}
+
+\d2(15,0)\d2(15,1)\d2(15,2)
+\d2(16,1)\d2(17,2)\d2(18,3)
+\d2(18,2)\d2(18,1)
+\end{sseqdata}
+
+
+\printpage[ name = SO_UASS, page = 2 ]
+\newpage
+\printpage[ name = SO_UASS, page = 3 ]
+\end{document} \ No newline at end of file