diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -7,6 +7,80 @@
 The following is information about what major changes have gone into
 each release.
 
+Changes in 2999.16.0.0
+----------------------
+
+* Add support for Graphviz-2.30.0:
+
+    - New attributes:
+
+        + `Area`
+        + `Head_LP`
+        + `LayerListSep`
+        + `LayerSelect`
+        + `Tail_LP`
+        + `XLP`
+
+    - `BgColor`, `Color` and `FillColor` now take a list of colors
+      with optional weightings.
+
+    - Layer handling now supports layer sub-ranges.
+
+    - Added the voronoi-based option to `Overlap`.
+
+    - Added the `Striped` and `Wedged` styles.
+
+* Updates to attributes and their values:
+
+    - The following attributes have had their values changed to better
+      reflect what they represent:
+
+        + `FontPath` takes a `Path` value.
+
+        + `Layout` takes a `GraphvizCommand` (and thus
+          `GraphvizCommand` has been moved to
+          `Data.GraphViz.Attributes.Complete`).
+
+    - Added `MDS` to `Model` (which had somehow been overlooked).
+
+    - Various attributes now have defaults added/updated/removed if
+      wrong.
+
+    - Removed the following deprecated attributes:
+
+        + `ShapeFile`
+
+        + `Z`
+
+* Now any value that has a defined default can be parsed when the Dot
+  code just has `attribute=""` (which `dot -Tcanon` is fond of doing
+  to "reset" attributes).
+
+* `GraphvizCommand` now defines `Sfdp` (which had somehow been
+  overlooked up till now).
+
+* The `canonicalise` and related functions have been re-written;
+  whilst there might be some cases where their behaviour does not
+  fully match how `dot -Tcanon` and `tred` behave (due to the
+  interaction of various attributes), the new implementation is much
+  more sane.
+
+* Use temporary files rather than pipes when running dot, etc.
+
+    Makes it more portable, and also avoids issues where dot, etc. use
+    100% CPU when a graph is passed in via stdin.
+
+    Original patch by **Henning Thielemann**.
+
+* `renderCompactDot` now outputs to just one line (which means it's
+  shorter, but more difficult to read for a human).
+
+* The QuickCheck instances are a bit smarter now to avoid having such
+  ugly huge outputs when a test fails.
+
+* More documentation to help you understand what certain data types
+  are for, etc.
+
 Changes in 2999.15.0.1
 ----------------------
 
@@ -69,6 +143,10 @@
 * Error messages from parsing are improved to help you track down
   where the parsing error occurred (in that it's easier to find which
   attribute failed to parse, etc.).
+
+* Some parsing combinators are no longer publicly accessible, but
+  shouldn't be needed by end users anyway (as they were there for
+  parsing the Attribute data type).
 
 Changes in 2999.14.1.0
 ----------------------
diff --git a/Data/GraphViz/Algorithms.hs b/Data/GraphViz/Algorithms.hs
--- a/Data/GraphViz/Algorithms.hs
+++ b/Data/GraphViz/Algorithms.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE MonadComprehensions #-}
+
 {- |
    Module      : Data.GraphViz.Algorithms
    Description : Various algorithms on Graphviz graphs.
@@ -8,6 +10,10 @@
    Defines various algorithms for use on 'DotRepr' graphs.  These are
    typically re-implementations of behaviour found in existing Graphviz
    tools but without the I/O requirement.
+
+   Note that one way that these algorithms differ from those found in
+   Graphviz is that the order of clusters is /not/ maintained, which may
+   affect layout in some cases.
  -}
 module Data.GraphViz.Algorithms
        ( -- * Canonicalisation Options
@@ -16,21 +22,24 @@
        , defaultCanonOptions
        , dotLikeOptions
          -- * Canonicalisation
+         -- $canonicalisation
        , canonicalise
        , canonicaliseOptions
          -- * Dealing with transitive edges
+         -- $transitive
        , transitiveReduction
        , transitiveReductionOptions
        ) where
 
-import Data.GraphViz.Attributes.Complete( Attributes, usedByClusters
-                                        , defaultAttributeValue)
+import Data.GraphViz.Attributes.Complete( Attributes, defaultAttributeValue)
 import Data.GraphViz.Attributes.Same
 import Data.GraphViz.Types
 import Data.GraphViz.Types.Canonical
+import Data.GraphViz.Types.Common
+import Data.GraphViz.Util(bool)
 
 import Data.Function(on)
-import Data.List(groupBy, sortBy, partition, (\\), sort, deleteBy)
+import Data.List(groupBy, sortBy, partition, (\\), deleteBy)
 import Data.Maybe(listToMaybe, mapMaybe, fromMaybe)
 import qualified Data.DList as DList
 import qualified Data.Map as Map
@@ -73,14 +82,38 @@
 
 -- -----------------------------------------------------------------------------
 
--- | Implements similar functionality to @dot -Tcanon@.  However, this
---   method requires no IO and doesn't care about image locations, etc.
---
---   This function will create a single explicit definition for every
---   node in the original graph and place it in the appropriate
---   position in the cluster hierarchy.  All edges are found in the
---   deepest cluster that contains both nodes.  Currently node and
---   edge attributes are not grouped into global ones.
+{- $canonicalisation
+
+These functions implement similar functionality to @dot -Tcanon@
+(i.e. creates a canonical form of any 'DotRepr' graph).  without
+requiring IO.
+
+Note that due to implementation specifics the behaviour is not
+identical; in particular:
+
+* Any specified 'Attributes' that equal the defaults are stripped out
+  (unless required to override a previous attribute that doesn't apply
+  here).
+
+* Grouping of attributes (when @'groupAttributes = True'@) is much
+  more conservative; only those node/edge attributes that are common to
+  /all/ nodes and edges within that cluster (and within sub-clusters)
+  are made global.
+
+* Sub-graphs aren't kept, only clusters.
+
+* 'ColorScheme' Attributes are removed (as all @Color@ values embed
+  any needed color scheme anyway) as the output order of attributes may
+  change (and this matters for the Haskell side of things).
+
+In particular, note that this function will create a single explicit
+definition for every node in the original graph and place it in the
+appropriate position in the cluster hierarchy.  All edges are found in
+the deepest cluster that contains both nodes.
+
+-}
+
+-- | Canonicalise with some sensible defaults.
 canonicalise :: (DotRepr dg n) => dg n -> DotGraph n
 canonicalise = canonicaliseOptions defaultCanonOptions
 
@@ -89,126 +122,172 @@
                        -> dg n -> DotGraph n
 canonicaliseOptions opts dg = cdg { strictGraph   = graphIsStrict dg
                                   , directedGraph = graphIsDirected dg
-                                  , graphID       = getID dg
                                   }
   where
-    cdg = createCanonical opts gas cl nl es
+    cdg = createCanonical opts (getID dg) gas cl nl es
 
-    (gas, cl) = graphStructureInformation dg
-    nl = nodeInformation True dg
-    es = edgeInformation True dg
+    (gas, cl) = graphStructureInformationClean dg
+    nl = nodeInformationClean True dg
+    es = edgeInformationClean True dg
 
-createCanonical :: (Ord n) => CanonicaliseOptions -> GlobalAttributes
+type NodePath n = ([Maybe GraphID], DotNode n)
+type NodePaths n = [NodePath n]
+type EdgeClusters n = Map (Maybe GraphID) [DotEdge n]
+type EdgeLocations n = (EdgeClusters n, [DotEdge n])
+
+data CanonControl n = CC { cOpts    :: !CanonicaliseOptions
+                         , isGraph  :: !Bool
+                         , clusters :: !ClusterLookup
+                         , clustEs  :: !(EdgeLocations n)
+                         , topID    :: !(Maybe GraphID)
+                         , topAttrs :: !Attributes
+                         }
+
+createCanonical :: (Ord n) => CanonicaliseOptions -> Maybe GraphID -> GlobalAttributes
                    -> ClusterLookup -> NodeLookup n -> [DotEdge n] -> DotGraph n
-createCanonical opts gas cl nl es
-  = DotGraph { strictGraph     = undefined
-             , directedGraph   = undefined
-             , graphID         = undefined
-             , graphStatements = gStmts
-             }
+createCanonical opts gid gas cl nl es = promoteDSG $ makeGrouping cc ns
   where
-    gStmts = DotStmts { attrStmts = gas'
-                      , subGraphs = sgs
-                      , nodeStmts = topNs'
-                      , edgeStmts = topEs'
-                      }
-
-    gas' = nonEmptyGAs [ gas
-                       , NodeAttrs topNAs
-                       , EdgeAttrs topEAs
-                       ]
     nUnlook (n,(p,as)) = (F.toList p, DotNode n as)
     -- DotNodes paired and sorted by their paths
     ns = sortBy (compLists `on` fst) . map nUnlook $ Map.toList nl
-    -- nodes in clusters vs top-level
-    (clustNs, topNs) = thisLevel ns
-    -- edges in clusters vs top-level
-    (clustEL, topEs) = if edgesInClusters opts
-                       then edgeClusters nl es
-                       else (Map.empty, es)
 
-    -- The global attributes that are also applicable to clusters.
-    topClustAs = filter usedByClusters $ attrs gas
-    topClustAs' = toSAttr topClustAs
+    es' = if edgesInClusters opts
+          then edgeClusters nl es
+          else (Map.empty, es)
 
-    topNAs = mCommon nodeAttributes topNs
-    topNAs' = toSAttr topNAs
-    topNs' = map (\dn -> dn {nodeAttributes = nodeAttributes dn \\ topNAs}) topNs
+    cc = CC { cOpts    = opts
+            , isGraph  = True
+            , clusters = cl
+            , clustEs  = es'
+            , topID    = gid
+            , topAttrs = attrs gas
+            }
 
-    topEAs = mCommon edgeAttributes topEs
-    topEAs' = toSAttr topEAs
-    topEs' = map (\de -> de {edgeAttributes = edgeAttributes de \\ topEAs}) topEs
+thisLevel :: NodePaths n -> (NodePaths n, [DotNode n])
+thisLevel = second (map snd) . span (not . null . fst)
 
-    sgs = clusts topClustAs topClustAs' topNAs topNAs' topEAs topEAs' clustNs
+makeGrouping :: CanonControl n -> NodePaths n -> DotSubGraph n
+makeGrouping cc cns = DotSG { isCluster = True
+                            , subGraphID = cID
+                            , subGraphStmts = stmts
+                            }
+  where
+    cID | isGraph cc = topID cc
+        | otherwise  = head . fst . head $ cns
 
-    clusts oAs oAsS nAs nAsS eAs eAsS = map (toClust oAs oAsS nAs nAsS eAs eAsS)
-                                        . groupBy ((==) `on` (listToMaybe . fst))
+    (nestedNs, ns) = thisLevel
+                     . bool (map $ first tail) id (isGraph cc)
+                     $ cns
 
-    -- Create a new cluster.
-    -- oAs - outer cluster attributes
-    -- nAs - outer node attributes
-    -- eAs - outer edge attributes
-    -- (*S variants are same thing but as sets; premature optimisation?)
-    -- cns - nodes in this cluster
-    toClust oAs oAsS nAs nAsS eAs eAsS cns
-      = DotSG { isCluster     = True
-              , subGraphID    = cID
-              , subGraphStmts = stmts
-              }
-      where
-        -- Find the ID for this cluster.
-        cID = head . fst $ head cns
+    es = bool (fromMaybe [] . Map.lookup cID . fst) snd (isGraph cc)
+         $ clustEs cc
 
-        -- Get the nodes that are deeper and the ones that belong
-        -- here.
-        (nested, here) = thisLevel $ map (first tail) cns
+    gas | isGraph cc = topAttrs cc
+        | otherwise  = attrs . snd $ clusters cc Map.! cID
 
+    subGs = map (makeGrouping $ cc { isGraph = False })
+            . groupBy ((==) `on` (listToMaybe . fst))
+            $ nestedNs
 
-        stmts = DotStmts { attrStmts = sgAs
-                         , subGraphs = subSGs
-                         , nodeStmts = here'
-                         , edgeStmts = edges'
-                         }
+    stmts = setGlobal (cOpts cc) gas
+            $ DotStmts { attrStmts = []
+                       , subGraphs = subGs
+                       , nodeStmts = ns
+                       , edgeStmts = es
+                       }
 
-        -- Starting global attributes
-        sgAs = nonEmptyGAs [ GraphAttrs as'
-                           , NodeAttrs nas'
-                           , EdgeAttrs eas'
-                           ]
+setGlobal :: CanonicaliseOptions
+             -> Attributes -- Specified cluster attributes
+             -> DotStatements n
+             -> DotStatements n
+setGlobal opts as stmts = stmts { attrStmts = globs'
+                                , subGraphs = sgs'
+                                , nodeStmts = ns'
+                                , edgeStmts = es'
+                                }
+  where
+    sgs = subGraphs stmts
+    sStmts = map subGraphStmts sgs
+    ns = nodeStmts stmts
+    es = edgeStmts stmts
 
-        -- Sub-clusters
-        subSGs = clusts as asS nas nasS eas easS nested
+    sGlobs = map (partitionGlobal . attrStmts) sStmts
 
-        -- The attributes attached to this cluster ID in the original.
-        as = attrs . snd $ cl Map.! cID
-        asS = toSAttr as
+    (sgas,snas,seas) = unzip3 sGlobs
 
-        -- Get the global attributes that apply to this cluster,
-        -- ignoring ones set globally.
-        as' = fst $ innerAttributes oAs oAsS as
+    gas' = as -- Can't change graph attrs! Need these!
+    nas' = getCommonGlobs opts nodeStmts snas sStmts $ map nodeAttributes ns
+    eas' = getCommonGlobs opts edgeStmts seas sStmts $ map edgeAttributes es
 
-        -- The node attributes that can be stated globally.
-        nas = mCommon nodeAttributes here
-        nasS = toSAttr nas
-        (nas',nOv) = innerAttributes nAs nAsS nas
+    globs' = nonEmptyGAs [ GraphAttrs gas'
+                         , NodeAttrs  nas'
+                         , EdgeAttrs  eas'
+                         ]
+    ns' = map (\dn -> dn { nodeAttributes = nodeAttributes dn \\ nas' }) ns
+    es' = map (\de -> de { edgeAttributes = edgeAttributes de \\ eas' }) es
 
-        -- The nodes that belong here, with updated attributes.
-        here' = map (\dn -> dn {nodeAttributes = nodeAttributes dn \\ (nas ++ nOv)}) here
+    sgas' = updateGraphGlobs gas' sgas
+    snas' = map (\\ nas') snas
+    seas' = map (\\ eas') seas
 
