From 454868a5f2b777edfb9823ae5a2f2f93d029b95c Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Fri, 10 Apr 2009 23:38:46 +0000
Subject: sseq 2.0 (10apr09)

git-svn-id: svn://tug.org/texlive/trunk@12686 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/latex/sseq/sseq.sty | 1486 ++++++++++++++++++-----------
 1 file changed, 948 insertions(+), 538 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/sseq/sseq.sty')

diff --git a/Master/texmf-dist/tex/latex/sseq/sseq.sty b/Master/texmf-dist/tex/latex/sseq/sseq.sty
index 17ae3957ccd..c57d7549b78 100644
--- a/Master/texmf-dist/tex/latex/sseq/sseq.sty
+++ b/Master/texmf-dist/tex/latex/sseq/sseq.sty
@@ -23,86 +23,81 @@
 
 \NeedsTeXFormat{LaTeX2e}
 
-\ProvidesPackage{sseq}
+\ProvidesPackage{sseq}[2009/04/09 ver 2.0]
 
 \RequirePackage{ifthen,calc,pifont}
+\RequirePackage{pgf}[2006/01/01]
+\RequirePackage{xkeyval}
+\usepgflibrary{snakes}
 
-\newboolean{usesps}
-\setboolean{usesps}{true}
 \newboolean{usescolor}
 \setboolean{usescolor}{true}
 \newboolean{debug}
 \setboolean{debug}{false}
 
-\DeclareOption{ps}{\setboolean{usesps}{true}}
-\DeclareOption{nops}{\setboolean{usesps}{false}}
+\DeclareOption{ps}{\errmessage{sseq: ps/nops is deprecated}}
+\DeclareOption{nops}{\errmessage{sseq: ps/nops is deprecated}}
+\DeclareOption{dvips}{\errmessage{sseq: deprecated option dvips ignored}}
+\DeclareOption{xdvi}{\errmessage{sseq: deprecated option xdvi ignored}}
 \DeclareOption{color}{\setboolean{usescolor}{true}}
 \DeclareOption{nocolor}{\setboolean{usescolor}{false}}
 \DeclareOption{debug}{\setboolean{debug}{true}}
-\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{xy}}
 
 \ProcessOptions
 
-\ifx\xyloaded\undefined \RequirePackage[curve,frame]{xy} \fi
-
-\ifthenelse{\boolean{usesps}}{\xyrequire{ps}}{}
-\ifthenelse{\boolean{usescolor}}{\xyrequire{color}}{}
-
-\newsavebox{\sseqcircledone}
-\newsavebox{\sseqcircledtwo}
-\newsavebox{\sseqcircledthree}
-\newsavebox{\sseqcircledfour}
-\newsavebox{\sseqcircledfive}
-\newsavebox{\sseqcircledsix}
-\newsavebox{\sseqcircledseven}
-\newsavebox{\sseqcircledeight}
-\newsavebox{\sseqcirclednine}
-\sbox{\sseqcircledone}{\ding{192}}
-\sbox{\sseqcircledtwo}{\ding{193}}
-\sbox{\sseqcircledthree}{\ding{194}}
-\sbox{\sseqcircledfour}{\ding{195}}
-\sbox{\sseqcircledfive}{\ding{196}}
-\sbox{\sseqcircledsix}{\ding{197}}
-\sbox{\sseqcircledseven}{\ding{198}}
-\sbox{\sseqcircledeight}{\ding{199}}
-\sbox{\sseqcirclednine}{\ding{200}}
-\newboolean{sseqhasfinishedpos}
-\setboolean{sseqhasfinishedpos}{true}
+
+\def\sseq@currentname{}
+\def\sseq@previousname{}
+
 \newboolean{sseqhasopenconn}
 \setboolean{sseqhasopenconn}{false}
 \newboolean{sseqclip}
 \setboolean{sseqclip}{true}
-\newboolean{sseqprevclip}\setboolean{sseqprevclip}{false}
-\newboolean{sseqcurrclip}\setboolean{sseqcurrclip}{false}
 
 \def\sseqconncommand{}
+\def\sseq@connbuffer{}
+\def\sseq@currarrowstart{}
+\def\sseq@currarrowend{}
+
+\newif\ifsseq@connreverse
 
 \ifthenelse{\boolean{usescolor}}
 {
- \newxyColor{sseqgr}{0.65}{gray}{}
- \newxycolor{ssred}{Red}
- \newxycolor{ssblack}{Black}
+ \definecolor{sseqgr}{gray}{0.65}
+ \definecolor{sslightgr}{gray}{0.8}
+ \definecolor{ssred}{rgb}{1,0,0}
+ \definecolor{ssblack}{rgb}{0,0,0}
 }{}
 \newcommand{\ssconncolor}{ssblack}
 \newcommand{\sslabelcolor}{ssblack}
 \newcommand{\ssplacecolor}{ssblack}
-\def\ssoldconncolor{ssblack}
+
+\def\sseqpacking{\sspacksmart}
 
 %% ^^A Initialization
 \newcount\sseqxstart \sseqxstart=0
 \newcount\sseqystart \sseqystart=0
-\newcount\sseqxstep \sseqxstep=2
-\newcount\sseqystep \sseqystep=2
-\newdimen\sseqentrysize \sseqentrysize=0.4cm
+\newcount\sseqxstep
+\newcount\sseqystep
+\newdimen\sseqentrysize
+\newdimen\sseq@xgap
+\newdimen\sseq@ygap
+\newdimen\sseq@xleak
+\newdimen\sseq@yleak
+\newdimen\ss@currsep \ss@currsep=\pgfshapeinnerxsep
+\newdimen\ss@size
+\newdimen\sseq@gridstrokethickness
+
+\newsavebox\sseq@labelbox
+
 \newif\ifssclipped
+\newif\ifcurroutofrange
 
 \newtoks\sseqcmdlist
 \sseqcmdlist={}
 
 \def\currprefix{}
 
-\def\sseqcurrentname{}
-
 \long\def\ntimes#1#2{
 \ifnum#1>0
  #2
@@ -113,36 +108,147 @@
 \fi
 }
 