-        eas = mCommon edgeAttributes edges
-        easS = toSAttr eas
-        (eas',eOv) = innerAttributes eAs eAsS eas
-        edges' = map (\de -> de {edgeAttributes = edgeAttributes de \\ (eas ++ eOv)}) edges
+    sGlobs' = zip3 sgas' snas' seas'
+    sStmts' = zipWith (\ sSt sGl -> sSt { attrStmts = nonEmptyGAs $ unPartitionGlobal sGl })
+                      sStmts
+                      sGlobs'
 
-        -- Find edges that belong here
-        edges = fromMaybe [] $ cID `Map.lookup` clustEL
+    sgs' = zipWith (\ sg sSt -> sg { subGraphStmts = sSt }) sgs sStmts'
 
-    thisLevel = second (map snd) . span (not . null . fst)
+updateGraphGlobs :: Attributes -> [Attributes] -> [Attributes]
+updateGraphGlobs gas = map go
+  where
+    gasS = Set.fromList gas
 
-    mCommon f = if groupAttributes opts
-                then commonAttrs f
-                else const []
+    override = toSAttr $ nonSameDefaults gas
 
+    -- * Remove any identical values
+    -- * Override any different values
+    go = Set.toList
+         . (`Set.difference` gasS) -- Remove identical values
+         . unSameSet
+         . (`Set.union` override) -- Keeps existing values of constructors
+         . toSAttr
+
+nonSameDefaults :: Attributes -> Attributes
+nonSameDefaults = mapMaybe (\ a -> [ a' | a' <- defaultAttributeValue a, a' /= a] )
+
+getCommonGlobs :: CanonicaliseOptions
+                  -> (DotStatements n -> [a])
+                  -> [Attributes] -- ^ From sub-graphs
+                  -> [DotStatements n] -- ^ Statements from the sub-graphs for testing.
+                  -> [Attributes] -- ^ From nodes/edges
+                  -> Attributes
+getCommonGlobs opts f sas stmts as
+  | not $ groupAttributes opts = []
+  | otherwise = case sas' ++ as of
+                  []  -> []
+                  [_] -> []
+                  as' -> Set.toList . foldr1 Set.intersection
+                         $ map Set.fromList as'
+  where
+    sas' = keepIfAny f sas stmts
+
+-- Used to distinguish between having empty list of global attributes
+-- for nodes or edges because there aren't any nodes/edges, or because
+-- there aren't any common attributes
+keepIfAny :: (DotStatements n -> [a]) -> [Attributes] -> [DotStatements n]
+             -> [Attributes]
+keepIfAny f sas = map fst . filter snd . zip sas . map (hasAny f)
+
+hasAny      :: (DotStatements n -> [a]) -> DotStatements n -> Bool
+hasAny f ds = not (null $ f ds) || any (hasAny f . subGraphStmts) (subGraphs ds)
+
+promoteDSG     :: DotSubGraph n -> DotGraph n
+promoteDSG dsg = DotGraph { strictGraph     = undefined
+                          , directedGraph   = undefined
+                          , graphID         = subGraphID dsg
+                          , graphStatements = subGraphStmts dsg
+                          }
+
 -- Same as compare for lists, except shorter lists are GT
 compLists :: (Ord a) => [a] -> [a] -> Ordering
 compLists []     []     = EQ
@@ -221,20 +300,14 @@
 nonEmptyGAs :: [GlobalAttributes] -> [GlobalAttributes]
 nonEmptyGAs = filter (not . null . attrs)
 
--- Return all attributes found in every value.
-commonAttrs         :: (a -> Attributes) -> [a] -> Attributes
-commonAttrs _ []  = []
-commonAttrs f [a] = f a
-commonAttrs f xs  = Set.toList . foldr1 Set.intersection
-                    $ map (Set.fromList . f) xs
-
 -- Assign each edge into the cluster it belongs in.
 edgeClusters    :: (Ord n) => NodeLookup n -> [DotEdge n]
-                   -> (Map (Maybe GraphID) [DotEdge n], [DotEdge n])
+                   -> EdgeLocations n
 edgeClusters nl = (toM *** map snd) . partition (not . null . fst)
                   . map inClust
   where
     nl' = Map.map (F.toList . fst) nl
+    -- DotEdge n -> (Path, DotEdge n)
     inClust de@(DotEdge n1 n2 _) = (flip (,) de)
                                    . map fst . takeWhile (uncurry (==))
                                    $ zip (nl' Map.! n1) (nl' Map.! n2)
@@ -242,25 +315,6 @@
           . Map.fromListWith (flip DList.append)
           . map (last *** DList.singleton)
 
--- Return only those attributes that are required within the inner
--- sub-graph.  Also returns the overrides.
-innerAttributes                    :: Attributes -> SAttrs
-                                      -> Attributes -> (Attributes, Attributes)
-innerAttributes outer outerS inner = (sort $ inner' ++ override, override)
-  where
-    -- Remove all Attributes that are also defined in the outer cluster
-    inner' = inner \\ outer
-
-    -- Need to consider those Attributes that were defined /after/ this value
-    override = mapMaybe defAttr . unSame
-               $ outerS `Set.difference` toSAttr inner
-
-    -- A version of defaultAttributeValue that returns Nothing if the
-    -- value it is replacing /is/ the default.
-    defAttr a = case defaultAttributeValue a of
-                  Just a' | a == a' -> Nothing
-                  ma'               -> ma'
-
 -- -----------------------------------------------------------------------------
 
 {- $transitive
@@ -299,6 +353,8 @@
    Note that transitive reduction only makes sense for directed graphs;
    for undirected graphs these functions are identical to the
    canonicalisation functions above.
+
+   The caveats for the canonicalisation functions also apply.
  -}
 
 transitiveReduction :: (DotRepr dg n) => dg n -> DotGraph n
@@ -308,13 +364,12 @@
                                       -> dg n -> DotGraph n
 transitiveReductionOptions opts dg = cdg { strictGraph = graphIsStrict dg
                                          , directedGraph = graphIsDirected dg
-                                         , graphID = getID dg
                                          }
   where
-    cdg = createCanonical opts gas cl nl es'
-    (gas, cl) = graphStructureInformation dg
-    nl = nodeInformation True dg
-    es = edgeInformation True dg
+    cdg = createCanonical opts (getID dg) gas cl nl es'
+    (gas, cl) = graphStructureInformationClean dg
+    nl = nodeInformationClean True dg
+    es = edgeInformationClean True dg
     es' | graphIsDirected dg = rmTransEdges es
         | otherwise          = es
 
diff --git a/Data/GraphViz/Attributes.hs b/Data/GraphViz/Attributes.hs
--- a/Data/GraphViz/Attributes.hs
+++ b/Data/GraphViz/Attributes.hs
@@ -54,6 +54,8 @@
        , invis
        , filled
        , diagonals
+       , striped
+       , wedged
        , rounded
        , tapered
        , radial
@@ -226,24 +228,24 @@
 --   clusters, if @'style' 'filled'@ is used, then 'fillColor' will
 --   override it.
 bgColor :: (NamedColor nc) => nc -> Attribute
-bgColor = BgColor . (:[]) . toColor
+bgColor = BgColor . toColorList . (:[]) . toColor
 
 -- | As with 'bgColor', but add a second color to create a gradient
 --   effect.  Requires Graphviz >= 2.29.0.
 bgColors       :: (NamedColor nc) => nc -> nc -> Attribute
-bgColors c1 c2 = BgColor $ map toColor [c1,c2]
+bgColors c1 c2 = BgColor . toColorList $ map toColor [c1,c2]
 
 -- | Specify the fill color of a node, cluster or arrowhead.  Requires
 --   @'style' 'filled'@ for nodes and clusters.  For nodes and edges,
 --   if this isn't set then the 'color' value is used instead; for
 --   clusters, 'bgColor' is used.
 fillColor :: (NamedColor nc) => nc -> Attribute
-fillColor = FillColor . (:[]) . toColor
+fillColor = FillColor . toColorList . (:[]) . toColor
 
 -- | As with 'fillColor', but add a second color to create a gradient
 --   effect.  Requires Graphviz >= 2.29.0.
 fillColors       :: (NamedColor nc) => nc -> nc -> Attribute
-fillColors c1 c2 = FillColor $ map toColor [c1,c2]
+fillColors c1 c2 = FillColor . toColorList $ map toColor [c1,c2]
 
 -- | Specify the color of text.
 fontColor :: (NamedColor nc) => nc -> Attribute
@@ -267,7 +269,7 @@
 --     background color of nodes and clusters unless 'fillColor' or
 --     'bgColor' respectively is set.
 color :: (NamedColor nc) => nc -> Attribute
-color = Color . (:[]) . toColor
+color = Color . toColorList . (:[]) . toColor
 
 -- -----------------------------------------------------------------------------
 
@@ -319,6 +321,16 @@
 -- | Only available for nodes.
 diagonals :: Style
 diagonals = SItem Diagonals []
+
+-- | Only available for rectangularly-shaped nodes and
+--   clusters.  Requires Graphviz >= 2.30.0.
+striped :: Style
+striped = SItem Striped []
+
+-- | Only available for elliptically-shaped nodes.  Requires Graphviz
+--   >= 2.30.0.
+wedged :: Style
+wedged = SItem Wedged []
 
 -- | Only available for edges; creates a tapered edge between the two
 --   nodes.  Requires Graphviz >= 2.29.0.
diff --git a/Data/GraphViz/Attributes/Colors.hs b/Data/GraphViz/Attributes/Colors.hs
--- a/Data/GraphViz/Attributes/Colors.hs
+++ b/Data/GraphViz/Attributes/Colors.hs
@@ -24,7 +24,12 @@
          ColorScheme(..)
          -- * Colors
        , Color(..)
+       , ColorList
+       , WeightedColor(..)
+       , toWC
+       , toColorList
        , NamedColor(toColor)
+       , toWColor
          -- * Conversion to\/from @Colour@.
        , toColour
        , fromColour
@@ -162,7 +167,7 @@
                                ++ show cs
 
   parseList = fmap (:[])
-              -- Unquoted single color
+              -- Potentially unquoted single color
               (oneOf [ parseNC (undefined :: BrewerColor) True
                      , parseNC (undefined :: SVGColor) True
                      , parseX11Color True
@@ -175,6 +180,61 @@
                  failBad $ "Error parsing list of Colors with color scheme of "
                            ++ show cs
 
+-- | The sum of the optional weightings /must/ sum to at most @1@.
+type ColorList = [WeightedColor]
+
+-- | A 'Color' tagged with an optional weighting.
+data WeightedColor = WC { wColor :: Color
+                          -- | Must be in range @0 <= W <= 1@.
+                        , weighting :: Maybe Double
+                        }
+                   deriving (Eq, Ord, Show, Read)
+
+-- | For colors without weightings.
+toWC :: Color -> WeightedColor
+toWC = (`WC` Nothing)
+
+-- | For a list of colors without weightings.
+toColorList :: [Color] -> ColorList
+toColorList = map toWC
+
+instance PrintDot WeightedColor where
+  unqtDot (WC c mw) = unqtDot c
+                      <> maybe empty ((semi<>) . unqtDot) mw
+
+  toDot (WC c Nothing) = toDot c
+  toDot wc             = dquotes $ unqtDot wc
+
+  unqtListToDot = hcat . punctuate colon . mapM unqtDot
+
+  -- Might not need quoting
+  listToDot [wc] = toDot wc
+  listToDot wcs  = dquotes $ unqtListToDot wcs
+
+instance ParseDot WeightedColor where
+  parseUnqt = WC <$> parseUnqt <*> optional (character ';' *> parseUnqt)
+
+  parse = quotedParse parseUnqt
+          `onFail`
+          -- Using parse rather than parseUnqt as there shouldn't be
+          -- any quotes, but to avoid copy-pasting the oneOf block.
+          (toWC <$> parse)
+
+  parseUnqtList = sepBy1 parseUnqt (character ':')
+                  `onFail`
+                  do cs <- getColorScheme
+                     failBad $ "Error parsing a ColorList with color scheme of "
+                               ++ show cs
+
+  parseList = ((:[]) . toWC <$> parse)
+              -- Potentially unquoted un-weighted single color
+              `onFail`
+              quotedParse parseUnqtList
+              `onFail`
+              do cs <- getColorScheme
+                 failBad $ "Error parsing ColorList with color scheme of "
+                           ++ show cs
+
 -- -----------------------------------------------------------------------------
 
 -- | More easily convert named colors to an overall 'Color' value.
@@ -188,9 +248,12 @@
     -- | Bool is for whether quoting is needed.
     parseNC' :: Bool -> Parse nc
 
+toWColor :: (NamedColor nc) => nc -> WeightedColor
+toWColor = toWC . toColor
+
 -- First value just used for type
 parseNC :: (NamedColor nc) => nc -> Bool -> Parse Color
-parseNC nc q = fmap (toColor . flip asTypeOf nc)
+parseNC nc q = fmap (toColor . (`asTypeOf` nc))
                $ parseNC' q
 
 instance NamedColor BrewerColor where
diff --git a/Data/GraphViz/Attributes/Complete.hs b/Data/GraphViz/Attributes/Complete.hs
--- a/Data/GraphViz/Attributes/Complete.hs
+++ b/Data/GraphViz/Attributes/Complete.hs
@@ -57,7 +57,9 @@
    * Not every 'Attribute' is fully documented/described.  However,
      all those which have specific allowed values should be covered.
 
-   * Deprecated 'Overlap' algorithms are not defined.
+   * Deprecated 'Overlap' algorithms are not defined.  Furthermore,
+     the ability to specify an integer prefix for use with the fdp layout
+     is /not/ supported.
 
    * The global @Orientation@ attribute is not defined, as it is
      difficult to distinguish from the node-based 'Orientation'
@@ -81,6 +83,7 @@
        , Attributes
        , sameAttribute
        , defaultAttributeValue
+       , rmUnwantedAttributes
          -- ** Validity functions on @Attribute@ values.
        , usedByGraphs
        , usedBySubGraphs
@@ -147,6 +150,7 @@
        , DPoint(..)
 
          -- ** Layout
+       , GraphvizCommand(..)
        , GraphSize(..)
        , AspectType(..)
        , ClusterMode(..)
@@ -172,7 +176,9 @@
 
          -- ** Layers
        , LayerSep(..)
-       , LayerRange(..)
+       , LayerListSep(..)
+       , LayerRange
+       , LayerRangeElem(..)
        , LayerID(..)
        , LayerList(..)
 
@@ -184,17 +190,17 @@
        ) where
 
 import Data.GraphViz.Attributes.Colors
-import Data.GraphViz.Attributes.Colors.X11(X11Color(Transparent, Black))
+import Data.GraphViz.Attributes.Colors.X11(X11Color(Black))
 import qualified Data.GraphViz.Attributes.HTML as Html
 import Data.GraphViz.Attributes.Internal
 import Data.GraphViz.Util
 import Data.GraphViz.Parsing
 import Data.GraphViz.Printing
-import Data.GraphViz.State(getLayerSep, setLayerSep)
+import Data.GraphViz.State(getLayerSep, setLayerSep, getLayerListSep, setLayerListSep)
 import Data.GraphViz.Exception(GraphvizException(NotCustomAttr), throw)
 
 import Data.List(partition, intercalate)
-import Data.Maybe(isJust)
+import Data.Maybe(isJust, isNothing)
 import Data.Word(Word16)
 import qualified Data.Set as S
 import qualified Data.Text.Lazy as T
@@ -245,24 +251,25 @@
   = Damping Double                      -- ^ /Valid for/: G; /Default/: @0.99@; /Minimum/: @0.0@; /Notes/: neato only
   | K Double                            -- ^ /Valid for/: GC; /Default/: @0.3@; /Minimum/: @0@; /Notes/: sfdp, fdp only
   | URL EscString                       -- ^ /Valid for/: ENGC; /Default/: none; /Notes/: svg, postscript, map only
+  | Area Double                         -- ^ /Valid for/: NC; /Default/: @1.0@; /Minimum/: @>0@; /Notes/: patchwork only, requires Graphviz >= 2.30.0
   | ArrowHead ArrowType                 -- ^ /Valid for/: E; /Default/: @'normal'@
   | ArrowSize Double                    -- ^ /Valid for/: E; /Default/: @1.0@; /Minimum/: @0.0@
   | ArrowTail ArrowType                 -- ^ /Valid for/: E; /Default/: @'normal'@
   | Aspect AspectType                   -- ^ /Valid for/: G; /Notes/: dot only
   | BoundingBox Rect                    -- ^ /Valid for/: G; /Notes/: write only
-  | ColorScheme ColorScheme             -- ^ /Valid for/: ENCG; /Default/: @'X11'@
-  | BgColor [Color]                     -- ^ /Valid for/: GC; /Default/: @['X11Color' 'Transparent']@
+  | BgColor ColorList                   -- ^ /Valid for/: GC; /Default/: @[]@
   | Center Bool                         -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'
   | ClusterRank ClusterMode             -- ^ /Valid for/: G; /Default/: @'Local'@; /Notes/: dot only
-  | Color [Color]                       -- ^ /Valid for/: ENC; /Default/: @['X11Color' 'Black']@
+  | Color ColorList                     -- ^ /Valid for/: ENC; /Default/: @['WC' ('X11Color' 'Black') Nothing]@
+  | ColorScheme ColorScheme             -- ^ /Valid for/: ENCG; /Default/: @'X11'@
   | Comment Text                        -- ^ /Valid for/: ENG; /Default/: @\"\"@
   | Compound Bool                       -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'; /Notes/: dot only
   | Concentrate Bool                    -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'
   | Constraint Bool                     -- ^ /Valid for/: E; /Default/: @'True'@; /Parsing Default/: 'True'; /Notes/: dot only
   | Decorate Bool                       -- ^ /Valid for/: E; /Default/: @'False'@; /Parsing Default/: 'True'
-  | DefaultDist Double                  -- ^ /Valid for/: G; /Default/: @1+(avg. len)*sqrt(abs(V))@; /Minimum/: @epsilon@; /Notes/: neato only, only if @'Pack' 'DontPack'@
-  | Dim Int                             -- ^ /Valid for/: G; /Default/: @2@; /Minimum/: @2@; /Notes/: sfdp, fdp, neato only
-  | Dimen Int                           -- ^ /Valid for/: G; /Default/: @2@; /Minimum/: @2@; /Notes/: sfdp, fdp, neato only
+  | DefaultDist Double                  -- ^ /Valid for/: G; /Default/: @1+(avg. len)*sqrt(abs(V))@ (unable to statically define); /Minimum/: The value of 'Epsilon'.; /Notes/: neato only, only if @'Pack' 'DontPack'@
+  | Dim Int                             -- ^ /Valid for/: G; /Default/: @2@; /Minimum/: @2@; /Notes/: maximum of @10@; sfdp, fdp, neato only
+  | Dimen Int                           -- ^ /Valid for/: G; /Default/: @2@; /Minimum/: @2@; /Notes/: maximum of @10@; sfdp, fdp, neato only
   | Dir DirType                         -- ^ /Valid for/: E; /Default/: @'Forward'@ (directed), @'NoDir'@ (undirected)
   | DirEdgeConstraints DEConstraints    -- ^ /Valid for/: G; /Default/: @'NoConstraints'@; /Parsing Default/: 'EdgeConstraints'; /Notes/: neato only
   | Distortion Double                   -- ^ /Valid for/: N; /Default/: @0.0@; /Minimum/: @-100.0@
@@ -272,17 +279,18 @@
   | EdgeTooltip EscString               -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: svg, cmap only
   | Epsilon Double                      -- ^ /Valid for/: G; /Default/: @.0001 * # nodes@ (@mode == 'KK'@), @.0001@ (@mode == 'Major'@); /Notes/: neato only
   | ESep DPoint                         -- ^ /Valid for/: G; /Default/: @'DVal' 3@; /Notes/: not dot
-  | FillColor [Color]                   -- ^ /Valid for/: NEC; /Default/: @['X11Color' 'LightGray']@ (nodes), @['X11Color' 'Black']@ (clusters)
+  | FillColor ColorList                 -- ^ /Valid for/: NEC; /Default/: @['WC' ('X11Color' 'LightGray') Nothing]@ (nodes), @['WC' ('X11Color' 'Black') Nothing]@ (clusters)
   | FixedSize Bool                      -- ^ /Valid for/: N; /Default/: @'False'@; /Parsing Default/: 'True'
   | FontColor Color                     -- ^ /Valid for/: ENGC; /Default/: @'X11Color' 'Black'@
   | FontName Text                       -- ^ /Valid for/: ENGC; /Default/: @\"Times-Roman\"@
   | FontNames SVGFontNames              -- ^ /Valid for/: G; /Default/: @'SvgNames'@; /Notes/: svg only
-  | FontPath Text                       -- ^ /Valid for/: G; /Default/: system dependent
+  | FontPath Paths                      -- ^ /Valid for/: G; /Default/: system dependent
   | FontSize Double                     -- ^ /Valid for/: ENGC; /Default/: @14.0@; /Minimum/: @1.0@
-  | ForceLabels Bool                    -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'; /Notes/: Only for 'XLabel' attributes, requires Graphviz >= 2.29.0
+  | ForceLabels Bool                    -- ^ /Valid for/: G; /Default/: @'True'@; /Parsing Default/: 'True'; /Notes/: only for 'XLabel' attributes, requires Graphviz >= 2.29.0
   | GradientAngle Int                   -- ^ /Valid for/: NCG; /Default/: 0; /Notes/: requires Graphviz >= 2.29.0
   | Group Text                          -- ^ /Valid for/: N; /Default/: @\"\"@; /Notes/: dot only
   | HeadURL EscString                   -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: svg, map only
+  | Head_LP Point                       -- ^ /Valid for/: E; /Notes/: write only, requires Graphviz >= 2.30.0
   | HeadClip Bool                       -- ^ /Valid for/: E; /Default/: @'True'@; /Parsing Default/: 'True'
   | HeadLabel Label                     -- ^ /Valid for/: E; /Default/: @'StrLabel' \"\"@
   | HeadPort PortPos                    -- ^ /Valid for/: E; /Default/: @'CompassPoint' 'CenterPoint'@
@@ -307,13 +315,15 @@
   | LabelTarget EscString               -- ^ /Valid for/: E; /Default/: none; /Notes/: svg, map only
   | LabelTooltip EscString              -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: svg, cmap only
   | Landscape Bool                      -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'
-  | Layer LayerRange                    -- ^ /Valid for/: EN
+  | Layer LayerRange                    -- ^ /Valid for/: EN; /Default/: @[]@
+  | LayerListSep LayerListSep           -- ^ /Valid for/: G; /Default/: @'LLSep' \",\"@; /Notes/: requires Graphviz >= 2.30.0
   | Layers LayerList                    -- ^ /Valid for/: G; /Default/: @'LL' []@
+  | LayerSelect LayerRange              -- ^ /Valid for/: G; /Default/: @[]@
   | LayerSep LayerSep                   -- ^ /Valid for/: G; /Default/: @'LSep' \" :\t\"@
-  | Layout Text                         -- ^ /Valid for/: G; /Default/: @\"\"@
+  | Layout GraphvizCommand              -- ^ /Valid for/: G
   | Len Double                          -- ^ /Valid for/: E; /Default/: @1.0@ (neato), @0.3@ (fdp); /Notes/: fdp, neato only
-  | LevelsGap Double                    -- ^ /Valid for/: G; /Default/: @0.0@; /Notes/: neato only
   | Levels Int                          -- ^ /Valid for/: G; /Default/: @'maxBound'@; /Minimum/: @0@; /Notes/: sfdp only
+  | LevelsGap Double                    -- ^ /Valid for/: G; /Default/: @0.0@; /Notes/: neato only
   | LHead Text                          -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: dot only
   | LHeight Double                      -- ^ /Valid for/: GC; /Notes/: write only, requires Graphviz >= 2.28.0
   | LPos Point                          -- ^ /Valid for/: EGC; /Notes/: write only
@@ -367,18 +377,18 @@
   | SearchSize Int                      -- ^ /Valid for/: G; /Default/: @30@; /Notes/: dot only
   | Sep DPoint                          -- ^ /Valid for/: G; /Default/: @'DVal' 4@; /Notes/: not dot
   | Shape Shape                         -- ^ /Valid for/: N; /Default/: @'Ellipse'@
-  | ShapeFile Text                      -- ^ /Valid for/: N; /Default/: @\"\"@
-  | ShowBoxes Int                       -- ^ /Valid for/: ENG; /Default/: @0@; /Minimum/: @0@; /Notes/: dot only
+  | ShowBoxes Int                       -- ^ /Valid for/: ENG; /Default/: @0@; /Minimum/: @0@; /Notes/: dot only; used for debugging by printing PostScript guide boxes
   | Sides Int                           -- ^ /Valid for/: N; /Default/: @4@; /Minimum/: @0@
   | Size GraphSize                      -- ^ /Valid for/: G
   | Skew Double                         -- ^ /Valid for/: N; /Default/: @0.0@; /Minimum/: @-100.0@
   | Smoothing SmoothType                -- ^ /Valid for/: G; /Default/: @'NoSmooth'@; /Notes/: sfdp only
   | SortV Word16                        -- ^ /Valid for/: GCN; /Default/: @0@; /Minimum/: @0@
-  | Splines EdgeType                    -- ^ /Valid for/: G; /Parsing Default/: 'SplineEdges'
-  | Start StartType                     -- ^ /Valid for/: G; /Notes/: fdp, neato only
+  | Splines EdgeType                    -- ^ /Valid for/: G; /Default/: @'SplineEdges'@ (dot), @'LineEdges'@ (other); /Parsing Default/: 'SplineEdges'
+  | Start StartType                     -- ^ /Valid for/: G; /Default/: @'StartStyleSeed' 'RandomStyle' seed@ for some unknown fixed seed.; /Notes/: fdp, neato only
   | Style [StyleItem]                   -- ^ /Valid for/: ENC
   | StyleSheet Text                     -- ^ /Valid for/: G; /Default/: @\"\"@; /Notes/: svg only
   | TailURL EscString                   -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: svg, map only
+  | Tail_LP Point                       -- ^ /Valid for/: E; /Notes/: write only
   | TailClip Bool                       -- ^ /Valid for/: E; /Default/: @'True'@; /Parsing Default/: 'True'
   | TailLabel Label                     -- ^ /Valid for/: E; /Default/: @'StrLabel' \"\"@
   | TailPort PortPos                    -- ^ /Valid for/: E; /Default/: @'CompassPoint' 'CenterPoint'@
@@ -393,7 +403,7 @@
   | Weight Double                       -- ^ /Valid for/: E; /Default/: @1.0@; /Minimum/: @0@ (dot), @1@ (neato,fdp,sfdp)
   | Width Double                        -- ^ /Valid for/: N; /Default/: @0.75@; /Minimum/: @0.01@
   | XLabel Label                        -- ^ /Valid for/: EN; /Default/: @'StrLabel' \"\"@; /Notes/: requires Graphviz >= 2.29.0
-  | Z Double                            -- ^ /Valid for/: N; /Default/: @0.0@; /Minimum/: @-MAXFLOAT@, @-1000@
+  | XLP Point                           -- ^ /Valid for/: EN; /Notes/: write only, requires Graphviz >= 2.29.0
   | UnknownAttribute AttributeName Text -- ^ /Valid for/: Assumed valid for all; the fields are 'Attribute' name and value respectively.
   deriving (Eq, Ord, Show, Read)
 
@@ -406,16 +416,17 @@
   unqtDot (Damping v)            = printField "Damping" v
   unqtDot (K v)                  = printField "K" v
   unqtDot (URL v)                = printField "URL" v
+  unqtDot (Area v)               = printField "area" v
   unqtDot (ArrowHead v)          = printField "arrowhead" v
   unqtDot (ArrowSize v)          = printField "arrowsize" v
   unqtDot (ArrowTail v)          = printField "arrowtail" v
   unqtDot (Aspect v)             = printField "aspect" v
   unqtDot (BoundingBox v)        = printField "bb" v
-  unqtDot (ColorScheme v)        = printField "colorscheme" v
   unqtDot (BgColor v)            = printField "bgcolor" v
   unqtDot (Center v)             = printField "center" v
   unqtDot (ClusterRank v)        = printField "clusterrank" v
   unqtDot (Color v)              = printField "color" v
+  unqtDot (ColorScheme v)        = printField "colorscheme" v
   unqtDot (Comment v)            = printField "comment" v
   unqtDot (Compound v)           = printField "compound" v
   unqtDot (Concentrate v)        = printField "concentrate" v
@@ -444,6 +455,7 @@
   unqtDot (GradientAngle v)      = printField "gradientangle" v
   unqtDot (Group v)              = printField "group" v
   unqtDot (HeadURL v)            = printField "headURL" v
+  unqtDot (Head_LP v)            = printField "head_lp" v
   unqtDot (HeadClip v)           = printField "headclip" v
   unqtDot (HeadLabel v)          = printField "headlabel" v
   unqtDot (HeadPort v)           = printField "headport" v
@@ -469,12 +481,14 @@
   unqtDot (LabelTooltip v)       = printField "labeltooltip" v
   unqtDot (Landscape v)          = printField "landscape" v
   unqtDot (Layer v)              = printField "layer" v
+  unqtDot (LayerListSep v)       = printField "layerlistsep" v
   unqtDot (Layers v)             = printField "layers" v
+  unqtDot (LayerSelect v)        = printField "layerselect" v
   unqtDot (LayerSep v)           = printField "layersep" v
   unqtDot (Layout v)             = printField "layout" v
   unqtDot (Len v)                = printField "len" v
-  unqtDot (LevelsGap v)          = printField "levelsgap" v
   unqtDot (Levels v)             = printField "levels" v
+  unqtDot (LevelsGap v)          = printField "levelsgap" v
   unqtDot (LHead v)              = printField "lhead" v
   unqtDot (LHeight v)            = printField "LHeight" v
   unqtDot (LPos v)               = printField "lp" v
@@ -528,7 +542,6 @@
   unqtDot (SearchSize v)         = printField "searchsize" v
   unqtDot (Sep v)                = printField "sep" v
   unqtDot (Shape v)              = printField "shape" v
-  unqtDot (ShapeFile v)          = printField "shapefile" v
   unqtDot (ShowBoxes v)          = printField "showboxes" v
   unqtDot (Sides v)              = printField "sides" v
   unqtDot (Size v)               = printField "size" v
@@ -540,6 +553,7 @@
   unqtDot (Style v)              = printField "style" v
   unqtDot (StyleSheet v)         = printField "stylesheet" v
   unqtDot (TailURL v)            = printField "tailURL" v
+  unqtDot (Tail_LP v)            = printField "tail_lp" v
   unqtDot (TailClip v)           = printField "tailclip" v
   unqtDot (TailLabel v)          = printField "taillabel" v
   unqtDot (TailPort v)           = printField "tailport" v
@@ -554,36 +568,37 @@
   unqtDot (Weight v)             = printField "weight" v
   unqtDot (Width v)              = printField "width" v
   unqtDot (XLabel v)             = printField "xlabel" v
-  unqtDot (Z v)                  = printField "z" v
+  unqtDot (XLP v)                = printField "xlp" v
   unqtDot (UnknownAttribute a v) = toDot a <> equals <> toDot v
 
   listToDot = unqtListToDot
 
 instance ParseDot Attribute where
-  parseUnqt = stringParse (concat [ parseFieldNumDef Damping 0.99 "Damping"
-                                  , parseFieldNumDef K 0.3 "K"
+  parseUnqt = stringParse (concat [ parseField Damping "Damping"
+                                  , parseField K "K"
                                   , parseFields URL ["URL", "href"]
+                                  , parseField Area "area"
                                   , parseField ArrowHead "arrowhead"
-                                  , parseFieldNumDef ArrowSize 1 "arrowsize"
+                                  , parseField ArrowSize "arrowsize"
                                   , parseField ArrowTail "arrowtail"
                                   , parseField Aspect "aspect"
                                   , parseField BoundingBox "bb"
-                                  , parseField ColorScheme "colorscheme"
                                   , parseField BgColor "bgcolor"
                                   , parseFieldBool Center "center"
                                   , parseField ClusterRank "clusterrank"
                                   , parseField Color "color"
+                                  , parseField ColorScheme "colorscheme"
                                   , parseField Comment "comment"
                                   , parseFieldBool Compound "compound"
                                   , parseFieldBool Concentrate "concentrate"
                                   , parseFieldBool Constraint "constraint"
                                   , parseFieldBool Decorate "decorate"
                                   , parseField DefaultDist "defaultdist"
-                                  , parseFieldNumDef Dim 2 "dim"
-                                  , parseFieldNumDef Dimen 2 "dimen"
+                                  , parseField Dim "dim"
+                                  , parseField Dimen "dimen"
                                   , parseField Dir "dir"
                                   , parseFieldDef DirEdgeConstraints EdgeConstraints "diredgeconstraints"
-                                  , parseFieldNumDef Distortion 0 "distortion"
+                                  , parseField Distortion "distortion"
                                   , parseFields DPI ["dpi", "resolution"]
                                   , parseFields EdgeURL ["edgeURL", "edgehref"]
                                   , parseField EdgeTarget "edgetarget"
@@ -596,17 +611,18 @@
                                   , parseField FontName "fontname"
                                   , parseField FontNames "fontnames"
                                   , parseField FontPath "fontpath"
-                                  , parseFieldNumDef FontSize 14 "fontsize"
+                                  , parseField FontSize "fontsize"
                                   , parseFieldBool ForceLabels "forcelabels"
-                                  , parseFieldNumDef GradientAngle 0 "gradientangle"
+                                  , parseField GradientAngle "gradientangle"
                                   , parseField Group "group"
                                   , parseFields HeadURL ["headURL", "headhref"]
+                                  , parseField Head_LP "head_lp"
                                   , parseFieldBool HeadClip "headclip"
                                   , parseField HeadLabel "headlabel"
                                   , parseField HeadPort "headport"
                                   , parseField HeadTarget "headtarget"
                                   , parseField HeadTooltip "headtooltip"
-                                  , parseFieldNumDef Height 0.5 "height"
+                                  , parseField Height "height"
                                   , parseField ID "id"
                                   , parseField Image "image"
                                   , parseField ImagePath "imagepath"
@@ -614,24 +630,26 @@
                                   , parseField Label "label"
                                   , parseFields LabelURL ["labelURL", "labelhref"]
                                   , parseField LabelScheme "label_scheme"
-                                  , parseFieldNumDef LabelAngle (-25) "labelangle"
-                                  , parseFieldNumDef LabelDistance 1 "labeldistance"
+                                  , parseField LabelAngle "labelangle"
+                                  , parseField LabelDistance "labeldistance"
                                   , parseFieldBool LabelFloat "labelfloat"
                                   , parseField LabelFontColor "labelfontcolor"
                                   , parseField LabelFontName "labelfontname"
-                                  , parseFieldNumDef LabelFontSize 14 "labelfontsize"
+                                  , parseField LabelFontSize "labelfontsize"
                                   , parseField LabelJust "labeljust"
                                   , parseField LabelLoc "labelloc"
                                   , parseField LabelTarget "labeltarget"
                                   , parseField LabelTooltip "labeltooltip"
                                   , parseFieldBool Landscape "landscape"
                                   , parseField Layer "layer"
+                                  , parseField LayerListSep "layerlistsep"
                                   , parseField Layers "layers"
+                                  , parseField LayerSelect "layerselect"
                                   , parseField LayerSep "layersep"
                                   , parseField Layout "layout"
                                   , parseField Len "len"
-                                  , parseFieldNumDef LevelsGap 0 "levelsgap"
-                                  , parseFieldNumDef Levels maxBound "levels"
+                                  , parseField Levels "levels"
+                                  , parseField LevelsGap "levelsgap"
                                   , parseField LHead "lhead"
                                   , parseField LHeight "LHeight"
                                   , parseField LPos "lp"
@@ -639,34 +657,34 @@
                                   , parseField LWidth "lwidth"
                                   , parseField Margin "margin"
                                   , parseField MaxIter "maxiter"
-                                  , parseFieldNumDef MCLimit 1 "mclimit"
-                                  , parseFieldNumDef MinDist 1 "mindist"
-                                  , parseFieldNumDef MinLen 1 "minlen"
+                                  , parseField MCLimit "mclimit"
+                                  , parseField MinDist "mindist"
+                                  , parseField MinLen "minlen"
                                   , parseField Mode "mode"
                                   , parseField Model "model"
                                   , parseFieldBool Mosek "mosek"
-                                  , parseFieldNumDef NodeSep 0.25 "nodesep"
+                                  , parseField NodeSep "nodesep"
                                   , parseFieldBool NoJustify "nojustify"
                                   , parseFieldBool Normalize "normalize"
                                   , parseField Nslimit "nslimit"
                                   , parseField Nslimit1 "nslimit1"
                                   , parseField Ordering "ordering"
-                                  , parseFieldNumDef Orientation 0 "orientation"
+                                  , parseField Orientation "orientation"
                                   , parseField OutputOrder "outputorder"
                                   , parseFieldDef Overlap KeepOverlaps "overlap"
-                                  , parseFieldNumDef OverlapScaling (-4) "overlap_scaling"
+                                  , parseField OverlapScaling "overlap_scaling"
                                   , parseFieldDef Pack DoPack "pack"
                                   , parseField PackMode "packmode"
                                   , parseField Pad "pad"
                                   , parseField Page "page"
                                   , parseField PageDir "pagedir"
                                   , parseField PenColor "pencolor"
-                                  , parseFieldNumDef PenWidth 1 "penwidth"
-                                  , parseFieldNumDef Peripheries 1 "peripheries"
+                                  , parseField PenWidth "penwidth"
+                                  , parseField Peripheries "peripheries"
                                   , parseFieldBool Pin "pin"
                                   , parseField Pos "pos"
                                   , parseFieldDef QuadTree NormalQT "quadtree"
-                                  , parseFieldNumDef Quantum 0 "quantum"
+                                  , parseField Quantum "quantum"
                                   , parseField Rank "rank"
                                   , parseField RankDir "rankdir"
                                   , parseField RankSep "ranksep"
@@ -674,22 +692,21 @@
                                   , parseField Rects "rects"
                                   , parseFieldBool Regular "regular"
                                   , parseFieldBool ReMinCross "remincross"
-                                  , parseFieldNumDef RepulsiveForce 1 "repulsiveforce"
+                                  , parseField RepulsiveForce "repulsiveforce"
                                   , parseFieldDef Root IsCentral "root"
-                                  , parseFieldNumDef Rotate 0 "rotate"
-                                  , parseFieldNumDef Rotation 0 "rotation"
+                                  , parseField Rotate "rotate"
+                                  , parseField Rotation "rotation"
                                   , parseField SameHead "samehead"
                                   , parseField SameTail "sametail"
                                   , parseField SamplePoints "samplepoints"
                                   , parseField Scale "scale"
-                                  , parseFieldNumDef SearchSize 30 "searchsize"
+                                  , parseField SearchSize "searchsize"
                                   , parseField Sep "sep"
                                   , parseField Shape "shape"
-                                  , parseField ShapeFile "shapefile"
-                                  , parseFieldNumDef ShowBoxes 0 "showboxes"
-                                  , parseFieldNumDef Sides 4 "sides"
+                                  , parseField ShowBoxes "showboxes"
+                                  , parseField Sides "sides"
                                   , parseField Size "size"
-                                  , parseFieldNumDef Skew 0 "skew"
+                                  , parseField Skew "skew"
                                   , parseField Smoothing "smoothing"
                                   , parseField SortV "sortv"
                                   , parseFieldDef Splines SplineEdges "splines"
@@ -697,6 +714,7 @@
                                   , parseField Style "style"
                                   , parseField StyleSheet "stylesheet"
                                   , parseFields TailURL ["tailURL", "tailhref"]
+                                  , parseField Tail_LP "tail_lp"
                                   , parseFieldBool TailClip "tailclip"
                                   , parseField TailLabel "taillabel"
                                   , parseField TailPort "tailport"
@@ -707,16 +725,16 @@
                                   , parseFieldBool TrueColor "truecolor"
                                   , parseField Vertices "vertices"
                                   , parseField ViewPort "viewport"
-                                  , parseFieldNumDef VoroMargin 0.05 "voro_margin"
+                                  , parseField VoroMargin "voro_margin"
                                   , parseField Weight "weight"
-                                  , parseFieldNumDef Width 0.75 "width"
+                                  , parseField Width "width"
                                   , parseField XLabel "xlabel"
-                                  , parseFieldNumDef Z 0 "z"
+                                  , parseField XLP "xlp"
                                   ])
               `onFail`
               do attrName <- stringBlock
-                 liftEqParse' ("UnknownAttribute (" ++ T.unpack attrName ++ ")")
-                              (UnknownAttribute attrName)
+                 liftEqParse ("UnknownAttribute (" ++ T.unpack attrName ++ ")")
+                             (UnknownAttribute attrName)
 
   parse = parseUnqt
 
@@ -729,10 +747,10 @@
 usedByGraphs URL{}                = True
 usedByGraphs Aspect{}             = True
 usedByGraphs BoundingBox{}        = True
-usedByGraphs ColorScheme{}        = True
 usedByGraphs BgColor{}            = True
 usedByGraphs Center{}             = True
 usedByGraphs ClusterRank{}        = True
+usedByGraphs ColorScheme{}        = True
 usedByGraphs Comment{}            = True
 usedByGraphs Compound{}           = True
 usedByGraphs Concentrate{}        = True
@@ -757,11 +775,13 @@
 usedByGraphs LabelJust{}          = True
 usedByGraphs LabelLoc{}           = True
 usedByGraphs Landscape{}          = True
+usedByGraphs LayerListSep{}       = True
 usedByGraphs Layers{}             = True
+usedByGraphs LayerSelect{}        = True
 usedByGraphs LayerSep{}           = True
 usedByGraphs Layout{}             = True
-usedByGraphs LevelsGap{}          = True
 usedByGraphs Levels{}             = True
+usedByGraphs LevelsGap{}          = True
 usedByGraphs LHeight{}            = True
 usedByGraphs LPos{}               = True
 usedByGraphs LWidth{}             = True
@@ -817,9 +837,10 @@
 usedByClusters                    :: Attribute -> Bool
 usedByClusters K{}                = True
 usedByClusters URL{}              = True
-usedByClusters ColorScheme{}      = True
+usedByClusters Area{}             = True
 usedByClusters BgColor{}          = True
 usedByClusters Color{}            = True
+usedByClusters ColorScheme{}      = True
 usedByClusters FillColor{}        = True
 usedByClusters FontColor{}        = True
 usedByClusters FontName{}         = True
@@ -852,8 +873,9 @@
 -- | Determine if this 'Attribute' is valid for use with Nodes.
 usedByNodes                    :: Attribute -> Bool
 usedByNodes URL{}              = True
-usedByNodes ColorScheme{}      = True
+usedByNodes Area{}             = True
 usedByNodes Color{}            = True
+usedByNodes ColorScheme{}      = True
 usedByNodes Comment{}          = True
 usedByNodes Distortion{}       = True
 usedByNodes FillColor{}        = True
@@ -883,7 +905,6 @@
 usedByNodes Root{}             = True
 usedByNodes SamplePoints{}     = True
 usedByNodes Shape{}            = True
-usedByNodes ShapeFile{}        = True
 usedByNodes ShowBoxes{}        = True
 usedByNodes Sides{}            = True
 usedByNodes Skew{}             = True
@@ -894,7 +915,7 @@
 usedByNodes Vertices{}         = True
 usedByNodes Width{}            = True
 usedByNodes XLabel{}           = True
-usedByNodes Z{}                = True
+usedByNodes XLP{}              = True
 usedByNodes UnknownAttribute{} = True
 usedByNodes _                  = False
 
@@ -904,8 +925,8 @@
 usedByEdges ArrowHead{}        = True
 usedByEdges ArrowSize{}        = True
 usedByEdges ArrowTail{}        = True
-usedByEdges ColorScheme{}      = True
 usedByEdges Color{}            = True
+usedByEdges ColorScheme{}      = True
 usedByEdges Comment{}          = True
 usedByEdges Constraint{}       = True
 usedByEdges Decorate{}         = True
@@ -918,6 +939,7 @@
 usedByEdges FontName{}         = True
 usedByEdges FontSize{}         = True
 usedByEdges HeadURL{}          = True
+usedByEdges Head_LP{}          = True
 usedByEdges HeadClip{}         = True
 usedByEdges HeadLabel{}        = True
 usedByEdges HeadPort{}         = True
@@ -948,6 +970,7 @@
 usedByEdges ShowBoxes{}        = True
 usedByEdges Style{}            = True
 usedByEdges TailURL{}          = True
+usedByEdges Tail_LP{}          = True
 usedByEdges TailClip{}         = True
 usedByEdges TailLabel{}        = True
 usedByEdges TailPort{}         = True
@@ -957,6 +980,7 @@
 usedByEdges Tooltip{}          = True
 usedByEdges Weight{}           = True
 usedByEdges XLabel{}           = True
+usedByEdges XLP{}              = True
 usedByEdges UnknownAttribute{} = True
 usedByEdges _                  = False
 
@@ -965,16 +989,17 @@
 sameAttribute Damping{}               Damping{}               = True
 sameAttribute K{}                     K{}                     = True
 sameAttribute URL{}                   URL{}                   = True
+sameAttribute Area{}                  Area{}                  = True
 sameAttribute ArrowHead{}             ArrowHead{}             = True
 sameAttribute ArrowSize{}             ArrowSize{}             = True
 sameAttribute ArrowTail{}             ArrowTail{}             = True
 sameAttribute Aspect{}                Aspect{}                = True
 sameAttribute BoundingBox{}           BoundingBox{}           = True
-sameAttribute ColorScheme{}           ColorScheme{}           = True
 sameAttribute BgColor{}               BgColor{}               = True
 sameAttribute Center{}                Center{}                = True
 sameAttribute ClusterRank{}           ClusterRank{}           = True
 sameAttribute Color{}                 Color{}                 = True
+sameAttribute ColorScheme{}           ColorScheme{}           = True
 sameAttribute Comment{}               Comment{}               = True
 sameAttribute Compound{}              Compound{}              = True
 sameAttribute Concentrate{}           Concentrate{}           = True
@@ -1003,6 +1028,7 @@
 sameAttribute GradientAngle{}         GradientAngle{}         = True
 sameAttribute Group{}                 Group{}                 = True
 sameAttribute HeadURL{}               HeadURL{}               = True
+sameAttribute Head_LP{}               Head_LP{}               = True
 sameAttribute HeadClip{}              HeadClip{}              = True
 sameAttribute HeadLabel{}             HeadLabel{}             = True
 sameAttribute HeadPort{}              HeadPort{}              = True
@@ -1028,12 +1054,14 @@
 sameAttribute LabelTooltip{}          LabelTooltip{}          = True
 sameAttribute Landscape{}             Landscape{}             = True
 sameAttribute Layer{}                 Layer{}                 = True
+sameAttribute LayerListSep{}          LayerListSep{}          = True
 sameAttribute Layers{}                Layers{}                = True
+sameAttribute LayerSelect{}           LayerSelect{}           = True
 sameAttribute LayerSep{}              LayerSep{}              = True
 sameAttribute Layout{}                Layout{}                = True
 sameAttribute Len{}                   Len{}                   = True
-sameAttribute LevelsGap{}             LevelsGap{}             = True
 sameAttribute Levels{}                Levels{}                = True
+sameAttribute LevelsGap{}             LevelsGap{}             = True
 sameAttribute LHead{}                 LHead{}                 = True
 sameAttribute LHeight{}               LHeight{}               = True
 sameAttribute LPos{}                  LPos{}                  = True
@@ -1087,7 +1115,6 @@
 sameAttribute SearchSize{}            SearchSize{}            = True
 sameAttribute Sep{}                   Sep{}                   = True
 sameAttribute Shape{}                 Shape{}                 = True
-sameAttribute ShapeFile{}             ShapeFile{}             = True
 sameAttribute ShowBoxes{}             ShowBoxes{}             = True
 sameAttribute Sides{}                 Sides{}                 = True
 sameAttribute Size{}                  Size{}                  = True
@@ -1099,6 +1126,7 @@
 sameAttribute Style{}                 Style{}                 = True
 sameAttribute StyleSheet{}            StyleSheet{}            = True
 sameAttribute TailURL{}               TailURL{}               = True
+sameAttribute Tail_LP{}               Tail_LP{}               = True
 sameAttribute TailClip{}              TailClip{}              = True
 sameAttribute TailLabel{}             TailLabel{}             = True
 sameAttribute TailPort{}              TailPort{}              = True
@@ -1113,7 +1141,7 @@
 sameAttribute Weight{}                Weight{}                = True
 sameAttribute Width{}                 Width{}                 = True
 sameAttribute XLabel{}                XLabel{}                = True
-sameAttribute Z{}                     Z{}                     = True
+sameAttribute XLP{}                   XLP{}                   = True
 sameAttribute (UnknownAttribute a1 _) (UnknownAttribute a2 _) = a1 == a2
 sameAttribute _                       _                       = False
 
@@ -1122,14 +1150,15 @@
 defaultAttributeValue Damping{}            = Just $ Damping 0.99
 defaultAttributeValue K{}                  = Just $ K 0.3
 defaultAttributeValue URL{}                = Just $ URL ""
+defaultAttributeValue Area{}               = Just $ Area 1.0
 defaultAttributeValue ArrowHead{}          = Just $ ArrowHead normal
-defaultAttributeValue ArrowSize{}          = Just $ ArrowSize 1
+defaultAttributeValue ArrowSize{}          = Just $ ArrowSize 1.0
 defaultAttributeValue ArrowTail{}          = Just $ ArrowTail normal
-defaultAttributeValue ColorScheme{}        = Just $ ColorScheme X11
-defaultAttributeValue BgColor{}            = Just $ BgColor [X11Color Transparent]
+defaultAttributeValue BgColor{}            = Just $ BgColor []
 defaultAttributeValue Center{}             = Just $ Center False
 defaultAttributeValue ClusterRank{}        = Just $ ClusterRank Local
-defaultAttributeValue Color{}              = Just $ Color [X11Color Black]
+defaultAttributeValue Color{}              = Just $ Color [toWColor Black]
+defaultAttributeValue ColorScheme{}        = Just $ ColorScheme X11
 defaultAttributeValue Comment{}            = Just $ Comment ""
 defaultAttributeValue Compound{}           = Just $ Compound False
 defaultAttributeValue Concentrate{}        = Just $ Concentrate False
@@ -1138,16 +1167,18 @@
 defaultAttributeValue Dim{}                = Just $ Dim 2
 defaultAttributeValue Dimen{}              = Just $ Dimen 2
 defaultAttributeValue DirEdgeConstraints{} = Just $ DirEdgeConstraints NoConstraints
-defaultAttributeValue Distortion{}         = Just $ Distortion 0
+defaultAttributeValue Distortion{}         = Just $ Distortion 0.0
+defaultAttributeValue DPI{}                = Just $ DPI 96.0
 defaultAttributeValue EdgeURL{}            = Just $ EdgeURL ""
+defaultAttributeValue EdgeTooltip{}        = Just $ EdgeTooltip ""
 defaultAttributeValue ESep{}               = Just $ ESep (DVal 3)
-defaultAttributeValue FillColor{}          = Just $ FillColor [X11Color Black]
+defaultAttributeValue FillColor{}          = Just $ FillColor [toWColor Black]
 defaultAttributeValue FixedSize{}          = Just $ FixedSize False
 defaultAttributeValue FontColor{}          = Just $ FontColor (X11Color Black)
 defaultAttributeValue FontName{}           = Just $ FontName "Times-Roman"
 defaultAttributeValue FontNames{}          = Just $ FontNames SvgNames
-defaultAttributeValue FontSize{}           = Just $ FontSize 14
-defaultAttributeValue ForceLabels{}        = Just $ ForceLabels False
+defaultAttributeValue FontSize{}           = Just $ FontSize 14.0
+defaultAttributeValue ForceLabels{}        = Just $ ForceLabels True
 defaultAttributeValue GradientAngle{}      = Just $ GradientAngle 0
 defaultAttributeValue Group{}              = Just $ Group ""
 defaultAttributeValue HeadURL{}            = Just $ HeadURL ""
@@ -1164,26 +1195,28 @@
 defaultAttributeValue Label{}              = Just $ Label (StrLabel "")
 defaultAttributeValue LabelURL{}           = Just $ LabelURL ""
 defaultAttributeValue LabelScheme{}        = Just $ LabelScheme NotEdgeLabel
-defaultAttributeValue LabelAngle{}         = Just $ LabelAngle (-25)
-defaultAttributeValue LabelDistance{}      = Just $ LabelDistance 1
+defaultAttributeValue LabelAngle{}         = Just $ LabelAngle (-25.0)
+defaultAttributeValue LabelDistance{}      = Just $ LabelDistance 1.0
 defaultAttributeValue LabelFloat{}         = Just $ LabelFloat False
 defaultAttributeValue LabelFontColor{}     = Just $ LabelFontColor (X11Color Black)
 defaultAttributeValue LabelFontName{}      = Just $ LabelFontName "Times-Roman"
-defaultAttributeValue LabelFontSize{}      = Just $ LabelFontSize 14
+defaultAttributeValue LabelFontSize{}      = Just $ LabelFontSize 14.0
 defaultAttributeValue LabelJust{}          = Just $ LabelJust JCenter
 defaultAttributeValue LabelLoc{}           = Just $ LabelLoc VTop
 defaultAttributeValue LabelTarget{}        = Just $ LabelTarget ""
 defaultAttributeValue LabelTooltip{}       = Just $ LabelTooltip ""
 defaultAttributeValue Landscape{}          = Just $ Landscape False
+defaultAttributeValue Layer{}              = Just $ Layer []
+defaultAttributeValue LayerListSep{}       = Just $ LayerListSep (LLSep ",")
 defaultAttributeValue Layers{}             = Just $ Layers (LL [])
+defaultAttributeValue LayerSelect{}        = Just $ LayerSelect []
 defaultAttributeValue LayerSep{}           = Just $ LayerSep (LSep " :\t")
-defaultAttributeValue Layout{}             = Just $ Layout ""
-defaultAttributeValue LevelsGap{}          = Just $ LevelsGap 0
 defaultAttributeValue Levels{}             = Just $ Levels maxBound
+defaultAttributeValue LevelsGap{}          = Just $ LevelsGap 0.0
 defaultAttributeValue LHead{}              = Just $ LHead ""
 defaultAttributeValue LTail{}              = Just $ LTail ""
-defaultAttributeValue MCLimit{}            = Just $ MCLimit 1
-defaultAttributeValue MinDist{}            = Just $ MinDist 1
+defaultAttributeValue MCLimit{}            = Just $ MCLimit 1.0
+defaultAttributeValue MinDist{}            = Just $ MinDist 1.0
 defaultAttributeValue MinLen{}             = Just $ MinLen 1
 defaultAttributeValue Mode{}               = Just $ Mode Major
 defaultAttributeValue Model{}              = Just $ Model ShortPath
@@ -1191,7 +1224,7 @@
 defaultAttributeValue NodeSep{}            = Just $ NodeSep 0.25
 defaultAttributeValue NoJustify{}          = Just $ NoJustify False
 defaultAttributeValue Normalize{}          = Just $ Normalize False
-defaultAttributeValue Orientation{}        = Just $ Orientation 0
+defaultAttributeValue Orientation{}        = Just $ Orientation 0.0
 defaultAttributeValue OutputOrder{}        = Just $ OutputOrder BreadthFirst
 defaultAttributeValue Overlap{}            = Just $ Overlap KeepOverlaps
 defaultAttributeValue OverlapScaling{}     = Just $ OverlapScaling (-4)
@@ -1200,7 +1233,7 @@
 defaultAttributeValue Pad{}                = Just $ Pad (DVal 0.0555)
 defaultAttributeValue PageDir{}            = Just $ PageDir Bl
 defaultAttributeValue PenColor{}           = Just $ PenColor (X11Color Black)
-defaultAttributeValue PenWidth{}           = Just $ PenWidth 1
+defaultAttributeValue PenWidth{}           = Just $ PenWidth 1.0
 defaultAttributeValue Peripheries{}        = Just $ Peripheries 1
 defaultAttributeValue Pin{}                = Just $ Pin False
 defaultAttributeValue QuadTree{}           = Just $ QuadTree NormalQT
@@ -1208,7 +1241,7 @@
 defaultAttributeValue RankDir{}            = Just $ RankDir FromTop
 defaultAttributeValue Regular{}            = Just $ Regular False
 defaultAttributeValue ReMinCross{}         = Just $ ReMinCross False
-defaultAttributeValue RepulsiveForce{}     = Just $ RepulsiveForce 1
+defaultAttributeValue RepulsiveForce{}     = Just $ RepulsiveForce 1.0
 defaultAttributeValue Root{}               = Just $ Root (NodeName "")
 defaultAttributeValue Rotate{}             = Just $ Rotate 0
 defaultAttributeValue Rotation{}           = Just $ Rotation 0
@@ -1217,13 +1250,11 @@
 defaultAttributeValue SearchSize{}         = Just $ SearchSize 30
 defaultAttributeValue Sep{}                = Just $ Sep (DVal 4)
 defaultAttributeValue Shape{}              = Just $ Shape Ellipse
-defaultAttributeValue ShapeFile{}          = Just $ ShapeFile ""
 defaultAttributeValue ShowBoxes{}          = Just $ ShowBoxes 0
 defaultAttributeValue Sides{}              = Just $ Sides 4
-defaultAttributeValue Skew{}               = Just $ Skew 0
+defaultAttributeValue Skew{}               = Just $ Skew 0.0
 defaultAttributeValue Smoothing{}          = Just $ Smoothing NoSmooth
 defaultAttributeValue SortV{}              = Just $ SortV 0
-defaultAttributeValue Splines{}            = Just $ Splines SplineEdges
 defaultAttributeValue StyleSheet{}         = Just $ StyleSheet ""
 defaultAttributeValue TailURL{}            = Just $ TailURL ""
 defaultAttributeValue TailClip{}           = Just $ TailClip True
@@ -1234,9 +1265,9 @@
 defaultAttributeValue Target{}             = Just $ Target ""
 defaultAttributeValue Tooltip{}            = Just $ Tooltip ""
 defaultAttributeValue VoroMargin{}         = Just $ VoroMargin 0.05
+defaultAttributeValue Weight{}             = Just $ Weight 1.0
 defaultAttributeValue Width{}              = Just $ Width 0.75
 defaultAttributeValue XLabel{}             = Just $ XLabel (StrLabel "")
-defaultAttributeValue Z{}                  = Just $ Z 0
 defaultAttributeValue _                    = Nothing
 
 -- | Determine if the provided 'Text' value is a valid name for an 'UnknownAttribute'.
@@ -1249,16 +1280,17 @@
                , "K"
                , "URL"
                , "href"
+               , "area"
                , "arrowhead"
                , "arrowsize"
                , "arrowtail"
                , "aspect"
                , "bb"
-               , "colorscheme"
                , "bgcolor"
                , "center"
                , "clusterrank"
                , "color"
+               , "colorscheme"
                , "comment"
                , "compound"
                , "concentrate"
@@ -1290,6 +1322,7 @@
                , "group"
                , "headURL"
                , "headhref"
+               , "head_lp"
                , "headclip"
                , "headlabel"
                , "headport"
@@ -1316,12 +1349,14 @@
                , "labeltooltip"
                , "landscape"
                , "layer"
+               , "layerlistsep"
                , "layers"
+               , "layerselect"
                , "layersep"
                , "layout"
                , "len"
-               , "levelsgap"
                , "levels"
+               , "levelsgap"
                , "lhead"
                , "LHeight"
                , "lp"
@@ -1375,7 +1410,6 @@
                , "searchsize"
                , "sep"
                , "shape"
-               , "shapefile"
                , "showboxes"
                , "sides"
                , "size"
@@ -1388,6 +1422,7 @@
                , "stylesheet"
                , "tailURL"
                , "tailhref"
+               , "tail_lp"
                , "tailclip"
                , "taillabel"
                , "tailport"
@@ -1402,15 +1437,70 @@
                , "weight"
                , "width"
                , "xlabel"
-               , "z"
+               , "xlp"
                , "charset" -- Defined upstream, just not used here.
                ])
             `S.union`
             keywords
 {- Delete to here -}
 
+-- | Remove attributes that we don't want to consider:
+--
+--   * Those that are defaults
+--   * colorscheme (as the colors embed it anyway)
+rmUnwantedAttributes :: Attributes -> Attributes
+rmUnwantedAttributes = filter (not . (`any` tests) . flip ($))
+  where
+    tests = [isDefault, isColorScheme]
+
+    isDefault a = maybe False (a==) $ defaultAttributeValue a
+
+    isColorScheme ColorScheme{} = True
+    isColorScheme _             = False
+
 -- -----------------------------------------------------------------------------
+-- These parsing combinators are defined here for customisation purposes.
 
+parseField       :: (ParseDot a) => (a -> Attribute) -> String
+                    -> [(String, Parse Attribute)]
+parseField c fld = [(fld, liftEqParse fld c)]
+
+parseFields   :: (ParseDot a) => (a -> Attribute) -> [String]
+                 -> [(String, Parse Attribute)]
+parseFields c = concatMap (parseField c)
+
+parseFieldBool :: (Bool -> Attribute) -> String -> [(String, Parse Attribute)]
+parseFieldBool = (`parseFieldDef` True)
+
+-- | For 'Bool'-like data structures where the presence of the field
+--   name without a value implies a default value.
+parseFieldDef         :: (ParseDot a) => (a -> Attribute) -> a -> String
+                         -> [(String, Parse Attribute)]
+parseFieldDef c d fld = [(fld, p)]
+  where
+    p = liftEqParse fld c
+        `onFail`
+        do nxt <- optional $ satisfy restIDString
+           bool (fail "Not actually the field you were after")
+                (return $ c d)
+                (isNothing nxt)
+
+-- | Attempt to parse the @\"=value\"@ part of a @key=value@ pair.  If
+--   there is an equal sign but the @value@ part doesn't parse, throw
+--   an un-recoverable error.
+liftEqParse :: (ParseDot a) => String -> (a -> Attribute) -> Parse Attribute
+liftEqParse k c = parseEq
+                  *> ( hasDef (fmap c parse)
+                       `adjustErrBad`
+                       (("Unable to parse key=value with key of " ++ k
+                         ++ "\n\t") ++)
+                     )
+  where
+    hasDef p = maybe p (onFail p . (`stringRep` "\"\""))
+               . defaultAttributeValue $ c undefined
+
+-- -----------------------------------------------------------------------------
+
 {- | If performing any custom pre-/post-processing on Dot code, you
      may wish to utilise some custom 'Attributes'.  These are wrappers
      around the 'UnknownAttribute' constructor (and thus 'CustomAttribute'
@@ -1476,6 +1566,53 @@
 
 -- -----------------------------------------------------------------------------
 
+-- | The available Graphviz commands.  The following directions are
+--   based upon those in the Graphviz man page (available online at
+--   <http://graphviz.org/pdf/dot.1.pdf>, or if installed on your
+--   system @man graphviz@).  Note that any command can be used on
+--   both directed and undirected graphs.
+--
+--   When used with the 'Layout' attribute, it overrides any actual
+--   command called on the dot graph.
+data GraphvizCommand = Dot       -- ^ For hierachical graphs (ideal for
+                                 --   directed graphs).
+                     | Neato     -- ^ For symmetric layouts of graphs
+                                 --   (ideal for undirected graphs).
+                     | TwoPi     -- ^ For radial layout of graphs.
+                     | Circo     -- ^ For circular layout of graphs.
+                     | Fdp       -- ^ Spring-model approach for
+                                 --   undirected graphs.
+                     | Sfdp      -- ^ As with Fdp, but ideal for large
+                                 --   graphs.
+                     | Osage     -- ^ Filter for drawing clustered graphs,
+                                 --   requires Graphviz >= 2.28.0.
+                     | Patchwork -- ^ Draw clustered graphs as treemaps,
+                                 --   requires Graphviz >= 2.28.0.
+                     deriving (Eq, Ord, Bounded, Enum, Show, Read)
+
+instance PrintDot GraphvizCommand where
+  unqtDot Dot       = text "dot"
+  unqtDot Neato     = text "neato"
+  unqtDot TwoPi     = text "twopi"
+  unqtDot Circo     = text "circo"
+  unqtDot Fdp       = text "fdp"
+  unqtDot Sfdp      = text "sfdp"
+  unqtDot Osage     = text "osage"
+  unqtDot Patchwork = text "patchwork"
+
+instance ParseDot GraphvizCommand where
+  parseUnqt = stringValue [ ("dot", Dot)
+                          , ("neato", Neato)
+                          , ("twopi", TwoPi)
+                          , ("circo", Circo)
+                          , ("fdp", Fdp)
+                          , ("sfdp", Sfdp)
+                          , ("osage", Osage)
+                          , ("patchwork", Patchwork)
+                          ]
+
+-- -----------------------------------------------------------------------------
+
 {- |
 
    Some 'Attribute's (mainly label-like ones) take a 'String' argument
@@ -1570,15 +1707,15 @@
                 deriving (Eq, Ord, Bounded, Enum, Show, Read)
 
 instance PrintDot ArrowShape where
-  unqtDot Box      = unqtText "box"
-  unqtDot Crow     = unqtText "crow"
-  unqtDot Diamond  = unqtText "diamond"
-  unqtDot DotArrow = unqtText "dot"
-  unqtDot Inv      = unqtText "inv"
-  unqtDot NoArrow  = unqtText "none"
-  unqtDot Normal   = unqtText "normal"
-  unqtDot Tee      = unqtText "tee"
-  unqtDot Vee      = unqtText "vee"
+  unqtDot Box      = text "box"
+  unqtDot Crow     = text "crow"
+  unqtDot Diamond  = text "diamond"
+  unqtDot DotArrow = text "dot"
+  unqtDot Inv      = text "inv"
+  unqtDot NoArrow  = text "none"
+  unqtDot Normal   = text "normal"
+  unqtDot Tee      = text "tee"
+  unqtDot Vee      = text "vee"
 
 instance ParseDot ArrowShape where
   parseUnqt = stringValue [ ("box", Box)
@@ -1692,15 +1829,18 @@
 
 -- -----------------------------------------------------------------------------
 
+-- | If 'Local', then sub-graphs that are clusters are given special
+--   treatment.  'Global' and 'NoCluster' currently appear to be
+--   identical and turn off the special cluster processing.
 data ClusterMode = Local
                  | Global
                  | NoCluster
                  deriving (Eq, Ord, Bounded, Enum, Show, Read)
 
 instance PrintDot ClusterMode where
-  unqtDot Local     = unqtText "local"
-  unqtDot Global    = unqtText "global"
-  unqtDot NoCluster = unqtText "none"
+  unqtDot Local     = text "local"
+  unqtDot Global    = text "global"
+  unqtDot NoCluster = text "none"
 
 instance ParseDot ClusterMode where
   parseUnqt = oneOf [ stringRep Local "local"
@@ -1720,10 +1860,10 @@
              deriving (Eq, Ord, Bounded, Enum, Show, Read)
 
 instance PrintDot DirType where
-  unqtDot Forward = unqtText "forward"
-  unqtDot Back    = unqtText "back"
-  unqtDot Both    = unqtText "both"
-  unqtDot NoDir   = unqtText "none"
+  unqtDot Forward = text "forward"
+  unqtDot Back    = text "back"
+  unqtDot Both    = text "both"
+  unqtDot NoDir   = text "none"
 
 instance ParseDot DirType where
   parseUnqt = oneOf [ stringRep Forward "forward"
@@ -1772,11 +1912,12 @@
   toDot (PVal p) = printPoint2D p
 
 instance ParseDot DPoint where
-  parseUnqt = fmap PVal parsePoint2D
-              `onFail`
-              fmap DVal parseUnqt
+  parseUnqt = optional (character '+')
+              *> oneOf [ PVal <$> parsePoint2D
+                       , DVal <$> parseUnqt
+                       ]
 
-  parse = quotedParse parseUnqt
+  parse = quotedParse parseUnqt -- A `+' would need to be quoted.
           `onFail`
           fmap DVal parseUnqt
 
@@ -1862,17 +2003,20 @@
 data Model = ShortPath
            | SubSet
            | Circuit
+           | MDS
            deriving (Eq, Ord, Bounded, Enum, Show, Read)
 
 instance PrintDot Model where
   unqtDot ShortPath = text "shortpath"
   unqtDot SubSet    = text "subset"
   unqtDot Circuit   = text "circuit"
+  unqtDot MDS       = text "mds"
 
 instance ParseDot Model where
   parseUnqt = oneOf [ stringRep ShortPath "shortpath"
                     , stringRep SubSet "subset"
                     , stringRep Circuit "circuit"
+                    , stringRep MDS "mds"
                     ]
 
 -- -----------------------------------------------------------------------------
@@ -2057,15 +2201,35 @@
 
 -- -----------------------------------------------------------------------------
 
+-- | How to deal with node overlaps.
+--
+--   Defaults to 'KeepOverlaps' /except/ for fdp and sfdp.
+--
+--   The ability to specify the number of tries for fdp's initial
+--   force-directed technique is /not/ supported (by default, fdp uses
+--   @9@ passes of its in-built technique, and then @'PrismOverlap'
+--   Nothing@).
+--
+--   For sfdp, the default is @'PrismOverlap' (Just 0)@.
 data Overlap = KeepOverlaps
-             | ScaleOverlaps
-             | ScaleXYOverlaps
-             | PrismOverlap (Maybe Word16) -- ^ Only when sfdp is
-                                           --   available, @'Nothing'@
+             | ScaleOverlaps -- ^ Remove overlaps by uniformly scaling in x and y.
+             | ScaleXYOverlaps -- ^ Remove overlaps by separately scaling x and y.
+             | PrismOverlap (Maybe Word16) -- ^ Requires the Prism
+                                           --   library to be
+                                           --   available (if not,
+                                           --   this is equivalent to
+                                           --   'VoronoiOverlap'). @'Nothing'@
                                            --   is equivalent to
                                            --   @'Just' 1000@.
-             | CompressOverlap
-             | VpscOverlap
+                                           --   Influenced by
+                                           --   'OverlapScaling'.
+             | VoronoiOverlap -- ^ Requires Graphviz >= 2.30.0.
+             | CompressOverlap -- ^ Scale layout down as much as
+                               --   possible without introducing
+                               --   overlaps, assuming none to begin
+                               --   with.
+             | VpscOverlap -- ^ Uses quadratic optimization to
+                           --   minimize node displacement.
              | IpsepOverlap -- ^ Only when @mode == 'IpSep'@
              deriving (Eq, Ord, Show, Read)
 
@@ -2074,16 +2238,21 @@
   unqtDot ScaleOverlaps    = text "scale"
   unqtDot ScaleXYOverlaps  = text "scalexy"
   unqtDot (PrismOverlap i) = maybe id (flip (<>) . unqtDot) i $ text "prism"
+  unqtDot VoronoiOverlap   = text "voronoi"
   unqtDot CompressOverlap  = text "compress"
   unqtDot VpscOverlap      = text "vpsc"
   unqtDot IpsepOverlap     = text "ipsep"
 
+-- | Note that @overlap=false@ defaults to @'PrismOverlap' Nothing@,
+--   but if the Prism library isn't available then it is equivalent to
+--   'VoronoiOverlap'.
 instance ParseDot Overlap where
   parseUnqt = oneOf [ stringRep KeepOverlaps "true"
                     , stringRep ScaleXYOverlaps "scalexy"
                     , stringRep ScaleOverlaps "scale"
                     , string "prism" *> fmap PrismOverlap (optional parse)
                     , stringRep (PrismOverlap Nothing) "false"
+                    , stringRep VoronoiOverlap "voronoi"
                     , stringRep CompressOverlap "compress"
                     , stringRep VpscOverlap "vpsc"
                     , stringRep IpsepOverlap "ipsep"
@@ -2108,11 +2277,30 @@
              setLayerSep $ T.unpack ls
              return $ LSep ls
 
-data LayerRange = LRID LayerID
-                | LRS LayerID LayerID
-                deriving (Eq, Ord, Show, Read)
+newtype LayerListSep = LLSep Text
+                     deriving (Eq, Ord, Show, Read)
 
-instance PrintDot LayerRange where
+instance PrintDot LayerListSep where
+  unqtDot (LLSep ls) = setLayerListSep (T.unpack ls) *> unqtDot ls
+
+  toDot (LLSep ls) = setLayerListSep (T.unpack ls) *> toDot ls
+
+instance ParseDot LayerListSep where
+  parseUnqt = do ls <- parseUnqt
+                 setLayerListSep $ T.unpack ls
+                 return $ LLSep ls
+
+  parse = do ls <- parse
+             setLayerListSep $ T.unpack ls
+             return $ LLSep ls
+
+type LayerRange = [LayerRangeElem]
+
+data LayerRangeElem = LRID LayerID
+                    | LRS LayerID LayerID
+                    deriving (Eq, Ord, Show, Read)
+
+instance PrintDot LayerRangeElem where
   unqtDot (LRID lid)    = unqtDot lid
   unqtDot (LRS id1 id2) = do ls <- getLayerSep
                              let s = unqtDot $ head ls
@@ -2121,33 +2309,49 @@
   toDot (LRID lid) = toDot lid
   toDot lrs        = dquotes $ unqtDot lrs
 
-instance ParseDot LayerRange where
+  unqtListToDot lr = do lls <- getLayerListSep
+                        let s = unqtDot $ head lls
+                        hcat . punctuate s $ mapM unqtDot lr
+
+  listToDot [lre] = toDot lre
+  listToDot lrs   = dquotes $ unqtListToDot lrs
+
+instance ParseDot LayerRangeElem where
   parseUnqt = ignoreSep LRS parseUnqt parseLayerSep parseUnqt
               `onFail`
               fmap LRID parseUnqt
 
-
   parse = quotedParse (ignoreSep LRS parseUnqt parseLayerSep parseUnqt)
           `onFail`
           fmap LRID parse
 
+  parseUnqtList = sepBy parseUnqt parseLayerListSep
+
+  parseList = quotedParse parseUnqtList
+              `onFail`
+              fmap ((:[]) . LRID) parse
+
 parseLayerSep :: Parse ()
 parseLayerSep = do ls <- getLayerSep
                    many1Satisfy (`elem` ls) *> return ()
 
 parseLayerName :: Parse Text
-parseLayerName = parseEscaped False [] =<< getLayerSep
+parseLayerName = parseEscaped False [] =<< liftA2 (++) getLayerSep getLayerListSep
 
 parseLayerName' :: Parse Text
 parseLayerName' = stringBlock
                   `onFail`
                   quotedParse parseLayerName
 
+parseLayerListSep :: Parse ()
+parseLayerListSep = do lls <- getLayerListSep
+                       many1Satisfy (`elem` lls) *> return ()
+
 -- | You should not have any layer separator characters for the
 --   'LRName' option, as they won't be parseable.
 data LayerID = AllLayers
              | LRInt Int
-             | LRName Text -- ^ Should not be a number of @"all"@.
+             | LRName Text -- ^ Should not be a number or @"all"@.
              deriving (Eq, Ord, Show, Read)
 
 instance PrintDot LayerID where
@@ -2182,9 +2386,13 @@
                then AllLayers
                else LRName str
 
--- | A list of layer names.  The names should all be 'LRName' values,
---   and when printed will use an arbitrary character from
---   'defLayerSep'.
+-- Remember: this /must/ be a newtype as we can't use arbitrary
+-- LayerID values!
+
+-- | A list of layer names.  The names should all be unique 'LRName'
+--   values, and when printed will use an arbitrary character from
+--   'defLayerSep'.  The values in the list are implicitly numbered
+--   @1, 2, ...@.
 newtype LayerList = LL [LayerID]
                   deriving (Eq, Ord, Show, Read)
 
@@ -2270,13 +2478,13 @@
     where
       addNum = maybe id (flip (<>) . unqtDot) mi
       isUnder = if c || u
-                then flip (<>) $ char '_'
+                then (<> char '_')
                 else id
       isC = if c
-            then flip (<>) $ char 'c'
+            then (<> char 'c')
             else id
       isU = if u
-            then flip (<>) $ char 'u'
+            then (<> char 'u')
             else id
 
 instance ParseDot PackMode where
@@ -2293,7 +2501,7 @@
     where
       hasCharacter ms c = maybe False (elem c) ms
       -- Also checks and removes quote characters
-      isCU = flip elem ['c', 'u']
+      isCU = (`elem` ['c', 'u'])
 
 -- -----------------------------------------------------------------------------
 
@@ -2323,18 +2531,27 @@
 -- -----------------------------------------------------------------------------
 
 -- | Controls how (and if) edges are represented.
-data EdgeType = SplineEdges
+--
+--   For @dot@, the default is 'SplineEdges'; for all other layouts
+--   the default is 'LineEdges'.
+data EdgeType = SplineEdges -- ^ Except for dot, requires
+                            --   non-overlapping nodes (see
+                            --   'Overlap').
               | LineEdges
               | NoEdges
               | PolyLine
+              | Ortho -- ^ Does not handle ports or edge labels in dot.
+              | Curved -- ^ Requires Graphviz >= 2.30.0.
               | CompoundEdge -- ^ fdp only
               deriving (Eq, Ord, Bounded, Enum, Show, Read)
 
 instance PrintDot EdgeType where
-  unqtDot SplineEdges  = toDot True
-  unqtDot LineEdges    = toDot False
+  unqtDot SplineEdges  = text "spline"
+  unqtDot LineEdges    = text "line"
   unqtDot NoEdges      = empty
   unqtDot PolyLine     = text "polyline"
+  unqtDot Ortho        = text "ortho"
+  unqtDot Curved       = text "curved"
   unqtDot CompoundEdge = text "compound"
 
   toDot NoEdges = dquotes empty
@@ -2345,7 +2562,10 @@
   parseUnqt = oneOf [ bool LineEdges SplineEdges <$> parse
                     , stringRep SplineEdges "spline"
                     , stringRep LineEdges "line"
+                    , stringRep NoEdges "none"
                     , stringRep PolyLine "polyline"
+                    , stringRep Ortho "ortho"
+                    , stringRep Curved "curved"
                     , stringRep CompoundEdge "compound"
                     ]
 
@@ -2510,15 +2730,19 @@
 
 -- -----------------------------------------------------------------------------
 
+-- | Geometries of shapes are affected by the attributes 'Regular',
+--   'Peripheries' and 'Orientation'.
 data Shape
     = BoxShape -- ^ Has synonyms of /rect/ and /rectangle/.
-    | Polygon
+    | Polygon  -- ^ Also affected by 'Sides', 'Skew' and 'Distortion'.
     | Ellipse  -- ^ Has synonym of /oval/.
     | Circle
-    | PointShape
+    | PointShape -- ^ Only affected by 'Peripheries', 'Width' and
+                 --   'Height'.
     | Egg
     | Triangle
-    | PlainText -- ^ Has synonym of /none/.
+    | PlainText -- ^ Has synonym of /none/.  Recommended for
+                --   'HtmlLabel's.
     | DiamondShape
     | Trapezium
     | Parallelogram
@@ -2771,7 +2995,7 @@
 
   parse = quotedParse (liftA2 SItem parseUnqt parseArgs)
           `onFail`
-          fmap (flip SItem []) parse
+          fmap (`SItem` []) parse
 
   parseUnqtList = sepBy1 parseUnqt parseComma
 
@@ -2792,13 +3016,17 @@
                | Bold      -- ^ Nodes and Edges
                | Invisible -- ^ Nodes and Edges
                | Filled    -- ^ Nodes and Clusters
+               | Striped   -- ^ Rectangularly-shaped Nodes and
+                           --   Clusters; requires Graphviz >= 2.30.0
+               | Wedged    -- ^ Elliptically-shaped Nodes only;
+                           --   requires Graphviz >= 2.30.0
                | Diagonals -- ^ Nodes only
                | Rounded   -- ^ Nodes and Clusters
                | Tapered   -- ^ Edges only; requires Graphviz >=
-                           --   2.29.0.
+                           --   2.29.0
                | Radial    -- ^ Nodes, Clusters and Graphs, for use
                            --   with 'GradientAngle'; requires
-                           --   Graphviz >= 2.29.0.
+                           --   Graphviz >= 2.29.0
                | DD Text   -- ^ Device Dependent
                deriving (Eq, Ord, Show, Read)
 
@@ -2809,6 +3037,8 @@
   unqtDot Bold      = text "bold"
   unqtDot Invisible = text "invis"
   unqtDot Filled    = text "filled"
+  unqtDot Striped   = text "striped"
+  unqtDot Wedged    = text "wedged"
   unqtDot Diagonals = text "diagonals"
   unqtDot Rounded   = text "rounded"
   unqtDot Tapered   = text "tapered"
@@ -2833,6 +3063,8 @@
                 "bold"      -> Bold
                 "invis"     -> Invisible
                 "filled"    -> Filled
+                "striped"   -> Striped
+                "wedged"    -> Wedged
                 "diagonals" -> Diagonals
                 "rounded"   -> Rounded
                 "tapered"   -> Tapered
@@ -2862,7 +3094,7 @@
                $ focus vp
     where
       vs = hcat . punctuate comma
-           $ mapM (unqtDot . flip ($) vp) [wVal, hVal, zVal]
+           $ mapM (unqtDot . ($vp)) [wVal, hVal, zVal]
 
   toDot = dquotes . unqtDot
 
@@ -2917,6 +3149,7 @@
 
 -- -----------------------------------------------------------------------------
 
+-- | A list of search paths.
 newtype Paths = Paths { paths :: [FilePath] }
     deriving (Eq, Ord, Show, Read)
 
diff --git a/Data/GraphViz/Attributes/HTML.hs b/Data/GraphViz/Attributes/HTML.hs
--- a/Data/GraphViz/Attributes/HTML.hs
+++ b/Data/GraphViz/Attributes/HTML.hs
@@ -269,7 +269,7 @@
               `adjustErr`
               ("Can't parse Html.Cell\n\t"++)
     where
-      parseCell = flip parseTag "TD"
+      parseCell = (`parseTag` "TD")
 
   parse = parseUnqt
 
@@ -577,7 +577,7 @@
 htmlUnescapes :: [(T.Text, Char)]
 htmlUnescapes = maybeEscaped
                 ++
-                map (uncurry (flip (,))) htmlEscapes
+                map (uncurry $ flip (,)) htmlEscapes
   where
     maybeEscaped = [("nbsp", ' '), ("apos", '\'')]
 
@@ -628,7 +628,7 @@
                  <* whitespace
 
 parseFontTag :: (Attributes -> val -> tag) -> Parse val -> Parse tag
-parseFontTag = flip parseTag "FONT"
+parseFontTag = (`parseTag` "FONT")
 
 -- Should this just be specialised for tagName ~ Format ?
 
diff --git a/Data/GraphViz/Attributes/Internal.hs b/Data/GraphViz/Attributes/Internal.hs
--- a/Data/GraphViz/Attributes/Internal.hs
+++ b/Data/GraphViz/Attributes/Internal.hs
@@ -88,7 +88,7 @@
 
 checkPortName    :: PortName -> PortPos
 checkPortName pn = maybe (LabelledPort pn Nothing) CompassPoint
-                   . flip Map.lookup compassLookup
+                   . (`Map.lookup` compassLookup)
                    $ portName pn
 
 -- | When attached to a node in a DotEdge definition, the 'PortName'
diff --git a/Data/GraphViz/Attributes/Same.hs b/Data/GraphViz/Attributes/Same.hs
--- a/Data/GraphViz/Attributes/Same.hs
+++ b/Data/GraphViz/Attributes/Same.hs
@@ -16,6 +16,7 @@
        , SAttrs
        , toSAttr
        , unSame
+       , unSameSet
        ) where
 
 import Data.GraphViz.Attributes.Complete(Attribute, Attributes, sameAttribute)
@@ -47,3 +48,6 @@
 
 unSame :: SAttrs -> Attributes
 unSame = map getAttr . Set.toList
+
+unSameSet :: SAttrs -> Set Attribute
+unSameSet = Set.mapMonotonic getAttr
diff --git a/Data/GraphViz/Commands.hs b/Data/GraphViz/Commands.hs
--- a/Data/GraphViz/Commands.hs
+++ b/Data/GraphViz/Commands.hs
@@ -47,7 +47,7 @@
 
 import Data.GraphViz.Types
 -- This is here just for Haddock linking purposes.
-import Data.GraphViz.Attributes.Complete(Attribute(Z))
+import Data.GraphViz.Attributes.Complete(GraphvizCommand(..))
 import Data.GraphViz.Commands.IO(runCommand)
 import Data.GraphViz.Exception
 
@@ -61,30 +61,13 @@
 
 -- -----------------------------------------------------------------------------
 
--- | The available Graphviz commands.  The following directions are
---   based upon those in the Graphviz man page (available online at
---   <http://graphviz.org/pdf/dot.1.pdf>, or if installed on your
---   system @man graphviz@).  Note that any command can be used on
---   both directed and undirected graphs.
-data GraphvizCommand = Dot       -- ^ For hierachical graphs (ideal for
-                                 --   directed graphs).
-                     | Neato     -- ^ For symmetric layouts of graphs
-                                 --   (ideal for undirected graphs).
-                     | TwoPi     -- ^ For radial layout of graphs.
-                     | Circo     -- ^ For circular layout of graphs.
-                     | Fdp       -- ^ For symmetric layout of graphs.
-                     | Osage     -- ^ Filter for drawing clustered graphs,
-                                 --   requires Graphviz >= 2.28.0.
-                     | Patchwork -- ^ Draw clustered graphs as treemaps,
-                                 --   requires Graphviz >= 2.28.0.
-                     deriving (Eq, Ord, Show, Read)
-
 showCmd           :: GraphvizCommand -> String
 showCmd Dot       = "dot"
 showCmd Neato     = "neato"
 showCmd TwoPi     = "twopi"
 showCmd Circo     = "circo"
 showCmd Fdp       = "fdp"
+showCmd Sfdp      = "sfdp"
 showCmd Osage     = "osage"
 showCmd Patchwork = "patchwork"
 
@@ -166,7 +149,9 @@
                                 --   usually preferred.
                     | Vrml      -- ^ Virtual Reality Modeling Language
                                 --   format; requires nodes to have a
-                                --   'Z' attribute.
+                                --   third dimension set via the @Pos@
+                                --   attribute (and with a @Dim@ value
+                                --   of at least @3@).
                     | WBmp      -- ^ Wireless BitMap format;
                                 --   monochrome format usually used
                                 --   for mobile computing devices.
diff --git a/Data/GraphViz/Commands/IO.hs b/Data/GraphViz/Commands/IO.hs
--- a/Data/GraphViz/Commands/IO.hs
+++ b/Data/GraphViz/Commands/IO.hs
@@ -30,7 +30,7 @@
 import Data.GraphViz.Types(PrintDotRepr, ParseDotRepr, printDotGraph, parseDotGraph)
 import Data.GraphViz.Printing(toDot)
 import Data.GraphViz.Exception
-import Text.PrettyPrint.Leijen.Text(displayT, renderCompact)
+import Text.PrettyPrint.Leijen.Text(displayT, renderOneLine)
 
 import qualified Data.Text.Lazy.Encoding as T
 import Data.Text.Encoding.Error(UnicodeException)
@@ -42,19 +42,22 @@
 import Control.Monad.Trans.State
 import System.IO(Handle, IOMode(ReadMode,WriteMode)
                 , withFile, stdout, stdin, hPutChar
-                , hClose, hGetContents, hSetBinaryMode)
+                , hClose, hGetContents)
+import System.IO.Temp(withSystemTempFile)
 import System.Exit(ExitCode(ExitSuccess))
 import System.Process(runInteractiveProcess, waitForProcess)
-import Control.Exception(IOException, evaluate)
+import System.FilePath((<.>))
+import Control.Exception(IOException, evaluate, finally)
 import Control.Concurrent(MVar, forkIO, newEmptyMVar, putMVar, takeMVar)
 
+
 -- -----------------------------------------------------------------------------
 
 -- | Correctly render Graphviz output in a more machine-oriented form
 --   (i.e. more compact than the output of 'renderDot').
 renderCompactDot :: (PrintDotRepr dg n) => dg n -> Text
-renderCompactDot = displayT . renderCompact
-                   . flip evalState initialState
+renderCompactDot = displayT . renderOneLine
+                   . (`evalState` initialState)
                    . toDot
 
 -- -----------------------------------------------------------------------------
@@ -133,6 +136,10 @@
 --
 --   If the command was unsuccessful, then a 'GraphvizException' is
 --   thrown.
+--
+--   For performance reasons, a temporary file is used to store the
+--   generated Dot code.  As such, this is only suitable for local
+--   commands.
 runCommand :: (PrintDotRepr dg n)
               => String           -- ^ Command to run
               -> [String]         -- ^ Command-line arguments
@@ -140,17 +147,16 @@
               -> dg n
               -> IO a
 runCommand cmd args hf dg
-  = mapException notRunnable
-    $ bracket
-        (runInteractiveProcess cmd args Nothing Nothing)
+  = mapException notRunnable $
+    withSystemTempFile ("graphviz" <.> "dot") $ \dotFile dotHandle -> do
+      finally (hPutCompactDot dotHandle dg) (hClose dotHandle)
+      bracket
+        (runInteractiveProcess cmd (args ++ [dotFile]) Nothing Nothing)
         (\(inh,outh,errh,_) -> hClose inh >> hClose outh >> hClose errh)
         $ \(inp,outp,errp,prc) -> do
 
-          hSetBinaryMode inp True
-          hSetBinaryMode errp False
-
-          -- Make sure we close the input or it will hang!!!!!!!
-          forkIO $ hPutCompactDot inp dg >> hClose inp
+          -- Not using it, so close it off directly.
+          hClose inp
 
           -- Need to make sure both the output and error handles are
           -- really fully consumed.
diff --git a/Data/GraphViz/Parsing.hs b/Data/GraphViz/Parsing.hs
--- a/Data/GraphViz/Parsing.hs
+++ b/Data/GraphViz/Parsing.hs
@@ -63,15 +63,6 @@
     , tryParseList
     , tryParseList'
     , consumeLine
-    , parseField
-    , parseFields
-    , parseFieldBool
-    , parseFieldsBool
-    , parseFieldDef
-    , parseFieldsDef
-    , parseFieldNumDef
-    , liftEqParse
-    , liftEqParse'
     , commaSep
     , commaSepUnqt
     , commaSep'
@@ -424,57 +415,6 @@
 
 parseEq :: Parse ()
 parseEq = wrapWhitespace (character '=') *> return ()
-
-parseField       :: (ParseDot a) => (a -> b) -> String -> [(String, Parse b)]
-parseField c fld = [(fld, liftEqParse' fld c)]
-
-parseFields   :: (ParseDot a) => (a -> b) -> [String] -> [(String, Parse b)]
-parseFields c = concatMap (parseField c)
-
-parseFieldBool :: (Bool -> b) -> String -> [(String, Parse b)]
-parseFieldBool = flip parseFieldDef True
-
-parseFieldsBool   :: (Bool -> b) -> [String] -> [(String, Parse b)]
-parseFieldsBool c = concatMap (parseFieldBool c)
-
--- | For 'Bool'-like data structures where the presence of the field
---   name without a value implies a default value.
-parseFieldDef         :: (ParseDot a) => (a -> b) -> a -> String -> [(String, Parse b)]
-parseFieldDef c d fld = [(fld, p)]
-  where
-    p = liftEqParse' fld c
-        `onFail`
-        do nxt <- optional $ satisfy restIDString
-           bool (fail "Not actually the field you were after")
-                (return $ c d)
-                (isNothing nxt)
-
-parseFieldsDef     :: (ParseDot a) => (a -> b) -> a -> [String] -> [(String, Parse b)]
-parseFieldsDef c d = concatMap (parseFieldDef c d)
-
--- | For numeric attributes, @dot -Tdot@ seems to use @\"\"@ to
---   indicate the default value.
-parseFieldNumDef :: (ParseDot a) => (a -> b) -> a -> String -> [(String, Parse b)]
-parseFieldNumDef c d fld = [(fld, liftEqParse p fld c)]
-  where
-    p = stringRep d "\"\""
-        `onFail`
-        parse
-
--- | 'liftEqParse'' using 'parse' as the parser.
-liftEqParse' :: (ParseDot a) => String -> (a -> b) -> Parse b
-liftEqParse' = liftEqParse parse
-
--- | Attempt to parse the @\"=value\"@ part of a @key=value@ pair.  If
---   there is an equal sign but the @value@ part doesn't parse, throw
---   an un-recoverable error.
-liftEqParse :: Parse a -> String -> (a -> b) -> Parse b
-liftEqParse p k c = parseEq
-                    *> ( fmap c p
-                         `adjustErrBad`
-                         (("Unable to parse key=value with key of " ++ k
-                           ++ "\n\t") ++)
-                       )
 
 -- | The opposite of 'bracket'.
 ignoreSep :: (a -> b -> c) -> Parse a -> Parse sep -> Parse b -> Parse c
diff --git a/Data/GraphViz/Printing.hs b/Data/GraphViz/Printing.hs
--- a/Data/GraphViz/Printing.hs
+++ b/Data/GraphViz/Printing.hs
@@ -102,7 +102,7 @@
 -- | Correctly render Graphviz output.
 renderDot :: DotCode -> Text
 renderDot = PP.displayT . PP.renderPretty 0.4 80
-            . flip evalState initialState
+            . (`evalState` initialState)
 
 -- | A class used to correctly print parts of the Graphviz Dot language.
 --   Minimal implementation is 'unqtDot'.
diff --git a/Data/GraphViz/State.hs b/Data/GraphViz/State.hs
--- a/Data/GraphViz/State.hs
+++ b/Data/GraphViz/State.hs
@@ -21,6 +21,8 @@
        , getDirectedness
        , setLayerSep
        , getLayerSep
+       , setLayerListSep
+       , getLayerListSep
        , setColorScheme
        , getColorScheme
        ) where
@@ -57,6 +59,7 @@
 -- | Several aspects of Dot code are either global or mutable state.
 data GraphvizState = GS { directedEdges :: !Bool
                         , layerSep      :: [Char]
+                        , layerListSep  :: [Char]
                         , attributeType :: !AttributeType
                         , graphColor    :: !ColorScheme
                         , clusterColor  :: !ColorScheme
@@ -68,6 +71,7 @@
 initialState :: GraphvizState
 initialState = GS { directedEdges = True
                   , layerSep      = defLayerSep
+                  , layerListSep  = defLayerListSep
                   , attributeType = GraphAttribute
                   , graphColor    = X11
                   , clusterColor  = X11
@@ -93,6 +97,12 @@
 getLayerSep :: (GraphvizStateM m) => m [Char]
 getLayerSep = getsGS layerSep
 
+setLayerListSep     :: (GraphvizStateM m) => [Char] -> m ()
+setLayerListSep sep = modifyGS (\ gs -> gs { layerListSep = sep } )
+
+getLayerListSep :: (GraphvizStateM m) => m [Char]
+getLayerListSep = getsGS layerListSep
+
 setColorScheme    :: (GraphvizStateM m) => ColorScheme -> m ()
 setColorScheme cs = do tp <- getsGS attributeType
                        modifyGS $ \gs -> case tp of
@@ -116,3 +126,7 @@
 -- | The default separators for 'LayerSep'.
 defLayerSep :: [Char]
 defLayerSep = [' ', ':', '\t']
+
+-- | The default separators for 'LayerListSep'.
+defLayerListSep :: [Char]
+defLayerListSep = [',']
diff --git a/Data/GraphViz/Types.hs b/Data/GraphViz/Types.hs
--- a/Data/GraphViz/Types.hs
+++ b/Data/GraphViz/Types.hs
@@ -103,6 +103,9 @@
        , ClusterLookup
        , NodeLookup
        , Path
+       , graphStructureInformationClean
+       , nodeInformationClean
+       , edgeInformationClean
          -- * Obtaining the @DotNode@s and @DotEdges@.
        , graphNodes
        , graphEdges
@@ -115,9 +118,11 @@
 
 import Data.GraphViz.Types.Canonical( DotGraph(..), DotStatements(..)
                                     , DotSubGraph(..))
-import Data.GraphViz.Types.Common( GraphID(..), GlobalAttributes(..)
+import Data.GraphViz.Types.Common( GraphID(..), GlobalAttributes(..), withGlob
                                  , DotNode(..), DotEdge(..), numericValue)
 import Data.GraphViz.Types.State
+import Data.GraphViz.Attributes.Complete( rmUnwantedAttributes, usedByGraphs
+                                        , usedByClusters, usedByNodes, usedByEdges)
 import Data.GraphViz.Util(bool)
 import Data.GraphViz.Parsing(ParseDot(..), runParser, checkValidParse, parse, adjustErr)
 import Data.GraphViz.PreProcessing(preProcess)
@@ -125,7 +130,7 @@
 
 import qualified Data.Text.Lazy as T
 import Data.Text.Lazy(Text)
-import Control.Arrow(first)
+import Control.Arrow(first, second, (***))
 import Control.Monad.Trans.State(get, put, modify, execState, evalState)
 
 -- -----------------------------------------------------------------------------
@@ -187,6 +192,36 @@
   --   from 'graphStructureInformation').
   unAnonymise :: dg n -> dg n
 
+-- | A variant of 'graphStructureInformation' with default attributes
+--   removed and only attributes usable by graph/cluster kept (where
+--   applicable).
+graphStructureInformationClean :: (DotRepr dg n) => dg n
+                                  -> (GlobalAttributes, ClusterLookup)
+graphStructureInformationClean = (globOnly *** fmap (second clustOnly))
+                                 . graphStructureInformation
+  where
+    globOnly = withGlob $ filter usedByGraphs . rmUnwantedAttributes
+
+    clustOnly = withGlob $ filter usedByClusters . rmUnwantedAttributes
+
+
+-- | A variant of 'nodeInformation' with default attributes removed
+--   and only attributes used by nodes kept.
+nodeInformationClean :: (DotRepr dg n) => Bool -> dg n -> NodeLookup n
+nodeInformationClean = (fmap (second nodeOnly) .) . nodeInformation
+  where
+    nodeOnly = filter usedByNodes . rmUnwantedAttributes
+
+-- | A variant of 'edgeInformation' with default attributes removed
+--   and only attributes used by edges kept.
+edgeInformationClean :: (DotRepr dg n) => Bool -> dg n -> [DotEdge n]
+edgeInformationClean = (map rmEdgeAs .) . edgeInformation
+  where
+    rmEdgeAs de = de { edgeAttributes = edgeOnly $ edgeAttributes de }
+
+    edgeOnly = filter usedByEdges . rmUnwantedAttributes
+
+
 -- | This class exists just to make type signatures nicer; all
 --   instances of 'DotRepr' should also be an instance of
 --   'PrintDotRepr'.
@@ -316,7 +351,7 @@
 
 maxSGInt    :: DotGraph n -> Int
 maxSGInt dg = execState (stInt $ graphStatements dg)
-              . flip check 0
+              . (`check` 0)
               $ graphID dg
   where
     check = maybe id max . (numericValue =<<)
diff --git a/Data/GraphViz/Types/Common.hs b/Data/GraphViz/Types/Common.hs
--- a/Data/GraphViz/Types/Common.hs
+++ b/Data/GraphViz/Types/Common.hs
@@ -100,6 +100,12 @@
                                  NodeAttrs  as -> (gs, as ++ ns, es)
                                  EdgeAttrs  as -> (gs, ns, as ++ es)
 
+unPartitionGlobal :: (Attributes, Attributes, Attributes) -> [GlobalAttributes]
+unPartitionGlobal (gas,nas,eas) = [ GraphAttrs gas
+                                  , NodeAttrs  nas
+                                  , EdgeAttrs  eas
+                                  ]
+
 printGlobAttrType              :: GlobalAttributes -> DotCode
 printGlobAttrType GraphAttrs{} = text "graph"
 printGlobAttrType NodeAttrs{}  = text "node"
@@ -153,6 +159,11 @@
   | otherwise           = EdgeAttrs attr' -- Must be for edges.
   where
     attr' = [attr]
+
+withGlob :: (Attributes -> Attributes) -> GlobalAttributes -> GlobalAttributes
+withGlob f (GraphAttrs as) = GraphAttrs $ f as
+withGlob f (NodeAttrs  as) = NodeAttrs  $ f as
+withGlob f (EdgeAttrs  as) = EdgeAttrs  $ f as
 
 -- -----------------------------------------------------------------------------
 
diff --git a/Data/GraphViz/Types/Generalised.hs b/Data/GraphViz/Types/Generalised.hs
--- a/Data/GraphViz/Types/Generalised.hs
+++ b/Data/GraphViz/Types/Generalised.hs
@@ -130,7 +130,10 @@
               <*> parseBracesBased GraphAttribute parseGStmts
 
   parse = parseUnqt -- Don't want the option of quoting
+          `adjustErr`
+          ("Not a valid generalised DotGraph\n\t"++)
 
+
 -- | Assumed to be an injective mapping function.
 instance Functor DotGraph where
   fmap f g = g { graphStatements = (fmap . fmap) f $ graphStatements g }
@@ -153,7 +156,9 @@
 printGStmts = toDot . F.toList
 
 parseGStmts :: (ParseDot n) => Parse (DotStatements n)
-parseGStmts = Seq.fromList <$> parse
+parseGStmts = (Seq.fromList <$> parse)
+              `adjustErr`
+              ("Not a valid generalised DotStatements\n\t"++)
 
 statementStructure :: DotStatements n -> GraphState ()
 statementStructure = F.mapM_ stmtStructure
@@ -311,7 +316,7 @@
 
 maxSGInt    :: DotGraph n -> Int
 maxSGInt dg = execState (stsInt $ graphStatements dg)
-              . flip check 0
+              . (`check` 0)
               $ graphID dg
   where
     check = maybe id max . (numericValue =<<)
diff --git a/Data/GraphViz/Types/Graph.hs b/Data/GraphViz/Types/Graph.hs
--- a/Data/GraphViz/Types/Graph.hs
+++ b/Data/GraphViz/Types/Graph.hs
@@ -182,7 +182,7 @@
                deriving (Eq, Ord, Show, Read)
 
 adjacent :: Context n -> [DotEdge n]
-adjacent c = mapU (flip DotEdge n) (predecessors c)
+adjacent c = mapU (`DotEdge` n) (predecessors c)
              ++ mapU (DotEdge n) (successors c)
   where
     n = node c
@@ -312,7 +312,7 @@
 
 -- Used to make sure that the parent cluster exists
 addEmptyCluster :: Maybe GraphID -> DotGraph n -> DotGraph n
-addEmptyCluster = maybe id (withClusters . flip dontReplace defCI)
+addEmptyCluster = maybe id (withClusters . (`dontReplace` defCI))
   where
     dontReplace = M.insertWith (const id)
     defCI = CI Nothing emptyGA
@@ -335,7 +335,7 @@
 
 -- | Create a graph with no clusters.
 mkGraph :: (Ord n) => [DotNode n] -> [DotEdge n] -> DotGraph n
-mkGraph ns es = flip (foldl' (flip addDotEdge)) es
+mkGraph ns es = flip (foldl' $ flip addDotEdge) es
                 $ foldl' (flip addDotNode) emptyGraph ns
 
 -- | Convert this DotGraph into canonical form.  All edges are found
@@ -506,7 +506,7 @@
 --   equivalent to 'adjacentTo'.
 predecessorsOf :: (Ord n) => DotGraph n -> n -> [DotEdge n]
 predecessorsOf dg t
-  | directedGraph dg = emToDE (flip DotEdge t)
+  | directedGraph dg = emToDE (`DotEdge` t)
                        . _predecessors $ values dg M.! t
   | otherwise        = adjacentTo dg t
 
@@ -524,7 +524,7 @@
   where
     ni = values dg M.! n
     sucs = emToDE (DotEdge n) $ _successors ni
-    preds = emToDE (flip DotEdge n) $ n `M.delete` _predecessors ni
+    preds = emToDE (`DotEdge` n) $ n `M.delete` _predecessors ni
 
 emToDE :: (Ord n) => (n -> Attributes -> DotEdge n)
           -> EdgeMap n -> [DotEdge n]
@@ -578,7 +578,7 @@
   parseUnqt = fromGDot <$> parseUnqt
     where
       -- fromGDot :: G.DotGraph n -> DotGraph n
-      fromGDot = fromDotRepr . flip asTypeOf (undefined :: G.DotGraph n)
+      fromGDot = fromDotRepr . (`asTypeOf` (undefined :: G.DotGraph n))
 
   parse = parseUnqt -- Don't want the option of quoting
 
@@ -699,7 +699,7 @@
         as = _attributes ni
         mp = _inCluster ni
         pth = fromMaybe Seq.empty $ mp `M.lookup` pM
-        pAs = fromMaybe gGlob $ flip M.lookup aM =<< mp
+        pAs = fromMaybe gGlob $ (`M.lookup` aM) =<< mp
         as' | withGlob  = unSame $ toSAttr as `S.union` pAs
             | otherwise = as
 
@@ -732,7 +732,7 @@
       where
         as = af $ clusterAttrs ci
         p = parentCluster ci
-        pAs = fromMaybe gGlob $ flip M.lookup aM =<< p
+        pAs = fromMaybe gGlob $ (`M.lookup` aM) =<< p
 
 clusterPath :: DotGraph n -> Map (Maybe GraphID) St.Path
 clusterPath = M.mapKeysMonotonic Just . M.map (fmap Just) . clusterPath'
@@ -747,7 +747,7 @@
     pathOf c ci = pPth Seq.|> c
       where
         mp = parentCluster ci
-        pPth = fromMaybe Seq.empty $ flip M.lookup pM =<< mp
+        pPth = fromMaybe Seq.empty $ (`M.lookup` pM) =<< mp
 
 -- -----------------------------------------------------------------------------
 
diff --git a/Data/GraphViz/Types/Monadic.hs b/Data/GraphViz/Types/Monadic.hs
--- a/Data/GraphViz/Types/Monadic.hs
+++ b/Data/GraphViz/Types/Monadic.hs
@@ -195,7 +195,7 @@
 
 -- | Add a node with no attributes to the graph.
 node' :: n -> Dot n
-node' = flip node []
+node' = (`node` [])
 
 -- -----------------------------------------------------------------------------
 -- Edges
@@ -217,4 +217,3 @@
 infixr 9 <->
 
 -- -----------------------------------------------------------------------------
-
diff --git a/Data/GraphViz/Types/State.hs b/Data/GraphViz/Types/State.hs
--- a/Data/GraphViz/Types/State.hs
+++ b/Data/GraphViz/Types/State.hs
@@ -121,7 +121,7 @@
 
 getGraphInfo :: GraphState a -> (GlobalAttributes, ClusterLookup)
 getGraphInfo = ((graphGlobal . globalAttrs) &&& (convert . value))
-               . flip execState initState
+               . (`execState` initState)
   where
     convert = Map.map ((uniq . DList.toList) *** toGlobal)
     toGlobal = GraphAttrs . filter usedByClusters . unSame
@@ -172,7 +172,7 @@
 toDotNodes = map (\(n,(_,as)) -> DotNode n as) . Map.assocs
 
 getNodeLookup       :: (Ord n) => Bool -> NodeState n a -> NodeLookup n
-getNodeLookup addGs = Map.map combine . value . flip execState initState
+getNodeLookup addGs = Map.map combine . value . (`execState` initState)
   where
     initState = SV Set.empty addGs Seq.empty Map.empty
     combine ni = (location ni, unSame $ atts ni `Set.union` gAtts ni)
@@ -230,7 +230,7 @@
 type EdgeState n a = GVState (DList (DotEdge n)) a
 
 getDotEdges       :: Bool -> EdgeState n a -> [DotEdge n]
-getDotEdges addGs = DList.toList . value . flip execState initState
+getDotEdges addGs = DList.toList . value . (`execState` initState)
   where
     initState = SV Set.empty addGs Seq.empty DList.empty
 
@@ -242,4 +242,4 @@
 addEdge de@DotEdge{edgeAttributes = as}
   = do gas <- getGlobals
        let de' = de { edgeAttributes = unSame $ unionWith gas as }
-       modifyValue $ flip DList.snoc de'
+       modifyValue $ (`DList.snoc` de')
diff --git a/Data/GraphViz/Util.hs b/Data/GraphViz/Util.hs
--- a/Data/GraphViz/Util.hs
+++ b/Data/GraphViz/Util.hs
@@ -128,7 +128,7 @@
 descapeQuotes (c:str)        = c : descapeQuotes str
 
 isKeyword :: Text -> Bool
-isKeyword = flip Set.member keywords . T.toLower
+isKeyword = (`Set.member` keywords) . T.toLower
 
 -- | The following are Dot keywords and are not valid as labels, etc. unquoted.
 keywords :: Set Text
diff --git a/FAQ.md b/FAQ.md
--- a/FAQ.md
+++ b/FAQ.md
@@ -118,7 +118,9 @@
 * The global `orientation` attribute is not defined; however its
   behaviour is duplicated by the `rotate` attribute.
 
-* The deprecated `overlap` algorithms have not been defined.
+* The deprecated `overlap` algorithms have not been defined, and the
+  ability to specify an integer prefix for use with the `fdp` layout
+  tool is not available.
 
 * `pointf` and `point` values have been combined into one datatype; as
   such, when constructing values such as `Rect` care should be taken
diff --git a/TODO.md b/TODO.md
--- a/TODO.md
+++ b/TODO.md
@@ -18,6 +18,11 @@
 * Add nicer syntax for record labels, and specifying ports in Monadic
   Dot graphs.
 
+* Add support for custom shapes; in particular, a nice way of
+  re-defining the `Shape` datatype (as just adding a non-nullary
+  constructor would make it unwieldy to make sure tests, etc. were
+  kept up-to-date).
+
 * Define new classes to distinguish between printing/parsing Attribute
   values and other values (as only the former requires quoted
   variants).
diff --git a/graphviz.cabal b/graphviz.cabal
--- a/graphviz.cabal
+++ b/graphviz.cabal
@@ -1,5 +1,5 @@
 Name:               graphviz
-Version:            2999.15.0.1
+Version:            2999.16.0.0
 Stability:          Beta
 Synopsis:           Bindings to Graphviz for graph visualisation.
 Description: {
@@ -58,6 +58,7 @@
                            containers,
                            process,
                            directory,
+                           temporary >=1.1 && <1.2,
                            fgl == 5.4.*,
                            filepath,
                            polyparse >= 1.7 && < 1.9,
@@ -65,7 +66,7 @@
                            colour == 2.3.*,
                            transformers >= 0.2 && < 0.4,
                            text,
-                           wl-pprint-text >= 1.0.0.0 && < 1.2.0.0,
+                           wl-pprint-text >= 1.1.0.0 && < 1.2.0.0,
                            dlist == 0.5.*
 
         Exposed-Modules:   Data.GraphViz
@@ -117,6 +118,7 @@
                            containers,
                            process,
                            directory,
+                           temporary,
                            fgl,
                            filepath,
                            polyparse,
diff --git a/tests/Data/GraphViz/Testing.hs b/tests/Data/GraphViz/Testing.hs
--- a/tests/Data/GraphViz/Testing.hs
+++ b/tests/Data/GraphViz/Testing.hs
@@ -53,7 +53,10 @@
        , test_dotizeAugment
        , test_dotizeAugmentUniq
        , test_canonicalise
+       , test_canonicaliseNodes
+       , test_canonicaliseEdges
        , test_transitive
+       , test_transitiveNodes
         -- * Re-exporting modules for manual testing.
        , module Data.GraphViz
        , module Data.GraphViz.Testing.Properties
@@ -75,6 +78,7 @@
 import Data.GraphViz.Testing.Properties
 
 import Data.GraphViz
+import Data.GraphViz.Algorithms(CanonicaliseOptions)
 import Data.GraphViz.Parsing(parseIt, parseIt', runParser)
 import Data.GraphViz.PreProcessing(preProcess)
 import Data.GraphViz.Printing(printIt, renderDot)
@@ -170,7 +174,10 @@
                , test_findAllEdges
                , test_noGraphInfo
                , test_canonicalise
+               , test_canonicaliseNodes
+               , test_canonicaliseEdges
                , test_transitive
+               , test_transitiveNodes
                ]
 
 -- | Test that 'Attributes' can be printed and then parsed back.
@@ -352,11 +359,37 @@
          , tests      = [qCheck prop]
          }
   where
-    prop :: DotGraph Int -> Bool
+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool
     prop = prop_canonicalise
 
     dsc = "Repeated application of canonicalise shouldn't have any further affect."
 
+test_canonicaliseNodes :: Test
+test_canonicaliseNodes
+  = Test { name       = "Canonicalisation shouldn't change any nodes"
+         , lookupName = "canonicalisenodes"
+         , desc       = dsc
+         , tests      = [qCheck prop]
+         }
+  where
+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool
+    prop = prop_canonicaliseNodes
+
+    dsc = "Canonicalisation shouldn't change or remove any nodes."
+
+test_canonicaliseEdges :: Test
+test_canonicaliseEdges
+  = Test { name       = "Canonicalisation shouldn't change any edges"
+         , lookupName = "canonicaliseedges"
+         , desc       = dsc
+         , tests      = [qCheck prop]
+         }
+  where
+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool
+    prop = prop_canonicaliseEdges
+
+    dsc = "Canonicalisation shouldn't change or remove any edges."
+
 test_transitive :: Test
 test_transitive
   = Test { name       = "Transitive reduction should be idempotent"
@@ -365,10 +398,23 @@
          , tests      = [qCheck prop]
          }
   where
-    prop :: DotGraph Int -> Bool
+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool
     prop = prop_transitive
 
     dsc = "Repeated application of transitiveReduction shouldn't have any further affect."
+
+test_transitiveNodes :: Test
+test_transitiveNodes
+  = Test { name       = "Transitive reduction shouldn't change any nodes"
+         , lookupName = "transitivenodes"
+         , desc       = dsc
+         , tests      = [qCheck prop]
+         }
+  where
+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool
+    prop = prop_transitiveNodes
+
+    dsc = "Transitive reduction shouldn't change or remove any nodes."
 
 -- -----------------------------------------------------------------------------
 
diff --git a/tests/Data/GraphViz/Testing/Instances/Attributes.hs b/tests/Data/GraphViz/Testing/Instances/Attributes.hs
--- a/tests/Data/GraphViz/Testing/Instances/Attributes.hs
+++ b/tests/Data/GraphViz/Testing/Instances/Attributes.hs
@@ -25,7 +25,7 @@
 import Data.GraphViz.Attributes.Colors.X11(X11Color)
 import Data.GraphViz.Attributes.Colors.SVG(SVGColor)
 import Data.GraphViz.Attributes.Internal(compassLookup)
-import Data.GraphViz.State(initialState, layerSep)
+import Data.GraphViz.State(initialState, layerSep, layerListSep)
 import Data.GraphViz.Util(bool)
 
 import Test.QuickCheck
@@ -62,16 +62,17 @@
   arbitrary = oneof [ liftM Damping arbitrary
                     , liftM K arbitrary
                     , liftM URL arbitrary
+                    , liftM Area arbitrary
                     , liftM ArrowHead arbitrary
                     , liftM ArrowSize arbitrary
                     , liftM ArrowTail arbitrary
                     , liftM Aspect arbitrary
                     , liftM BoundingBox arbitrary
-                    , liftM ColorScheme arbitrary
                     , liftM BgColor arbList
                     , liftM Center arbitrary
                     , liftM ClusterRank arbitrary
                     , liftM Color arbList
+                    , liftM ColorScheme arbitrary
                     , liftM Comment arbitrary
                     , liftM Compound arbitrary
                     , liftM Concentrate arbitrary
@@ -100,6 +101,7 @@
                     , liftM GradientAngle arbitrary
                     , liftM Group arbitrary
                     , liftM HeadURL arbitrary
+                    , liftM Head_LP arbitrary
                     , liftM HeadClip arbitrary
                     , liftM HeadLabel arbitrary
                     , liftM HeadPort arbitrary
@@ -125,12 +127,14 @@
                     , liftM LabelTooltip arbitrary
                     , liftM Landscape arbitrary
                     , liftM Layer arbitrary
+                    , liftM LayerListSep arbitrary
                     , liftM Layers arbitrary
+                    , liftM LayerSelect arbitrary
                     , liftM LayerSep arbitrary
                     , liftM Layout arbitrary
                     , liftM Len arbitrary
-                    , liftM LevelsGap arbitrary
                     , liftM Levels arbitrary
+                    , liftM LevelsGap arbitrary
                     , liftM LHead arbitrary
                     , liftM LHeight arbitrary
                     , liftM LPos arbitrary
@@ -184,7 +188,6 @@
                     , liftM SearchSize arbitrary
                     , liftM Sep arbitrary
                     , liftM Shape arbitrary
-                    , liftM ShapeFile arbitrary
                     , liftM ShowBoxes arbitrary
                     , liftM Sides arbitrary
                     , liftM Size arbitrary
@@ -196,6 +199,7 @@
                     , liftM Style arbList
                     , liftM StyleSheet arbitrary
                     , liftM TailURL arbitrary
+                    , liftM Tail_LP arbitrary
                     , liftM TailClip arbitrary
                     , liftM TailLabel arbitrary
                     , liftM TailPort arbitrary
@@ -210,23 +214,24 @@
                     , liftM Weight arbitrary
                     , liftM Width arbitrary
                     , liftM XLabel arbitrary
-                    , liftM Z arbitrary
+                    , liftM XLP arbitrary
                     , liftM2 UnknownAttribute (suchThat arbIDString validUnknown) arbitrary
                     ]
 
   shrink (Damping v)            = map Damping             $ shrink v
   shrink (K v)                  = map K                   $ shrink v
   shrink (URL v)                = map URL                 $ shrink v
+  shrink (Area v)               = map Area                $ shrink v
   shrink (ArrowHead v)          = map ArrowHead           $ shrink v
   shrink (ArrowSize v)          = map ArrowSize           $ shrink v
   shrink (ArrowTail v)          = map ArrowTail           $ shrink v
   shrink (Aspect v)             = map Aspect              $ shrink v
   shrink (BoundingBox v)        = map BoundingBox         $ shrink v
-  shrink (ColorScheme v)        = map ColorScheme         $ shrink v
   shrink (BgColor v)            = map BgColor             $ nonEmptyShrinks v
   shrink (Center v)             = map Center              $ shrink v
   shrink (ClusterRank v)        = map ClusterRank         $ shrink v
   shrink (Color v)              = map Color               $ nonEmptyShrinks v
+  shrink (ColorScheme v)        = map ColorScheme         $ shrink v
   shrink (Comment v)            = map Comment             $ shrink v
   shrink (Compound v)           = map Compound            $ shrink v
   shrink (Concentrate v)        = map Concentrate         $ shrink v
@@ -255,6 +260,7 @@
   shrink (GradientAngle v)      = map GradientAngle       $ shrink v
   shrink (Group v)              = map Group               $ shrink v
   shrink (HeadURL v)            = map HeadURL             $ shrink v
+  shrink (Head_LP v)            = map Head_LP             $ shrink v
   shrink (HeadClip v)           = map HeadClip            $ shrink v
   shrink (HeadLabel v)          = map HeadLabel           $ shrink v
   shrink (HeadPort v)           = map HeadPort            $ shrink v
@@ -280,12 +286,14 @@
   shrink (LabelTooltip v)       = map LabelTooltip        $ shrink v
   shrink (Landscape v)          = map Landscape           $ shrink v
   shrink (Layer v)              = map Layer               $ shrink v
+  shrink (LayerListSep v)       = map LayerListSep        $ shrink v
   shrink (Layers v)             = map Layers              $ shrink v
+  shrink (LayerSelect v)        = map LayerSelect         $ shrink v
   shrink (LayerSep v)           = map LayerSep            $ shrink v
   shrink (Layout v)             = map Layout              $ shrink v
   shrink (Len v)                = map Len                 $ shrink v
-  shrink (LevelsGap v)          = map LevelsGap           $ shrink v
   shrink (Levels v)             = map Levels              $ shrink v
+  shrink (LevelsGap v)          = map LevelsGap           $ shrink v
   shrink (LHead v)              = map LHead               $ shrink v
   shrink (LHeight v)            = map LHeight             $ shrink v
   shrink (LPos v)               = map LPos                $ shrink v
@@ -339,7 +347,6 @@
   shrink (SearchSize v)         = map SearchSize          $ shrink v
   shrink (Sep v)                = map Sep                 $ shrink v
   shrink (Shape v)              = map Shape               $ shrink v
-  shrink (ShapeFile v)          = map ShapeFile           $ shrink v
   shrink (ShowBoxes v)          = map ShowBoxes           $ shrink v
   shrink (Sides v)              = map Sides               $ shrink v
   shrink (Size v)               = map Size                $ shrink v
@@ -351,6 +358,7 @@
   shrink (Style v)              = map Style               $ nonEmptyShrinks v
   shrink (StyleSheet v)         = map StyleSheet          $ shrink v
   shrink (TailURL v)            = map TailURL             $ shrink v
+  shrink (Tail_LP v)            = map Tail_LP             $ shrink v
   shrink (TailClip v)           = map TailClip            $ shrink v
   shrink (TailLabel v)          = map TailLabel           $ shrink v
   shrink (TailPort v)           = map TailPort            $ shrink v
@@ -365,10 +373,13 @@
   shrink (Weight v)             = map Weight              $ shrink v
   shrink (Width v)              = map Width               $ shrink v
   shrink (XLabel v)             = map XLabel              $ shrink v
-  shrink (Z v)                  = map Z                   $ shrink v
+  shrink (XLP v)                = map XLP                 $ shrink v
   shrink (UnknownAttribute a v) = liftM2 UnknownAttribute (liftM (filter validUnknown) shrink a) (shrink v)
 {- delete to here -}
 
+instance Arbitrary GraphvizCommand where
+  arbitrary = arbBounded
+
 instance Arbitrary ArrowType where
   arbitrary = liftM AType
               -- Arrow specifications have between 1 and 4 elements.
@@ -500,6 +511,7 @@
       simpleOverlap = elements [ KeepOverlaps
                                , ScaleOverlaps
                                , ScaleXYOverlaps
+                               , VoronoiOverlap
                                , CompressOverlap
                                , VpscOverlap
                                , IpsepOverlap
@@ -513,6 +525,11 @@
   -- one because of arbLayerName
   arbitrary = return . LSep . T.pack $ layerSep initialState
 
+instance Arbitrary LayerListSep where
+  -- Since Arbitrary isn't stateful, we can't generate an arbitrary
+  -- one because of arbLayerName
+  arbitrary = return . LLSep . T.pack $ layerListSep initialState
+
 instance Arbitrary LayerList where
   arbitrary = liftM LL $ listOf1 arbName
     where
@@ -523,7 +540,7 @@
 
   shrink (LL ll) = map LL $ nonEmptyShrinks ll
 
-instance Arbitrary LayerRange where
+instance Arbitrary LayerRangeElem where
   arbitrary = oneof [ liftM LRID arbitrary
                     , liftM2 LRS arbitrary arbitrary
                     ]
@@ -666,6 +683,8 @@
                                , Bold
                                , Invisible
                                , Filled
+                               , Striped
+                               , Wedged
                                , Diagonals
                                , Rounded
                                , Tapered
@@ -677,6 +696,8 @@
                                 , "bold"
                                 , "invis"
                                 , "filled"
+                                , "striped"
+                                , "wedged"
                                 , "diagonals"
                                 , "rounded"
                                 , "tapered"
@@ -786,6 +807,15 @@
                                 return $ RGBA rs gs bs as
   shrink (BrewerColor c) = map BrewerColor $ shrink c
   shrink _               = [] -- Shrinking 0<=h,s,v<=1 does nothing
+
+-- | No guarantees are made as to sanity of generated weightings.
+instance Arbitrary WeightedColor where
+  arbitrary = liftM2 WC arbitrary arbitrary
+
+  -- No color shrinks to itself, so no sanity checking needed.
+  shrink (WC c mw) = do c' <- shrink c
+                        mw' <- shrink mw
+                        return $ WC c' mw'
 
 instance Arbitrary X11Color where
   arbitrary = arbBounded
diff --git a/tests/Data/GraphViz/Testing/Instances/Common.hs b/tests/Data/GraphViz/Testing/Instances/Common.hs
--- a/tests/Data/GraphViz/Testing/Instances/Common.hs
+++ b/tests/Data/GraphViz/Testing/Instances/Common.hs
@@ -20,6 +20,7 @@
 import Data.GraphViz.Attributes(Attributes)
 import Data.GraphViz.Types.Common( DotNode(..), DotEdge(..)
                                  , GlobalAttributes(..), GraphID(..))
+import Data.GraphViz.Algorithms(CanonicaliseOptions(..))
 
 import Test.QuickCheck
 
@@ -41,12 +42,12 @@
 instance (Arbitrary n) => Arbitrary (DotNode n) where
   arbitrary = liftM2 DotNode arbitrary arbNodeAttrs
 
-  shrink (DotNode n as) = map (DotNode n) $ shrinkList as
+  shrink (DotNode n as) = map (DotNode n) $ shrink as
 
 instance (Arbitrary n) => Arbitrary (DotEdge n) where
   arbitrary = liftM3 DotEdge arbitrary arbitrary arbEdgeAttrs
 
-  shrink (DotEdge f t as) = map (DotEdge f t) $ shrinkList as
+  shrink (DotEdge f t as) = map (DotEdge f t) $ shrink as
 
 instance Arbitrary GlobalAttributes where
   arbitrary = gaGraph
@@ -69,3 +70,6 @@
                 , liftM NodeAttrs  arbNodeAttrs
                 , liftM EdgeAttrs  arbEdgeAttrs
                 ]
+
+instance Arbitrary CanonicaliseOptions where
+  arbitrary = liftM2 COpts arbitrary arbitrary
diff --git a/tests/Data/GraphViz/Testing/Instances/Helpers.hs b/tests/Data/GraphViz/Testing/Instances/Helpers.hs
--- a/tests/Data/GraphViz/Testing/Instances/Helpers.hs
+++ b/tests/Data/GraphViz/Testing/Instances/Helpers.hs
@@ -12,7 +12,7 @@
 module Data.GraphViz.Testing.Instances.Helpers where
 
 import Data.GraphViz.Parsing(isNumString)
-import Data.GraphViz.State(initialState, layerSep)
+import Data.GraphViz.State(initialState, layerSep, layerListSep)
 
 import Test.QuickCheck
 
@@ -74,7 +74,7 @@
 arbLayerName :: Gen Text
 arbLayerName = suchThat arbitrary (T.all notLayerSep)
   where
-    defLayerSep = layerSep initialState
+    defLayerSep = layerSep initialState ++ layerListSep initialState
     notLayerSep = (`notElem` defLayerSep)
 
 arbStyleName :: Gen Text
@@ -86,7 +86,7 @@
 arbList = listOf1 arbitrary
 
 nonEmptyShrinks :: (Arbitrary a) => [a] -> [[a]]
-nonEmptyShrinks = filter (not . null) . shrinkList
+nonEmptyShrinks = filter (not . null) . shrink
 
 nonEmptyShrinks' :: [a] -> [[a]]
 nonEmptyShrinks' = filter (not . null) . shrinkList'
diff --git a/tests/Data/GraphViz/Testing/Properties.hs b/tests/Data/GraphViz/Testing/Properties.hs
--- a/tests/Data/GraphViz/Testing/Properties.hs
+++ b/tests/Data/GraphViz/Testing/Properties.hs
@@ -16,7 +16,7 @@
 import Data.GraphViz.Types( DotRepr(..), PrintDotRepr
                           , DotNode(..), DotEdge(..), GlobalAttributes(..)
                           , printDotGraph, graphNodes, graphEdges
-                          , graphStructureInformation)
+                          , nodeInformationClean, edgeInformationClean)
 import Data.GraphViz.Types.Canonical(DotGraph(..), DotStatements(..))
 import qualified Data.GraphViz.Types.Generalised as G
 import Data.GraphViz.Printing(PrintDot(..), printIt)
@@ -149,16 +149,37 @@
     info = graphStructureInformation dg
 
 -- | Canonicalisation should be idempotent.
-prop_canonicalise   :: (ParseDot n, PrintDot n, DotRepr dg n) => dg n -> Bool
-prop_canonicalise g = cdg == canonicalise cdg
+prop_canonicalise :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool
+prop_canonicalise copts g = cdg == canonicaliseOptions copts cdg
   where
-    cdg = canonicalise g
+    cdg = canonicaliseOptions copts g
 
+-- | Canonicalisation shouldn't change any nodes.
+prop_canonicaliseNodes :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool
+prop_canonicaliseNodes copts g = nodeInformationClean True g
+                                 == nodeInformationClean True cdg
+  where
+    cdg = canonicaliseOptions copts g
+
+-- | Canonicalisation shouldn't change any edges.
+prop_canonicaliseEdges :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool
+prop_canonicaliseEdges copts g = sort (edgeInformationClean True g)
+                                 == sort (edgeInformationClean True cdg)
+  where
+    cdg = canonicaliseOptions copts g
+
 -- | Removing transitive edges should be idempotent.
-prop_transitive   :: (DotRepr dg n) => dg n -> Bool
-prop_transitive g = tdg == transitiveReduction tdg
+prop_transitive :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool
+prop_transitive copts g = tdg == transitiveReductionOptions copts tdg
   where
-    tdg = transitiveReduction g
+    tdg = transitiveReductionOptions copts g
+
+-- | Transitive reduction shouldn't change any nodes.
+prop_transitiveNodes :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool
+prop_transitiveNodes copts g = nodeInformationClean True g
+                               == nodeInformationClean True cdg
+  where
+    cdg = transitiveReductionOptions copts g
 
 -- -----------------------------------------------------------------------------
 -- Helper utility functions
diff --git a/utils/AttributeGenerator.hs b/utils/AttributeGenerator.hs
--- a/utils/AttributeGenerator.hs
+++ b/utils/AttributeGenerator.hs
@@ -67,7 +67,6 @@
                    , parseNames   :: [Code]
                    , valtype      :: VType
                    , parseDef     :: Maybe Code
-                   , emptyParse   :: Maybe Code -- ^ What the empty string gets parsed as.
                    , defValue     :: Maybe Code
                    , forGraphs    :: Bool
                    , forClusters  :: Bool
@@ -88,7 +87,6 @@
                                    , valtype      = v -- just in case need to do fancy
                                                       -- stuff
                                    , parseDef     = liftM text df
-                                   , emptyParse   = liftM text dfP
                                    , defValue     = liftM text d
                                    , forGraphs    = isFor 'G'
                                    , forClusters  = isFor 'C' || forSG
@@ -102,11 +100,6 @@
       isFor f = f `elem` u
       forSG = isFor 'S'
       df' = if v == Bl then Just "'True'" else fmap ( \ t -> '\'' : t ++ "'") df
-      isNumeric = case v of
-                    Integ -> True
-                    Dbl   -> True
-                    _     -> False
-      dfP = bool Nothing d isNumeric
       mDoc (f,fc) = f <> colon <+> text fc
       addF f = fmap (\ dc -> (wrap (char '/') (text f), dc))
       cm' = hsep
@@ -237,7 +230,6 @@
       pType b a
           | valtype a == Bl       = pFld <> text "Bool" <+> cnst a
           | isJust $ parseDef a   = pFld <> text "Def"  <+> cnst a <+> fromJust (parseDef a)
-          | isJust $ emptyParse a = pFld <> text "NumDef" <+> cnst a <+> fromJust (emptyParse a)
           | otherwise             = pFld <+> cnst a
           where
             pFld = text "parseField" <> if b then char 's' else empty
@@ -248,7 +240,7 @@
       unknownName = text "attrName"
       pUnknown = text "do"
                  <+> (   (unknownName <+> text "<- stringBlock")
-                      $$ (text "liftEqParse'"
+                      $$ (text "liftEqParse"
                           <+> (parens (text "\"" <> unknownAttr <+> text "(\""
                                        <+> text "++ T.unpack" <+> unknownName
                                        <+> text "++ \")\"")
@@ -328,17 +320,21 @@
                 . concatMap parseNames
                 $ atts att
 
-arbitraryFor                :: VType -> Doc
-arbitraryFor (Cust ('[':_)) = text "arbList"
-arbitraryFor _              = text "arbitrary"
+arbitraryFor :: VType -> Doc
+arbitraryFor = text . bool "arbitrary" "arbList" . isListType
 
 arbitraryFor' :: Attribute -> Doc
 arbitraryFor' = arbitraryFor . valtype
 
 shrinkFor :: VType -> Doc
-shrinkFor (Cust ('[':_)) = text "nonEmptyShrinks"
-shrinkFor _              = text "shrink"
+shrinkFor = text . bool "shrink" "nonEmptyShrinks" . isListType
 
+-- Some types are aliases for lists.
+isListType :: VType -> Bool
+isListType (Cust ('[':_))     = True
+isListType (Cust "ColorList") = True
+isListType _                  = False
+
 usedByFunc          :: String -> (Attribute -> Bool) -> Atts -> Code
 usedByFunc nm p att = cmnt $$ asRows (tpSig : trs ++ [fls])
     where
@@ -474,44 +470,46 @@
   makeAttr "Damping" ["Damping"] "G" (Dbl) Nothing (Just "0.99") (Just "@0.99@") (Just "@0.0@") (Just "neato only"),
   makeAttr "K" ["K"] "GC" (Dbl) Nothing (Just "0.3") (Just "@0.3@") (Just "@0@") (Just "sfdp, fdp only"),
   makeAttr "URL" ["URL", "href"] "ENGC" (EStrng) Nothing (Just "\"\"") (Just "none") Nothing (Just "svg, postscript, map only"),
+  makeAttr "Area" ["area"] "NC" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@>0@") (Just "patchwork only, requires Graphviz >= 2.30.0"),
   makeAttr "ArrowHead" ["arrowhead"] "E" (Cust "ArrowType") Nothing (Just "normal") (Just "@'normal'@") Nothing Nothing,
-  makeAttr "ArrowSize" ["arrowsize"] "E" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") Nothing,
+  makeAttr "ArrowSize" ["arrowsize"] "E" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") Nothing,
   makeAttr "ArrowTail" ["arrowtail"] "E" (Cust "ArrowType") Nothing (Just "normal") (Just "@'normal'@") Nothing Nothing,
   makeAttr "Aspect" ["aspect"] "G" (Cust "AspectType") Nothing Nothing Nothing Nothing (Just "dot only"),
   makeAttr "BoundingBox" ["bb"] "G" (Cust "Rect") Nothing Nothing Nothing Nothing (Just "write only"),
-  makeAttr "ColorScheme" ["colorscheme"] "ENCG" (Cust "ColorScheme") Nothing (Just "X11") (Just "@'X11'@") Nothing Nothing,
-  makeAttr "BgColor" ["bgcolor"] "GC" (Cust "[Color]") Nothing (Just "[X11Color Transparent]") (Just "@['X11Color' 'Transparent']@") Nothing Nothing,
+  makeAttr "BgColor" ["bgcolor"] "GC" (Cust "ColorList") Nothing (Just "[]") (Just "@[]@") Nothing Nothing,
   makeAttr "Center" ["center"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,
   makeAttr "ClusterRank" ["clusterrank"] "G" (Cust "ClusterMode") Nothing (Just "Local") (Just "@'Local'@") Nothing (Just "dot only"),
-  makeAttr "Color" ["color"] "ENC" (Cust "[Color]") Nothing (Just "[X11Color Black]") (Just "@['X11Color' 'Black']@") Nothing Nothing,
+  makeAttr "Color" ["color"] "ENC" (Cust "ColorList") Nothing (Just "[toWColor Black]") (Just "@['WC' ('X11Color' 'Black') Nothing]@") Nothing Nothing,
+  makeAttr "ColorScheme" ["colorscheme"] "ENCG" (Cust "ColorScheme") Nothing (Just "X11") (Just "@'X11'@") Nothing Nothing,
   makeAttr "Comment" ["comment"] "ENG" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing Nothing,
   makeAttr "Compound" ["compound"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing (Just "dot only"),
   makeAttr "Concentrate" ["concentrate"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,
   makeAttr "Constraint" ["constraint"] "E" (Bl) (Just "True") (Just "True") (Just "@'True'@") Nothing (Just "dot only"),
   makeAttr "Decorate" ["decorate"] "E" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,
-  makeAttr "DefaultDist" ["defaultdist"] "G" (Dbl) Nothing Nothing (Just "@1+(avg. len)*sqrt(abs(V))@") (Just "@epsilon@") (Just "neato only, only if @'Pack' 'DontPack'@"),
-  makeAttr "Dim" ["dim"] "G" (Integ) Nothing (Just "2") (Just "@2@") (Just "@2@") (Just "sfdp, fdp, neato only"),
-  makeAttr "Dimen" ["dimen"] "G" (Integ) Nothing (Just "2") (Just "@2@") (Just "@2@") (Just "sfdp, fdp, neato only"),
+  makeAttr "DefaultDist" ["defaultdist"] "G" (Dbl) Nothing Nothing (Just "@1+(avg. len)*sqrt(abs(V))@ (unable to statically define)") (Just "The value of 'Epsilon'.") (Just "neato only, only if @'Pack' 'DontPack'@"),
+  makeAttr "Dim" ["dim"] "G" (Integ) Nothing (Just "2") (Just "@2@") (Just "@2@") (Just "maximum of @10@; sfdp, fdp, neato only"),
+  makeAttr "Dimen" ["dimen"] "G" (Integ) Nothing (Just "2") (Just "@2@") (Just "@2@") (Just "maximum of @10@; sfdp, fdp, neato only"),
   makeAttr "Dir" ["dir"] "E" (Cust "DirType") Nothing Nothing (Just "@'Forward'@ (directed), @'NoDir'@ (undirected)") Nothing Nothing,
   makeAttr "DirEdgeConstraints" ["diredgeconstraints"] "G" (Cust "DEConstraints") (Just "EdgeConstraints") (Just "NoConstraints") (Just "@'NoConstraints'@") Nothing (Just "neato only"),
-  makeAttr "Distortion" ["distortion"] "N" (Dbl) Nothing (Just "0") (Just "@0.0@") (Just "@-100.0@") Nothing,
-  makeAttr "DPI" ["dpi", "resolution"] "G" (Dbl) Nothing Nothing (Just "@96.0@, @0.0@") Nothing (Just "svg, bitmap output only; \\\"resolution\\\" is a synonym"),
+  makeAttr "Distortion" ["distortion"] "N" (Dbl) Nothing (Just "0.0") (Just "@0.0@") (Just "@-100.0@") Nothing,
+  makeAttr "DPI" ["dpi", "resolution"] "G" (Dbl) Nothing (Just "96.0") (Just "@96.0@, @0.0@") Nothing (Just "svg, bitmap output only; \\\"resolution\\\" is a synonym"),
   makeAttr "EdgeURL" ["edgeURL", "edgehref"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, map only"),
   makeAttr "EdgeTarget" ["edgetarget"] "E" (EStrng) Nothing Nothing (Just "none") Nothing (Just "svg, map only"),
-  makeAttr "EdgeTooltip" ["edgetooltip"] "E" (EStrng) Nothing Nothing (Just "@\\\"\\\"@") Nothing (Just "svg, cmap only"),
+  makeAttr "EdgeTooltip" ["edgetooltip"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, cmap only"),
   makeAttr "Epsilon" ["epsilon"] "G" (Dbl) Nothing Nothing (Just "@.0001 * # nodes@ (@mode == 'KK'@), @.0001@ (@mode == 'Major'@)") Nothing (Just "neato only"),
   makeAttr "ESep" ["esep"] "G" (Cust "DPoint") Nothing (Just "(DVal 3)") (Just "@'DVal' 3@") Nothing (Just "not dot"),
-  makeAttr "FillColor" ["fillcolor"] "NEC" (Cust "[Color]") Nothing (Just "[X11Color Black]") (Just "@['X11Color' 'LightGray']@ (nodes), @['X11Color' 'Black']@ (clusters)") Nothing Nothing,
+  makeAttr "FillColor" ["fillcolor"] "NEC" (Cust "ColorList") Nothing (Just "[toWColor Black]") (Just "@['WC' ('X11Color' 'LightGray') Nothing]@ (nodes), @['WC' ('X11Color' 'Black') Nothing]@ (clusters)") Nothing Nothing,
   makeAttr "FixedSize" ["fixedsize"] "N" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,
   makeAttr "FontColor" ["fontcolor"] "ENGC" (Cust "Color") Nothing (Just "(X11Color Black)") (Just "@'X11Color' 'Black'@") Nothing Nothing,
   makeAttr "FontName" ["fontname"] "ENGC" (Strng) Nothing (Just "\"Times-Roman\"") (Just "@\\\"Times-Roman\\\"@") Nothing Nothing,
   makeAttr "FontNames" ["fontnames"] "G" (Cust "SVGFontNames") Nothing (Just "SvgNames") (Just "@'SvgNames'@") Nothing (Just "svg only"),
-  makeAttr "FontPath" ["fontpath"] "G" (Strng) Nothing Nothing (Just "system dependent") Nothing Nothing,
-  makeAttr "FontSize" ["fontsize"] "ENGC" (Dbl) Nothing (Just "14") (Just "@14.0@") (Just "@1.0@") Nothing,
-  makeAttr "ForceLabels" ["forcelabels"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing (Just "Only for 'XLabel' attributes, requires Graphviz >= 2.29.0"),
+  makeAttr "FontPath" ["fontpath"] "G" (Cust "Paths") Nothing Nothing (Just "system dependent") Nothing Nothing,
+  makeAttr "FontSize" ["fontsize"] "ENGC" (Dbl) Nothing (Just "14.0") (Just "@14.0@") (Just "@1.0@") Nothing,
+  makeAttr "ForceLabels" ["forcelabels"] "G" (Bl) (Just "True") (Just "True") (Just "@'True'@") Nothing (Just "only for 'XLabel' attributes, requires Graphviz >= 2.29.0"),
   makeAttr "GradientAngle" ["gradientangle"] "NCG" (Integ) Nothing (Just "0") (Just "0") Nothing (Just "requires Graphviz >= 2.29.0"),
   makeAttr "Group" ["group"] "N" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "dot only"),
   makeAttr "HeadURL" ["headURL", "headhref"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, map only"),
+  makeAttr "Head_LP" ["head_lp"] "E" (Cust "Point") Nothing Nothing Nothing Nothing (Just "write only, requires Graphviz >= 2.30.0"),
   makeAttr "HeadClip" ["headclip"] "E" (Bl) (Just "True") (Just "True") (Just "@'True'@") Nothing Nothing,
   makeAttr "HeadLabel" ["headlabel"] "E" (Cust "Label") Nothing (Just "(StrLabel \"\")") (Just "@'StrLabel' \\\"\\\"@") Nothing Nothing,
   makeAttr "HeadPort" ["headport"] "E" (Cust "PortPos") Nothing (Just "(CompassPoint CenterPoint)") (Just "@'CompassPoint' 'CenterPoint'@") Nothing Nothing,
@@ -525,24 +523,26 @@
   makeAttr "Label" ["label"] "ENGC" (Cust "Label") Nothing (Just "(StrLabel \"\")") (Just "@'StrLabel' \\\"\\\\N\\\"@ (nodes), @'StrLabel' \\\"\\\"@ (otherwise)") Nothing Nothing,
   makeAttr "LabelURL" ["labelURL", "labelhref"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, map only"),
   makeAttr "LabelScheme" ["label_scheme"] "G" (Cust "LabelScheme") Nothing (Just "NotEdgeLabel") (Just "@'NotEdgeLabel'@") Nothing (Just "sfdp only, requires Graphviz >= 2.28.0"),
-  makeAttr "LabelAngle" ["labelangle"] "E" (Dbl) Nothing (Just "(-25)") (Just "@-25.0@") (Just "@-180.0@") Nothing,
-  makeAttr "LabelDistance" ["labeldistance"] "E" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") Nothing,
+  makeAttr "LabelAngle" ["labelangle"] "E" (Dbl) Nothing (Just "(-25.0)") (Just "@-25.0@") (Just "@-180.0@") Nothing,
+  makeAttr "LabelDistance" ["labeldistance"] "E" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") Nothing,
   makeAttr "LabelFloat" ["labelfloat"] "E" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,
   makeAttr "LabelFontColor" ["labelfontcolor"] "E" (Cust "Color") Nothing (Just "(X11Color Black)") (Just "@'X11Color' 'Black'@") Nothing Nothing,
   makeAttr "LabelFontName" ["labelfontname"] "E" (Strng) Nothing (Just "\"Times-Roman\"") (Just "@\\\"Times-Roman\\\"@") Nothing Nothing,
-  makeAttr "LabelFontSize" ["labelfontsize"] "E" (Dbl) Nothing (Just "14") (Just "@14.0@") (Just "@1.0@") Nothing,
+  makeAttr "LabelFontSize" ["labelfontsize"] "E" (Dbl) Nothing (Just "14.0") (Just "@14.0@") (Just "@1.0@") Nothing,
   makeAttr "LabelJust" ["labeljust"] "GC" (Cust "Justification") Nothing (Just "JCenter") (Just "@'JCenter'@") Nothing Nothing,
   makeAttr "LabelLoc" ["labelloc"] "GCN" (Cust "VerticalPlacement") Nothing (Just "VTop") (Just "@'VTop'@ (clusters), @'VBottom'@ (root graphs), @'VCenter'@ (nodes)") Nothing Nothing,
   makeAttr "LabelTarget" ["labeltarget"] "E" (EStrng) Nothing (Just "\"\"") (Just "none") Nothing (Just "svg, map only"),
   makeAttr "LabelTooltip" ["labeltooltip"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, cmap only"),
   makeAttr "Landscape" ["landscape"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,
-  makeAttr "Layer" ["layer"] "EN" (Cust "LayerRange") Nothing Nothing Nothing Nothing Nothing,
+  makeAttr "Layer" ["layer"] "EN" (Cust "LayerRange") Nothing (Just "[]") (Just "@[]@") Nothing Nothing,
+  makeAttr "LayerListSep" ["layerlistsep"] "G" (Cust "LayerListSep") Nothing (Just "(LLSep \",\")") (Just "@'LLSep' \\\",\\\"@") Nothing (Just "requires Graphviz >= 2.30.0"),
   makeAttr "Layers" ["layers"] "G" (Cust "LayerList") Nothing (Just "(LL [])") (Just "@'LL' []@") Nothing Nothing,
+  makeAttr "LayerSelect" ["layerselect"] "G" (Cust "LayerRange") Nothing (Just "[]") (Just "@[]@") Nothing Nothing,
   makeAttr "LayerSep" ["layersep"] "G" (Cust "LayerSep") Nothing (Just "(LSep \" :\\t\")") (Just "@'LSep' \\\" :\\t\\\"@") Nothing Nothing,
-  makeAttr "Layout" ["layout"] "G" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing Nothing,
+  makeAttr "Layout" ["layout"] "G" (Cust "GraphvizCommand") Nothing Nothing Nothing Nothing Nothing,
   makeAttr "Len" ["len"] "E" (Dbl) Nothing Nothing (Just "@1.0@ (neato), @0.3@ (fdp)") Nothing (Just "fdp, neato only"),
-  makeAttr "LevelsGap" ["levelsgap"] "G" (Dbl) Nothing (Just "0") (Just "@0.0@") Nothing (Just "neato only"),
   makeAttr "Levels" ["levels"] "G" (Integ) Nothing (Just "maxBound") (Just "@'maxBound'@") (Just "@0@") (Just "sfdp only"),
+  makeAttr "LevelsGap" ["levelsgap"] "G" (Dbl) Nothing (Just "0.0") (Just "@0.0@") Nothing (Just "neato only"),
   makeAttr "LHead" ["lhead"] "E" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "dot only"),
   makeAttr "LHeight" ["LHeight"] "GC" (Dbl) Nothing Nothing Nothing Nothing (Just "write only, requires Graphviz >= 2.28.0"),
   makeAttr "LPos" ["lp"] "EGC" (Cust "Point") Nothing Nothing Nothing Nothing (Just "write only"),
@@ -550,8 +550,8 @@
   makeAttr "LWidth" ["lwidth"] "GC" (Dbl) Nothing Nothing Nothing Nothing (Just "write only, requires Graphviz >= 2.28.0"),
   makeAttr "Margin" ["margin"] "NG" (Cust "DPoint") Nothing Nothing (Just "device dependent") Nothing Nothing,
   makeAttr "MaxIter" ["maxiter"] "G" (Integ) Nothing Nothing (Just "@100 * # nodes@ (@mode == 'KK'@), @200@ (@mode == 'Major'@), @600@ (fdp)") Nothing (Just "fdp, neato only"),
-  makeAttr "MCLimit" ["mclimit"] "G" (Dbl) Nothing (Just "1") (Just "@1.0@") Nothing (Just "dot only"),
-  makeAttr "MinDist" ["mindist"] "G" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") (Just "circo only"),
+  makeAttr "MCLimit" ["mclimit"] "G" (Dbl) Nothing (Just "1.0") (Just "@1.0@") Nothing (Just "dot only"),
+  makeAttr "MinDist" ["mindist"] "G" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") (Just "circo only"),
   makeAttr "MinLen" ["minlen"] "E" (Integ) Nothing (Just "1") (Just "@1@") (Just "@0@") (Just "dot only"),
   makeAttr "Mode" ["mode"] "G" (Cust "ModeType") Nothing (Just "Major") (Just "@'Major'@") Nothing (Just "neato only"),
   makeAttr "Model" ["model"] "G" (Cust "Model") Nothing (Just "ShortPath") (Just "@'ShortPath'@") Nothing (Just "neato only"),
@@ -562,7 +562,7 @@
   makeAttr "Nslimit" ["nslimit"] "G" (Dbl) Nothing Nothing Nothing Nothing (Just "dot only"),
   makeAttr "Nslimit1" ["nslimit1"] "G" (Dbl) Nothing Nothing Nothing Nothing (Just "dot only"),
   makeAttr "Ordering" ["ordering"] "GN" (Cust "Order") Nothing Nothing (Just "none") Nothing (Just "dot only"),
-  makeAttr "Orientation" ["orientation"] "N" (Dbl) Nothing (Just "0") (Just "@0.0@") (Just "@360.0@") Nothing,
+  makeAttr "Orientation" ["orientation"] "N" (Dbl) Nothing (Just "0.0") (Just "@0.0@") (Just "@360.0@") Nothing,
   makeAttr "OutputOrder" ["outputorder"] "G" (Cust "OutputMode") Nothing (Just "BreadthFirst") (Just "@'BreadthFirst'@") Nothing Nothing,
   makeAttr "Overlap" ["overlap"] "G" (Cust "Overlap") (Just "KeepOverlaps") (Just "KeepOverlaps") (Just "@'KeepOverlaps'@") Nothing (Just "not dot"),
   makeAttr "OverlapScaling" ["overlap_scaling"] "G" (Dbl) Nothing (Just "(-4)") (Just "@-4@") (Just "@-1.0e10@") (Just "prism only"),
@@ -572,7 +572,7 @@
   makeAttr "Page" ["page"] "G" (Cust "Point") Nothing Nothing Nothing Nothing Nothing,
   makeAttr "PageDir" ["pagedir"] "G" (Cust "PageDir") Nothing (Just "Bl") (Just "@'Bl'@") Nothing Nothing,
   makeAttr "PenColor" ["pencolor"] "C" (Cust "Color") Nothing (Just "(X11Color Black)") (Just "@'X11Color' 'Black'@") Nothing Nothing,
-  makeAttr "PenWidth" ["penwidth"] "CNE" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") Nothing,
+  makeAttr "PenWidth" ["penwidth"] "CNE" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") Nothing,
   makeAttr "Peripheries" ["peripheries"] "NC" (Integ) Nothing (Just "1") (Just "shape default (nodes), @1@ (clusters)") (Just "0") Nothing,
   makeAttr "Pin" ["pin"] "N" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing (Just "fdp, neato only"),
   makeAttr "Pos" ["pos"] "EN" (Cust "Pos") Nothing Nothing Nothing Nothing Nothing,
@@ -585,7 +585,7 @@
   makeAttr "Rects" ["rects"] "N" (Cust "[Rect]") Nothing Nothing Nothing Nothing (Just "write only"),
   makeAttr "Regular" ["regular"] "N" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,
   makeAttr "ReMinCross" ["remincross"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing (Just "dot only"),
-  makeAttr "RepulsiveForce" ["repulsiveforce"] "G" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") (Just "sfdp only"),
+  makeAttr "RepulsiveForce" ["repulsiveforce"] "G" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") (Just "sfdp only"),
   makeAttr "Root" ["root"] "GN" (Cust "Root") (Just "IsCentral") (Just "(NodeName \"\")") (Just "@'NodeName' \\\"\\\"@ (graphs), @'NotCentral'@ (nodes)") Nothing (Just "circo, twopi only"),
   makeAttr "Rotate" ["rotate"] "G" (Integ) Nothing (Just "0") (Just "@0@") Nothing Nothing,
   makeAttr "Rotation" ["rotation"] "G" (Dbl) Nothing (Just "0") (Just "@0@") Nothing (Just "sfdp only, requires Graphviz >= 2.28.0"),
@@ -596,18 +596,18 @@
   makeAttr "SearchSize" ["searchsize"] "G" (Integ) Nothing (Just "30") (Just "@30@") Nothing (Just "dot only"),
   makeAttr "Sep" ["sep"] "G" (Cust "DPoint") Nothing (Just "(DVal 4)") (Just "@'DVal' 4@") Nothing (Just "not dot"),
   makeAttr "Shape" ["shape"] "N" (Cust "Shape") Nothing (Just "Ellipse") (Just "@'Ellipse'@") Nothing Nothing,
-  makeAttr "ShapeFile" ["shapefile"] "N" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing Nothing,
-  makeAttr "ShowBoxes" ["showboxes"] "ENG" (Integ) Nothing (Just "0") (Just "@0@") (Just "@0@") (Just "dot only"),
+  makeAttr "ShowBoxes" ["showboxes"] "ENG" (Integ) Nothing (Just "0") (Just "@0@") (Just "@0@") (Just "dot only; used for debugging by printing PostScript guide boxes"),
   makeAttr "Sides" ["sides"] "N" (Integ) Nothing (Just "4") (Just "@4@") (Just "@0@") Nothing,
   makeAttr "Size" ["size"] "G" (Cust "GraphSize") Nothing Nothing Nothing Nothing Nothing,
-  makeAttr "Skew" ["skew"] "N" (Dbl) Nothing (Just "0") (Just "@0.0@") (Just "@-100.0@") Nothing,
+  makeAttr "Skew" ["skew"] "N" (Dbl) Nothing (Just "0.0") (Just "@0.0@") (Just "@-100.0@") Nothing,
   makeAttr "Smoothing" ["smoothing"] "G" (Cust "SmoothType") Nothing (Just "NoSmooth") (Just "@'NoSmooth'@") Nothing (Just "sfdp only"),
   makeAttr "SortV" ["sortv"] "GCN" (Cust "Word16") Nothing (Just "0") (Just "@0@") (Just "@0@") Nothing,
-  makeAttr "Splines" ["splines"] "G" (Cust "EdgeType") (Just "SplineEdges") (Just "SplineEdges") Nothing Nothing Nothing,
-  makeAttr "Start" ["start"] "G" (Cust "StartType") Nothing Nothing Nothing Nothing (Just "fdp, neato only"),
+  makeAttr "Splines" ["splines"] "G" (Cust "EdgeType") (Just "SplineEdges") Nothing (Just "@'SplineEdges'@ (dot), @'LineEdges'@ (other)") Nothing Nothing,
+  makeAttr "Start" ["start"] "G" (Cust "StartType") Nothing Nothing (Just "@'StartStyleSeed' 'RandomStyle' seed@ for some unknown fixed seed.") Nothing (Just "fdp, neato only"),
   makeAttr "Style" ["style"] "ENC" (Cust "[StyleItem]") Nothing Nothing Nothing Nothing Nothing,
   makeAttr "StyleSheet" ["stylesheet"] "G" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg only"),
   makeAttr "TailURL" ["tailURL", "tailhref"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, map only"),
+  makeAttr "Tail_LP" ["tail_lp"] "E" (Cust "Point") Nothing Nothing Nothing Nothing (Just "write only"),
   makeAttr "TailClip" ["tailclip"] "E" (Bl) (Just "True") (Just "True") (Just "@'True'@") Nothing Nothing,
   makeAttr "TailLabel" ["taillabel"] "E" (Cust "Label") Nothing (Just "(StrLabel \"\")") (Just "@'StrLabel' \\\"\\\"@") Nothing Nothing,
   makeAttr "TailPort" ["tailport"] "E" (Cust "PortPos") Nothing (Just "(CompassPoint CenterPoint)") (Just "@'CompassPoint' 'CenterPoint'@") Nothing Nothing,
@@ -619,10 +619,10 @@
   makeAttr "Vertices" ["vertices"] "N" (Cust "[Point]") Nothing Nothing Nothing Nothing (Just "write only"),
   makeAttr "ViewPort" ["viewport"] "G" (Cust "ViewPort") Nothing Nothing (Just "none") Nothing Nothing,
   makeAttr "VoroMargin" ["voro_margin"] "G" (Dbl) Nothing (Just "0.05") (Just "@0.05@") (Just "@0.0@") (Just "not dot"),
-  makeAttr "Weight" ["weight"] "E" (Dbl) Nothing Nothing (Just "@1.0@") (Just "@0@ (dot), @1@ (neato,fdp,sfdp)") Nothing,
+  makeAttr "Weight" ["weight"] "E" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0@ (dot), @1@ (neato,fdp,sfdp)") Nothing,
   makeAttr "Width" ["width"] "N" (Dbl) Nothing (Just "0.75") (Just "@0.75@") (Just "@0.01@") Nothing,
   makeAttr "XLabel" ["xlabel"] "EN" (Cust "Label") Nothing (Just "(StrLabel \"\")") (Just "@'StrLabel' \\\"\\\"@") Nothing (Just "requires Graphviz >= 2.29.0"),
-  makeAttr "Z" ["z"] "N" (Dbl) Nothing (Just "0") (Just "@0.0@") (Just "@-MAXFLOAT@, @-1000@") Nothing
+  makeAttr "XLP" ["xlp"] "EN" (Cust "Point") Nothing Nothing Nothing Nothing (Just "write only, requires Graphviz >= 2.29.0")
   -- END RECEIVE ORGTBL Attributes
   ]
 
@@ -650,160 +650,164 @@
   double-quotes should be escaped.
 
 #+ORGTBL: SEND Attributes orgtbl-to-generic :skip 2 :splice t :hline nil :no-escape t :lstart "  makeAttr " :lend "," :llend "" :sep " " :fmt (1 cell-quote 2 cell-to-list 3 cell-quote 4 cell-parens 5 cell-to-maybe 6 cell-to-maybe 7 cell-to-maybe 8 cell-to-maybe 9 cell-to-maybe)
-| Constructor        | Allowed names      | Used By | Type                     | Parsing default | Default value              | Default for Documentation                                                | Minimum                         | Comment notes                                                    |
-|--------------------+--------------------+---------+--------------------------+-----------------+----------------------------+--------------------------------------------------------------------------+---------------------------------+------------------------------------------------------------------|
-| Damping            | Damping            | G       | Dbl                      |                 | 0.99                       | @0.99@                                                                   | @0.0@                           | neato only                                                       |
-| K                  | K                  | GC      | Dbl                      |                 | 0.3                        | @0.3@                                                                    | @0@                             | sfdp, fdp only                                                   |
-| URL                | URL href           | ENGC    | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, postscript, map only                                        |
-| ArrowHead          | arrowhead          | E       | Cust "ArrowType"         |                 | normal                     | @'normal'@                                                               |                                 |                                                                  |
-| ArrowSize          | arrowsize          | E       | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           |                                                                  |
-| ArrowTail          | arrowtail          | E       | Cust "ArrowType"         |                 | normal                     | @'normal'@                                                               |                                 |                                                                  |
-| Aspect             | aspect             | G       | Cust "AspectType"        |                 |                            |                                                                          |                                 | dot only                                                         |
-| BoundingBox        | bb                 | G       | Cust "Rect"              |                 |                            |                                                                          |                                 | write only                                                       |
-| ColorScheme        | colorscheme        | ENCG    | Cust "ColorScheme"       |                 | X11                        | @'X11'@                                                                  |                                 |                                                                  |
-| BgColor            | bgcolor            | GC      | Cust "[Color]"           |                 | [X11Color Transparent]     | @['X11Color' 'Transparent']@                                             |                                 |                                                                  |
-| Center             | center             | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |
-| ClusterRank        | clusterrank        | G       | Cust "ClusterMode"       |                 | Local                      | @'Local'@                                                                |                                 | dot only                                                         |
-| Color              | color              | ENC     | Cust "[Color]"           |                 | [X11Color Black]           | @['X11Color' 'Black']@                                                   |                                 |                                                                  |
-| Comment            | comment            | ENG     | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 |                                                                  |
-| Compound           | compound           | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | dot only                                                         |
-| Concentrate        | concentrate        | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |
-| Constraint         | constraint         | E       | Bl                       | True            | True                       | @'True'@                                                                 |                                 | dot only                                                         |
-| Decorate           | decorate           | E       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |
-| DefaultDist        | defaultdist        | G       | Dbl                      |                 |                            | @1+(avg. len)*sqrt(abs(V))@                                              | @epsilon@                       | neato only, only if @'Pack' 'DontPack'@                          |
-| Dim                | dim                | G       | Integ                    |                 | 2                          | @2@                                                                      | @2@                             | sfdp, fdp, neato only                                            |
-| Dimen              | dimen              | G       | Integ                    |                 | 2                          | @2@                                                                      | @2@                             | sfdp, fdp, neato only                                            |
-| Dir                | dir                | E       | Cust "DirType"           |                 |                            | @'Forward'@ (directed), @'NoDir'@ (undirected)                           |                                 |                                                                  |
-| DirEdgeConstraints | diredgeconstraints | G       | Cust "DEConstraints"     | EdgeConstraints | NoConstraints              | @'NoConstraints'@                                                        |                                 | neato only                                                       |
-| Distortion         | distortion         | N       | Dbl                      |                 | 0                          | @0.0@                                                                    | @-100.0@                        |                                                                  |
-| DPI                | dpi resolution     | G       | Dbl                      |                 |                            | @96.0@, @0.0@                                                            |                                 | svg, bitmap output only; \\\"resolution\\\" is a synonym         |
-| EdgeURL            | edgeURL edgehref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, map only                                                    |
-| EdgeTarget         | edgetarget         | E       | EStrng                   |                 |                            | none                                                                     |                                 | svg, map only                                                    |
-| EdgeTooltip        | edgetooltip        | E       | EStrng                   |                 |                            | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |
-| Epsilon            | epsilon            | G       | Dbl                      |                 |                            | @.0001 * # nodes@ (@mode == 'KK'@), @.0001@ (@mode == 'Major'@)          |                                 | neato only                                                       |
-| ESep               | esep               | G       | Cust "DPoint"            |                 | (DVal 3)                   | @'DVal' 3@                                                               |                                 | not dot                                                          |
-| FillColor          | fillcolor          | NEC     | Cust "[Color]"           |                 | [X11Color Black]           | @['X11Color' 'LightGray']@ (nodes), @['X11Color' 'Black']@ (clusters)    |                                 |                                                                  |
-| FixedSize          | fixedsize          | N       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |
-| FontColor          | fontcolor          | ENGC    | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                     |                                 |                                                                  |
-| FontName           | fontname           | ENGC    | Strng                    |                 | \"Times-Roman\"            | @\\\"Times-Roman\\\"@                                                    |                                 |                                                                  |
-| FontNames          | fontnames          | G       | Cust "SVGFontNames"      |                 | SvgNames                   | @'SvgNames'@                                                             |                                 | svg only                                                         |
-| FontPath           | fontpath           | G       | Strng                    |                 |                            | system dependent                                                         |                                 |                                                                  |
-| FontSize           | fontsize           | ENGC    | Dbl                      |                 | 14                         | @14.0@                                                                   | @1.0@                           |                                                                  |
-| ForceLabels        | forcelabels        | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | Only for 'XLabel' attributes, requires Graphviz >= 2.29.0        |
-| GradientAngle      | gradientangle      | NCG     | Integ                    |                 | 0                          | 0                                                                        |                                 | requires Graphviz >= 2.29.0                                      |
-| Group              | group              | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |
-| HeadURL            | headURL headhref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, map only                                                    |
-| HeadClip           | headclip           | E       | Bl                       | True            | True                       | @'True'@                                                                 |                                 |                                                                  |
-| HeadLabel          | headlabel          | E       | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                    |                                 |                                                                  |
-| HeadPort           | headport           | E       | Cust "PortPos"           |                 | (CompassPoint CenterPoint) | @'CompassPoint' 'CenterPoint'@                                           |                                 |                                                                  |
-| HeadTarget         | headtarget         | E       | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, map only                                                    |
-| HeadTooltip        | headtooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |
-| Height             | height             | N       | Dbl                      |                 | 0.5                        | @0.5@                                                                    | @0.02@                          |                                                                  |
-| ID                 | id                 | GNE     | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, postscript, map only                                        |
-| Image              | image              | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 |                                                                  |
-| ImagePath          | imagepath          | G       | Cust "Paths"             |                 | (Paths [])                 | @'Paths' []@                                                             |                                 | Printing and parsing is OS-specific, requires Graphviz >= 2.29.0 |
-| ImageScale         | imagescale         | N       | Cust "ScaleType"         | UniformScale    | NoScale                    | @'NoScale'@                                                              |                                 |                                                                  |
-| Label              | label              | ENGC    | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\\N\\\"@ (nodes), @'StrLabel' \\\"\\\"@ (otherwise)    |                                 |                                                                  |
-| LabelURL           | labelURL labelhref | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, map only                                                    |
-| LabelScheme        | label_scheme       | G       | Cust "LabelScheme"       |                 | NotEdgeLabel               | @'NotEdgeLabel'@                                                         |                                 | sfdp only, requires Graphviz >= 2.28.0                           |
-| LabelAngle         | labelangle         | E       | Dbl                      |                 | (-25)                      | @-25.0@                                                                  | @-180.0@                        |                                                                  |
-| LabelDistance      | labeldistance      | E       | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           |                                                                  |
-| LabelFloat         | labelfloat         | E       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |
-| LabelFontColor     | labelfontcolor     | E       | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                     |                                 |                                                                  |
-| LabelFontName      | labelfontname      | E       | Strng                    |                 | \"Times-Roman\"            | @\\\"Times-Roman\\\"@                                                    |                                 |                                                                  |
-| LabelFontSize      | labelfontsize      | E       | Dbl                      |                 | 14                         | @14.0@                                                                   | @1.0@                           |                                                                  |
-| LabelJust          | labeljust          | GC      | Cust "Justification"     |                 | JCenter                    | @'JCenter'@                                                              |                                 |                                                                  |
-| LabelLoc           | labelloc           | GCN     | Cust "VerticalPlacement" |                 | VTop                       | @'VTop'@ (clusters), @'VBottom'@ (root graphs), @'VCenter'@ (nodes)      |                                 |                                                                  |
-| LabelTarget        | labeltarget        | E       | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, map only                                                    |
-| LabelTooltip       | labeltooltip       | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |
-| Landscape          | landscape          | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |
-| Layer              | layer              | EN      | Cust "LayerRange"        |                 |                            |                                                                          |                                 |                                                                  |
-| Layers             | layers             | G       | Cust "LayerList"         |                 | (LL [])                    | @'LL' []@                                                                |                                 |                                                                  |
-| LayerSep           | layersep           | G       | Cust "LayerSep"          |                 | (LSep \" :\\t\")           | @'LSep' \\\" :\\t\\\"@                                                   |                                 |                                                                  |
-| Layout             | layout             | G       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 |                                                                  |
-| Len                | len                | E       | Dbl                      |                 |                            | @1.0@ (neato), @0.3@ (fdp)                                               |                                 | fdp, neato only                                                  |
-| LevelsGap          | levelsgap          | G       | Dbl                      |                 | 0                          | @0.0@                                                                    |                                 | neato only                                                       |
-| Levels             | levels             | G       | Integ                    |                 | maxBound                   | @'maxBound'@                                                             | @0@                             | sfdp only                                                        |
-| LHead              | lhead              | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |
-| LHeight            | LHeight            | GC      | Dbl                      |                 |                            |                                                                          |                                 | write only, requires Graphviz >= 2.28.0                          |
-| LPos               | lp                 | EGC     | Cust "Point"             |                 |                            |                                                                          |                                 | write only                                                       |
-| LTail              | ltail              | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |
-| LWidth             | lwidth             | GC      | Dbl                      |                 |                            |                                                                          |                                 | write only, requires Graphviz >= 2.28.0                          |
-| Margin             | margin             | NG      | Cust "DPoint"            |                 |                            | device dependent                                                         |                                 |                                                                  |
-| MaxIter            | maxiter            | G       | Integ                    |                 |                            | @100 * # nodes@ (@mode == 'KK'@), @200@ (@mode == 'Major'@), @600@ (fdp) |                                 | fdp, neato only                                                  |
-| MCLimit            | mclimit            | G       | Dbl                      |                 | 1                          | @1.0@                                                                    |                                 | dot only                                                         |
-| MinDist            | mindist            | G       | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           | circo only                                                       |
-| MinLen             | minlen             | E       | Integ                    |                 | 1                          | @1@                                                                      | @0@                             | dot only                                                         |
-| Mode               | mode               | G       | Cust "ModeType"          |                 | Major                      | @'Major'@                                                                |                                 | neato only                                                       |
-| Model              | model              | G       | Cust "Model"             |                 | ShortPath                  | @'ShortPath'@                                                            |                                 | neato only                                                       |
-| Mosek              | mosek              | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | neato only; requires the Mosek software                          |
-| NodeSep            | nodesep            | G       | Dbl                      |                 | 0.25                       | @0.25@                                                                   | @0.02@                          | dot only                                                         |
-| NoJustify          | nojustify          | GCNE    | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |
-| Normalize          | normalize          | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | not dot                                                          |
-| Nslimit            | nslimit            | G       | Dbl                      |                 |                            |                                                                          |                                 | dot only                                                         |
-| Nslimit1           | nslimit1           | G       | Dbl                      |                 |                            |                                                                          |                                 | dot only                                                         |
-| Ordering           | ordering           | GN      | Cust "Order"             |                 |                            | none                                                                     |                                 | dot only                                                         |
-| Orientation        | orientation        | N       | Dbl                      |                 | 0                          | @0.0@                                                                    | @360.0@                         |                                                                  |
-| OutputOrder        | outputorder        | G       | Cust "OutputMode"        |                 | BreadthFirst               | @'BreadthFirst'@                                                         |                                 |                                                                  |
-| Overlap            | overlap            | G       | Cust "Overlap"           | KeepOverlaps    | KeepOverlaps               | @'KeepOverlaps'@                                                         |                                 | not dot                                                          |
-| OverlapScaling     | overlap_scaling    | G       | Dbl                      |                 | (-4)                       | @-4@                                                                     | @-1.0e10@                       | prism only                                                       |
-| Pack               | pack               | G       | Cust "Pack"              | DoPack          | DontPack                   | @'DontPack'@                                                             |                                 | not dot                                                          |
-| PackMode           | packmode           | G       | Cust "PackMode"          |                 | PackNode                   | @'PackNode'@                                                             |                                 | not dot                                                          |
-| Pad                | pad                | G       | Cust "DPoint"            |                 | (DVal 0.0555)              | @'DVal' 0.0555@ (4 points)                                               |                                 |                                                                  |
-| Page               | page               | G       | Cust "Point"             |                 |                            |                                                                          |                                 |                                                                  |
-| PageDir            | pagedir            | G       | Cust "PageDir"           |                 | Bl                         | @'Bl'@                                                                   |                                 |                                                                  |
-| PenColor           | pencolor           | C       | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                     |                                 |                                                                  |
-| PenWidth           | penwidth           | CNE     | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           |                                                                  |
-| Peripheries        | peripheries        | NC      | Integ                    |                 | 1                          | shape default (nodes), @1@ (clusters)                                    | 0                               |                                                                  |
-| Pin                | pin                | N       | Bl                       | True            | False                      | @'False'@                                                                |                                 | fdp, neato only                                                  |
-| Pos                | pos                | EN      | Cust "Pos"               |                 |                            |                                                                          |                                 |                                                                  |
-| QuadTree           | quadtree           | G       | Cust "QuadType"          | NormalQT        | NormalQT                   | @'NormalQT'@                                                             |                                 | sfdp only                                                        |
-| Quantum            | quantum            | G       | Dbl                      |                 | 0                          | @0.0@                                                                    | @0.0@                           |                                                                  |
-| Rank               | rank               | S       | Cust "RankType"          |                 |                            |                                                                          |                                 | dot only                                                         |
-| RankDir            | rankdir            | G       | Cust "RankDir"           |                 | FromTop                    | @'FromTop'@                                                              |                                 | dot only                                                         |
-| RankSep            | ranksep            | G       | Cust "[Double]"          |                 |                            | @[0.5]@ (dot), @[1.0]@ (twopi)                                           | [0.02]                          | twopi, dot only                                                  |
-| Ratio              | ratio              | G       | Cust "Ratios"            |                 |                            |                                                                          |                                 |                                                                  |
-| Rects              | rects              | N       | Cust "[Rect]"            |                 |                            |                                                                          |                                 | write only                                                       |
-| Regular            | regular            | N       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |
-| ReMinCross         | remincross         | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | dot only                                                         |
-| RepulsiveForce     | repulsiveforce     | G       | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           | sfdp only                                                        |
-| Root               | root               | GN      | Cust "Root"              | IsCentral       | (NodeName \"\")            | @'NodeName' \\\"\\\"@ (graphs), @'NotCentral'@ (nodes)                   |                                 | circo, twopi only                                                |
-| Rotate             | rotate             | G       | Integ                    |                 | 0                          | @0@                                                                      |                                 |                                                                  |
-| Rotation           | rotation           | G       | Dbl                      |                 | 0                          | @0@                                                                      |                                 | sfdp only, requires Graphviz >= 2.28.0                           |
-| SameHead           | samehead           | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |
-| SameTail           | sametail           | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |
-| SamplePoints       | samplepoints       | N       | Integ                    |                 |                            | @8@ (output), @20@ (overlap and image maps)                              |                                 |                                                                  |
-| Scale              | scale              | G       | Cust "DPoint"            |                 |                            |                                                                          |                                 | twopi only, requires Graphviz >= 2.28.0                          |
-| SearchSize         | searchsize         | G       | Integ                    |                 | 30                         | @30@                                                                     |                                 | dot only                                                         |
-| Sep                | sep                | G       | Cust "DPoint"            |                 | (DVal 4)                   | @'DVal' 4@                                                               |                                 | not dot                                                          |
-| Shape              | shape              | N       | Cust "Shape"             |                 | Ellipse                    | @'Ellipse'@                                                              |                                 |                                                                  |
-| ShapeFile          | shapefile          | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 |                                                                  |
-| ShowBoxes          | showboxes          | ENG     | Integ                    |                 | 0                          | @0@                                                                      | @0@                             | dot only                                                         |
-| Sides              | sides              | N       | Integ                    |                 | 4                          | @4@                                                                      | @0@                             |                                                                  |
-| Size               | size               | G       | Cust "GraphSize"         |                 |                            |                                                                          |                                 |                                                                  |
-| Skew               | skew               | N       | Dbl                      |                 | 0                          | @0.0@                                                                    | @-100.0@                        |                                                                  |
-| Smoothing          | smoothing          | G       | Cust "SmoothType"        |                 | NoSmooth                   | @'NoSmooth'@                                                             |                                 | sfdp only                                                        |
-| SortV              | sortv              | GCN     | Cust "Word16"            |                 | 0                          | @0@                                                                      | @0@                             |                                                                  |
-| Splines            | splines            | G       | Cust "EdgeType"          | SplineEdges     | SplineEdges                |                                                                          |                                 |                                                                  |
-| Start              | start              | G       | Cust "StartType"         |                 |                            |                                                                          |                                 | fdp, neato only                                                  |
-| Style              | style              | ENC     | Cust "[StyleItem]"       |                 |                            |                                                                          |                                 |                                                                  |
-| StyleSheet         | stylesheet         | G       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg only                                                         |
-| TailURL            | tailURL tailhref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, map only                                                    |
-| TailClip           | tailclip           | E       | Bl                       | True            | True                       | @'True'@                                                                 |                                 |                                                                  |
-| TailLabel          | taillabel          | E       | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                    |                                 |                                                                  |
-| TailPort           | tailport           | E       | Cust "PortPos"           |                 | (CompassPoint CenterPoint) | @'CompassPoint' 'CenterPoint'@                                           |                                 |                                                                  |
-| TailTarget         | tailtarget         | E       | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, map only                                                    |
-| TailTooltip        | tailtooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |
-| Target             | target             | ENGC    | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, map only                                                    |
-| Tooltip            | tooltip            | NEC     | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |
-| TrueColor          | truecolor          | G       | Bl                       | True            |                            |                                                                          |                                 | bitmap output only                                               |
-| Vertices           | vertices           | N       | Cust "[Point]"           |                 |                            |                                                                          |                                 | write only                                                       |
-| ViewPort           | viewport           | G       | Cust "ViewPort"          |                 |                            | none                                                                     |                                 |                                                                  |
-| VoroMargin         | voro_margin        | G       | Dbl                      |                 | 0.05                       | @0.05@                                                                   | @0.0@                           | not dot                                                          |
-| Weight             | weight             | E       | Dbl                      |                 |                            | @1.0@                                                                    | @0@ (dot), @1@ (neato,fdp,sfdp) |                                                                  |
-| Width              | width              | N       | Dbl                      |                 | 0.75                       | @0.75@                                                                   | @0.01@                          |                                                                  |
-| XLabel             | xlabel             | EN      | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                    |                                 | requires Graphviz >= 2.29.0                                      |
-| Z                  | z                  | N       | Dbl                      |                 | 0                          | @0.0@                                                                    | @-MAXFLOAT@, @-1000@            |                                                                  |
+| Constructor        | Allowed names      | Used By | Type                     | Parsing default | Default value              | Default for Documentation                                                                           | Minimum                         | Comment notes                                                    |
+|--------------------+--------------------+---------+--------------------------+-----------------+----------------------------+-----------------------------------------------------------------------------------------------------+---------------------------------+------------------------------------------------------------------|
+| Damping            | Damping            | G       | Dbl                      |                 | 0.99                       | @0.99@                                                                                              | @0.0@                           | neato only                                                       |
+| K                  | K                  | GC      | Dbl                      |                 | 0.3                        | @0.3@                                                                                               | @0@                             | sfdp, fdp only                                                   |
+| URL                | URL href           | ENGC    | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, postscript, map only                                        |
+| Area               | area               | NC      | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @>0@                            | patchwork only, requires Graphviz >= 2.30.0                      |
+| ArrowHead          | arrowhead          | E       | Cust "ArrowType"         |                 | normal                     | @'normal'@                                                                                          |                                 |                                                                  |
+| ArrowSize          | arrowsize          | E       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           |                                                                  |
+| ArrowTail          | arrowtail          | E       | Cust "ArrowType"         |                 | normal                     | @'normal'@                                                                                          |                                 |                                                                  |
+| Aspect             | aspect             | G       | Cust "AspectType"        |                 |                            |                                                                                                     |                                 | dot only                                                         |
+| BoundingBox        | bb                 | G       | Cust "Rect"              |                 |                            |                                                                                                     |                                 | write only                                                       |
+| BgColor            | bgcolor            | GC      | Cust "ColorList"         |                 | []                         | @[]@                                                                                                |                                 |                                                                  |
+| Center             | center             | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |
+| ClusterRank        | clusterrank        | G       | Cust "ClusterMode"       |                 | Local                      | @'Local'@                                                                                           |                                 | dot only                                                         |
+| Color              | color              | ENC     | Cust "ColorList"         |                 | [toWColor Black]           | @['WC' ('X11Color' 'Black') Nothing]@                                                               |                                 |                                                                  |
+| ColorScheme        | colorscheme        | ENCG    | Cust "ColorScheme"       |                 | X11                        | @'X11'@                                                                                             |                                 |                                                                  |
+| Comment            | comment            | ENG     | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 |                                                                  |
+| Compound           | compound           | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | dot only                                                         |
+| Concentrate        | concentrate        | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |
+| Constraint         | constraint         | E       | Bl                       | True            | True                       | @'True'@                                                                                            |                                 | dot only                                                         |
+| Decorate           | decorate           | E       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |
+| DefaultDist        | defaultdist        | G       | Dbl                      |                 |                            | @1+(avg. len)*sqrt(abs(V))@ (unable to statically define)                                           | The value of 'Epsilon'.         | neato only, only if @'Pack' 'DontPack'@                          |
+| Dim                | dim                | G       | Integ                    |                 | 2                          | @2@                                                                                                 | @2@                             | maximum of @10@; sfdp, fdp, neato only                           |
+| Dimen              | dimen              | G       | Integ                    |                 | 2                          | @2@                                                                                                 | @2@                             | maximum of @10@; sfdp, fdp, neato only                           |
+| Dir                | dir                | E       | Cust "DirType"           |                 |                            | @'Forward'@ (directed), @'NoDir'@ (undirected)                                                      |                                 |                                                                  |
+| DirEdgeConstraints | diredgeconstraints | G       | Cust "DEConstraints"     | EdgeConstraints | NoConstraints              | @'NoConstraints'@                                                                                   |                                 | neato only                                                       |
+| Distortion         | distortion         | N       | Dbl                      |                 | 0.0                        | @0.0@                                                                                               | @-100.0@                        |                                                                  |
+| DPI                | dpi resolution     | G       | Dbl                      |                 | 96.0                       | @96.0@, @0.0@                                                                                       |                                 | svg, bitmap output only; \\\"resolution\\\" is a synonym         |
+| EdgeURL            | edgeURL edgehref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, map only                                                    |
+| EdgeTarget         | edgetarget         | E       | EStrng                   |                 |                            | none                                                                                                |                                 | svg, map only                                                    |
+| EdgeTooltip        | edgetooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |
+| Epsilon            | epsilon            | G       | Dbl                      |                 |                            | @.0001 * # nodes@ (@mode == 'KK'@), @.0001@ (@mode == 'Major'@)                                     |                                 | neato only                                                       |
+| ESep               | esep               | G       | Cust "DPoint"            |                 | (DVal 3)                   | @'DVal' 3@                                                                                          |                                 | not dot                                                          |
+| FillColor          | fillcolor          | NEC     | Cust "ColorList"         |                 | [toWColor Black]           | @['WC' ('X11Color' 'LightGray') Nothing]@ (nodes), @['WC' ('X11Color' 'Black') Nothing]@ (clusters) |                                 |                                                                  |
+| FixedSize          | fixedsize          | N       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |
+| FontColor          | fontcolor          | ENGC    | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                                                |                                 |                                                                  |
+| FontName           | fontname           | ENGC    | Strng                    |                 | \"Times-Roman\"            | @\\\"Times-Roman\\\"@                                                                               |                                 |                                                                  |
+| FontNames          | fontnames          | G       | Cust "SVGFontNames"      |                 | SvgNames                   | @'SvgNames'@                                                                                        |                                 | svg only                                                         |
+| FontPath           | fontpath           | G       | Cust "Paths"             |                 |                            | system dependent                                                                                    |                                 |                                                                  |
+| FontSize           | fontsize           | ENGC    | Dbl                      |                 | 14.0                       | @14.0@                                                                                              | @1.0@                           |                                                                  |
+| ForceLabels        | forcelabels        | G       | Bl                       | True            | True                       | @'True'@                                                                                            |                                 | only for 'XLabel' attributes, requires Graphviz >= 2.29.0        |
+| GradientAngle      | gradientangle      | NCG     | Integ                    |                 | 0                          | 0                                                                                                   |                                 | requires Graphviz >= 2.29.0                                      |
+| Group              | group              | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |
+| HeadURL            | headURL headhref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, map only                                                    |
+| Head_LP            | head_lp            | E       | Cust "Point"             |                 |                            |                                                                                                     |                                 | write only, requires Graphviz >= 2.30.0                          |
+| HeadClip           | headclip           | E       | Bl                       | True            | True                       | @'True'@                                                                                            |                                 |                                                                  |
+| HeadLabel          | headlabel          | E       | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                                               |                                 |                                                                  |
+| HeadPort           | headport           | E       | Cust "PortPos"           |                 | (CompassPoint CenterPoint) | @'CompassPoint' 'CenterPoint'@                                                                      |                                 |                                                                  |
+| HeadTarget         | headtarget         | E       | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, map only                                                    |
+| HeadTooltip        | headtooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |
+| Height             | height             | N       | Dbl                      |                 | 0.5                        | @0.5@                                                                                               | @0.02@                          |                                                                  |
+| ID                 | id                 | GNE     | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, postscript, map only                                        |
+| Image              | image              | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 |                                                                  |
+| ImagePath          | imagepath          | G       | Cust "Paths"             |                 | (Paths [])                 | @'Paths' []@                                                                                        |                                 | Printing and parsing is OS-specific, requires Graphviz >= 2.29.0 |
+| ImageScale         | imagescale         | N       | Cust "ScaleType"         | UniformScale    | NoScale                    | @'NoScale'@                                                                                         |                                 |                                                                  |
+| Label              | label              | ENGC    | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\\N\\\"@ (nodes), @'StrLabel' \\\"\\\"@ (otherwise)                               |                                 |                                                                  |
+| LabelURL           | labelURL labelhref | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, map only                                                    |
+| LabelScheme        | label_scheme       | G       | Cust "LabelScheme"       |                 | NotEdgeLabel               | @'NotEdgeLabel'@                                                                                    |                                 | sfdp only, requires Graphviz >= 2.28.0                           |
+| LabelAngle         | labelangle         | E       | Dbl                      |                 | (-25.0)                    | @-25.0@                                                                                             | @-180.0@                        |                                                                  |
+| LabelDistance      | labeldistance      | E       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           |                                                                  |
+| LabelFloat         | labelfloat         | E       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |
+| LabelFontColor     | labelfontcolor     | E       | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                                                |                                 |                                                                  |
+| LabelFontName      | labelfontname      | E       | Strng                    |                 | \"Times-Roman\"            | @\\\"Times-Roman\\\"@                                                                               |                                 |                                                                  |
+| LabelFontSize      | labelfontsize      | E       | Dbl                      |                 | 14.0                       | @14.0@                                                                                              | @1.0@                           |                                                                  |
+| LabelJust          | labeljust          | GC      | Cust "Justification"     |                 | JCenter                    | @'JCenter'@                                                                                         |                                 |                                                                  |
+| LabelLoc           | labelloc           | GCN     | Cust "VerticalPlacement" |                 | VTop                       | @'VTop'@ (clusters), @'VBottom'@ (root graphs), @'VCenter'@ (nodes)                                 |                                 |                                                                  |
+| LabelTarget        | labeltarget        | E       | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, map only                                                    |
+| LabelTooltip       | labeltooltip       | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |
+| Landscape          | landscape          | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |
+| Layer              | layer              | EN      | Cust "LayerRange"        |                 | []                         | @[]@                                                                                                |                                 |                                                                  |
+| LayerListSep       | layerlistsep       | G       | Cust "LayerListSep"      |                 | (LLSep \",\")              | @'LLSep' \\\",\\\"@                                                                                 |                                 | requires Graphviz >= 2.30.0                                      |
+| Layers             | layers             | G       | Cust "LayerList"         |                 | (LL [])                    | @'LL' []@                                                                                           |                                 |                                                                  |
+| LayerSelect        | layerselect        | G       | Cust "LayerRange"        |                 | []                         | @[]@                                                                                                |                                 |                                                                  |
+| LayerSep           | layersep           | G       | Cust "LayerSep"          |                 | (LSep \" :\\t\")           | @'LSep' \\\" :\\t\\\"@                                                                              |                                 |                                                                  |
+| Layout             | layout             | G       | Cust "GraphvizCommand"   |                 |                            |                                                                                                     |                                 |                                                                  |
+| Len                | len                | E       | Dbl                      |                 |                            | @1.0@ (neato), @0.3@ (fdp)                                                                          |                                 | fdp, neato only                                                  |
+| Levels             | levels             | G       | Integ                    |                 | maxBound                   | @'maxBound'@                                                                                        | @0@                             | sfdp only                                                        |
+| LevelsGap          | levelsgap          | G       | Dbl                      |                 | 0.0                        | @0.0@                                                                                               |                                 | neato only                                                       |
+| LHead              | lhead              | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |
+| LHeight            | LHeight            | GC      | Dbl                      |                 |                            |                                                                                                     |                                 | write only, requires Graphviz >= 2.28.0                          |
+| LPos               | lp                 | EGC     | Cust "Point"             |                 |                            |                                                                                                     |                                 | write only                                                       |
+| LTail              | ltail              | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |
+| LWidth             | lwidth             | GC      | Dbl                      |                 |                            |                                                                                                     |                                 | write only, requires Graphviz >= 2.28.0                          |
+| Margin             | margin             | NG      | Cust "DPoint"            |                 |                            | device dependent                                                                                    |                                 |                                                                  |
+| MaxIter            | maxiter            | G       | Integ                    |                 |                            | @100 * # nodes@ (@mode == 'KK'@), @200@ (@mode == 'Major'@), @600@ (fdp)                            |                                 | fdp, neato only                                                  |
+| MCLimit            | mclimit            | G       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               |                                 | dot only                                                         |
+| MinDist            | mindist            | G       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           | circo only                                                       |
+| MinLen             | minlen             | E       | Integ                    |                 | 1                          | @1@                                                                                                 | @0@                             | dot only                                                         |
+| Mode               | mode               | G       | Cust "ModeType"          |                 | Major                      | @'Major'@                                                                                           |                                 | neato only                                                       |
+| Model              | model              | G       | Cust "Model"             |                 | ShortPath                  | @'ShortPath'@                                                                                       |                                 | neato only                                                       |
+| Mosek              | mosek              | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | neato only; requires the Mosek software                          |
+| NodeSep            | nodesep            | G       | Dbl                      |                 | 0.25                       | @0.25@                                                                                              | @0.02@                          | dot only                                                         |
+| NoJustify          | nojustify          | GCNE    | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |
+| Normalize          | normalize          | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | not dot                                                          |
+| Nslimit            | nslimit            | G       | Dbl                      |                 |                            |                                                                                                     |                                 | dot only                                                         |
+| Nslimit1           | nslimit1           | G       | Dbl                      |                 |                            |                                                                                                     |                                 | dot only                                                         |
+| Ordering           | ordering           | GN      | Cust "Order"             |                 |                            | none                                                                                                |                                 | dot only                                                         |
+| Orientation        | orientation        | N       | Dbl                      |                 | 0.0                        | @0.0@                                                                                               | @360.0@                         |                                                                  |
+| OutputOrder        | outputorder        | G       | Cust "OutputMode"        |                 | BreadthFirst               | @'BreadthFirst'@                                                                                    |                                 |                                                                  |
+| Overlap            | overlap            | G       | Cust "Overlap"           | KeepOverlaps    | KeepOverlaps               | @'KeepOverlaps'@                                                                                    |                                 | not dot                                                          |
+| OverlapScaling     | overlap_scaling    | G       | Dbl                      |                 | (-4)                       | @-4@                                                                                                | @-1.0e10@                       | prism only                                                       |
+| Pack               | pack               | G       | Cust "Pack"              | DoPack          | DontPack                   | @'DontPack'@                                                                                        |                                 | not dot                                                          |
+| PackMode           | packmode           | G       | Cust "PackMode"          |                 | PackNode                   | @'PackNode'@                                                                                        |                                 | not dot                                                          |
+| Pad                | pad                | G       | Cust "DPoint"            |                 | (DVal 0.0555)              | @'DVal' 0.0555@ (4 points)                                                                          |                                 |                                                                  |
+| Page               | page               | G       | Cust "Point"             |                 |                            |                                                                                                     |                                 |                                                                  |
+| PageDir            | pagedir            | G       | Cust "PageDir"           |                 | Bl                         | @'Bl'@                                                                                              |                                 |                                                                  |
+| PenColor           | pencolor           | C       | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                                                |                                 |                                                                  |
+| PenWidth           | penwidth           | CNE     | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           |                                                                  |
+| Peripheries        | peripheries        | NC      | Integ                    |                 | 1                          | shape default (nodes), @1@ (clusters)                                                               | 0                               |                                                                  |
+| Pin                | pin                | N       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | fdp, neato only                                                  |
+| Pos                | pos                | EN      | Cust "Pos"               |                 |                            |                                                                                                     |                                 |                                                                  |
+| QuadTree           | quadtree           | G       | Cust "QuadType"          | NormalQT        | NormalQT                   | @'NormalQT'@                                                                                        |                                 | sfdp only                                                        |
+| Quantum            | quantum            | G       | Dbl                      |                 | 0                          | @0.0@                                                                                               | @0.0@                           |                                                                  |
+| Rank               | rank               | S       | Cust "RankType"          |                 |                            |                                                                                                     |                                 | dot only                                                         |
+| RankDir            | rankdir            | G       | Cust "RankDir"           |                 | FromTop                    | @'FromTop'@                                                                                         |                                 | dot only                                                         |
+| RankSep            | ranksep            | G       | Cust "[Double]"          |                 |                            | @[0.5]@ (dot), @[1.0]@ (twopi)                                                                      | [0.02]                          | twopi, dot only                                                  |
+| Ratio              | ratio              | G       | Cust "Ratios"            |                 |                            |                                                                                                     |                                 |                                                                  |
+| Rects              | rects              | N       | Cust "[Rect]"            |                 |                            |                                                                                                     |                                 | write only                                                       |
+| Regular            | regular            | N       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |
+| ReMinCross         | remincross         | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | dot only                                                         |
+| RepulsiveForce     | repulsiveforce     | G       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           | sfdp only                                                        |
+| Root               | root               | GN      | Cust "Root"              | IsCentral       | (NodeName \"\")            | @'NodeName' \\\"\\\"@ (graphs), @'NotCentral'@ (nodes)                                              |                                 | circo, twopi only                                                |
+| Rotate             | rotate             | G       | Integ                    |                 | 0                          | @0@                                                                                                 |                                 |                                                                  |
+| Rotation           | rotation           | G       | Dbl                      |                 | 0                          | @0@                                                                                                 |                                 | sfdp only, requires Graphviz >= 2.28.0                           |
+| SameHead           | samehead           | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |
+| SameTail           | sametail           | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |
+| SamplePoints       | samplepoints       | N       | Integ                    |                 |                            | @8@ (output), @20@ (overlap and image maps)                                                         |                                 |                                                                  |
+| Scale              | scale              | G       | Cust "DPoint"            |                 |                            |                                                                                                     |                                 | twopi only, requires Graphviz >= 2.28.0                          |
+| SearchSize         | searchsize         | G       | Integ                    |                 | 30                         | @30@                                                                                                |                                 | dot only                                                         |
+| Sep                | sep                | G       | Cust "DPoint"            |                 | (DVal 4)                   | @'DVal' 4@                                                                                          |                                 | not dot                                                          |
+| Shape              | shape              | N       | Cust "Shape"             |                 | Ellipse                    | @'Ellipse'@                                                                                         |                                 |                                                                  |
+| ShowBoxes          | showboxes          | ENG     | Integ                    |                 | 0                          | @0@                                                                                                 | @0@                             | dot only; used for debugging by printing PostScript guide boxes  |
+| Sides              | sides              | N       | Integ                    |                 | 4                          | @4@                                                                                                 | @0@                             |                                                                  |
+| Size               | size               | G       | Cust "GraphSize"         |                 |                            |                                                                                                     |                                 |                                                                  |
+| Skew               | skew               | N       | Dbl                      |                 | 0.0                        | @0.0@                                                                                               | @-100.0@                        |                                                                  |
+| Smoothing          | smoothing          | G       | Cust "SmoothType"        |                 | NoSmooth                   | @'NoSmooth'@                                                                                        |                                 | sfdp only                                                        |
+| SortV              | sortv              | GCN     | Cust "Word16"            |                 | 0                          | @0@                                                                                                 | @0@                             |                                                                  |
+| Splines            | splines            | G       | Cust "EdgeType"          | SplineEdges     |                            | @'SplineEdges'@ (dot), @'LineEdges'@ (other)                                                        |                                 |                                                                  |
+| Start              | start              | G       | Cust "StartType"         |                 |                            | @'StartStyleSeed' 'RandomStyle' seed@ for some unknown fixed seed.                                  |                                 | fdp, neato only                                                  |
+| Style              | style              | ENC     | Cust "[StyleItem]"       |                 |                            |                                                                                                     |                                 |                                                                  |
+| StyleSheet         | stylesheet         | G       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg only                                                         |
+| TailURL            | tailURL tailhref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, map only                                                    |
+| Tail_LP            | tail_lp            | E       | Cust "Point"             |                 |                            |                                                                                                     |                                 | write only                                                       |
+| TailClip           | tailclip           | E       | Bl                       | True            | True                       | @'True'@                                                                                            |                                 |                                                                  |
+| TailLabel          | taillabel          | E       | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                                               |                                 |                                                                  |
+| TailPort           | tailport           | E       | Cust "PortPos"           |                 | (CompassPoint CenterPoint) | @'CompassPoint' 'CenterPoint'@                                                                      |                                 |                                                                  |
+| TailTarget         | tailtarget         | E       | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, map only                                                    |
+| TailTooltip        | tailtooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |
+| Target             | target             | ENGC    | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, map only                                                    |
+| Tooltip            | tooltip            | NEC     | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |
+| TrueColor          | truecolor          | G       | Bl                       | True            |                            |                                                                                                     |                                 | bitmap output only                                               |
+| Vertices           | vertices           | N       | Cust "[Point]"           |                 |                            |                                                                                                     |                                 | write only                                                       |
+| ViewPort           | viewport           | G       | Cust "ViewPort"          |                 |                            | none                                                                                                |                                 |                                                                  |
+| VoroMargin         | voro_margin        | G       | Dbl                      |                 | 0.05                       | @0.05@                                                                                              | @0.0@                           | not dot                                                          |
+| Weight             | weight             | E       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0@ (dot), @1@ (neato,fdp,sfdp) |                                                                  |
+| Width              | width              | N       | Dbl                      |                 | 0.75                       | @0.75@                                                                                              | @0.01@                          |                                                                  |
+| XLabel             | xlabel             | EN      | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                                               |                                 | requires Graphviz >= 2.29.0                                      |
+| XLP                | xlp                | EN      | Cust "Point"             |                 |                            |                                                                                                     |                                 | write only, requires Graphviz >= 2.29.0                          |
 
 -}
 