-\newif\ifforcondition
+\long\def\for #1=#2\to#3\do#4\od{#1=#2 \sseq@for #1\to #3\do #4\od}
+\long\def\sseq@for #1\to #2\do #3\od{%
+ \ifnum #1>#2 \else
+   #3\relax
+  \advance #1 by 1
+   \def\tempcmd{\sseq@for #1\to #2\do #3\od}%
+   \expandafter\tempcmd
+ \fi
+}
+
+\def\@eval#1#2{%
+  \edef\tempcmd{\noexpand#1#2}%
+  \tempcmd
+}
+\def\range@endmarker{END}
+\def\range@parseandnormalize#1#2#3{\def#1{}\range@parseandnormalizeinnerloop{#1}{#2}{-10000}#3,END,}
+\def\range@parseandnormalizeinnerloop#1#2#3#4,{%
+ \def\temp{#4}%
+ \ifx\temp\range@endmarker
+  \edef #1{#1END;END,}%
+ \else
+  \def\tempoutercmd{\range@parseinnerpart{#1}{#2}{#3}#4...END...}%
+  \expandafter\tempoutercmd
+ \fi
+}
+\def\range@parseinnerpart#1#2#3#4...#5...{%
+ \def\temp{#5}
+ \ifx\temp\range@endmarker
+   \count0=#2
+   \advance\count0 by #4
+   \advance\count0 by -1
+   \edef\tempcmd{\noexpand\range@parseinnerpart{\noexpand#1}{#2}{#3}#2...\number\count0...END...}
+ \else
+   \count0=#3
+   \count1=#4
+   \count2=#5
+   \ifnum\count1<\count0
+     \PackageError{sseq}{Illegal stepping in range}{In a range a...b,c...d, c has to be >= b+2. In your case, b+2=#3 and c=#4. I'll replace c by #3.}
+     \count1=#3
+   \fi
+   \ifnum\count2<\count1
+     \PackageError{sseq}{Illegal range}{In a range a...b, b has to be at least as big as a. In your case, a=\number\count1 and b=#5. I'll replace b by \number\count1.}
+     \count2=\count1
+   \fi
+   \count0=\count2
+   \advance\count0 by 2
+   \edef#1{#1\number\count1;\number\count2,}
+   \edef\tempcmd{\noexpand\range@parsegobbleend{\noexpand#1}{#2}{\number\count0}}
+ \fi
+ \tempcmd
+}
+\def\range@parsegobbleend#1#2#3#4...{%
+\range@parseandnormalizeinnerloop{#1}{#2}{#3}%
+}
+\newif\ifrangebreak
+\def\range@loop#1#2;#3,{
+ \rangebreakfalse
+ \def\temp{#2}
+ \def\tempcmd{}
+ \ifx\temp\range@endmarker\else
+   #1{#2}{#3}
+   \advance\sseqj by 1
+   \ifrangebreak
+    \def\tempcmd{\range@gobbletoend}
+   \else
+    \def\tempcmd{\range@loop{#1}}
+   \fi
+ \fi
+ \tempcmd
+}
+\newif\ifoutofrange
+\def\range@getabsoluteposition#1#2#3#4#5;#6,{
+ \outofrangefalse
+ \def\temp{#5}
+ \def\tempcmd{}
+ \count0=#1
+ \ifx\temp\range@endmarker
+   \outofrangetrue
+ \else % ^^A now #4 contains the current min and #5 the current max
+   \ifnum\count0<#5
+     \outofrangetrue
+     \def\tempcmd{\range@gobbletoend}
+   \else
+     \ifnum\count0>#6
+       \count0=#6
+       \advance\count0 by 1
+       \count1=#5
+       \multiply\count1 by -1
+       \advance\count0 by \count1
+       \dimen0=#2
+       \multiply\dimen0 by \count0
+       \advance\dimen0 by #4
+       \advance\dimen0 by #3
+       \edef\tempcmd{\noexpand\range@getabsoluteposition{#1}{#2}{#3}{\number\dimen0sp}}
+     \else
+       \count1=#5
+       \multiply\count1 by -1
+       \advance\count0 by \count1
+       \dimen0=#2
+       \multiply\dimen0 by \count0
+       \advance\dimen0 by #4
+       \def\tempcmd{\range@gobbletoend}
+     \fi
+   \fi
+ \fi
+ \tempcmd
+}
+\def\range@gobbletoend#1END,{}
 
-\long\def\for#1=#2\to#3\do#4\od{
-#1=#2
-\loop
-\ifnum#1>#3\forconditionfalse\else\forconditiontrue\fi
-\ifforcondition
- #4
- \advance #1 by 1
- \repeat
+\def\ss@getcoords#1#2{
+ \edef\tempcmd{\noexpand\range@getabsoluteposition{#1}{\number\sseqentrysize sp}{\number\sseq@xgap sp}{0pt}}
+ \expandafter\tempcmd\sseq@xrange
+ \sseqx=\dimen0
+ \edef\tempcmd{\noexpand\range@getabsoluteposition{#2}{\number\sseqentrysize sp}{\number\sseq@ygap sp}{0pt}}
+ \ifoutofrange
+  \expandafter\tempcmd\sseq@yrange
+  \outofrangetrue
+ \else
+  \expandafter\tempcmd\sseq@yrange
+ \fi
+ \sseqy=\dimen0
 }
 
 \def\putxyq#1{\toks0={#1}%
- \edef\act{\noexpand\sseqcmdlist={\the\sseqcmdlist \the\toks0}}
+ \edef\act{\noexpand\sseqcmdlist={\the\sseqcmdlist \the\toks0}}%
  \act
 }
 \def\putxy#1{%
- \edef\act{\noexpand\sseqcmdlist={\the\sseqcmdlist #1}}
+ \edef\act{\noexpand\sseqcmdlist={\the\sseqcmdlist #1}}%
  \act
 }
 
 \def\sseqwritecolor#1{
 \ifthenelse{\boolean{usescolor}}{
-  \putxy {[#1]}
+  \putxy{\noexpand\color{#1}}
 }{}
 }
 
 \def\sseqconcludeconnection{
-\sseqconncommand
-\setboolean{sseqhasopenconn}{false}
+ \sseqconncommand
+ \setboolean{sseqhasopenconn}{false}
 }
 
 \def\dropvarname#1#2{\csname sseqdrop#1,#2\endcsname}
@@ -164,59 +270,114 @@
   \PackageError{sseq}{cannot open position (#1,#2): multiple drops}{You cannot specify this position by coordinates. Instead, name it.}
  \fi
 }
-
-\def\ssopenposition#1#2{
-\ifuniquedrop{#1}{#2}
- \def\sseqcurrentname{ss(#1,#2)1}
- \putxy{"\sseqcurrentname"}
-\else \ssdroperrormsg{#1}{#2}
-\fi
-\setboolean{sseqhasfinishedpos}{false}
+\def\sseq@updatecurrentdata{
+ \@eval\ss@getcoords{{\number\sseqposx}{\number\sseqposy}}
+ \sseqabsposx=\sseqx
+ \sseqabsposy=\sseqy
+ \let\ifcurroutofrange\ifoutofrange
 }
 
-\newcommand{\ssassertsource}{
-\ifthenelse{\boolean{sseqhasfinishedpos}}{
-\ssopenposition{\the\sseqposx}{\the\sseqposy}
-}
-{}
+\def\sseq@openposition{
+ \ifuniquedrop{\the\sseqposx}{\the\sseqposy}
+  \edef\sseq@currentname{ss(\number\sseqposx,\number\sseqposy)1}
+ \else
+  \ssdroperrormsg{\the\sseqposx}{\the\sseqposy}
+  \def\sseq@currentname{}
+ \fi
 }
 
-\newcommand{\ssputsemicolon}{
-\putxy{;}
-\ifthenelse{\boolean{sseqcurrclip}}{
- \setboolean{sseqprevclip}{true}}{
- \setboolean{sseqprevclip}{false}}
+\def\ssassertsource{
+ \sseq@flushconn
+ \ifx\sseq@currentname\empty
+  \sseq@openposition
+ \fi
 }
 
-\newcommand{\ssfinishpos}{
-\ifthenelse{\boolean{sseqhasfinishedpos}}{}{
-\setboolean{sseqhasfinishedpos}{true}
-\ssputsemicolon
+\def\ssfinishpos{
+ \sseq@flushconn
+ \ifx\sseq@currentname\empty
+ \else
+   \ifthenelse{\boolean{sseqhasopenconn}}
+   {
+     \sseqconcludeconnection
+   }{}
+   \edef\sseq@previousname{\sseq@currentname}
+   \def\sseq@currentname{}
+ \fi
 }
-\ifthenelse{\boolean{sseqhasopenconn}}
-{
-  \ssopenposition{\the\sseqposx}{\the\sseqposy}
-  \sseqconcludeconnection
-  \ifthenelse{\boolean{sseqhasfinishedpos}}{}{
-  \setboolean{sseqhasfinishedpos}{true}
-  \ssputsemicolon}
-}{}
+
+\def\sspacksmart#1#2{
+ \ifcase\count11
+  % ^^A 0
+  \PackageError{sseq}{This can't happen!}{Internal error. Contact the author.}
+ \or % ^^A 1
+  \sseqrearrange{#1}{#2}{\the\count1}{\the\dimen6}{\the\dimen5}
+  \advance\sseqx by \dimen5
+  \advance\sseqy by \dimen6
+ \or % ^^A 2
+  \sseqrearrange{#1}{#2}{\the\count2}{0pt}{\the\dimen5}
+  \sseqrearrange{#1}{#2}{\the\count2}{0pt}{\the\dimen5}
+  \advance\sseqy by \dimen6
+ \or % ^^A 3
+  \sseqrearrange{#1}{#2}{\the\count3}{\the\dimen6}{0pt}
+  \advance\sseqx by \dimen5
+  \advance\sseqy by \dimen6
+ \or % ^^A 4 -- give up on being clever and put everything in one diagonal row.
+  \sseqrearrange{#1}{#2}{\the\count2}{\the\dimen6}{\the\dimen6}
+  \sseqrearrange{#1}{#2}{\the\count3}{\the\dimen5}{0pt}
+  \sseqrearrange{#1}{#2}{\the\count3}{\the\dimen5}{0pt}
+  \sseqrearrange{#1}{#2}{\the\count4}{\the\dimen5}{\the\dimen6}
+  \advance\sseqx by \dimen5
+  \advance\sseqx by \dimen5
+  \advance\sseqx by \dimen5
+  \advance\sseqy by \dimen6
+  \advance\sseqy by \dimen6
+  \advance\sseqy by \dimen6
+ \else
+  \advance\count11 by -1
+  \multiply\dimen5 by \count11
+  \multiply\dimen6 by \count11
+  \advance\sseqx by \dimen5
+  \advance\sseqy by \dimen6
+ \fi
 }
 
-\newcommand{\ssnewpos}{
-\ssfinishpos
-\setboolean{sseqhasfinishedpos}{false}
+\def\sspackhorizontal#1#2{
+ \divide\dimen6 by 2
+ \divide\dimen5 by 2
+ \for\count10=1 \to \count11 \do
+   \sseqrearrange{#1}{#2}{\the\count\count10}{\the\dimen6}{0pt}
+ \od
+ \multiply\dimen5 by \count11
+ \advance\sseqx by \dimen5
+}
+\def\sspackvertical#1#2{
+ \divide\dimen6 by 2
+ \divide\dimen5 by 2
+ \for\count10=1 \to \count11 \do
+   \sseqrearrange{#1}{#2}{\the\count\count10}{0pt}{\the\dimen6}
+ \od
+ \multiply\dimen5 by \count11
+ \advance\sseqy by \dimen5
+}
+\def\sspackdiagonal#1#2{
+ \divide\dimen6 by 2
+ \divide\dimen5 by 2
+ \for\count10=1 \to \count11 \do
+   \sseqrearrange{#1}{#2}{\the\count\count10}{\the\dimen6}{\the\dimen5}
+ \od
+ \multiply\dimen5 by \count11
+ \multiply\dimen6 by \count11
+ \advance\sseqx by \dimen5
+ \advance\sseqy by \dimen6
 }
 
-\def\ssifposinclippingregion#1#2{
-  \ssclippedtrue
-  \ifthenelse{\boolean{sseqclip}}{
-   \ifnum#1<\sseqxstart \ssclippedfalse \fi
-   \ifnum#1<\sseqxend \else \ssclippedfalse \fi
-   \ifnum#2<\sseqystart \ssclippedfalse \fi
-   \ifnum#2<\sseqyend \else \ssclippedfalse \fi
-  }{}
-  \ifssclipped
+\def\sseqpack#1#2{
+\expandafter\ifx\sseqpacking\ssequndefined
+ \PackageError{sseq}{Unknown packing option, reverting to \string\sspacksmart}{You apparently have redefined \string\sspacksmart. The only allowed values are: \string\sspacksmart,\string\sspackhorizontal,\string\sspackdiagonal,\string\sspackvertical.}
+ \gdef\sseqpacking{\sspacksmart}
+\fi
+\sseqpacking{#1}{#2}
 }
 
 \def\sseqrearrange#1#2#3#4#5{
@@ -240,44 +401,32 @@
    \expandafter\count\the\count11=\count10
   \fi
  \od
- % ^^A Now count11 contains the number of previously dropped objects that have to be rearranged.
- \ifcase\count11
-  % ^^A 0
-  \PackageError{sseq}{This can't happen!}{Internal error. Contact the author.}
- \or % ^^A 1
-  \sseqrearrange{#1}{#2}{\the\count1}{\the\dimen6}{\the\dimen5}
-  \advance\sseqx by \dimen5
-  \advance\sseqy by \dimen6
- \or % ^^A 2
-  \sseqrearrange{#1}{#2}{\the\count2}{0pt}{\the\dimen5}
-  \sseqrearrange{#1}{#2}{\the\count2}{0pt}{\the\dimen5}
-  \advance\sseqy by \dimen6
- \or % ^^A 3
-  \sseqrearrange{#1}{#2}{\the\count3}{\the\dimen6}{0pt}
-  \advance\sseqx by \dimen5
+ \ifnum\count11<9
  \else
-  \PackageError{sseq}{Too many drops at (#1,#2)}{The sseq.sty algorithm can only place up to four independent drops in one position.}
+   \PackageError{sseq}{Too many drops at (#1,#2)}{The sseq.sty algorithm can only place up to nine independent drops in one position.}
  \fi
+ \sseqpack{#1}{#2}
 }
 
-\newcommand{\ssplacespecial}[4]{
-\ifthenelse{\boolean{sseqhasfinishedpos}}{}{
- \ssputsemicolon
-}
-\setboolean{sseqhasfinishedpos}{false}
-\sseqx=\sseqentrysize
-\multiply\sseqx \sseqxdir
-\multiply\sseqx by #1
-\advance\sseqx by \sseqhalfentry
-\advance\sseqx by \sseqoffsetx
-\advance\sseqx by \sseqoffx
-\sseqy=\sseqentrysize
-\multiply\sseqy \sseqydir
-\multiply\sseqy by #2
-\advance\sseqy by \sseqhalfentry
-\advance\sseqy by \sseqoffsety
-\advance\sseqy by \sseqoffy
-\expandafter\def\expandafter\tmpname\expandafter{\csname sseqdrop#1,#2\endcsname}
+\def\ss@setshapesep#1{
+ \ifdim\ss@currsep=#1\else
+   \putxy{\noexpand\pgfsetshapeinnerxsep{#1}\noexpand\pgfsetshapeinnerysep{#1}}
+   \ss@currsep=#1
+ \fi
+}
+
+\def\sseq@setcircumference{
+ \expandafter\ss@size\expandafter=\expandafter\csname\sseq@currentname size\endcsname
+ \advance\ss@size by 1pt
+ \ss@setshapesep{\the\ss@size}
+}
+
+\def\ss@placespecial#1#2#3#4#5{
+ \ssfinishpos
+ \ss@getcoords{#1}{#2}
+ \advance\sseqx by \sseqhalfentry
+ \advance\sseqy by \sseqhalfentry
+ \expandafter\def\expandafter\tmpname\expandafter{\csname sseqdrop#1,#2\endcsname}
 \ifnodrop{#1}{#2}
 \expandafter\def\tmpname{1}
 \else
@@ -287,114 +436,136 @@
  \advance\count0 by 1
  \expandafter\edef\tmpname{\the\count0}
 \fi
-\putxy{<\csname sseqcoordx<#1,#2>\tmpname\endcsname,\csname sseqcoordy<#1,#2>\tmpname \endcsname>}
+\putxyq{\pgftransformshift}
+\putxy{{\noexpand\pgfpoint{\csname sseqcoordx<#1,#2>\tmpname\endcsname}{\csname sseqcoordy<#1,#2>\tmpname \endcsname}}}
+\ifoutofrange % ^^A Outside clipping region -- produce an empty node
+ \putxyq{\pgfnode{coordinate}{center}{}}
+ % ^^A now give it a unique name
+ \putxy{{ss(#1,#2)\tmpname}}
+ \putxyq{{}}
+\else
+ \sseqwritecolor{\ssplacecolor}
+ \putxyq{\pgfnode{#3}{center}}
+ \putxyq{{#5}}
+ \putxy{{ss(#1,#2)\tmpname}}
+ \putxyq{{#4}}
+\fi
+\putxyq{\pgftransformreset}
+\def\temp{#5}
+\ifx\temp\empty % ^^A It's a bullet or a circle or such
+  \dimen0=1pt
+\else
+  \setbox0=\hbox{#5}
+  \dimen0=0.5\wd0
+\fi
 \expandafter\edef\csname sseqcoordx<#1,#2>\tmpname\endcsname{\the\sseqx}
 \expandafter\edef\csname sseqcoordy<#1,#2>\tmpname\endcsname{\the\sseqy}
+\expandafter\edef\csname ss(#1,#2)\tmpname size\endcsname{\number\dimen0 sp}
 \expandafter\def\csname sseqwillmove<#1,#2>\tmpname\endcsname{1}
-\setboolean{sseqcurrclip}{true}
-\ssifposinclippingregion{#1}{#2}
- \setboolean{sseqcurrclip}{false}
- \putxy{*#3}
- \sseqwritecolor{\ssplacecolor}
- \putxy{#4}
-\fi
-\edef\sseqcurrentname{ss(#1,#2)\tmpname}
-\putxy{="\sseqcurrentname"}
+\edef\sseq@currentname{ss(#1,#2)\tmpname}
 \ifthenelse{\boolean{sseqhasopenconn}}{\sseqconcludeconnection}{}
 }
 
 \newcommand{\ssplace}[3]{
-\ssplacespecial{#1}{#2}{}{{#3}}
+ \ss@setshapesep{0pt}
+ \putxyq{\pgfsetdash{}{0pt}}
+ \ss@placespecial{#1}{#2}{rectangle}{\pgfusepath{discard}}{\ensuremath{#3}}
 }
 
 \newcommand{\ssplaceboxed}[3]{
- \ifthenelse{\boolean{usescolor}}{
-   \ssplacespecial{#1}{#2}{+<2pt>[F:\ssplacecolor]}{{#3}}
- }{
-   \ssplacespecial{#1}{#2}{+<2pt>}{{#3}}
- }
+ \ss@setshapesep{1pt}
+ \putxyq{\pgfsetdash{}{0pt}}
+ \ss@placespecial{#1}{#2}{rectangle}{\pgfusepath{stroke}}{\ensuremath{#3}}
 }
 
 \newcommand{\ssplacecircled}[3]{
-\ifthenelse{\equal{#3}{1}}{
- \ssplacespecial{#1}{#2}{}{[o]{\copy\sseqcircledone}}}{
- \ifthenelse{\equal{#3}{2}}{
-  \ssplacespecial{#1}{#2}{}{[o]{\copy\sseqcircledtwo}}}{
-  \ifthenelse{\equal{#3}{3}}{
-   \ssplacespecial{#1}{#2}{}{[o]{\copy\sseqcircledthree}}}{
-   \ifthenelse{\equal{#3}{4}}{
-    \ssplacespecial{#1}{#2}{}{[o]{\copy\sseqcircledfour}}}{
-    \ifthenelse{\equal{#3}{5}}{
-     \ssplacespecial{#1}{#2}{}{[o]{\copy\sseqcircledfive}}}{
-     \ifthenelse{\equal{#3}{6}}{
-      \ssplacespecial{#1}{#2}{}{[o]{\copy\sseqcircledsix}}}{
-      \ifthenelse{\equal{#3}{7}}{
-       \ssplacespecial{#1}{#2}{}{[o]{\copy\sseqcircledseven}}}{
-       \ifthenelse{\equal{#3}{8}}{
-        \ssplacespecial{#1}{#2}{}{[o]{\copy\sseqcircledeight}}}{
-        \ifthenelse{\equal{#3}{9}}{
-         \ssplacespecial{#1}{#2}{}{[o]{\copy\sseqcirclednine}}}{
-         \ifthenelse{\boolean{usescolor}}{
-          \ssplacespecial{#1}{#2}{+<3pt>}{[o][F:\ssplacecolor]{#3}}
-         }{
-          \ssplacespecial{#1}{#2}{+<3pt>}{[o]{#3}}
-         }
-        }
-       }
-      }
-     }
-    }
-   }
-  }
- }
-}
-}
-
-\newcommand{\ssbull}[2]{
-\ifthenelse{\boolean{usescolor}}{
- \ssplacespecial{#1}{#2}{+<1.1mm>[o][F:\ssplacecolor]}{{}*[\ssplacecolor]\noexpand\frm{*}}
+ \ifthenelse{\equal{#3}{1}
+         \OR \equal{#3}{2}
+         \OR \equal{#3}{3}
+         \OR \equal{#3}{4}
+         \OR \equal{#3}{5}
+         \OR \equal{#3}{6}
+         \OR \equal{#3}{7}
+         \OR \equal{#3}{8}
+         \OR \equal{#3}{9}}{
+  \ss@setshapesep{-.3ex}
+  \count0=191
+  \advance\count0 by #3
+  \def\ss@tmpcmd{\ss@placespecial{#1}{#2}{circle}{\pgfusepath{discard}}}
+  \expandafter\ss@tmpcmd\expandafter{\expandafter\ding\expandafter{\the\count0}}
  }{
- \ssplacespecial{#1}{#2}{+<1.1mm>[o]}{{}*\noexpand\frm{*}}
+   \putxyq{\pgfsetdash{}{0pt}}
+   \ss@setshapesep{0pt}
+   \ss@placespecial{#1}{#2}{circle}{\pgfusepath{stroke}}{\ensuremath{#3}}
  }
 }
 
-\newcommand{\sscirc}[2]{
-\ssplacespecial{#1}{#2}{}{[o]-={\circ}}
-}
-
 \newcommand{\ssglobalname}[1]{\currprefix#1}
 
 \def\sssetglobalname#1{
  \ssassertsource
- \expandafter\edef\csname sseqpos<#1>\endcsname{\sseqcurrentname}
+ \expandafter\edef\csname sseqpos<#1>\endcsname{\sseq@currentname}
  \expandafter\edef\csname sseqx<#1>\endcsname{\the\sseqposx}
  \expandafter\edef\csname sseqy<#1>\endcsname{\the\sseqposy}
 }
 \newcommand{\ssmoveto}[2]{
+ \ifthenelse{\boolean{sseqhasopenconn}}
+ {
+   \sseqconcludeconnection
+ }{}
 \ssfinishpos
 \sseqposx=#1
 \sseqposy=#2
-\ssifposinclippingregion{#1}{#2}
- \setboolean{sseqcurrclip}{false}
-\fi
+\sseq@updatecurrentdata
 }
 \newcommand{\ssmove}[2]{
-\count0=\sseqposx
-\advance\count0 by #1
-\count1=\sseqposy
-\advance\count1 by #2
-\ssmoveto{\count0}{\count1}
-}
-\newcommand{\ssdrop}[1]{
-\ssplace {\the\sseqposx} {\the\sseqposy} {#1}
-}
-\newcommand{\ssdropbull}{\ssbull {\the\sseqposx} {\the\sseqposy}}
-\newcommand{\ssdropboxed}[1]{
-\ssplaceboxed {\the\sseqposx} {\the\sseqposy} {#1}
-}
-\newcommand{\ssdropcircled}[1]{
-\ssplacecircled {\the\sseqposx} {\the\sseqposy} {#1}
+\sseqi=\sseqposx
+\advance\sseqi by #1
+\sseqj=\sseqposy
+\advance\sseqj by #2
+\@eval\ssmoveto{{\number\sseqi}{\number\sseqj}}
+}
+\define@key{sseqdrop}{circled}[true]{\newif\ifKV@sseqdrop@circled\csname KV@sseqdrop@circled#1\endcsname}
+\define@key{sseqdrop}{boxed}[true]{\newif\ifKV@sseqdrop@boxed\csname KV@sseqdrop@boxed#1\endcsname}
+\define@key{sseqdrop}{color}{\def\ssplacecolor{#1}}
+\define@key{sseqdrop}{name}{\def\sseq@name{#1}}
+\def\ssdrop{\@ifnextchar[\sseq@drop{\sseq@drop[]}}
+\def\sseq@drop[#1]#2{
+ \edef\sseq@savecolor{\ssplacecolor}
+ \def\sseq@name{\relax}
+ \presetkeys{sseqdrop}{circled=false,boxed=false}{}
+ \setkeys{sseqdrop}{#1}
+ \ifKV@sseqdrop@circled
+   \ssplacecircled{\number\sseqposx}{\number\sseqposy}{#2}
+ \else
+   \ifKV@sseqdrop@boxed
+     \ssplaceboxed{\number\sseqposx}{\number\sseqposy}{#2}
+   \else
+     \def\temp{#2}
+ \def\temptwo{\bullet}
+ \ifx\temp\temptwo
+   \ss@setshapesep{0pt}
+       \ss@placespecial{\number\sseqposx}{\number\sseqposy}{circle}{\pgfusepath{fill}}{}
+ \else
+   \def\temptwo{\circle}
+   \ifx\temp\temptwo
+     \ss@setshapesep{0pt}
+         \ss@placespecial{\number\sseqposx}{\number\sseqposy}{circle}{\pgfusepath{stroke}}{}
+       \else
+         \ssplace{\number\sseqposx}{\number\sseqposy}{#2}
+   \fi
+ \fi
+   \fi
+ \fi
+ \edef\ssplacecolor{\sseq@savecolor}
+ \def\temp{\relax}
+ \ifx\sseq@name\temp \else
+   \@eval\ssname{{\sseq@name}}
+ \fi
 }
+\newcommand{\ssdropbull}{\ssdrop{\bullet}}
+\newcommand{\ssdropboxed}[1]{\ssdrop[boxed]{#1}}
+\newcommand{\ssdropcircled}[1]{\ssdrop[circled]{#1}}
 \def\ssname#1{
  \sssetglobalname{\ssglobalname{#1}}
 }
@@ -406,182 +577,322 @@
 }
 \newcommand{\ssresetprefix}{\def\currprefix{}}
 \newcommand{\ssabsgoto}[1]{
-\ssnewpos
-\edef\ssoldconncolor{\ssconncolor}
-\putxy{"\csname sseqpos<#1>\endcsname"}
-\sseqposx=\csname sseqx<#1>\endcsname
-\sseqposy=\csname sseqy<#1>\endcsname
-\ssifposinclippingregion{\the\sseqposx}{\the\sseqposy}
- \setboolean{sseqcurrclip}{false}
+ \ifthenelse{\boolean{sseqhasopenconn}}
+ {
+   \sseqconcludeconnection
+ }{}
+ \ssfinishpos
+ \edef\sseq@currentname{\csname sseqpos<#1>\endcsname}
+ \sseqposx=\csname sseqx<#1>\endcsname
+ \sseqposy=\csname sseqy<#1>\endcsname
+ \sseq@updatecurrentdata
+}
+\define@key{sseqlabel}{color}{\def\sslabelcolor{#1}}
+\define@key{sseqlabel}{pos}{\def\sseq@position{#1}}
+\define@key{sseqlabel}{U}[]{\def\sseq@position{U}}
+\define@key{sseqlabel}{LU}[]{\def\sseq@position{LU}}
+\define@key{sseqlabel}{L}[]{\def\sseq@position{L}}
+\define@key{sseqlabel}{LD}[]{\def\sseq@position{LD}}
+\define@key{sseqlabel}{D}[]{\def\sseq@position{D}}
+\define@key{sseqlabel}{RD}[]{\def\sseq@position{RD}}
+\define@key{sseqlabel}{R}[]{\def\sseq@position{R}}
+\define@key{sseqlabel}{RU}[]{\def\sseq@position{RU}}
+\def\ssdroplabel{\@ifnextchar[\sseq@droplabel{\sseq@droplabel[]}}
+\def\sseq@droplabel[#1]#2{
+\ssassertsource
+\ifcurroutofrange\else
+ \edef\sseq@savecolor{\sslabelcolor}
+ \def\sseq@position{L}
+ \setkeys{sseqlabel}{#1}
+ \ifthenelse{\equal{\sseq@position}{U}}{\def\sseq@anchor{north} \def\sseq@link{south}}{}
+ \ifthenelse{\equal{\sseq@position}{LU}}{\def\sseq@anchor{north west} \def\sseq@link{south east}}{}
+ \ifthenelse{\equal{\sseq@position}{L}}{\def\sseq@anchor{west} \def\sseq@link{east}}{}
+ \ifthenelse{\equal{\sseq@position}{LD}}{\def\sseq@anchor{south west} \def\sseq@link{north east}}{}
+ \ifthenelse{\equal{\sseq@position}{D}}{\def\sseq@anchor{south} \def\sseq@link{north}}{}
+ \ifthenelse{\equal{\sseq@position}{RD}}{\def\sseq@anchor{south east} \def\sseq@link{north west}}{}
+ \ifthenelse{\equal{\sseq@position}{R}}{\def\sseq@anchor{east} \def\sseq@link{west}}{}
+ \ifthenelse{\equal{\sseq@position}{RU}}{\def\sseq@anchor{north east} \def\sseq@link{south west}}{}
+ \sseqwritecolor{\sslabelcolor}
+ \putxyq{\pgftransformshift}
+ \putxy{{\noexpand\pgfpointanchor{\sseq@currentname}{\sseq@anchor}}}
+ \putxyq{\pgfnode{rectangle}}
+ \putxy{{\sseq@link}}
+ \putxyq{{\ensuremath{#2}}{}{\pgfusepath{discard}}}
+ \putxyq{\pgftransformreset}
+ \edef\sslabelcolor{\sseq@savecolor}
 \fi
 }
-\newcommand{\ssdroplabel}[2][U]{
-\ssassertsource
-\ssifposinclippingregion{\the\sseqposx}{\the\sseqposy}
- \putxy{="prev"}
- \ifthenelse{\boolean{usescolor}}{
-  \ifthenelse{\equal{#1}{U}}{
-   \putxy{+U*[\sslabelcolor]!D{#2}}}{}
-  \ifthenelse{\equal{#1}{LU}}{
-  \putxy{+LU*[\sslabelcolor]!RD{#2}}}{}
-  \ifthenelse{\equal{#1}{RU}}{
-  \putxy{+RU*[\sslabelcolor]!LD{#2}}}{}
-  \ifthenelse{\equal{#1}{R}}{
-  \putxy{+R*[\sslabelcolor]!L{#2}}}{}
-  \ifthenelse{\equal{#1}{L}}{
-  \putxy{+L*[\sslabelcolor]!R{#2}}}{}
-  \ifthenelse{\equal{#1}{D}}{
-  \putxy{+D*[\sslabelcolor]!U{#2}}}{}
-  \ifthenelse{\equal{#1}{LD}}{
-  \putxy{+LD*[\sslabelcolor]!RU{#2}}}{}
-  \ifthenelse{\equal{#1}{RD}}{
-  \putxy{+RD*[\sslabelcolor]!LU{#2}}}{}
+\def\ssdropextension{
+ \ssassertsource
+ \expandafter\def\expandafter\tmpname\expandafter{\csname sseqdrop\the\sseqposx,\the\sseqposy\endcsname}
+ \edef\setcnt{\noexpand\count0=\tmpname}
+ \setcnt
+ \advance\count0 by 1
+ \expandafter\edef\tmpname{\the\count0}
+ \putxyq{\pgftransformshift}
+ \putxy{{\noexpand\pgfpointanchor{\sseq@currentname}{center}}}
+ \ifoutofrange
+  \putxyq{\pgfnode{coordinate}{center}{}}
+  \putxy{{ss(\the\sseqposx,\the\sseqposy)\tmpname}{}}
+ \else
+   \sseqwritecolor{\ssplacecolor}
+   \sseq@setcircumference
+   \putxyq{\pgfnode{circle}{center}{}}
+   \putxy{{ss(\the\sseqposx,\the\sseqposy)\tmpname}}
+   \putxyq{{\pgfusepath{stroke}}}
+ \fi
+ \putxyq{\pgftransformreset}
+ \edef\sseq@currentname{ss(\number\sseqposx,\number\sseqposy)\tmpname}
+ \expandafter\edef\csname \sseq@currentname size\endcsname{\number\ss@size sp}
+ \ifthenelse{\boolean{sseqhasopenconn}}{\sseqconcludeconnection}{}
+}
+\def\ssprepareline#1#2{
+ \ssassertsource\ssfinishpos
+ \advance\sseqposx by #1
+ \advance\sseqposy by #2
+ \sseq@updatecurrentdata
+ \setboolean{sseqhasopenconn}{true}
+}
+\def\extractcoords ss(#1,#2)#3{{#1}{#2}}
+\def\sseq@flushconn{
+ \ifx\sseq@connbuffer\empty\else
+   \ifsseq@connreverse
+     \putxy{\noexpand\pgfsetarrows{\sseq@currarrowend-\sseq@currarrowstart}}
+   \else
+     \putxy{\noexpand\pgfsetarrows{\sseq@currarrowstart-\sseq@currarrowend}}
+   \fi
+   \sseq@connbuffer
+   \def\sseq@connbuffer{}
+   \def\sseq@currarrowstart{}
+   \def\sseq@currarrowend{}
+ \fi
+}
+\def\sseq@connection#1#2#3{
+ \sseq@flushconn
+ \ifthenelse{\boolean{#3}}{}{\ssassertsource}
+ \sseq@connreversefalse
+ \edef\sseq@prevxy{\expandafter\extractcoords\sseq@previousname}
+ \expandafter\ss@getcoords\sseq@prevxy
+ \ifcurroutofrange
+   \ifoutofrange % ^^A both out of range -- do nothing
+   \else % ^^Afrom within range to out of range -- draw a void line
+     % ^^A need to recompute the relative coordinates
+     \@eval\sseq@diffhelper{\sseq@prevxy{\number\sseqposx}{\number\sseqposy}}
+     \@eval\sseq@lineintooff{{\sseq@previousname}\sseq@prevxy{\number\count0}{\number\count1}{#1}{#2}}
+   \fi
+ \else
+   \ifoutofrange % ^^A from out of range to within range -- draw a void line
+     \ifthenelse{\boolean{#3}}{}{ % ^^A if the target is also void -- do nothing.
+       \sseq@connreversetrue
+       \@eval\sseq@diffhelper{{\number\sseqposx}{\number\sseqposy}\sseq@prevxy}
+       \@eval\sseq@lineintooff{{\sseq@currentname}{\sseqposx}{\sseqposy}{\number\count0}{\number\count1}{#1}{#2}}
+ }
+   \else
+     \putxyq{\pgfsetdash{#1}{0pt}}
+ \ifthenelse{\boolean{#3}}{ % ^^A draw a void line
+   \multiply\sseqx by -1
+   \advance\sseqx by \sseqabsposx
+   \multiply\sseqy by -1
+   \advance\sseqy by \sseqabsposy
+       \putxy{\noexpand\pgftransformshift{\noexpand\pgfpointanchor{\sseq@previousname}{center}}}
+       \putxyq{\pgfpathmoveto}
+       \putxy{{\noexpand\pgfpointshapeborder{\sseq@previousname}%
+                                            {\noexpand\pgfpoint{\the\sseqx}{\the\sseqy}}}}
  }{
-  \ifthenelse{\equal{#1}{U}}{
-   \putxy{+U*!D{#2}}}{}
-  \ifthenelse{\equal{#1}{LU}}{
-  \putxy{+LU*!RD{#2}}}{}
-  \ifthenelse{\equal{#1}{RU}}{
-  \putxy{+RU*!LD{#2}}}{}
-  \ifthenelse{\equal{#1}{R}}{
-  \putxy{+R*!L{#2}}}{}
-  \ifthenelse{\equal{#1}{L}}{
-  \putxy{+L*!R{#2}}}{}
-  \ifthenelse{\equal{#1}{D}}{
-  \putxy{+D*!U{#2}}}{}
-  \ifthenelse{\equal{#1}{LD}}{
-  \putxy{+LD*!RU{#2}}}{}
-  \ifthenelse{\equal{#1}{RD}}{
-  \putxy{+RD*!LU{#2}}}{}
+       \putxyq{\pgfpathmoveto}
+       \putxy{{\noexpand\pgfpointshapeborder{\sseq@previousname}{\noexpand \pgfpointanchor{\sseq@currentname}{center}}}}
  }
- \putxy{;"prev"}
-\fi
-}
-\newcommand{\ssdropextension}{
-\ssassertsource
-\expandafter\def\expandafter\tmpname\expandafter{\csname sseqdrop\the\sseqposx,\the\sseqposy\endcsname}
-\edef\setcnt{\noexpand\count0=\tmpname}
-\setcnt
-\advance\count0 by 1
-\expandafter\edef\tmpname{\the\count0}
-\setboolean{sseqcurrclip}{true}
-\ssifposinclippingregion{\the\sseqposx}{\the\sseqposy}
- \setboolean{sseqcurrclip}{false}
- \putxy{*+<1mm,1mm>\noexpand\frm{}*}
- \sseqwritecolor{\ssplacecolor}
- \putxyq{\cir{}}
-\fi
-\edef\sseqcurrentname{ss(\the\sseqposx,\the\sseqposy)\tmpname}
-\putxy{="\sseqcurrentname"}
-\ifthenelse{\boolean{sseqhasopenconn}}{\sseqconcludeconnection}{}
+     \def\sseq@temp{#2}
+     \ifx\sseq@temp\empty
+       \putxyq{\pgfpathlineto}
+     \else
+       \putxyq{\pgfsnakesegmentamplitude=#2pc}
+       \putxyq{\multiply\pgfsnakesegmentamplitude by 3 }
+       \putxyq{\pgfsnakesegmentaspect=.3}
+       \putxyq{\pgfpathsnaketo{bent}}
+     \fi
+ \ifthenelse{\boolean{#3}}{
+       \putxy{{\noexpand\pgfpoint{\the\sseqx}{\the\sseqy}}}
+ }{
+       \putxy{{\noexpand\pgfpointshapeborder{\sseq@currentname}{\noexpand \pgfpointanchor{\sseq@previousname}{center}}}}
+     } \edef\sseq@connbuffer{\noexpand\sseqwritecolor{\ssconncolor}\noexpand\putxyq{\noexpand\pgfusepath{stroke}\noexpand\pgftransformreset}}
+   \fi
+ \fi
 }
+\def\sseq@diffhelper#1#2#3#4{
+  \count0=#1
+  \multiply\count0 by -1
+  \advance\count0 by #3
+  \count1=#2
+  \multiply\count1 by -1
+  \advance\count1 by #4
+}
+\define@key{sseqstroke}{color}{\def\ssconncolor{#1}}
+\define@key{sseqstroke}{curve}{\def\sseq@curve{#1}}
+\define@key{sseqstroke}{dashed}[{{2pt}{2pt}}]{\def\sseq@dashing{#1}}
+\define@key{sseqstroke}{dotted}[{{.5pt}{2pt}}]{\def\sseq@dashing{#1}}
+\define@key{sseqstroke}{arrowfrom}[\sseq@defaultarrowstyle]{\edef\sseq@arrowfrom{#1}}
+\define@key{sseqstroke}{arrowto}[\sseq@defaultarrowstyle]{\edef\sseq@arrowto{#1}}
+\define@key{sseqstroke}{void}[true]{\newif\ifKV@sseqstroke@void\csname KV@sseqstroke@void#1\endcsname}
+\def\ssstroke{\@ifnextchar[\sseq@stroke{\sseq@stroke[]}}
+\def\sseq@stroke[#1]{
+ \edef\sseq@savecolor{\ssconncolor}
+ \def\sseq@dashing{}
+ \def\sseq@curve{}
+ \edef\sseq@arrowfrom{\sseq@currarrowstart}
+ \edef\sseq@arrowto{\sseq@currarrowend}
+ \presetkeys{sseqstroke}{void=false}{}
+ \setkeys{sseqstroke}{#1}
+ \ifKV@sseqstroke@void % ^^A a void line
+   \@eval\sseq@connection{{\sseq@dashing}{\sseq@curve}{true}}
+ \else
+   \@eval\sseq@connection{{\sseq@dashing}{\sseq@curve}{false}}
+ \fi
+ \edef\sseq@currarrowstart{\sseq@arrowfrom}
+ \edef\sseq@currarrowend{\sseq@arrowto}
+ \edef\ssconncolor{\sseq@savecolor}
+}
+\newcommand{\sscurve}[1]{\sseq@stroke[curve=#1]}
+\newcommand{\ssdashedstroke}{\sseq@stroke[dashed]}
+\newcommand{\ssdashedcurve}[1]{\sseq@stroke[dashed,curve=#1]}
+\newcommand{\ssdottedstroke}{\sseq@stroke[dotted]}
+\newcommand{\ssdottedcurve}[1]{\sseq@stroke[dotted,curve=#1}
+\newcommand{\ssarrowhead}[1][\sseq@defaultarrowstyle]{\edef\sseq@currarrowend{#1}}
+\newcommand{\ssinversearrowhead}[1][\sseq@defaultarrowstyle]{\edef\sseq@currarrowstart{#1}}
+\def\ssline{\@ifnextchar[\sseq@line{\sseq@line[]}}
+\def\sseq@line[#1]#2#3{
+ \ssprepareline{#2}{#3}
+ \edef\sseqconncommand{\noexpand\ssstroke[color=\ssconncolor,#1]}
+}
+\newcommand{\sscurvedline}[3]{\ssline[curve=#3]{#1}{#2}}
+\newcommand{\ssdashedline}[2]{\ssline[dashed]{#1}{#2}}
+\newcommand{\sscurveddashedline}[3]{\ssline[curve=#3,dashed]{#1}{#2}}
+\newcommand{\ssarrow}[3][]{
+  \ssline[arrowto,#1]{#2}{#3}
+}
+\newcommand{\sscurvedarrow}[3]{\ssline[arrowto,curve=#3]{#1}{#2}}
+\newcommand{\ssdashedarrow}[2]{\ssline[arrowto,dashed]{#1}{#2}}
+\newcommand{\sscurveddashedarrow}[3]{\ssline[arrowto,dashed,curve=#3]{#1}{#2}}
+\def\ssvoidline#1#2{
+  \ssassertsource
+  \edef\sseq@resetcmd{\noexpand\sseqposx=\number\sseqposx%
+  \noexpand\sseqposy=\number\sseqposy%
+  \noexpand\def\noexpand\sseq@currentname{\sseq@currentname}
+  \noexpand\sseq@updatecurrentdata}
+  \ssmove{#1}{#2}
+  \ssstroke[void]
+  \sseq@resetcmd
+}
+\newcommand{\ssvoidarrow}[2]{\ssvoidline{#1}{#2}\ssarrowhead}
+\newcommand{\ssinversevoidarrow}[2]{\ssvoidline{#1}{#2}\ssinversearrowhead}
 
-\newcommand{\ssprepareline}[2]{
-\ifthenelse{\boolean{sseqhasfinishedpos}}{
- \ssopenposition{\the\sseqposx}{\the\sseqposy}
-}{}
-\advance\sseqposx by #1
-\advance\sseqposy by #2
-\setboolean{sseqhasopenconn}{true}
-\edef\ssoldconncolor{\ssconncolor}
+\def\sseq@pointintersectionoflinewithrectangle#1#2#3#4{
+  \pgf@process{#1}
+  \pgf@xa=\pgf@x
+  \pgf@ya=\pgf@y
+  \pgf@process{#2}
+  \pgf@xb=\pgf@x
+  \pgf@yb=\pgf@y
+  \pgf@process{#3}
+  \pgf@xc=\pgf@x
+  \pgf@yc=\pgf@y
+  \pgf@process{#4}
+  \dimen0=100cm % ^^A infinity
+  \dimen1=100cm % ^^A infinity
+  \ifnum\pgf@x>0pt % ^^A line goes to the right
+    \dimen0=\pgf@xb
+    \advance\dimen0 by -\pgf@xc
+    \divide\dimen0 by \pgf@x
+  \fi
+  \ifnum\pgf@x<0pt % ^^A line goes to the left
+    \dimen0=\pgf@xa
+    \advance\dimen0 by -\pgf@xc
+    \divide\dimen0 by \pgf@x
+  \fi
+  \ifnum\pgf@y>0pt % ^^A line goes up
+    \dimen1=\pgf@yb
+    \advance\dimen1 by -\pgf@yc
+    \divide\dimen1 by \pgf@y
+  \fi
+  \ifnum\pgf@y<0pt % ^^A line goes down
+    \dimen1=\pgf@ya
+    \advance\dimen1 by -\pgf@xc
+    \divide\dimen1 by \pgf@y
+  \fi
+  \ifnum\dimen1<\dimen0
+    \dimen0=\dimen1
+  \fi
+  % ^^A now dimen0 contains the stretching factor for #4 to the right point.
+  \multiply\pgf@x by \dimen0
+  \multiply\pgf@y by \dimen0
+  \advance\pgf@x by \pgf@xc
+  \advance\pgf@y by \pgf@yc
 }
 
-\newcommand{\sspreparevoidline}[2]{
-\ifthenelse{\boolean{sseqhasfinishedpos}}{
- \ssopenposition{\the\sseqposx}{\the\sseqposy}
-}{}
-\ifthenelse{\boolean{sseqhasfinishedpos}}{}{
- \ssputsemicolon
-}
-\setboolean{sseqhasfinishedpos}{false}
-\sseqx=\sseqentrysize
-\multiply\sseqx \sseqxdir
-\multiply\sseqx by #1
-\sseqy=\sseqentrysize
-\multiply\sseqy \sseqydir
-\multiply\sseqy by #2
-\putxy{p+<\the\sseqx,\the\sseqy>}
-\edef\ssoldconncolor{\ssconncolor}
-}
-
-\def\sseqifconninclippingregion{%
-\ifthenelse{\boolean{sseqcurrclip}\and\boolean{sseqprevclip}}{
-  \ssclippedfalse}{
-  \ssclippedtrue
- }
- \ifssclipped
-}
-\newcommand{\ssstroke}{
-\ssassertsource
-\sseqifconninclippingregion
- \putxy{**} \sseqwritecolor{\ssoldconncolor}
- \putxyq{\dir{-}}
-\fi
-}
-\newcommand{\sscurve}[1]{
-\ssassertsource
-\sseqifconninclippingregion
- \putxy{**} \sseqwritecolor{\ssoldconncolor}
- \putxyq{\crv{:(.5,#1)}}
-\fi
-}
-\newcommand{\ssdashedstroke}{
-\ssassertsource
-\sseqifconninclippingregion
- \putxy{**} \sseqwritecolor{\ssoldconncolor}
- \putxyq{\dir{--}}
+
+\def\sseq@lineintooff#1#2#3#4#5#6#7{
+  \putxyq{\begin{pgfscope}}
+  \sseqj=0
+  \def\tempcmd{\range@loop{\sseq@findxrange{#2}{#3}}}
+  \expandafter\tempcmd\sseq@xrange
+  \putxyq{\pgfsetdash{#6}{0pt}}
+  \putxyq{\sseq@pointintersectionoflinewithrectangle}
+  \putxy{{\noexpand\pgfpoint{\number \sseqxx sp}{\number \sseqyy sp}}}
+  \putxy{{\noexpand\pgfpoint{\number \sseqx sp}{\number \sseqy sp}}}
+  \putxyq{{\pgfpointanchor{#1}{center}}{\pgfpoint{#4 sp}{#5 sp}}}
+  \putxyq{\sseqx=\pgf@x}
+  \putxyq{\sseqy=\pgf@y}
+  \putxyq{\pgfpathmoveto}
+  \putxy{{\noexpand\pgfpointshapeborder{#1}%
+                                       {\noexpand\pgfpoint{\noexpand\sseqx}{\noexpand\sseqy}}}}
+  \def\temp{#7}
+  \ifx\temp\empty
+    \putxyq{\pgfpathlineto}
+  \else
+    \dimen0=#7pc
+    \ifsseq@connreverse
+  \multiply\dimen0 by -1
 \fi
+    \putxy{\noexpand\pgfsnakesegmentamplitude=\number\dimen0 sp}
+    \putxyq{\advance\pgfsnakesegmentamplitude by \pgfsnakesegmentamplitude}
+    \putxyq{\pgfsnakesegmentaspect=.3}
+    \putxyq{\pgfpathsnaketo{bent}}
+  \fi
+  \putxyq{{\pgfpoint{\sseqx}{\sseqy}}}
+  \edef\sseq@connbuffer{\noexpand\sseqwritecolor{\ssconncolor}%
+                        \noexpand\putxyq{\noexpand\pgfusepath{stroke}\noexpand\end{pgfscope}}}
 }
-\newcommand{\ssdashedcurve}[1]{
-\ssassertsource
-\sseqifconninclippingregion
- \putxy{**} \sseqwritecolor{\ssoldconncolor}
- \putxyq{\crv{~**\dir{--}:(.5,#1)}}
+
+\def\sseq@findxrange#1#2#3#4{
+  \ifnum#1<#3\else
+    \ifnum#1>#4\else
+  % ^^A found the correct range
+  \sseqj=0
+  \def\tempcmd{\range@loop{\sseq@findyrange{#1}{#2}{#3}{#4}}}
+  \expandafter\tempcmd\sseq@yrange
+  \rangebreaktrue
 \fi
+  \fi
 }
-\newcommand{\ssarrowhead}{
-\sseqifconninclippingregion
- \putxy {?>*} \sseqwritecolor{\ssoldconncolor}
- \putxyq{\dir{>}}
+\def\sseq@findyrange#1#2#3#4#5#6{
+  \ifnum#2<#5\else
+    \ifnum#2>#6\else
+  % ^^A found the correct range -- do the drawing
+  \ss@getcoords{#3}{#5} % ^^A lower left corner in \sseqx,\sseqy
+  \advance\sseqx by -\sseq@xleak
+  \advance\sseqy by -\sseq@yleak
+  \sseqxx=\sseqx
+  \sseqyy=\sseqy
+  \ss@getcoords{#4}{#6} % ^^A upper right corner in \sseqx,\sseqy
+  \advance\sseqx by \sseq@xleak
+  \advance\sseqx by \sseqentrysize
+  \advance\sseqy by \sseq@yleak
+  \advance\sseqy by \sseqentrysize
+  \rangebreaktrue
 \fi
-}
-\newcommand{\ssline}[2]{
-\ssprepareline{#1}{#2}
-\def\sseqconncommand{\ssstroke}
-}
-\newcommand{\sscurvedline}[3]{
-\ssprepareline{#1}{#2} \def\sseqconncommand{\sscurve{#3}}
-}
-\newcommand{\ssdashedline}[2]{
-\ssprepareline{#1}{#2} \def\sseqconncommand{\ssdashedstroke}
-}
-\newcommand{\sscurveddashedline}[3]{
-\ssprepareline{#1}{#2} \def\sseqconncommand{\ssdashedcurve{#3}}
-}
-\newcommand{\ssarrow}[2]{
-\ssprepareline{#1}{#2}
-\def\sseqconncommand{\ssstroke\ssarrowhead}
-}
-\newcommand{\sscurvedarrow}[3]{
-\ssprepareline{#1}{#2} \def\sseqconncommand{\sscurve{#3}\ssarrowhead}
-}
-\newcommand{\ssdashedarrow}[2]{
-\ssprepareline{#1}{#2} \def\sseqconncommand{\ssdashedstroke\ssarrowhead}
-}
-\newcommand{\sscurveddashedarrow}[3]{
-\ssprepareline{#1}{#2} \def\sseqconncommand{\ssdashedcurve{#3}\ssarrowhead}
+  \fi
 }
 
-\newcommand{\ssvoidline}[2]{
-\sspreparevoidline{#1}{#2}
-\ssstroke
-\putxy{,p}
-}
-\newcommand{\ssvoidarrow}[2]{
-\sspreparevoidline{#1}{#2}
-\ssstroke\ssarrowhead
-\putxy{,p}
-}
 \newcommand{\ssbullstring}[3]{
 \ifnum#3>0
  \ifnum#3=1
@@ -599,186 +910,286 @@
 \ssbullstring{#1}{#2}{#3}
 \ssvoidarrow{#1}{#2}
 }
-\def\sseqdrawgrid#1#2{
-\sseqi=0
-\sseqj=0
-\loop
- \sseqy=\sseqentrysize
- \multiply \sseqy by \sseqj
- \advance \sseqy by \sseqlabelbarwidth
- %
- \putxy{<\the\sseqlabelbarwidth,\the\sseqy>;<\the\sseqx,\the\sseqy>**}
- \sseqwritecolor{sseqgr}
- \putxyq{\dir {.},}
- \advance\sseqj 1
-\ifnum\sseqj>#2 \else \repeat
-\sseqy = \sseqentrysize
-\multiply \sseqy by #2
-\advance \sseqy by \sseqlabelbarwidth
-\loop
- \sseqx=\sseqentrysize
- \multiply \sseqx by \sseqi
- \advance \sseqx by \sseqlabelbarwidth
- %
- \putxy{<\the\sseqx,\the\sseqlabelbarwidth>;<\the\sseqx,\the\sseqy>**}
- \sseqwritecolor{sseqgr}
- \putxyq{\dir {.},}
- \advance \sseqi 1
-\ifnum\sseqi>#1 \else \repeat
-}
-\def\sseqdrawlabels#1#2{
-\sseqi=\sseqxstart
-\sseqposx=\sseqxstart
-\multiply \sseqposx by -1
-\advance \sseqposx \sseqi
-\count0=\sseqxdir
-\multiply\count0 by \sseqxdir
-\multiply\count0 by \sseqxstep
-\count1=\sseqydir
-\multiply\count1 by \sseqydir
-\multiply\count1 by \sseqystep
-\loop
- \sseqxx=\sseqentrysize
- \multiply\sseqxx by \sseqposx
- \advance\sseqxx by \sseqhalfentry
- \advance\sseqxx by \sseqlabelbarwidth
- \putxy { <\the\sseqxx,0pt>*}
- \putxyq{\txt\sseqlabelfont}
- \putxy {{\the\sseqi},}
- \advance\sseqi by \sseqxstep
- \advance\sseqposx by \count0
-\ifnum\sseqposx<#1 \repeat
-\sseqj=\sseqystart
-\sseqposy=\sseqj
-\multiply\sseqposy by -1
-\advance\sseqposy by \sseqj
-\loop
- \sseqyy=\sseqentrysize
- \multiply\sseqyy by \sseqposy
- \advance\sseqyy by \sseqhalfentry
- \advance\sseqyy by \sseqlabelbarwidth
- \putxy { <0pt,\the\sseqyy>*}
- \putxyq {\txt\sseqlabelfont}
- \putxy{{\the\sseqj},}
- \advance\sseqj by \sseqystep
- \advance\sseqposy by \count1
-\ifnum\sseqposy<#2\repeat
-}
-
-\newenvironment{sseq}[2]{
-\begingroup
-\countdef\sseqxend=150 \sseqxend=\sseqxstart \advance\sseqxend by #1
-\countdef\sseqyend=151 \sseqyend=\sseqystart \advance\sseqyend by #2
-\dimendef\sseqoffx=200 \sseqoffx=0pt
-\dimendef\sseqoffy=201 \sseqoffy=0pt
-\dimendef\sseqoffsetx=202
-\dimendef\sseqoffsety=203
-\countdef\sseqi=152 \sseqi=0
-\countdef\sseqj=153 \sseqj=0
-\countdef\sseqxdir=154
-\countdef\sseqposx=155
-\countdef\sseqposy=156
-\countdef\sseqydir=157
-\dimendef\sseqlabelbarwidth=204
-\dimendef\sseqhalfentry=205
-\dimendef\sseqx=206
-\dimendef\sseqy=207
-\dimendef\sseqxx=208
-\dimendef\sseqyy=209
-\dimendef\sseqlabelwidth=210
-\dimendef\sseqrightlabelwidth=211
-\dimendef\sseqlabelsize=212
-
-\ifnum\sseqxstep<0 \sseqxdir=-1 \else \sseqxdir=1 \fi
-\ifnum\sseqystep<0 \sseqydir=-1 \else \sseqydir=1 \fi
-\def\sseqlabelfontsize{12}
-\edef\sseqsavecnto{\the\count0}
-\edef\sseqsavecnti{\the\count1}
-\edef\sseqsavecntii{\the\count2}
-\edef\sseqsavecntiii{\the\count3}
-\edef\sseqsavecntiv{\the\count4}
-\edef\sseqsavecntv{\the\count5}
-\edef\sseqsavecntvi{\the\count6}
-\edef\sseqsavecntvii{\the\count7}
-\edef\sseqsavecntviii{\the\count8}
-\edef\sseqsavecntix{\the\count9}
-\sseqlabelwidth=14pt
-\sseqrightlabelwidth=10pt
-\ifnum\sseqxstart<0
- \advance\sseqlabelwidth by 8pt
- \ifnum\sseqxstart<-9
-  \advance\sseqlabelwidth by 6pt
-  \ifnum\sseqxstart<-99
-   \advance\sseqlabelwidth by 6pt
-  \fi
+\def\ssgridcrossword#1#2{
+ \pgfsetlinewidth{\the\sseq@gridstrokethickness}
+ \pgfpathgrid[stepx=\the\sseqentrysize,stepy=\the\sseqentrysize]{\pgfpointorigin}{\pgfpoint{#1*\sseqentrysize}{#2*\sseqentrysize}}
+ \pgfusepath{stroke}
+}
+
+\def\ssgridgo#1#2{
+ \pgfsetlinewidth{\the\sseq@gridstrokethickness}
+ \pgftransformxshift{\the\sseqhalfentry}
+ \pgftransformyshift{\the\sseqhalfentry}
+ \pgfpathgrid[stepx=\the\sseqentrysize,stepy=\the\sseqentrysize]{\pgfpoint{-\the\sseqhalfentry}{-\the\sseqhalfentry}}{\pgfpoint{#1*\sseqentrysize-\sseqhalfentry}{#2*\sseqentrysize-\sseqhalfentry}}
+ \pgfusepath{stroke}
+}
+
+\def\ssgridnone#1#2{}
+
+\def\ssgriddots#1#2{
+ \pgfsetlinewidth{1pt}
+ \pgfsetdash{{1pt}{\the\sseqentrysize-1pt}}{\the\sseqhalfentry+.5pt}
+ \pgftransformxshift{\the\sseqhalfentry}
+ \pgftransformyshift{\the\sseqhalfentry}
+ \pgfpathgrid[stepx=\the\sseqentrysize,stepy=\the\sseqentrysize]{\pgfpoint{-\the\sseqhalfentry}{-\the\sseqhalfentry}}{\pgfpoint{#1*\sseqentrysize-\sseqhalfentry}{#2*\sseqentrysize-\sseqhalfentry}}
+ \pgfusepath{stroke}
+}
+
+\def\ssgridchess#1#2{
+ \pgfsetlinewidth{\the\sseqentrysize}
+ \pgfsetdash{{\the\sseqentrysize}{\the\sseqentrysize}}{\the\sseqentrysize}
+ \pgfsetcolor{sslightgr}
+ \pgftransformxshift{\the\sseqhalfentry}
+ \pgftransformyshift{\the\sseqhalfentry}
+ \pgfpathgrid[stepx=\the\sseqentrysize*2,stepy=\the\sseqentrysize*2]{\pgfpoint{-\the\sseqhalfentry}{-\the\sseqhalfentry}}{\pgfpoint{#1*\sseqentrysize-\sseqhalfentry}{#2*\sseqentrysize-\sseqhalfentry}}
+ \pgfusepath{stroke}
+}
+
+\def\sseq@drawgrid{
+ \expandafter\ifx\sseqgridstyle\ssequndefined
+  \PackageError{sseq}{Unknown grid option, reverting to \string\ssgridnone}{You apparently have redefined \string\sseqgridstyle. The only allowed values are: \string\ssgridnone,\string\ssgriddots,\string\ssgridgo,\string\ssgridcrossword,\string\ssgridchess.}
+  \gdef\sseqgridstyle{\ssgridnone}
  \fi
-\fi
-\ifnum\sseqxend>10
- \advance\sseqrightlabelwidth by 6pt
- \ifnum\sseqxend>100
-  \advance\sseqrightlabelwidth by 6pt
+ \sseqj=0
+ \def\tempcmd{\range@loop{\sseq@innergridloop}}
+ \expandafter\tempcmd\sseq@xrange
+}
+\def\sseq@innergridloop#1#2{
+  \sseqj=0
+  \def\tempcmd{\range@loop{\sseq@gridwrapper{#1}{#2}}}
+  \expandafter\tempcmd\sseq@yrange
+}
+\def\sseq@gridwrapper#1#2#3#4{
+ \begin{pgfscope}
+ \ss@getcoords{#1}{#3}
+ \sseqxx=\sseqx
+ \sseqyy=\sseqy
+ \count0=#2\advance\count0 by 1
+ \count1=#4\advance\count1 by 1
+ \pgftransformshift{\pgfpoint{\the\sseqxx}{\the\sseqyy}}
+ \count2=#1
+ \multiply\count2 by -1
+ \advance\count0 by \count2
+ \count2=#3
+ \multiply\count2 by -1
+ \advance\count1 by \count2
+ \@eval\sseqgridstyle{{\number\count0}{\number\count1}}
+ \end{pgfscope}
+}
+\def\sseq@drawlabels{
+  \sseqj=0
+  \def\tempcmd{\range@loop{\sseqk=-\sseqxstep \sseq@drawhorizontallabels}}
+  \expandafter\tempcmd\sseq@xrange
+  \sseqj=0
+  \def\tempcmd{\range@loop{\sseqk=-\sseqystep \sseq@drawverticallabels}}
+  \expandafter\tempcmd\sseq@yrange
+}
+
+\def\sseq@drawhorizontallabels#1#2{
+ \advance\sseqk by \sseqxstep
+ \sseqi=#1
+ \ifnum\sseqi>#2\else
+   \ss@getcoords{\the\sseqi}{0}
+   \advance\sseqx by \sseqhalfentry
+   \sseqxlabel
+   \sbox\sseq@labelbox{\strut\ensuremath{\sseq@answer}}
+   \dimen0 = \ht\sseq@labelbox
+   \advance\dimen0 by \dp\sseq@labelbox
+   \pgf@protocolsizes{0pt}{-\dimen0} % ^^A fixes a bug with bounding boxes in pgf
+   \pgftext[top,at=\pgfpoint{\the\sseqx}{0pt}]{\usebox{\sseq@labelbox}}
+   \advance\sseqi by \sseqxstep
+   \edef\tempcmd{\noexpand\sseq@drawhorizontallabels{\number\sseqi}{#2}}
+   \expandafter\tempcmd
  \fi
+}
+\def\sseq@drawverticallabels#1#2{
+ \advance\sseqk by \sseqystep
+ \sseqi=#1
+ \ifnum\sseqi>#2\else
+   \ss@getcoords{0}{\the\sseqi}
+   \advance\sseqy by \sseqhalfentry
+   \sseqylabel
+   \pgftext[right,at=\pgfpoint{-2pt}{\the\sseqy}]{\ensuremath{\sseq@answer}}
+   \advance\sseqi by \sseqystep
+   \edef\tempcmd{\noexpand\sseq@drawverticallabels{\number\sseqi}{#2}}
+   \expandafter\tempcmd
+ \fi
+}
+\def\sseq@labelfromlist#1#2#3,{
+ \def\temp{#3}
+ \def\tempcmd{}
+ \ifx\temp\range@endmarker
+   \def\sseq@answer{?}
+ \else
+   \count0=#1
+   \ifnum\count0=0
+     \def\sseq@lastlabel{}
+     \def\tempcmd{\sseq@innerlabelfromlist{#2}#3;END;}
+   \else
+     \advance\count0 by -1
+     \edef\tempcmd{\noexpand\sseq@labelfromlist{\number\count0}{#2}}
+   \fi
+ \fi
+ \tempcmd
+}
+
+\def\sseq@innerlabelfromlist#1#2;{
+ \def\temp{#2}
+ \def\tempcmd{}
+ \ifx\temp\range@endmarker
+   \ifx\sseq@lastlabel\empty
+     \def\sseq@answer{?}
+   \else
+     \count0=#1
+     \ifnum\count0=0
+       \def\sseq@answer{\ensuremath{\sseq@lastlabel}}
+       \def\tempcmd{\range@gobbletoend}
+     \else
+       \advance\count0 by -1
+       \edef\tempcmd{\noexpand\sseq@innerlabelfromlist{\number\count0}END;}
+     \fi
+   \fi
+ \else
+   \def\sseq@lastlabel{#2}
+   \count0=#1
+   \ifnum\count0=0
+     \def\sseq@answer{\ensuremath{#2}}
+     \def\tempcmd{\range@gobbletoend}
+   \else
+     \advance\count0 by -1
+     \edef\tempcmd{\noexpand\sseq@innerlabelfromlist{\number\count0}}
+   \fi
+ \fi
+ \tempcmd
+}
+\define@key{sseq}{grid}{
+\expandafter\def\expandafter\sseqgridstyle\expandafter{\csname ssgrid#1\endcsname}
+}
+\define@key{sseq}{entrysize}{
+\sseqentrysize=#1
+}
+\define@key{sseq}{labels}{
+  \setkeys{sseq}{xlabels=#1,ylabels=#1}
+}
+\define@key{sseq}{xlabels}{
+  \def\temp{#1}
+  \def\temptwo{none}
+  \ifx\temp\temptwo
+    \def\sseqxlabel{\def\sseq@answer{}}
+  \else
+    \def\temptwo{numbers}
+    \ifx\temp\temptwo
+      \def\sseqxlabel{\def\sseq@answer{\the\sseqi}}
+\else
+  \def\sseqxlabel{%
+    \@eval\sseq@labelfromlist{{\number\sseqj}{\number\sseqk}}#1,END,%
+  }
+    \fi
+  \fi
+}
+\define@key{sseq}{ylabels}{
+  \def\temp{#1}
+  \def\temptwo{none}
+  \ifx\temp\temptwo
+    \def\sseqylabel{\def\sseq@answer{}}
+  \else
+    \def\temptwo{numbers}
+    \ifx\temp\temptwo
+      \def\sseqylabel{\def\sseq@answer{\the\sseqi}}
+\else
+  \def\sseqylabel{%
+    \@eval\sseq@labelfromlist{{\number\sseqj}{\number\sseqk}}#1,END,%
+  }
 \fi
-\ifnum\sseqrightlabelwidth>\sseqlabelwidth
- \sseqlabelwidth=\sseqrightlabelwidth
-\fi
-\sseqlabelsize=10pt
-\count0=\sseqentrysize
-\multiply \count0 by 160
-\divide \count0 by \sseqlabelwidth
-\multiply \sseqlabelsize by \count0
-\divide \sseqlabelsize by 100
-\ifdim\sseqlabelsize<11pt
- \def\sseqlabelfontsize{10}
- \ifdim\sseqlabelsize<9.5pt
-  \def\sseqlabelfontsize{9}
-  \ifdim\sseqlabelsize<8.5pt
-   \def\sseqlabelfontsize{8}
   \fi
- \fi
+}
+\define@key{sseq}{xlabelstep}{\sseqxstep=#1}
+\define@key{sseq}{ylabelstep}{\sseqystep=#1}
+\define@key{sseq}{labelstep}{\setkeys{sseq}{xlabelstep=#1}\setkeys{sseq}{ylabelstep=#1}}
+
+\define@key{sseq}{gapsize}{\setkeys{sseq}{xgapsize=#1}\setkeys{sseq}{ygapsize=#1}}
+\define@key{sseq}{xgapsize}{\sseq@xgap=#1}
+\define@key{sseq}{ygapsize}{\sseq@ygap=#1}
+\define@key{sseq}{leak}{\setkeys{sseq}{xleak=#1}\setkeys{sseq}{yleak=#1}}
+\define@key{sseq}{xleak}{\sseq@xleak=#1}
+\define@key{sseq}{yleak}{\sseq@yleak=#1}
+\define@key{sseq}{gridstroke}{\sseq@gridstrokethickness=#1}
+\define@key{sseq}{arrows}{\def\sseq@defaultarrowstyle{#1}}
+\sseqentrysize=0.4cm
+\sseq@xgap=0.3cm
+\sseq@ygap=0.3cm
+\global\sseq@xleak=-100mm
+\global\sseq@yleak=-100mm
+\sseqxstep=2
+\sseqystep=2
+\def\sseqgridstyle{\ssgridcrossword}
+\def\sseq@defaultarrowstyle{to}
+
+\newenvironment{sseq}[3][]{%
+\begingroup
+\begin{pgfpicture}
+\countdef\sseqi=152%
+\countdef\sseqj=153%
+\countdef\sseqxdir=154%
+\countdef\sseqposx=155%
+\countdef\sseqposy=156%
+\countdef\sseqydir=157%
+\countdef\sseqk=158%
+\dimendef\sseqhalfentry=205%
+\dimendef\sseqx=206%
+\dimendef\sseqy=207%
+\dimendef\sseqxx=208%
+\dimendef\sseqyy=209%
+\dimendef\sseqabsposx=210%
+\dimendef\sseqabsposy=211%
+\sseq@gridstrokethickness=.1pt%
+\edef\sseqsavecnto{\number\count0}%
+\edef\sseqsavecnti{\number\count1}%
+\edef\sseqsavecntii{\number\count2}%
+\edef\sseqsavecntiii{\number\count3}%
+\edef\sseqsavecntiv{\number\count4}%
+\edef\sseqsavecntv{\number\count5}%
+\edef\sseqsavecntvi{\number\count6}%
+\edef\sseqsavecntvii{\number\count7}%
+\edef\sseqsavecntviii{\number\count8}%
+\edef\sseqsavecntix{\number\count9}%
+\setkeys{sseq}{#1}
+\ifnum\sseqxstep=0 % ^^A old-fashioned way of disabling labels
+  \setkeys{sseq}{xlabels=none}
+  \sseqxstep=1
+\else
+  \@ifundefined{sseqxlabel}{\setkeys{sseq}{xlabels=numbers}}{}
+\fi
+\ifnum\sseqystep=0 % ^^A old-fashioned way of disabling labels
+  \setkeys{sseq}{ylabels=none}%
+  \sseqystep=1
+\else
+  \@ifundefined{sseqylabel}{\setkeys{sseq}{ylabels=numbers}}{}
+\fi
+\ifdim\sseq@xleak=-100mm
+  \sseq@xleak=0.3\sseq@xgap
+\fi
+\ifdim\sseq@yleak=-100mm
+  \sseq@yleak=0.3\sseq@ygap
 \fi
-\edef\sz{\the\sseqlabelsize}
-\putxyq {\font \sseqlabelfont = cmtt}
-\putxy{\sseqlabelfontsize\space at \the\sseqlabelsize\space}
-\sseqlabelbarwidth=\sseqlabelsize
-\divide\sseqlabelbarwidth by 2
-\dimen0=\sseqentrysize
-\multiply\dimen0 by -1
-\multiply\dimen0 by \sseqxdir
-\multiply\dimen0 by \sseqxstart
-\sseqoffsetx=\sseqlabelbarwidth
-\advance\sseqoffsetx by \dimen0
-\dimen0=\sseqentrysize
-\multiply\dimen0 by -1
-\multiply\dimen0 by \sseqydir
-\multiply\dimen0 by \sseqystart
-\sseqoffsety=\sseqlabelbarwidth
-\advance\sseqoffsety by \dimen0
+\range@parseandnormalize{\sseq@xrange}{\sseqxstart}{#2}
+\range@parseandnormalize{\sseq@yrange}{\sseqystart}{#3}
+\pgfsetshapeminwidth{1.1mm}
+\pgfsetshapeinnerxsep{1pt}
+\pgfsetshapeinnerysep{1pt}
 \sseqhalfentry=\sseqentrysize
 \divide\sseqhalfentry by 2
-\sseqx=\sseqentrysize
-\multiply \sseqx by #1
-\advance \sseqx by \sseqlabelbarwidth
-\sseqy=\sseqentrysize
-\multiply \sseqy by \sseqj
-\advance \sseqy by \sseqlabelbarwidth
-\sseqxx=\sseqx
-\sseqyy=\sseqy
-\advance\sseqxx by \sseqhalfentry
-\advance\sseqyy by \sseqhalfentry
-\putxyq {\xy}
-\sseqdrawgrid{#1}{#2}
-\sseqdrawlabels{#1}{#2}
+\sseq@drawgrid
+\sseq@drawlabels
 \sseqposx=0
 \sseqposy=0
 }
 {
 \relax
-\ssfinishpos
-\putxyq{\endxy}
-\bigskip
+\ssmoveto 0 0 \ssmoveto 0 0
 \edef\lst{\the\sseqcmdlist}
 \ifthenelse{\boolean{debug}}{\show\lst}{}
+\the\sseqcmdlist
 \count0=\sseqsavecnto
 \count1=\sseqsavecnti
 \count2=\sseqsavecntii
@@ -789,9 +1200,8 @@
 \count7=\sseqsavecntvii
 \count8=\sseqsavecntviii
 \count9=\sseqsavecntix
-\the\sseqcmdlist
+\end{pgfpicture}
 \endgroup
-\bigskip
 }
 \endinput
 %%
-- 
cgit v1.2.3

