[SCM] Debian packaging for sketch 3D line drawing software branch, master, updated. debian/0.2.183-1-36-ge52fddb

David Bremner bremner at debian.org
Mon May 21 21:21:32 UTC 2012


The following commit has been merged in the master branch:
commit 986341b3d548af4f59970fac05528cc01ffc524a
Author: David Bremner <bremner at debian.org>
Date:   Sun Feb 20 09:02:52 2011 -0400

    Imported Upstream version 0.3.2

diff --git a/Doc/make.pl b/Doc/make.pl
index e685dae..2259f74 100644
--- a/Doc/make.pl
+++ b/Doc/make.pl
@@ -67,6 +67,7 @@ sub make_all {
       tr/\r//d;
       print OUT;
     }
+    close OUT;
   }
   unless ($arg{notypeset}) {
     print "info:\n";
diff --git a/Doc/sketch.html b/Doc/sketch.html
index c951ce3..bc1a1ea 100644
--- a/Doc/sketch.html
+++ b/Doc/sketch.html
@@ -9,8 +9,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -168,8 +168,8 @@ Up: <a rel="up" accesskey="u" href="#dir">(dir)</a>
 
 <p>Copyright © 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-   <p>This manual is for <code>sketch</code>, version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+   <p>This manual is for <code>sketch</code>, version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 <code>PSTricks</code> or <code>PGF/TikZ</code> code suitable for use with the
 TeX document processing system.
@@ -413,8 +413,8 @@ Up: <a rel="up" accesskey="u" href="#About-sketch">About sketch</a>
 <!-- node-name,  next,  previous,  up -->
 <h3 class="section">1.1 Reporting bugs and recommending improvements.</h3>
 
-<p>Report bugs and make suggestions at
-our Google Group <tt>http://groups.google.com/group/sketch-users</tt>. 
+<p>The group <tt>http://groups.google.com/group/sketch-users</tt>
+is the best place to report bugs and make improvements. 
 A second method that will probably produce a slower
 response is email to <tt>sketch at frontiernet.net</tt>. 
 We will try to respond, but can't promise.  In any event, don't be
@@ -717,15 +717,27 @@ in this case <span class="samp">|</span>.  The raw
 text continues until this character recurs.
 
    <p>Second, the argument references
-<a name="index-argument_002c-special-51"></a><tt>#1</tt>, <tt>#2</tt>, <tt>#3</tt>,
-and <tt>#4</tt> refer to points in the list that follow.  This is
-similar to TeX macro syntax.  The transformed and two-dimensional
-projections of these three-dimensional points are substituted
+<a name="index-argument_002c-special-51"></a><tt>#1</tt>, <tt>#2</tt>, <tt>#3</tt>, and <tt>#4</tt> refer to point,
+vector, or scalar values in the list that follow.  This is similar to
+TeX macro syntax.  The transformed and two-dimensional projections
+of these three-dimensional points are substituted
 <a name="index-substitution_002c-special-52"></a><a name="index-special-argument-substitution-53"></a>in the final output.  An argument reference of the form <tt>#1-2</tt>
 is replaced with the angle in degrees of the two-dimensional vector
 that connects the projections of the two respective argument points,
 here <tt>#1</tt> and <tt>#2</tt>.  The substituted angle is enclosed
-in curly braces <code>{ }</code>
+in curly braces <code>{ }</code>.  When <code>TikZ/PGF</code> output is being
+generated, the angle is rounded to the nearest degree because
+non-integer angles are not allowed by <code>TikZ/PGF</code> primitives.
+
+   <p>As of Version 0.3 of <code>sketch</code>, special arguments may be scalars
+or vectors in addition to points. References to scalar arguments are
+merely replaced with a number formatted just as any point
+coordinate. References to vectors become two-dimensional points. The
+tick operator that selects individual components of points and vectors
+elsewhere in <code>sketch</code> (see for example <a href="#Affine-arithmetic">Affine arithmetic</a>)
+can also be applied to point and vector argument references.  All
+three dimensions of a transformed point or vector can also be
+substitued with <code>'3</code>. See <a href="#Specials">Specials</a> for details.
 
    <p>By default, <code>special</code> objects are printed last, overlaying all
 other objects in the scene.  If you specify the internal option
@@ -1727,7 +1739,7 @@ Now, the output is
 <code>sketch</code> code as <code>special</code>s with option <code>[lay=under]</code>
 to ensure that the styles are emitted first in the output, before
 any uses of the style names. 
-<a rel="footnote" href="#fn-2" name="fnd-2"><sup>2</sup></a>  For
+<a name="index-lay-252"></a><a rel="footnote" href="#fn-2" name="fnd-2"><sup>2</sup></a>  For
 example,
 <pre class="verbatim">
   special|\tikzstyle{mypolygonstyle} = [fill=blue!20,fill opacity=0.8]|[lay=under]
@@ -1748,18 +1760,18 @@ Up: <a rel="up" accesskey="u" href="#Options">Options</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.1.5.5 Transparency</h5>
 
-<p><a name="index-transparency-252"></a>Both <code>PSTricks</code> and <code>TikZ/PGF</code> support polygon options that
+<p><a name="index-transparency-253"></a>Both <code>PSTricks</code> and <code>TikZ/PGF</code> support polygon options that
 have the effect of making the polygon appear transparent.  For
 <code>PSTricks</code>, keyword <code>transpalpha</code> was used during initial
 development of transparency features, and <code>opacity</code> was adopted
 later. <code>Sketch</code> honors both. <code>TikZ/PGF</code> uses <code>opacity</code> only. 
-<a name="index-transpalpha-253"></a><a name="index-opacity-254"></a><a name="index-fill-opacity-255"></a>When transparent polygons are in the foreground, objects behind them
+<a name="index-transpalpha-254"></a><a name="index-opacity-255"></a><a name="index-fill-opacity-256"></a>When transparent polygons are in the foreground, objects behind them
 (drawn earlier) are visible with color subdued and tinted.  The hidden
 surface algorithm of <code>sketch</code> works well with such transparent
 polygons.
 
    <p>Note that <tt>cull=false</tt>
-<a name="index-cull-256"></a>must be used for rear-facing polygons to be visible when positioned
+<a name="index-cull-257"></a>must be used for rear-facing polygons to be visible when positioned
 behind other transparent surfaces.
 
 <div class="node">
@@ -1773,10 +1785,10 @@ Up: <a rel="up" accesskey="u" href="#Options">Options</a>
 <h5 class="subsubsection">3.1.5.6 Internal options</h5>
 
 <p>There are also <em>internal</em> options
-<a name="index-options_002c-internal-257"></a><a name="index-internal-options-258"></a>used only by <code>sketch</code> and not
+<a name="index-options_002c-internal-258"></a><a name="index-internal-options-259"></a>used only by <code>sketch</code> and not
 passed on to <code>PSTricks</code>.  These are summarized in the following
 table. 
-<a name="index-cull-259"></a><a name="index-lay-260"></a><a name="index-split-261"></a>
+<a name="index-cull-260"></a><a name="index-lay-261"></a><a name="index-split-262"></a>
    <p><table summary=""><tr align="left"><th valign="top">Key </th><th valign="top">Possible values </th><th valign="top">Description
 <br></th></tr><tr align="left"><td valign="top"><code>cull</code>
 </td><td valign="top"><code>true</code>, <code>false</code>
@@ -1786,20 +1798,20 @@ The default value is <code>true</code>.
 </td><td valign="top"><code>over</code>, <code>in</code>, <code>under</code>
 </td><td valign="top">Force this object to be <code>under</code> or
 <code>over</code> all other objects in the depth sort
-<a name="index-depth-sort-262"></a>order created by the hidden surface algorithm.  The default value
+<a name="index-depth-sort-263"></a>order created by the hidden surface algorithm.  The default value
 <code>over</code> guarantees that output due to the <code>special</code> will be
 visible. 
 <br></td></tr><tr align="left"><td valign="top"><code>split</code>
 </td><td valign="top"><code>true</code>, <code>false</code>
 </td><td valign="top">Turn splitting of sweep-generated body polygons
-<a name="index-body-polygon-263"></a><a name="index-polygon_002c-body-264"></a>on and off respectively. See <a href="#Sweeps">Sweeps</a>.  The default value <code>true</code>
+<a name="index-body-polygon-264"></a><a name="index-polygon_002c-body-265"></a>on and off respectively. See <a href="#Sweeps">Sweeps</a>.  The default value <code>true</code>
 causes “warped” polygons to be split into triangles, which avoids
 mistakes by the hidden surface algorithm.
    <br></td></tr></table>
 
 <h4 class="subsection">3.1.6 Point lists</h4>
 
-<p><a name="index-point-list-265"></a><strong>Syntax:</strong>
+<p><a name="index-point-list-266"></a><strong>Syntax:</strong>
 <pre class="example">     (<var>x1</var>,<var>y1</var>,<var>z1</var>)(<var>x2</var>,<var>y2</var>,<var>z2</var>)...
 </pre>
    <p class="noindent">A sequence of one or more points makes a point list, a feature
@@ -1823,7 +1835,7 @@ Up: <a rel="up" accesskey="u" href="#Input-language">Input language</a>
 <!-- node-name,  next,  previous,  up -->
 <h3 class="section">3.2 Drawables</h3>
 
-<p><a name="index-drawable-266"></a>Drawables are simply <code>sketch</code> objects that might appear in the
+<p><a name="index-drawable-267"></a>Drawables are simply <code>sketch</code> objects that might appear in the
 drawing.  They include dots, polylines, curves, polygons, and more
 complex objects that are built up from simpler ones in various ways. 
 Finally, <dfn>special</dfn> objects are those composed of LaTeX or
@@ -1853,7 +1865,7 @@ Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.1 Dots</h4>
 
-<p><a name="index-dots-267"></a><strong>Syntax:</strong>
+<p><a name="index-dots-268"></a><strong>Syntax:</strong>
 <pre class="example">     dots[<var>options</var>] <var>point_list</var>
 </pre>
    <p class="noindent">This command is the three-dimensional equivalent of the
@@ -1870,7 +1882,7 @@ Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.2 Lines</h4>
 
-<p><a name="index-line-268"></a><strong>Syntax:</strong>
+<p><a name="index-line-269"></a><strong>Syntax:</strong>
 <pre class="example">     line[<var>options</var>] <var>point_list</var>
 </pre>
    <p class="noindent">This command is the three-dimensional equivalent of the
@@ -1887,7 +1899,7 @@ Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.3 Curves</h4>
 
-<p><a name="index-curve-269"></a><strong>Syntax:</strong>
+<p><a name="index-curve-270"></a><strong>Syntax:</strong>
 <pre class="example">     curve[<var>options</var>] <var>point_list</var>
 </pre>
    <p class="noindent">This command is the three-dimensional equivalent of the
@@ -1905,13 +1917,13 @@ Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.4 Polygons</h4>
 
-<p><a name="index-polygon-270"></a><strong>Syntax:</strong>
+<p><a name="index-polygon-271"></a><strong>Syntax:</strong>
 <pre class="example">     polygon[<var>options</var>] <var>point_list</var>
 </pre>
    <p class="noindent">This command is the three-dimensional equivalent of the
 <code>PSTricks</code> command <code>\pspolygon</code>.  The <code>sketch</code> hidden
 surface algorithm assumes that polygons are convex and planar. 
-<a name="index-polygon_002c-planar-271"></a><a name="index-planarity-of-polygons-272"></a>In practice, drawings may well turn out correctly even if these
+<a name="index-polygon_002c-planar-272"></a><a name="index-planarity-of-polygons-273"></a>In practice, drawings may well turn out correctly even if these
 assumptions are violated.
 
 <div class="node">
@@ -1925,30 +1937,53 @@ Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.5 Specials</h4>
 
-<p><a name="index-special-273"></a><strong>Syntax:</strong>
-<pre class="example">     special $<var>raw_text</var>$[lay=<var>lay_value</var>] <var>point_list</var>
+<p><a name="index-special-274"></a><strong>Syntax:</strong>
+<pre class="example">     special $<var>raw_text</var>$[<var>options</var>] <var>arg_list</var>
 </pre>
    <p class="noindent">Here <code>$</code>
-<a name="index-quoting_002c-special-274"></a>can be any character and is used to delimit the start
+<a name="index-quoting_002c-special-275"></a>can be any character and is used to delimit the start
 and end of <var>raw_text</var>.  The command embeds <var>raw_text</var> in the
 <code>sketch</code> output after performing substitutions as follows. 
-<a name="index-special-argument-substitution-275"></a><a name="index-argument_002c-special-276"></a>
+<a name="index-special-argument-substitution-276"></a><a name="index-argument_002c-special-277"></a>
      <ul>
-<li><code>#</code><var>i</var> where <var>i</var> is a positive integer is replaced by
-the <var>i</var>'th point in <var>point_list</var>. 
+<li><code>#</code><var>i</var> where <var>i</var> is a positive integer is replaced by the
+<var>i</var>'th value in <var>arg_list</var>.  Point and vector arguments become
+two-dimensional points, which are the transformed 3d arguments
+projected onto the <var>x</var>-<var>y</var> plane. This allows
+two-dimentional output elements such as labels to be easily positioned
+with respect to three-dimensional features in the drawing. Scalar
+arguments are subsituted directly. No transformation is applied. 
 <li><code>#{</code><var>i</var><code>}</code> is also replaced as above. 
+<li><code>#</code><var>i</var><code>'2</code> is replaced as above for points or vectors.  It is
+an error for the <var>i</var>'th argument to be a scalar. 
+<li><code>#</code><var>i</var><code>'x</code>, <code>#</code><var>i</var><code>'y</code>, or <code>#</code><var>i</var><code>'z</code> is
+replaced, respectively, by the scalar <var>x</var>, <var>y</var>, or
+<var>z</var>-coordinate of the argument point or vector. It is an error for
+the <var>i</var>'th argument to be a scalar. 
+<li><code>#</code><var>i</var><code>'3</code> is replaced by the three-dimensional
+transformed argument. Note that if a perspective transformation has
+been applied, the <var>z</var>-coordinate has little geometric
+significance, though it accurately indicates relative depth. 
 <li><code>#</code><var>i</var><code>-</code><var>j</var> where <var>i</var> and <var>j</var> are positive
 integers is replaced by a string <code>{</code><var>angle</var><code>}</code> where
 <var>angle</var> is the polar angle of a vector from the <var>i</var>'th point
-in <var>point_list</var> to the <var>j</var>'th. 
+in <var>point_list</var> to the <var>j</var>'th point projected into the
+x-y plane.  It is an error for the <var>i</var>'th or
+<var>j</var>'th argument to be a scalar or a vector. 
 <li><code>#{</code><var>i</var><code>-</code><var>j</var><code>}</code> is also replaced as above. 
 <li><code>##</code> is replaced with <code>#</code>. 
 </ul>
    The forms with braces <span class="samp">{ }</span> are useful when the argument is
-immediately followed by a digit that is part of the TeX code.
+immediately followed by a digit or a tick character that is part of
+the TeX code.
 
-   <p>The only useful option of <code>special</code> is <code>lay</code>. 
-<a name="index-lay-277"></a>See <a href="#Internal-options">Internal options</a>.
+   <p>The only useful option of <code>special</code> is <code>lay</code>, which
+determines if the substitued raw text is emitted before, after,
+or using the first point in <var>point_list</var> as an indicator
+of depth.  These occur, respectively, with <code>lay=under</code>,
+<code>lay=over</code>, and <code>lay=in</code>.  See <a href="#Special-objects">Special objects</a>
+and <a href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a> for examples. 
+<a name="index-lay-278"></a>See <a href="#Internal-options">Internal options</a>.
 
 <div class="node">
 <p><hr>
@@ -1961,16 +1996,16 @@ Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.6 Sweeps</h4>
 
-<p><a name="index-sweep-278"></a><strong>Syntax:</strong>
+<p><a name="index-sweep-279"></a><strong>Syntax:</strong>
 <pre class="example">     sweep { <var>n</var>, <var>T_1</var>, <var>T_2</var>, ..., <var>T_r</var> }[<var>options</var>] <var>swept_object</var>
      sweep { <var>n</var><>, <var>T_1</var>, <var>T_2</var>, ..., <var>T_r</var> }[<var>options</var>] <var>swept_object</var>
 </pre>
    <p class="noindent">The sweep connects <var>n</var> (or perhaps <var>n</var>+1) copies of
 <var>swept_object</var>
-<a name="index-swept-object-279"></a>in order to create a new object of higher
+<a name="index-swept-object-280"></a>in order to create a new object of higher
 dimension.  The <var>T_i</var> (for i between 1 and
 r) are transforms. 
-<a name="index-transform-280"></a>The k'th copy of <var>swept_object</var> is produced by applying the
+<a name="index-transform-281"></a>The k'th copy of <var>swept_object</var> is produced by applying the
 following transform to the original.
 <pre class="example">     <var>T_1</var>^k then <var>T_2</var>^k then ... then <var>T_r</var>^k
 </pre>
@@ -1981,7 +2016,7 @@ transform).
 
    <p>The method of connecting the copies depends on the type of
 <var>swept_object</var> and on whether the closure tag
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-281"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-282"></a><span class="samp"><></span> is present
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-282"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-283"></a><span class="samp"><></span> is present
 or not.
 
    <p>An example of a sweep where r=2 is the Mobius figure at
@@ -2006,16 +2041,16 @@ Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.2.6.1 Swept points</h5>
 
-<p><a name="index-swept-point-283"></a><a name="index-point-sweep-284"></a>If <var>swept_object</var> is a point list and there is no closure tag,
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-285"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-286"></a>then <code>sweep</code> connects <var>n</var>+1 successive copies of each
+<p><a name="index-swept-point-284"></a><a name="index-point-sweep-285"></a>If <var>swept_object</var> is a point list and there is no closure tag,
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-286"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-287"></a>then <code>sweep</code> connects <var>n</var>+1 successive copies of each
 point (including the original) with straight line segments to form a
 polyline.  If there are m points in the original point list,
-<a name="index-point-list-287"></a>then m polylines with <var>n</var> segments each are formed by the
+<a name="index-point-list-288"></a>then m polylines with <var>n</var> segments each are formed by the
 sweep.  In this manner, <code>sweep</code> forms a set of one-dimensional
 objects (polylines) from zero-dimensional ones (points).
 
    <p>When there <em>is</em> a closure tag,
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-288"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-289"></a><code>sweep</code> connects <var>n</var>
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-289"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-290"></a><code>sweep</code> connects <var>n</var>
 successive copies of each point (including the original) with straight
 line segments and finally connects the last copy back to the original
 to form a polygon with <var>n</var> sides.  If there are m points in
@@ -2025,7 +2060,7 @@ set of two-dimensional objects (polygons) from zero-dimensional ones
 (points).
 
    <p>Options
-<a name="index-options_002c-sweep-290"></a>of the <code>sweep</code> are copied directly to the resulting
+<a name="index-options_002c-sweep-291"></a>of the <code>sweep</code> are copied directly to the resulting
 polyline(s).
 
 <div class="node">
@@ -2039,21 +2074,21 @@ Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.2.6.2 Swept lines</h5>
 
-<p><a name="index-swept-line-291"></a><a name="index-line-sweep-292"></a>If <var>swept_object</var> is a polyline and there is no closure tag,
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-293"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-294"></a>then
+<p><a name="index-swept-line-292"></a><a name="index-line-sweep-293"></a>If <var>swept_object</var> is a polyline and there is no closure tag,
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-294"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-295"></a>then
 <code>sweep</code> connects <var>n</var>+1 successive copies of the
 polyline (including the original) with four-sided polygons, each pair
 of copies giving rise to a “polygon strip.”  If there are m
 points in the original polyline, then (m-1)<var>n</var> polygons are
 formed by the sweep.  We call these <dfn>body polygons</dfn>. 
-<a name="index-body-polygon-295"></a><a name="index-polygon_002c-body-296"></a>In this manner, <code>sweep</code> forms a
+<a name="index-body-polygon-296"></a><a name="index-polygon_002c-body-297"></a>In this manner, <code>sweep</code> forms a
 two-dimensional surface from from a one-dimensional polyline.
 
    <p>The order of vertices
-<a name="index-polygon-vertex-order-297"></a><a name="index-order_002c-polygon-vertex-298"></a>produced by <code>sweep</code> is important.  If a
+<a name="index-polygon-vertex-order-298"></a><a name="index-order_002c-polygon-vertex-299"></a>produced by <code>sweep</code> is important.  If a
 polygon's vertices do not appear in counter-clockwise order in the
 final image, the polygon will be culled
-<a name="index-culling-299"></a>(unless <code>cull=false</code> is
+<a name="index-culling-300"></a>(unless <code>cull=false</code> is
 set).  If the points in the k'th copy of the polyline are
 P_1, P_2, <small class="dots">...</small>, P_m, and the points in the
 next copy, the (k+1)st, are P_1', P_2', <small class="dots">...</small>,
@@ -2064,11 +2099,11 @@ P_m', then the vertex order of the generated polygons is
      Body polygon m-1: P_m P_m-1 P_m-1' P_m'
 </pre>
    <p>Options of unclosed line sweeps
-<a name="index-options_002c-sweep-300"></a>are copied to each output polygon. 
+<a name="index-options_002c-sweep-301"></a>are copied to each output polygon. 
 Options of the swept line are ignored. 
-<a name="index-options_002c-swept-object-301"></a>
+<a name="index-options_002c-swept-object-302"></a>
 When there <em>is</em> a closure tag,
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-302"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-303"></a>then <code>sweep</code> connects <var>n</var>
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-303"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-304"></a>then <code>sweep</code> connects <var>n</var>
 successive copies of the polyline (including the original) with
 four-sided body polygons just as the case with no closure tag.  It then
 connects the last copy back to the original to form a ribbon-shaped
@@ -2079,9 +2114,9 @@ closed surface that, depending on the sweep transforms, may
 represent the boundary of a solid.  In this manner, <code>sweep</code> forms
 the boundary of a three-dimensional object from a one-dimensional
 polyline.  We call these hole-filling polygons <dfn>ends</dfn>. 
-<a name="index-end-polygon-304"></a><a name="index-polygon_002c-end-305"></a>
+<a name="index-end-polygon-305"></a><a name="index-polygon_002c-end-306"></a>
 The order of vertices of end polygons
-<a name="index-polygon-vertex-order-306"></a><a name="index-order_002c-polygon-vertex-307"></a>is important for correct culling
+<a name="index-polygon-vertex-order-307"></a><a name="index-order_002c-polygon-vertex-308"></a>is important for correct culling
 as described above.  If P_1^1, P_1^2, <small class="dots">...</small>,
 P_1^n are the <var>n</var> copies of the first polyline point and
 P_m^1, P_m^2, <small class="dots">...</small> ,P_m^n are the <var>n</var>
@@ -2091,9 +2126,9 @@ is
      End polygon 2: P_m^1, P_m^2, <small class="dots">...</small> ,P_m^n
 </pre>
    <p>If there are no options on the swept line,
-<a name="index-options_002c-swept-object-308"></a>then the <span class="samp">sweep</span>
+<a name="index-options_002c-swept-object-309"></a>then the <span class="samp">sweep</span>
 options
-<a name="index-options_002c-sweep-309"></a>are copied to each output polygon.  If the swept line does
+<a name="index-options_002c-sweep-310"></a>are copied to each output polygon.  If the swept line does
 have options, these are copied to corresponding body polygons; the
 sweep options are copied to the end polygons.  In this manner, body
 and ends may be drawn with different characteristics such as
@@ -2110,22 +2145,22 @@ Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.2.6.3 Swept polygons</h5>
 
-<p><a name="index-polygon-sweep-310"></a>If <var>swept_object</var> is a polygon, the <code>sweep</code> connects
+<p><a name="index-polygon-sweep-311"></a>If <var>swept_object</var> is a polygon, the <code>sweep</code> connects
 <var>n</var>+1 successive copies of the closed polyline border of
 the polygon to form body polygons exactly as though the border were a
 swept polyline as described in <a href="#Swept-lines">Swept lines</a>. 
-<a name="index-body-polygon-311"></a><a name="index-polygon_002c-body-312"></a>If there are m points in the
+<a name="index-body-polygon-312"></a><a name="index-polygon_002c-body-313"></a>If there are m points in the
 original polygon, then m<var>n</var> body polygons are formed by
 this sweep.  The body polygons form an <dfn>extrusion</dfn> of the boundary of the
 original polygon with two holes at the open ends.
 
    <p>Finally, the sweep adds two copies of the original polygon to cover
 the holes.  We call these hole-filling polygons <dfn>ends</dfn>. 
-<a name="index-end-polygon-313"></a><a name="index-polygon_002c-end-314"></a>In this manner, <code>sweep</code> forms the boundary of a three-dimensional
+<a name="index-end-polygon-314"></a><a name="index-polygon_002c-end-315"></a>In this manner, <code>sweep</code> forms the boundary of a three-dimensional
 object from a two-dimensional polygon.
 
    <p>The order of vertices
-<a name="index-polygon-vertex-order-315"></a><a name="index-order_002c-polygon-vertex-316"></a>of end polygons is important for correct culling as described above. 
+<a name="index-polygon-vertex-order-316"></a><a name="index-order_002c-polygon-vertex-317"></a>of end polygons is important for correct culling as described above. 
 An exact copy of the original polygon with vertex order intact forms
 the first end polygon.  The other end polygon results from
 transforming and the reversing the order of vertices in the original. 
@@ -2150,11 +2185,11 @@ Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.2.6.4 Swept blocks</h5>
 
-<p><a name="index-swept-bock-317"></a><a name="index-block-sweep-318"></a>The swept object <var>swept_object</var> may also be any collection of
+<p><a name="index-swept-bock-318"></a><a name="index-block-sweep-319"></a>The swept object <var>swept_object</var> may also be any collection of
 polylines and polygons.  This may be a block
-<a name="index-block-319"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-320"></a>composed of <code>line</code>
-<a name="index-line-321"></a>and/or <code>polygon</code>
-<a name="index-polygon-322"></a>commands in braces
+<a name="index-block-320"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-321"></a>composed of <code>line</code>
+<a name="index-line-322"></a>and/or <code>polygon</code>
+<a name="index-polygon-323"></a>commands in braces
 <span class="samp">{ }</span>, or it may be the result of a <code>repeat</code>, another
 <code>sweep</code>, etc.  The sweep acts independently on each object in the
 block exactly as if it were a single swept object described above in
@@ -2172,12 +2207,12 @@ Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a>
 
 <p>Before sending each four-sided body polygon of a <code>sweep</code>
 to the output, <code>sketch</code> tests to see if it is roughly planar. 
-<a name="index-polygon_002c-planar-323"></a><a name="index-planarity-of-polygons-324"></a>Since planarity is necessary for proper functioning of the hidden
+<a name="index-polygon_002c-planar-324"></a><a name="index-planarity-of-polygons-325"></a>Since planarity is necessary for proper functioning of the hidden
 surface algorithm, “warped” polygons are automatically split into
 two triangles.
 
    <p>Hole-filling polygons produced by closure-tagged
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-325"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-326"></a>line sweeps are not
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-326"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-327"></a>line sweeps are not
 split.  Nor are original polygons in polygon sweeps.  It is the user's
 responsibility to ensure these are planar.
 
@@ -2192,7 +2227,7 @@ Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.7 Blocks</h4>
 
-<p><a name="index-block-327"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-328"></a>Any sequence of drawables may be grouped in a <dfn>block</dfn> merely by
+<p><a name="index-block-328"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-329"></a>Any sequence of drawables may be grouped in a <dfn>block</dfn> merely by
 enclosing them in braces <span class="samp">{ }</span>.  A block is itself drawable.  A
 key use of blocks is to extend the effect of a single <code>def</code>,
 <a href="#Definitions">Definitions</a>, <code>put</code> <a href="#Puts">Puts</a>, <code>sweep</code> <a href="#Sweeps">Sweeps</a>,
@@ -2201,7 +2236,7 @@ one.
 
    <p>Definitions (See <a href="#Definitions">Definitions</a>.) inside a block have <dfn>lexical
 scope</dfn>
-<a name="index-lexical-scope-329"></a><a name="index-scope_002c-identifier-330"></a>extending from the place of definition to the end of the block.
+<a name="index-lexical-scope-330"></a><a name="index-scope_002c-identifier-331"></a>extending from the place of definition to the end of the block.
 
 <div class="node">
 <p><hr>
@@ -2214,12 +2249,12 @@ Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.8 Repeats</h4>
 
-<p><a name="index-repeat-331"></a><a name="index-repeated-object-332"></a><strong>Syntax:</strong>
+<p><a name="index-repeat-332"></a><a name="index-repeated-object-333"></a><strong>Syntax:</strong>
 <pre class="example">     repeat { <var>n</var>, <var>T_1</var>, <var>T_2</var>, ..., <var>T_r</var> } <var>repeated_object</var>
 </pre>
    <p class="noindent">The repeat makes <var>n</var> transformed copies of <var>repeated_object</var>
 (including the original).  The <var>T_i</var> are transforms. 
-<a name="index-transform-333"></a>The k'th copy of the <var>repeated_object</var> (for
+<a name="index-transform-334"></a>The k'th copy of the <var>repeated_object</var> (for
 k=0,1,...,n-1) is produced in the
 same manner as for <code>sweep</code>s described in <a href="#Sweeps">Sweeps</a>.  This is
 repeated here (no pun intended) for convenience.  To make the
@@ -2240,7 +2275,7 @@ Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.9 Puts</h4>
 
-<p><a name="index-put-334"></a><strong>Syntax:</strong>
+<p><a name="index-put-335"></a><strong>Syntax:</strong>
 <pre class="example">     put { <var>T</var> } <var>put_object</var>
 </pre>
    <p class="noindent">Put merely applies transform <var>T</var> to the drawable <var>put_object</var>.
@@ -2256,7 +2291,7 @@ Up: <a rel="up" accesskey="u" href="#Input-language">Input language</a>
 <!-- node-name,  next,  previous,  up -->
 <h3 class="section">3.3 Definitions</h3>
 
-<p><a name="index-definition-335"></a>Definitions give names to <code>sketch</code> objects.  Definitions alone
+<p><a name="index-definition-336"></a>Definitions give names to <code>sketch</code> objects.  Definitions alone
 are benign.  A <code>sketch</code> input file consisting entirely of
 definitions will generate no drawing.  Only when definitions are
 <dfn>referenced</dfn> do they potentially lead to ink on the drawing.
@@ -2269,7 +2304,7 @@ that could not be re-written without them.
 expression (scalar, point, vector, or transform), any drawable
 object (dots, line, curve, polygon, block, sweep, put, repeat, or
 special), and option strings.  In addition, <dfn>tag definitions</dfn>,
-<a name="index-definition_002c-tag-336"></a><a name="index-tag-definition-337"></a>which have no associated object at all, allow the meaning of other
+<a name="index-definition_002c-tag-337"></a><a name="index-tag-definition-338"></a>which have no associated object at all, allow the meaning of other
 definitions to be selected from a set of alternatives. Since tags may
 be defined (and undefined) in the command line of <code>sketch</code>, they
 can be an aid in the script-driven preparation of documents.
@@ -2291,9 +2326,9 @@ Up: <a rel="up" accesskey="u" href="#Definitions">Definitions</a>
 <h4 class="subsection">3.3.1 Forms of definitions</h4>
 
 <p>Definitions have three possible forms, <dfn>simple</dfn>,
-<a name="index-simple-definition-338"></a><a name="index-definition_002c-simple-339"></a><dfn>with alternatives</dfn>,
-<a name="index-definition-with-alternatives-340"></a><a name="index-alternatives_002c-definition-341"></a>and <dfn>tag</dfn>
-<a name="index-tag-definition-342"></a><a name="index-definition_002c-tag-343"></a>as shown here in order.
+<a name="index-simple-definition-339"></a><a name="index-definition_002c-simple-340"></a><dfn>with alternatives</dfn>,
+<a name="index-definition-with-alternatives-341"></a><a name="index-alternatives_002c-definition-342"></a>and <dfn>tag</dfn>
+<a name="index-tag-definition-343"></a><a name="index-definition_002c-tag-344"></a>as shown here in order.
 
 <p class="noindent"><strong>Syntax:</strong>
 <pre class="example">     def <var>id</var> <var>object</var>  % simple def
@@ -2309,7 +2344,7 @@ identifier <var>id</var>.
    <p>The definition with alternatives associates
 <var>object_i</var> with <var>id</var>, where <var>tag_i</var> is the
 first defined tag in the list of alternative tag references. 
-<a name="index-tag-reference-344"></a><a name="index-reference_002c-tag-345"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-346"></a>If no tag in the list is defined, then <var>default_object</var> is
+<a name="index-tag-reference-345"></a><a name="index-reference_002c-tag-346"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-347"></a>If no tag in the list is defined, then <var>default_object</var> is
 associated with identifier <var>id</var>.
 
    <p>The final form defines <var>id</var> as a tag.  Another way to define a tag
@@ -2332,13 +2367,13 @@ this mechanism is, again, to make <code>sketch</code> input files more
 readable.
    <p><table summary=""><tr align="left"><th valign="top">Type  </th><th valign="top">Reference
 <br></th></tr><tr align="left"><td valign="top">scalar    </td><td valign="top"><var>id</var>
-<a name="index-scalar-reference-347"></a><a name="index-reference_002c-scalar-348"></a><br></td></tr><tr align="left"><td valign="top">point     </td><td valign="top"><code>(</code><var>id</var><code>)</code>
-<a name="index-point-reference-349"></a><a name="index-reference_002c-point-350"></a><a name="index-_0028foo_0029_0040r_007b_002c-point-reference_007d-351"></a><br></td></tr><tr align="left"><td valign="top">vector    </td><td valign="top"><code>[</code><var>id</var><code>]</code>
-<a name="index-vector-reference-352"></a><a name="index-reference_002c-vector-353"></a><a name="index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-354"></a><br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>[[</code><var>id</var><code>]]</code>
-<a name="index-transform-reference-355"></a><a name="index-reference_002c-transform-356"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-357"></a><br></td></tr><tr align="left"><td valign="top">drawable  </td><td valign="top"><code>{</code><var>id</var><code>}</code>
-<a name="index-drawable-reference-358"></a><a name="index-reference_002c-drawable-359"></a><a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-360"></a><br></td></tr><tr align="left"><td valign="top">options   </td><td valign="top"><code>[</code><var>id</var><code>]</code> or <code>[</code><var>id1</var><code>,...,</code><var>idN</var><code>]</code>
-<a name="index-options-reference-361"></a><a name="index-reference_002c-options-362"></a><a name="index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-363"></a><a name="index-options-multiple-reference-364"></a><a name="index-reference_002c-multiple-options-365"></a><a name="index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-366"></a><br></td></tr><tr align="left"><td valign="top">tag       </td><td valign="top"><code><</code><var>id</var><code>></code>
-<a name="index-tag-reference-367"></a><a name="index-reference_002c-tag-368"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-369"></a>
+<a name="index-scalar-reference-348"></a><a name="index-reference_002c-scalar-349"></a><br></td></tr><tr align="left"><td valign="top">point     </td><td valign="top"><code>(</code><var>id</var><code>)</code>
+<a name="index-point-reference-350"></a><a name="index-reference_002c-point-351"></a><a name="index-_0028foo_0029_0040r_007b_002c-point-reference_007d-352"></a><br></td></tr><tr align="left"><td valign="top">vector    </td><td valign="top"><code>[</code><var>id</var><code>]</code>
+<a name="index-vector-reference-353"></a><a name="index-reference_002c-vector-354"></a><a name="index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-355"></a><br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>[[</code><var>id</var><code>]]</code>
+<a name="index-transform-reference-356"></a><a name="index-reference_002c-transform-357"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-358"></a><br></td></tr><tr align="left"><td valign="top">drawable  </td><td valign="top"><code>{</code><var>id</var><code>}</code>
+<a name="index-drawable-reference-359"></a><a name="index-reference_002c-drawable-360"></a><a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-361"></a><br></td></tr><tr align="left"><td valign="top">options   </td><td valign="top"><code>[</code><var>id</var><code>]</code> or <code>[</code><var>id1</var><code>,...,</code><var>idN</var><code>]</code>
+<a name="index-options-reference-362"></a><a name="index-reference_002c-options-363"></a><a name="index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-364"></a><a name="index-options-multiple-reference-365"></a><a name="index-reference_002c-multiple-options-366"></a><a name="index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-367"></a><br></td></tr><tr align="left"><td valign="top">tag       </td><td valign="top"><code><</code><var>id</var><code>></code>
+<a name="index-tag-reference-368"></a><a name="index-reference_002c-tag-369"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-370"></a>
    <br></td></tr></table>
    <pre class="sp">
 
@@ -2366,7 +2401,7 @@ that previous definitions at the top level (not nested inside
 blocks) are also available.
 
 <p class="noindent"><strong>Syntax:</strong>
-<a name="index-global-370"></a>
+<a name="index-global-371"></a>
 <pre class="example">     global { <var>environment_settings</var> }
 </pre>
    <p class="noindent">The contents of <var>environment_settings</var> are discussed in the
@@ -2391,7 +2426,7 @@ Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.1 Global options</h4>
 
-<p><a name="index-options_002c-global-371"></a><a name="index-global-options-372"></a><a name="index-set-373"></a><strong>Syntax:</strong>
+<p><a name="index-options_002c-global-372"></a><a name="index-global-options-373"></a><a name="index-set-374"></a><strong>Syntax:</strong>
 <pre class="example">     set [ <var>options</var> ]
 </pre>
    <p class="noindent">The contents of <var>options</var>, except for <code>sketch</code> internal
@@ -2400,9 +2435,9 @@ anything else in the output file.  This is a good place to set
 <code>unit</code>, a default <code>linewidth</code>, etc.
 
    <p>Internal options
-<a name="index-options_002c-internal-374"></a><a name="index-internal-options-375"></a>work on all objects where they make sense. 
+<a name="index-options_002c-internal-375"></a><a name="index-internal-options-376"></a>work on all objects where they make sense. 
 This includes
-<a name="index-cull-376"></a><a name="index-split-377"></a><a name="index-lay-378"></a><code>cull</code> and <code>split</code> (but not <code>lay</code>). 
+<a name="index-cull-377"></a><a name="index-split-378"></a><a name="index-lay-379"></a><code>cull</code> and <code>split</code> (but not <code>lay</code>). 
 See <a href="#Internal-options">Internal options</a>.
 
 <div class="node">
@@ -2416,8 +2451,8 @@ Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.2 Camera</h4>
 
-<p><a name="index-camera-379"></a><strong>Syntax:</strong>
-<a name="index-camera-380"></a>
+<p><a name="index-camera-380"></a><strong>Syntax:</strong>
+<a name="index-camera-381"></a>
 <pre class="example">     camera <var>transform_expression</var>
 </pre>
    <p>The <var>transform_expression</var> is applied after all other
@@ -2436,25 +2471,25 @@ Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.3 Picture box</h4>
 
-<p><a name="index-picture-box-381"></a><strong>Syntax:</strong>
-<a name="index-picturebox-382"></a>
+<p><a name="index-picture-box-382"></a><strong>Syntax:</strong>
+<a name="index-picturebox-383"></a>
 <pre class="example">     picturebox[<var>baseline</var>]
      picturebox[<var>baseline</var>] (<var>p1</var>)(<var>p2</var>)
 </pre>
    <p class="noindent">The first form of <code>picturebox</code> causes a scalar <var>baseline</var>
 fraction to be emitted in the <code>pspicture</code>
-<a name="index-_0040code_007bpspicture_007d-383"></a><a name="index-baseline-fraction-384"></a>environment of the output.  See
+<a name="index-_0040code_007bpspicture_007d-384"></a><a name="index-baseline-fraction-385"></a>environment of the output.  See
 <code>PSTricks</code> documentation for <code>pspicture</code>.
 
    <p>In the second form, the <var>baseline</var> fraction is optional, and the
 two points that follow define the diagonal of a three-dimensional
 bounding box
-<a name="index-bounding-box-385"></a>for the completed scene.  The parallel projection
-<a name="index-parallel-projection-386"></a><a name="index-projection_002c-parallel-387"></a>of the bounding box
+<a name="index-bounding-box-386"></a>for the completed scene.  The parallel projection
+<a name="index-parallel-projection-387"></a><a name="index-projection_002c-parallel-388"></a>of the bounding box
 determines the corners of the drawing's <code>pspicture*</code> environment,
 which is used in place of <code>pspicture</code>.  This causes PostScript to
 clip
-<a name="index-clipping-388"></a>the final drawing to the bounding box in 2d.  If there is a
+<a name="index-clipping-389"></a>the final drawing to the bounding box in 2d.  If there is a
 <code>camera</code> specified, the camera tranformation is applied to the
 bounding box, and the <code>pspicture</code> is set just large
 enough to include the transformed box.
@@ -2473,19 +2508,19 @@ Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.4 Frame</h4>
 
-<p><a name="index-frame-box-389"></a><strong>Syntax:</strong>
-<a name="index-frame-390"></a>
+<p><a name="index-frame-box-390"></a><strong>Syntax:</strong>
+<a name="index-frame-391"></a>
 <pre class="example">     frame [<var>options</var>]
 </pre>
    <p class="noindent">Causes a <tt>\psframebox</tt>
-<a name="index-_0040code_007bpsframebox_007d-391"></a>to surround the <code>pspicture</code>
+<a name="index-_0040code_007bpsframebox_007d-392"></a>to surround the <code>pspicture</code>
 environment in the output.  If <var>options</var> are present, they are
 copied as-is.  Normally one would want to set
-<a name="index-linewidth-392"></a><code>linewidth</code>,
-<a name="index-linestyle-393"></a><code>linestyle</code>,
-<a name="index-linecolor-394"></a><code>linecolor</code>, etc. 
+<a name="index-linewidth-393"></a><code>linewidth</code>,
+<a name="index-linestyle-394"></a><code>linestyle</code>,
+<a name="index-linecolor-395"></a><code>linecolor</code>, etc. 
 If omitted, then
-<a name="index-framesep-395"></a><code>framesep=0pt</code> is
+<a name="index-framesep-396"></a><code>framesep=0pt</code> is
 added so that the frame tightly hugs the <code>pspicture</code>.
 
 <div class="node">
@@ -2498,14 +2533,14 @@ Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.5 Language</h4>
 
-<p><a name="index-language_002c-output-396"></a><a name="index-output-language-397"></a><a name="index-language-398"></a>
+<p><a name="index-language_002c-output-397"></a><a name="index-output-language-398"></a><a name="index-language-399"></a>
 <pre class="example">     language tikz
      language tikz, context
      language pstricks
      language pstricks, latex
 </pre>
    <p class="noindent">Sets the output language generated by <code>sketch</code>. 
-<a name="index-pstricks-399"></a><a name="index-tikz-400"></a>The set of options understood by sketch also changes.  For example,
+<a name="index-pstricks-400"></a><a name="index-tikz-401"></a>The set of options understood by sketch also changes.  For example,
 the <code>PSTricks</code> option <code>linewidth</code> will not be properly
 handled if <code>language</code> is set to <code>tikz</code>.  Similarly, the
 <code>TikZ</code> option <code>line style</code> (note the space) will not be
@@ -2514,9 +2549,9 @@ language is specified, the default <code>pstricks</code> is used.
 
    <p>An optional comma followed by
 <code>latex</code>
-<a name="index-latex-401"></a>or
+<a name="index-latex-402"></a>or
 <code>context</code>
-<a name="index-context-402"></a>specifies the macro package that the output should assume.  This
+<a name="index-context-403"></a>specifies the macro package that the output should assume.  This
 affects the <code>picture</code> environment commands emitted and the
 document template used with the <span class="option">-T</span> option. See <a href="#Command-line">Command line</a>.  Note that at the time this manual was generated,
 <code>PSTricks</code> was not supported by LaTeX or by <code>ConTeXt</code>.
@@ -2534,7 +2569,7 @@ Up: <a rel="up" accesskey="u" href="#Top">Top</a>
 
 <p>Successful drawings with <code>sketch</code> and with any scene description
 language
-<a name="index-scene-description-language-403"></a>require that the user develop an accurate mental picture of her code
+<a name="index-scene-description-language-404"></a>require that the user develop an accurate mental picture of her code
 and its meaning.  This image is best built in small pieces. 
 Therefore, <code>sketch</code> inputs are best created in small increments
 with frequent pauses to compile and view the results.  Careful
@@ -2560,13 +2595,13 @@ Up: <a rel="up" accesskey="u" href="#Building-a-drawing">Building a drawing
 
 <p>As an overview, let's develop a diagram that shows how a perspective
 projection transform
-<a name="index-perspective-projection-404"></a><a name="index-transform-405"></a><a name="index-projection_002c-perspective-406"></a>works.  We'll start with the traditional reference object
+<a name="index-perspective-projection-405"></a><a name="index-transform-406"></a><a name="index-projection_002c-perspective-407"></a>works.  We'll start with the traditional reference object
 used in computer graphics textbooks, a house-shaped prism.  Begin
 by defining the points of the house.  Rather than defining the faces
 of the house as polygons and transforming those, we are going to
 transform the points themselves with <code>sketch</code> arithmetic so that
 we have names for the transformed points later. 
-<a name="index-def-407"></a>
+<a name="index-def-408"></a>
 <pre class="verbatim">
   % right side (outside to right)
   def R1 (1,1,1) def R2 (1,-1,1) def R3 (1,-1,-1) def R4 (1,1,-1)
@@ -2596,11 +2631,11 @@ transform of the originals.
   def pD4 [[hp]]*(D4) 
 </pre>
 Note the use of a <dfn>transform definition</dfn>
-<a name="index-transform-definition-408"></a><a name="index-definition_002c-transform-409"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-410"></a>and
+<a name="index-transform-definition-409"></a><a name="index-definition_002c-transform-410"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-411"></a>and
 <dfn>transform references</dfn>. 
-<a name="index-transform-reference-411"></a><a name="index-reference_002c-transform-412"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-413"></a>Now define the seven polygonal faces of the house and the door using
+<a name="index-transform-reference-412"></a><a name="index-reference_002c-transform-413"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-414"></a>Now define the seven polygonal faces of the house and the door using
 the transformed points as vertices.  Be careful with vertex order! 
-<a name="index-polygon-vertex-order-414"></a><a name="index-order_002c-polygon-vertex-415"></a><a name="index-fillcolor-416"></a><a name="index-def-417"></a><a name="index-polygon-418"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-419"></a>
+<a name="index-polygon-vertex-order-415"></a><a name="index-order_002c-polygon-vertex-416"></a><a name="index-fillcolor-417"></a><a name="index-def-418"></a><a name="index-polygon-419"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-420"></a>
 <pre class="verbatim">
   def rgt polygon (pR1)(pR2)(pR3)(pR4)(pR5)
   def lft polygon (pL5)(pL4)(pL3)(pL2)(pL1)
@@ -2613,7 +2648,7 @@ the transformed points as vertices.  Be careful with vertex order!
   def house { {rgt}{lft}{frt}{bck}{tfr}{tbk}{bot}{door} }
 </pre>
 Time for a sanity check.  Add the line
-<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-420"></a><a name="index-reference_002c-drawable-421"></a>
+<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-421"></a><a name="index-reference_002c-drawable-422"></a>
 <pre class="verbatim">
   {house}
 </pre>
@@ -2624,10 +2659,10 @@ and this is what we get.
 <p class="noindent">This is correct, but does not reveal very much.  Common errors are
 misplaced vertices and polygons missing entirely due to incorrect
 vertex order. 
-<a name="index-polygon-vertex-order-422"></a><a name="index-order_002c-polygon-vertex-423"></a>To rule these out, let's inspect all sides of the
+<a name="index-polygon-vertex-order-423"></a><a name="index-order_002c-polygon-vertex-424"></a>To rule these out, let's inspect all sides of the
 house. This is not hard. Merely replace the reference
 <tt>{house}</tt> with a <code>repeat</code>. See <a href="#Repeats">Repeats</a>. 
-<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-424"></a><a name="index-reference_002c-drawable-425"></a><a name="index-repeat-426"></a><a name="index-rotate-427"></a><a name="index-translate-428"></a>
+<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-425"></a><a name="index-reference_002c-drawable-426"></a><a name="index-repeat-427"></a><a name="index-rotate-428"></a><a name="index-translate-429"></a>
 <pre class="verbatim">
   repeat { 13, rotate(30, [1,2,3]), translate([3,0,0]) } {house}
 </pre>
@@ -2642,7 +2677,7 @@ a plane with rays passing through the origin.  Begin by positioning the
 house twelve units back on the negative z-axis and adding a set
 of coordinate axes.  To move the house we need only change the “house
 positioning” transform defined earlier. 
-<a name="index-def-429"></a><a name="index-rotate-430"></a><a name="index-translate-431"></a><a name="index-arrows-432"></a><a name="index-linewidth-433"></a><a name="index-linecolor-434"></a><a name="index-linestyle-435"></a><a name="index-special-436"></a><a name="index-line-437"></a>
+<a name="index-def-430"></a><a name="index-rotate-431"></a><a name="index-translate-432"></a><a name="index-arrows-433"></a><a name="index-linewidth-434"></a><a name="index-linecolor-435"></a><a name="index-linestyle-436"></a><a name="index-special-437"></a><a name="index-line-438"></a>
 <pre class="verbatim">
   def hp rotate(-40, [0,1,0]) then translate([0,0,-12])
   def axes {
@@ -2657,7 +2692,7 @@ positioning” transform defined earlier.
 
    <p>Time for another test.  Let's build a real view transform,
 creating a <dfn>virtual camera</dfn>
-<a name="index-virtual-camera-438"></a>to look at the scene we are constructing.  Replace the <code>repeat</code>
+<a name="index-virtual-camera-439"></a>to look at the scene we are constructing.  Replace the <code>repeat</code>
 with
 <pre class="verbatim">
   def eye (10,4,10)
@@ -2772,7 +2807,7 @@ pictures we will produce.
 
    <p>The cone shape is just a swept line with no closure tag and culling
 turned off.  Begin by setting up some useful constants. 
-<a name="index-def-439"></a><a name="index-rotate-440"></a>
+<a name="index-def-440"></a><a name="index-rotate-441"></a>
 <pre class="verbatim">
   def O (0,0,0) def I [1,0,0] def J [0,1,0] def K [0,0,1]
   def p0 (1,2) def p1 (1.5,0) def N 8
@@ -2781,7 +2816,7 @@ turned off.  Begin by setting up some useful constants.
 The points <code>p0</code> and <code>p1</code> are the end points of the line to
 be swept.  The definition <code>seg_rot</code> is the sweep transformation. 
 With these, the cone itself is simple. 
-<a name="index-sweep-441"></a><a name="index-cull-442"></a><a name="index-line-443"></a><a name="index-swept-line-444"></a><a name="index-line-sweep-445"></a>
+<a name="index-sweep-442"></a><a name="index-cull-443"></a><a name="index-line-444"></a><a name="index-swept-line-445"></a><a name="index-line-sweep-446"></a>
 <pre class="verbatim">
   sweep[cull=false] { N, [[seg_rot]] } line(p0)(p1)
 </pre>
@@ -2789,10 +2824,10 @@ With these, the cone itself is simple.
    <p>The axes are next and include an interesing trick that shows the
 hidden parts as dotted lines.  The secret is draw the axes
 twice—solid lines with the normal
-<a name="index-hidden-surface-algorithm-446"></a>hidden surface algorithm in effect, and then dotted with the
+<a name="index-hidden-surface-algorithm-447"></a>hidden surface algorithm in effect, and then dotted with the
 option
-<a name="index-lay-447"></a><code>lay=over</code> so that no polygons can hide them. 
-<a name="index-def-448"></a><a name="index-line-449"></a><a name="index-arrows-450"></a><a name="index-linewidth-451"></a><a name="index-lay-452"></a><a name="index-linestyle-453"></a><a name="index-special-454"></a>
+<a name="index-lay-448"></a><code>lay=over</code> so that no polygons can hide them. 
+<a name="index-def-449"></a><a name="index-line-450"></a><a name="index-arrows-451"></a><a name="index-linewidth-452"></a><a name="index-lay-453"></a><a name="index-linestyle-454"></a><a name="index-special-455"></a>
 <pre class="verbatim">
   def ax (dx,0,0) % tips of the axes
   def ay (0,dy,0)
@@ -2807,11 +2842,11 @@ option
     (ax)(ay)(az)
 </pre>
 The labels are applied with <code>PSTricks</code> special objects
-<a name="index-special-objects-455"></a>as usual.
+<a name="index-special-objects-456"></a>as usual.
 
    <p>For the height dimension mark, the power of affine
-<a name="index-affine-arithmetic-456"></a>arithetic is very helpful. 
-<a name="index-def-457"></a><a name="index-unit-458"></a><a name="index-scale-459"></a><a name="index-line-460"></a><a name="index-special-461"></a>
+<a name="index-affine-arithmetic-457"></a>arithetic is very helpful. 
+<a name="index-def-458"></a><a name="index-unit-459"></a><a name="index-scale-460"></a><a name="index-line-461"></a><a name="index-special-462"></a>
 <pre class="verbatim">
   def hdim_ref unit((p1) - (O)) then [[seg_rot]]^2
   def c0 (p0) then scale([J])
@@ -2837,11 +2872,11 @@ location of the height dimension lines by varying the exponent of
 <code>[[seg_rot]]</code>.  This is only one of many possible strategies.
 
    <p>The computation of <code>hm2</code> is a useful idiom for finding the
-<a name="index-centroid-462"></a>centroid of a set of points.
+<a name="index-centroid-463"></a>centroid of a set of points.
 
    <p>The two radius marks are done similarly, so we present the code
 without comment. 
-<a name="index-def-463"></a><a name="index-line-464"></a><a name="index-special-465"></a><a name="index-scale-466"></a><a name="index-arrows-467"></a>
+<a name="index-def-464"></a><a name="index-line-465"></a><a name="index-special-466"></a><a name="index-scale-467"></a><a name="index-arrows-468"></a>
 <pre class="verbatim">
   % radius measurement marks
   def gap [0,.2,0]  % used to create small vertical gaps
@@ -2871,7 +2906,7 @@ without comment.
 
    <p>The second drawing uses the same techniques.  Only the method for
 drawing the elliptical arc is new.  Here is the code. 
-<a name="index-def-468"></a><a name="index-special-469"></a><a name="index-lay-470"></a>
+<a name="index-def-469"></a><a name="index-special-470"></a><a name="index-lay-471"></a>
 <pre class="verbatim">
   def mid ((p00)-(O)+(p10)-(O)+(p11)-(O)+(p01)-(O))/4+(O)
   special|\rput#1{\pscustom{
@@ -2882,7 +2917,7 @@ drawing the elliptical arc is new.  Here is the code.
 We could have swept a point to make the arc with <code>sketch</code>, but
 using a <code>PSTricks</code> custom graphic was simpler.  Again we computed
 the
-<a name="index-centroid-471"></a>centroid of the quadrilateral by averaging points.  Note that scaling
+<a name="index-centroid-472"></a>centroid of the quadrilateral by averaging points.  Note that scaling
 in Postscript distorts the arrowhead, but in this case the distortion
 actually looks better in the projection of the slanted face.  A
 <code>sketch</code> arrowhead would not have been distorted.
@@ -2902,12 +2937,12 @@ Up: <a rel="up" accesskey="u" href="#Building-a-drawing">Building a drawing
 <!-- node-name,  next,  previous,  up -->
 <h3 class="section">4.3 A hierarchical model</h3>
 
-<p><a name="index-hierarchical-model-472"></a>While <code>sketch</code> was never meant to be a geometric modeling
+<p><a name="index-hierarchical-model-473"></a>While <code>sketch</code> was never meant to be a geometric modeling
 language, it comes fairly close.  The following example puts all we
 have seen to work in a very simple model of the human hand.  Start by
 sweeping a line to make a truncated cone, which will be copied over
 and over again to make the segments of fingers. 
-<a name="index-def-473"></a><a name="index-sweep-474"></a><a name="index-rotate-475"></a><a name="index-line-476"></a>
+<a name="index-def-474"></a><a name="index-sweep-475"></a><a name="index-rotate-476"></a><a name="index-line-477"></a>
 <pre class="verbatim">
   def O (0,0,0) % origin
   def I [1,0,0] def J [0,1,0] def K [0,0,1] % canonical unit vectors
@@ -2923,7 +2958,7 @@ constants.  You can find them in <span class="file">hand.sk</span>, which is pro
 in the <code>sketch</code> distribution.
 
    <p>We also need a prototypical sphere to use for the joints themselves. 
-<a name="index-def-477"></a><a name="index-sweep-478"></a><a name="index-rotate-479"></a>
+<a name="index-def-478"></a><a name="index-sweep-479"></a><a name="index-rotate-480"></a>
 <pre class="verbatim">
   def joint_sphere {
     def n_joint_faces 8
@@ -2936,7 +2971,7 @@ in the <code>sketch</code> distribution.
    <p>We'll now design the index finger (number <!-- /@w -->1 in our notational
 convention; finger <!-- /@w -->0 is the thumb).  The distal rotation for the
 finger applies only to the tip, so we define the following. 
-<a name="index-def-480"></a><a name="index-put-481"></a><a name="index-translate-482"></a><a name="index-rotate-483"></a><a name="index-scale-484"></a>
+<a name="index-def-481"></a><a name="index-put-482"></a><a name="index-translate-483"></a><a name="index-rotate-484"></a><a name="index-scale-485"></a>
 <pre class="verbatim">
   def distal_1 {
     put { translate(joint_gap * joint_rad * [J]) 
@@ -2954,9 +2989,9 @@ The identifiers here are for size and location constants. The
 exception is <code>distal_rot_1</code>.  This rotation parameter models the
 flexing of the finger tip.  The first <code>put</code> makes a copy of the
 finger segment that is translated upward
-<a name="index-translation-transform-485"></a><a name="index-transform_002c-translation-486"></a>just far enough to make room
+<a name="index-translation-transform-486"></a><a name="index-transform_002c-translation-487"></a>just far enough to make room
 for the spherical joint.  Then it applies the distal rotation. 
-<a name="index-rotation-transform-487"></a><a name="index-transform_002c-rotation-488"></a>Finally it translates the whole assembly upward again to make room for
+<a name="index-rotation-transform-488"></a><a name="index-transform_002c-rotation-489"></a>Finally it translates the whole assembly upward again to make room for
 the middle phlanges (the next bone toward the palm).  The second
 <code>put</code> positions the sphere.  There is a rotation to place the
 grid on the sphere surface at an nice angle, then a translation to the
@@ -2966,7 +3001,7 @@ Finally, the last <code>put</code> positions the middle segment itself.
    <p>The middle joint is the next one down, with rotation angle
 <code>middle_rot_1</code>.  When this angle changes, we need all the objects
 in <code>distal_1</code> to rotate as a unit. 
-<a name="index-rotation-transform-489"></a><a name="index-transform_002c-rotation-490"></a>This is the reasoning behind
+<a name="index-rotation-transform-490"></a><a name="index-transform_002c-rotation-491"></a>This is the reasoning behind
 the next definition.
 <pre class="verbatim">
   def finger_1 {
@@ -2989,7 +3024,7 @@ This looks very similar to the previous definition, and it is.  The
 important difference is that rather than positioning and rotating a
 single segment, we position and rotate the entire “assembly” defined
 as <code>distal_1</code>. 
-<a name="index-rotation-transform-491"></a><a name="index-transform_002c-rotation-492"></a>The rest is just arithmetic to compute sizes and
+<a name="index-rotation-transform-492"></a><a name="index-transform_002c-rotation-493"></a>The rest is just arithmetic to compute sizes and
 positions that look nice.  The last <code>put</code> places an appropriately
 shaped segment that is the <em>proximal phlanges</em>, the bone that
 joins the palm of the hand.  This completes the finger itself.
@@ -3006,7 +3041,7 @@ source code.) Not surprisingly, the <code>hand</code> definition looks very
 much like the previous two.  It should be no surprise that when the
 rotation parameter <code>meta_1_rot</code> changes, the entire finger
 rotates! 
-<a name="index-rotation-transform-493"></a><a name="index-transform_002c-rotation-494"></a>There is an additional rotation that allows the fingers to spread
+<a name="index-rotation-transform-494"></a><a name="index-transform_002c-rotation-495"></a>There is an additional rotation that allows the fingers to spread
 laterally.  We say these joints of the proximal phlanges have two
 <em>degrees of freedom</em>. The joints higher on the finger have only
 one. Finally, each finger is scaled by a factor to lend it proportion.
@@ -3037,7 +3072,7 @@ one. Finally, each finger is scaled by a factor to lend it proportion.
 </pre>
 The last section of the definition creates the polytope for the palm
 of the hand by <code>sweep</code>ing
-<a name="index-swept-polygon-495"></a><a name="index-polygon-sweep-496"></a>a 10-sided polygon through a very short
+<a name="index-swept-polygon-496"></a><a name="index-polygon-sweep-497"></a>a 10-sided polygon through a very short
 arc (9 <!-- /@w -->degrees).  This provides a wedge-shaped profile when viewed
 from the side. The thick end of the wedge is the wrist.  Because the
 polygon is concave, it is split into into two convex shapes with nine
@@ -3119,7 +3154,7 @@ Up: <a rel="up" accesskey="u" href="#Caveats">Caveats</a>
 <h4 class="subsection">4.4.2 Clipping</h4>
 
 <p>The current version of <code>sketch</code> has no clipping
-<a name="index-clipping-497"></a>operations.  The entire scene is always drawn.  This means that when a
+<a name="index-clipping-498"></a>operations.  The entire scene is always drawn.  This means that when a
 perspective transform is employed, it is the user's responsibility to
 make sure the entire scene remains in front of the viewer, the region
 z<0.
@@ -3135,7 +3170,7 @@ Up: <a rel="up" accesskey="u" href="#Caveats">Caveats</a>
 <h4 class="subsection">4.4.3 Hidden surface removal and polygon splitting</h4>
 
 <p><code>Sketch</code> uses the <dfn>depth sort algorithm</dfn>
-<a name="index-depth-sort-498"></a><a name="index-hidden-surface-algorithm-499"></a>for hidden surface removal.  This is a very old technique due to
+<a name="index-depth-sort-499"></a><a name="index-hidden-surface-algorithm-500"></a>for hidden surface removal.  This is a very old technique due to
 Newell.<a rel="footnote" href="#fn-3" name="fnd-3"><sup>3</sup></a>  It is
 generally regarded as too slow for real time graphics, but it is
 ideal for our purpose where speed is not very important.<a rel="footnote" href="#fn-4" name="fnd-4"><sup>4</sup></a>
@@ -3151,10 +3186,10 @@ how oil painters practice their art, depth sort is sometimes called
 depth.  Moreover, even if a correct depth ordering exists, the
 computation needed to find it may be too complex and slow.  In these
 cases, <code>sketch</code> splits
-<a name="index-splitting_002c-line-and-surface-500"></a>one or more polygons into pieces.  The
+<a name="index-splitting_002c-line-and-surface-501"></a>one or more polygons into pieces.  The
 expectation is that the new, smaller polygons will be simpler to
 order.  <code>Sketch</code> uses a <acronym title="binary space partition">BSP</acronym> (binary space partition)
-<a name="index-binary-space-partition-501"></a><a name="index-BSP_002c-binary-space-partition-502"></a>to handle the splitting operation.
+<a name="index-binary-space-partition-502"></a><a name="index-BSP_002c-binary-space-partition-503"></a>to handle the splitting operation.
 
 <ul class="menu">
 <li><a accesskey="1" href="#Statistics">Statistics</a>:                   Performance numbers on depth sort. 
@@ -3183,7 +3218,7 @@ ensure that the initial, approximate ordering was correct.  Among all
 these checks, only 5 resulted in swaps to reorder the initial
 sort.  In two cases, a correct ordering could not be determined, so
 binary space partitions
-<a name="index-binary-space-partition-503"></a>were constructed for splitting.  A total of 4
+<a name="index-binary-space-partition-504"></a>were constructed for splitting.  A total of 4
 objects (triangles in this case) were inserted in the partitions, and
 6 polygons were produced.  Finally, 24,851 “last
 resort” polygon overlap checks were performed after simpler, faster
@@ -3208,8 +3243,8 @@ Up: <a rel="up" accesskey="u" href="#Hidden-surface-removal">Hidden surface
 
 <p>Polygon and line splitting can both cause anomalies in the output. 
 <code>PSTricks</code> dash patterns, specified with <code>linestyle=dashed</code>,
-<a name="index-linestyle-504"></a>can be disrupted by splitting.  This occurs when the depth sort
-<a name="index-depth-sort-505"></a>gives up too early and splits a line where it is not really
+<a name="index-linestyle-505"></a>can be disrupted by splitting.  This occurs when the depth sort
+<a name="index-depth-sort-506"></a>gives up too early and splits a line where it is not really
 necessary. 
 A workaround is to use gray or finely dotted
 lines instead.  If your drawing is small, you can also edit the
@@ -3248,7 +3283,7 @@ Up: <a rel="up" accesskey="u" href="#Top">Top</a>
 <!-- node-name,  next,  previous,  up -->
 <h2 class="chapter">5 Command line</h2>
 
-<p><a name="index-command-line_002c-_0040code_007bsketch_007d-506"></a><strong>Synopsis:</strong>
+<p><a name="index-command-line_002c-_0040code_007bsketch_007d-507"></a><strong>Synopsis:</strong>
 <pre class="example">     sketch [-h][-V x.y][-v][-b][-d][t doctmp][-T[u|e][p[P|T][L|C]]][-o output.tex]
        [-D <var>tag</var> ...] input1.sk [-U <var>tag</var> ...] input2.sk ...
 </pre>
@@ -3258,7 +3293,7 @@ Processes the <code>sketch</code> input files in order to produce
 LaTeX document.
 
 <p class="noindent"><strong>Options:</strong>
-<a name="index-options_002c-command-line-507"></a><a name="index-command-line-options-508"></a>
+<a name="index-options_002c-command-line-508"></a><a name="index-command-line-options-509"></a>
      <dl>
 <dt><code>-h</code><dd>Print a short catalog of options. 
 <br><dt><code>-V</code><dd>Set the <code>PSTricks</code> version assumed for output purposes to
@@ -3268,7 +3303,7 @@ LaTeX document.
 <br><dt><code>-v</code><dd>Print version information to standard output, including the version
 of <code>PSTricks</code> assumed for output (can be changed with <code>-V</code> above). 
 <br><dt><code>-b</code><dd>Use a BSP
-<a name="index-binary-space-partition-509"></a><a name="index-BSP_002c-binary-space-partition-510"></a>(See <a href="#Hidden-surface-removal">Hidden surface removal</a>.) for
+<a name="index-binary-space-partition-510"></a><a name="index-BSP_002c-binary-space-partition-511"></a>(See <a href="#Hidden-surface-removal">Hidden surface removal</a>.) for
 <em>all</em> hidden surface removal rather than the default, which is
 the depth sort algorithm with BSPs used only for cycle resolution. 
 This may produce correct output in certain degenerate cases where the
@@ -3277,7 +3312,7 @@ more anomalies <a href="#Bugs-and-anomalies">Bugs and anomalies</a> and big outp
 <br><dt><code>-d</code><dd>Run <code>sketch</code>'s parser in debugging mode.  This is primarily for
 development. 
 <br><dt><code>-t</code><dd>Use contents of file <span class="file">doctmp</span> as a document template
-<a name="index-document-template-511"></a><a name="index-template_002c-document-512"></a>in which to enclose <code>PSTricks</code> output code.  The code is inserted
+<a name="index-document-template-512"></a><a name="index-template_002c-document-513"></a>in which to enclose <code>PSTricks</code> output code.  The code is inserted
 in place of the first instance of the escape string
 <tt>%%SKETCH_OUTPUT%%</tt>. 
 <br><dt><code>-T</code><dd>Causes <code>PSTricks</code> output to be enclosed in default US document
@@ -3291,7 +3326,7 @@ prints the LaTeX version of the document template, a synonym for
 the default.  A <span class="option">C</span> prints the <code>ConTeXt</code> template. 
 <br><dt><code>-o</code><dd>Use <span class="file">output.tex</span> as the output file.  The default is standard output. 
 <br><dt><code>-D</code><dd>Define a tag
-<a name="index-tag-definition-513"></a><a name="index-definition_002c-tag-514"></a>for purposes of selecting definition alternatives. 
+<a name="index-tag-definition-514"></a><a name="index-definition_002c-tag-515"></a>for purposes of selecting definition alternatives. 
 See <a href="#Definitions">Definitions</a>.  The definition applies for all input files that
 follow unless the tag is undefined with <span class="option">-U</span>. 
 <br><dt><code>inputi.sk</code><dd>Input files, read in the sequence they are given. 
@@ -3386,194 +3421,197 @@ Up: <a rel="up" accesskey="u" href="#Top">Top</a>
 <li><a href="#index-_0027x_0040r_007b_002c_007d-_0027y_0040r_007b_002c-and-_007d_0027z-228"><code>'x</code><span class="roman">,</span><code> 'y</code><span class="roman">, and </span><code>'z</code></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-_0027x_0040r_007b_002c_007d-_0027y_0040r_007b_002c-and-_007d_0027z-158"><code>'x</code><span class="roman">,</span><code> 'y</code><span class="roman">, and </span><code>'z</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li>
 <li><a href="#index-_0028-_0029_0040r_007b_002c-grouping_007d-234"><code>( )</code><span class="roman">, grouping</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="#index-_0028foo_0029_0040r_007b_002c-point-reference_007d-351"><code>(foo)</code><span class="roman">, point reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-_0028foo_0029_0040r_007b_002c-point-reference_007d-38"><code>(foo)</code><span class="roman">, point reference</span></a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="#index-_002a_0040r_007b_002c-multiplication-operator_007d-221"><code>*</code><span class="roman">, multiplication operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
+<li><a href="#index-_0028foo_0029_0040r_007b_002c-point-reference_007d-352"><code>(foo)</code><span class="roman">, point reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-_002a_0040r_007b_002c-multiplication-operator_007d-237"><code>*</code><span class="roman">, multiplication operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-_002b_0040r_007b_002c-plus-operator_007d-219"><code>+</code><span class="roman">, plus operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-_002d_0040r_007b_002c-minus-operator_007d-220"><code>-</code><span class="roman">, minus operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-_002d_0040r_007b_002c-unary-minus-operator_007d-240"><code>-</code><span class="roman">, unary minus operator</span></a>: <a href="#Unary-forms">Unary forms</a></li>
-<li><a href="#index-_002e_0040r_007b_002c-dot-operator_007d-235"><code>.</code><span class="roman">, dot operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
+<li><a href="#index-_002e_0040r_007b_002c-dot-operator_007d-222"><code>.</code><span class="roman">, dot operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-_002f_0040r_007b_002c-division-operator_007d-226"><code>/</code><span class="roman">, division operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-302"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-281"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Sweeps">Sweeps</a></li>
-<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-325"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li>
 <li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-136"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-288"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-points">Swept points</a></li>
+<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-282"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Sweeps">Sweeps</a></li>
+<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-289"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-points">Swept points</a></li>
+<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-326"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li>
+<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-303"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-lines">Swept lines</a></li>
 <li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-100"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Point-sweeps">Point sweeps</a></li>
-<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-285"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-points">Swept points</a></li>
-<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-293"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-346"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-369"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-_005b_005b-_005d_005b-_005d_005b-_005d_005b-_005d_005d_0040r_007b_002c-transform-literal_007d-210"><code>[[ ][ ][ ][ ]]</code><span class="roman">, transform literal</span></a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-413"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-357"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-410"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-366"><code>[foo,...,bar]</code><span class="roman">, multiple options reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-294"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-286"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-points">Swept points</a></li>
+<li><a href="#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-347"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-370"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-_005b_005b-_005d_005b-_005d_005b-_005d_005b-_005d_005d_0040r_007b_002c-transform-literal_007d-214"><code>[[ ][ ][ ][ ]]</code><span class="roman">, transform literal</span></a>: <a href="#Transform-literals">Transform literals</a></li>
+<li><a href="#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-414"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-358"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-411"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-367"><code>[foo,...,bar]</code><span class="roman">, multiple options reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-150"><code>[foo]</code><span class="roman">, options reference</span></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="#index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-363"><code>[foo]</code><span class="roman">, options reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-354"><code>[foo]</code><span class="roman">, vector reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-364"><code>[foo]</code><span class="roman">, options reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-120"><code>[foo]</code><span class="roman">, vector reference</span></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
+<li><a href="#index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-355"><code>[foo]</code><span class="roman">, vector reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-_005e_0040r_007b_002c-exponentiation-operator_007d-223"><code>^</code><span class="roman">, exponentiation operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="#index-arrows-450"><code>arrows</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-arrows-156"><code>arrows</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li>
-<li><a href="#index-arrows-432"><code>arrows</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-arrows-433"><code>arrows</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-arrows-468"><code>arrows</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-arrows-155"><code>arrows</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li>
 <li><a href="#index-atan2-246"><code>atan2</code></a>: <a href="#Unary-forms">Unary forms</a></li>
-<li><a href="#index-camera-380"><code>camera</code></a>: <a href="#Camera">Camera</a></li>
-<li><a href="#index-context-402"><code>context</code></a>: <a href="#Language">Language</a></li>
+<li><a href="#index-camera-381"><code>camera</code></a>: <a href="#Camera">Camera</a></li>
+<li><a href="#index-context-403"><code>context</code></a>: <a href="#Language">Language</a></li>
 <li><a href="#index-cos-245"><code>cos</code></a>: <a href="#Unary-forms">Unary forms</a></li>
-<li><a href="#index-cull-256"><code>cull</code></a>: <a href="#Transparency">Transparency</a></li>
-<li><a href="#index-cull-259"><code>cull</code></a>: <a href="#Internal-options">Internal options</a></li>
-<li><a href="#index-cull-113"><code>cull</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="#index-cull-442"><code>cull</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-cull-376"><code>cull</code></a>: <a href="#Global-options">Global options</a></li>
+<li><a href="#index-cull-257"><code>cull</code></a>: <a href="#Transparency">Transparency</a></li>
+<li><a href="#index-cull-443"><code>cull</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-cull-45"><code>cull</code></a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="#index-curve-269"><code>curve</code></a>: <a href="#Curves">Curves</a></li>
+<li><a href="#index-cull-260"><code>cull</code></a>: <a href="#Internal-options">Internal options</a></li>
+<li><a href="#index-cull-377"><code>cull</code></a>: <a href="#Global-options">Global options</a></li>
+<li><a href="#index-cull-113"><code>cull</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
+<li><a href="#index-curve-270"><code>curve</code></a>: <a href="#Curves">Curves</a></li>
 <li><a href="#index-def-152"><code>def</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li>
-<li><a href="#index-def-477"><code>def</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="#index-def-439"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-def-124"><code>def</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="#index-def-429"><code>def</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-def-102"><code>def</code></a>: <a href="#Point-sweeps">Point sweeps</a></li>
+<li><a href="#index-def-469"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-def-418"><code>def</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-def-474"><code>def</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-def-458"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-def-61"><code>def</code></a>: <a href="#Object-transforms">Object transforms</a></li>
+<li><a href="#index-def-408"><code>def</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-def-138"><code>def</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
+<li><a href="#index-def-449"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-def-478"><code>def</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-def-124"><code>def</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
+<li><a href="#index-def-481"><code>def</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-def-34"><code>def</code></a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="#index-def-473"><code>def</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="#index-def-407"><code>def</code></a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-def-463"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-def-102"><code>def</code></a>: <a href="#Point-sweeps">Point sweeps</a></li>
 <li><a href="#index-def-109"><code>def</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="#index-def-138"><code>def</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="#index-def-31"><code>def</code></a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="#index-def-457"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-def-417"><code>def</code></a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-def-448"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-dots-267"><code>dots</code></a>: <a href="#Dots">Dots</a></li>
-<li><a href="#index-fill-opacity-255"><code>fill opacity</code></a>: <a href="#Transparency">Transparency</a></li>
+<li><a href="#index-def-440"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-dots-268"><code>dots</code></a>: <a href="#Dots">Dots</a></li>
+<li><a href="#index-fill-opacity-256"><code>fill opacity</code></a>: <a href="#Transparency">Transparency</a></li>
 <li><a href="#index-fill-style-250"><code>fill style</code></a>: <a href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li>
-<li><a href="#index-fillcolor-66"><code>fillcolor</code></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-fillcolor-416"><code>fillcolor</code></a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-fillcolor-145"><code>fillcolor</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="#index-frame-390"><code>frame</code></a>: <a href="#Frame">Frame</a></li>
-<li><a href="#index-framesep-395"><code>framesep</code></a>: <a href="#Frame">Frame</a></li>
-<li><a href="#index-global-370"><code>global</code></a>: <a href="#Global-environment">Global environment</a></li>
+<li><a href="#index-fillcolor-417"><code>fillcolor</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-fillcolor-66"><code>fillcolor</code></a>: <a href="#Object-transforms">Object transforms</a></li>
+<li><a href="#index-frame-391"><code>frame</code></a>: <a href="#Frame">Frame</a></li>
+<li><a href="#index-framesep-396"><code>framesep</code></a>: <a href="#Frame">Frame</a></li>
+<li><a href="#index-global-371"><code>global</code></a>: <a href="#Global-environment">Global environment</a></li>
 <li><a href="#index-input-169"><code>input</code></a>: <a href="#Language-basics">Language basics</a></li>
 <li><a href="#index-inverse-247"><code>inverse</code></a>: <a href="#Unary-forms">Unary forms</a></li>
-<li><a href="#index-language-398"><code>language</code></a>: <a href="#Language">Language</a></li>
-<li><a href="#index-latex-401"><code>latex</code></a>: <a href="#Language">Language</a></li>
+<li><a href="#index-language-399"><code>language</code></a>: <a href="#Language">Language</a></li>
+<li><a href="#index-latex-402"><code>latex</code></a>: <a href="#Language">Language</a></li>
+<li><a href="#index-lay-448"><code>lay</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-lay-252"><code>lay</code></a>: <a href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li>
+<li><a href="#index-lay-261"><code>lay</code></a>: <a href="#Internal-options">Internal options</a></li>
+<li><a href="#index-lay-471"><code>lay</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-lay-56"><code>lay</code></a>: <a href="#Special-objects">Special objects</a></li>
-<li><a href="#index-lay-277"><code>lay</code></a>: <a href="#Specials">Specials</a></li>
-<li><a href="#index-lay-378"><code>lay</code></a>: <a href="#Global-options">Global options</a></li>
-<li><a href="#index-lay-452"><code>lay</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-lay-260"><code>lay</code></a>: <a href="#Internal-options">Internal options</a></li>
-<li><a href="#index-lay-447"><code>lay</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-line-460"><code>line</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-line-321"><code>line</code></a>: <a href="#Swept-blocks">Swept blocks</a></li>
-<li><a href="#index-line-268"><code>line</code></a>: <a href="#Lines">Lines</a></li>
-<li><a href="#index-line-464"><code>line</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-line-476"><code>line</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="#index-line-437"><code>line</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-lay-379"><code>lay</code></a>: <a href="#Global-options">Global options</a></li>
+<li><a href="#index-lay-453"><code>lay</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-lay-278"><code>lay</code></a>: <a href="#Specials">Specials</a></li>
+<li><a href="#index-line-322"><code>line</code></a>: <a href="#Swept-blocks">Swept blocks</a></li>
 <li><a href="#index-line-63"><code>line</code></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-line-25"><code>line</code></a>: <a href="#Drawing-options">Drawing options</a></li>
+<li><a href="#index-line-444"><code>line</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-line-154"><code>line</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li>
+<li><a href="#index-line-25"><code>line</code></a>: <a href="#Drawing-options">Drawing options</a></li>
+<li><a href="#index-line-477"><code>line</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-line-461"><code>line</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-line-144"><code>line</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
+<li><a href="#index-line-465"><code>line</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-line-438"><code>line</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-line-269"><code>line</code></a>: <a href="#Lines">Lines</a></li>
 <li><a href="#index-line-style-251"><code>line style</code></a>: <a href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li>
-<li><a href="#index-linecolor-434"><code>linecolor</code></a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-linecolor-394"><code>linecolor</code></a>: <a href="#Frame">Frame</a></li>
+<li><a href="#index-linecolor-395"><code>linecolor</code></a>: <a href="#Frame">Frame</a></li>
+<li><a href="#index-linecolor-435"><code>linecolor</code></a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-linecolor-65"><code>linecolor</code></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-linestyle-393"><code>linestyle</code></a>: <a href="#Frame">Frame</a></li>
-<li><a href="#index-linestyle-504"><code>linestyle</code></a>: <a href="#Bugs-and-anomalies">Bugs and anomalies</a></li>
-<li><a href="#index-linestyle-453"><code>linestyle</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-linestyle-435"><code>linestyle</code></a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-linewidth-392"><code>linewidth</code></a>: <a href="#Frame">Frame</a></li>
+<li><a href="#index-linestyle-394"><code>linestyle</code></a>: <a href="#Frame">Frame</a></li>
+<li><a href="#index-linestyle-436"><code>linestyle</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-linestyle-505"><code>linestyle</code></a>: <a href="#Bugs-and-anomalies">Bugs and anomalies</a></li>
+<li><a href="#index-linestyle-454"><code>linestyle</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-linewidth-452"><code>linewidth</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-linewidth-114"><code>linewidth</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="#index-linewidth-451"><code>linewidth</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-linewidth-433"><code>linewidth</code></a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-opacity-254"><code>opacity</code></a>: <a href="#Transparency">Transparency</a></li>
+<li><a href="#index-linewidth-434"><code>linewidth</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-linewidth-393"><code>linewidth</code></a>: <a href="#Frame">Frame</a></li>
+<li><a href="#index-opacity-255"><code>opacity</code></a>: <a href="#Transparency">Transparency</a></li>
 <li><a href="#index-perspective-200"><code>perspective</code></a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-picturebox-382"><code>picturebox</code></a>: <a href="#Picture-box">Picture box</a></li>
-<li><a href="#index-point-list-265"><code>point list</code></a>: <a href="#Internal-options">Internal options</a></li>
+<li><a href="#index-picturebox-383"><code>picturebox</code></a>: <a href="#Picture-box">Picture box</a></li>
+<li><a href="#index-point-list-266"><code>point list</code></a>: <a href="#Internal-options">Internal options</a></li>
 <li><a href="#index-polygon-19"><code>polygon</code></a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-polygon-418"><code>polygon</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-polygon-419"><code>polygon</code></a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-polygon-153"><code>polygon</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li>
 <li><a href="#index-polygon-32"><code>polygon</code></a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-polygon-64"><code>polygon</code></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-polygon-270"><code>polygon</code></a>: <a href="#Polygons">Polygons</a></li>
-<li><a href="#index-polygon-322"><code>polygon</code></a>: <a href="#Swept-blocks">Swept blocks</a></li>
+<li><a href="#index-polygon-271"><code>polygon</code></a>: <a href="#Polygons">Polygons</a></li>
+<li><a href="#index-polygon-323"><code>polygon</code></a>: <a href="#Swept-blocks">Swept blocks</a></li>
 <li><a href="#index-project-194"><code>project</code></a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-pstricks-399"><code>pstricks</code></a>: <a href="#Language">Language</a></li>
-<li><a href="#index-put-481"><code>put</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-pstricks-400"><code>pstricks</code></a>: <a href="#Language">Language</a></li>
+<li><a href="#index-put-482"><code>put</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-put-62"><code>put</code></a>: <a href="#Object-transforms">Object transforms</a></li>
 <li><a href="#index-put-129"><code>put</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="#index-put-334"><code>put</code></a>: <a href="#Puts">Puts</a></li>
-<li><a href="#index-repeat-331"><code>repeat</code></a>: <a href="#Repeats">Repeats</a></li>
+<li><a href="#index-put-335"><code>put</code></a>: <a href="#Puts">Puts</a></li>
+<li><a href="#index-repeat-332"><code>repeat</code></a>: <a href="#Repeats">Repeats</a></li>
 <li><a href="#index-repeat-88"><code>repeat</code></a>: <a href="#Repeated-objects">Repeated objects</a></li>
 <li><a href="#index-repeat-139"><code>repeat</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="#index-repeat-426"><code>repeat</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-repeat-427"><code>repeat</code></a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-repeat-130"><code>repeat</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
 <li><a href="#index-rotate-94"><code>rotate</code></a>: <a href="#Swept-objects">Swept objects</a></li>
 <li><a href="#index-rotate-103"><code>rotate</code></a>: <a href="#Point-sweeps">Point sweeps</a></li>
-<li><a href="#index-rotate-430"><code>rotate</code></a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-rotate-475"><code>rotate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-rotate-431"><code>rotate</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-rotate-476"><code>rotate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-rotate-89"><code>rotate</code></a>: <a href="#Repeated-objects">Repeated objects</a></li>
-<li><a href="#index-rotate-427"><code>rotate</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-rotate-428"><code>rotate</code></a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-rotate-67"><code>rotate</code></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-rotate-483"><code>rotate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-rotate-484"><code>rotate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-rotate-182"><code>rotate</code></a>: <a href="#Transform-literals">Transform literals</a></li>
 <li><a href="#index-rotate-111"><code>rotate</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="#index-rotate-80"><code>rotate</code></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-rotate-440"><code>rotate</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-rotate-441"><code>rotate</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-rotate-126"><code>rotate</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="#index-rotate-479"><code>rotate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-rotate-480"><code>rotate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-rotate-140"><code>rotate</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="#index-scale-191"><code>scale</code></a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-scale-484"><code>scale</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="#index-scale-466"><code>scale</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-scale-485"><code>scale</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-scale-467"><code>scale</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-scale-188"><code>scale</code></a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-scale-459"><code>scale</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-set-373"><code>set</code></a>: <a href="#Global-options">Global options</a></li>
+<li><a href="#index-scale-460"><code>scale</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-set-374"><code>set</code></a>: <a href="#Global-options">Global options</a></li>
 <li><a href="#index-sin-244"><code>sin</code></a>: <a href="#Unary-forms">Unary forms</a></li>
-<li><a href="#index-special-436"><code>special</code></a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-special-469"><code>special</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-special-437"><code>special</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-special-470"><code>special</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-special-48"><code>special</code></a>: <a href="#Special-objects">Special objects</a></li>
-<li><a href="#index-special-454"><code>special</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-special-273"><code>special</code></a>: <a href="#Specials">Specials</a></li>
-<li><a href="#index-split-377"><code>split</code></a>: <a href="#Global-options">Global options</a></li>
-<li><a href="#index-split-261"><code>split</code></a>: <a href="#Internal-options">Internal options</a></li>
+<li><a href="#index-special-455"><code>special</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-special-274"><code>special</code></a>: <a href="#Specials">Specials</a></li>
+<li><a href="#index-split-378"><code>split</code></a>: <a href="#Global-options">Global options</a></li>
+<li><a href="#index-split-262"><code>split</code></a>: <a href="#Internal-options">Internal options</a></li>
 <li><a href="#index-sqrt-243"><code>sqrt</code></a>: <a href="#Unary-forms">Unary forms</a></li>
-<li><a href="#index-sweep-441"><code>sweep</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-sweep-474"><code>sweep</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-sweep-442"><code>sweep</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-sweep-475"><code>sweep</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-sweep-125"><code>sweep</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="#index-sweep-278"><code>sweep</code></a>: <a href="#Sweeps">Sweeps</a></li>
+<li><a href="#index-sweep-279"><code>sweep</code></a>: <a href="#Sweeps">Sweeps</a></li>
 <li><a href="#index-sweep-143"><code>sweep</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="#index-sweep-93"><code>sweep</code></a>: <a href="#Swept-objects">Swept objects</a></li>
 <li><a href="#index-sweep-110"><code>sweep</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="#index-sweep-478"><code>sweep</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-sweep-479"><code>sweep</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-sweep-104"><code>sweep</code></a>: <a href="#Point-sweeps">Point sweeps</a></li>
 <li><a href="#index-sweep-127"><code>sweep</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
 <li><a href="#index-then-236"><code>then</code></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-then-141"><code>then</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="#index-then-225"><code>then</code></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-then-69"><code>then</code></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-tikz-400"><code>tikz</code></a>: <a href="#Language">Language</a></li>
-<li><a href="#index-translate-428"><code>translate</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-tikz-401"><code>tikz</code></a>: <a href="#Language">Language</a></li>
+<li><a href="#index-translate-429"><code>translate</code></a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-translate-84"><code>translate</code></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-translate-482"><code>translate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-translate-483"><code>translate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-translate-142"><code>translate</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="#index-translate-90"><code>translate</code></a>: <a href="#Repeated-objects">Repeated objects</a></li>
-<li><a href="#index-translate-431"><code>translate</code></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-translate-432"><code>translate</code></a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-translate-185"><code>translate</code></a>: <a href="#Transform-literals">Transform literals</a></li>
 <li><a href="#index-translate-68"><code>translate</code></a>: <a href="#Object-transforms">Object transforms</a></li>
 <li><a href="#index-translate-112"><code>translate</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="#index-transpalpha-253"><code>transpalpha</code></a>: <a href="#Transparency">Transparency</a></li>
+<li><a href="#index-transpalpha-254"><code>transpalpha</code></a>: <a href="#Transparency">Transparency</a></li>
 <li><a href="#index-unit-242"><code>unit</code></a>: <a href="#Unary-forms">Unary forms</a></li>
-<li><a href="#index-unit-458"><code>unit</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-unit-459"><code>unit</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-view-207"><code>view</code></a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-328"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Blocks">Blocks</a></li>
-<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-320"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Swept-blocks">Swept blocks</a></li>
+<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-329"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Blocks">Blocks</a></li>
+<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-321"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Swept-blocks">Swept blocks</a></li>
 <li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-131"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
 <li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-71"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-419"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-420"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-79"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-360"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-424"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-361"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-425"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-_007c_0040math_007bX_007d_007c_0040r_007b_002c-magnitude-operator_007d-241"><code>|X|</code><span class="roman">, magnitude operator</span></a>: <a href="#Unary-forms">Unary forms</a></li>
    </ul><div class="node">
 <p><hr>
@@ -3588,111 +3626,111 @@ Up: <a rel="up" accesskey="u" href="#Top">Top</a>
 
 
 <ul class="index-cp" compact>
-<li><a href="#index-affine-arithmetic-456">affine arithmetic</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-affine-arithmetic-457">affine arithmetic</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-affine-arithmetic-151">affine arithmetic</a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li>
-<li><a href="#index-alternatives_002c-definition-341">alternatives, definition</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="#index-alternatives_002c-definition-342">alternatives, definition</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
 <li><a href="#index-argument_002c-special-51">argument, special</a>: <a href="#Special-objects">Special objects</a></li>
-<li><a href="#index-argument_002c-special-276">argument, special</a>: <a href="#Specials">Specials</a></li>
+<li><a href="#index-argument_002c-special-277">argument, special</a>: <a href="#Specials">Specials</a></li>
 <li><a href="#index-associativity_002c-operator-232">associativity, operator</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-axis_002c-rotation-82">axis, rotation</a>: <a href="#Object-transforms">Object transforms</a></li>
 <li><a href="#index-back-face-43">back face</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="#index-baseline-fraction-384">baseline fraction</a>: <a href="#Picture-box">Picture box</a></li>
+<li><a href="#index-baseline-fraction-385">baseline fraction</a>: <a href="#Picture-box">Picture box</a></li>
 <li><a href="#index-binary-form-217">binary form</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="#index-binary-space-partition-509">binary space partition</a>: <a href="#Command-line">Command line</a></li>
-<li><a href="#index-binary-space-partition-501">binary space partition</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
-<li><a href="#index-binary-space-partition-503">binary space partition</a>: <a href="#Statistics">Statistics</a></li>
-<li><a href="#index-block-319">block</a>: <a href="#Swept-blocks">Swept blocks</a></li>
-<li><a href="#index-block-327">block</a>: <a href="#Blocks">Blocks</a></li>
+<li><a href="#index-binary-space-partition-510">binary space partition</a>: <a href="#Command-line">Command line</a></li>
+<li><a href="#index-binary-space-partition-502">binary space partition</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="#index-binary-space-partition-504">binary space partition</a>: <a href="#Statistics">Statistics</a></li>
+<li><a href="#index-block-320">block</a>: <a href="#Swept-blocks">Swept blocks</a></li>
+<li><a href="#index-block-328">block</a>: <a href="#Blocks">Blocks</a></li>
 <li><a href="#index-block-70">block</a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-block-sweep-318">block sweep</a>: <a href="#Swept-blocks">Swept blocks</a></li>
-<li><a href="#index-body-polygon-311">body polygon</a>: <a href="#Swept-polygons">Swept polygons</a></li>
-<li><a href="#index-body-polygon-295">body polygon</a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-body-polygon-263">body polygon</a>: <a href="#Internal-options">Internal options</a></li>
-<li><a href="#index-bounding-box-385">bounding box</a>: <a href="#Picture-box">Picture box</a></li>
-<li><a href="#index-BSP_002c-binary-space-partition-510">BSP, binary space partition</a>: <a href="#Command-line">Command line</a></li>
-<li><a href="#index-BSP_002c-binary-space-partition-502">BSP, binary space partition</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
-<li><a href="#index-camera-379">camera</a>: <a href="#Camera">Camera</a></li>
+<li><a href="#index-block-sweep-319">block sweep</a>: <a href="#Swept-blocks">Swept blocks</a></li>
+<li><a href="#index-body-polygon-312">body polygon</a>: <a href="#Swept-polygons">Swept polygons</a></li>
+<li><a href="#index-body-polygon-296">body polygon</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-body-polygon-264">body polygon</a>: <a href="#Internal-options">Internal options</a></li>
+<li><a href="#index-bounding-box-386">bounding box</a>: <a href="#Picture-box">Picture box</a></li>
+<li><a href="#index-BSP_002c-binary-space-partition-511">BSP, binary space partition</a>: <a href="#Command-line">Command line</a></li>
+<li><a href="#index-BSP_002c-binary-space-partition-503">BSP, binary space partition</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="#index-camera-380">camera</a>: <a href="#Camera">Camera</a></li>
 <li><a href="#index-center-of-rotation-59">center of rotation</a>: <a href="#Object-transforms">Object transforms</a></li>
 <li><a href="#index-center-of-rotation-121">center of rotation</a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="#index-centroid-471">centroid</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-clipping-497">clipping</a>: <a href="#Clipping">Clipping</a></li>
-<li><a href="#index-clipping-388">clipping</a>: <a href="#Picture-box">Picture box</a></li>
-<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-303">closure tag, <code><></code></a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-286">closure tag, <code><></code></a>: <a href="#Swept-points">Swept points</a></li>
-<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-282">closure tag, <code><></code></a>: <a href="#Sweeps">Sweeps</a></li>
+<li><a href="#index-centroid-472">centroid</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-clipping-498">clipping</a>: <a href="#Clipping">Clipping</a></li>
+<li><a href="#index-clipping-389">clipping</a>: <a href="#Picture-box">Picture box</a></li>
+<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-304">closure tag, <code><></code></a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-287">closure tag, <code><></code></a>: <a href="#Swept-points">Swept points</a></li>
+<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-283">closure tag, <code><></code></a>: <a href="#Sweeps">Sweeps</a></li>
 <li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-137">closure tag, <code><></code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-326">closure tag, <code><></code></a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li>
+<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-327">closure tag, <code><></code></a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li>
 <li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-101">closure tag, <code><></code></a>: <a href="#Point-sweeps">Point sweeps</a></li>
 <li><a href="#index-command-line-option-13">command line option</a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-command-line-options-508">command line options</a>: <a href="#Command-line">Command line</a></li>
+<li><a href="#index-command-line-options-509">command line options</a>: <a href="#Command-line">Command line</a></li>
 <li><a href="#index-command-line_002c-_0040code_007bsketch_007d-7">command line, <code>sketch</code></a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-command-line_002c-_0040code_007bsketch_007d-506">command line, <code>sketch</code></a>: <a href="#Command-line">Command line</a></li>
+<li><a href="#index-command-line_002c-_0040code_007bsketch_007d-507">command line, <code>sketch</code></a>: <a href="#Command-line">Command line</a></li>
 <li><a href="#index-comments-40">comments</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-comments-166">comments</a>: <a href="#Language-basics">Language basics</a></li>
 <li><a href="#index-constructor-181">constructor</a>: <a href="#Transform-literals">Transform literals</a></li>
 <li><a href="#index-coordinate-system_002c-right_002dhanded-3">coordinate system, right-handed</a>: <a href="#Introduction-by-example">Introduction by example</a></li>
 <li><a href="#index-counter_002dclockwise-polygon-vertex-order-20">counter-clockwise polygon vertex order</a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-culling-299">culling</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-culling-300">culling</a>: <a href="#Swept-lines">Swept lines</a></li>
 <li><a href="#index-culling-42">culling</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-culling-23">culling</a>: <a href="#Hello-world">Hello world</a></li>
 <li><a href="#index-culling-44">culling</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-declarative-language-163">declarative language</a>: <a href="#Language-basics">Language basics</a></li>
 <li><a href="#index-definition-33">definition</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="#index-definition-335">definition</a>: <a href="#Definitions">Definitions</a></li>
-<li><a href="#index-definition-with-alternatives-340">definition with alternatives</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="#index-definition-336">definition</a>: <a href="#Definitions">Definitions</a></li>
+<li><a href="#index-definition-with-alternatives-341">definition with alternatives</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
 <li><a href="#index-definition_002c-drawable-75">definition, drawable</a>: <a href="#Object-transforms">Object transforms</a></li>
 <li><a href="#index-definition_002c-options-147">definition, options</a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="#index-definition_002c-point-35">definition, point</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-definition_002c-scalar-97">definition, scalar</a>: <a href="#Swept-objects">Swept objects</a></li>
-<li><a href="#index-definition_002c-simple-339">definition, simple</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="#index-definition_002c-tag-514">definition, tag</a>: <a href="#Command-line">Command line</a></li>
-<li><a href="#index-definition_002c-tag-343">definition, tag</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="#index-definition_002c-tag-336">definition, tag</a>: <a href="#Definitions">Definitions</a></li>
-<li><a href="#index-definition_002c-transform-409">definition, transform</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-definition_002c-simple-340">definition, simple</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="#index-definition_002c-tag-515">definition, tag</a>: <a href="#Command-line">Command line</a></li>
+<li><a href="#index-definition_002c-tag-344">definition, tag</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="#index-definition_002c-tag-337">definition, tag</a>: <a href="#Definitions">Definitions</a></li>
+<li><a href="#index-definition_002c-transform-410">definition, transform</a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-definition_002c-vector-117">definition, vector</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="#index-depth-sort-498">depth sort</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
-<li><a href="#index-depth-sort-262">depth sort</a>: <a href="#Internal-options">Internal options</a></li>
-<li><a href="#index-depth-sort-505">depth sort</a>: <a href="#Bugs-and-anomalies">Bugs and anomalies</a></li>
+<li><a href="#index-depth-sort-499">depth sort</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="#index-depth-sort-263">depth sort</a>: <a href="#Internal-options">Internal options</a></li>
+<li><a href="#index-depth-sort-506">depth sort</a>: <a href="#Bugs-and-anomalies">Bugs and anomalies</a></li>
 <li><a href="#index-direct-transform-211">direct transform</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-document-template-511">document template</a>: <a href="#Command-line">Command line</a></li>
+<li><a href="#index-document-template-512">document template</a>: <a href="#Command-line">Command line</a></li>
 <li><a href="#index-document-template-15">document template</a>: <a href="#Hello-world">Hello world</a></li>
 <li><a href="#index-drawable-74">drawable</a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-drawable-266">drawable</a>: <a href="#Drawables">Drawables</a></li>
+<li><a href="#index-drawable-267">drawable</a>: <a href="#Drawables">Drawables</a></li>
 <li><a href="#index-drawable-definition-76">drawable definition</a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-drawable-reference-358">drawable reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-end-polygon-304">end polygon</a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-end-polygon-313">end polygon</a>: <a href="#Swept-polygons">Swept polygons</a></li>
+<li><a href="#index-drawable-reference-359">drawable reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-end-polygon-305">end polygon</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-end-polygon-314">end polygon</a>: <a href="#Swept-polygons">Swept polygons</a></li>
 <li><a href="#index-faces-29">faces</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-faces-108">faces</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="#index-file_002c-include-168">file, include</a>: <a href="#Language-basics">Language basics</a></li>
 <li><a href="#index-file_002c-input-160">file, input</a>: <a href="#Language-basics">Language basics</a></li>
-<li><a href="#index-frame-box-389">frame box</a>: <a href="#Frame">Frame</a></li>
+<li><a href="#index-frame-box-390">frame box</a>: <a href="#Frame">Frame</a></li>
 <li><a href="#index-global-options-27">global options</a>: <a href="#Drawing-options">Drawing options</a></li>
-<li><a href="#index-global-options-372">global options</a>: <a href="#Global-options">Global options</a></li>
+<li><a href="#index-global-options-373">global options</a>: <a href="#Global-options">Global options</a></li>
 <li><a href="#index-helix-115">helix</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="#index-helix-46">helix</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-hello-world-5">hello world</a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-hidden-surface-algorithm-446">hidden surface algorithm</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-hidden-surface-algorithm-447">hidden surface algorithm</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-hidden-surface-algorithm-9">hidden surface algorithm</a>: <a href="#Hello-world">Hello world</a></li>
 <li><a href="#index-hidden-surface-algorithm-203">hidden surface algorithm</a>: <a href="#Transform-literals">Transform literals</a></li>
 <li><a href="#index-hidden-surface-algorithm-57">hidden surface algorithm</a>: <a href="#Special-objects">Special objects</a></li>
-<li><a href="#index-hidden-surface-algorithm-499">hidden surface algorithm</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
-<li><a href="#index-hierarchical-model-472">hierarchical model</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-hidden-surface-algorithm-500">hidden surface algorithm</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="#index-hierarchical-model-473">hierarchical model</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-identifiers-170">identifiers</a>: <a href="#Identifiers">Identifiers</a></li>
 <li><a href="#index-include-file-167">include file</a>: <a href="#Language-basics">Language basics</a></li>
 <li><a href="#index-input-file-159">input file</a>: <a href="#Language-basics">Language basics</a></li>
 <li><a href="#index-internal-option-54">internal option</a>: <a href="#Special-objects">Special objects</a></li>
-<li><a href="#index-internal-options-375">internal options</a>: <a href="#Global-options">Global options</a></li>
-<li><a href="#index-internal-options-258">internal options</a>: <a href="#Internal-options">Internal options</a></li>
+<li><a href="#index-internal-options-376">internal options</a>: <a href="#Global-options">Global options</a></li>
+<li><a href="#index-internal-options-259">internal options</a>: <a href="#Internal-options">Internal options</a></li>
 <li><a href="#index-keywords-171">keywords</a>: <a href="#Key-and-reserved-words">Key and reserved words</a></li>
 <li><a href="#index-labels-47">labels</a>: <a href="#Special-objects">Special objects</a></li>
 <li><a href="#index-language_002c-declarative-164">language, declarative</a>: <a href="#Language-basics">Language basics</a></li>
-<li><a href="#index-language_002c-output-396">language, output</a>: <a href="#Language">Language</a></li>
+<li><a href="#index-language_002c-output-397">language, output</a>: <a href="#Language">Language</a></li>
 <li><a href="#index-language_002c-scene-description-162">language, scene description</a>: <a href="#Language-basics">Language basics</a></li>
-<li><a href="#index-lexical-scope-329">lexical scope</a>: <a href="#Blocks">Blocks</a></li>
+<li><a href="#index-lexical-scope-330">lexical scope</a>: <a href="#Blocks">Blocks</a></li>
 <li><a href="#index-lexical-scope-72">lexical scope</a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-line-sweep-292">line sweep</a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-line-sweep-445">line sweep</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-line-sweep-293">line sweep</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-line-sweep-446">line sweep</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-line-sweep-105">line sweep</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="#index-literal_002c-point-176">literal, point</a>: <a href="#Point-and-vector-literals">Point and vector literals</a></li>
 <li><a href="#index-literal_002c-scalar-174">literal, scalar</a>: <a href="#Scalar-literals">Scalar literals</a></li>
@@ -3707,172 +3745,172 @@ Up: <a rel="up" accesskey="u" href="#Top">Top</a>
 <li><a href="#index-option_002c-internal-55">option, internal</a>: <a href="#Special-objects">Special objects</a></li>
 <li><a href="#index-options-248">options</a>: <a href="#Options">Options</a></li>
 <li><a href="#index-options-definition-148">options definition</a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="#index-options-multiple-reference-364">options multiple reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-options-reference-361">options reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-options_002c-command-line-507">options, command line</a>: <a href="#Command-line">Command line</a></li>
+<li><a href="#index-options-multiple-reference-365">options multiple reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-options-reference-362">options reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-options_002c-command-line-508">options, command line</a>: <a href="#Command-line">Command line</a></li>
 <li><a href="#index-options_002c-global-26">options, global</a>: <a href="#Drawing-options">Drawing options</a></li>
-<li><a href="#index-options_002c-global-371">options, global</a>: <a href="#Global-options">Global options</a></li>
-<li><a href="#index-options_002c-internal-257">options, internal</a>: <a href="#Internal-options">Internal options</a></li>
-<li><a href="#index-options_002c-internal-374">options, internal</a>: <a href="#Global-options">Global options</a></li>
+<li><a href="#index-options_002c-global-372">options, global</a>: <a href="#Global-options">Global options</a></li>
+<li><a href="#index-options_002c-internal-258">options, internal</a>: <a href="#Internal-options">Internal options</a></li>
+<li><a href="#index-options_002c-internal-375">options, internal</a>: <a href="#Global-options">Global options</a></li>
 <li><a href="#index-options_002c-sweep-135">options, sweep</a>: <a href="#Polygon-sweeps">Polygon sweeps</a></li>
-<li><a href="#index-options_002c-sweep-290">options, sweep</a>: <a href="#Swept-points">Swept points</a></li>
-<li><a href="#index-options_002c-sweep-300">options, sweep</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-options_002c-sweep-291">options, sweep</a>: <a href="#Swept-points">Swept points</a></li>
+<li><a href="#index-options_002c-sweep-301">options, sweep</a>: <a href="#Swept-lines">Swept lines</a></li>
 <li><a href="#index-options_002c-sweep-116">options, sweep</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="#index-options_002c-sweep-309">options, sweep</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-options_002c-sweep-310">options, sweep</a>: <a href="#Swept-lines">Swept lines</a></li>
 <li><a href="#index-options_002c-swept-object-134">options, swept object</a>: <a href="#Polygon-sweeps">Polygon sweeps</a></li>
-<li><a href="#index-options_002c-swept-object-301">options, swept object</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-options_002c-swept-object-302">options, swept object</a>: <a href="#Swept-lines">Swept lines</a></li>
 <li><a href="#index-options_002c-swept-object-146">options, swept object</a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="#index-options_002c-swept-object-308">options, swept object</a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-order_002c-polygon-vertex-423">order, polygon vertex</a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-order_002c-polygon-vertex-316">order, polygon vertex</a>: <a href="#Swept-polygons">Swept polygons</a></li>
+<li><a href="#index-options_002c-swept-object-309">options, swept object</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-order_002c-polygon-vertex-424">order, polygon vertex</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-order_002c-polygon-vertex-317">order, polygon vertex</a>: <a href="#Swept-polygons">Swept polygons</a></li>
 <li><a href="#index-order_002c-polygon-vertex-22">order, polygon vertex</a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-order_002c-polygon-vertex-298">order, polygon vertex</a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-output-language-397">output language</a>: <a href="#Language">Language</a></li>
+<li><a href="#index-order_002c-polygon-vertex-299">order, polygon vertex</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-output-language-398">output language</a>: <a href="#Language">Language</a></li>
 <li><a href="#index-outside-of-a-polygon-17">outside of a polygon</a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-parallel-projection-386">parallel projection</a>: <a href="#Picture-box">Picture box</a></li>
+<li><a href="#index-parallel-projection-387">parallel projection</a>: <a href="#Picture-box">Picture box</a></li>
 <li><a href="#index-parallel-projection-195">parallel projection</a>: <a href="#Transform-literals">Transform literals</a></li>
 <li><a href="#index-parallel-projection-11">parallel projection</a>: <a href="#Hello-world">Hello world</a></li>
 <li><a href="#index-parentheses-233">parentheses</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="#index-perspective-projection-404">perspective projection</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-perspective-projection-405">perspective projection</a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-perspective-projection-198">perspective projection</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-picture-box-381">picture box</a>: <a href="#Picture-box">Picture box</a></li>
-<li><a href="#index-planarity-of-polygons-272">planarity of polygons</a>: <a href="#Polygons">Polygons</a></li>
-<li><a href="#index-planarity-of-polygons-324">planarity of polygons</a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li>
+<li><a href="#index-picture-box-382">picture box</a>: <a href="#Picture-box">Picture box</a></li>
+<li><a href="#index-planarity-of-polygons-273">planarity of polygons</a>: <a href="#Polygons">Polygons</a></li>
+<li><a href="#index-planarity-of-polygons-325">planarity of polygons</a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li>
 <li><a href="#index-point-definition-36">point definition</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="#index-point-list-287">point list</a>: <a href="#Swept-points">Swept points</a></li>
+<li><a href="#index-point-list-288">point list</a>: <a href="#Swept-points">Swept points</a></li>
 <li><a href="#index-point-literal-175">point literal</a>: <a href="#Point-and-vector-literals">Point and vector literals</a></li>
-<li><a href="#index-point-reference-349">point reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-point-reference-350">point reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-point-sweep-95">point sweep</a>: <a href="#Swept-objects">Swept objects</a></li>
-<li><a href="#index-point-sweep-284">point sweep</a>: <a href="#Swept-points">Swept points</a></li>
+<li><a href="#index-point-sweep-285">point sweep</a>: <a href="#Swept-points">Swept points</a></li>
 <li><a href="#index-polygon-sweep-132">polygon sweep</a>: <a href="#Polygon-sweeps">Polygon sweeps</a></li>
-<li><a href="#index-polygon-sweep-310">polygon sweep</a>: <a href="#Swept-polygons">Swept polygons</a></li>
-<li><a href="#index-polygon-sweep-496">polygon sweep</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="#index-polygon-vertex-order-297">polygon vertex order</a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-polygon-vertex-order-315">polygon vertex order</a>: <a href="#Swept-polygons">Swept polygons</a></li>
-<li><a href="#index-polygon-vertex-order-422">polygon vertex order</a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-polygon-vertex-order-306">polygon vertex order</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-polygon-sweep-311">polygon sweep</a>: <a href="#Swept-polygons">Swept polygons</a></li>
+<li><a href="#index-polygon-sweep-497">polygon sweep</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-polygon-vertex-order-298">polygon vertex order</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-polygon-vertex-order-316">polygon vertex order</a>: <a href="#Swept-polygons">Swept polygons</a></li>
+<li><a href="#index-polygon-vertex-order-423">polygon vertex order</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-polygon-vertex-order-307">polygon vertex order</a>: <a href="#Swept-lines">Swept lines</a></li>
 <li><a href="#index-polygon-vertex-order-21">polygon vertex order</a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-polygon-vertex-order-414">polygon vertex order</a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-polygon_002c-body-312">polygon, body</a>: <a href="#Swept-polygons">Swept polygons</a></li>
-<li><a href="#index-polygon_002c-body-296">polygon, body</a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-polygon_002c-body-264">polygon, body</a>: <a href="#Internal-options">Internal options</a></li>
-<li><a href="#index-polygon_002c-end-314">polygon, end</a>: <a href="#Swept-polygons">Swept polygons</a></li>
-<li><a href="#index-polygon_002c-end-305">polygon, end</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-polygon-vertex-order-415">polygon vertex order</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-polygon_002c-body-313">polygon, body</a>: <a href="#Swept-polygons">Swept polygons</a></li>
+<li><a href="#index-polygon_002c-body-297">polygon, body</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-polygon_002c-body-265">polygon, body</a>: <a href="#Internal-options">Internal options</a></li>
+<li><a href="#index-polygon_002c-end-315">polygon, end</a>: <a href="#Swept-polygons">Swept polygons</a></li>
+<li><a href="#index-polygon_002c-end-306">polygon, end</a>: <a href="#Swept-lines">Swept lines</a></li>
 <li><a href="#index-polygon_002c-outside-of-18">polygon, outside of</a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-polygon_002c-planar-271">polygon, planar</a>: <a href="#Polygons">Polygons</a></li>
-<li><a href="#index-polygon_002c-planar-323">polygon, planar</a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li>
+<li><a href="#index-polygon_002c-planar-272">polygon, planar</a>: <a href="#Polygons">Polygons</a></li>
+<li><a href="#index-polygon_002c-planar-324">polygon, planar</a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li>
 <li><a href="#index-precedence_002c-operator-229">precedence, operator</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-program_002c-hello-world-6">program, hello world</a>: <a href="#Hello-world">Hello world</a></li>
-<li><a href="#index-projection_002c-parallel-387">projection, parallel</a>: <a href="#Picture-box">Picture box</a></li>
+<li><a href="#index-projection_002c-parallel-388">projection, parallel</a>: <a href="#Picture-box">Picture box</a></li>
 <li><a href="#index-projection_002c-parallel-12">projection, parallel</a>: <a href="#Hello-world">Hello world</a></li>
 <li><a href="#index-projection_002c-parallel-196">projection, parallel</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-projection_002c-perspective-406">projection, perspective</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-projection_002c-perspective-407">projection, perspective</a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-projection_002c-perspective-202">projection, perspective</a>: <a href="#Transform-literals">Transform literals</a></li>
 <li><a href="#index-pseudo_002doptions-249">pseudo-options</a>: <a href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li>
-<li><a href="#index-_0040code_007bpsframebox_007d-391"><code>psframebox</code></a>: <a href="#Frame">Frame</a></li>
-<li><a href="#index-_0040code_007bpspicture_007d-383"><code>pspicture</code></a>: <a href="#Picture-box">Picture box</a></li>
+<li><a href="#index-_0040code_007bpsframebox_007d-392"><code>psframebox</code></a>: <a href="#Frame">Frame</a></li>
+<li><a href="#index-_0040code_007bpspicture_007d-384"><code>pspicture</code></a>: <a href="#Picture-box">Picture box</a></li>
 <li><a href="#index-PSTricks-1">PSTricks</a>: <a href="#About-sketch">About sketch</a></li>
 <li><a href="#index-quoting_002c-special-50">quoting, special</a>: <a href="#Special-objects">Special objects</a></li>
-<li><a href="#index-quoting_002c-special-274">quoting, special</a>: <a href="#Specials">Specials</a></li>
-<li><a href="#index-reference_002c-drawable-421">reference, drawable</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-quoting_002c-special-275">quoting, special</a>: <a href="#Specials">Specials</a></li>
+<li><a href="#index-reference_002c-drawable-422">reference, drawable</a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-reference_002c-drawable-78">reference, drawable</a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-reference_002c-drawable-359">reference, drawable</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-reference_002c-drawable-425">reference, drawable</a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-reference_002c-multiple-options-365">reference, multiple options</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-reference_002c-options-362">reference, options</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-reference_002c-drawable-360">reference, drawable</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-reference_002c-drawable-426">reference, drawable</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-reference_002c-multiple-options-366">reference, multiple options</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-reference_002c-options-363">reference, options</a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-reference_002c-options-149">reference, options</a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="#index-reference_002c-point-350">reference, point</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-reference_002c-point-351">reference, point</a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-reference_002c-point-37">reference, point</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-reference_002c-scalar-99">reference, scalar</a>: <a href="#Swept-objects">Swept objects</a></li>
-<li><a href="#index-reference_002c-scalar-348">reference, scalar</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-reference_002c-tag-345">reference, tag</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="#index-reference_002c-tag-368">reference, tag</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-reference_002c-transform-412">reference, transform</a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-reference_002c-transform-356">reference, transform</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-reference_002c-scalar-349">reference, scalar</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-reference_002c-tag-346">reference, tag</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="#index-reference_002c-tag-369">reference, tag</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-reference_002c-transform-413">reference, transform</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-reference_002c-transform-357">reference, transform</a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-reference_002c-vector-119">reference, vector</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="#index-reference_002c-vector-353">reference, vector</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-repeated-object-332">repeated object</a>: <a href="#Repeats">Repeats</a></li>
+<li><a href="#index-reference_002c-vector-354">reference, vector</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-repeated-object-333">repeated object</a>: <a href="#Repeats">Repeats</a></li>
 <li><a href="#index-reserved-words-172">reserved words</a>: <a href="#Key-and-reserved-words">Key and reserved words</a></li>
 <li><a href="#index-right-hand-rule-83">right hand rule</a>: <a href="#Object-transforms">Object transforms</a></li>
 <li><a href="#index-right_002dhand-coordinate-system-4">right-hand coordinate system</a>: <a href="#Introduction-by-example">Introduction by example</a></li>
 <li><a href="#index-rotation-81">rotation</a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-rotation-transform-493">rotation transform</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-rotation-transform-494">rotation transform</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-rotation-transform-183">rotation transform</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-rotation-transform-491">rotation transform</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-rotation-transform-492">rotation transform</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-rotation_002c-center-of-60">rotation, center of</a>: <a href="#Object-transforms">Object transforms</a></li>
 <li><a href="#index-rotation_002c-center-of-122">rotation, center of</a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
 <li><a href="#index-running-_0040code_007bsketch_007d-8">running <code>sketch</code></a>: <a href="#Hello-world">Hello world</a></li>
 <li><a href="#index-scalar-definition-98">scalar definition</a>: <a href="#Swept-objects">Swept objects</a></li>
 <li><a href="#index-scalar-literal-173">scalar literal</a>: <a href="#Scalar-literals">Scalar literals</a></li>
-<li><a href="#index-scalar-reference-347">scalar reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-scalar-reference-348">scalar reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-scale-transform-189">scale transform</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-scene-description-language-403">scene description language</a>: <a href="#Building-a-drawing">Building a drawing</a></li>
+<li><a href="#index-scene-description-language-404">scene description language</a>: <a href="#Building-a-drawing">Building a drawing</a></li>
 <li><a href="#index-scene-description-language-161">scene description language</a>: <a href="#Language-basics">Language basics</a></li>
 <li><a href="#index-scope_002c-identifier-73">scope, identifier</a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-scope_002c-identifier-330">scope, identifier</a>: <a href="#Blocks">Blocks</a></li>
-<li><a href="#index-simple-definition-338">simple definition</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="#index-scope_002c-identifier-331">scope, identifier</a>: <a href="#Blocks">Blocks</a></li>
+<li><a href="#index-simple-definition-339">simple definition</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
 <li><a href="#index-solid-28">solid</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="#index-special-argument-substitution-275">special argument substitution</a>: <a href="#Specials">Specials</a></li>
+<li><a href="#index-special-argument-substitution-276">special argument substitution</a>: <a href="#Specials">Specials</a></li>
 <li><a href="#index-special-argument-substitution-53">special argument substitution</a>: <a href="#Special-objects">Special objects</a></li>
 <li><a href="#index-special-object-49">special object</a>: <a href="#Special-objects">Special objects</a></li>
-<li><a href="#index-special-objects-455">special objects</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
-<li><a href="#index-splitting_002c-line-and-surface-500">splitting, line and surface</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="#index-special-objects-456">special objects</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-splitting_002c-line-and-surface-501">splitting, line and surface</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li>
 <li><a href="#index-splitting_002c-line-and-surface-10">splitting, line and surface</a>: <a href="#Hello-world">Hello world</a></li>
 <li><a href="#index-substitution_002c-special-52">substitution, special</a>: <a href="#Special-objects">Special objects</a></li>
 <li><a href="#index-surface-107">surface</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="#index-sweep-92">sweep</a>: <a href="#Swept-objects">Swept objects</a></li>
-<li><a href="#index-swept-bock-317">swept bock</a>: <a href="#Swept-blocks">Swept blocks</a></li>
+<li><a href="#index-swept-bock-318">swept bock</a>: <a href="#Swept-blocks">Swept blocks</a></li>
 <li><a href="#index-swept-line-106">swept line</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="#index-swept-line-291">swept line</a>: <a href="#Swept-lines">Swept lines</a></li>
-<li><a href="#index-swept-line-444">swept line</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
+<li><a href="#index-swept-line-292">swept line</a>: <a href="#Swept-lines">Swept lines</a></li>
+<li><a href="#index-swept-line-445">swept line</a>: <a href="#A-technical-drawing">A technical drawing</a></li>
 <li><a href="#index-swept-object-91">swept object</a>: <a href="#Swept-objects">Swept objects</a></li>
-<li><a href="#index-swept-object-279">swept object</a>: <a href="#Sweeps">Sweeps</a></li>
-<li><a href="#index-swept-point-283">swept point</a>: <a href="#Swept-points">Swept points</a></li>
+<li><a href="#index-swept-object-280">swept object</a>: <a href="#Sweeps">Sweeps</a></li>
+<li><a href="#index-swept-point-284">swept point</a>: <a href="#Swept-points">Swept points</a></li>
 <li><a href="#index-swept-point-96">swept point</a>: <a href="#Swept-objects">Swept objects</a></li>
-<li><a href="#index-swept-polygon-495">swept polygon</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-swept-polygon-496">swept polygon</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-swept-polygon-133">swept polygon</a>: <a href="#Polygon-sweeps">Polygon sweeps</a></li>
-<li><a href="#index-tag-definition-337">tag definition</a>: <a href="#Definitions">Definitions</a></li>
-<li><a href="#index-tag-definition-513">tag definition</a>: <a href="#Command-line">Command line</a></li>
-<li><a href="#index-tag-definition-342">tag definition</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="#index-tag-reference-344">tag reference</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="#index-tag-reference-367">tag reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-template_002c-document-512">template, document</a>: <a href="#Command-line">Command line</a></li>
+<li><a href="#index-tag-definition-338">tag definition</a>: <a href="#Definitions">Definitions</a></li>
+<li><a href="#index-tag-definition-514">tag definition</a>: <a href="#Command-line">Command line</a></li>
+<li><a href="#index-tag-definition-343">tag definition</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="#index-tag-reference-345">tag reference</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="#index-tag-reference-368">tag reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-template_002c-document-513">template, document</a>: <a href="#Command-line">Command line</a></li>
 <li><a href="#index-template_002c-document-16">template, document</a>: <a href="#Hello-world">Hello world</a></li>
 <li><a href="#index-tetrahedron-30">tetrahedron</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-tick-operator-_0028_0040code_007b_0027_007d_0029-227">tick operator (<code>'</code>)</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-tick-operator-_0028_0040code_007b_0027_007d_0029-157">tick operator (<code>'</code>)</a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li>
 <li><a href="#index-TikZ_002fPGF-2">TikZ/PGF</a>: <a href="#About-sketch">About sketch</a></li>
 <li><a href="#index-toroid-123">toroid</a>: <a href="#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="#index-transform-333">transform</a>: <a href="#Repeats">Repeats</a></li>
-<li><a href="#index-transform-405">transform</a>: <a href="#Overview">Overview</a></li>
-<li><a href="#index-transform-280">transform</a>: <a href="#Sweeps">Sweeps</a></li>
+<li><a href="#index-transform-334">transform</a>: <a href="#Repeats">Repeats</a></li>
+<li><a href="#index-transform-406">transform</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-transform-281">transform</a>: <a href="#Sweeps">Sweeps</a></li>
 <li><a href="#index-transform-224">transform</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-transform-58">transform</a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-transform-definition-408">transform definition</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-transform-definition-409">transform definition</a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-transform-literal-179">transform literal</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-transform-reference-355">transform reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
-<li><a href="#index-transform-reference-411">transform reference</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-transform-reference-356">transform reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-transform-reference-412">transform reference</a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-transform_002c-direct-216">transform, direct</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-transform_002c-rotation-490">transform, rotation</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-transform_002c-rotation-491">transform, rotation</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-transform_002c-rotation-184">transform, rotation</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-transform_002c-rotation-494">transform, rotation</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-transform_002c-rotation-495">transform, rotation</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-transform_002c-scale-190">transform, scale</a>: <a href="#Transform-literals">Transform literals</a></li>
 <li><a href="#index-transform_002c-translation-86">transform, translation</a>: <a href="#Object-transforms">Object transforms</a></li>
 <li><a href="#index-transform_002c-translation-187">transform, translation</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-transform_002c-translation-486">transform, translation</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-transform_002c-translation-487">transform, translation</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-transform_002c-view-209">transform, view</a>: <a href="#Transform-literals">Transform literals</a></li>
 <li><a href="#index-translation-transform-186">translation transform</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-translation-transform-485">translation transform</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="#index-translation-transform-486">translation transform</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="#index-translation-transform-85">translation transform</a>: <a href="#Object-transforms">Object transforms</a></li>
-<li><a href="#index-transparency-252">transparency</a>: <a href="#Transparency">Transparency</a></li>
+<li><a href="#index-transparency-253">transparency</a>: <a href="#Transparency">Transparency</a></li>
 <li><a href="#index-two_002doperand-form-218">two-operand form</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="#index-unary-form-238">unary form</a>: <a href="#Unary-forms">Unary forms</a></li>
 <li><a href="#index-vector-87">vector</a>: <a href="#Object-transforms">Object transforms</a></li>
 <li><a href="#index-vector-definition-118">vector definition</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="#index-vector-literal-177">vector literal</a>: <a href="#Point-and-vector-literals">Point and vector literals</a></li>
-<li><a href="#index-vector-reference-352">vector reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
+<li><a href="#index-vector-reference-353">vector reference</a>: <a href="#Forms-of-references">Forms of references</a></li>
 <li><a href="#index-view-transform-205">view transform</a>: <a href="#Transform-literals">Transform literals</a></li>
-<li><a href="#index-virtual-camera-438">virtual camera</a>: <a href="#Overview">Overview</a></li>
+<li><a href="#index-virtual-camera-439">virtual camera</a>: <a href="#Overview">Overview</a></li>
 <li><a href="#index-white-space-165">white space</a>: <a href="#Language-basics">Language basics</a></li>
 <li><a href="#index-white-space-41">white space</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="#index-white-space-77">white space</a>: <a href="#Object-transforms">Object transforms</a></li>
diff --git a/Doc/sketch.info b/Doc/sketch.info
index 74a91e7..97f80e8 100644
--- a/Doc/sketch.info
+++ b/Doc/sketch.info
@@ -2,8 +2,8 @@ This is sketch.info, produced by makeinfo version 4.7 from sketch.texi.
 
    Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-   This manual is for `sketch', version 0.2 (build 187), Friday,
-December 17, 2010, a program that converts descriptions of simple
+   This manual is for `sketch', version 0.3 (build 1), Saturday,
+January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the TeX document
 processing system.
@@ -35,8 +35,8 @@ Sketch
 
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-   This manual is for `sketch', version 0.2 (build 187), Friday,
-December 17, 2010, a program that converts descriptions of simple
+   This manual is for `sketch', version 0.3 (build 1), Saturday,
+January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the TeX document
 processing system.
@@ -217,8 +217,8 @@ File: sketch.info,  Node: Reporting bugs,  Next: Contributions,  Prev: About ske
 1.1 Reporting bugs and recommending improvements.
 =================================================
 
-Report bugs and make suggestions at our Google Group
-http://groups.google.com/group/sketch-users.  A second method that will
+The group http://groups.google.com/group/sketch-users is the best place
+to report bugs and make improvements.  A second method that will
 probably produce a slower response is email to sketch at frontiernet.net.
 We will try to respond, but can't promise.  In any event, don't be
 offended if a reply is not forthcoming.  We're just busy and will get
@@ -447,14 +447,26 @@ non-white space character following special is understood to be the
 quote character, in this case `|'.  The raw text continues until this
 character recurs.
 
-   Second, the argument references #1, #2, #3, and #4 refer to points
-in the list that follow.  This is similar to TeX macro syntax.  The
-transformed and two-dimensional projections of these three-dimensional
-points are substituted in the final output.  An argument reference of
-the form #1-2 is replaced with the angle in degrees of the
-two-dimensional vector that connects the projections of the two
-respective argument points, here #1 and #2.  The substituted angle is
-enclosed in curly braces `{ }'
+   Second, the argument references #1, #2, #3, and #4 refer to point,
+vector, or scalar values in the list that follow.  This is similar to
+TeX macro syntax.  The transformed and two-dimensional projections of
+these three-dimensional points are substituted in the final output.  An
+argument reference of the form #1-2 is replaced with the angle in
+degrees of the two-dimensional vector that connects the projections of
+the two respective argument points, here #1 and #2.  The substituted
+angle is enclosed in curly braces `{ }'.  When `TikZ/PGF' output is
+being generated, the angle is rounded to the nearest degree because
+non-integer angles are not allowed by `TikZ/PGF' primitives.
+
+   As of Version 0.3 of `sketch', special arguments may be scalars or
+vectors in addition to points. References to scalar arguments are
+merely replaced with a number formatted just as any point coordinate.
+References to vectors become two-dimensional points. The tick operator
+that selects individual components of points and vectors elsewhere in
+`sketch' (see for example *Note Affine arithmetic::) can also be
+applied to point and vector argument references.  All three dimensions
+of a transformed point or vector can also be substitued with `'3'. See
+*Note Specials:: for details.
 
    By default, `special' objects are printed last, overlaying all other
 objects in the scene.  If you specify the internal option `lay=in', the
@@ -1318,27 +1330,51 @@ File: sketch.info,  Node: Specials,  Next: Sweeps,  Prev: Polygons,  Up: Drawabl
 --------------
 
 *Syntax:*
-     special $RAW_TEXT$[lay=LAY_VALUE] POINT_LIST
+     special $RAW_TEXT$[OPTIONS] ARG_LIST
    Here `$' can be any character and is used to delimit the start and
 end of RAW_TEXT.  The command embeds RAW_TEXT in the `sketch' output
 after performing substitutions as follows.  
-   * `#I' where I is a positive integer is replaced by the I'th point
-     in POINT_LIST.
+   * `#I' where I is a positive integer is replaced by the I'th value
+     in ARG_LIST.  Point and vector arguments become two-dimensional
+     points, which are the transformed 3d arguments projected onto the
+     X-Y plane. This allows two-dimentional output elements such as
+     labels to be easily positioned with respect to three-dimensional
+     features in the drawing. Scalar arguments are subsituted directly.
+     No transformation is applied.
 
    * `#{I}' is also replaced as above.
 
+   * `#I'2' is replaced as above for points or vectors.  It is an error
+     for the I'th argument to be a scalar.
+
+   * `#I'x', `#I'y', or `#I'z' is replaced, respectively, by the scalar
+     X, Y, or Z-coordinate of the argument point or vector. It is an
+     error for the I'th argument to be a scalar.
+
+   * `#I'3' is replaced by the three-dimensional transformed argument.
+     Note that if a perspective transformation has been applied, the
+     Z-coordinate has little geometric significance, though it
+     accurately indicates relative depth.
+
    * `#I-J' where I and J are positive integers is replaced by a string
      `{ANGLE}' where ANGLE is the polar angle of a vector from the I'th
-     point in POINT_LIST to the J'th.
+     point in POINT_LIST to the J'th point projected into the x-y
+     plane.  It is an error for the I'th or J'th argument to be a
+     scalar or a vector.
 
    * `#{I-J}' is also replaced as above.
 
    * `##' is replaced with `#'.
    The forms with braces `{ }' are useful when the argument is
-immediately followed by a digit that is part of the TeX code.
+immediately followed by a digit or a tick character that is part of the
+TeX code.
 
-   The only useful option of `special' is `lay'.  *Note Internal
-options::.
+   The only useful option of `special' is `lay', which determines if
+the substitued raw text is emitted before, after, or using the first
+point in POINT_LIST as an indicator of depth.  These occur,
+respectively, with `lay=under', `lay=over', and `lay=in'.  See *Note
+Special objects:: and *Note TikZ/PGF user-defined styles:: for examples.  *Note
+Internal options::.
 
 
 File: sketch.info,  Node: Sweeps,  Next: Blocks,  Prev: Specials,  Up: Drawables
@@ -2515,33 +2551,33 @@ Index of syntax
 * 'x, 'y, and 'z:                        Affine arithmetic.   (line  40)
 * ( ), grouping:                         Two-operand (binary) forms.
                                                               (line  60)
-* (foo), point reference <1>:            Forms of references. (line  14)
-* (foo), point reference:                Drawing a solid.     (line  25)
+* (foo), point reference <1>:            Drawing a solid.     (line  25)
+* (foo), point reference:                Forms of references. (line  14)
 * *, multiplication operator:            Two-operand (binary) forms.
-                                                              (line  19)
+                                                              (line  70)
 * +, plus operator:                      Two-operand (binary) forms.
                                                               (line  11)
 * -, minus operator:                     Two-operand (binary) forms.
                                                               (line  15)
 * -, unary minus operator:               Unary forms.         (line  10)
 * ., dot operator:                       Two-operand (binary) forms.
-                                                              (line  63)
+                                                              (line  19)
 * /, division operator:                  Two-operand (binary) forms.
                                                               (line  38)
-* <>, closure tag <1>:                   Swept lines.         (line  28)
+* <>, closure tag <1>:                   Polyline sweeps with closure.
+                                                              (line   6)
 * <>, closure tag <2>:                   Sweeps.              (line  19)
-* <>, closure tag <3>:                   Sweep face splitting.
+* <>, closure tag <3>:                   Swept points.        (line  13)
+* <>, closure tag <4>:                   Sweep face splitting.
                                                               (line  11)
-* <>, closure tag <4>:                   Polyline sweeps with closure.
-                                                              (line   6)
-* <>, closure tag <5>:                   Swept points.        (line  13)
+* <>, closure tag <5>:                   Swept lines.         (line  28)
 * <>, closure tag <6>:                   Point sweeps.        (line  18)
-* <>, closure tag <7>:                   Swept points.        (line   6)
-* <>, closure tag:                       Swept lines.         (line   6)
+* <>, closure tag <7>:                   Swept lines.         (line   6)
+* <>, closure tag:                       Swept points.        (line   6)
 * <foo>, tag reference <1>:              Forms of definitions.
                                                               (line  21)
 * <foo>, tag reference:                  Forms of references. (line  19)
-* [[ ][ ][ ][ ]], transform literal:     Transform literals.  (line  42)
+* [[ ][ ][ ][ ]], transform literal:     Transform literals.  (line  52)
 * [[foo]], transform reference <1>:      Overview.            (line  38)
 * [[foo]], transform reference <2>:      Forms of references. (line  16)
 * [[foo]], transform reference:          Overview.            (line  38)
@@ -2550,52 +2586,53 @@ Index of syntax
 * [foo], options reference <1>:          Polyline sweeps with closure.
                                                               (line  25)
 * [foo], options reference:              Forms of references. (line  18)
-* [foo], vector reference <1>:           Forms of references. (line  15)
-* [foo], vector reference:               Polyline sweeps.     (line  22)
+* [foo], vector reference <1>:           Polyline sweeps.     (line  22)
+* [foo], vector reference:               Forms of references. (line  15)
 * ^, exponentiation operator:            Two-operand (binary) forms.
                                                               (line  27)
-* arrows <1>:                            A technical drawing. (line  29)
-* arrows <2>:                            Affine arithmetic.   (line  29)
-* arrows:                                Overview.            (line  75)
+* arrows <1>:                            Overview.            (line  75)
+* arrows <2>:                            A technical drawing. (line  72)
+* arrows:                                Affine arithmetic.   (line  11)
 * atan2:                                 Unary forms.         (line  17)
 * camera:                                Camera.              (line   6)
 * context:                               Language.            (line  17)
 * cos:                                   Unary forms.         (line  16)
 * cull <1>:                              Transparency.        (line  15)
-* cull <2>:                              Internal options.    (line   7)
-* cull <3>:                              Polyline sweeps.     (line  10)
-* cull <4>:                              A technical drawing. (line  22)
+* cull <2>:                              A technical drawing. (line  22)
+* cull <3>:                              Drawing a solid.     (line  46)
+* cull <4>:                              Internal options.    (line   7)
 * cull <5>:                              Global options.      (line  14)
-* cull:                                  Drawing a solid.     (line  46)
+* cull:                                  Polyline sweeps.     (line  10)
 * curve:                                 Curves.              (line   6)
 * def <1>:                               Affine arithmetic.   (line  11)
-* def <2>:                               A hierarchical model.
-                                                              (line  23)
-* def <3>:                               A technical drawing. (line  15)
-* def <4>:                               Nested sweeps.       (line   8)
-* def <5>:                               Overview.            (line  75)
-* def <6>:                               Object transforms.   (line  10)
-* def <7>:                               Drawing a solid.     (line  23)
-* def <8>:                               A hierarchical model.
+* def <2>:                               Point sweeps.        (line  19)
+* def <3>:                               A technical drawing. (line 100)
+* def <4>:                               Overview.            (line  40)
+* def <5>:                               A hierarchical model.
                                                               (line  10)
-* def <9>:                               Overview.            (line  12)
-* def <10>:                              A technical drawing. (line  72)
-* def <11>:                              Point sweeps.        (line  19)
-* def <12>:                              Polyline sweeps.     (line  10)
-* def <13>:                              Polyline sweeps with closure.
+* def <6>:                               A technical drawing. (line  45)
+* def <7>:                               Object transforms.   (line  10)
+* def <8>:                               Overview.            (line  12)
+* def <9>:                               Polyline sweeps with closure.
                                                               (line  10)
-* def <14>:                              Drawing a solid.     (line   9)
-* def <15>:                              A technical drawing. (line  45)
-* def <16>:                              Overview.            (line  40)
-* def:                                   A technical drawing. (line  29)
+* def <10>:                              A technical drawing. (line  29)
+* def <11>:                              A hierarchical model.
+                                                              (line  23)
+* def <12>:                              Nested sweeps.       (line   8)
+* def <13>:                              A hierarchical model.
+                                                              (line  34)
+* def <14>:                              Drawing a solid.     (line  23)
+* def <15>:                              Polyline sweeps.     (line  10)
+* def <16>:                              Drawing a solid.     (line   9)
+* def:                                   A technical drawing. (line  15)
 * dots:                                  Dots.                (line   6)
 * fill opacity:                          Transparency.        (line  10)
 * fill style:                            TikZ/PGF user-defined styles.
                                                               (line  29)
-* fillcolor <1>:                         Object transforms.   (line  10)
-* fillcolor <2>:                         Overview.            (line  40)
-* fillcolor:                             Polyline sweeps with closure.
+* fillcolor <1>:                         Polyline sweeps with closure.
                                                               (line  10)
+* fillcolor <2>:                         Overview.            (line  40)
+* fillcolor:                             Object transforms.   (line  10)
 * frame:                                 Frame.               (line   6)
 * framesep:                              Frame.               (line  11)
 * global:                                Global environment.  (line  12)
@@ -2603,37 +2640,41 @@ Index of syntax
 * inverse:                               Unary forms.         (line  18)
 * language:                              Language.            (line   6)
 * latex:                                 Language.            (line  17)
-* lay <1>:                               Special objects.     (line  37)
-* lay <2>:                               Specials.            (line  26)
-* lay <3>:                               Global options.      (line  14)
-* lay <4>:                               A technical drawing. (line  29)
-* lay <5>:                               Internal options.    (line   7)
-* lay:                                   A technical drawing. (line  29)
-* line <1>:                              A technical drawing. (line  45)
-* line <2>:                              Swept blocks.        (line   7)
-* line <3>:                              Lines.               (line   6)
-* line <4>:                              A technical drawing. (line  72)
-* line <5>:                              A hierarchical model.
+* lay <1>:                               A technical drawing. (line  29)
+* lay <2>:                               TikZ/PGF user-defined styles.
+                                                              (line  42)
+* lay <3>:                               Internal options.    (line   7)
+* lay <4>:                               A technical drawing. (line 100)
+* lay <5>:                               Special objects.     (line  49)
+* lay <6>:                               Global options.      (line  14)
+* lay <7>:                               A technical drawing. (line  29)
+* lay:                                   Specials.            (line  50)
+* line <1>:                              Swept blocks.        (line   7)
+* line <2>:                              Object transforms.   (line  10)
+* line <3>:                              A technical drawing. (line  22)
+* line <4>:                              Affine arithmetic.   (line  11)
+* line <5>:                              Drawing options.     (line   7)
+* line <6>:                              A hierarchical model.
                                                               (line  10)
-* line <6>:                              Overview.            (line  75)
-* line <7>:                              Object transforms.   (line  10)
-* line <8>:                              Drawing options.     (line   7)
-* line <9>:                              Affine arithmetic.   (line  11)
-* line:                                  Polyline sweeps with closure.
+* line <7>:                              A technical drawing. (line  45)
+* line <8>:                              Polyline sweeps with closure.
                                                               (line  10)
+* line <9>:                              A technical drawing. (line  72)
+* line <10>:                             Overview.            (line  75)
+* line:                                  Lines.               (line   6)
 * line style:                            TikZ/PGF user-defined styles.
                                                               (line  29)
-* linecolor <1>:                         Overview.            (line  75)
-* linecolor <2>:                         Frame.               (line  10)
+* linecolor <1>:                         Frame.               (line  10)
+* linecolor <2>:                         Overview.            (line  75)
 * linecolor:                             Object transforms.   (line  10)
 * linestyle <1>:                         Frame.               (line  10)
-* linestyle <2>:                         Bugs and anomalies.  (line   7)
-* linestyle <3>:                         A technical drawing. (line  29)
-* linestyle:                             Overview.            (line  75)
-* linewidth <1>:                         Frame.               (line  10)
+* linestyle <2>:                         Overview.            (line  75)
+* linestyle <3>:                         Bugs and anomalies.  (line   7)
+* linestyle:                             A technical drawing. (line  29)
+* linewidth <1>:                         A technical drawing. (line  29)
 * linewidth <2>:                         Polyline sweeps.     (line  10)
-* linewidth <3>:                         A technical drawing. (line  29)
-* linewidth:                             Overview.            (line  75)
+* linewidth <3>:                         Overview.            (line  75)
+* linewidth:                             Frame.               (line  10)
 * opacity:                               Transparency.        (line  10)
 * perspective:                           Transform literals.  (line  21)
 * picturebox:                            Picture box.         (line   6)
@@ -2848,7 +2889,7 @@ Index of concepts
 * hidden surface algorithm <1>:          A technical drawing. (line  28)
 * hidden surface algorithm <2>:          Hello world.         (line  21)
 * hidden surface algorithm <3>:          Transform literals.  (line  21)
-* hidden surface algorithm <4>:          Special objects.     (line  37)
+* hidden surface algorithm <4>:          Special objects.     (line  49)
 * hidden surface algorithm:              Hidden surface removal.
                                                               (line   6)
 * hierarchical model:                    A hierarchical model.
@@ -2856,7 +2897,7 @@ Index of concepts
 * identifiers:                           Identifiers.         (line   7)
 * include file:                          Language basics.     (line  19)
 * input file:                            Language basics.     (line   6)
-* internal option:                       Special objects.     (line  36)
+* internal option:                       Special objects.     (line  48)
 * internal options <1>:                  Global options.      (line  13)
 * internal options:                      Internal options.    (line   6)
 * keywords:                              Key and reserved words.
@@ -2884,7 +2925,7 @@ Index of concepts
                                                               (line  46)
 * option:                                Drawing options.     (line   6)
 * option, command line:                  Hello world.         (line  32)
-* option, internal:                      Special objects.     (line  36)
+* option, internal:                      Special objects.     (line  48)
 * options:                               Options.             (line   6)
 * options definition:                    Polyline sweeps with closure.
                                                               (line  24)
@@ -3088,88 +3129,88 @@ Index of concepts
 
 
 Tag Table:
-Node: Top1173
-Node: About sketch7165
-Node: Reporting bugs8390
-Node: Contributions9410
-Ref: Solid coil example9828
-Node: Introduction by example9828
-Node: Hello world10852
-Ref: Hello world-Footnote-113003
-Node: Drawing options13058
-Node: Drawing a solid14194
-Ref: Helix with cull set false then true16524
-Node: Special objects17048
-Node: Object transforms19327
-Ref: Right hand rule21560
-Node: Repeated objects22007
-Node: Swept objects22570
-Node: Point sweeps23680
-Node: Polyline sweeps24683
-Node: Nested sweeps25619
-Node: Polygon sweeps26925
-Node: Polyline sweeps with closure27378
-Node: Affine arithmetic29053
-Node: More to learn30971
-Node: Input language31361
-Node: Language basics31822
-Node: Identifiers33210
-Node: Key and reserved words33797
-Node: Literals34528
-Node: Scalar literals34998
-Node: Point and vector literals35382
-Node: Transform literals35762
-Node: Arithmetic40331
-Node: Two-operand (binary) forms40695
-Node: Unary forms44430
-Node: Options45503
-Node: PSTricks options46204
-Node: TikZ/PGF options47226
-Node: Dots in TikZ/PGF48754
-Node: TikZ/PGF user-defined styles49336
-Ref: TikZ/PGF user-defined styles-Footnote-151357
-Node: Transparency51413
-Node: Internal options52223
-Node: Drawables53927
-Node: Dots54906
-Node: Lines55141
-Node: Curves55375
-Node: Polygons55675
-Node: Specials56103
-Node: Sweeps57055
-Node: Swept points58339
-Node: Swept lines59418
-Node: Swept polygons62001
-Node: Swept blocks63553
-Node: Sweep face splitting64101
-Node: Blocks64699
-Node: Repeats65275
-Node: Puts65927
-Node: Definitions66115
-Node: Forms of definitions67336
-Node: Forms of references68249
-Node: Global environment69254
-Node: Global options70156
-Node: Camera70698
-Node: Picture box71110
-Node: Frame72129
-Node: Language72577
-Node: Building a drawing73536
-Node: Overview74337
-Node: A technical drawing81823
-Node: A hierarchical model86593
-Node: Caveats92990
-Node: Limits on error detection93565
-Node: Clipping95011
-Node: Hidden surface removal95424
-Ref: Hidden surface removal-Footnote-196829
-Ref: Hidden surface removal-Footnote-297007
-Node: Statistics97385
-Node: Bugs and anomalies98682
-Ref: Bugs and anomalies-Footnote-1100504
-Node: Command line100603
-Node: Installing sketch103224
-Node: Index of syntax106183
-Node: Index122776
+Node: Top1172
+Node: About sketch7163
+Node: Reporting bugs8388
+Node: Contributions9420
+Ref: Solid coil example9838
+Node: Introduction by example9838
+Node: Hello world10862
+Ref: Hello world-Footnote-113013
+Node: Drawing options13068
+Node: Drawing a solid14204
+Ref: Helix with cull set false then true16534
+Node: Special objects17058
+Node: Object transforms20104
+Ref: Right hand rule22337
+Node: Repeated objects22784
+Node: Swept objects23347
+Node: Point sweeps24457
+Node: Polyline sweeps25460
+Node: Nested sweeps26396
+Node: Polygon sweeps27702
+Node: Polyline sweeps with closure28155
+Node: Affine arithmetic29830
+Node: More to learn31748
+Node: Input language32138
+Node: Language basics32599
+Node: Identifiers33987
+Node: Key and reserved words34574
+Node: Literals35305
+Node: Scalar literals35775
+Node: Point and vector literals36159
+Node: Transform literals36539
+Node: Arithmetic41108
+Node: Two-operand (binary) forms41472
+Node: Unary forms45207
+Node: Options46280
+Node: PSTricks options46981
+Node: TikZ/PGF options48003
+Node: Dots in TikZ/PGF49531
+Node: TikZ/PGF user-defined styles50113
+Ref: TikZ/PGF user-defined styles-Footnote-152134
+Node: Transparency52190
+Node: Internal options53000
+Node: Drawables54704
+Node: Dots55683
+Node: Lines55918
+Node: Curves56152
+Node: Polygons56452
+Node: Specials56880
+Node: Sweeps59172
+Node: Swept points60456
+Node: Swept lines61535
+Node: Swept polygons64118
+Node: Swept blocks65670
+Node: Sweep face splitting66218
+Node: Blocks66816
+Node: Repeats67392
+Node: Puts68044
+Node: Definitions68232
+Node: Forms of definitions69453
+Node: Forms of references70366
+Node: Global environment71371
+Node: Global options72273
+Node: Camera72815
+Node: Picture box73227
+Node: Frame74246
+Node: Language74694
+Node: Building a drawing75653
+Node: Overview76454
+Node: A technical drawing83940
+Node: A hierarchical model88710
+Node: Caveats95107
+Node: Limits on error detection95682
+Node: Clipping97128
+Node: Hidden surface removal97541
+Ref: Hidden surface removal-Footnote-198946
+Ref: Hidden surface removal-Footnote-299124
+Node: Statistics99502
+Node: Bugs and anomalies100799
+Ref: Bugs and anomalies-Footnote-1102621
+Node: Command line102720
+Node: Installing sketch105341
+Node: Index of syntax108300
+Node: Index125246
 
 End Tag Table
diff --git a/Doc/sketch.pdf b/Doc/sketch.pdf
index 8d01fc9..b2f42a2 100644
Binary files a/Doc/sketch.pdf and b/Doc/sketch.pdf differ
diff --git a/Doc/sketch.texi b/Doc/sketch.texi
index 49ad018..2d9dfb9 100644
--- a/Doc/sketch.texi
+++ b/Doc/sketch.texi
@@ -226,8 +226,8 @@ mathematics formatting in a three-dimensional setting.
 @node Reporting bugs, Contributions, About sketch, About sketch
 @comment  node-name,  next,  previous,  up
 @section Reporting bugs and recommending improvements.
-Report bugs and make suggestions at
-our Google Group @verb{|http://groups.google.com/group/sketch-users|}.
+The group @verb{|http://groups.google.com/group/sketch-users|}
+is the best place to report bugs and make improvements.
 A second method that will probably produce a slower
 response is email to @verb{|sketch at frontiernet.net|}.
 We will try to respond, but can't promise.  In any event, don't be
@@ -542,17 +542,29 @@ text continues until this character recurs.
 
 Second, the argument references 
 @cindex argument, special
- at verb{|#1|}, @verb{|#2|}, @verb{|#3|},
-and @verb{|#4|} refer to points in the list that follow.  This is
-similar to @TeX{} macro syntax.  The transformed and two-dimensional
-projections of these three-dimensional points are substituted 
+ at verb{|#1|}, @verb{|#2|}, @verb{|#3|}, and @verb{|#4|} refer to point,
+vector, or scalar values in the list that follow.  This is similar to
+ at TeX{} macro syntax.  The transformed and two-dimensional projections
+of these three-dimensional points are substituted
 @cindex substitution, special
 @cindex special argument substitution
 in the final output.  An argument reference of the form @verb{|#1-2|}
 is replaced with the angle in degrees of the two-dimensional vector
 that connects the projections of the two respective argument points,
 here @verb{|#1|} and @verb{|#2|}.  The substituted angle is enclosed
-in curly braces @code{@{ @}}
+in curly braces @code{@{ @}}.  When @code{TikZ/PGF} output is being
+generated, the angle is rounded to the nearest degree because
+non-integer angles are not allowed by @code{TikZ/PGF} primitives.
+
+As of Version 0.3 of @code{sketch}, special arguments may be scalars
+or vectors in addition to points. References to scalar arguments are
+merely replaced with a number formatted just as any point
+coordinate. References to vectors become two-dimensional points. The
+tick operator that selects individual components of points and vectors
+elsewhere in @code{sketch} (see for example @ref{Affine arithmetic})
+can also be applied to point and vector argument references.  All
+three dimensions of a transformed point or vector can also be
+substitued with @code{'3}. See @ref{Specials} for details.
 
 By default, @code{special} objects are printed last, overlaying all
 other objects in the scene.  If you specify the internal option
@@ -1568,6 +1580,7 @@ A useful technique is to include user-defined style definitions in
 @code{sketch} code as @code{special}s with option @code{[lay=under]}
 to ensure that the styles are emitted first in the output, before
 any uses of the style names.
+ at opindex lay
 @footnote{This clever trick is due to Kjell Magne Fauske.}  For
 example,
 @verbatim
@@ -1738,7 +1751,7 @@ assumptions are violated.
 @sxindex special
 @strong{Syntax:}
 @example
-special $@var{raw_text}$[lay=@var{lay_value}] @var{point_list}
+special $@var{raw_text}$[@var{options}] @var{arg_list}
 @end example
 @noindent
 Here @code{$} 
@@ -1750,15 +1763,35 @@ and end of @var{raw_text}.  The command embeds @var{raw_text} in the
 @cindex argument, special
 @itemize
 @item 
- at code{#@var{i}} where @var{i} is a positive integer is replaced by 
-the @var{i}'th point in @var{point_list}.
+ at code{#@var{i}} where @var{i} is a positive integer is replaced by the
+ at var{i}'th value in @var{arg_list}.  Point and vector arguments become
+two-dimensional points, which are the transformed 3d arguments
+projected onto the @var{x}- at var{y} plane. This allows
+two-dimentional output elements such as labels to be easily positioned
+with respect to three-dimensional features in the drawing. Scalar 
+arguments are subsituted directly. No transformation is applied.
 @item
 @code{#@{@var{i}@}} is also replaced as above.
 @item
+ at code{#@var{i}'2} is replaced as above for points or vectors.  It is
+an error for the @var{i}'th argument to be a scalar.
+ at item
+ at code{#@var{i}'x}, @code{#@var{i}'y}, or @code{#@var{i}'z} is
+replaced, respectively, by the scalar @var{x}, @var{y}, or
+ at var{z}-coordinate of the argument point or vector. It is an error for
+the @var{i}'th argument to be a scalar.
+ at item
+ at code{#@var{i}'3} is replaced by the three-dimensional
+transformed argument. Note that if a perspective transformation has
+been applied, the @var{z}-coordinate has little geometric
+significance, though it accurately indicates relative depth.
+ at item
 @code{#@var{i}- at var{j}} where @var{i} and @var{j} are positive
 integers is replaced by a string @code{@{@var{angle}@}} where
 @var{angle} is the polar angle of a vector from the @var{i}'th point
-in @var{point_list} to the @var{j}'th.
+in @var{point_list} to the @var{j}'th point projected into the
+ at math{x}- at math{y} plane.  It is an error for the @var{i}'th or
+ at var{j}'th argument to be a scalar or a vector.
 @item
 @code{#@{@var{i}- at var{j}@}} is also replaced as above.
 @item 
@@ -1766,9 +1799,15 @@ in @var{point_list} to the @var{j}'th.
 @end itemize
 @noindent
 The forms with braces @samp{@{ @}} are useful when the argument is
-immediately followed by a digit that is part of the @TeX{} code.
-
-The only useful option of @code{special} is @code{lay}.
+immediately followed by a digit or a tick character that is part of
+the @TeX{} code.
+
+The only useful option of @code{special} is @code{lay}, which
+determines if the substitued raw text is emitted before, after,
+or using the first point in @var{point_list} as an indicator
+of depth.  These occur, respectively, with @code{lay=under},
+ at code{lay=over}, and @code{lay=in}.  See @ref{Special objects}
+and @ref{TikZ/PGF user-defined styles} for examples.
 @sxindex lay
 @xref{Internal options}.
 
diff --git a/Doc/sketch/A-hierarchical-model.html b/Doc/sketch/A-hierarchical-model.html
index 9594fde..e2afed2 100644
--- a/Doc/sketch/A-hierarchical-model.html
+++ b/Doc/sketch/A-hierarchical-model.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,12 +55,12 @@ Up: <a rel="up" accesskey="u" href="Building-a-drawing.html#Building-a-draw
 <!-- node-name,  next,  previous,  up -->
 <h3 class="section">4.3 A hierarchical model</h3>
 
-<p><a name="index-hierarchical-model-472"></a>While <code>sketch</code> was never meant to be a geometric modeling
+<p><a name="index-hierarchical-model-473"></a>While <code>sketch</code> was never meant to be a geometric modeling
 language, it comes fairly close.  The following example puts all we
 have seen to work in a very simple model of the human hand.  Start by
 sweeping a line to make a truncated cone, which will be copied over
 and over again to make the segments of fingers. 
-<a name="index-def-473"></a><a name="index-sweep-474"></a><a name="index-rotate-475"></a><a name="index-line-476"></a>
+<a name="index-def-474"></a><a name="index-sweep-475"></a><a name="index-rotate-476"></a><a name="index-line-477"></a>
 <pre class="verbatim">
   def O (0,0,0) % origin
   def I [1,0,0] def J [0,1,0] def K [0,0,1] % canonical unit vectors
@@ -76,7 +76,7 @@ constants.  You can find them in <span class="file">hand.sk</span>, which is pro
 in the <code>sketch</code> distribution.
 
    <p>We also need a prototypical sphere to use for the joints themselves. 
-<a name="index-def-477"></a><a name="index-sweep-478"></a><a name="index-rotate-479"></a>
+<a name="index-def-478"></a><a name="index-sweep-479"></a><a name="index-rotate-480"></a>
 <pre class="verbatim">
   def joint_sphere {
     def n_joint_faces 8
@@ -89,7 +89,7 @@ in the <code>sketch</code> distribution.
    <p>We'll now design the index finger (number <!-- /@w -->1 in our notational
 convention; finger <!-- /@w -->0 is the thumb).  The distal rotation for the
 finger applies only to the tip, so we define the following. 
-<a name="index-def-480"></a><a name="index-put-481"></a><a name="index-translate-482"></a><a name="index-rotate-483"></a><a name="index-scale-484"></a>
+<a name="index-def-481"></a><a name="index-put-482"></a><a name="index-translate-483"></a><a name="index-rotate-484"></a><a name="index-scale-485"></a>
 <pre class="verbatim">
   def distal_1 {
     put { translate(joint_gap * joint_rad * [J]) 
@@ -107,9 +107,9 @@ The identifiers here are for size and location constants. The
 exception is <code>distal_rot_1</code>.  This rotation parameter models the
 flexing of the finger tip.  The first <code>put</code> makes a copy of the
 finger segment that is translated upward
-<a name="index-translation-transform-485"></a><a name="index-transform_002c-translation-486"></a>just far enough to make room
+<a name="index-translation-transform-486"></a><a name="index-transform_002c-translation-487"></a>just far enough to make room
 for the spherical joint.  Then it applies the distal rotation. 
-<a name="index-rotation-transform-487"></a><a name="index-transform_002c-rotation-488"></a>Finally it translates the whole assembly upward again to make room for
+<a name="index-rotation-transform-488"></a><a name="index-transform_002c-rotation-489"></a>Finally it translates the whole assembly upward again to make room for
 the middle phlanges (the next bone toward the palm).  The second
 <code>put</code> positions the sphere.  There is a rotation to place the
 grid on the sphere surface at an nice angle, then a translation to the
@@ -119,7 +119,7 @@ Finally, the last <code>put</code> positions the middle segment itself.
    <p>The middle joint is the next one down, with rotation angle
 <code>middle_rot_1</code>.  When this angle changes, we need all the objects
 in <code>distal_1</code> to rotate as a unit. 
-<a name="index-rotation-transform-489"></a><a name="index-transform_002c-rotation-490"></a>This is the reasoning behind
+<a name="index-rotation-transform-490"></a><a name="index-transform_002c-rotation-491"></a>This is the reasoning behind
 the next definition.
 <pre class="verbatim">
   def finger_1 {
@@ -142,7 +142,7 @@ This looks very similar to the previous definition, and it is.  The
 important difference is that rather than positioning and rotating a
 single segment, we position and rotate the entire “assembly” defined
 as <code>distal_1</code>. 
-<a name="index-rotation-transform-491"></a><a name="index-transform_002c-rotation-492"></a>The rest is just arithmetic to compute sizes and
+<a name="index-rotation-transform-492"></a><a name="index-transform_002c-rotation-493"></a>The rest is just arithmetic to compute sizes and
 positions that look nice.  The last <code>put</code> places an appropriately
 shaped segment that is the <em>proximal phlanges</em>, the bone that
 joins the palm of the hand.  This completes the finger itself.
@@ -159,7 +159,7 @@ source code.) Not surprisingly, the <code>hand</code> definition looks very
 much like the previous two.  It should be no surprise that when the
 rotation parameter <code>meta_1_rot</code> changes, the entire finger
 rotates! 
-<a name="index-rotation-transform-493"></a><a name="index-transform_002c-rotation-494"></a>There is an additional rotation that allows the fingers to spread
+<a name="index-rotation-transform-494"></a><a name="index-transform_002c-rotation-495"></a>There is an additional rotation that allows the fingers to spread
 laterally.  We say these joints of the proximal phlanges have two
 <em>degrees of freedom</em>. The joints higher on the finger have only
 one. Finally, each finger is scaled by a factor to lend it proportion.
@@ -190,7 +190,7 @@ one. Finally, each finger is scaled by a factor to lend it proportion.
 </pre>
 The last section of the definition creates the polytope for the palm
 of the hand by <code>sweep</code>ing
-<a name="index-swept-polygon-495"></a><a name="index-polygon-sweep-496"></a>a 10-sided polygon through a very short
+<a name="index-swept-polygon-496"></a><a name="index-polygon-sweep-497"></a>a 10-sided polygon through a very short
 arc (9 <!-- /@w -->degrees).  This provides a wedge-shaped profile when viewed
 from the side. The thick end of the wedge is the wrist.  Because the
 polygon is concave, it is split into into two convex shapes with nine
diff --git a/Doc/sketch/A-technical-drawing.html b/Doc/sketch/A-technical-drawing.html
index ef75380..758875d 100644
--- a/Doc/sketch/A-technical-drawing.html
+++ b/Doc/sketch/A-technical-drawing.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -64,7 +64,7 @@ pictures we will produce.
 
    <p>The cone shape is just a swept line with no closure tag and culling
 turned off.  Begin by setting up some useful constants. 
-<a name="index-def-439"></a><a name="index-rotate-440"></a>
+<a name="index-def-440"></a><a name="index-rotate-441"></a>
 <pre class="verbatim">
   def O (0,0,0) def I [1,0,0] def J [0,1,0] def K [0,0,1]
   def p0 (1,2) def p1 (1.5,0) def N 8
@@ -73,7 +73,7 @@ turned off.  Begin by setting up some useful constants.
 The points <code>p0</code> and <code>p1</code> are the end points of the line to
 be swept.  The definition <code>seg_rot</code> is the sweep transformation. 
 With these, the cone itself is simple. 
-<a name="index-sweep-441"></a><a name="index-cull-442"></a><a name="index-line-443"></a><a name="index-swept-line-444"></a><a name="index-line-sweep-445"></a>
+<a name="index-sweep-442"></a><a name="index-cull-443"></a><a name="index-line-444"></a><a name="index-swept-line-445"></a><a name="index-line-sweep-446"></a>
 <pre class="verbatim">
   sweep[cull=false] { N, [[seg_rot]] } line(p0)(p1)
 </pre>
@@ -81,10 +81,10 @@ With these, the cone itself is simple.
    <p>The axes are next and include an interesing trick that shows the
 hidden parts as dotted lines.  The secret is draw the axes
 twice—solid lines with the normal
-<a name="index-hidden-surface-algorithm-446"></a>hidden surface algorithm in effect, and then dotted with the
+<a name="index-hidden-surface-algorithm-447"></a>hidden surface algorithm in effect, and then dotted with the
 option
-<a name="index-lay-447"></a><code>lay=over</code> so that no polygons can hide them. 
-<a name="index-def-448"></a><a name="index-line-449"></a><a name="index-arrows-450"></a><a name="index-linewidth-451"></a><a name="index-lay-452"></a><a name="index-linestyle-453"></a><a name="index-special-454"></a>
+<a name="index-lay-448"></a><code>lay=over</code> so that no polygons can hide them. 
+<a name="index-def-449"></a><a name="index-line-450"></a><a name="index-arrows-451"></a><a name="index-linewidth-452"></a><a name="index-lay-453"></a><a name="index-linestyle-454"></a><a name="index-special-455"></a>
 <pre class="verbatim">
   def ax (dx,0,0) % tips of the axes
   def ay (0,dy,0)
@@ -99,11 +99,11 @@ option
     (ax)(ay)(az)
 </pre>
 The labels are applied with <code>PSTricks</code> special objects
-<a name="index-special-objects-455"></a>as usual.
+<a name="index-special-objects-456"></a>as usual.
 
    <p>For the height dimension mark, the power of affine
-<a name="index-affine-arithmetic-456"></a>arithetic is very helpful. 
-<a name="index-def-457"></a><a name="index-unit-458"></a><a name="index-scale-459"></a><a name="index-line-460"></a><a name="index-special-461"></a>
+<a name="index-affine-arithmetic-457"></a>arithetic is very helpful. 
+<a name="index-def-458"></a><a name="index-unit-459"></a><a name="index-scale-460"></a><a name="index-line-461"></a><a name="index-special-462"></a>
 <pre class="verbatim">
   def hdim_ref unit((p1) - (O)) then [[seg_rot]]^2
   def c0 (p0) then scale([J])
@@ -129,11 +129,11 @@ location of the height dimension lines by varying the exponent of
 <code>[[seg_rot]]</code>.  This is only one of many possible strategies.
 
    <p>The computation of <code>hm2</code> is a useful idiom for finding the
-<a name="index-centroid-462"></a>centroid of a set of points.
+<a name="index-centroid-463"></a>centroid of a set of points.
 
    <p>The two radius marks are done similarly, so we present the code
 without comment. 
-<a name="index-def-463"></a><a name="index-line-464"></a><a name="index-special-465"></a><a name="index-scale-466"></a><a name="index-arrows-467"></a>
+<a name="index-def-464"></a><a name="index-line-465"></a><a name="index-special-466"></a><a name="index-scale-467"></a><a name="index-arrows-468"></a>
 <pre class="verbatim">
   % radius measurement marks
   def gap [0,.2,0]  % used to create small vertical gaps
@@ -163,7 +163,7 @@ without comment.
 
    <p>The second drawing uses the same techniques.  Only the method for
 drawing the elliptical arc is new.  Here is the code. 
-<a name="index-def-468"></a><a name="index-special-469"></a><a name="index-lay-470"></a>
+<a name="index-def-469"></a><a name="index-special-470"></a><a name="index-lay-471"></a>
 <pre class="verbatim">
   def mid ((p00)-(O)+(p10)-(O)+(p11)-(O)+(p01)-(O))/4+(O)
   special|\rput#1{\pscustom{
@@ -174,7 +174,7 @@ drawing the elliptical arc is new.  Here is the code.
 We could have swept a point to make the arc with <code>sketch</code>, but
 using a <code>PSTricks</code> custom graphic was simpler.  Again we computed
 the
-<a name="index-centroid-471"></a>centroid of the quadrilateral by averaging points.  Note that scaling
+<a name="index-centroid-472"></a>centroid of the quadrilateral by averaging points.  Note that scaling
 in Postscript distorts the arrowhead, but in this case the distortion
 actually looks better in the projection of the slanted face.  A
 <code>sketch</code> arrowhead would not have been distorted.
diff --git a/Doc/sketch/About-sketch.html b/Doc/sketch/About-sketch.html
index 0dfcc46..dc264f7 100644
--- a/Doc/sketch/About-sketch.html
+++ b/Doc/sketch/About-sketch.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Affine-arithmetic.html b/Doc/sketch/Affine-arithmetic.html
index e21727a..4623890 100644
--- a/Doc/sketch/Affine-arithmetic.html
+++ b/Doc/sketch/Affine-arithmetic.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Arithmetic.html b/Doc/sketch/Arithmetic.html
index ea356f2..953ab5d 100644
--- a/Doc/sketch/Arithmetic.html
+++ b/Doc/sketch/Arithmetic.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Blocks.html b/Doc/sketch/Blocks.html
index 25c6553..5b4878c 100644
--- a/Doc/sketch/Blocks.html
+++ b/Doc/sketch/Blocks.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,7 +55,7 @@ Up: <a rel="up" accesskey="u" href="Drawables.html#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.7 Blocks</h4>
 
-<p><a name="index-block-327"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-328"></a>Any sequence of drawables may be grouped in a <dfn>block</dfn> merely by
+<p><a name="index-block-328"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-329"></a>Any sequence of drawables may be grouped in a <dfn>block</dfn> merely by
 enclosing them in braces <span class="samp">{ }</span>.  A block is itself drawable.  A
 key use of blocks is to extend the effect of a single <code>def</code>,
 <a href="Definitions.html#Definitions">Definitions</a>, <code>put</code> <a href="Puts.html#Puts">Puts</a>, <code>sweep</code> <a href="Sweeps.html#Sweeps">Sweeps</a>,
@@ -64,7 +64,7 @@ one.
 
    <p>Definitions (See <a href="Definitions.html#Definitions">Definitions</a>.) inside a block have <dfn>lexical
 scope</dfn>
-<a name="index-lexical-scope-329"></a><a name="index-scope_002c-identifier-330"></a>extending from the place of definition to the end of the block.
+<a name="index-lexical-scope-330"></a><a name="index-scope_002c-identifier-331"></a>extending from the place of definition to the end of the block.
 
    </body></html>
 
diff --git a/Doc/sketch/Bugs-and-anomalies.html b/Doc/sketch/Bugs-and-anomalies.html
index 30045e5..b8497cf 100644
--- a/Doc/sketch/Bugs-and-anomalies.html
+++ b/Doc/sketch/Bugs-and-anomalies.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,8 +55,8 @@ Up: <a rel="up" accesskey="u" href="Hidden-surface-removal.html#Hidden-surf
 
 <p>Polygon and line splitting can both cause anomalies in the output. 
 <code>PSTricks</code> dash patterns, specified with <code>linestyle=dashed</code>,
-<a name="index-linestyle-504"></a>can be disrupted by splitting.  This occurs when the depth sort
-<a name="index-depth-sort-505"></a>gives up too early and splits a line where it is not really
+<a name="index-linestyle-505"></a>can be disrupted by splitting.  This occurs when the depth sort
+<a name="index-depth-sort-506"></a>gives up too early and splits a line where it is not really
 necessary. 
 A workaround is to use gray or finely dotted
 lines instead.  If your drawing is small, you can also edit the
diff --git a/Doc/sketch/Building-a-drawing.html b/Doc/sketch/Building-a-drawing.html
index 5d13bf1..d841f90 100644
--- a/Doc/sketch/Building-a-drawing.html
+++ b/Doc/sketch/Building-a-drawing.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -56,7 +56,7 @@ Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
 
 <p>Successful drawings with <code>sketch</code> and with any scene description
 language
-<a name="index-scene-description-language-403"></a>require that the user develop an accurate mental picture of her code
+<a name="index-scene-description-language-404"></a>require that the user develop an accurate mental picture of her code
 and its meaning.  This image is best built in small pieces. 
 Therefore, <code>sketch</code> inputs are best created in small increments
 with frequent pauses to compile and view the results.  Careful
diff --git a/Doc/sketch/Camera.html b/Doc/sketch/Camera.html
index 116ee01..bbed803 100644
--- a/Doc/sketch/Camera.html
+++ b/Doc/sketch/Camera.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,8 +55,8 @@ Up: <a rel="up" accesskey="u" href="Global-environment.html#Global-environm
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.2 Camera</h4>
 
-<p><a name="index-camera-379"></a><strong>Syntax:</strong>
-<a name="index-camera-380"></a>
+<p><a name="index-camera-380"></a><strong>Syntax:</strong>
+<a name="index-camera-381"></a>
 <pre class="example">     camera <var>transform_expression</var>
 </pre>
    <p>The <var>transform_expression</var> is applied after all other
diff --git a/Doc/sketch/Caveats.html b/Doc/sketch/Caveats.html
index 8f14c09..393bffa 100644
--- a/Doc/sketch/Caveats.html
+++ b/Doc/sketch/Caveats.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Clipping.html b/Doc/sketch/Clipping.html
index 3403e5d..74a0e7f 100644
--- a/Doc/sketch/Clipping.html
+++ b/Doc/sketch/Clipping.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -56,7 +56,7 @@ Up: <a rel="up" accesskey="u" href="Caveats.html#Caveats">Caveats</a>
 <h4 class="subsection">4.4.2 Clipping</h4>
 
 <p>The current version of <code>sketch</code> has no clipping
-<a name="index-clipping-497"></a>operations.  The entire scene is always drawn.  This means that when a
+<a name="index-clipping-498"></a>operations.  The entire scene is always drawn.  This means that when a
 perspective transform is employed, it is the user's responsibility to
 make sure the entire scene remains in front of the viewer, the region
 z<0.
diff --git a/Doc/sketch/Command-line.html b/Doc/sketch/Command-line.html
index b6c475c..1a93525 100644
--- a/Doc/sketch/Command-line.html
+++ b/Doc/sketch/Command-line.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -54,7 +54,7 @@ Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
 <!-- node-name,  next,  previous,  up -->
 <h2 class="chapter">5 Command line</h2>
 
-<p><a name="index-command-line_002c-_0040code_007bsketch_007d-506"></a><strong>Synopsis:</strong>
+<p><a name="index-command-line_002c-_0040code_007bsketch_007d-507"></a><strong>Synopsis:</strong>
 <pre class="example">     sketch [-h][-V x.y][-v][-b][-d][t doctmp][-T[u|e][p[P|T][L|C]]][-o output.tex]
        [-D <var>tag</var> ...] input1.sk [-U <var>tag</var> ...] input2.sk ...
 </pre>
@@ -64,7 +64,7 @@ Processes the <code>sketch</code> input files in order to produce
 LaTeX document.
 
 <p class="noindent"><strong>Options:</strong>
-<a name="index-options_002c-command-line-507"></a><a name="index-command-line-options-508"></a>
+<a name="index-options_002c-command-line-508"></a><a name="index-command-line-options-509"></a>
      <dl>
 <dt><code>-h</code><dd>Print a short catalog of options. 
 <br><dt><code>-V</code><dd>Set the <code>PSTricks</code> version assumed for output purposes to
@@ -74,7 +74,7 @@ LaTeX document.
 <br><dt><code>-v</code><dd>Print version information to standard output, including the version
 of <code>PSTricks</code> assumed for output (can be changed with <code>-V</code> above). 
 <br><dt><code>-b</code><dd>Use a BSP
-<a name="index-binary-space-partition-509"></a><a name="index-BSP_002c-binary-space-partition-510"></a>(See <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a>.) for
+<a name="index-binary-space-partition-510"></a><a name="index-BSP_002c-binary-space-partition-511"></a>(See <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a>.) for
 <em>all</em> hidden surface removal rather than the default, which is
 the depth sort algorithm with BSPs used only for cycle resolution. 
 This may produce correct output in certain degenerate cases where the
@@ -83,7 +83,7 @@ more anomalies <a href="Bugs-and-anomalies.html#Bugs-and-anomalies">Bugs and ano
 <br><dt><code>-d</code><dd>Run <code>sketch</code>'s parser in debugging mode.  This is primarily for
 development. 
 <br><dt><code>-t</code><dd>Use contents of file <span class="file">doctmp</span> as a document template
-<a name="index-document-template-511"></a><a name="index-template_002c-document-512"></a>in which to enclose <code>PSTricks</code> output code.  The code is inserted
+<a name="index-document-template-512"></a><a name="index-template_002c-document-513"></a>in which to enclose <code>PSTricks</code> output code.  The code is inserted
 in place of the first instance of the escape string
 <tt>%%SKETCH_OUTPUT%%</tt>. 
 <br><dt><code>-T</code><dd>Causes <code>PSTricks</code> output to be enclosed in default US document
@@ -97,7 +97,7 @@ prints the LaTeX version of the document template, a synonym for
 the default.  A <span class="option">C</span> prints the <code>ConTeXt</code> template. 
 <br><dt><code>-o</code><dd>Use <span class="file">output.tex</span> as the output file.  The default is standard output. 
 <br><dt><code>-D</code><dd>Define a tag
-<a name="index-tag-definition-513"></a><a name="index-definition_002c-tag-514"></a>for purposes of selecting definition alternatives. 
+<a name="index-tag-definition-514"></a><a name="index-definition_002c-tag-515"></a>for purposes of selecting definition alternatives. 
 See <a href="Definitions.html#Definitions">Definitions</a>.  The definition applies for all input files that
 follow unless the tag is undefined with <span class="option">-U</span>. 
 <br><dt><code>inputi.sk</code><dd>Input files, read in the sequence they are given. 
diff --git a/Doc/sketch/Contributions.html b/Doc/sketch/Contributions.html
index c67c37d..ca53ee4 100644
--- a/Doc/sketch/Contributions.html
+++ b/Doc/sketch/Contributions.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Curves.html b/Doc/sketch/Curves.html
index 62eda47..4ef8f30 100644
--- a/Doc/sketch/Curves.html
+++ b/Doc/sketch/Curves.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,7 +55,7 @@ Up: <a rel="up" accesskey="u" href="Drawables.html#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.3 Curves</h4>
 
-<p><a name="index-curve-269"></a><strong>Syntax:</strong>
+<p><a name="index-curve-270"></a><strong>Syntax:</strong>
 <pre class="example">     curve[<var>options</var>] <var>point_list</var>
 </pre>
    <p class="noindent">This command is the three-dimensional equivalent of the
diff --git a/Doc/sketch/Definitions.html b/Doc/sketch/Definitions.html
index ed4029b..752a2eb 100644
--- a/Doc/sketch/Definitions.html
+++ b/Doc/sketch/Definitions.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,7 +55,7 @@ Up: <a rel="up" accesskey="u" href="Input-language.html#Input-language">Inp
 <!-- node-name,  next,  previous,  up -->
 <h3 class="section">3.3 Definitions</h3>
 
-<p><a name="index-definition-335"></a>Definitions give names to <code>sketch</code> objects.  Definitions alone
+<p><a name="index-definition-336"></a>Definitions give names to <code>sketch</code> objects.  Definitions alone
 are benign.  A <code>sketch</code> input file consisting entirely of
 definitions will generate no drawing.  Only when definitions are
 <dfn>referenced</dfn> do they potentially lead to ink on the drawing.
@@ -68,7 +68,7 @@ that could not be re-written without them.
 expression (scalar, point, vector, or transform), any drawable
 object (dots, line, curve, polygon, block, sweep, put, repeat, or
 special), and option strings.  In addition, <dfn>tag definitions</dfn>,
-<a name="index-definition_002c-tag-336"></a><a name="index-tag-definition-337"></a>which have no associated object at all, allow the meaning of other
+<a name="index-definition_002c-tag-337"></a><a name="index-tag-definition-338"></a>which have no associated object at all, allow the meaning of other
 definitions to be selected from a set of alternatives. Since tags may
 be defined (and undefined) in the command line of <code>sketch</code>, they
 can be an aid in the script-driven preparation of documents.
diff --git a/Doc/sketch/Dots-in-TikZ_002fPGF.html b/Doc/sketch/Dots-in-TikZ_002fPGF.html
index 40e1ce9..70ef714 100644
--- a/Doc/sketch/Dots-in-TikZ_002fPGF.html
+++ b/Doc/sketch/Dots-in-TikZ_002fPGF.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Dots.html b/Doc/sketch/Dots.html
index 251a903..7aa34d2 100644
--- a/Doc/sketch/Dots.html
+++ b/Doc/sketch/Dots.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,7 +55,7 @@ Up: <a rel="up" accesskey="u" href="Drawables.html#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.1 Dots</h4>
 
-<p><a name="index-dots-267"></a><strong>Syntax:</strong>
+<p><a name="index-dots-268"></a><strong>Syntax:</strong>
 <pre class="example">     dots[<var>options</var>] <var>point_list</var>
 </pre>
    <p class="noindent">This command is the three-dimensional equivalent of the
diff --git a/Doc/sketch/Drawables.html b/Doc/sketch/Drawables.html
index 0030676..636d593 100644
--- a/Doc/sketch/Drawables.html
+++ b/Doc/sketch/Drawables.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,7 +55,7 @@ Up: <a rel="up" accesskey="u" href="Input-language.html#Input-language">Inp
 <!-- node-name,  next,  previous,  up -->
 <h3 class="section">3.2 Drawables</h3>
 
-<p><a name="index-drawable-266"></a>Drawables are simply <code>sketch</code> objects that might appear in the
+<p><a name="index-drawable-267"></a>Drawables are simply <code>sketch</code> objects that might appear in the
 drawing.  They include dots, polylines, curves, polygons, and more
 complex objects that are built up from simpler ones in various ways. 
 Finally, <dfn>special</dfn> objects are those composed of LaTeX or
diff --git a/Doc/sketch/Drawing-a-solid.html b/Doc/sketch/Drawing-a-solid.html
index 7b09f96..b19906e 100644
--- a/Doc/sketch/Drawing-a-solid.html
+++ b/Doc/sketch/Drawing-a-solid.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Drawing-options.html b/Doc/sketch/Drawing-options.html
index 10d3a60..b80940a 100644
--- a/Doc/sketch/Drawing-options.html
+++ b/Doc/sketch/Drawing-options.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Forms-of-definitions.html b/Doc/sketch/Forms-of-definitions.html
index a6c9206..7789899 100644
--- a/Doc/sketch/Forms-of-definitions.html
+++ b/Doc/sketch/Forms-of-definitions.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -56,9 +56,9 @@ Up: <a rel="up" accesskey="u" href="Definitions.html#Definitions">Definitio
 <h4 class="subsection">3.3.1 Forms of definitions</h4>
 
 <p>Definitions have three possible forms, <dfn>simple</dfn>,
-<a name="index-simple-definition-338"></a><a name="index-definition_002c-simple-339"></a><dfn>with alternatives</dfn>,
-<a name="index-definition-with-alternatives-340"></a><a name="index-alternatives_002c-definition-341"></a>and <dfn>tag</dfn>
-<a name="index-tag-definition-342"></a><a name="index-definition_002c-tag-343"></a>as shown here in order.
+<a name="index-simple-definition-339"></a><a name="index-definition_002c-simple-340"></a><dfn>with alternatives</dfn>,
+<a name="index-definition-with-alternatives-341"></a><a name="index-alternatives_002c-definition-342"></a>and <dfn>tag</dfn>
+<a name="index-tag-definition-343"></a><a name="index-definition_002c-tag-344"></a>as shown here in order.
 
 <p class="noindent"><strong>Syntax:</strong>
 <pre class="example">     def <var>id</var> <var>object</var>  % simple def
@@ -74,7 +74,7 @@ identifier <var>id</var>.
    <p>The definition with alternatives associates
 <var>object_i</var> with <var>id</var>, where <var>tag_i</var> is the
 first defined tag in the list of alternative tag references. 
-<a name="index-tag-reference-344"></a><a name="index-reference_002c-tag-345"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-346"></a>If no tag in the list is defined, then <var>default_object</var> is
+<a name="index-tag-reference-345"></a><a name="index-reference_002c-tag-346"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-347"></a>If no tag in the list is defined, then <var>default_object</var> is
 associated with identifier <var>id</var>.
 
    <p>The final form defines <var>id</var> as a tag.  Another way to define a tag
diff --git a/Doc/sketch/Forms-of-references.html b/Doc/sketch/Forms-of-references.html
index 5fed543..ecb8bd3 100644
--- a/Doc/sketch/Forms-of-references.html
+++ b/Doc/sketch/Forms-of-references.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -60,13 +60,13 @@ this mechanism is, again, to make <code>sketch</code> input files more
 readable.
    <p><table summary=""><tr align="left"><th valign="top">Type  </th><th valign="top">Reference
 <br></th></tr><tr align="left"><td valign="top">scalar    </td><td valign="top"><var>id</var>
-<a name="index-scalar-reference-347"></a><a name="index-reference_002c-scalar-348"></a><br></td></tr><tr align="left"><td valign="top">point     </td><td valign="top"><code>(</code><var>id</var><code>)</code>
-<a name="index-point-reference-349"></a><a name="index-reference_002c-point-350"></a><a name="index-_0028foo_0029_0040r_007b_002c-point-reference_007d-351"></a><br></td></tr><tr align="left"><td valign="top">vector    </td><td valign="top"><code>[</code><var>id</var><code>]</code>
-<a name="index-vector-reference-352"></a><a name="index-reference_002c-vector-353"></a><a name="index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-354"></a><br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>[[</code><var>id</var><code>]]</code>
-<a name="index-transform-reference-355"></a><a name="index-reference_002c-transform-356"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-357"></a><br></td></tr><tr align="left"><td valign="top">drawable  </td><td valign="top"><code>{</code><var>id</var><code>}</code>
-<a name="index-drawable-reference-358"></a><a name="index-reference_002c-drawable-359"></a><a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-360"></a><br></td></tr><tr align="left"><td valign="top">options   </td><td valign="top"><code>[</code><var>id</var><code>]</code> or <code>[</code><var>id1</var><code>,...,</code><var>idN</var><code>]</code>
-<a name="index-options-reference-361"></a><a name="index-reference_002c-options-362"></a><a name="index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-363"></a><a name="index-options-multiple-reference-364"></a><a name="index-reference_002c-multiple-options-365"></a><a name="index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-366"></a><br></td></tr><tr align="left"><td valign="top">tag       </td><td valign="top"><code><</code><var>id</var><code>></code>
-<a name="index-tag-reference-367"></a><a name="index-reference_002c-tag-368"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-369"></a>
+<a name="index-scalar-reference-348"></a><a name="index-reference_002c-scalar-349"></a><br></td></tr><tr align="left"><td valign="top">point     </td><td valign="top"><code>(</code><var>id</var><code>)</code>
+<a name="index-point-reference-350"></a><a name="index-reference_002c-point-351"></a><a name="index-_0028foo_0029_0040r_007b_002c-point-reference_007d-352"></a><br></td></tr><tr align="left"><td valign="top">vector    </td><td valign="top"><code>[</code><var>id</var><code>]</code>
+<a name="index-vector-reference-353"></a><a name="index-reference_002c-vector-354"></a><a name="index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-355"></a><br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>[[</code><var>id</var><code>]]</code>
+<a name="index-transform-reference-356"></a><a name="index-reference_002c-transform-357"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-358"></a><br></td></tr><tr align="left"><td valign="top">drawable  </td><td valign="top"><code>{</code><var>id</var><code>}</code>
+<a name="index-drawable-reference-359"></a><a name="index-reference_002c-drawable-360"></a><a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-361"></a><br></td></tr><tr align="left"><td valign="top">options   </td><td valign="top"><code>[</code><var>id</var><code>]</code> or <code>[</code><var>id1</var><code>,...,</code><var>idN</var><code>]</code>
+<a name="index-options-reference-362"></a><a name="index-reference_002c-options-363"></a><a name="index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-364"></a><a name="index-options-multiple-reference-365"></a><a name="index-reference_002c-multiple-options-366"></a><a name="index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-367"></a><br></td></tr><tr align="left"><td valign="top">tag       </td><td valign="top"><code><</code><var>id</var><code>></code>
+<a name="index-tag-reference-368"></a><a name="index-reference_002c-tag-369"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-370"></a>
    <br></td></tr></table>
    <pre class="sp">
 
diff --git a/Doc/sketch/Frame.html b/Doc/sketch/Frame.html
index dd35a7c..2f17afc 100644
--- a/Doc/sketch/Frame.html
+++ b/Doc/sketch/Frame.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,19 +55,19 @@ Up: <a rel="up" accesskey="u" href="Global-environment.html#Global-environm
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.4 Frame</h4>
 
-<p><a name="index-frame-box-389"></a><strong>Syntax:</strong>
-<a name="index-frame-390"></a>
+<p><a name="index-frame-box-390"></a><strong>Syntax:</strong>
+<a name="index-frame-391"></a>
 <pre class="example">     frame [<var>options</var>]
 </pre>
    <p class="noindent">Causes a <tt>\psframebox</tt>
-<a name="index-_0040code_007bpsframebox_007d-391"></a>to surround the <code>pspicture</code>
+<a name="index-_0040code_007bpsframebox_007d-392"></a>to surround the <code>pspicture</code>
 environment in the output.  If <var>options</var> are present, they are
 copied as-is.  Normally one would want to set
-<a name="index-linewidth-392"></a><code>linewidth</code>,
-<a name="index-linestyle-393"></a><code>linestyle</code>,
-<a name="index-linecolor-394"></a><code>linecolor</code>, etc. 
+<a name="index-linewidth-393"></a><code>linewidth</code>,
+<a name="index-linestyle-394"></a><code>linestyle</code>,
+<a name="index-linecolor-395"></a><code>linecolor</code>, etc. 
 If omitted, then
-<a name="index-framesep-395"></a><code>framesep=0pt</code> is
+<a name="index-framesep-396"></a><code>framesep=0pt</code> is
 added so that the frame tightly hugs the <code>pspicture</code>.
 
    </body></html>
diff --git a/Doc/sketch/Global-environment.html b/Doc/sketch/Global-environment.html
index 003289b..d47fd71 100644
--- a/Doc/sketch/Global-environment.html
+++ b/Doc/sketch/Global-environment.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -60,7 +60,7 @@ that previous definitions at the top level (not nested inside
 blocks) are also available.
 
 <p class="noindent"><strong>Syntax:</strong>
-<a name="index-global-370"></a>
+<a name="index-global-371"></a>
 <pre class="example">     global { <var>environment_settings</var> }
 </pre>
    <p class="noindent">The contents of <var>environment_settings</var> are discussed in the
diff --git a/Doc/sketch/Global-options.html b/Doc/sketch/Global-options.html
index 9929daa..e0d4ffe 100644
--- a/Doc/sketch/Global-options.html
+++ b/Doc/sketch/Global-options.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,7 +55,7 @@ Up: <a rel="up" accesskey="u" href="Global-environment.html#Global-environm
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.1 Global options</h4>
 
-<p><a name="index-options_002c-global-371"></a><a name="index-global-options-372"></a><a name="index-set-373"></a><strong>Syntax:</strong>
+<p><a name="index-options_002c-global-372"></a><a name="index-global-options-373"></a><a name="index-set-374"></a><strong>Syntax:</strong>
 <pre class="example">     set [ <var>options</var> ]
 </pre>
    <p class="noindent">The contents of <var>options</var>, except for <code>sketch</code> internal
@@ -64,9 +64,9 @@ anything else in the output file.  This is a good place to set
 <code>unit</code>, a default <code>linewidth</code>, etc.
 
    <p>Internal options
-<a name="index-options_002c-internal-374"></a><a name="index-internal-options-375"></a>work on all objects where they make sense. 
+<a name="index-options_002c-internal-375"></a><a name="index-internal-options-376"></a>work on all objects where they make sense. 
 This includes
-<a name="index-cull-376"></a><a name="index-split-377"></a><a name="index-lay-378"></a><code>cull</code> and <code>split</code> (but not <code>lay</code>). 
+<a name="index-cull-377"></a><a name="index-split-378"></a><a name="index-lay-379"></a><code>cull</code> and <code>split</code> (but not <code>lay</code>). 
 See <a href="Internal-options.html#Internal-options">Internal options</a>.
 
    </body></html>
diff --git a/Doc/sketch/Hello-world.html b/Doc/sketch/Hello-world.html
index bbf09eb..163673f 100644
--- a/Doc/sketch/Hello-world.html
+++ b/Doc/sketch/Hello-world.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Hidden-surface-removal.html b/Doc/sketch/Hidden-surface-removal.html
index fa770d9..e429c8c 100644
--- a/Doc/sketch/Hidden-surface-removal.html
+++ b/Doc/sketch/Hidden-surface-removal.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -54,7 +54,7 @@ Up: <a rel="up" accesskey="u" href="Caveats.html#Caveats">Caveats</a>
 <h4 class="subsection">4.4.3 Hidden surface removal and polygon splitting</h4>
 
 <p><code>Sketch</code> uses the <dfn>depth sort algorithm</dfn>
-<a name="index-depth-sort-498"></a><a name="index-hidden-surface-algorithm-499"></a>for hidden surface removal.  This is a very old technique due to
+<a name="index-depth-sort-499"></a><a name="index-hidden-surface-algorithm-500"></a>for hidden surface removal.  This is a very old technique due to
 Newell.<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a>  It is
 generally regarded as too slow for real time graphics, but it is
 ideal for our purpose where speed is not very important.<a rel="footnote" href="#fn-2" name="fnd-2"><sup>2</sup></a>
@@ -70,10 +70,10 @@ how oil painters practice their art, depth sort is sometimes called
 depth.  Moreover, even if a correct depth ordering exists, the
 computation needed to find it may be too complex and slow.  In these
 cases, <code>sketch</code> splits
-<a name="index-splitting_002c-line-and-surface-500"></a>one or more polygons into pieces.  The
+<a name="index-splitting_002c-line-and-surface-501"></a>one or more polygons into pieces.  The
 expectation is that the new, smaller polygons will be simpler to
 order.  <code>Sketch</code> uses a <acronym title="binary space partition">BSP</acronym> (binary space partition)
-<a name="index-binary-space-partition-501"></a><a name="index-BSP_002c-binary-space-partition-502"></a>to handle the splitting operation.
+<a name="index-binary-space-partition-502"></a><a name="index-BSP_002c-binary-space-partition-503"></a>to handle the splitting operation.
 
 <ul class="menu">
 <li><a accesskey="1" href="Statistics.html#Statistics">Statistics</a>:                   Performance numbers on depth sort. 
diff --git a/Doc/sketch/Identifiers.html b/Doc/sketch/Identifiers.html
index d5c743a..205f92a 100644
--- a/Doc/sketch/Identifiers.html
+++ b/Doc/sketch/Identifiers.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Index-of-syntax.html b/Doc/sketch/Index-of-syntax.html
index 7938d36..28a3379 100644
--- a/Doc/sketch/Index-of-syntax.html
+++ b/Doc/sketch/Index-of-syntax.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -58,194 +58,197 @@ Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_0027x_0040r_007b_002c_007d-_0027y_0040r_007b_002c-and-_007d_0027z-228"><code>'x</code><span class="roman">,</span><code> 'y</code><span class="roman">, and </span><code>'z</code></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Affine-arithmetic.html#index-_0027x_0040r_007b_002c_007d-_0027y_0040r_007b_002c-and-_007d_0027z-158"><code>'x</code><span class="roman">,</span><code> 'y</code><span class="roman">, and </span><code>'z</code></a>: <a href="Affine-arithmetic.html#Affine-arithmetic">Affine arithmetic</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_0028-_0029_0040r_007b_002c-grouping_007d-234"><code>( )</code><span class="roman">, grouping</span></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="Forms-of-references.html#index-_0028foo_0029_0040r_007b_002c-point-reference_007d-351"><code>(foo)</code><span class="roman">, point reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Drawing-a-solid.html#index-_0028foo_0029_0040r_007b_002c-point-reference_007d-38"><code>(foo)</code><span class="roman">, point reference</span></a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_002a_0040r_007b_002c-multiplication-operator_007d-221"><code>*</code><span class="roman">, multiplication operator</span></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
+<li><a href="Forms-of-references.html#index-_0028foo_0029_0040r_007b_002c-point-reference_007d-352"><code>(foo)</code><span class="roman">, point reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_002a_0040r_007b_002c-multiplication-operator_007d-237"><code>*</code><span class="roman">, multiplication operator</span></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_002b_0040r_007b_002c-plus-operator_007d-219"><code>+</code><span class="roman">, plus operator</span></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_002d_0040r_007b_002c-minus-operator_007d-220"><code>-</code><span class="roman">, minus operator</span></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Unary-forms.html#index-_002d_0040r_007b_002c-unary-minus-operator_007d-240"><code>-</code><span class="roman">, unary minus operator</span></a>: <a href="Unary-forms.html#Unary-forms">Unary forms</a></li>
-<li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_002e_0040r_007b_002c-dot-operator_007d-235"><code>.</code><span class="roman">, dot operator</span></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
+<li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_002e_0040r_007b_002c-dot-operator_007d-222"><code>.</code><span class="roman">, dot operator</span></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_002f_0040r_007b_002c-division-operator_007d-226"><code>/</code><span class="roman">, division operator</span></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="Swept-lines.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-302"><code><></code><span class="roman">, closure tag</span></a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="Sweeps.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-281"><code><></code><span class="roman">, closure tag</span></a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
-<li><a href="Sweep-face-splitting.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-325"><code><></code><span class="roman">, closure tag</span></a>: <a href="Sweep-face-splitting.html#Sweep-face-splitting">Sweep face splitting</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-136"><code><></code><span class="roman">, closure tag</span></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="Swept-points.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-288"><code><></code><span class="roman">, closure tag</span></a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
+<li><a href="Sweeps.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-282"><code><></code><span class="roman">, closure tag</span></a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
+<li><a href="Swept-points.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-289"><code><></code><span class="roman">, closure tag</span></a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
+<li><a href="Sweep-face-splitting.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-326"><code><></code><span class="roman">, closure tag</span></a>: <a href="Sweep-face-splitting.html#Sweep-face-splitting">Sweep face splitting</a></li>
+<li><a href="Swept-lines.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-303"><code><></code><span class="roman">, closure tag</span></a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
 <li><a href="Point-sweeps.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-100"><code><></code><span class="roman">, closure tag</span></a>: <a href="Point-sweeps.html#Point-sweeps">Point sweeps</a></li>
-<li><a href="Swept-points.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-285"><code><></code><span class="roman">, closure tag</span></a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
-<li><a href="Swept-lines.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-293"><code><></code><span class="roman">, closure tag</span></a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="Forms-of-definitions.html#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-346"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="Forms-of-references.html#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-369"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Transform-literals.html#index-_005b_005b-_005d_005b-_005d_005b-_005d_005b-_005d_005d_0040r_007b_002c-transform-literal_007d-210"><code>[[ ][ ][ ][ ]]</code><span class="roman">, transform literal</span></a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Overview.html#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-413"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Forms-of-references.html#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-357"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Overview.html#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-410"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Forms-of-references.html#index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-366"><code>[foo,...,bar]</code><span class="roman">, multiple options reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Swept-lines.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-294"><code><></code><span class="roman">, closure tag</span></a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Swept-points.html#index-_003c_003e_0040r_007b_002c-closure-tag_007d-286"><code><></code><span class="roman">, closure tag</span></a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
+<li><a href="Forms-of-definitions.html#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-347"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="Forms-of-references.html#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-370"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Transform-literals.html#index-_005b_005b-_005d_005b-_005d_005b-_005d_005b-_005d_005d_0040r_007b_002c-transform-literal_007d-214"><code>[[ ][ ][ ][ ]]</code><span class="roman">, transform literal</span></a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
+<li><a href="Overview.html#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-414"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Forms-of-references.html#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-358"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Overview.html#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-411"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Forms-of-references.html#index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-367"><code>[foo,...,bar]</code><span class="roman">, multiple options reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-150"><code>[foo]</code><span class="roman">, options reference</span></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="Forms-of-references.html#index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-363"><code>[foo]</code><span class="roman">, options reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Forms-of-references.html#index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-354"><code>[foo]</code><span class="roman">, vector reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-references.html#index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-364"><code>[foo]</code><span class="roman">, options reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Polyline-sweeps.html#index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-120"><code>[foo]</code><span class="roman">, vector reference</span></a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
+<li><a href="Forms-of-references.html#index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-355"><code>[foo]</code><span class="roman">, vector reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-_005e_0040r_007b_002c-exponentiation-operator_007d-223"><code>^</code><span class="roman">, exponentiation operator</span></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="A-technical-drawing.html#index-arrows-450"><code>arrows</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Affine-arithmetic.html#index-arrows-156"><code>arrows</code></a>: <a href="Affine-arithmetic.html#Affine-arithmetic">Affine arithmetic</a></li>
-<li><a href="Overview.html#index-arrows-432"><code>arrows</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-arrows-433"><code>arrows</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="A-technical-drawing.html#index-arrows-468"><code>arrows</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Affine-arithmetic.html#index-arrows-155"><code>arrows</code></a>: <a href="Affine-arithmetic.html#Affine-arithmetic">Affine arithmetic</a></li>
 <li><a href="Unary-forms.html#index-atan2-246"><code>atan2</code></a>: <a href="Unary-forms.html#Unary-forms">Unary forms</a></li>
-<li><a href="Camera.html#index-camera-380"><code>camera</code></a>: <a href="Camera.html#Camera">Camera</a></li>
-<li><a href="Language.html#index-context-402"><code>context</code></a>: <a href="Language.html#Language">Language</a></li>
+<li><a href="Camera.html#index-camera-381"><code>camera</code></a>: <a href="Camera.html#Camera">Camera</a></li>
+<li><a href="Language.html#index-context-403"><code>context</code></a>: <a href="Language.html#Language">Language</a></li>
 <li><a href="Unary-forms.html#index-cos-245"><code>cos</code></a>: <a href="Unary-forms.html#Unary-forms">Unary forms</a></li>
-<li><a href="Transparency.html#index-cull-256"><code>cull</code></a>: <a href="Transparency.html#Transparency">Transparency</a></li>
-<li><a href="Internal-options.html#index-cull-259"><code>cull</code></a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
-<li><a href="Polyline-sweeps.html#index-cull-113"><code>cull</code></a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="A-technical-drawing.html#index-cull-442"><code>cull</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Global-options.html#index-cull-376"><code>cull</code></a>: <a href="Global-options.html#Global-options">Global options</a></li>
+<li><a href="Transparency.html#index-cull-257"><code>cull</code></a>: <a href="Transparency.html#Transparency">Transparency</a></li>
+<li><a href="A-technical-drawing.html#index-cull-443"><code>cull</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Drawing-a-solid.html#index-cull-45"><code>cull</code></a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="Curves.html#index-curve-269"><code>curve</code></a>: <a href="Curves.html#Curves">Curves</a></li>
+<li><a href="Internal-options.html#index-cull-260"><code>cull</code></a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
+<li><a href="Global-options.html#index-cull-377"><code>cull</code></a>: <a href="Global-options.html#Global-options">Global options</a></li>
+<li><a href="Polyline-sweeps.html#index-cull-113"><code>cull</code></a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
+<li><a href="Curves.html#index-curve-270"><code>curve</code></a>: <a href="Curves.html#Curves">Curves</a></li>
 <li><a href="Affine-arithmetic.html#index-def-152"><code>def</code></a>: <a href="Affine-arithmetic.html#Affine-arithmetic">Affine arithmetic</a></li>
-<li><a href="A-hierarchical-model.html#index-def-477"><code>def</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="A-technical-drawing.html#index-def-439"><code>def</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Nested-sweeps.html#index-def-124"><code>def</code></a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="Overview.html#index-def-429"><code>def</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Point-sweeps.html#index-def-102"><code>def</code></a>: <a href="Point-sweeps.html#Point-sweeps">Point sweeps</a></li>
+<li><a href="A-technical-drawing.html#index-def-469"><code>def</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Overview.html#index-def-418"><code>def</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="A-hierarchical-model.html#index-def-474"><code>def</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-technical-drawing.html#index-def-458"><code>def</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Object-transforms.html#index-def-61"><code>def</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
+<li><a href="Overview.html#index-def-408"><code>def</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Polyline-sweeps-with-closure.html#index-def-138"><code>def</code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
+<li><a href="A-technical-drawing.html#index-def-449"><code>def</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="A-hierarchical-model.html#index-def-478"><code>def</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="Nested-sweeps.html#index-def-124"><code>def</code></a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
+<li><a href="A-hierarchical-model.html#index-def-481"><code>def</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Drawing-a-solid.html#index-def-34"><code>def</code></a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="A-hierarchical-model.html#index-def-473"><code>def</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="Overview.html#index-def-407"><code>def</code></a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="A-technical-drawing.html#index-def-463"><code>def</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Point-sweeps.html#index-def-102"><code>def</code></a>: <a href="Point-sweeps.html#Point-sweeps">Point sweeps</a></li>
 <li><a href="Polyline-sweeps.html#index-def-109"><code>def</code></a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="Polyline-sweeps-with-closure.html#index-def-138"><code>def</code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="Drawing-a-solid.html#index-def-31"><code>def</code></a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="A-technical-drawing.html#index-def-457"><code>def</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Overview.html#index-def-417"><code>def</code></a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="A-technical-drawing.html#index-def-448"><code>def</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Dots.html#index-dots-267"><code>dots</code></a>: <a href="Dots.html#Dots">Dots</a></li>
-<li><a href="Transparency.html#index-fill-opacity-255"><code>fill opacity</code></a>: <a href="Transparency.html#Transparency">Transparency</a></li>
+<li><a href="A-technical-drawing.html#index-def-440"><code>def</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Dots.html#index-dots-268"><code>dots</code></a>: <a href="Dots.html#Dots">Dots</a></li>
+<li><a href="Transparency.html#index-fill-opacity-256"><code>fill opacity</code></a>: <a href="Transparency.html#Transparency">Transparency</a></li>
 <li><a href="TikZ_002fPGF-user_002ddefined-styles.html#index-fill-style-250"><code>fill style</code></a>: <a href="TikZ_002fPGF-user_002ddefined-styles.html#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li>
-<li><a href="Object-transforms.html#index-fillcolor-66"><code>fillcolor</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Overview.html#index-fillcolor-416"><code>fillcolor</code></a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-fillcolor-145"><code>fillcolor</code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="Frame.html#index-frame-390"><code>frame</code></a>: <a href="Frame.html#Frame">Frame</a></li>
-<li><a href="Frame.html#index-framesep-395"><code>framesep</code></a>: <a href="Frame.html#Frame">Frame</a></li>
-<li><a href="Global-environment.html#index-global-370"><code>global</code></a>: <a href="Global-environment.html#Global-environment">Global environment</a></li>
+<li><a href="Overview.html#index-fillcolor-417"><code>fillcolor</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Object-transforms.html#index-fillcolor-66"><code>fillcolor</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
+<li><a href="Frame.html#index-frame-391"><code>frame</code></a>: <a href="Frame.html#Frame">Frame</a></li>
+<li><a href="Frame.html#index-framesep-396"><code>framesep</code></a>: <a href="Frame.html#Frame">Frame</a></li>
+<li><a href="Global-environment.html#index-global-371"><code>global</code></a>: <a href="Global-environment.html#Global-environment">Global environment</a></li>
 <li><a href="Language-basics.html#index-input-169"><code>input</code></a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
 <li><a href="Unary-forms.html#index-inverse-247"><code>inverse</code></a>: <a href="Unary-forms.html#Unary-forms">Unary forms</a></li>
-<li><a href="Language.html#index-language-398"><code>language</code></a>: <a href="Language.html#Language">Language</a></li>
-<li><a href="Language.html#index-latex-401"><code>latex</code></a>: <a href="Language.html#Language">Language</a></li>
+<li><a href="Language.html#index-language-399"><code>language</code></a>: <a href="Language.html#Language">Language</a></li>
+<li><a href="Language.html#index-latex-402"><code>latex</code></a>: <a href="Language.html#Language">Language</a></li>
+<li><a href="A-technical-drawing.html#index-lay-448"><code>lay</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="TikZ_002fPGF-user_002ddefined-styles.html#index-lay-252"><code>lay</code></a>: <a href="TikZ_002fPGF-user_002ddefined-styles.html#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li>
+<li><a href="Internal-options.html#index-lay-261"><code>lay</code></a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
+<li><a href="A-technical-drawing.html#index-lay-471"><code>lay</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Special-objects.html#index-lay-56"><code>lay</code></a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
-<li><a href="Specials.html#index-lay-277"><code>lay</code></a>: <a href="Specials.html#Specials">Specials</a></li>
-<li><a href="Global-options.html#index-lay-378"><code>lay</code></a>: <a href="Global-options.html#Global-options">Global options</a></li>
-<li><a href="A-technical-drawing.html#index-lay-452"><code>lay</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Internal-options.html#index-lay-260"><code>lay</code></a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
-<li><a href="A-technical-drawing.html#index-lay-447"><code>lay</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="A-technical-drawing.html#index-line-460"><code>line</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Swept-blocks.html#index-line-321"><code>line</code></a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
-<li><a href="Lines.html#index-line-268"><code>line</code></a>: <a href="Lines.html#Lines">Lines</a></li>
-<li><a href="A-technical-drawing.html#index-line-464"><code>line</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="A-hierarchical-model.html#index-line-476"><code>line</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="Overview.html#index-line-437"><code>line</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Global-options.html#index-lay-379"><code>lay</code></a>: <a href="Global-options.html#Global-options">Global options</a></li>
+<li><a href="A-technical-drawing.html#index-lay-453"><code>lay</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Specials.html#index-lay-278"><code>lay</code></a>: <a href="Specials.html#Specials">Specials</a></li>
+<li><a href="Swept-blocks.html#index-line-322"><code>line</code></a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
 <li><a href="Object-transforms.html#index-line-63"><code>line</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Drawing-options.html#index-line-25"><code>line</code></a>: <a href="Drawing-options.html#Drawing-options">Drawing options</a></li>
+<li><a href="A-technical-drawing.html#index-line-444"><code>line</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Affine-arithmetic.html#index-line-154"><code>line</code></a>: <a href="Affine-arithmetic.html#Affine-arithmetic">Affine arithmetic</a></li>
+<li><a href="Drawing-options.html#index-line-25"><code>line</code></a>: <a href="Drawing-options.html#Drawing-options">Drawing options</a></li>
+<li><a href="A-hierarchical-model.html#index-line-477"><code>line</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-technical-drawing.html#index-line-461"><code>line</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-line-144"><code>line</code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
+<li><a href="A-technical-drawing.html#index-line-465"><code>line</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Overview.html#index-line-438"><code>line</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Lines.html#index-line-269"><code>line</code></a>: <a href="Lines.html#Lines">Lines</a></li>
 <li><a href="TikZ_002fPGF-user_002ddefined-styles.html#index-line-style-251"><code>line style</code></a>: <a href="TikZ_002fPGF-user_002ddefined-styles.html#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li>
-<li><a href="Overview.html#index-linecolor-434"><code>linecolor</code></a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Frame.html#index-linecolor-394"><code>linecolor</code></a>: <a href="Frame.html#Frame">Frame</a></li>
+<li><a href="Frame.html#index-linecolor-395"><code>linecolor</code></a>: <a href="Frame.html#Frame">Frame</a></li>
+<li><a href="Overview.html#index-linecolor-435"><code>linecolor</code></a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Object-transforms.html#index-linecolor-65"><code>linecolor</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Frame.html#index-linestyle-393"><code>linestyle</code></a>: <a href="Frame.html#Frame">Frame</a></li>
-<li><a href="Bugs-and-anomalies.html#index-linestyle-504"><code>linestyle</code></a>: <a href="Bugs-and-anomalies.html#Bugs-and-anomalies">Bugs and anomalies</a></li>
-<li><a href="A-technical-drawing.html#index-linestyle-453"><code>linestyle</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Overview.html#index-linestyle-435"><code>linestyle</code></a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Frame.html#index-linewidth-392"><code>linewidth</code></a>: <a href="Frame.html#Frame">Frame</a></li>
+<li><a href="Frame.html#index-linestyle-394"><code>linestyle</code></a>: <a href="Frame.html#Frame">Frame</a></li>
+<li><a href="Overview.html#index-linestyle-436"><code>linestyle</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Bugs-and-anomalies.html#index-linestyle-505"><code>linestyle</code></a>: <a href="Bugs-and-anomalies.html#Bugs-and-anomalies">Bugs and anomalies</a></li>
+<li><a href="A-technical-drawing.html#index-linestyle-454"><code>linestyle</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="A-technical-drawing.html#index-linewidth-452"><code>linewidth</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Polyline-sweeps.html#index-linewidth-114"><code>linewidth</code></a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="A-technical-drawing.html#index-linewidth-451"><code>linewidth</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Overview.html#index-linewidth-433"><code>linewidth</code></a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Transparency.html#index-opacity-254"><code>opacity</code></a>: <a href="Transparency.html#Transparency">Transparency</a></li>
+<li><a href="Overview.html#index-linewidth-434"><code>linewidth</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Frame.html#index-linewidth-393"><code>linewidth</code></a>: <a href="Frame.html#Frame">Frame</a></li>
+<li><a href="Transparency.html#index-opacity-255"><code>opacity</code></a>: <a href="Transparency.html#Transparency">Transparency</a></li>
 <li><a href="Transform-literals.html#index-perspective-200"><code>perspective</code></a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Picture-box.html#index-picturebox-382"><code>picturebox</code></a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
-<li><a href="Internal-options.html#index-point-list-265"><code>point list</code></a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
+<li><a href="Picture-box.html#index-picturebox-383"><code>picturebox</code></a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
+<li><a href="Internal-options.html#index-point-list-266"><code>point list</code></a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
 <li><a href="Hello-world.html#index-polygon-19"><code>polygon</code></a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="Overview.html#index-polygon-418"><code>polygon</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-polygon-419"><code>polygon</code></a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Affine-arithmetic.html#index-polygon-153"><code>polygon</code></a>: <a href="Affine-arithmetic.html#Affine-arithmetic">Affine arithmetic</a></li>
 <li><a href="Drawing-a-solid.html#index-polygon-32"><code>polygon</code></a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Object-transforms.html#index-polygon-64"><code>polygon</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Polygons.html#index-polygon-270"><code>polygon</code></a>: <a href="Polygons.html#Polygons">Polygons</a></li>
-<li><a href="Swept-blocks.html#index-polygon-322"><code>polygon</code></a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
+<li><a href="Polygons.html#index-polygon-271"><code>polygon</code></a>: <a href="Polygons.html#Polygons">Polygons</a></li>
+<li><a href="Swept-blocks.html#index-polygon-323"><code>polygon</code></a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
 <li><a href="Transform-literals.html#index-project-194"><code>project</code></a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Language.html#index-pstricks-399"><code>pstricks</code></a>: <a href="Language.html#Language">Language</a></li>
-<li><a href="A-hierarchical-model.html#index-put-481"><code>put</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="Language.html#index-pstricks-400"><code>pstricks</code></a>: <a href="Language.html#Language">Language</a></li>
+<li><a href="A-hierarchical-model.html#index-put-482"><code>put</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Object-transforms.html#index-put-62"><code>put</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
 <li><a href="Nested-sweeps.html#index-put-129"><code>put</code></a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="Puts.html#index-put-334"><code>put</code></a>: <a href="Puts.html#Puts">Puts</a></li>
-<li><a href="Repeats.html#index-repeat-331"><code>repeat</code></a>: <a href="Repeats.html#Repeats">Repeats</a></li>
+<li><a href="Puts.html#index-put-335"><code>put</code></a>: <a href="Puts.html#Puts">Puts</a></li>
+<li><a href="Repeats.html#index-repeat-332"><code>repeat</code></a>: <a href="Repeats.html#Repeats">Repeats</a></li>
 <li><a href="Repeated-objects.html#index-repeat-88"><code>repeat</code></a>: <a href="Repeated-objects.html#Repeated-objects">Repeated objects</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-repeat-139"><code>repeat</code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="Overview.html#index-repeat-426"><code>repeat</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-repeat-427"><code>repeat</code></a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Nested-sweeps.html#index-repeat-130"><code>repeat</code></a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
 <li><a href="Swept-objects.html#index-rotate-94"><code>rotate</code></a>: <a href="Swept-objects.html#Swept-objects">Swept objects</a></li>
 <li><a href="Point-sweeps.html#index-rotate-103"><code>rotate</code></a>: <a href="Point-sweeps.html#Point-sweeps">Point sweeps</a></li>
-<li><a href="Overview.html#index-rotate-430"><code>rotate</code></a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="A-hierarchical-model.html#index-rotate-475"><code>rotate</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="Overview.html#index-rotate-431"><code>rotate</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="A-hierarchical-model.html#index-rotate-476"><code>rotate</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Repeated-objects.html#index-rotate-89"><code>rotate</code></a>: <a href="Repeated-objects.html#Repeated-objects">Repeated objects</a></li>
-<li><a href="Overview.html#index-rotate-427"><code>rotate</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-rotate-428"><code>rotate</code></a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Object-transforms.html#index-rotate-67"><code>rotate</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="A-hierarchical-model.html#index-rotate-483"><code>rotate</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-rotate-484"><code>rotate</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Transform-literals.html#index-rotate-182"><code>rotate</code></a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
 <li><a href="Polyline-sweeps.html#index-rotate-111"><code>rotate</code></a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="Object-transforms.html#index-rotate-80"><code>rotate</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="A-technical-drawing.html#index-rotate-440"><code>rotate</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="A-technical-drawing.html#index-rotate-441"><code>rotate</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Nested-sweeps.html#index-rotate-126"><code>rotate</code></a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="A-hierarchical-model.html#index-rotate-479"><code>rotate</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-rotate-480"><code>rotate</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-rotate-140"><code>rotate</code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="Transform-literals.html#index-scale-191"><code>scale</code></a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="A-hierarchical-model.html#index-scale-484"><code>scale</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="A-technical-drawing.html#index-scale-466"><code>scale</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="A-hierarchical-model.html#index-scale-485"><code>scale</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-technical-drawing.html#index-scale-467"><code>scale</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Transform-literals.html#index-scale-188"><code>scale</code></a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="A-technical-drawing.html#index-scale-459"><code>scale</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Global-options.html#index-set-373"><code>set</code></a>: <a href="Global-options.html#Global-options">Global options</a></li>
+<li><a href="A-technical-drawing.html#index-scale-460"><code>scale</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Global-options.html#index-set-374"><code>set</code></a>: <a href="Global-options.html#Global-options">Global options</a></li>
 <li><a href="Unary-forms.html#index-sin-244"><code>sin</code></a>: <a href="Unary-forms.html#Unary-forms">Unary forms</a></li>
-<li><a href="Overview.html#index-special-436"><code>special</code></a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="A-technical-drawing.html#index-special-469"><code>special</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Overview.html#index-special-437"><code>special</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="A-technical-drawing.html#index-special-470"><code>special</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Special-objects.html#index-special-48"><code>special</code></a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
-<li><a href="A-technical-drawing.html#index-special-454"><code>special</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Specials.html#index-special-273"><code>special</code></a>: <a href="Specials.html#Specials">Specials</a></li>
-<li><a href="Global-options.html#index-split-377"><code>split</code></a>: <a href="Global-options.html#Global-options">Global options</a></li>
-<li><a href="Internal-options.html#index-split-261"><code>split</code></a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
+<li><a href="A-technical-drawing.html#index-special-455"><code>special</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Specials.html#index-special-274"><code>special</code></a>: <a href="Specials.html#Specials">Specials</a></li>
+<li><a href="Global-options.html#index-split-378"><code>split</code></a>: <a href="Global-options.html#Global-options">Global options</a></li>
+<li><a href="Internal-options.html#index-split-262"><code>split</code></a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
 <li><a href="Unary-forms.html#index-sqrt-243"><code>sqrt</code></a>: <a href="Unary-forms.html#Unary-forms">Unary forms</a></li>
-<li><a href="A-technical-drawing.html#index-sweep-441"><code>sweep</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="A-hierarchical-model.html#index-sweep-474"><code>sweep</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-technical-drawing.html#index-sweep-442"><code>sweep</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="A-hierarchical-model.html#index-sweep-475"><code>sweep</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Nested-sweeps.html#index-sweep-125"><code>sweep</code></a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="Sweeps.html#index-sweep-278"><code>sweep</code></a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
+<li><a href="Sweeps.html#index-sweep-279"><code>sweep</code></a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-sweep-143"><code>sweep</code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="Swept-objects.html#index-sweep-93"><code>sweep</code></a>: <a href="Swept-objects.html#Swept-objects">Swept objects</a></li>
 <li><a href="Polyline-sweeps.html#index-sweep-110"><code>sweep</code></a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="A-hierarchical-model.html#index-sweep-478"><code>sweep</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-sweep-479"><code>sweep</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Point-sweeps.html#index-sweep-104"><code>sweep</code></a>: <a href="Point-sweeps.html#Point-sweeps">Point sweeps</a></li>
 <li><a href="Nested-sweeps.html#index-sweep-127"><code>sweep</code></a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-then-236"><code>then</code></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-then-141"><code>then</code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-then-225"><code>then</code></a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Object-transforms.html#index-then-69"><code>then</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Language.html#index-tikz-400"><code>tikz</code></a>: <a href="Language.html#Language">Language</a></li>
-<li><a href="Overview.html#index-translate-428"><code>translate</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Language.html#index-tikz-401"><code>tikz</code></a>: <a href="Language.html#Language">Language</a></li>
+<li><a href="Overview.html#index-translate-429"><code>translate</code></a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Object-transforms.html#index-translate-84"><code>translate</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="A-hierarchical-model.html#index-translate-482"><code>translate</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-translate-483"><code>translate</code></a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-translate-142"><code>translate</code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="Repeated-objects.html#index-translate-90"><code>translate</code></a>: <a href="Repeated-objects.html#Repeated-objects">Repeated objects</a></li>
-<li><a href="Overview.html#index-translate-431"><code>translate</code></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-translate-432"><code>translate</code></a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Transform-literals.html#index-translate-185"><code>translate</code></a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
 <li><a href="Object-transforms.html#index-translate-68"><code>translate</code></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
 <li><a href="Polyline-sweeps.html#index-translate-112"><code>translate</code></a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="Transparency.html#index-transpalpha-253"><code>transpalpha</code></a>: <a href="Transparency.html#Transparency">Transparency</a></li>
+<li><a href="Transparency.html#index-transpalpha-254"><code>transpalpha</code></a>: <a href="Transparency.html#Transparency">Transparency</a></li>
 <li><a href="Unary-forms.html#index-unit-242"><code>unit</code></a>: <a href="Unary-forms.html#Unary-forms">Unary forms</a></li>
-<li><a href="A-technical-drawing.html#index-unit-458"><code>unit</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="A-technical-drawing.html#index-unit-459"><code>unit</code></a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Transform-literals.html#index-view-207"><code>view</code></a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Blocks.html#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-328"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="Blocks.html#Blocks">Blocks</a></li>
-<li><a href="Swept-blocks.html#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-320"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
+<li><a href="Blocks.html#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-329"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="Blocks.html#Blocks">Blocks</a></li>
+<li><a href="Swept-blocks.html#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-321"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
 <li><a href="Nested-sweeps.html#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-131"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
 <li><a href="Object-transforms.html#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-71"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Overview.html#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-419"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-420"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Object-transforms.html#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-79"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Forms-of-references.html#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-360"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Overview.html#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-424"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Forms-of-references.html#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-361"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Overview.html#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-425"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Unary-forms.html#index-_007c_0040math_007bX_007d_007c_0040r_007b_002c-magnitude-operator_007d-241"><code>|X|</code><span class="roman">, magnitude operator</span></a>: <a href="Unary-forms.html#Unary-forms">Unary forms</a></li>
    </ul></body></html>
 
diff --git a/Doc/sketch/Input-language.html b/Doc/sketch/Input-language.html
index 65e4209..99a1adc 100644
--- a/Doc/sketch/Input-language.html
+++ b/Doc/sketch/Input-language.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Installing-sketch.html b/Doc/sketch/Installing-sketch.html
index 8d22bb2..4db00f8 100644
--- a/Doc/sketch/Installing-sketch.html
+++ b/Doc/sketch/Installing-sketch.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Internal-options.html b/Doc/sketch/Internal-options.html
index 498aa03..bbb5813 100644
--- a/Doc/sketch/Internal-options.html
+++ b/Doc/sketch/Internal-options.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -54,10 +54,10 @@ Up: <a rel="up" accesskey="u" href="Options.html#Options">Options</a>
 <h5 class="subsubsection">3.1.5.6 Internal options</h5>
 
 <p>There are also <em>internal</em> options
-<a name="index-options_002c-internal-257"></a><a name="index-internal-options-258"></a>used only by <code>sketch</code> and not
+<a name="index-options_002c-internal-258"></a><a name="index-internal-options-259"></a>used only by <code>sketch</code> and not
 passed on to <code>PSTricks</code>.  These are summarized in the following
 table. 
-<a name="index-cull-259"></a><a name="index-lay-260"></a><a name="index-split-261"></a>
+<a name="index-cull-260"></a><a name="index-lay-261"></a><a name="index-split-262"></a>
    <p><table summary=""><tr align="left"><th valign="top">Key </th><th valign="top">Possible values </th><th valign="top">Description
 <br></th></tr><tr align="left"><td valign="top"><code>cull</code>
 </td><td valign="top"><code>true</code>, <code>false</code>
@@ -67,20 +67,20 @@ The default value is <code>true</code>.
 </td><td valign="top"><code>over</code>, <code>in</code>, <code>under</code>
 </td><td valign="top">Force this object to be <code>under</code> or
 <code>over</code> all other objects in the depth sort
-<a name="index-depth-sort-262"></a>order created by the hidden surface algorithm.  The default value
+<a name="index-depth-sort-263"></a>order created by the hidden surface algorithm.  The default value
 <code>over</code> guarantees that output due to the <code>special</code> will be
 visible. 
 <br></td></tr><tr align="left"><td valign="top"><code>split</code>
 </td><td valign="top"><code>true</code>, <code>false</code>
 </td><td valign="top">Turn splitting of sweep-generated body polygons
-<a name="index-body-polygon-263"></a><a name="index-polygon_002c-body-264"></a>on and off respectively. See <a href="Sweeps.html#Sweeps">Sweeps</a>.  The default value <code>true</code>
+<a name="index-body-polygon-264"></a><a name="index-polygon_002c-body-265"></a>on and off respectively. See <a href="Sweeps.html#Sweeps">Sweeps</a>.  The default value <code>true</code>
 causes “warped” polygons to be split into triangles, which avoids
 mistakes by the hidden surface algorithm.
    <br></td></tr></table>
 
 <h4 class="subsection">3.1.6 Point lists</h4>
 
-<p><a name="index-point-list-265"></a><strong>Syntax:</strong>
+<p><a name="index-point-list-266"></a><strong>Syntax:</strong>
 <pre class="example">     (<var>x1</var>,<var>y1</var>,<var>z1</var>)(<var>x2</var>,<var>y2</var>,<var>z2</var>)...
 </pre>
    <p class="noindent">A sequence of one or more points makes a point list, a feature
diff --git a/Doc/sketch/Introduction-by-example.html b/Doc/sketch/Introduction-by-example.html
index 1a9f6eb..9db6f81 100644
--- a/Doc/sketch/Introduction-by-example.html
+++ b/Doc/sketch/Introduction-by-example.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Key-and-reserved-words.html b/Doc/sketch/Key-and-reserved-words.html
index 76bd49b..177e034 100644
--- a/Doc/sketch/Key-and-reserved-words.html
+++ b/Doc/sketch/Key-and-reserved-words.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Language-basics.html b/Doc/sketch/Language-basics.html
index d2c8f59..69b7e1a 100644
--- a/Doc/sketch/Language-basics.html
+++ b/Doc/sketch/Language-basics.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Language.html b/Doc/sketch/Language.html
index 399e71b..e7771b0 100644
--- a/Doc/sketch/Language.html
+++ b/Doc/sketch/Language.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -53,14 +53,14 @@ Up: <a rel="up" accesskey="u" href="Global-environment.html#Global-environm
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.5 Language</h4>
 
-<p><a name="index-language_002c-output-396"></a><a name="index-output-language-397"></a><a name="index-language-398"></a>
+<p><a name="index-language_002c-output-397"></a><a name="index-output-language-398"></a><a name="index-language-399"></a>
 <pre class="example">     language tikz
      language tikz, context
      language pstricks
      language pstricks, latex
 </pre>
    <p class="noindent">Sets the output language generated by <code>sketch</code>. 
-<a name="index-pstricks-399"></a><a name="index-tikz-400"></a>The set of options understood by sketch also changes.  For example,
+<a name="index-pstricks-400"></a><a name="index-tikz-401"></a>The set of options understood by sketch also changes.  For example,
 the <code>PSTricks</code> option <code>linewidth</code> will not be properly
 handled if <code>language</code> is set to <code>tikz</code>.  Similarly, the
 <code>TikZ</code> option <code>line style</code> (note the space) will not be
@@ -69,9 +69,9 @@ language is specified, the default <code>pstricks</code> is used.
 
    <p>An optional comma followed by
 <code>latex</code>
-<a name="index-latex-401"></a>or
+<a name="index-latex-402"></a>or
 <code>context</code>
-<a name="index-context-402"></a>specifies the macro package that the output should assume.  This
+<a name="index-context-403"></a>specifies the macro package that the output should assume.  This
 affects the <code>picture</code> environment commands emitted and the
 document template used with the <span class="option">-T</span> option. See <a href="Command-line.html#Command-line">Command line</a>.  Note that at the time this manual was generated,
 <code>PSTricks</code> was not supported by LaTeX or by <code>ConTeXt</code>.
diff --git a/Doc/sketch/Limits-on-error-detection.html b/Doc/sketch/Limits-on-error-detection.html
index bb3f761..7f5bdc5 100644
--- a/Doc/sketch/Limits-on-error-detection.html
+++ b/Doc/sketch/Limits-on-error-detection.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Lines.html b/Doc/sketch/Lines.html
index b5218bc..4c1fb9b 100644
--- a/Doc/sketch/Lines.html
+++ b/Doc/sketch/Lines.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,7 +55,7 @@ Up: <a rel="up" accesskey="u" href="Drawables.html#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.2 Lines</h4>
 
-<p><a name="index-line-268"></a><strong>Syntax:</strong>
+<p><a name="index-line-269"></a><strong>Syntax:</strong>
 <pre class="example">     line[<var>options</var>] <var>point_list</var>
 </pre>
    <p class="noindent">This command is the three-dimensional equivalent of the
diff --git a/Doc/sketch/Literals.html b/Doc/sketch/Literals.html
index 92d5164..c13a64a 100644
--- a/Doc/sketch/Literals.html
+++ b/Doc/sketch/Literals.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/More-to-learn.html b/Doc/sketch/More-to-learn.html
index 89cfc87..33296f3 100644
--- a/Doc/sketch/More-to-learn.html
+++ b/Doc/sketch/More-to-learn.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Nested-sweeps.html b/Doc/sketch/Nested-sweeps.html
index 8dedb5f..937c4e2 100644
--- a/Doc/sketch/Nested-sweeps.html
+++ b/Doc/sketch/Nested-sweeps.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Object-transforms.html b/Doc/sketch/Object-transforms.html
index bcf8b59..d424626 100644
--- a/Doc/sketch/Object-transforms.html
+++ b/Doc/sketch/Object-transforms.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Options.html b/Doc/sketch/Options.html
index 382cc1f..061d17e 100644
--- a/Doc/sketch/Options.html
+++ b/Doc/sketch/Options.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Overview.html b/Doc/sketch/Overview.html
index f6cf6c3..f69f323 100644
--- a/Doc/sketch/Overview.html
+++ b/Doc/sketch/Overview.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -57,13 +57,13 @@ Up: <a rel="up" accesskey="u" href="Building-a-drawing.html#Building-a-draw
 
 <p>As an overview, let's develop a diagram that shows how a perspective
 projection transform
-<a name="index-perspective-projection-404"></a><a name="index-transform-405"></a><a name="index-projection_002c-perspective-406"></a>works.  We'll start with the traditional reference object
+<a name="index-perspective-projection-405"></a><a name="index-transform-406"></a><a name="index-projection_002c-perspective-407"></a>works.  We'll start with the traditional reference object
 used in computer graphics textbooks, a house-shaped prism.  Begin
 by defining the points of the house.  Rather than defining the faces
 of the house as polygons and transforming those, we are going to
 transform the points themselves with <code>sketch</code> arithmetic so that
 we have names for the transformed points later. 
-<a name="index-def-407"></a>
+<a name="index-def-408"></a>
 <pre class="verbatim">
   % right side (outside to right)
   def R1 (1,1,1) def R2 (1,-1,1) def R3 (1,-1,-1) def R4 (1,1,-1)
@@ -93,11 +93,11 @@ transform of the originals.
   def pD4 [[hp]]*(D4) 
 </pre>
 Note the use of a <dfn>transform definition</dfn>
-<a name="index-transform-definition-408"></a><a name="index-definition_002c-transform-409"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-410"></a>and
+<a name="index-transform-definition-409"></a><a name="index-definition_002c-transform-410"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-411"></a>and
 <dfn>transform references</dfn>. 
-<a name="index-transform-reference-411"></a><a name="index-reference_002c-transform-412"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-413"></a>Now define the seven polygonal faces of the house and the door using
+<a name="index-transform-reference-412"></a><a name="index-reference_002c-transform-413"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-414"></a>Now define the seven polygonal faces of the house and the door using
 the transformed points as vertices.  Be careful with vertex order! 
-<a name="index-polygon-vertex-order-414"></a><a name="index-order_002c-polygon-vertex-415"></a><a name="index-fillcolor-416"></a><a name="index-def-417"></a><a name="index-polygon-418"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-419"></a>
+<a name="index-polygon-vertex-order-415"></a><a name="index-order_002c-polygon-vertex-416"></a><a name="index-fillcolor-417"></a><a name="index-def-418"></a><a name="index-polygon-419"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-420"></a>
 <pre class="verbatim">
   def rgt polygon (pR1)(pR2)(pR3)(pR4)(pR5)
   def lft polygon (pL5)(pL4)(pL3)(pL2)(pL1)
@@ -110,7 +110,7 @@ the transformed points as vertices.  Be careful with vertex order!
   def house { {rgt}{lft}{frt}{bck}{tfr}{tbk}{bot}{door} }
 </pre>
 Time for a sanity check.  Add the line
-<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-420"></a><a name="index-reference_002c-drawable-421"></a>
+<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-421"></a><a name="index-reference_002c-drawable-422"></a>
 <pre class="verbatim">
   {house}
 </pre>
@@ -121,10 +121,10 @@ and this is what we get.
 <p class="noindent">This is correct, but does not reveal very much.  Common errors are
 misplaced vertices and polygons missing entirely due to incorrect
 vertex order. 
-<a name="index-polygon-vertex-order-422"></a><a name="index-order_002c-polygon-vertex-423"></a>To rule these out, let's inspect all sides of the
+<a name="index-polygon-vertex-order-423"></a><a name="index-order_002c-polygon-vertex-424"></a>To rule these out, let's inspect all sides of the
 house. This is not hard. Merely replace the reference
 <tt>{house}</tt> with a <code>repeat</code>. See <a href="Repeats.html#Repeats">Repeats</a>. 
-<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-424"></a><a name="index-reference_002c-drawable-425"></a><a name="index-repeat-426"></a><a name="index-rotate-427"></a><a name="index-translate-428"></a>
+<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-425"></a><a name="index-reference_002c-drawable-426"></a><a name="index-repeat-427"></a><a name="index-rotate-428"></a><a name="index-translate-429"></a>
 <pre class="verbatim">
   repeat { 13, rotate(30, [1,2,3]), translate([3,0,0]) } {house}
 </pre>
@@ -139,7 +139,7 @@ a plane with rays passing through the origin.  Begin by positioning the
 house twelve units back on the negative z-axis and adding a set
 of coordinate axes.  To move the house we need only change the “house
 positioning” transform defined earlier. 
-<a name="index-def-429"></a><a name="index-rotate-430"></a><a name="index-translate-431"></a><a name="index-arrows-432"></a><a name="index-linewidth-433"></a><a name="index-linecolor-434"></a><a name="index-linestyle-435"></a><a name="index-special-436"></a><a name="index-line-437"></a>
+<a name="index-def-430"></a><a name="index-rotate-431"></a><a name="index-translate-432"></a><a name="index-arrows-433"></a><a name="index-linewidth-434"></a><a name="index-linecolor-435"></a><a name="index-linestyle-436"></a><a name="index-special-437"></a><a name="index-line-438"></a>
 <pre class="verbatim">
   def hp rotate(-40, [0,1,0]) then translate([0,0,-12])
   def axes {
@@ -154,7 +154,7 @@ positioning” transform defined earlier.
 
    <p>Time for another test.  Let's build a real view transform,
 creating a <dfn>virtual camera</dfn>
-<a name="index-virtual-camera-438"></a>to look at the scene we are constructing.  Replace the <code>repeat</code>
+<a name="index-virtual-camera-439"></a>to look at the scene we are constructing.  Replace the <code>repeat</code>
 with
 <pre class="verbatim">
   def eye (10,4,10)
diff --git a/Doc/sketch/PSTricks-options.html b/Doc/sketch/PSTricks-options.html
index ffaf9ab..b931c22 100644
--- a/Doc/sketch/PSTricks-options.html
+++ b/Doc/sketch/PSTricks-options.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Picture-box.html b/Doc/sketch/Picture-box.html
index dd62109..9575f20 100644
--- a/Doc/sketch/Picture-box.html
+++ b/Doc/sketch/Picture-box.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,25 +55,25 @@ Up: <a rel="up" accesskey="u" href="Global-environment.html#Global-environm
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.4.3 Picture box</h4>
 
-<p><a name="index-picture-box-381"></a><strong>Syntax:</strong>
-<a name="index-picturebox-382"></a>
+<p><a name="index-picture-box-382"></a><strong>Syntax:</strong>
+<a name="index-picturebox-383"></a>
 <pre class="example">     picturebox[<var>baseline</var>]
      picturebox[<var>baseline</var>] (<var>p1</var>)(<var>p2</var>)
 </pre>
    <p class="noindent">The first form of <code>picturebox</code> causes a scalar <var>baseline</var>
 fraction to be emitted in the <code>pspicture</code>
-<a name="index-_0040code_007bpspicture_007d-383"></a><a name="index-baseline-fraction-384"></a>environment of the output.  See
+<a name="index-_0040code_007bpspicture_007d-384"></a><a name="index-baseline-fraction-385"></a>environment of the output.  See
 <code>PSTricks</code> documentation for <code>pspicture</code>.
 
    <p>In the second form, the <var>baseline</var> fraction is optional, and the
 two points that follow define the diagonal of a three-dimensional
 bounding box
-<a name="index-bounding-box-385"></a>for the completed scene.  The parallel projection
-<a name="index-parallel-projection-386"></a><a name="index-projection_002c-parallel-387"></a>of the bounding box
+<a name="index-bounding-box-386"></a>for the completed scene.  The parallel projection
+<a name="index-parallel-projection-387"></a><a name="index-projection_002c-parallel-388"></a>of the bounding box
 determines the corners of the drawing's <code>pspicture*</code> environment,
 which is used in place of <code>pspicture</code>.  This causes PostScript to
 clip
-<a name="index-clipping-388"></a>the final drawing to the bounding box in 2d.  If there is a
+<a name="index-clipping-389"></a>the final drawing to the bounding box in 2d.  If there is a
 <code>camera</code> specified, the camera tranformation is applied to the
 bounding box, and the <code>pspicture</code> is set just large
 enough to include the transformed box.
diff --git a/Doc/sketch/Point-and-vector-literals.html b/Doc/sketch/Point-and-vector-literals.html
index 8eed202..82f1347 100644
--- a/Doc/sketch/Point-and-vector-literals.html
+++ b/Doc/sketch/Point-and-vector-literals.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Point-sweeps.html b/Doc/sketch/Point-sweeps.html
index 8488139..5e3ebc0 100644
--- a/Doc/sketch/Point-sweeps.html
+++ b/Doc/sketch/Point-sweeps.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Polygon-sweeps.html b/Doc/sketch/Polygon-sweeps.html
index 786a243..be66c76 100644
--- a/Doc/sketch/Polygon-sweeps.html
+++ b/Doc/sketch/Polygon-sweeps.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Polygons.html b/Doc/sketch/Polygons.html
index 148526d..5e13768 100644
--- a/Doc/sketch/Polygons.html
+++ b/Doc/sketch/Polygons.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,13 +55,13 @@ Up: <a rel="up" accesskey="u" href="Drawables.html#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.4 Polygons</h4>
 
-<p><a name="index-polygon-270"></a><strong>Syntax:</strong>
+<p><a name="index-polygon-271"></a><strong>Syntax:</strong>
 <pre class="example">     polygon[<var>options</var>] <var>point_list</var>
 </pre>
    <p class="noindent">This command is the three-dimensional equivalent of the
 <code>PSTricks</code> command <code>\pspolygon</code>.  The <code>sketch</code> hidden
 surface algorithm assumes that polygons are convex and planar. 
-<a name="index-polygon_002c-planar-271"></a><a name="index-planarity-of-polygons-272"></a>In practice, drawings may well turn out correctly even if these
+<a name="index-polygon_002c-planar-272"></a><a name="index-planarity-of-polygons-273"></a>In practice, drawings may well turn out correctly even if these
 assumptions are violated.
 
    </body></html>
diff --git a/Doc/sketch/Polyline-sweeps-with-closure.html b/Doc/sketch/Polyline-sweeps-with-closure.html
index 22fa5ee..a7f685f 100644
--- a/Doc/sketch/Polyline-sweeps-with-closure.html
+++ b/Doc/sketch/Polyline-sweeps-with-closure.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Polyline-sweeps.html b/Doc/sketch/Polyline-sweeps.html
index bb77e94..ce03c7e 100644
--- a/Doc/sketch/Polyline-sweeps.html
+++ b/Doc/sketch/Polyline-sweeps.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Puts.html b/Doc/sketch/Puts.html
index ac2651c..7cc2fe1 100644
--- a/Doc/sketch/Puts.html
+++ b/Doc/sketch/Puts.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -53,7 +53,7 @@ Up: <a rel="up" accesskey="u" href="Drawables.html#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.9 Puts</h4>
 
-<p><a name="index-put-334"></a><strong>Syntax:</strong>
+<p><a name="index-put-335"></a><strong>Syntax:</strong>
 <pre class="example">     put { <var>T</var> } <var>put_object</var>
 </pre>
    <p class="noindent">Put merely applies transform <var>T</var> to the drawable <var>put_object</var>.
diff --git a/Doc/sketch/Repeated-objects.html b/Doc/sketch/Repeated-objects.html
index fb33d94..9d4aae4 100644
--- a/Doc/sketch/Repeated-objects.html
+++ b/Doc/sketch/Repeated-objects.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Repeats.html b/Doc/sketch/Repeats.html
index 7310cde..0c6895b 100644
--- a/Doc/sketch/Repeats.html
+++ b/Doc/sketch/Repeats.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,12 +55,12 @@ Up: <a rel="up" accesskey="u" href="Drawables.html#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.8 Repeats</h4>
 
-<p><a name="index-repeat-331"></a><a name="index-repeated-object-332"></a><strong>Syntax:</strong>
+<p><a name="index-repeat-332"></a><a name="index-repeated-object-333"></a><strong>Syntax:</strong>
 <pre class="example">     repeat { <var>n</var>, <var>T_1</var>, <var>T_2</var>, ..., <var>T_r</var> } <var>repeated_object</var>
 </pre>
    <p class="noindent">The repeat makes <var>n</var> transformed copies of <var>repeated_object</var>
 (including the original).  The <var>T_i</var> are transforms. 
-<a name="index-transform-333"></a>The k'th copy of the <var>repeated_object</var> (for
+<a name="index-transform-334"></a>The k'th copy of the <var>repeated_object</var> (for
 k=0,1,...,n-1) is produced in the
 same manner as for <code>sweep</code>s described in <a href="Sweeps.html#Sweeps">Sweeps</a>.  This is
 repeated here (no pun intended) for convenience.  To make the
diff --git a/Doc/sketch/Reporting-bugs.html b/Doc/sketch/Reporting-bugs.html
index edff40e..92181bc 100644
--- a/Doc/sketch/Reporting-bugs.html
+++ b/Doc/sketch/Reporting-bugs.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,8 +55,8 @@ Up: <a rel="up" accesskey="u" href="About-sketch.html#About-sketch">About s
 <!-- node-name,  next,  previous,  up -->
 <h3 class="section">1.1 Reporting bugs and recommending improvements.</h3>
 
-<p>Report bugs and make suggestions at
-our Google Group <tt>http://groups.google.com/group/sketch-users</tt>. 
+<p>The group <tt>http://groups.google.com/group/sketch-users</tt>
+is the best place to report bugs and make improvements. 
 A second method that will probably produce a slower
 response is email to <tt>sketch at frontiernet.net</tt>. 
 We will try to respond, but can't promise.  In any event, don't be
diff --git a/Doc/sketch/Scalar-literals.html b/Doc/sketch/Scalar-literals.html
index 01fa896..f3a96f5 100644
--- a/Doc/sketch/Scalar-literals.html
+++ b/Doc/sketch/Scalar-literals.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Special-objects.html b/Doc/sketch/Special-objects.html
index 55d0f12..4faeb0c 100644
--- a/Doc/sketch/Special-objects.html
+++ b/Doc/sketch/Special-objects.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -79,15 +79,27 @@ in this case <span class="samp">|</span>.  The raw
 text continues until this character recurs.
 
    <p>Second, the argument references
-<a name="index-argument_002c-special-51"></a><tt>#1</tt>, <tt>#2</tt>, <tt>#3</tt>,
-and <tt>#4</tt> refer to points in the list that follow.  This is
-similar to TeX macro syntax.  The transformed and two-dimensional
-projections of these three-dimensional points are substituted
+<a name="index-argument_002c-special-51"></a><tt>#1</tt>, <tt>#2</tt>, <tt>#3</tt>, and <tt>#4</tt> refer to point,
+vector, or scalar values in the list that follow.  This is similar to
+TeX macro syntax.  The transformed and two-dimensional projections
+of these three-dimensional points are substituted
 <a name="index-substitution_002c-special-52"></a><a name="index-special-argument-substitution-53"></a>in the final output.  An argument reference of the form <tt>#1-2</tt>
 is replaced with the angle in degrees of the two-dimensional vector
 that connects the projections of the two respective argument points,
 here <tt>#1</tt> and <tt>#2</tt>.  The substituted angle is enclosed
-in curly braces <code>{ }</code>
+in curly braces <code>{ }</code>.  When <code>TikZ/PGF</code> output is being
+generated, the angle is rounded to the nearest degree because
+non-integer angles are not allowed by <code>TikZ/PGF</code> primitives.
+
+   <p>As of Version 0.3 of <code>sketch</code>, special arguments may be scalars
+or vectors in addition to points. References to scalar arguments are
+merely replaced with a number formatted just as any point
+coordinate. References to vectors become two-dimensional points. The
+tick operator that selects individual components of points and vectors
+elsewhere in <code>sketch</code> (see for example <a href="Affine-arithmetic.html#Affine-arithmetic">Affine arithmetic</a>)
+can also be applied to point and vector argument references.  All
+three dimensions of a transformed point or vector can also be
+substitued with <code>'3</code>. See <a href="Specials.html#Specials">Specials</a> for details.
 
    <p>By default, <code>special</code> objects are printed last, overlaying all
 other objects in the scene.  If you specify the internal option
diff --git a/Doc/sketch/Specials.html b/Doc/sketch/Specials.html
index ba1de64..de18a32 100644
--- a/Doc/sketch/Specials.html
+++ b/Doc/sketch/Specials.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,30 +55,53 @@ Up: <a rel="up" accesskey="u" href="Drawables.html#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.5 Specials</h4>
 
-<p><a name="index-special-273"></a><strong>Syntax:</strong>
-<pre class="example">     special $<var>raw_text</var>$[lay=<var>lay_value</var>] <var>point_list</var>
+<p><a name="index-special-274"></a><strong>Syntax:</strong>
+<pre class="example">     special $<var>raw_text</var>$[<var>options</var>] <var>arg_list</var>
 </pre>
    <p class="noindent">Here <code>$</code>
-<a name="index-quoting_002c-special-274"></a>can be any character and is used to delimit the start
+<a name="index-quoting_002c-special-275"></a>can be any character and is used to delimit the start
 and end of <var>raw_text</var>.  The command embeds <var>raw_text</var> in the
 <code>sketch</code> output after performing substitutions as follows. 
-<a name="index-special-argument-substitution-275"></a><a name="index-argument_002c-special-276"></a>
+<a name="index-special-argument-substitution-276"></a><a name="index-argument_002c-special-277"></a>
      <ul>
-<li><code>#</code><var>i</var> where <var>i</var> is a positive integer is replaced by
-the <var>i</var>'th point in <var>point_list</var>. 
+<li><code>#</code><var>i</var> where <var>i</var> is a positive integer is replaced by the
+<var>i</var>'th value in <var>arg_list</var>.  Point and vector arguments become
+two-dimensional points, which are the transformed 3d arguments
+projected onto the <var>x</var>-<var>y</var> plane. This allows
+two-dimentional output elements such as labels to be easily positioned
+with respect to three-dimensional features in the drawing. Scalar
+arguments are subsituted directly. No transformation is applied. 
 <li><code>#{</code><var>i</var><code>}</code> is also replaced as above. 
+<li><code>#</code><var>i</var><code>'2</code> is replaced as above for points or vectors.  It is
+an error for the <var>i</var>'th argument to be a scalar. 
+<li><code>#</code><var>i</var><code>'x</code>, <code>#</code><var>i</var><code>'y</code>, or <code>#</code><var>i</var><code>'z</code> is
+replaced, respectively, by the scalar <var>x</var>, <var>y</var>, or
+<var>z</var>-coordinate of the argument point or vector. It is an error for
+the <var>i</var>'th argument to be a scalar. 
+<li><code>#</code><var>i</var><code>'3</code> is replaced by the three-dimensional
+transformed argument. Note that if a perspective transformation has
+been applied, the <var>z</var>-coordinate has little geometric
+significance, though it accurately indicates relative depth. 
 <li><code>#</code><var>i</var><code>-</code><var>j</var> where <var>i</var> and <var>j</var> are positive
 integers is replaced by a string <code>{</code><var>angle</var><code>}</code> where
 <var>angle</var> is the polar angle of a vector from the <var>i</var>'th point
-in <var>point_list</var> to the <var>j</var>'th. 
+in <var>point_list</var> to the <var>j</var>'th point projected into the
+x-y plane.  It is an error for the <var>i</var>'th or
+<var>j</var>'th argument to be a scalar or a vector. 
 <li><code>#{</code><var>i</var><code>-</code><var>j</var><code>}</code> is also replaced as above. 
 <li><code>##</code> is replaced with <code>#</code>. 
 </ul>
    The forms with braces <span class="samp">{ }</span> are useful when the argument is
-immediately followed by a digit that is part of the TeX code.
+immediately followed by a digit or a tick character that is part of
+the TeX code.
 
-   <p>The only useful option of <code>special</code> is <code>lay</code>. 
-<a name="index-lay-277"></a>See <a href="Internal-options.html#Internal-options">Internal options</a>.
+   <p>The only useful option of <code>special</code> is <code>lay</code>, which
+determines if the substitued raw text is emitted before, after,
+or using the first point in <var>point_list</var> as an indicator
+of depth.  These occur, respectively, with <code>lay=under</code>,
+<code>lay=over</code>, and <code>lay=in</code>.  See <a href="Special-objects.html#Special-objects">Special objects</a>
+and <a href="TikZ_002fPGF-user_002ddefined-styles.html#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a> for examples. 
+<a name="index-lay-278"></a>See <a href="Internal-options.html#Internal-options">Internal options</a>.
 
    </body></html>
 
diff --git a/Doc/sketch/Statistics.html b/Doc/sketch/Statistics.html
index fa5899f..4393baf 100644
--- a/Doc/sketch/Statistics.html
+++ b/Doc/sketch/Statistics.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -66,7 +66,7 @@ ensure that the initial, approximate ordering was correct.  Among all
 these checks, only 5 resulted in swaps to reorder the initial
 sort.  In two cases, a correct ordering could not be determined, so
 binary space partitions
-<a name="index-binary-space-partition-503"></a>were constructed for splitting.  A total of 4
+<a name="index-binary-space-partition-504"></a>were constructed for splitting.  A total of 4
 objects (triangles in this case) were inserted in the partitions, and
 6 polygons were produced.  Finally, 24,851 “last
 resort” polygon overlap checks were performed after simpler, faster
diff --git a/Doc/sketch/Sweep-face-splitting.html b/Doc/sketch/Sweep-face-splitting.html
index 849802c..4415b41 100644
--- a/Doc/sketch/Sweep-face-splitting.html
+++ b/Doc/sketch/Sweep-face-splitting.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,12 +55,12 @@ Up: <a rel="up" accesskey="u" href="Sweeps.html#Sweeps">Sweeps</a>
 
 <p>Before sending each four-sided body polygon of a <code>sweep</code>
 to the output, <code>sketch</code> tests to see if it is roughly planar. 
-<a name="index-polygon_002c-planar-323"></a><a name="index-planarity-of-polygons-324"></a>Since planarity is necessary for proper functioning of the hidden
+<a name="index-polygon_002c-planar-324"></a><a name="index-planarity-of-polygons-325"></a>Since planarity is necessary for proper functioning of the hidden
 surface algorithm, “warped” polygons are automatically split into
 two triangles.
 
    <p>Hole-filling polygons produced by closure-tagged
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-325"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-326"></a>line sweeps are not
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-326"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-327"></a>line sweeps are not
 split.  Nor are original polygons in polygon sweeps.  It is the user's
 responsibility to ensure these are planar.
 
diff --git a/Doc/sketch/Sweeps.html b/Doc/sketch/Sweeps.html
index 55ffb45..5670247 100644
--- a/Doc/sketch/Sweeps.html
+++ b/Doc/sketch/Sweeps.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,16 +55,16 @@ Up: <a rel="up" accesskey="u" href="Drawables.html#Drawables">Drawables</a>
 <!-- node-name,  next,  previous,  up -->
 <h4 class="subsection">3.2.6 Sweeps</h4>
 
-<p><a name="index-sweep-278"></a><strong>Syntax:</strong>
+<p><a name="index-sweep-279"></a><strong>Syntax:</strong>
 <pre class="example">     sweep { <var>n</var>, <var>T_1</var>, <var>T_2</var>, ..., <var>T_r</var> }[<var>options</var>] <var>swept_object</var>
      sweep { <var>n</var><>, <var>T_1</var>, <var>T_2</var>, ..., <var>T_r</var> }[<var>options</var>] <var>swept_object</var>
 </pre>
    <p class="noindent">The sweep connects <var>n</var> (or perhaps <var>n</var>+1) copies of
 <var>swept_object</var>
-<a name="index-swept-object-279"></a>in order to create a new object of higher
+<a name="index-swept-object-280"></a>in order to create a new object of higher
 dimension.  The <var>T_i</var> (for i between 1 and
 r) are transforms. 
-<a name="index-transform-280"></a>The k'th copy of <var>swept_object</var> is produced by applying the
+<a name="index-transform-281"></a>The k'th copy of <var>swept_object</var> is produced by applying the
 following transform to the original.
 <pre class="example">     <var>T_1</var>^k then <var>T_2</var>^k then ... then <var>T_r</var>^k
 </pre>
@@ -75,7 +75,7 @@ transform).
 
    <p>The method of connecting the copies depends on the type of
 <var>swept_object</var> and on whether the closure tag
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-281"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-282"></a><span class="samp"><></span> is present
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-282"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-283"></a><span class="samp"><></span> is present
 or not.
 
    <p>An example of a sweep where r=2 is the Mobius figure at
diff --git a/Doc/sketch/Swept-blocks.html b/Doc/sketch/Swept-blocks.html
index d505bda..fac351f 100644
--- a/Doc/sketch/Swept-blocks.html
+++ b/Doc/sketch/Swept-blocks.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,11 +55,11 @@ Up: <a rel="up" accesskey="u" href="Sweeps.html#Sweeps">Sweeps</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.2.6.4 Swept blocks</h5>
 
-<p><a name="index-swept-bock-317"></a><a name="index-block-sweep-318"></a>The swept object <var>swept_object</var> may also be any collection of
+<p><a name="index-swept-bock-318"></a><a name="index-block-sweep-319"></a>The swept object <var>swept_object</var> may also be any collection of
 polylines and polygons.  This may be a block
-<a name="index-block-319"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-320"></a>composed of <code>line</code>
-<a name="index-line-321"></a>and/or <code>polygon</code>
-<a name="index-polygon-322"></a>commands in braces
+<a name="index-block-320"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-321"></a>composed of <code>line</code>
+<a name="index-line-322"></a>and/or <code>polygon</code>
+<a name="index-polygon-323"></a>commands in braces
 <span class="samp">{ }</span>, or it may be the result of a <code>repeat</code>, another
 <code>sweep</code>, etc.  The sweep acts independently on each object in the
 block exactly as if it were a single swept object described above in
diff --git a/Doc/sketch/Swept-lines.html b/Doc/sketch/Swept-lines.html
index d59d015..e38df45 100644
--- a/Doc/sketch/Swept-lines.html
+++ b/Doc/sketch/Swept-lines.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,21 +55,21 @@ Up: <a rel="up" accesskey="u" href="Sweeps.html#Sweeps">Sweeps</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.2.6.2 Swept lines</h5>
 
-<p><a name="index-swept-line-291"></a><a name="index-line-sweep-292"></a>If <var>swept_object</var> is a polyline and there is no closure tag,
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-293"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-294"></a>then
+<p><a name="index-swept-line-292"></a><a name="index-line-sweep-293"></a>If <var>swept_object</var> is a polyline and there is no closure tag,
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-294"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-295"></a>then
 <code>sweep</code> connects <var>n</var>+1 successive copies of the
 polyline (including the original) with four-sided polygons, each pair
 of copies giving rise to a “polygon strip.”  If there are m
 points in the original polyline, then (m-1)<var>n</var> polygons are
 formed by the sweep.  We call these <dfn>body polygons</dfn>. 
-<a name="index-body-polygon-295"></a><a name="index-polygon_002c-body-296"></a>In this manner, <code>sweep</code> forms a
+<a name="index-body-polygon-296"></a><a name="index-polygon_002c-body-297"></a>In this manner, <code>sweep</code> forms a
 two-dimensional surface from from a one-dimensional polyline.
 
    <p>The order of vertices
-<a name="index-polygon-vertex-order-297"></a><a name="index-order_002c-polygon-vertex-298"></a>produced by <code>sweep</code> is important.  If a
+<a name="index-polygon-vertex-order-298"></a><a name="index-order_002c-polygon-vertex-299"></a>produced by <code>sweep</code> is important.  If a
 polygon's vertices do not appear in counter-clockwise order in the
 final image, the polygon will be culled
-<a name="index-culling-299"></a>(unless <code>cull=false</code> is
+<a name="index-culling-300"></a>(unless <code>cull=false</code> is
 set).  If the points in the k'th copy of the polyline are
 P_1, P_2, <small class="dots">...</small>, P_m, and the points in the
 next copy, the (k+1)st, are P_1', P_2', <small class="dots">...</small>,
@@ -80,11 +80,11 @@ P_m', then the vertex order of the generated polygons is
      Body polygon m-1: P_m P_m-1 P_m-1' P_m'
 </pre>
    <p>Options of unclosed line sweeps
-<a name="index-options_002c-sweep-300"></a>are copied to each output polygon. 
+<a name="index-options_002c-sweep-301"></a>are copied to each output polygon. 
 Options of the swept line are ignored. 
-<a name="index-options_002c-swept-object-301"></a>
+<a name="index-options_002c-swept-object-302"></a>
 When there <em>is</em> a closure tag,
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-302"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-303"></a>then <code>sweep</code> connects <var>n</var>
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-303"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-304"></a>then <code>sweep</code> connects <var>n</var>
 successive copies of the polyline (including the original) with
 four-sided body polygons just as the case with no closure tag.  It then
 connects the last copy back to the original to form a ribbon-shaped
@@ -95,9 +95,9 @@ closed surface that, depending on the sweep transforms, may
 represent the boundary of a solid.  In this manner, <code>sweep</code> forms
 the boundary of a three-dimensional object from a one-dimensional
 polyline.  We call these hole-filling polygons <dfn>ends</dfn>. 
-<a name="index-end-polygon-304"></a><a name="index-polygon_002c-end-305"></a>
+<a name="index-end-polygon-305"></a><a name="index-polygon_002c-end-306"></a>
 The order of vertices of end polygons
-<a name="index-polygon-vertex-order-306"></a><a name="index-order_002c-polygon-vertex-307"></a>is important for correct culling
+<a name="index-polygon-vertex-order-307"></a><a name="index-order_002c-polygon-vertex-308"></a>is important for correct culling
 as described above.  If P_1^1, P_1^2, <small class="dots">...</small>,
 P_1^n are the <var>n</var> copies of the first polyline point and
 P_m^1, P_m^2, <small class="dots">...</small> ,P_m^n are the <var>n</var>
@@ -107,9 +107,9 @@ is
      End polygon 2: P_m^1, P_m^2, <small class="dots">...</small> ,P_m^n
 </pre>
    <p>If there are no options on the swept line,
-<a name="index-options_002c-swept-object-308"></a>then the <span class="samp">sweep</span>
+<a name="index-options_002c-swept-object-309"></a>then the <span class="samp">sweep</span>
 options
-<a name="index-options_002c-sweep-309"></a>are copied to each output polygon.  If the swept line does
+<a name="index-options_002c-sweep-310"></a>are copied to each output polygon.  If the swept line does
 have options, these are copied to corresponding body polygons; the
 sweep options are copied to the end polygons.  In this manner, body
 and ends may be drawn with different characteristics such as
diff --git a/Doc/sketch/Swept-objects.html b/Doc/sketch/Swept-objects.html
index 3829927..cc544d1 100644
--- a/Doc/sketch/Swept-objects.html
+++ b/Doc/sketch/Swept-objects.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Swept-points.html b/Doc/sketch/Swept-points.html
index f003971..fd01fe2 100644
--- a/Doc/sketch/Swept-points.html
+++ b/Doc/sketch/Swept-points.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,16 +55,16 @@ Up: <a rel="up" accesskey="u" href="Sweeps.html#Sweeps">Sweeps</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.2.6.1 Swept points</h5>
 
-<p><a name="index-swept-point-283"></a><a name="index-point-sweep-284"></a>If <var>swept_object</var> is a point list and there is no closure tag,
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-285"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-286"></a>then <code>sweep</code> connects <var>n</var>+1 successive copies of each
+<p><a name="index-swept-point-284"></a><a name="index-point-sweep-285"></a>If <var>swept_object</var> is a point list and there is no closure tag,
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-286"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-287"></a>then <code>sweep</code> connects <var>n</var>+1 successive copies of each
 point (including the original) with straight line segments to form a
 polyline.  If there are m points in the original point list,
-<a name="index-point-list-287"></a>then m polylines with <var>n</var> segments each are formed by the
+<a name="index-point-list-288"></a>then m polylines with <var>n</var> segments each are formed by the
 sweep.  In this manner, <code>sweep</code> forms a set of one-dimensional
 objects (polylines) from zero-dimensional ones (points).
 
    <p>When there <em>is</em> a closure tag,
-<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-288"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-289"></a><code>sweep</code> connects <var>n</var>
+<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-289"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-290"></a><code>sweep</code> connects <var>n</var>
 successive copies of each point (including the original) with straight
 line segments and finally connects the last copy back to the original
 to form a polygon with <var>n</var> sides.  If there are m points in
@@ -74,7 +74,7 @@ set of two-dimensional objects (polygons) from zero-dimensional ones
 (points).
 
    <p>Options
-<a name="index-options_002c-sweep-290"></a>of the <code>sweep</code> are copied directly to the resulting
+<a name="index-options_002c-sweep-291"></a>of the <code>sweep</code> are copied directly to the resulting
 polyline(s).
 
    </body></html>
diff --git a/Doc/sketch/Swept-polygons.html b/Doc/sketch/Swept-polygons.html
index c888944..2eee92f 100644
--- a/Doc/sketch/Swept-polygons.html
+++ b/Doc/sketch/Swept-polygons.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,22 +55,22 @@ Up: <a rel="up" accesskey="u" href="Sweeps.html#Sweeps">Sweeps</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.2.6.3 Swept polygons</h5>
 
-<p><a name="index-polygon-sweep-310"></a>If <var>swept_object</var> is a polygon, the <code>sweep</code> connects
+<p><a name="index-polygon-sweep-311"></a>If <var>swept_object</var> is a polygon, the <code>sweep</code> connects
 <var>n</var>+1 successive copies of the closed polyline border of
 the polygon to form body polygons exactly as though the border were a
 swept polyline as described in <a href="Swept-lines.html#Swept-lines">Swept lines</a>. 
-<a name="index-body-polygon-311"></a><a name="index-polygon_002c-body-312"></a>If there are m points in the
+<a name="index-body-polygon-312"></a><a name="index-polygon_002c-body-313"></a>If there are m points in the
 original polygon, then m<var>n</var> body polygons are formed by
 this sweep.  The body polygons form an <dfn>extrusion</dfn> of the boundary of the
 original polygon with two holes at the open ends.
 
    <p>Finally, the sweep adds two copies of the original polygon to cover
 the holes.  We call these hole-filling polygons <dfn>ends</dfn>. 
-<a name="index-end-polygon-313"></a><a name="index-polygon_002c-end-314"></a>In this manner, <code>sweep</code> forms the boundary of a three-dimensional
+<a name="index-end-polygon-314"></a><a name="index-polygon_002c-end-315"></a>In this manner, <code>sweep</code> forms the boundary of a three-dimensional
 object from a two-dimensional polygon.
 
    <p>The order of vertices
-<a name="index-polygon-vertex-order-315"></a><a name="index-order_002c-polygon-vertex-316"></a>of end polygons is important for correct culling as described above. 
+<a name="index-polygon-vertex-order-316"></a><a name="index-order_002c-polygon-vertex-317"></a>of end polygons is important for correct culling as described above. 
 An exact copy of the original polygon with vertex order intact forms
 the first end polygon.  The other end polygon results from
 transforming and the reversing the order of vertices in the original. 
diff --git a/Doc/sketch/TikZ_002fPGF-options.html b/Doc/sketch/TikZ_002fPGF-options.html
index c3e51e8..63050aa 100644
--- a/Doc/sketch/TikZ_002fPGF-options.html
+++ b/Doc/sketch/TikZ_002fPGF-options.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/TikZ_002fPGF-user_002ddefined-styles.html b/Doc/sketch/TikZ_002fPGF-user_002ddefined-styles.html
index 3d52e35..5276224 100644
--- a/Doc/sketch/TikZ_002fPGF-user_002ddefined-styles.html
+++ b/Doc/sketch/TikZ_002fPGF-user_002ddefined-styles.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -100,7 +100,7 @@ Now, the output is
 <code>sketch</code> code as <code>special</code>s with option <code>[lay=under]</code>
 to ensure that the styles are emitted first in the output, before
 any uses of the style names. 
-<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a>  For
+<a name="index-lay-252"></a><a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a>  For
 example,
 <pre class="verbatim">
   special|\tikzstyle{mypolygonstyle} = [fill=blue!20,fill opacity=0.8]|[lay=under]
diff --git a/Doc/sketch/Transform-literals.html b/Doc/sketch/Transform-literals.html
index dd90e7a..54986f7 100644
--- a/Doc/sketch/Transform-literals.html
+++ b/Doc/sketch/Transform-literals.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Transparency.html b/Doc/sketch/Transparency.html
index 07fe1d7..0e72f29 100644
--- a/Doc/sketch/Transparency.html
+++ b/Doc/sketch/Transparency.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -55,18 +55,18 @@ Up: <a rel="up" accesskey="u" href="Options.html#Options">Options</a>
 <!-- node-name,  next,  previous,  up -->
 <h5 class="subsubsection">3.1.5.5 Transparency</h5>
 
-<p><a name="index-transparency-252"></a>Both <code>PSTricks</code> and <code>TikZ/PGF</code> support polygon options that
+<p><a name="index-transparency-253"></a>Both <code>PSTricks</code> and <code>TikZ/PGF</code> support polygon options that
 have the effect of making the polygon appear transparent.  For
 <code>PSTricks</code>, keyword <code>transpalpha</code> was used during initial
 development of transparency features, and <code>opacity</code> was adopted
 later. <code>Sketch</code> honors both. <code>TikZ/PGF</code> uses <code>opacity</code> only. 
-<a name="index-transpalpha-253"></a><a name="index-opacity-254"></a><a name="index-fill-opacity-255"></a>When transparent polygons are in the foreground, objects behind them
+<a name="index-transpalpha-254"></a><a name="index-opacity-255"></a><a name="index-fill-opacity-256"></a>When transparent polygons are in the foreground, objects behind them
 (drawn earlier) are visible with color subdued and tinted.  The hidden
 surface algorithm of <code>sketch</code> works well with such transparent
 polygons.
 
    <p>Note that <tt>cull=false</tt>
-<a name="index-cull-256"></a>must be used for rear-facing polygons to be visible when positioned
+<a name="index-cull-257"></a>must be used for rear-facing polygons to be visible when positioned
 behind other transparent surfaces.
 
    </body></html>
diff --git a/Doc/sketch/Two_002doperand-_0028binary_0029-forms.html b/Doc/sketch/Two_002doperand-_0028binary_0029-forms.html
index d08cf61..053c39b 100644
--- a/Doc/sketch/Two_002doperand-_0028binary_0029-forms.html
+++ b/Doc/sketch/Two_002doperand-_0028binary_0029-forms.html
@@ -12,8 +12,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/Unary-forms.html b/Doc/sketch/Unary-forms.html
index 3101d98..e2e5960 100644
--- a/Doc/sketch/Unary-forms.html
+++ b/Doc/sketch/Unary-forms.html
@@ -11,8 +11,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
diff --git a/Doc/sketch/ex045.png b/Doc/sketch/ex045.png
index 7ddc38a..31390e3 100644
Binary files a/Doc/sketch/ex045.png and b/Doc/sketch/ex045.png differ
diff --git a/Doc/sketch/ex090.png b/Doc/sketch/ex090.png
index 0f71683..1e63ae6 100644
Binary files a/Doc/sketch/ex090.png and b/Doc/sketch/ex090.png differ
diff --git a/Doc/sketch/ex180.png b/Doc/sketch/ex180.png
index d6f7a19..04b008b 100644
Binary files a/Doc/sketch/ex180.png and b/Doc/sketch/ex180.png differ
diff --git a/Doc/sketch/index.html b/Doc/sketch/index.html
index 6977389..eac2987 100644
--- a/Doc/sketch/index.html
+++ b/Doc/sketch/index.html
@@ -8,111 +8,111 @@
 <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage
 
 <ul class="index-cp" compact>
-<li><a href="A-technical-drawing.html#index-affine-arithmetic-456">affine arithmetic</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="A-technical-drawing.html#index-affine-arithmetic-457">affine arithmetic</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Affine-arithmetic.html#index-affine-arithmetic-151">affine arithmetic</a>: <a href="Affine-arithmetic.html#Affine-arithmetic">Affine arithmetic</a></li>
-<li><a href="Forms-of-definitions.html#index-alternatives_002c-definition-341">alternatives, definition</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="Forms-of-definitions.html#index-alternatives_002c-definition-342">alternatives, definition</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
 <li><a href="Special-objects.html#index-argument_002c-special-51">argument, special</a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
-<li><a href="Specials.html#index-argument_002c-special-276">argument, special</a>: <a href="Specials.html#Specials">Specials</a></li>
+<li><a href="Specials.html#index-argument_002c-special-277">argument, special</a>: <a href="Specials.html#Specials">Specials</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-associativity_002c-operator-232">associativity, operator</a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Object-transforms.html#index-axis_002c-rotation-82">axis, rotation</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
 <li><a href="Drawing-a-solid.html#index-back-face-43">back face</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="Picture-box.html#index-baseline-fraction-384">baseline fraction</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
+<li><a href="Picture-box.html#index-baseline-fraction-385">baseline fraction</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-binary-form-217">binary form</a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="Command-line.html#index-binary-space-partition-509">binary space partition</a>: <a href="Command-line.html#Command-line">Command line</a></li>
-<li><a href="Hidden-surface-removal.html#index-binary-space-partition-501">binary space partition</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
-<li><a href="Statistics.html#index-binary-space-partition-503">binary space partition</a>: <a href="Statistics.html#Statistics">Statistics</a></li>
-<li><a href="Swept-blocks.html#index-block-319">block</a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
-<li><a href="Blocks.html#index-block-327">block</a>: <a href="Blocks.html#Blocks">Blocks</a></li>
+<li><a href="Command-line.html#index-binary-space-partition-510">binary space partition</a>: <a href="Command-line.html#Command-line">Command line</a></li>
+<li><a href="Hidden-surface-removal.html#index-binary-space-partition-502">binary space partition</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="Statistics.html#index-binary-space-partition-504">binary space partition</a>: <a href="Statistics.html#Statistics">Statistics</a></li>
+<li><a href="Swept-blocks.html#index-block-320">block</a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
+<li><a href="Blocks.html#index-block-328">block</a>: <a href="Blocks.html#Blocks">Blocks</a></li>
 <li><a href="Object-transforms.html#index-block-70">block</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Swept-blocks.html#index-block-sweep-318">block sweep</a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
-<li><a href="Swept-polygons.html#index-body-polygon-311">body polygon</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
-<li><a href="Swept-lines.html#index-body-polygon-295">body polygon</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="Internal-options.html#index-body-polygon-263">body polygon</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
-<li><a href="Picture-box.html#index-bounding-box-385">bounding box</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
-<li><a href="Command-line.html#index-BSP_002c-binary-space-partition-510">BSP, binary space partition</a>: <a href="Command-line.html#Command-line">Command line</a></li>
-<li><a href="Hidden-surface-removal.html#index-BSP_002c-binary-space-partition-502">BSP, binary space partition</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
-<li><a href="Camera.html#index-camera-379">camera</a>: <a href="Camera.html#Camera">Camera</a></li>
+<li><a href="Swept-blocks.html#index-block-sweep-319">block sweep</a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
+<li><a href="Swept-polygons.html#index-body-polygon-312">body polygon</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
+<li><a href="Swept-lines.html#index-body-polygon-296">body polygon</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Internal-options.html#index-body-polygon-264">body polygon</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
+<li><a href="Picture-box.html#index-bounding-box-386">bounding box</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
+<li><a href="Command-line.html#index-BSP_002c-binary-space-partition-511">BSP, binary space partition</a>: <a href="Command-line.html#Command-line">Command line</a></li>
+<li><a href="Hidden-surface-removal.html#index-BSP_002c-binary-space-partition-503">BSP, binary space partition</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="Camera.html#index-camera-380">camera</a>: <a href="Camera.html#Camera">Camera</a></li>
 <li><a href="Object-transforms.html#index-center-of-rotation-59">center of rotation</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
 <li><a href="Nested-sweeps.html#index-center-of-rotation-121">center of rotation</a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="A-technical-drawing.html#index-centroid-471">centroid</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Clipping.html#index-clipping-497">clipping</a>: <a href="Clipping.html#Clipping">Clipping</a></li>
-<li><a href="Picture-box.html#index-clipping-388">clipping</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
-<li><a href="Swept-lines.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-303">closure tag, <code><></code></a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="Swept-points.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-286">closure tag, <code><></code></a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
-<li><a href="Sweeps.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-282">closure tag, <code><></code></a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
+<li><a href="A-technical-drawing.html#index-centroid-472">centroid</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Clipping.html#index-clipping-498">clipping</a>: <a href="Clipping.html#Clipping">Clipping</a></li>
+<li><a href="Picture-box.html#index-clipping-389">clipping</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
+<li><a href="Swept-lines.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-304">closure tag, <code><></code></a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Swept-points.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-287">closure tag, <code><></code></a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
+<li><a href="Sweeps.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-283">closure tag, <code><></code></a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-137">closure tag, <code><></code></a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="Sweep-face-splitting.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-326">closure tag, <code><></code></a>: <a href="Sweep-face-splitting.html#Sweep-face-splitting">Sweep face splitting</a></li>
+<li><a href="Sweep-face-splitting.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-327">closure tag, <code><></code></a>: <a href="Sweep-face-splitting.html#Sweep-face-splitting">Sweep face splitting</a></li>
 <li><a href="Point-sweeps.html#index-closure-tag_002c-_0040code_007b_003c_003e_007d-101">closure tag, <code><></code></a>: <a href="Point-sweeps.html#Point-sweeps">Point sweeps</a></li>
 <li><a href="Hello-world.html#index-command-line-option-13">command line option</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="Command-line.html#index-command-line-options-508">command line options</a>: <a href="Command-line.html#Command-line">Command line</a></li>
+<li><a href="Command-line.html#index-command-line-options-509">command line options</a>: <a href="Command-line.html#Command-line">Command line</a></li>
 <li><a href="Hello-world.html#index-command-line_002c-_0040code_007bsketch_007d-7">command line, <code>sketch</code></a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="Command-line.html#index-command-line_002c-_0040code_007bsketch_007d-506">command line, <code>sketch</code></a>: <a href="Command-line.html#Command-line">Command line</a></li>
+<li><a href="Command-line.html#index-command-line_002c-_0040code_007bsketch_007d-507">command line, <code>sketch</code></a>: <a href="Command-line.html#Command-line">Command line</a></li>
 <li><a href="Drawing-a-solid.html#index-comments-40">comments</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Language-basics.html#index-comments-166">comments</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
 <li><a href="Transform-literals.html#index-constructor-181">constructor</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
 <li><a href="Introduction-by-example.html#index-coordinate-system_002c-right_002dhanded-3">coordinate system, right-handed</a>: <a href="Introduction-by-example.html#Introduction-by-example">Introduction by example</a></li>
 <li><a href="Hello-world.html#index-counter_002dclockwise-polygon-vertex-order-20">counter-clockwise polygon vertex order</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="Swept-lines.html#index-culling-299">culling</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Swept-lines.html#index-culling-300">culling</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
 <li><a href="Drawing-a-solid.html#index-culling-42">culling</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Hello-world.html#index-culling-23">culling</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
 <li><a href="Drawing-a-solid.html#index-culling-44">culling</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Language-basics.html#index-declarative-language-163">declarative language</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
 <li><a href="Drawing-a-solid.html#index-definition-33">definition</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="Definitions.html#index-definition-335">definition</a>: <a href="Definitions.html#Definitions">Definitions</a></li>
-<li><a href="Forms-of-definitions.html#index-definition-with-alternatives-340">definition with alternatives</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="Definitions.html#index-definition-336">definition</a>: <a href="Definitions.html#Definitions">Definitions</a></li>
+<li><a href="Forms-of-definitions.html#index-definition-with-alternatives-341">definition with alternatives</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
 <li><a href="Object-transforms.html#index-definition_002c-drawable-75">definition, drawable</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-definition_002c-options-147">definition, options</a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
 <li><a href="Drawing-a-solid.html#index-definition_002c-point-35">definition, point</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Swept-objects.html#index-definition_002c-scalar-97">definition, scalar</a>: <a href="Swept-objects.html#Swept-objects">Swept objects</a></li>
-<li><a href="Forms-of-definitions.html#index-definition_002c-simple-339">definition, simple</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="Command-line.html#index-definition_002c-tag-514">definition, tag</a>: <a href="Command-line.html#Command-line">Command line</a></li>
-<li><a href="Forms-of-definitions.html#index-definition_002c-tag-343">definition, tag</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="Definitions.html#index-definition_002c-tag-336">definition, tag</a>: <a href="Definitions.html#Definitions">Definitions</a></li>
-<li><a href="Overview.html#index-definition_002c-transform-409">definition, transform</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Forms-of-definitions.html#index-definition_002c-simple-340">definition, simple</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="Command-line.html#index-definition_002c-tag-515">definition, tag</a>: <a href="Command-line.html#Command-line">Command line</a></li>
+<li><a href="Forms-of-definitions.html#index-definition_002c-tag-344">definition, tag</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="Definitions.html#index-definition_002c-tag-337">definition, tag</a>: <a href="Definitions.html#Definitions">Definitions</a></li>
+<li><a href="Overview.html#index-definition_002c-transform-410">definition, transform</a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Polyline-sweeps.html#index-definition_002c-vector-117">definition, vector</a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="Hidden-surface-removal.html#index-depth-sort-498">depth sort</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
-<li><a href="Internal-options.html#index-depth-sort-262">depth sort</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
-<li><a href="Bugs-and-anomalies.html#index-depth-sort-505">depth sort</a>: <a href="Bugs-and-anomalies.html#Bugs-and-anomalies">Bugs and anomalies</a></li>
+<li><a href="Hidden-surface-removal.html#index-depth-sort-499">depth sort</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="Internal-options.html#index-depth-sort-263">depth sort</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
+<li><a href="Bugs-and-anomalies.html#index-depth-sort-506">depth sort</a>: <a href="Bugs-and-anomalies.html#Bugs-and-anomalies">Bugs and anomalies</a></li>
 <li><a href="Transform-literals.html#index-direct-transform-211">direct transform</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Command-line.html#index-document-template-511">document template</a>: <a href="Command-line.html#Command-line">Command line</a></li>
+<li><a href="Command-line.html#index-document-template-512">document template</a>: <a href="Command-line.html#Command-line">Command line</a></li>
 <li><a href="Hello-world.html#index-document-template-15">document template</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
 <li><a href="Object-transforms.html#index-drawable-74">drawable</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Drawables.html#index-drawable-266">drawable</a>: <a href="Drawables.html#Drawables">Drawables</a></li>
+<li><a href="Drawables.html#index-drawable-267">drawable</a>: <a href="Drawables.html#Drawables">Drawables</a></li>
 <li><a href="Object-transforms.html#index-drawable-definition-76">drawable definition</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Forms-of-references.html#index-drawable-reference-358">drawable reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Swept-lines.html#index-end-polygon-304">end polygon</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="Swept-polygons.html#index-end-polygon-313">end polygon</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
+<li><a href="Forms-of-references.html#index-drawable-reference-359">drawable reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Swept-lines.html#index-end-polygon-305">end polygon</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Swept-polygons.html#index-end-polygon-314">end polygon</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
 <li><a href="Drawing-a-solid.html#index-faces-29">faces</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Polyline-sweeps.html#index-faces-108">faces</a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="Language-basics.html#index-file_002c-include-168">file, include</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
 <li><a href="Language-basics.html#index-file_002c-input-160">file, input</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
-<li><a href="Frame.html#index-frame-box-389">frame box</a>: <a href="Frame.html#Frame">Frame</a></li>
+<li><a href="Frame.html#index-frame-box-390">frame box</a>: <a href="Frame.html#Frame">Frame</a></li>
 <li><a href="Drawing-options.html#index-global-options-27">global options</a>: <a href="Drawing-options.html#Drawing-options">Drawing options</a></li>
-<li><a href="Global-options.html#index-global-options-372">global options</a>: <a href="Global-options.html#Global-options">Global options</a></li>
+<li><a href="Global-options.html#index-global-options-373">global options</a>: <a href="Global-options.html#Global-options">Global options</a></li>
 <li><a href="Polyline-sweeps.html#index-helix-115">helix</a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="Drawing-a-solid.html#index-helix-46">helix</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Hello-world.html#index-hello-world-5">hello world</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="A-technical-drawing.html#index-hidden-surface-algorithm-446">hidden surface algorithm</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="A-technical-drawing.html#index-hidden-surface-algorithm-447">hidden surface algorithm</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Hello-world.html#index-hidden-surface-algorithm-9">hidden surface algorithm</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
 <li><a href="Transform-literals.html#index-hidden-surface-algorithm-203">hidden surface algorithm</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
 <li><a href="Special-objects.html#index-hidden-surface-algorithm-57">hidden surface algorithm</a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
-<li><a href="Hidden-surface-removal.html#index-hidden-surface-algorithm-499">hidden surface algorithm</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
-<li><a href="A-hierarchical-model.html#index-hierarchical-model-472">hierarchical model</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="Hidden-surface-removal.html#index-hidden-surface-algorithm-500">hidden surface algorithm</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="A-hierarchical-model.html#index-hierarchical-model-473">hierarchical model</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Identifiers.html#index-identifiers-170">identifiers</a>: <a href="Identifiers.html#Identifiers">Identifiers</a></li>
 <li><a href="Language-basics.html#index-include-file-167">include file</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
 <li><a href="Language-basics.html#index-input-file-159">input file</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
 <li><a href="Special-objects.html#index-internal-option-54">internal option</a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
-<li><a href="Global-options.html#index-internal-options-375">internal options</a>: <a href="Global-options.html#Global-options">Global options</a></li>
-<li><a href="Internal-options.html#index-internal-options-258">internal options</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
+<li><a href="Global-options.html#index-internal-options-376">internal options</a>: <a href="Global-options.html#Global-options">Global options</a></li>
+<li><a href="Internal-options.html#index-internal-options-259">internal options</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
 <li><a href="Key-and-reserved-words.html#index-keywords-171">keywords</a>: <a href="Key-and-reserved-words.html#Key-and-reserved-words">Key and reserved words</a></li>
 <li><a href="Special-objects.html#index-labels-47">labels</a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
 <li><a href="Language-basics.html#index-language_002c-declarative-164">language, declarative</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
-<li><a href="Language.html#index-language_002c-output-396">language, output</a>: <a href="Language.html#Language">Language</a></li>
+<li><a href="Language.html#index-language_002c-output-397">language, output</a>: <a href="Language.html#Language">Language</a></li>
 <li><a href="Language-basics.html#index-language_002c-scene-description-162">language, scene description</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
-<li><a href="Blocks.html#index-lexical-scope-329">lexical scope</a>: <a href="Blocks.html#Blocks">Blocks</a></li>
+<li><a href="Blocks.html#index-lexical-scope-330">lexical scope</a>: <a href="Blocks.html#Blocks">Blocks</a></li>
 <li><a href="Object-transforms.html#index-lexical-scope-72">lexical scope</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Swept-lines.html#index-line-sweep-292">line sweep</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="A-technical-drawing.html#index-line-sweep-445">line sweep</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Swept-lines.html#index-line-sweep-293">line sweep</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="A-technical-drawing.html#index-line-sweep-446">line sweep</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Polyline-sweeps.html#index-line-sweep-105">line sweep</a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="Point-and-vector-literals.html#index-literal_002c-point-176">literal, point</a>: <a href="Point-and-vector-literals.html#Point-and-vector-literals">Point and vector literals</a></li>
 <li><a href="Scalar-literals.html#index-literal_002c-scalar-174">literal, scalar</a>: <a href="Scalar-literals.html#Scalar-literals">Scalar literals</a></li>
@@ -127,172 +127,172 @@
 <li><a href="Special-objects.html#index-option_002c-internal-55">option, internal</a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
 <li><a href="Options.html#index-options-248">options</a>: <a href="Options.html#Options">Options</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-options-definition-148">options definition</a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="Forms-of-references.html#index-options-multiple-reference-364">options multiple reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Forms-of-references.html#index-options-reference-361">options reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Command-line.html#index-options_002c-command-line-507">options, command line</a>: <a href="Command-line.html#Command-line">Command line</a></li>
+<li><a href="Forms-of-references.html#index-options-multiple-reference-365">options multiple reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-references.html#index-options-reference-362">options reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Command-line.html#index-options_002c-command-line-508">options, command line</a>: <a href="Command-line.html#Command-line">Command line</a></li>
 <li><a href="Drawing-options.html#index-options_002c-global-26">options, global</a>: <a href="Drawing-options.html#Drawing-options">Drawing options</a></li>
-<li><a href="Global-options.html#index-options_002c-global-371">options, global</a>: <a href="Global-options.html#Global-options">Global options</a></li>
-<li><a href="Internal-options.html#index-options_002c-internal-257">options, internal</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
-<li><a href="Global-options.html#index-options_002c-internal-374">options, internal</a>: <a href="Global-options.html#Global-options">Global options</a></li>
+<li><a href="Global-options.html#index-options_002c-global-372">options, global</a>: <a href="Global-options.html#Global-options">Global options</a></li>
+<li><a href="Internal-options.html#index-options_002c-internal-258">options, internal</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
+<li><a href="Global-options.html#index-options_002c-internal-375">options, internal</a>: <a href="Global-options.html#Global-options">Global options</a></li>
 <li><a href="Polygon-sweeps.html#index-options_002c-sweep-135">options, sweep</a>: <a href="Polygon-sweeps.html#Polygon-sweeps">Polygon sweeps</a></li>
-<li><a href="Swept-points.html#index-options_002c-sweep-290">options, sweep</a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
-<li><a href="Swept-lines.html#index-options_002c-sweep-300">options, sweep</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Swept-points.html#index-options_002c-sweep-291">options, sweep</a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
+<li><a href="Swept-lines.html#index-options_002c-sweep-301">options, sweep</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
 <li><a href="Polyline-sweeps.html#index-options_002c-sweep-116">options, sweep</a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="Swept-lines.html#index-options_002c-sweep-309">options, sweep</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Swept-lines.html#index-options_002c-sweep-310">options, sweep</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
 <li><a href="Polygon-sweeps.html#index-options_002c-swept-object-134">options, swept object</a>: <a href="Polygon-sweeps.html#Polygon-sweeps">Polygon sweeps</a></li>
-<li><a href="Swept-lines.html#index-options_002c-swept-object-301">options, swept object</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Swept-lines.html#index-options_002c-swept-object-302">options, swept object</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-options_002c-swept-object-146">options, swept object</a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="Swept-lines.html#index-options_002c-swept-object-308">options, swept object</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="Overview.html#index-order_002c-polygon-vertex-423">order, polygon vertex</a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Swept-polygons.html#index-order_002c-polygon-vertex-316">order, polygon vertex</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
+<li><a href="Swept-lines.html#index-options_002c-swept-object-309">options, swept object</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Overview.html#index-order_002c-polygon-vertex-424">order, polygon vertex</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Swept-polygons.html#index-order_002c-polygon-vertex-317">order, polygon vertex</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
 <li><a href="Hello-world.html#index-order_002c-polygon-vertex-22">order, polygon vertex</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="Swept-lines.html#index-order_002c-polygon-vertex-298">order, polygon vertex</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="Language.html#index-output-language-397">output language</a>: <a href="Language.html#Language">Language</a></li>
+<li><a href="Swept-lines.html#index-order_002c-polygon-vertex-299">order, polygon vertex</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Language.html#index-output-language-398">output language</a>: <a href="Language.html#Language">Language</a></li>
 <li><a href="Hello-world.html#index-outside-of-a-polygon-17">outside of a polygon</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="Picture-box.html#index-parallel-projection-386">parallel projection</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
+<li><a href="Picture-box.html#index-parallel-projection-387">parallel projection</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
 <li><a href="Transform-literals.html#index-parallel-projection-195">parallel projection</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
 <li><a href="Hello-world.html#index-parallel-projection-11">parallel projection</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-parentheses-233">parentheses</a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
-<li><a href="Overview.html#index-perspective-projection-404">perspective projection</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-perspective-projection-405">perspective projection</a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Transform-literals.html#index-perspective-projection-198">perspective projection</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Picture-box.html#index-picture-box-381">picture box</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
-<li><a href="Polygons.html#index-planarity-of-polygons-272">planarity of polygons</a>: <a href="Polygons.html#Polygons">Polygons</a></li>
-<li><a href="Sweep-face-splitting.html#index-planarity-of-polygons-324">planarity of polygons</a>: <a href="Sweep-face-splitting.html#Sweep-face-splitting">Sweep face splitting</a></li>
+<li><a href="Picture-box.html#index-picture-box-382">picture box</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
+<li><a href="Polygons.html#index-planarity-of-polygons-273">planarity of polygons</a>: <a href="Polygons.html#Polygons">Polygons</a></li>
+<li><a href="Sweep-face-splitting.html#index-planarity-of-polygons-325">planarity of polygons</a>: <a href="Sweep-face-splitting.html#Sweep-face-splitting">Sweep face splitting</a></li>
 <li><a href="Drawing-a-solid.html#index-point-definition-36">point definition</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="Swept-points.html#index-point-list-287">point list</a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
+<li><a href="Swept-points.html#index-point-list-288">point list</a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
 <li><a href="Point-and-vector-literals.html#index-point-literal-175">point literal</a>: <a href="Point-and-vector-literals.html#Point-and-vector-literals">Point and vector literals</a></li>
-<li><a href="Forms-of-references.html#index-point-reference-349">point reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-references.html#index-point-reference-350">point reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Swept-objects.html#index-point-sweep-95">point sweep</a>: <a href="Swept-objects.html#Swept-objects">Swept objects</a></li>
-<li><a href="Swept-points.html#index-point-sweep-284">point sweep</a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
+<li><a href="Swept-points.html#index-point-sweep-285">point sweep</a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
 <li><a href="Polygon-sweeps.html#index-polygon-sweep-132">polygon sweep</a>: <a href="Polygon-sweeps.html#Polygon-sweeps">Polygon sweeps</a></li>
-<li><a href="Swept-polygons.html#index-polygon-sweep-310">polygon sweep</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
-<li><a href="A-hierarchical-model.html#index-polygon-sweep-496">polygon sweep</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
-<li><a href="Swept-lines.html#index-polygon-vertex-order-297">polygon vertex order</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="Swept-polygons.html#index-polygon-vertex-order-315">polygon vertex order</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
-<li><a href="Overview.html#index-polygon-vertex-order-422">polygon vertex order</a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Swept-lines.html#index-polygon-vertex-order-306">polygon vertex order</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Swept-polygons.html#index-polygon-sweep-311">polygon sweep</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
+<li><a href="A-hierarchical-model.html#index-polygon-sweep-497">polygon sweep</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="Swept-lines.html#index-polygon-vertex-order-298">polygon vertex order</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Swept-polygons.html#index-polygon-vertex-order-316">polygon vertex order</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
+<li><a href="Overview.html#index-polygon-vertex-order-423">polygon vertex order</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Swept-lines.html#index-polygon-vertex-order-307">polygon vertex order</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
 <li><a href="Hello-world.html#index-polygon-vertex-order-21">polygon vertex order</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="Overview.html#index-polygon-vertex-order-414">polygon vertex order</a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Swept-polygons.html#index-polygon_002c-body-312">polygon, body</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
-<li><a href="Swept-lines.html#index-polygon_002c-body-296">polygon, body</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="Internal-options.html#index-polygon_002c-body-264">polygon, body</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
-<li><a href="Swept-polygons.html#index-polygon_002c-end-314">polygon, end</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
-<li><a href="Swept-lines.html#index-polygon_002c-end-305">polygon, end</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Overview.html#index-polygon-vertex-order-415">polygon vertex order</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Swept-polygons.html#index-polygon_002c-body-313">polygon, body</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
+<li><a href="Swept-lines.html#index-polygon_002c-body-297">polygon, body</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="Internal-options.html#index-polygon_002c-body-265">polygon, body</a>: <a href="Internal-options.html#Internal-options">Internal options</a></li>
+<li><a href="Swept-polygons.html#index-polygon_002c-end-315">polygon, end</a>: <a href="Swept-polygons.html#Swept-polygons">Swept polygons</a></li>
+<li><a href="Swept-lines.html#index-polygon_002c-end-306">polygon, end</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
 <li><a href="Hello-world.html#index-polygon_002c-outside-of-18">polygon, outside of</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="Polygons.html#index-polygon_002c-planar-271">polygon, planar</a>: <a href="Polygons.html#Polygons">Polygons</a></li>
-<li><a href="Sweep-face-splitting.html#index-polygon_002c-planar-323">polygon, planar</a>: <a href="Sweep-face-splitting.html#Sweep-face-splitting">Sweep face splitting</a></li>
+<li><a href="Polygons.html#index-polygon_002c-planar-272">polygon, planar</a>: <a href="Polygons.html#Polygons">Polygons</a></li>
+<li><a href="Sweep-face-splitting.html#index-polygon_002c-planar-324">polygon, planar</a>: <a href="Sweep-face-splitting.html#Sweep-face-splitting">Sweep face splitting</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-precedence_002c-operator-229">precedence, operator</a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Hello-world.html#index-program_002c-hello-world-6">program, hello world</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
-<li><a href="Picture-box.html#index-projection_002c-parallel-387">projection, parallel</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
+<li><a href="Picture-box.html#index-projection_002c-parallel-388">projection, parallel</a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
 <li><a href="Hello-world.html#index-projection_002c-parallel-12">projection, parallel</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
 <li><a href="Transform-literals.html#index-projection_002c-parallel-196">projection, parallel</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Overview.html#index-projection_002c-perspective-406">projection, perspective</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-projection_002c-perspective-407">projection, perspective</a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Transform-literals.html#index-projection_002c-perspective-202">projection, perspective</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
 <li><a href="TikZ_002fPGF-user_002ddefined-styles.html#index-pseudo_002doptions-249">pseudo-options</a>: <a href="TikZ_002fPGF-user_002ddefined-styles.html#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li>
-<li><a href="Frame.html#index-_0040code_007bpsframebox_007d-391"><code>psframebox</code></a>: <a href="Frame.html#Frame">Frame</a></li>
-<li><a href="Picture-box.html#index-_0040code_007bpspicture_007d-383"><code>pspicture</code></a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
+<li><a href="Frame.html#index-_0040code_007bpsframebox_007d-392"><code>psframebox</code></a>: <a href="Frame.html#Frame">Frame</a></li>
+<li><a href="Picture-box.html#index-_0040code_007bpspicture_007d-384"><code>pspicture</code></a>: <a href="Picture-box.html#Picture-box">Picture box</a></li>
 <li><a href="About-sketch.html#index-PSTricks-1">PSTricks</a>: <a href="About-sketch.html#About-sketch">About sketch</a></li>
 <li><a href="Special-objects.html#index-quoting_002c-special-50">quoting, special</a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
-<li><a href="Specials.html#index-quoting_002c-special-274">quoting, special</a>: <a href="Specials.html#Specials">Specials</a></li>
-<li><a href="Overview.html#index-reference_002c-drawable-421">reference, drawable</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Specials.html#index-quoting_002c-special-275">quoting, special</a>: <a href="Specials.html#Specials">Specials</a></li>
+<li><a href="Overview.html#index-reference_002c-drawable-422">reference, drawable</a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Object-transforms.html#index-reference_002c-drawable-78">reference, drawable</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Forms-of-references.html#index-reference_002c-drawable-359">reference, drawable</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Overview.html#index-reference_002c-drawable-425">reference, drawable</a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Forms-of-references.html#index-reference_002c-multiple-options-365">reference, multiple options</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Forms-of-references.html#index-reference_002c-options-362">reference, options</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-references.html#index-reference_002c-drawable-360">reference, drawable</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Overview.html#index-reference_002c-drawable-426">reference, drawable</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Forms-of-references.html#index-reference_002c-multiple-options-366">reference, multiple options</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-references.html#index-reference_002c-options-363">reference, options</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Polyline-sweeps-with-closure.html#index-reference_002c-options-149">reference, options</a>: <a href="Polyline-sweeps-with-closure.html#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li>
-<li><a href="Forms-of-references.html#index-reference_002c-point-350">reference, point</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-references.html#index-reference_002c-point-351">reference, point</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Drawing-a-solid.html#index-reference_002c-point-37">reference, point</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Swept-objects.html#index-reference_002c-scalar-99">reference, scalar</a>: <a href="Swept-objects.html#Swept-objects">Swept objects</a></li>
-<li><a href="Forms-of-references.html#index-reference_002c-scalar-348">reference, scalar</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Forms-of-definitions.html#index-reference_002c-tag-345">reference, tag</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="Forms-of-references.html#index-reference_002c-tag-368">reference, tag</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Overview.html#index-reference_002c-transform-412">reference, transform</a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Forms-of-references.html#index-reference_002c-transform-356">reference, transform</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-references.html#index-reference_002c-scalar-349">reference, scalar</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-definitions.html#index-reference_002c-tag-346">reference, tag</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="Forms-of-references.html#index-reference_002c-tag-369">reference, tag</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Overview.html#index-reference_002c-transform-413">reference, transform</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Forms-of-references.html#index-reference_002c-transform-357">reference, transform</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Polyline-sweeps.html#index-reference_002c-vector-119">reference, vector</a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="Forms-of-references.html#index-reference_002c-vector-353">reference, vector</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Repeats.html#index-repeated-object-332">repeated object</a>: <a href="Repeats.html#Repeats">Repeats</a></li>
+<li><a href="Forms-of-references.html#index-reference_002c-vector-354">reference, vector</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Repeats.html#index-repeated-object-333">repeated object</a>: <a href="Repeats.html#Repeats">Repeats</a></li>
 <li><a href="Key-and-reserved-words.html#index-reserved-words-172">reserved words</a>: <a href="Key-and-reserved-words.html#Key-and-reserved-words">Key and reserved words</a></li>
 <li><a href="Object-transforms.html#index-right-hand-rule-83">right hand rule</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
 <li><a href="Introduction-by-example.html#index-right_002dhand-coordinate-system-4">right-hand coordinate system</a>: <a href="Introduction-by-example.html#Introduction-by-example">Introduction by example</a></li>
 <li><a href="Object-transforms.html#index-rotation-81">rotation</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="A-hierarchical-model.html#index-rotation-transform-493">rotation transform</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-rotation-transform-494">rotation transform</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Transform-literals.html#index-rotation-transform-183">rotation transform</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="A-hierarchical-model.html#index-rotation-transform-491">rotation transform</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-rotation-transform-492">rotation transform</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Object-transforms.html#index-rotation_002c-center-of-60">rotation, center of</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
 <li><a href="Nested-sweeps.html#index-rotation_002c-center-of-122">rotation, center of</a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
 <li><a href="Hello-world.html#index-running-_0040code_007bsketch_007d-8">running <code>sketch</code></a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
 <li><a href="Swept-objects.html#index-scalar-definition-98">scalar definition</a>: <a href="Swept-objects.html#Swept-objects">Swept objects</a></li>
 <li><a href="Scalar-literals.html#index-scalar-literal-173">scalar literal</a>: <a href="Scalar-literals.html#Scalar-literals">Scalar literals</a></li>
-<li><a href="Forms-of-references.html#index-scalar-reference-347">scalar reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-references.html#index-scalar-reference-348">scalar reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Transform-literals.html#index-scale-transform-189">scale transform</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Building-a-drawing.html#index-scene-description-language-403">scene description language</a>: <a href="Building-a-drawing.html#Building-a-drawing">Building a drawing</a></li>
+<li><a href="Building-a-drawing.html#index-scene-description-language-404">scene description language</a>: <a href="Building-a-drawing.html#Building-a-drawing">Building a drawing</a></li>
 <li><a href="Language-basics.html#index-scene-description-language-161">scene description language</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
 <li><a href="Object-transforms.html#index-scope_002c-identifier-73">scope, identifier</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Blocks.html#index-scope_002c-identifier-330">scope, identifier</a>: <a href="Blocks.html#Blocks">Blocks</a></li>
-<li><a href="Forms-of-definitions.html#index-simple-definition-338">simple definition</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="Blocks.html#index-scope_002c-identifier-331">scope, identifier</a>: <a href="Blocks.html#Blocks">Blocks</a></li>
+<li><a href="Forms-of-definitions.html#index-simple-definition-339">simple definition</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
 <li><a href="Drawing-a-solid.html#index-solid-28">solid</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
-<li><a href="Specials.html#index-special-argument-substitution-275">special argument substitution</a>: <a href="Specials.html#Specials">Specials</a></li>
+<li><a href="Specials.html#index-special-argument-substitution-276">special argument substitution</a>: <a href="Specials.html#Specials">Specials</a></li>
 <li><a href="Special-objects.html#index-special-argument-substitution-53">special argument substitution</a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
 <li><a href="Special-objects.html#index-special-object-49">special object</a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
-<li><a href="A-technical-drawing.html#index-special-objects-455">special objects</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
-<li><a href="Hidden-surface-removal.html#index-splitting_002c-line-and-surface-500">splitting, line and surface</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
+<li><a href="A-technical-drawing.html#index-special-objects-456">special objects</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Hidden-surface-removal.html#index-splitting_002c-line-and-surface-501">splitting, line and surface</a>: <a href="Hidden-surface-removal.html#Hidden-surface-removal">Hidden surface removal</a></li>
 <li><a href="Hello-world.html#index-splitting_002c-line-and-surface-10">splitting, line and surface</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
 <li><a href="Special-objects.html#index-substitution_002c-special-52">substitution, special</a>: <a href="Special-objects.html#Special-objects">Special objects</a></li>
 <li><a href="Polyline-sweeps.html#index-surface-107">surface</a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="Swept-objects.html#index-sweep-92">sweep</a>: <a href="Swept-objects.html#Swept-objects">Swept objects</a></li>
-<li><a href="Swept-blocks.html#index-swept-bock-317">swept bock</a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
+<li><a href="Swept-blocks.html#index-swept-bock-318">swept bock</a>: <a href="Swept-blocks.html#Swept-blocks">Swept blocks</a></li>
 <li><a href="Polyline-sweeps.html#index-swept-line-106">swept line</a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
-<li><a href="Swept-lines.html#index-swept-line-291">swept line</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
-<li><a href="A-technical-drawing.html#index-swept-line-444">swept line</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
+<li><a href="Swept-lines.html#index-swept-line-292">swept line</a>: <a href="Swept-lines.html#Swept-lines">Swept lines</a></li>
+<li><a href="A-technical-drawing.html#index-swept-line-445">swept line</a>: <a href="A-technical-drawing.html#A-technical-drawing">A technical drawing</a></li>
 <li><a href="Swept-objects.html#index-swept-object-91">swept object</a>: <a href="Swept-objects.html#Swept-objects">Swept objects</a></li>
-<li><a href="Sweeps.html#index-swept-object-279">swept object</a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
-<li><a href="Swept-points.html#index-swept-point-283">swept point</a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
+<li><a href="Sweeps.html#index-swept-object-280">swept object</a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
+<li><a href="Swept-points.html#index-swept-point-284">swept point</a>: <a href="Swept-points.html#Swept-points">Swept points</a></li>
 <li><a href="Swept-objects.html#index-swept-point-96">swept point</a>: <a href="Swept-objects.html#Swept-objects">Swept objects</a></li>
-<li><a href="A-hierarchical-model.html#index-swept-polygon-495">swept polygon</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-swept-polygon-496">swept polygon</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Polygon-sweeps.html#index-swept-polygon-133">swept polygon</a>: <a href="Polygon-sweeps.html#Polygon-sweeps">Polygon sweeps</a></li>
-<li><a href="Definitions.html#index-tag-definition-337">tag definition</a>: <a href="Definitions.html#Definitions">Definitions</a></li>
-<li><a href="Command-line.html#index-tag-definition-513">tag definition</a>: <a href="Command-line.html#Command-line">Command line</a></li>
-<li><a href="Forms-of-definitions.html#index-tag-definition-342">tag definition</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="Forms-of-definitions.html#index-tag-reference-344">tag reference</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
-<li><a href="Forms-of-references.html#index-tag-reference-367">tag reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Command-line.html#index-template_002c-document-512">template, document</a>: <a href="Command-line.html#Command-line">Command line</a></li>
+<li><a href="Definitions.html#index-tag-definition-338">tag definition</a>: <a href="Definitions.html#Definitions">Definitions</a></li>
+<li><a href="Command-line.html#index-tag-definition-514">tag definition</a>: <a href="Command-line.html#Command-line">Command line</a></li>
+<li><a href="Forms-of-definitions.html#index-tag-definition-343">tag definition</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="Forms-of-definitions.html#index-tag-reference-345">tag reference</a>: <a href="Forms-of-definitions.html#Forms-of-definitions">Forms of definitions</a></li>
+<li><a href="Forms-of-references.html#index-tag-reference-368">tag reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Command-line.html#index-template_002c-document-513">template, document</a>: <a href="Command-line.html#Command-line">Command line</a></li>
 <li><a href="Hello-world.html#index-template_002c-document-16">template, document</a>: <a href="Hello-world.html#Hello-world">Hello world</a></li>
 <li><a href="Drawing-a-solid.html#index-tetrahedron-30">tetrahedron</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-tick-operator-_0028_0040code_007b_0027_007d_0029-227">tick operator (<code>'</code>)</a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Affine-arithmetic.html#index-tick-operator-_0028_0040code_007b_0027_007d_0029-157">tick operator (<code>'</code>)</a>: <a href="Affine-arithmetic.html#Affine-arithmetic">Affine arithmetic</a></li>
 <li><a href="About-sketch.html#index-TikZ_002fPGF-2">TikZ/PGF</a>: <a href="About-sketch.html#About-sketch">About sketch</a></li>
 <li><a href="Nested-sweeps.html#index-toroid-123">toroid</a>: <a href="Nested-sweeps.html#Nested-sweeps">Nested sweeps</a></li>
-<li><a href="Repeats.html#index-transform-333">transform</a>: <a href="Repeats.html#Repeats">Repeats</a></li>
-<li><a href="Overview.html#index-transform-405">transform</a>: <a href="Overview.html#Overview">Overview</a></li>
-<li><a href="Sweeps.html#index-transform-280">transform</a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
+<li><a href="Repeats.html#index-transform-334">transform</a>: <a href="Repeats.html#Repeats">Repeats</a></li>
+<li><a href="Overview.html#index-transform-406">transform</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Sweeps.html#index-transform-281">transform</a>: <a href="Sweeps.html#Sweeps">Sweeps</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-transform-224">transform</a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Object-transforms.html#index-transform-58">transform</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Overview.html#index-transform-definition-408">transform definition</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-transform-definition-409">transform definition</a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Transform-literals.html#index-transform-literal-179">transform literal</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Forms-of-references.html#index-transform-reference-355">transform reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
-<li><a href="Overview.html#index-transform-reference-411">transform reference</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Forms-of-references.html#index-transform-reference-356">transform reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Overview.html#index-transform-reference-412">transform reference</a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Transform-literals.html#index-transform_002c-direct-216">transform, direct</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="A-hierarchical-model.html#index-transform_002c-rotation-490">transform, rotation</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-transform_002c-rotation-491">transform, rotation</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Transform-literals.html#index-transform_002c-rotation-184">transform, rotation</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="A-hierarchical-model.html#index-transform_002c-rotation-494">transform, rotation</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-transform_002c-rotation-495">transform, rotation</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Transform-literals.html#index-transform_002c-scale-190">transform, scale</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
 <li><a href="Object-transforms.html#index-transform_002c-translation-86">transform, translation</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
 <li><a href="Transform-literals.html#index-transform_002c-translation-187">transform, translation</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="A-hierarchical-model.html#index-transform_002c-translation-486">transform, translation</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-transform_002c-translation-487">transform, translation</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Transform-literals.html#index-transform_002c-view-209">transform, view</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
 <li><a href="Transform-literals.html#index-translation-transform-186">translation transform</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="A-hierarchical-model.html#index-translation-transform-485">translation transform</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
+<li><a href="A-hierarchical-model.html#index-translation-transform-486">translation transform</a>: <a href="A-hierarchical-model.html#A-hierarchical-model">A hierarchical model</a></li>
 <li><a href="Object-transforms.html#index-translation-transform-85">translation transform</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
-<li><a href="Transparency.html#index-transparency-252">transparency</a>: <a href="Transparency.html#Transparency">Transparency</a></li>
+<li><a href="Transparency.html#index-transparency-253">transparency</a>: <a href="Transparency.html#Transparency">Transparency</a></li>
 <li><a href="Two_002doperand-_0028binary_0029-forms.html#index-two_002doperand-form-218">two-operand form</a>: <a href="Two_002doperand-_0028binary_0029-forms.html#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li>
 <li><a href="Unary-forms.html#index-unary-form-238">unary form</a>: <a href="Unary-forms.html#Unary-forms">Unary forms</a></li>
 <li><a href="Object-transforms.html#index-vector-87">vector</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
 <li><a href="Polyline-sweeps.html#index-vector-definition-118">vector definition</a>: <a href="Polyline-sweeps.html#Polyline-sweeps">Polyline sweeps</a></li>
 <li><a href="Point-and-vector-literals.html#index-vector-literal-177">vector literal</a>: <a href="Point-and-vector-literals.html#Point-and-vector-literals">Point and vector literals</a></li>
-<li><a href="Forms-of-references.html#index-vector-reference-352">vector reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
+<li><a href="Forms-of-references.html#index-vector-reference-353">vector reference</a>: <a href="Forms-of-references.html#Forms-of-references">Forms of references</a></li>
 <li><a href="Transform-literals.html#index-view-transform-205">view transform</a>: <a href="Transform-literals.html#Transform-literals">Transform literals</a></li>
-<li><a href="Overview.html#index-virtual-camera-438">virtual camera</a>: <a href="Overview.html#Overview">Overview</a></li>
+<li><a href="Overview.html#index-virtual-camera-439">virtual camera</a>: <a href="Overview.html#Overview">Overview</a></li>
 <li><a href="Language-basics.html#index-white-space-165">white space</a>: <a href="Language-basics.html#Language-basics">Language basics</a></li>
 <li><a href="Drawing-a-solid.html#index-white-space-41">white space</a>: <a href="Drawing-a-solid.html#Drawing-a-solid">Drawing a solid</a></li>
 <li><a href="Object-transforms.html#index-white-space-77">white space</a>: <a href="Object-transforms.html#Object-transforms">Object transforms</a></li>
@@ -300,8 +300,8 @@
 <!--
 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-This manual is for `sketch', version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+This manual is for `sketch', version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 `PSTricks' or `PGF/TikZ' code suitable for use with the
 TeX document processing system.
@@ -459,8 +459,8 @@ Up: <a rel="up" accesskey="u" href="../index.html#dir">(dir)</a>
 
 <p>Copyright © 2005, 2006, 2007, 2008, 2009, 2010 Eugene K. Ressler.
 
-   <p>This manual is for <code>sketch</code>, version 0.2 (build 187),
-Friday, December 17, 2010, a program that converts descriptions of simple
+   <p>This manual is for <code>sketch</code>, version 0.3 (build 1),
+Saturday, January 29, 2011, a program that converts descriptions of simple
 three-dimensional scenes into static drawings. This version generates
 <code>PSTricks</code> or <code>PGF/TikZ</code> code suitable for use with the
 TeX document processing system.
diff --git a/Doc/version.texi b/Doc/version.texi
index 4ceb54f..493a126 100644
--- a/Doc/version.texi
+++ b/Doc/version.texi
@@ -1,6 +1,6 @@
 @comment Produced by makever.pl.  Don't edit.
 @set VER_MAJOR 0
- at set VER_MINOR 2
- at set VER_BUILD 187
- at set UPDATED Friday, December 17, 2010
+ at set VER_MINOR 3
+ at set VER_BUILD 2
+ at set UPDATED Sunday, February 06, 2011
 @set VERSION @value{VER_MAJOR}. at value{VER_MINOR} (build @value{VER_BUILD})
diff --git a/bsp.c b/bsp.c
index 257c693..f7ad95f 100644
--- a/bsp.c
+++ b/bsp.c
@@ -22,624 +22,566 @@ http://www.gnu.org/copyleft */
 #include "bsp.h"
 #include "geomio.h"
 
-DECLARE_DYNAMIC_ARRAY_FUNCS (BSP_POLYGON_ATTR, BSP_VERTEX_ATTR,
-			     polygon_attr, elt, n_elts, NO_OTHER_INIT)
+DECLARE_DYNAMIC_ARRAY_FUNCS(BSP_POLYGON_ATTR, BSP_VERTEX_ATTR,
+			    polygon_attr, elt, n_elts, NO_OTHER_INIT);
 // ---- polylines --------------------------------------------------------------
 
-static BSP_POLYLINE_NODE *
-new_bsp_polyline_node (void *attr)
+static BSP_POLYLINE_NODE *new_bsp_polyline_node(void *attr)
 {
-  BSP_POLYLINE_NODE *n = safe_malloc (sizeof *n);
-  n->tag = BSP_POLYLINE;
-  n->attr = attr;
-  n->prev = n->next = n->mark = n->in = n->on = n->out = NULL;
-  n->first_p = n->last_p = 0;
-  init_box_3d (n->extent);
-  init_polyline_3d (n->polyline);
-  return n;
+    BSP_POLYLINE_NODE *n = safe_malloc(sizeof *n);
+    n->tag = BSP_POLYLINE;
+    n->attr = attr;
+    n->prev = n->next = n->mark = n->in = n->on = n->out = NULL;
+    n->first_p = n->last_p = 0;
+    init_box_3d(n->extent);
+    init_polyline_3d(n->polyline);
+    return n;
 }
 
-static void
-delete_bsp_polyline_node (BSP_POLYLINE_NODE * node)
+static void delete_bsp_polyline_node(BSP_POLYLINE_NODE * node)
 {
-  clear_polyline_3d (node->polyline);
-  safe_free (node);
+    clear_polyline_3d(node->polyline);
+    safe_free(node);
 }
 
-static void
-set_bsp_polyline_extent (BSP_POLYLINE_NODE * node)
+static void set_bsp_polyline_extent(BSP_POLYLINE_NODE * node)
 {
-  // set extent
-  init_box_3d (node->extent);
-  fold_min_max_polyline_3d (node->extent, node->polyline);
+    // set extent
+    init_box_3d(node->extent);
+    fold_min_max_polyline_3d(node->extent, node->polyline);
 }
 
 static void
-init_bsp_polyline (BSP_POLYLINE_NODE * node, POLYLINE_3D * polyline)
+init_bsp_polyline(BSP_POLYLINE_NODE * node, POLYLINE_3D * polyline)
 {
-  // initial polyline contains first and last points; split ones don't
-  node->first_p = node->last_p = 1;
-  copy_polyline_3d (node->polyline, polyline);
-  set_bsp_polyline_extent (node);
+    // initial polyline contains first and last points; split ones don't
+    node->first_p = node->last_p = 1;
+    copy_polyline_3d(node->polyline, polyline);
+    set_bsp_polyline_extent(node);
 }
 
 static void
-split_polyline_with_plane (BSP_POLYLINE_NODE * node,
-			   PLANE * plane,
-			   BSP_POLYLINE_NODE ** in_nodes,
-			   BSP_POLYLINE_NODE ** on_nodes,
-			   BSP_POLYLINE_NODE ** out_nodes)
+split_polyline_with_plane(BSP_POLYLINE_NODE * node,
+			  PLANE * plane,
+			  BSP_POLYLINE_NODE ** in_nodes,
+			  BSP_POLYLINE_NODE ** on_nodes,
+			  BSP_POLYLINE_NODE ** out_nodes)
 {
-  int i, j, i_side, current_side;
-  BSP_POLYLINE_NODE *current, **list;
-  VECTOR_3D v, dp;
-  POINT_3D isect;
-  FLOAT t;
+    int i, j, i_side, current_side;
+    BSP_POLYLINE_NODE *current, **list;
+    VECTOR_3D v, dp;
+    POINT_3D isect;
+    FLOAT t;
 
-  // initialize all the output lists to empty
-  *in_nodes = *on_nodes = *out_nodes = NULL;
+    // initialize all the output lists to empty
+    *in_nodes = *on_nodes = *out_nodes = NULL;
 
-  // initialize the current polyline that's being "built", copying attributes
-  // of the original
-  current = new_bsp_polyline_node (node->attr);
+    // initialize the current polyline that's being "built", copying attributes
+    // of the original
+    current = new_bsp_polyline_node(node->attr);
 
-  // copy source polygon's first_ attribute
-  current->first_p = node->first_p;
+    // copy source polygon's first_ attribute
+    current->first_p = node->first_p;
 
-  // j is the trail index as we step through vertices with head i
-  j = 0;
+    // j is the trail index as we step through vertices with head i
+    j = 0;
 
-  // copy first vertex of polyline onto current output polyline
-  copy_pt_3d (pushed_polyline_3d_v (current->polyline), node->polyline->v[j]);
+    // copy first vertex of polyline onto current output polyline
+    copy_pt_3d(pushed_polyline_3d_v(current->polyline),
+	       node->polyline->v[j]);
 
-  // find side of cutting plane that first vertex is on.
-  current_side =
-    (S_IN | S_ON | S_OUT) & pt_side_of_plane (plane, node->polyline->v[j]);
+    // find side of cutting plane that first vertex is on.
+    current_side =
+	(S_IN | S_ON | S_OUT) & pt_side_of_plane(plane,
+						 node->polyline->v[j]);
 
-  // loop through all directed segments j->i
-  for (i = 1; i < node->polyline->n_vertices; j = i++)
-    {
-      i_side =
-	(S_IN | S_ON | S_OUT) & pt_side_of_plane (plane,
-						  node->polyline->v[i]);
+    // loop through all directed segments j->i
+    for (i = 1; i < node->polyline->n_vertices; j = i++) {
+	i_side =
+	    (S_IN | S_ON | S_OUT) & pt_side_of_plane(plane,
+						     node->polyline->v[i]);
 
 #define HASH(Current, I) ((Current << 3) | I)
 
-      switch (HASH (current_side, i_side))
-	{
-
-	case HASH (S_OUT, S_IN):
-	case HASH (S_IN, S_OUT):
-
-	  // vertices straddle the plane; compute the intersection
-	  sub_pts_3d (v, node->polyline->v[i], node->polyline->v[j]);	// direction vector
-	  sub_pts_3d (dp, plane->p, node->polyline->v[j]);	// P - L
-	  t = dot_3d (dp, plane->n) / dot_3d (v, plane->n);	// parameter of intersect
-	  add_scaled_vec_to_pt_3d (isect, node->polyline->v[j], v, t);	// intersect
-
-	  // finish current polyline and add to current list
-	  copy_pt_3d (pushed_polyline_3d_v (current->polyline), isect);
-	  set_bsp_polyline_extent (current);
-	  list = current_side == S_IN ? in_nodes : out_nodes;
-	  current->in = (BSP_NODE *) * list;
-	  *list = current;
-
-	  // start a new one by adding the isect and new point
-	  current = new_bsp_polyline_node (node->attr);
-	  copy_pt_3d (pushed_polyline_3d_v (current->polyline), isect);
-	  copy_pt_3d (pushed_polyline_3d_v (current->polyline),
-		      node->polyline->v[i]);
-	  current_side = i_side;
-	  break;
-
-	case HASH (S_OUT, S_ON):
-	case HASH (S_IN, S_ON):
-
-	  // line that was away from the plane joins it;
-	  // finish current polyline and add to current list
-	  copy_pt_3d (pushed_polyline_3d_v (current->polyline),
-		      node->polyline->v[i]);
-	  set_bsp_polyline_extent (current);
-	  list = current_side == S_IN ? in_nodes : out_nodes;
-	  current->in = (BSP_NODE *) * list;
-	  *list = current;
-
-	  // start a new one if there are still vertices left to process
-	  if (i < node->polyline->n_vertices - 1)
-	    {
-	      current = new_bsp_polyline_node (node->attr);
-	      copy_pt_3d (pushed_polyline_3d_v (current->polyline),
-			  node->polyline->v[i]);
-	      current_side = S_ON;
-	    }
-	  else
-	    {
-	      // copy last_p attribute from source
-	      current->last_p = node->last_p;
-	      current = NULL;
-	      current_side = 0;
+	switch (HASH(current_side, i_side)) {
+
+	case HASH(S_OUT, S_IN):
+	case HASH(S_IN, S_OUT):
+
+	    // vertices straddle the plane; compute the intersection
+	    sub_pts_3d(v, node->polyline->v[i], node->polyline->v[j]);	// direction vector
+	    sub_pts_3d(dp, plane->p, node->polyline->v[j]);	// P - L
+	    t = dot_3d(dp, plane->n) / dot_3d(v, plane->n);	// parameter of intersect
+	    add_scaled_vec_to_pt_3d(isect, node->polyline->v[j], v, t);	// intersect
+
+	    // finish current polyline and add to current list
+	    copy_pt_3d(pushed_polyline_3d_v(current->polyline), isect);
+	    set_bsp_polyline_extent(current);
+	    list = current_side == S_IN ? in_nodes : out_nodes;
+	    current->in = (BSP_NODE *) * list;
+	    *list = current;
+
+	    // start a new one by adding the isect and new point
+	    current = new_bsp_polyline_node(node->attr);
+	    copy_pt_3d(pushed_polyline_3d_v(current->polyline), isect);
+	    copy_pt_3d(pushed_polyline_3d_v(current->polyline),
+		       node->polyline->v[i]);
+	    current_side = i_side;
+	    break;
+
+	case HASH(S_OUT, S_ON):
+	case HASH(S_IN, S_ON):
+
+	    // line that was away from the plane joins it;
+	    // finish current polyline and add to current list
+	    copy_pt_3d(pushed_polyline_3d_v(current->polyline),
+		       node->polyline->v[i]);
+	    set_bsp_polyline_extent(current);
+	    list = current_side == S_IN ? in_nodes : out_nodes;
+	    current->in = (BSP_NODE *) * list;
+	    *list = current;
+
+	    // start a new one if there are still vertices left to process
+	    if (i < node->polyline->n_vertices - 1) {
+		current = new_bsp_polyline_node(node->attr);
+		copy_pt_3d(pushed_polyline_3d_v(current->polyline),
+			   node->polyline->v[i]);
+		current_side = S_ON;
+	    } else {
+		// copy last_p attribute from source
+		current->last_p = node->last_p;
+		current = NULL;
+		current_side = 0;
 	    }
-	  break;
-
-	case HASH (S_ON, S_OUT):
-	case HASH (S_ON, S_IN):
-
-	  // line that was on the plane springs away from it;
-	  // if there is more than one point in the current polyline,
-	  // complete it and start a new one
-	  if (current->polyline->n_vertices > 1)
-	    {
-	      FLOAT *last_vertex = current->polyline->v[current->polyline->n_vertices - 1];	//remember last vertex
-	      set_bsp_polyline_extent (current);
-	      current->in = (BSP_NODE *) * on_nodes;
-	      *on_nodes = current;
-	      current = new_bsp_polyline_node (node->attr);
-	      copy_pt_3d (pushed_polyline_3d_v (current->polyline),
-			  last_vertex);
+	    break;
+
+	case HASH(S_ON, S_OUT):
+	case HASH(S_ON, S_IN):
+
+	    // line that was on the plane springs away from it;
+	    // if there is more than one point in the current polyline,
+	    // complete it and start a new one
+	    if (current->polyline->n_vertices > 1) {
+		FLOAT *last_vertex = current->polyline->v[current->polyline->n_vertices - 1];	//remember last vertex
+		set_bsp_polyline_extent(current);
+		current->in = (BSP_NODE *) * on_nodes;
+		*on_nodes = current;
+		current = new_bsp_polyline_node(node->attr);
+		copy_pt_3d(pushed_polyline_3d_v(current->polyline),
+			   last_vertex);
 	    }
-	  // add the new vertex to the current polyline
-	  copy_pt_3d (pushed_polyline_3d_v (current->polyline),
-		      node->polyline->v[i]);
-	  current_side = i_side;	// now either in or out
-	  break;
+	    // add the new vertex to the current polyline
+	    copy_pt_3d(pushed_polyline_3d_v(current->polyline),
+		       node->polyline->v[i]);
+	    current_side = i_side;	// now either in or out
+	    break;
 
 	default:
 
-	  // nothing has changed, so just add the new point
-	  // to the ccurrent polygon
-	  copy_pt_3d (pushed_polyline_3d_v (current->polyline),
-		      node->polyline->v[i]);
-	  break;
+	    // nothing has changed, so just add the new point
+	    // to the ccurrent polygon
+	    copy_pt_3d(pushed_polyline_3d_v(current->polyline),
+		       node->polyline->v[i]);
+	    break;
 	}
     }
-  // finish the final polyline
-  if (current)
-    {
-      // copy last_p attribute from source
-      current->last_p = node->last_p;
-
-      set_bsp_polyline_extent (current);
-      list = (current_side & S_IN) ? in_nodes :
-	(current_side & S_OUT) ? out_nodes : on_nodes;
-      current->in = (BSP_NODE *) * list;
-      *list = current;
+    // finish the final polyline
+    if (current) {
+	// copy last_p attribute from source
+	current->last_p = node->last_p;
+
+	set_bsp_polyline_extent(current);
+	list = (current_side & S_IN) ? in_nodes :
+	    (current_side & S_OUT) ? out_nodes : on_nodes;
+	current->in = (BSP_NODE *) * list;
+	*list = current;
     }
 }
 
-static void
-insert_polyline (BSP_TREE * bsp, BSP_POLYLINE_NODE * node)
+static void insert_polyline(BSP_TREE * bsp, BSP_POLYLINE_NODE * node)
 {
-  if (*bsp == NULL)
-    {
-      *bsp = (BSP_NODE *) node;
-    }
-  else if ((*bsp)->tag == BSP_POLYLINE)
-    {
-      BSP_POLYLINE_NODE *bsp_node = (BSP_POLYLINE_NODE *) * bsp;
+    if (*bsp == NULL) {
+	*bsp = (BSP_NODE *) node;
+    } else if ((*bsp)->tag == BSP_POLYLINE) {
+	BSP_POLYLINE_NODE *bsp_node = (BSP_POLYLINE_NODE *) * bsp;
 #ifdef EXPERIMENTAL_OPTIMIZATION
-      node->in = bsp_node;
-      *bsp = (BSP_NODE *) node;
+	node->in = bsp_node;
+	*bsp = (BSP_NODE *) node;
 #else
-      insert_polyline ((BSP_TREE *) & bsp_node->in, node);
+	insert_polyline((BSP_TREE *) & bsp_node->in, node);
 #endif
-    }
-  else
-    {				// BSP_POLYGON
-      BSP_POLYGON_NODE *bsp_node = (BSP_POLYGON_NODE *) * bsp;
-      int side = polyline_side_of_plane (node->polyline, bsp_node->plane);
-      if (side == S_IN)
-	insert_polyline (&bsp_node->in, node);
-      else if (side == S_ON)
-	insert_polyline (&bsp_node->on, node);
-      else if (side == S_OUT)
-	insert_polyline (&bsp_node->out, node);
-      else
-	{			// S_SPLIT
-	  BSP_POLYLINE_NODE *in_polylines, *on_polylines, *out_polylines,
-	    *p, *p_next;
-	  split_polyline_with_plane (node, bsp_node->plane, &in_polylines,
-				     &on_polylines, &out_polylines);
-	  // remove polylines from lists and add to respective bsp subtrees recursively
-	  for (p = in_polylines; p; p = p_next)
-	    {
-	      p_next = (BSP_POLYLINE_NODE *) p->in;
-	      p->in = NULL;
-	      insert_polyline (&bsp_node->in, p);
+    } else {			// BSP_POLYGON
+	BSP_POLYGON_NODE *bsp_node = (BSP_POLYGON_NODE *) * bsp;
+	int side = polyline_side_of_plane(node->polyline, bsp_node->plane);
+	if (side == S_IN)
+	    insert_polyline(&bsp_node->in, node);
+	else if (side == S_ON)
+	    insert_polyline(&bsp_node->on, node);
+	else if (side == S_OUT)
+	    insert_polyline(&bsp_node->out, node);
+	else {			// S_SPLIT
+	    BSP_POLYLINE_NODE *in_polylines, *on_polylines, *out_polylines,
+		*p, *p_next;
+	    split_polyline_with_plane(node, bsp_node->plane, &in_polylines,
+				      &on_polylines, &out_polylines);
+	    // remove polylines from lists and add to respective bsp subtrees recursively
+	    for (p = in_polylines; p; p = p_next) {
+		p_next = (BSP_POLYLINE_NODE *) p->in;
+		p->in = NULL;
+		insert_polyline(&bsp_node->in, p);
 	    }
-	  for (p = on_polylines; p; p = p_next)
-	    {
-	      p_next = (BSP_POLYLINE_NODE *) p->in;
-	      p->in = NULL;
-	      insert_polyline (&bsp_node->on, p);
+	    for (p = on_polylines; p; p = p_next) {
+		p_next = (BSP_POLYLINE_NODE *) p->in;
+		p->in = NULL;
+		insert_polyline(&bsp_node->on, p);
 	    }
-	  for (p = out_polylines; p; p = p_next)
-	    {
-	      p_next = (BSP_POLYLINE_NODE *) p->in;
-	      p->in = NULL;
-	      insert_polyline (&bsp_node->out, p);
+	    for (p = out_polylines; p; p = p_next) {
+		p_next = (BSP_POLYLINE_NODE *) p->in;
+		p->in = NULL;
+		insert_polyline(&bsp_node->out, p);
 	    }
-	  delete_bsp_polyline_node (node);
+	    delete_bsp_polyline_node(node);
 	}
     }
 }
 
 void
-add_polyline_to_bsp (BSP_TREE * bsp, POLYLINE_3D * polyline, void *attr)
+add_polyline_to_bsp(BSP_TREE * bsp, POLYLINE_3D * polyline, void *attr)
 {
-  BSP_POLYLINE_NODE *node = new_bsp_polyline_node (attr);
-  init_bsp_polyline (node, polyline);
-  insert_polyline (bsp, node);
+    BSP_POLYLINE_NODE *node = new_bsp_polyline_node(attr);
+    init_bsp_polyline(node, polyline);
+    insert_polyline(bsp, node);
 }
 
 // ---- polygons ---------------------------------------------------------------
 
-static BSP_POLYGON_NODE *
-new_bsp_polygon_node (void *attr)
+static BSP_POLYGON_NODE *new_bsp_polygon_node(void *attr)
 {
-  BSP_POLYGON_NODE *n = safe_malloc (sizeof *n);
-  n->tag = BSP_POLYGON;
-  n->attr = attr;
-  n->prev = n->next = n->mark = n->in = n->on = n->out = NULL;
-  init_box_3d (n->extent);
-  init_polygon_3d (n->polygon);
-  init_polygon_attr (n->polygon_attr);
-  return n;
+    BSP_POLYGON_NODE *n = safe_malloc(sizeof *n);
+    n->tag = BSP_POLYGON;
+    n->attr = attr;
+    n->prev = n->next = n->mark = n->in = n->on = n->out = NULL;
+    init_box_3d(n->extent);
+    init_polygon_3d(n->polygon);
+    init_polygon_attr(n->polygon_attr);
+    return n;
 }
 
-static void
-set_bsp_polygon_extent (BSP_POLYGON_NODE * node)
+static void set_bsp_polygon_extent(BSP_POLYGON_NODE * node)
 {
-  // set extent
-  init_box_3d (node->extent);
-  fold_min_max_polygon_3d (node->extent, node->polygon);
+    // set extent
+    init_box_3d(node->extent);
+    fold_min_max_polygon_3d(node->extent, node->polygon);
 }
 
 static void
-init_bsp_polygon_node (BSP_POLYGON_NODE * node, POLYGON_3D * polygon)
+init_bsp_polygon_node(BSP_POLYGON_NODE * node, POLYGON_3D * polygon)
 {
-  int i;
+    int i;
 
-  // fill in the polygon verticies
-  copy_polygon_3d (node->polygon, polygon);
+    // fill in the polygon verticies
+    copy_polygon_3d(node->polygon, polygon);
 
-  // fill in the plane
-  find_polygon_plane (node->plane, polygon);
+    // fill in the plane
+    find_polygon_plane(node->plane, polygon);
 
-  // mark all edges as border edges
-  setup_polygon_attr (node->polygon_attr, polygon->n_sides);
-  for (i = 0; i < polygon->n_sides; i++)
-    node->polygon_attr->elt[i].border_p = 1;
-  node->polygon_attr->n_elts = polygon->n_sides;
+    // mark all edges as border edges
+    setup_polygon_attr(node->polygon_attr, polygon->n_sides);
+    for (i = 0; i < polygon->n_sides; i++)
+	node->polygon_attr->elt[i].border_p = 1;
+    node->polygon_attr->n_elts = polygon->n_sides;
 
-  // fill in the extent
-  set_bsp_polygon_extent (node);
+    // fill in the extent
+    set_bsp_polygon_extent(node);
 }
 
-static void
-delete_bsp_polygon_node (BSP_POLYGON_NODE * node)
+static void delete_bsp_polygon_node(BSP_POLYGON_NODE * node)
 {
-  clear_polygon_3d (node->polygon);
-  clear_polygon_attr (node->polygon_attr);
-  safe_free (node);
+    clear_polygon_3d(node->polygon);
+    clear_polygon_attr(node->polygon_attr);
+    safe_free(node);
 }
 
 // decide whether a j->i edge of the the new polygon that has 
 // been split from parent is part of the border.
 static int
-is_new_border_p (BSP_VERTEX_ATTR * i_attr,
-		 BSP_VERTEX_ATTR * j_attr,
-		 BSP_POLYGON_ATTR * parent_attr, int parent_n_sides)
+is_new_border_p(BSP_VERTEX_ATTR * i_attr,
+		BSP_VERTEX_ATTR * j_attr,
+		BSP_POLYGON_ATTR * parent_attr, int parent_n_sides)
 {
-  int parent_is_border_p;
-
-  if (parent_attr->n_elts != parent_n_sides)
-    die (no_line, "failed assumption on attribute size");
-  parent_is_border_p = parent_attr->elt[j_attr->parent_vtx].border_p;
-  if (!parent_is_border_p)
-    return 0;
-
-  if (i_attr->cut_p)
-    {
-      if (j_attr->cut_p)
-	{
-	  return 0;
-	}
-      else
-	{
-	  return i_attr->parent_vtx == j_attr->parent_vtx;
+    int parent_is_border_p;
+
+    if (parent_attr->n_elts != parent_n_sides)
+	die(no_line, "failed assumption on attribute size");
+    parent_is_border_p = parent_attr->elt[j_attr->parent_vtx].border_p;
+    if (!parent_is_border_p)
+	return 0;
+
+    if (i_attr->cut_p) {
+	if (j_attr->cut_p) {
+	    return 0;
+	} else {
+	    return i_attr->parent_vtx == j_attr->parent_vtx;
 	}
     }
-  return (i_attr->parent_vtx - j_attr->parent_vtx +
-	  parent_n_sides) % parent_n_sides == 1;
+    return (i_attr->parent_vtx - j_attr->parent_vtx +
+	    parent_n_sides) % parent_n_sides == 1;
 }
 
 static void
-decide_boundaries (BSP_POLYGON_NODE * new_node, BSP_POLYGON_NODE * node)
+decide_boundaries(BSP_POLYGON_NODE * new_node, BSP_POLYGON_NODE * node)
 {
-  int i, j, last_border_p;
-
-  i = 0;
-  j = new_node->polygon->n_sides - 1;
-  last_border_p =
-    is_new_border_p (&new_node->polygon_attr->elt[i],
-		     &new_node->polygon_attr->elt[j],
-		     node->polygon_attr, node->polygon->n_sides);
-  for (j = i++; i < new_node->polygon->n_sides; j = i++)
-    {
-      new_node->polygon_attr->elt[j].border_p =
-	is_new_border_p (&new_node->polygon_attr->elt[i],
-			 &new_node->polygon_attr->elt[j],
-			 node->polygon_attr, node->polygon->n_sides);
+    int i, j, last_border_p;
+
+    i = 0;
+    j = new_node->polygon->n_sides - 1;
+    last_border_p =
+	is_new_border_p(&new_node->polygon_attr->elt[i],
+			&new_node->polygon_attr->elt[j],
+			node->polygon_attr, node->polygon->n_sides);
+    for (j = i++; i < new_node->polygon->n_sides; j = i++) {
+	new_node->polygon_attr->elt[j].border_p =
+	    is_new_border_p(&new_node->polygon_attr->elt[i],
+			    &new_node->polygon_attr->elt[j],
+			    node->polygon_attr, node->polygon->n_sides);
     }
-  new_node->polygon_attr->elt[j].border_p = last_border_p;
+    new_node->polygon_attr->elt[j].border_p = last_border_p;
 }
 
 static void
-push_polygon_attr (BSP_POLYGON_NODE * node, int parent_vtx, int cut_p)
+push_polygon_attr(BSP_POLYGON_NODE * node, int parent_vtx, int cut_p)
 {
-  BSP_VERTEX_ATTR *vertex_attr = pushed_polygon_attr_elt (node->polygon_attr);
-  vertex_attr->border_p = 0;
-  vertex_attr->parent_vtx = parent_vtx;
-  vertex_attr->cut_p = cut_p;
+    BSP_VERTEX_ATTR *vertex_attr =
+	pushed_polygon_attr_elt(node->polygon_attr);
+    vertex_attr->border_p = 0;
+    vertex_attr->parent_vtx = parent_vtx;
+    vertex_attr->cut_p = cut_p;
 }
 
 static void
-split_polygon_with_plane (BSP_POLYGON_NODE * node,
-			  PLANE * plane,
-			  BSP_POLYGON_NODE * in_node,
-			  BSP_POLYGON_NODE * out_node)
+split_polygon_with_plane(BSP_POLYGON_NODE * node,
+			 PLANE * plane,
+			 BSP_POLYGON_NODE * in_node,
+			 BSP_POLYGON_NODE * out_node)
 {
-  int i, j, i_side, j_side;
-  VECTOR_3D v, dp;
-  POINT_3D isect;
-  FLOAT t;
-
-  // reset fill pointers
-  in_node->polygon->n_sides = out_node->polygon->n_sides = 0;
-  in_node->polygon_attr->n_elts = out_node->polygon_attr->n_elts = 0;
-
-  // process all pairs of vertices
-  j = node->polygon->n_sides - 1;
-  i_side = pt_side_of_plane (plane, node->polygon->v[j]);
-  for (i = 0; i < node->polygon->n_sides; j = i++)
-    {
-      j_side = i_side;
-      i_side = pt_side_of_plane (plane, node->polygon->v[i]);
-
-      if ((i_side | j_side) == (S_IN | S_OUT))
-	{
-
-	  // the two most recent points straddle the the plane
-	  // compute the intersection
-	  sub_pts_3d (v, node->polygon->v[i], node->polygon->v[j]);	// direction vector
-	  sub_pts_3d (dp, plane->p, node->polygon->v[j]);	// P - L
-	  t = dot_3d (dp, plane->n) / dot_3d (v, plane->n);	// parameter of intersect
-	  add_scaled_vec_to_pt_3d (isect, node->polygon->v[j], v, t);	// intersect
-
-	  // put intersect in both polygons
-	  copy_pt_3d (pushed_polygon_3d_v (in_node->polygon), isect);
-	  copy_pt_3d (pushed_polygon_3d_v (out_node->polygon), isect);
-
-	  if (i_side == S_IN)
-	    {
-	      // edge traversed from outside to in
-	      push_polygon_attr (out_node, j, 1);
-	      push_polygon_attr (in_node, j, 1);
-	      copy_pt_3d (pushed_polygon_3d_v (in_node->polygon),
-			  node->polygon->v[i]);
-	      push_polygon_attr (in_node, i, 0);
+    int i, j, i_side, j_side;
+    VECTOR_3D v, dp;
+    POINT_3D isect;
+    FLOAT t;
+
+    // reset fill pointers
+    in_node->polygon->n_sides = out_node->polygon->n_sides = 0;
+    in_node->polygon_attr->n_elts = out_node->polygon_attr->n_elts = 0;
+
+    // process all pairs of vertices
+    j = node->polygon->n_sides - 1;
+    i_side = pt_side_of_plane(plane, node->polygon->v[j]);
+    for (i = 0; i < node->polygon->n_sides; j = i++) {
+	j_side = i_side;
+	i_side = pt_side_of_plane(plane, node->polygon->v[i]);
+
+	if ((i_side | j_side) == (S_IN | S_OUT)) {
+
+	    // the two most recent points straddle the the plane
+	    // compute the intersection
+	    sub_pts_3d(v, node->polygon->v[i], node->polygon->v[j]);	// direction vector
+	    sub_pts_3d(dp, plane->p, node->polygon->v[j]);	// P - L
+	    t = dot_3d(dp, plane->n) / dot_3d(v, plane->n);	// parameter of intersect
+	    add_scaled_vec_to_pt_3d(isect, node->polygon->v[j], v, t);	// intersect
+
+	    // put intersect in both polygons
+	    copy_pt_3d(pushed_polygon_3d_v(in_node->polygon), isect);
+	    copy_pt_3d(pushed_polygon_3d_v(out_node->polygon), isect);
+
+	    if (i_side == S_IN) {
+		// edge traversed from outside to in
+		push_polygon_attr(out_node, j, 1);
+		push_polygon_attr(in_node, j, 1);
+		copy_pt_3d(pushed_polygon_3d_v(in_node->polygon),
+			   node->polygon->v[i]);
+		push_polygon_attr(in_node, i, 0);
+	    } else {
+		// edge traversed from inside to out
+		push_polygon_attr(out_node, j, 1);
+		push_polygon_attr(in_node, j, 1);
+		copy_pt_3d(pushed_polygon_3d_v(out_node->polygon),
+			   node->polygon->v[i]);
+		push_polygon_attr(out_node, i, 0);;
 	    }
-	  else
-	    {
-	      // edge traversed from inside to out
-	      push_polygon_attr (out_node, j, 1);
-	      push_polygon_attr (in_node, j, 1);
-	      copy_pt_3d (pushed_polygon_3d_v (out_node->polygon),
-			  node->polygon->v[i]);
-	      push_polygon_attr (out_node, i, 0);;
-	    }
-	}
-      else if (i_side & S_ON)
-	{
-
-	  // the current vertex is on the plane
-	  // put it in both polygons
-	  copy_pt_3d (pushed_polygon_3d_v (in_node->polygon),
-		      node->polygon->v[i]);
-	  copy_pt_3d (pushed_polygon_3d_v (out_node->polygon),
-		      node->polygon->v[i]);
-	  push_polygon_attr (in_node, i, 0);
-	  push_polygon_attr (out_node, i, 0);
-	}
-      else
-	{
-
-	  // the new vertex is not straddling nor on the plane
-	  // so we output it to the correct polygon
-	  if (i_side == S_IN)
-	    {
-	      copy_pt_3d (pushed_polygon_3d_v (in_node->polygon),
-			  node->polygon->v[i]);
-	      push_polygon_attr (in_node, i, 0);
-	    }
-	  else
-	    {
-	      copy_pt_3d (pushed_polygon_3d_v (out_node->polygon),
-			  node->polygon->v[i]);
-	      push_polygon_attr (out_node, i, 0);
+	} else if (i_side & S_ON) {
+
+	    // the current vertex is on the plane
+	    // put it in both polygons
+	    copy_pt_3d(pushed_polygon_3d_v(in_node->polygon),
+		       node->polygon->v[i]);
+	    copy_pt_3d(pushed_polygon_3d_v(out_node->polygon),
+		       node->polygon->v[i]);
+	    push_polygon_attr(in_node, i, 0);
+	    push_polygon_attr(out_node, i, 0);
+	} else {
+
+	    // the new vertex is not straddling nor on the plane
+	    // so we output it to the correct polygon
+	    if (i_side == S_IN) {
+		copy_pt_3d(pushed_polygon_3d_v(in_node->polygon),
+			   node->polygon->v[i]);
+		push_polygon_attr(in_node, i, 0);
+	    } else {
+		copy_pt_3d(pushed_polygon_3d_v(out_node->polygon),
+			   node->polygon->v[i]);
+		push_polygon_attr(out_node, i, 0);
 	    }
 	}
     }
-  // fill in the planes
-  find_polygon_plane (in_node->plane, in_node->polygon);
-  find_polygon_plane (out_node->plane, out_node->polygon);
+    // fill in the planes
+    find_polygon_plane(in_node->plane, in_node->polygon);
+    find_polygon_plane(out_node->plane, out_node->polygon);
 
-  // set up extents
-  set_bsp_polygon_extent (in_node);
-  set_bsp_polygon_extent (out_node);
+    // set up extents
+    set_bsp_polygon_extent(in_node);
+    set_bsp_polygon_extent(out_node);
 
-  // make a pass around the in and out polygons to fill in boundardy_p
-  decide_boundaries (in_node, node);
-  decide_boundaries (out_node, node);
+    // make a pass around the in and out polygons to fill in boundardy_p
+    decide_boundaries(in_node, node);
+    decide_boundaries(out_node, node);
 }
 
-static void
-insert_polygon (BSP_TREE * bsp, BSP_POLYGON_NODE * node)
+static void insert_polygon(BSP_TREE * bsp, BSP_POLYGON_NODE * node)
 {
-  if (*bsp == NULL)
-    *bsp = (BSP_NODE *) node;
-  else
-    {
-      BSP_POLYGON_NODE *bsp_node = (BSP_POLYGON_NODE *) * bsp;
-      int side = polygon_side_of_plane (node->polygon, bsp_node->plane);
-      if (side & (S_IN | S_ON))
-	insert_polygon (&bsp_node->in, node);
-      else if (side == S_OUT)
-	insert_polygon (&bsp_node->out, node);
-      else
-	{
-	  BSP_POLYGON_NODE *in_node = new_bsp_polygon_node (node->attr);
-	  BSP_POLYGON_NODE *out_node = new_bsp_polygon_node (node->attr);
-	  split_polygon_with_plane (node, bsp_node->plane, in_node, out_node);
-	  insert_polygon (&bsp_node->in, in_node);
-	  insert_polygon (&bsp_node->out, out_node);
-	  delete_bsp_polygon_node (node);
+    if (*bsp == NULL)
+	*bsp = (BSP_NODE *) node;
+    else {
+	BSP_POLYGON_NODE *bsp_node = (BSP_POLYGON_NODE *) * bsp;
+	int side = polygon_side_of_plane(node->polygon, bsp_node->plane);
+	if (side & (S_IN | S_ON))
+	    insert_polygon(&bsp_node->in, node);
+	else if (side == S_OUT)
+	    insert_polygon(&bsp_node->out, node);
+	else {
+	    BSP_POLYGON_NODE *in_node = new_bsp_polygon_node(node->attr);
+	    BSP_POLYGON_NODE *out_node = new_bsp_polygon_node(node->attr);
+	    split_polygon_with_plane(node, bsp_node->plane, in_node,
+				     out_node);
+	    insert_polygon(&bsp_node->in, in_node);
+	    insert_polygon(&bsp_node->out, out_node);
+	    delete_bsp_polygon_node(node);
 	}
     }
 }
 
-void
-add_polygon_to_bsp (BSP_TREE * bsp, POLYGON_3D * polygon, void *attr)
+void add_polygon_to_bsp(BSP_TREE * bsp, POLYGON_3D * polygon, void *attr)
 {
-  BSP_POLYGON_NODE *node = new_bsp_polygon_node (attr);
-  init_bsp_polygon_node (node, polygon);
-  insert_polygon (bsp, node);
+    BSP_POLYGON_NODE *node = new_bsp_polygon_node(attr);
+    init_bsp_polygon_node(node, polygon);
+    insert_polygon(bsp, node);
 }
 
-static struct
-{
-  BSP_NODE_FUNC func;
-  void *env;
-}
-traverse_closure[1];
+static struct {
+    BSP_NODE_FUNC func;
+    void *env;
+} traverse_closure[1];
 
-static void
-walk_bsp (BSP_NODE * bsp)
+static void walk_bsp(BSP_NODE * bsp)
 {
-  if (bsp == NULL)
-    return;
-  if (bsp->tag == BSP_POLYGON)
-    {
-      BSP_POLYGON_NODE *node = (BSP_POLYGON_NODE *) bsp;
-      if (node->plane->n[Z] < 0)
-	{
-	  walk_bsp (node->out);
-	  traverse_closure->func (bsp, traverse_closure->env);
-	  walk_bsp (node->on);
-	  walk_bsp (node->in);
+    if (bsp == NULL)
+	return;
+    if (bsp->tag == BSP_POLYGON) {
+	BSP_POLYGON_NODE *node = (BSP_POLYGON_NODE *) bsp;
+	if (node->plane->n[Z] < 0) {
+	    walk_bsp(node->out);
+	    traverse_closure->func(bsp, traverse_closure->env);
+	    walk_bsp(node->on);
+	    walk_bsp(node->in);
+	} else {
+	    walk_bsp(node->in);
+	    traverse_closure->func(bsp, traverse_closure->env);
+	    walk_bsp(node->on);
+	    walk_bsp(node->out);
 	}
-      else
-	{
-	  walk_bsp (node->in);
-	  traverse_closure->func (bsp, traverse_closure->env);
-	  walk_bsp (node->on);
-	  walk_bsp (node->out);
-	}
-    }
-  else
-    {				// BSP_POLYLINE
-      BSP_POLYLINE_NODE *node = (BSP_POLYLINE_NODE *) bsp;
-      traverse_closure->func (bsp, traverse_closure->env);
-      walk_bsp ((BSP_NODE *) node->in);
+    } else {			// BSP_POLYLINE
+	BSP_POLYLINE_NODE *node = (BSP_POLYLINE_NODE *) bsp;
+	traverse_closure->func(bsp, traverse_closure->env);
+	walk_bsp((BSP_NODE *) node->in);
     }
 }
 
-void
-traverse_bsp (BSP_NODE * bsp, BSP_NODE_FUNC func, void *env)
+void traverse_bsp(BSP_NODE * bsp, BSP_NODE_FUNC func, void *env)
 {
-  traverse_closure->func = func;
-  traverse_closure->env = env;
-  walk_bsp (bsp);
+    traverse_closure->func = func;
+    traverse_closure->env = env;
+    walk_bsp(bsp);
 }
 
-void
-traverse_depth_sort (BSP_NODE * bsp, BSP_NODE_FUNC func, void *env)
+void traverse_depth_sort(BSP_NODE * bsp, BSP_NODE_FUNC func, void *env)
 {
-  traverse_closure->func = func;
-  traverse_closure->env = env;
-  for (; bsp; bsp = bsp->next)
-    walk_bsp (bsp);
+    traverse_closure->func = func;
+    traverse_closure->env = env;
+    for (; bsp; bsp = bsp->next)
+	walk_bsp(bsp);
 }
 
-static void
-indent (FILE * f, int n)
+static void indent(FILE * f, int n)
 {
-  while (n-- > 0)
-    fprintf (f, " ");
+    while (n-- > 0)
+	fprintf(f, " ");
 }
 
-static void
-print_bsp_internal (FILE * f, BSP_NODE * bsp, int n)
+static void print_bsp_internal(FILE * f, BSP_NODE * bsp, int n)
 {
-  if (bsp == NULL)
-    return;
+    if (bsp == NULL)
+	return;
 
-  indent (f, 2 * n);
-  if (bsp->tag == BSP_POLYGON)
-    {
+    indent(f, 2 * n);
+    if (bsp->tag == BSP_POLYGON) {
 
-      BSP_POLYGON_NODE *node = (BSP_POLYGON_NODE *) bsp;
-      fprintf (f, "BSPpolygon\n");
+	BSP_POLYGON_NODE *node = (BSP_POLYGON_NODE *) bsp;
+	fprintf(f, "BSPpolygon\n");
 
-      indent (f, 2 * n + 1);
-      print_plane (f, node->plane);
+	indent(f, 2 * n + 1);
+	print_plane(f, node->plane);
 
-      indent (f, 2 * n + 1);
-      print_polygon_3d (f, node->polygon);
+	indent(f, 2 * n + 1);
+	print_polygon_3d(f, node->polygon);
 
-      indent (f, 2 * n + 1);
-      fprintf (f, "in\n");
-      print_bsp_internal (f, node->in, n + 1);
+	indent(f, 2 * n + 1);
+	fprintf(f, "in\n");
+	print_bsp_internal(f, node->in, n + 1);
 
-      indent (f, 2 * n + 1);
-      fprintf (f, "on\n");
-      print_bsp_internal (f, node->on, n + 1);
+	indent(f, 2 * n + 1);
+	fprintf(f, "on\n");
+	print_bsp_internal(f, node->on, n + 1);
 
-      indent (f, 2 * n + 1);
-      fprintf (f, "out\n");
-      print_bsp_internal (f, node->out, n + 1);
-    }
-  else
-    {				// BSP_POLYLINE
-      BSP_POLYLINE_NODE *node = (BSP_POLYLINE_NODE *) bsp;
-      fprintf (f, "BSPpolyline ");
-      print_polyline_3d (f, node->polyline);
-      print_bsp_internal (f, (BSP_NODE *) node->in, n);
+	indent(f, 2 * n + 1);
+	fprintf(f, "out\n");
+	print_bsp_internal(f, node->out, n + 1);
+    } else {			// BSP_POLYLINE
+	BSP_POLYLINE_NODE *node = (BSP_POLYLINE_NODE *) bsp;
+	fprintf(f, "BSPpolyline ");
+	print_polyline_3d(f, node->polyline);
+	print_bsp_internal(f, (BSP_NODE *) node->in, n);
     }
 }
 
-void
-print_bsp (FILE * f, BSP_NODE * bsp)
+void print_bsp(FILE * f, BSP_NODE * bsp)
 {
-  print_bsp_internal (f, bsp, 0);
+    print_bsp_internal(f, bsp, 0);
 }
 
-void
-add_polygon_to_sort (BSP_TREE * bsp, POLYGON_3D * polygon, void *attr)
+void add_polygon_to_sort(BSP_TREE * bsp, POLYGON_3D * polygon, void *attr)
 {
-  BSP_POLYGON_NODE *node = new_bsp_polygon_node (attr);
-  init_bsp_polygon_node (node, polygon);
-  node->next = *bsp;
-  *bsp = (BSP_NODE *) node;
+    BSP_POLYGON_NODE *node = new_bsp_polygon_node(attr);
+    init_bsp_polygon_node(node, polygon);
+    node->next = *bsp;
+    *bsp = (BSP_NODE *) node;
 }
 
 void
-add_polyline_to_sort (BSP_TREE * bsp, POLYLINE_3D * polyline, void *attr)
+add_polyline_to_sort(BSP_TREE * bsp, POLYLINE_3D * polyline, void *attr)
 {
-  BSP_POLYLINE_NODE *node = new_bsp_polyline_node (attr);
-  init_bsp_polyline (node, polyline);
-  node->next = *bsp;
-  *bsp = (BSP_NODE *) node;
+    BSP_POLYLINE_NODE *node = new_bsp_polyline_node(attr);
+    init_bsp_polyline(node, polyline);
+    node->next = *bsp;
+    *bsp = (BSP_NODE *) node;
 }
 
 // quicksort of linked list
@@ -649,591 +591,533 @@ add_polyline_to_sort (BSP_TREE * bsp, POLYLINE_3D * polyline, void *attr)
 // leq provides ascending sort, so reverse to get max depth at head of list
 #define LEQ(A,B) (FAR_DEPTH(A) >= FAR_DEPTH(B))
 
-static void
-qs (BSP_NODE * hd, BSP_NODE * tl, BSP_NODE ** rtn)
+static void qs(BSP_NODE * hd, BSP_NODE * tl, BSP_NODE ** rtn)
 {
-  int nlo, nhi;
-  BSP_NODE *lo, *hi, *q, *p;
-
-  /* Invariant:  Return head sorted with `tl' appended. */
-  while (hd != NULL)
-    {
-
-      nlo = nhi = 0;
-      lo = hi = NULL;
-      q = hd;
-      p = hd->next;
-
-      /* Reverse ascending prefix onto hi.  This gives
-         O(n) behavior on sorted and reverse-sorted inputs. */
-      while (p != NULL && LEQ (p, hd))
-	{
-	  hd->next = hi;
-	  hi = hd;
-	  ++nhi;
-	  hd = p;
-	  p = p->next;
+    int nlo, nhi;
+    BSP_NODE *lo, *hi, *q, *p;
+
+    /* Invariant:  Return head sorted with `tl' appended. */
+    while (hd != NULL) {
+
+	nlo = nhi = 0;
+	lo = hi = NULL;
+	q = hd;
+	p = hd->next;
+
+	/* Reverse ascending prefix onto hi.  This gives
+	   O(n) behavior on sorted and reverse-sorted inputs. */
+	while (p != NULL && LEQ(p, hd)) {
+	    hd->next = hi;
+	    hi = hd;
+	    ++nhi;
+	    hd = p;
+	    p = p->next;
 	}
 
-      /* If entire list was ascending, we're done. */
-      if (p == NULL)
-	{
-	  *rtn = hd;
-	  hd->next = hi;
-	  q->next = tl;
-	  return;
+	/* If entire list was ascending, we're done. */
+	if (p == NULL) {
+	    *rtn = hd;
+	    hd->next = hi;
+	    q->next = tl;
+	    return;
 	}
 
-      /* Partition and count sizes. */
-      while (p != NULL)
-	{
-	  q = p->next;
-	  if (LEQ (p, hd))
-	    {
-	      p->next = lo;
-	      lo = p;
-	      ++nlo;
+	/* Partition and count sizes. */
+	while (p != NULL) {
+	    q = p->next;
+	    if (LEQ(p, hd)) {
+		p->next = lo;
+		lo = p;
+		++nlo;
+	    } else {
+		p->next = hi;
+		hi = p;
+		++nhi;
 	    }
-	  else
-	    {
-	      p->next = hi;
-	      hi = p;
-	      ++nhi;
-	    }
-	  p = q;
+	    p = q;
 	}
 
-      /* Recur to establish invariant for sublists of hd, 
-         choosing shortest list first to limit stack. */
-      if (nlo < nhi)
-	{
-	  qs (lo, hd, rtn);
-	  rtn = &hd->next;
-	  hd = hi;		/* Eliminated tail-recursive call. */
-	}
-      else
-	{
-	  qs (hi, tl, &hd->next);
-	  tl = hd;
-	  hd = lo;		/* Eliminated tail-recursive call. */
+	/* Recur to establish invariant for sublists of hd, 
+	   choosing shortest list first to limit stack. */
+	if (nlo < nhi) {
+	    qs(lo, hd, rtn);
+	    rtn = &hd->next;
+	    hd = hi;		/* Eliminated tail-recursive call. */
+	} else {
+	    qs(hi, tl, &hd->next);
+	    tl = hd;
+	    hd = lo;		/* Eliminated tail-recursive call. */
 	}
     }
-  /* Base case of recurrence. Invariant is easy here. */
-  *rtn = tl;
+    /* Base case of recurrence. Invariant is easy here. */
+    *rtn = tl;
 }
 
-static int
-xy_intersect_p (BOX_3D * a, BOX_3D * b)
+static int xy_intersect_p(BOX_3D * a, BOX_3D * b)
 {
-  if (a->max[X] < b->min[X])	// a left of b
-    return 0;
-  if (a->min[X] > b->max[X])	// a right of b
-    return 0;
-  if (a->max[Y] < b->min[Y])	// a below  b
-    return 0;
-  if (a->min[Y] > b->max[Y])	// a above b
-    return 0;
-  return 1;
+    if (a->max[X] < b->min[X])	// a left of b
+	return 0;
+    if (a->min[X] > b->max[X])	// a right of b
+	return 0;
+    if (a->max[Y] < b->min[Y])	// a below  b
+	return 0;
+    if (a->min[Y] > b->max[Y])	// a above b
+	return 0;
+    return 1;
 }
 
 #define SHORTEST_ALLOWABLE_SIDE 1e-4
 
 static void
-make_polygon_projection (POLYGON_2D * projection,
-			 BSP_POLYGON_NODE * polygon_node)
+make_polygon_projection(POLYGON_2D * projection,
+			BSP_POLYGON_NODE * polygon_node)
 {
-  int i, j;
-
-  clear_polygon_2d (projection);
-  if (polygon_node->plane->n[Z] >= 0)
-    {
-      for (i = 0, j = polygon_node->polygon->n_sides - 1;
-	   i < polygon_node->polygon->n_sides; j = i++)
-	{
-	  if (dist_2d
-	      (polygon_node->polygon->v[i],
-	       polygon_node->polygon->v[j]) > SHORTEST_ALLOWABLE_SIDE)
-	    copy_pt_2d (pushed_polygon_2d_v (projection),
-			polygon_node->polygon->v[i]);
+    int i, j;
+
+    clear_polygon_2d(projection);
+    if (polygon_node->plane->n[Z] >= 0) {
+	for (i = 0, j = polygon_node->polygon->n_sides - 1;
+	     i < polygon_node->polygon->n_sides; j = i++) {
+	    if (dist_2d
+		(polygon_node->polygon->v[i],
+		 polygon_node->polygon->v[j]) > SHORTEST_ALLOWABLE_SIDE)
+		copy_pt_2d(pushed_polygon_2d_v(projection),
+			   polygon_node->polygon->v[i]);
 	}
-    }
-  else
-    {
-      for (i = polygon_node->polygon->n_sides - 1, j = 0; i >= 0; j = i--)
-	{
-	  if (dist_2d
-	      (polygon_node->polygon->v[i],
-	       polygon_node->polygon->v[j]) > SHORTEST_ALLOWABLE_SIDE)
-	    copy_pt_2d (pushed_polygon_2d_v (projection),
-			polygon_node->polygon->v[i]);
+    } else {
+	for (i = polygon_node->polygon->n_sides - 1, j = 0; i >= 0;
+	     j = i--) {
+	    if (dist_2d
+		(polygon_node->polygon->v[i],
+		 polygon_node->polygon->v[j]) > SHORTEST_ALLOWABLE_SIDE)
+		copy_pt_2d(pushed_polygon_2d_v(projection),
+			   polygon_node->polygon->v[i]);
 	}
     }
 }
 
 #define OVERLAP_EPS 1e-3
 
-int
-projections_overlap_p (BSP_POLYGON_NODE * p, BSP_POLYGON_NODE * q)
+int projections_overlap_p(BSP_POLYGON_NODE * p, BSP_POLYGON_NODE * q)
 {
-  int r;
-  POLYGON_2D p_projection[1], q_projection[1], cso[1];
-
-  init_polygon_2d (p_projection);
-  init_polygon_2d (q_projection);
-  init_polygon_2d (cso);
-
-  make_polygon_projection (p_projection, p);
-  make_polygon_projection (q_projection, q);
-  if (p_projection->n_sides < 2 && q_projection->n_sides < 2)
-    {
-      r = 0;
-    }
-  else if (p_projection->n_sides < 2)
-    {
-      r = point_near_convex_polygon_2d_p (p->polygon->v[0], q_projection,
-					  OVERLAP_EPS);
-    }
-  else if (q_projection->n_sides < 2)
-    {
-      r = point_near_convex_polygon_2d_p (q->polygon->v[0], p_projection,
-					  OVERLAP_EPS);
-    }
-  else
-    {
-      make_cso_polygon_2d (cso, p_projection, origin_2d, q_projection);
-      r = point_near_convex_polygon_2d_p (origin_2d, cso, OVERLAP_EPS);
+    int r;
+    POLYGON_2D p_projection[1], q_projection[1], cso[1];
+
+    init_polygon_2d(p_projection);
+    init_polygon_2d(q_projection);
+    init_polygon_2d(cso);
+
+    make_polygon_projection(p_projection, p);
+    make_polygon_projection(q_projection, q);
+    if (p_projection->n_sides < 2 && q_projection->n_sides < 2) {
+	r = 0;
+    } else if (p_projection->n_sides < 2) {
+	r = point_near_convex_polygon_2d_p(p->polygon->v[0], q_projection,
+					   OVERLAP_EPS);
+    } else if (q_projection->n_sides < 2) {
+	r = point_near_convex_polygon_2d_p(q->polygon->v[0], p_projection,
+					   OVERLAP_EPS);
+    } else {
+	make_cso_polygon_2d(cso, p_projection, origin_2d, q_projection);
+	r = point_near_convex_polygon_2d_p(origin_2d, cso, OVERLAP_EPS);
     }
 
-  clear_polygon_2d (p_projection);
-  clear_polygon_2d (q_projection);
-  clear_polygon_2d (cso);
-  return r;
+    clear_polygon_2d(p_projection);
+    clear_polygon_2d(q_projection);
+    clear_polygon_2d(cso);
+    return r;
 }
 
 #define OVERLAP_TOLERANCE 1e-3
 
 int
-polyline_projection_overlaps_polygon (BSP_POLYLINE_NODE * polyline_node,
-				      BSP_POLYGON_NODE * polygon_node)
+polyline_projection_overlaps_polygon(BSP_POLYLINE_NODE * polyline_node,
+				     BSP_POLYGON_NODE * polygon_node)
 {
-  int i, r;
-  POLYGON_2D polygon_projection[1], line_seg_projection[1], cso[1];
-
-  init_polygon_2d (polygon_projection);
-  init_polygon_2d (line_seg_projection);
-  init_polygon_2d (cso);
-
-  make_polygon_projection (polygon_projection, polygon_node);
-  if (polygon_projection->n_sides < 2)
-    {
-      // a point can't obscure a line
-      r = 0;
-    }
-  else if (polyline_node->polyline->n_vertices == 1)
-    {
-      // polyline is single vertex; just check to see if it lies in projection
-      r = point_near_convex_polygon_2d_p (polyline_node->polyline->v[0],
-					  polygon_projection,
-					  OVERLAP_TOLERANCE);
-    }
-  else
-    {
-
-      // use a two-sided polygon to model each edge;
-      setup_polygon_2d (line_seg_projection, 2);
-      line_seg_projection->n_sides = 2;
-      r = 0;
-      for (i = 0; i < polyline_node->polyline->n_vertices - 1; i++)
-	{
-	  copy_pt_2d (line_seg_projection->v[0],
-		      polyline_node->polyline->v[i]);
-	  copy_pt_2d (line_seg_projection->v[1],
-		      polyline_node->polyline->v[i + 1]);
-	  make_cso_polygon_2d (cso, line_seg_projection, origin_2d,
-			       polygon_projection);
-	  r |= point_near_convex_polygon_2d_p (origin_2d, cso,
-					       OVERLAP_TOLERANCE);
-	  if (r)
-	    break;
+    int i, r;
+    POLYGON_2D polygon_projection[1], line_seg_projection[1], cso[1];
+
+    init_polygon_2d(polygon_projection);
+    init_polygon_2d(line_seg_projection);
+    init_polygon_2d(cso);
+
+    make_polygon_projection(polygon_projection, polygon_node);
+    if (polygon_projection->n_sides < 2) {
+	// a point can't obscure a line
+	r = 0;
+    } else if (polyline_node->polyline->n_vertices == 1) {
+	// polyline is single vertex; just check to see if it lies in projection
+	r = point_near_convex_polygon_2d_p(polyline_node->polyline->v[0],
+					   polygon_projection,
+					   OVERLAP_TOLERANCE);
+    } else {
+
+	// use a two-sided polygon to model each edge;
+	setup_polygon_2d(line_seg_projection, 2);
+	line_seg_projection->n_sides = 2;
+	r = 0;
+	for (i = 0; i < polyline_node->polyline->n_vertices - 1; i++) {
+	    copy_pt_2d(line_seg_projection->v[0],
+		       polyline_node->polyline->v[i]);
+	    copy_pt_2d(line_seg_projection->v[1],
+		       polyline_node->polyline->v[i + 1]);
+	    make_cso_polygon_2d(cso, line_seg_projection, origin_2d,
+				polygon_projection);
+	    r |= point_near_convex_polygon_2d_p(origin_2d, cso,
+						OVERLAP_TOLERANCE);
+	    if (r)
+		break;
 	}
     }
-  clear_polygon_2d (polygon_projection);
-  clear_polygon_2d (line_seg_projection);
-  clear_polygon_2d (cso);
-  return r;
+    clear_polygon_2d(polygon_projection);
+    clear_polygon_2d(line_seg_projection);
+    clear_polygon_2d(cso);
+    return r;
 }
 
-static void
-debug_print (BSP_NODE * p)
+static void debug_print(BSP_NODE * p)
 {
-  fprintf (stderr, "\nlist:\n");
-  while (p)
-    {
-      fprintf (stderr, "  %p:%sprev=%p near=%.4g far=%.4g\n",
-	       p,
-	       p->mark ? "*" : " ", p->prev, NEAR_DEPTH (p), FAR_DEPTH (p));
-      p = p->next;
+    fprintf(stderr, "\nlist:\n");
+    while (p) {
+	fprintf(stderr, "  %p:%sprev=%p near=%.4g far=%.4g\n",
+		p,
+		p->mark ? "*" : " ", p->prev, NEAR_DEPTH(p), FAR_DEPTH(p));
+	p = p->next;
     }
 }
 
-typedef struct make_list_of_bsp_env_t
-{
-  BSP_NODE *head, *tail;
-  int n;
-}
-MAKE_LIST_OF_BSP_ENV;
+typedef struct make_list_of_bsp_env_t {
+    BSP_NODE *head, *tail;
+    int n;
+} MAKE_LIST_OF_BSP_ENV;
 
-static void
-make_list_of_bsp (BSP_NODE * bsp, void *v_env)
+static void make_list_of_bsp(BSP_NODE * bsp, void *v_env)
 {
-  MAKE_LIST_OF_BSP_ENV *env = (MAKE_LIST_OF_BSP_ENV *) v_env;
-  if (env->tail)
-    {
-      env->tail->next = bsp;
-      bsp->prev = env->tail;
-      bsp->next = NULL;
-      env->tail = bsp;
-    }
-  else
-    {
-      env->head = env->tail = bsp;
+    MAKE_LIST_OF_BSP_ENV *env = (MAKE_LIST_OF_BSP_ENV *) v_env;
+    if (env->tail) {
+	env->tail->next = bsp;
+	bsp->prev = env->tail;
+	bsp->next = NULL;
+	env->tail = bsp;
+    } else {
+	env->head = env->tail = bsp;
     }
-  ++env->n;
+    ++env->n;
 }
 
 // check invariants in the depth sort list
-static void
-check_consistency (BSP_TREE hd)
+static void check_consistency(BSP_TREE hd)
 {
-  int n_marks, n_other;
-  BSP_NODE *p, *q;
-
-  n_marks = 0;
-  for (q = NULL, p = hd; p && p->mark; q = p, p = p->next)
-    {
-      n_marks++;
-      if (p->prev != q)
-	{
-	  debug_print (hd);
-	  die (no_line, "broken prev pointer @ %d (%p != %p)", n_marks,
-	       p->prev, q);
+    int n_marks, n_other;
+    BSP_NODE *p, *q;
+
+    n_marks = 0;
+    for (q = NULL, p = hd; p && p->mark; q = p, p = p->next) {
+	n_marks++;
+	if (p->prev != q) {
+	    debug_print(hd);
+	    die(no_line, "broken prev pointer @ %d (%p != %p)", n_marks,
+		p->prev, q);
 	}
-      if (p->extent->min[X] == 0 && p->extent->max[X] == 0 &&
-	  p->extent->min[Y] == 0 && p->extent->max[Y] == 0 &&
-	  p->extent->min[Z] == 0 && p->extent->max[Z] == 0)
-	die (no_line, "unset extent");
+	if (p->extent->min[X] == 0 && p->extent->max[X] == 0 &&
+	    p->extent->min[Y] == 0 && p->extent->max[Y] == 0 &&
+	    p->extent->min[Z] == 0 && p->extent->max[Z] == 0)
+	    die(no_line, "unset extent");
     }
 
-  n_other = 0;
-  for (; p; q = p, p = p->next)
-    {
-      n_other++;
-      if (p->mark)
-	die (no_line, "unexpected mark");
-      if (p->prev != q)
-	{
-	  debug_print (hd);
-	  die (no_line, "broken prev pointer @ %d (%p != %p)",
-	       n_marks + n_other, p->prev, q);
+    n_other = 0;
+    for (; p; q = p, p = p->next) {
+	n_other++;
+	if (p->mark)
+	    die(no_line, "unexpected mark");
+	if (p->prev != q) {
+	    debug_print(hd);
+	    die(no_line, "broken prev pointer @ %d (%p != %p)",
+		n_marks + n_other, p->prev, q);
 	}
-      if (p->extent->min[X] > p->extent->max[X])
-	die (no_line, "unset extent");
-      if (q && !q->mark && FAR_DEPTH (p) > FAR_DEPTH (q))
-	{
-	  debug_print (hd);
-	  die (no_line, "far depth out of order @ %d", n_marks + n_other);
+	if (p->extent->min[X] > p->extent->max[X])
+	    die(no_line, "unset extent");
+	if (q && !q->mark && FAR_DEPTH(p) > FAR_DEPTH(q)) {
+	    debug_print(hd);
+	    die(no_line, "far depth out of order @ %d", n_marks + n_other);
 	}
     }
 }
 
-void
-insert_by_depth (BSP_TREE * hd, BSP_NODE * node)
+void insert_by_depth(BSP_TREE * hd, BSP_NODE * node)
 {
-  BSP_NODE *p, *q;
-
-  // place p after insert point and q before
-  for (q = NULL, p = *hd;
-       p && (p->mark || FAR_DEPTH (p) > FAR_DEPTH (node)); q = p, p = p->next)
-    /* skip */ ;
-
-  // insert
-  node->prev = q;
-  node->next = p;
-  if (q)
-    q->next = node;
-  else
-    *hd = node;
-  if (p)
-    p->prev = node;
+    BSP_NODE *p, *q;
+
+    // place p after insert point and q before
+    for (q = NULL, p = *hd;
+	 p && (p->mark || FAR_DEPTH(p) > FAR_DEPTH(node));
+	 q = p, p = p->next)
+	/* skip */ ;
+
+    // insert
+    node->prev = q;
+    node->next = p;
+    if (q)
+	q->next = node;
+    else
+	*hd = node;
+    if (p)
+	p->prev = node;
 }
 
 // this is taken almost directly from Newell's 1972 paper except that 
 // a BSP is used to resolve intersections and cyclic overlaps and it
 // incorporates polyline objects
-void
-sort_by_depth (BSP_TREE * bsp)
+void sort_by_depth(BSP_TREE * bsp)
 {
-  int side,
-    n_probes, n_swaps, n_nodes,
-    n_bsps, n_in, n_out, n_ppos, n_plos, n_bsp_in_nodes, n_bsp_out_nodes;
-  BSP_NODE *p, *p_next, *q, *prev, *t, *t_next, *r;
-  BSP_POLYGON_NODE *polygon_node;
-  BSP_POLYLINE_NODE *polyline_node;
-  PLANE *plane;
-  BSP_TREE sub_bsp;
-  MAKE_LIST_OF_BSP_ENV env[1];
-
-  // quicksort on deepest vertex, back-to-front
-  qs (*bsp, NULL, &p);
-
-  // hook up prev pointers and make sure marks are clear
-  n_nodes = 0;
-  for (prev = NULL, q = p; q; prev = q, q = q->next)
-    {
-      q->prev = prev;
-      q->mark = NULL;
-      ++n_nodes;
+    int side,
+	n_probes, n_swaps, n_nodes,
+	n_bsps, n_in, n_out, n_ppos, n_plos, n_bsp_in_nodes,
+	n_bsp_out_nodes;
+    BSP_NODE *p, *p_next, *q, *prev, *t, *t_next, *r;
+    BSP_POLYGON_NODE *polygon_node;
+    BSP_POLYLINE_NODE *polyline_node;
+    PLANE *plane;
+    BSP_TREE sub_bsp;
+    MAKE_LIST_OF_BSP_ENV env[1];
+
+    // quicksort on deepest vertex, back-to-front
+    qs(*bsp, NULL, &p);
+
+    // hook up prev pointers and make sure marks are clear
+    n_nodes = 0;
+    for (prev = NULL, q = p; q; prev = q, q = q->next) {
+	q->prev = prev;
+	q->mark = NULL;
+	++n_nodes;
     }
 
-  // keep some stats just for fun
-  n_probes = n_swaps = n_bsps = n_bsp_in_nodes = n_bsp_out_nodes =
-    n_ppos = n_plos = 0;
-
-  // debug_print(p); 
+    // keep some stats just for fun
+    n_probes = n_swaps = n_bsps = n_bsp_in_nodes = n_bsp_out_nodes =
+	n_ppos = n_plos = 0;
 
-  // this is now output list
-  r = NULL;
-
-  // goto here whenever the current check fails 
-  // for "p", the hopeful deepest polygon 
-restart_overlap_check:
-
-  while (p)
-    {
+    // debug_print(p); 
 
-      if (n_nodes < 1000)
-	check_consistency (p);
+    // this is now output list
+    r = NULL;
 
-      // check overlapping objects for necessary swaps.
-      for (q = p->next;
-	   q && (q->mark || FAR_DEPTH (q) > NEAR_DEPTH (p)); q = q->next)
-	{
+    // goto here whenever the current check fails 
+    // for "p", the hopeful deepest polygon 
+  restart_overlap_check:
 
-	  ++n_probes;
+    while (p) {
 
-	  // rectangular x-y extents don't overlap, so a moo point (utterly meaningless)
-	  if (!xy_intersect_p (p->extent, q->extent))
-	    continue;
+	if (n_nodes < 1000)
+	    check_consistency(p);
 
-	  // two polylines don't matter
-	  // DEBUG: it really does if they're different colors
-	  if (p->tag == BSP_POLYLINE && q->tag == BSP_POLYLINE)
-	    continue;
+	// check overlapping objects for necessary swaps.
+	for (q = p->next;
+	     q && (q->mark || FAR_DEPTH(q) > NEAR_DEPTH(p)); q = q->next) {
 
-	  // two polygons
-	  if (p->tag == BSP_POLYGON && q->tag == BSP_POLYGON)
-	    {
+	    ++n_probes;
 
-	      // p is contained wholly in the back halfspace of q
-	      polygon_node = (BSP_POLYGON_NODE *) p;
-	      plane = ((BSP_POLYGON_NODE *) q)->plane;
-	      side = polygon_side_of_plane (polygon_node->polygon, plane);
-	      if (side == S_ON ||
-		  (plane->n[Z] >= 0 && side == S_IN) ||
-		  (plane->n[Z] <= 0 && side == S_OUT))
+	    // rectangular x-y extents don't overlap, so a moo point (utterly meaningless)
+	    if (!xy_intersect_p(p->extent, q->extent))
 		continue;
 
-	      // q is contained wholly in the front halfspace of p
-	      polygon_node = (BSP_POLYGON_NODE *) q;
-	      plane = ((BSP_POLYGON_NODE *) p)->plane;
-	      side = polygon_side_of_plane (polygon_node->polygon, plane);
-	      if (side == S_ON ||
-		  (plane->n[Z] >= 0 && side == S_OUT) ||
-		  (plane->n[Z] <= 0 && side == S_IN))
+	    // two polylines don't matter
+	    // DEBUG: it really does if they're different colors
+	    if (p->tag == BSP_POLYLINE && q->tag == BSP_POLYLINE)
 		continue;
 
-	      // projections do not overlap
-	      ++n_ppos;
-	      if (!projections_overlap_p
-		  ((BSP_POLYGON_NODE *) p, (BSP_POLYGON_NODE *) q))
-		continue;
+	    // two polygons
+	    if (p->tag == BSP_POLYGON && q->tag == BSP_POLYGON) {
+
+		// p is contained wholly in the back halfspace of q
+		polygon_node = (BSP_POLYGON_NODE *) p;
+		plane = ((BSP_POLYGON_NODE *) q)->plane;
+		side = polygon_side_of_plane(polygon_node->polygon, plane);
+		if (side == S_ON ||
+		    (plane->n[Z] >= 0 && side == S_IN) ||
+		    (plane->n[Z] <= 0 && side == S_OUT))
+		    continue;
+
+		// q is contained wholly in the front halfspace of p
+		polygon_node = (BSP_POLYGON_NODE *) q;
+		plane = ((BSP_POLYGON_NODE *) p)->plane;
+		side = polygon_side_of_plane(polygon_node->polygon, plane);
+		if (side == S_ON ||
+		    (plane->n[Z] >= 0 && side == S_OUT) ||
+		    (plane->n[Z] <= 0 && side == S_IN))
+		    continue;
+
+		// projections do not overlap
+		++n_ppos;
+		if (!projections_overlap_p
+		    ((BSP_POLYGON_NODE *) p, (BSP_POLYGON_NODE *) q))
+		    continue;
 	    }
 
-	  if (p->tag == BSP_POLYLINE)
-	    {			// and q is a polygon
-	      polyline_node = (BSP_POLYLINE_NODE *) p;
-	      plane = ((BSP_POLYGON_NODE *) q)->plane;
-	      side = polyline_side_of_plane (polyline_node->polyline, plane);
-
-	      // line is contained wholly in the back halfspace of plane
-	      // lines lying on plane should be swapped so plane is drawn first
-	      if ((plane->n[Z] >= 0 && side == S_IN) ||
-		  (plane->n[Z] <= 0 && side == S_OUT))
-		continue;
-
-	      // projections do not overlap
-	      ++n_plos;
-	      if (!polyline_projection_overlaps_polygon
-		  (polyline_node, (BSP_POLYGON_NODE *) q))
-		continue;
+	    if (p->tag == BSP_POLYLINE) {	// and q is a polygon
+		polyline_node = (BSP_POLYLINE_NODE *) p;
+		plane = ((BSP_POLYGON_NODE *) q)->plane;
+		side =
+		    polyline_side_of_plane(polyline_node->polyline, plane);
+
+		// line is contained wholly in the back halfspace of plane
+		// lines lying on plane should be swapped so plane is drawn first
+		if ((plane->n[Z] >= 0 && side == S_IN) ||
+		    (plane->n[Z] <= 0 && side == S_OUT))
+		    continue;
+
+		// projections do not overlap
+		++n_plos;
+		if (!polyline_projection_overlaps_polygon
+		    (polyline_node, (BSP_POLYGON_NODE *) q))
+		    continue;
 	    }
 
-	  if (q->tag == BSP_POLYLINE)
-	    {			// and p is a polygon
-	      polyline_node = (BSP_POLYLINE_NODE *) q;
-	      plane = ((BSP_POLYGON_NODE *) p)->plane;
-	      side = polyline_side_of_plane (polyline_node->polyline, plane);
-
-	      // line is on or contained wholly in the front halfspace of the plane
-	      // a line lying on the plane can stay where it is
-	      if (side == S_ON ||
-		  (plane->n[Z] >= 0 && side == S_OUT) ||
-		  (plane->n[Z] <= 0 && side == S_IN))
-		continue;
-
-	      // projections do not overlap
-	      ++n_plos;
-	      if (!polyline_projection_overlaps_polygon
-		  (polyline_node, (BSP_POLYGON_NODE *) p))
-		continue;
+	    if (q->tag == BSP_POLYLINE) {	// and p is a polygon
+		polyline_node = (BSP_POLYLINE_NODE *) q;
+		plane = ((BSP_POLYGON_NODE *) p)->plane;
+		side =
+		    polyline_side_of_plane(polyline_node->polyline, plane);
+
+		// line is on or contained wholly in the front halfspace of the plane
+		// a line lying on the plane can stay where it is
+		if (side == S_ON ||
+		    (plane->n[Z] >= 0 && side == S_OUT) ||
+		    (plane->n[Z] <= 0 && side == S_IN))
+		    continue;
+
+		// projections do not overlap
+		++n_plos;
+		if (!polyline_projection_overlaps_polygon
+		    (polyline_node, (BSP_POLYGON_NODE *) p))
+		    continue;
 	    }
 
-	  if (q->mark)
-	    {
-
-	      // we've discovered an intersection or cyclic overlap; break it by 
-	      // putting all the marked nodes in a bsp, then pulling them
-	      // out and inserting them back on the list; remember our bsps
-	      // need all polygons inserted before all polylines
-
-	      ++n_bsps;
-	      sub_bsp = NULL;
-	      n_in = 0;
-	      t = NULL;		// use t to hold polylines temporarily
-	      while (p && p->mark)
-		{
-		  p_next = p->next;
-
-		  if (p->tag == BSP_POLYGON)
-		    {
-		      p->next = p->prev = NULL;
-		      insert_polygon (&sub_bsp, (BSP_POLYGON_NODE *) p);
-		    }
-		  else
-		    {		// save polyline temporarily
-		      p->next = t;
-		      t = p;
+	    if (q->mark) {
+
+		// we've discovered an intersection or cyclic overlap; break it by 
+		// putting all the marked nodes in a bsp, then pulling them
+		// out and inserting them back on the list; remember our bsps
+		// need all polygons inserted before all polylines
+
+		++n_bsps;
+		sub_bsp = NULL;
+		n_in = 0;
+		t = NULL;	// use t to hold polylines temporarily
+		while (p && p->mark) {
+		    p_next = p->next;
+
+		    if (p->tag == BSP_POLYGON) {
+			p->next = p->prev = NULL;
+			insert_polygon(&sub_bsp, (BSP_POLYGON_NODE *) p);
+		    } else {	// save polyline temporarily
+			p->next = t;
+			t = p;
 		    }
-		  ++n_in;
-		  p = p_next;
-		  if (p)
-		    p->prev = NULL;
+		    ++n_in;
+		    p = p_next;
+		    if (p)
+			p->prev = NULL;
 		}
-	      // insert the polylines now that all polygons are complete
-	      while (t)
-		{
-		  t_next = t->next;
-		  t->next = t->prev = NULL;
-		  insert_polyline (&sub_bsp, (BSP_POLYLINE_NODE *) t);
-		  t = t_next;
+		// insert the polylines now that all polygons are complete
+		while (t) {
+		    t_next = t->next;
+		    t->next = t->prev = NULL;
+		    insert_polyline(&sub_bsp, (BSP_POLYLINE_NODE *) t);
+		    t = t_next;
 		}
 
-	      // now traverse the bsp to get the objects back out, including split ones
-	      env->n = 0;
-	      env->head = env->tail = NULL;
-	      traverse_bsp (sub_bsp, make_list_of_bsp, env);
-	      n_out = env->n;
-
-	      // splitting should always increase the number of primitives, but
-	      // polygons very close in depth can cause split to fail; just shovel
-	      // the result polygons to the output with a warning.
-	      if (n_out <= n_in)
-		{
-		  warn (no_line, "split failed in=%d, out=%d", n_in, n_out);
-		  remark (no_line,
-			  "if hidden surfaces are wrong, try -b option");
-		  for (t = env->head; t; t = t_next)
-		    {
-		      t_next = t->next;
-		      t->next = r;
-		      t->in = t->out = t->on = t->prev = t->mark = NULL;
-		      r = t;
+		// now traverse the bsp to get the objects back out, including split ones
+		env->n = 0;
+		env->head = env->tail = NULL;
+		traverse_bsp(sub_bsp, make_list_of_bsp, env);
+		n_out = env->n;
+
+		// splitting should always increase the number of primitives, but
+		// polygons very close in depth can cause split to fail; just shovel
+		// the result polygons to the output with a warning.
+		if (n_out <= n_in) {
+		    warn(no_line, "split failed in=%d, out=%d", n_in,
+			 n_out);
+		    remark(no_line,
+			   "if hidden surfaces are wrong, try -b option");
+		    for (t = env->head; t; t = t_next) {
+			t_next = t->next;
+			t->next = r;
+			t->in = t->out = t->on = t->prev = t->mark = NULL;
+			r = t;
 		    }
-		  goto restart_overlap_check;
+		    goto restart_overlap_check;
 		}
-	      // re-insert in the sorted list
-	      for (t = env->head; t; t = t_next)
-		{
-		  t_next = t->next;
-		  t->in = t->out = t->on = t->prev = t->next = t->mark = NULL;
-		  insert_by_depth (&p, t);
+		// re-insert in the sorted list
+		for (t = env->head; t; t = t_next) {
+		    t_next = t->next;
+		    t->in = t->out = t->on = t->prev = t->next = t->mark =
+			NULL;
+		    insert_by_depth(&p, t);
 		}
 
-	      n_bsp_in_nodes += n_in;
-	      n_bsp_out_nodes += n_out;
+		n_bsp_in_nodes += n_in;
+		n_bsp_out_nodes += n_out;
 
-	      goto restart_overlap_check;
-	    }
-	  else
-	    {
+		goto restart_overlap_check;
+	    } else {
 
-	      // no overlap, so pull q forward to head of list
+		// no overlap, so pull q forward to head of list
 
-	      // unlink q
-	      if (q->next)
-		q->next->prev = q->prev;
-	      q->prev->next = q->next;
+		// unlink q
+		if (q->next)
+		    q->next->prev = q->prev;
+		q->prev->next = q->next;
 
-	      // mark
-	      q->mark = p;
+		// mark
+		q->mark = p;
 
-	      // push 
-	      q->prev = NULL;
+		// push 
+		q->prev = NULL;
 
-	      q->next = p;
-	      p->prev = q;
-	      p = q;
+		q->next = p;
+		p->prev = q;
+		p = q;
 
-	      ++n_swaps;
+		++n_swaps;
 
-	      goto restart_overlap_check;
+		goto restart_overlap_check;
 	    }
 	}
 
-      // overlap check saw no problems; pop head onto return list
-      p_next = p->next;
-      if (p_next)
-	p_next->prev = NULL;
+	// overlap check saw no problems; pop head onto return list
+	p_next = p->next;
+	if (p_next)
+	    p_next->prev = NULL;
 
-      // push on output
-      p->next = r;
-      p->prev = NULL;
-      r = p;
+	// push on output
+	p->next = r;
+	p->prev = NULL;
+	r = p;
 
-      // move to next item
-      p = p_next;
+	// move to next item
+	p = p_next;
     }
-  // pop from q and push onto q until q is empty
-  q = r;
-  r = NULL;
-  while (q)
-    {
-      t = q;
-      q = q->next;		// pop
-      t->next = r;
-      r = t;			// push
+    // pop from q and push onto q until q is empty
+    q = r;
+    r = NULL;
+    while (q) {
+	t = q;
+	q = q->next;		// pop
+	t->next = r;
+	r = t;			// push
     }
 
-  {
-    int n_probes_possible = n_nodes + n_bsp_out_nodes - n_bsp_in_nodes;
-
-    remark (no_line,
-	    "node=%d probe=%.1lf swap=%d split=%d (in=%d out=%d) ols=%d/%d",
-	    n_nodes,
-	    (n_probes_possible >
-	     0) ? (double) n_probes / n_probes_possible : 0.0, n_swaps,
-	    n_bsps, n_bsp_in_nodes, n_bsp_out_nodes, n_ppos, n_plos);
-  }
+    {
+	int n_probes_possible = n_nodes + n_bsp_out_nodes - n_bsp_in_nodes;
+
+	remark(no_line,
+	       "node=%d probe=%.1lf swap=%d split=%d (in=%d out=%d) ols=%d/%d",
+	       n_nodes,
+	       (n_probes_possible >
+		0) ? (double) n_probes / n_probes_possible : 0.0, n_swaps,
+	       n_bsps, n_bsp_in_nodes, n_bsp_out_nodes, n_ppos, n_plos);
+    }
 
-  *bsp = r;
+    *bsp = r;
 }
diff --git a/bsp.h b/bsp.h
index 9bba981..b768526 100644
--- a/bsp.h
+++ b/bsp.h
@@ -23,12 +23,10 @@ http://www.gnu.org/copyleft */
 
 #include "geometry.h"
 
-typedef enum bsp_node_type_t
-{
-  BSP_POLYGON,
-  BSP_POLYLINE,
-}
-BSP_NODE_TYPE;
+typedef enum bsp_node_type_t {
+    BSP_POLYGON,
+    BSP_POLYLINE,
+} BSP_NODE_TYPE;
 
 #define BASE_BSP_NODE_FIELDS  \
   BSP_NODE_TYPE tag; \
@@ -36,65 +34,53 @@ BSP_NODE_TYPE;
   void *attr; \
   BOX_3D extent[1]
 
-typedef struct bsp_node_t
-{
-  BASE_BSP_NODE_FIELDS;
-}
-BSP_NODE, *BSP_TREE;
-
-typedef struct bsp_vertex_attr_t
-{
-  int border_p;
-  int parent_vtx;
-  int cut_p;
-}
-BSP_VERTEX_ATTR;
-
-typedef struct bsp_polygon_attr_t
-{
-  DYNAMIC_ARRAY_FIELDS (BSP_VERTEX_ATTR, elt, n_elts);
-}
-BSP_POLYGON_ATTR;
-
-DECLARE_DYNAMIC_ARRAY_PROTOS (BSP_POLYGON_ATTR, BSP_VERTEX_ATTR,
-			      polygon_attr, elt, n_elts)
-     typedef struct bsp_polygon_node_t
-     {
-       BASE_BSP_NODE_FIELDS;
-       PLANE plane[1];
-       POLYGON_3D polygon[1];
-       BSP_POLYGON_ATTR polygon_attr[1];	// attributes of polygon vertices
-     }
-BSP_POLYGON_NODE;
-
-     typedef struct bsp_polyline_node_t
-     {
-       BASE_BSP_NODE_FIELDS;
-       POLYLINE_3D polyline[1];
-       int first_p, last_p;
-     }
-BSP_POLYLINE_NODE;
-
-     void add_polygon_to_bsp (BSP_TREE * bsp, POLYGON_3D * polygon,
-			      void *attr);
-
-     void add_polyline_to_bsp (BSP_TREE * bsp, POLYLINE_3D * polylines,
-			       void *attr);
-
-     typedef void (*BSP_NODE_FUNC) (BSP_NODE * node, void *env);
-
-     void traverse_bsp (BSP_NODE * bsp, BSP_NODE_FUNC func, void *env);
-
-     void traverse_depth_sort (BSP_NODE * bsp, BSP_NODE_FUNC func, void *env);
-
-     void print_bsp (FILE * f, BSP_NODE * bsp);
-
-     void add_polygon_to_sort (BSP_TREE * bsp, POLYGON_3D * polygon,
-			       void *attr);
-
-     void add_polyline_to_sort (BSP_TREE * bsp, POLYLINE_3D * polyline,
-				void *attr);
-
-     void sort_by_depth (BSP_TREE * bsp);
+typedef struct bsp_node_t {
+    BASE_BSP_NODE_FIELDS;
+} BSP_NODE, *BSP_TREE;
+
+typedef struct bsp_vertex_attr_t {
+    int border_p;
+    int parent_vtx;
+    int cut_p;
+} BSP_VERTEX_ATTR;
+
+typedef struct bsp_polygon_attr_t {
+    DYNAMIC_ARRAY_FIELDS(BSP_VERTEX_ATTR, elt, n_elts);
+} BSP_POLYGON_ATTR;
+
+DECLARE_DYNAMIC_ARRAY_PROTOS(BSP_POLYGON_ATTR, BSP_VERTEX_ATTR,
+			     polygon_attr, elt, n_elts);
+typedef struct bsp_polygon_node_t {
+    BASE_BSP_NODE_FIELDS;
+    PLANE plane[1];
+    POLYGON_3D polygon[1];
+    BSP_POLYGON_ATTR polygon_attr[1];	// attributes of polygon vertices
+} BSP_POLYGON_NODE;
+
+typedef struct bsp_polyline_node_t {
+    BASE_BSP_NODE_FIELDS;
+    POLYLINE_3D polyline[1];
+    int first_p, last_p;
+} BSP_POLYLINE_NODE;
+
+void add_polygon_to_bsp(BSP_TREE * bsp, POLYGON_3D * polygon, void *attr);
+
+void add_polyline_to_bsp(BSP_TREE * bsp, POLYLINE_3D * polylines,
+			 void *attr);
+
+typedef void (*BSP_NODE_FUNC) (BSP_NODE * node, void *env);
+
+void traverse_bsp(BSP_NODE * bsp, BSP_NODE_FUNC func, void *env);
+
+void traverse_depth_sort(BSP_NODE * bsp, BSP_NODE_FUNC func, void *env);
+
+void print_bsp(FILE * f, BSP_NODE * bsp);
+
+void add_polygon_to_sort(BSP_TREE * bsp, POLYGON_3D * polygon, void *attr);
+
+void add_polyline_to_sort(BSP_TREE * bsp, POLYLINE_3D * polyline,
+			  void *attr);
+
+void sort_by_depth(BSP_TREE * bsp);
 
 #endif
diff --git a/cmdline.c b/cmdline.c
index c878037..68de0e0 100644
--- a/cmdline.c
+++ b/cmdline.c
@@ -26,252 +26,241 @@ http://www.gnu.org/copyleft */
 #include "symbol.h"
 #include "version.h"
 
-void
-usage (int exit_code)
+void usage(int exit_code)
 {
-  fprintf (stderr, "\n"
-	   "sketch [options] file1 [-D tag][-U tag] file2...\n"
-	   "-h                 Print this message to standard error\n"
-	   "-v                 Print version info to standard output\n"
-	   "-V x.y             Tell Sketch your PSTricks or TikZ version is x.y\n"
-	   "-d                 Debug parser (for developers)\n"
-	   "-b                 Use BSP rather than Painters algorithm for HSR\n"
-	   "-T[u|e][p[P|T]]    Produce a complete LaTeX document\n"
-	   "  u                U.S. paper size (8.5 x 11 inches) (default)\n"
-	   "  e                European A4 paper size (297 x 210 mm)\n"
-	   "  p                Print document template to stdout\n"
-	   "    P              Print PSTricks version of doc template (default)\n"
-	   "    T              Print TikZ version of doc template\n"
-           "      L            Print LaTeX version of template (default)\n"
-           "      C            Print ConTeXt version of template\n"
-	   "-t templatefile    Load user document template\n"
-	   "                     (any text file with escape %%SKETCH_OUTPUT%%)\n"
-	   "-o outfile         Put output in outfile (default is stdout)\n"
-	   "-D tag             Define given tag\n"
-	   "-U tag             Undefine given tag\n");
-  exit (exit_code);
+    fprintf(stderr, "\n"
+	    "sketch [options] file1 [-D tag][-U tag] file2...\n"
+	    "-h                 Print this message to standard error\n"
+	    "-v                 Print version info to standard output\n"
+	    "-V x.y             Tell Sketch your PSTricks or TikZ version is x.y\n"
+	    "-d                 Debug parser (for developers)\n"
+	    "-b                 Use BSP rather than Painters algorithm for HSR\n"
+	    "-T[u|e][p[P|T]]    Produce a complete LaTeX document\n"
+	    "  u                U.S. paper size (8.5 x 11 inches) (default)\n"
+	    "  e                European A4 paper size (297 x 210 mm)\n"
+	    "  p                Print document template to stdout\n"
+	    "    P              Print PSTricks version of doc template (default)\n"
+	    "    T              Print TikZ version of doc template\n"
+	    "      L            Print LaTeX version of template (default)\n"
+	    "      C            Print ConTeXt version of template\n"
+	    "-t templatefile    Load user document template\n"
+	    "                     (any text file with escape %%SKETCH_OUTPUT%%)\n"
+	    "-o outfile         Put output in outfile (default is stdout)\n"
+	    "-D tag             Define given tag\n"
+	    "-U tag             Undefine given tag\n");
+    exit(exit_code);
 }
 
-static int
-is_doc_template_file_name (char *s)
+static int is_doc_template_file_name(char *s)
 {
-  return s[0] != '-' || s[1] == '\0';
+    return s[0] != '-' || s[1] == '\0';
 }
 
 // process argv[1..argc-1] to fill in env and prepare it for wrapping
 void
-process_global_options (CMD_LINE_OPT_ENV * env, int argc, char **argv,
-			SYMBOL_TABLE * sym_tab)
+process_global_options(CMD_LINE_OPT_ENV * env, int argc, char **argv,
+		       SYMBOL_TABLE * sym_tab)
 {
-  int i, j;
-  unsigned lang, set;
+    int i, j;
+    unsigned lang, set;
 
-  // i = 0
-  // argc = 0;
-  // argv = NULL;
-  // sym_tab = NULL;
-  // bsp_only_p = false
-  // doc_template_file_name = NULL
-  // out_file_name = NULL
-  // skip_input_p = false
-  // n_files = 0
-  SET_STRUCT_ZERO (env);
-  env->sym_tab = sym_tab;
-  parse_pst_version(env->pst_version, STRINGIFY(ASSUMED_PST_VERSION), no_line);
-  parse_tikz_version(env->tikz_version, STRINGIFY(ASSUMED_TIKZ_VERSION), no_line);
+    // i = 0
+    // argc = 0;
+    // argv = NULL;
+    // sym_tab = NULL;
+    // bsp_only_p = false
+    // doc_template_file_name = NULL
+    // out_file_name = NULL
+    // skip_input_p = false
+    // n_files = 0
+    SET_STRUCT_ZERO(env);
+    env->sym_tab = sym_tab;
+    parse_pst_version(env->pst_version, STRINGIFY(ASSUMED_PST_VERSION),
+		      no_line);
+    parse_tikz_version(env->tikz_version, STRINGIFY(ASSUMED_TIKZ_VERSION),
+		       no_line);
 
-  // we'll copy args that need to be processed in order with filenames here.
-  // the convention will be that args with paramaters like -Dfoo will be 
-  // separated into -D and foo, so we could end up doubling the number of args.
-  env->argv = safe_malloc (2 * (argc - 1) * sizeof (char *));
+    // we'll copy args that need to be processed in order with filenames here.
+    // the convention will be that args with paramaters like -Dfoo will be 
+    // separated into -D and foo, so we could end up doubling the number of args.
+    env->argv = safe_malloc(2 * (argc - 1) * sizeof(char *));
 
-  for (i = 1; i < argc; i++)
-    {
-      if (argv[i][0] == '-')
-	{
-	  switch (argv[i][1])
-	    {
+    for (i = 1; i < argc; i++) {
+	if (argv[i][0] == '-') {
+	    switch (argv[i][1]) {
 	    case 'b':
-	      env->bsp_only_p = 1;
-	      break;
+		env->bsp_only_p = 1;
+		break;
 	    case 'd':
-	      yydebug = 1;
-	      break;
+		yydebug = 1;
+		break;
 	    case 'h':
-	      usage (0);
-	      break;
+		usage(0);
+		break;
 	    case 'D':
 	    case 'U':
-	      env->argv[env->argc++] = argv[i];
-	      if (argv[i][2])
-		env->argv[env->argc++] = &argv[i][2];
-	      else if (i + 1 < argc)
-		env->argv[env->argc++] = argv[++i];
-	      else
-		err (no_line, "missing tag after %s", argv[i]);
-	      break;
+		env->argv[env->argc++] = argv[i];
+		if (argv[i][2])
+		    env->argv[env->argc++] = &argv[i][2];
+		else if (i + 1 < argc)
+		    env->argv[env->argc++] = argv[++i];
+		else
+		    err(no_line, "missing tag after %s", argv[i]);
+		break;
 	    case 'o':
-	      if (env->out_file_name)
-		err (no_line, "only one use of -o is allowed");
-	      if (argv[i][2])
-		env->out_file_name = &argv[i][2];
-	      else
-		{
-		  if (i + 1 < argc)
-		    env->out_file_name = &argv[++i][0];
-		  else
-		    err (no_line, "missing file name after -o");
+		if (env->out_file_name)
+		    err(no_line, "only one use of -o is allowed");
+		if (argv[i][2])
+		    env->out_file_name = &argv[i][2];
+		else {
+		    if (i + 1 < argc)
+			env->out_file_name = &argv[++i][0];
+		    else
+			err(no_line, "missing file name after -o");
 		}
-	      break;
+		break;
 	    case 't':
-	      if (argv[i][2])
-		env->doc_template_file_name = &argv[i][2];
-	      else if (i + 1 < argc
-		       && is_doc_template_file_name (argv[i + 1]))
-		env->doc_template_file_name = argv[++i];
-	      else
-		err (no_line, "missing document template file name after -t");
-	      break;
+		if (argv[i][2])
+		    env->doc_template_file_name = &argv[i][2];
+		else if (i + 1 < argc
+			 && is_doc_template_file_name(argv[i + 1]))
+		    env->doc_template_file_name = argv[++i];
+		else
+		    err(no_line,
+			"missing document template file name after -t");
+		break;
 	    case 'T':
-	      j = 2;
-	      if (argv[i][j] == 'e')
-		{
-		  env->doc_template_file_name =
-		    standard_euro_doc_template_file_name_flag;
-		  ++j;
-		}
-	      else if (argv[i][j] == 'u')
-		{
-		  env->doc_template_file_name =
-		    standard_us_doc_template_file_name_flag;
-		  ++j;
+		j = 2;
+		if (argv[i][j] == 'e') {
+		    env->doc_template_file_name =
+			standard_euro_doc_template_file_name_flag;
+		    ++j;
+		} else if (argv[i][j] == 'u') {
+		    env->doc_template_file_name =
+			standard_us_doc_template_file_name_flag;
+		    ++j;
+		} else {
+		    env->doc_template_file_name =
+			standard_us_doc_template_file_name_flag;
 		}
-	      else
-		{
-		  env->doc_template_file_name =
-		    standard_us_doc_template_file_name_flag;
-		}
-	      if (argv[i][j] == 'p')
-		{
-		  lang = set = 0;
-		  for (++j; argv[i][j]; ++j)
-		    {
-		      switch (argv[i][j]) 
-			{
+		if (argv[i][j] == 'p') {
+		    lang = set = 0;
+		    for (++j; argv[i][j]; ++j) {
+			switch (argv[i][j]) {
 			case 'P':
-			  if (set & GEOL_GRAPHICS_BIT)
-			    err (no_line, "-tP with two graphics package specs");
-			  lang |= GEOL_PSTRICKS;
-			  set  |= GEOL_GRAPHICS_BIT;
-			  break;
+			    if (set & GEOL_GRAPHICS_BIT)
+				err(no_line,
+				    "-tP with two graphics package specs");
+			    lang |= GEOL_PSTRICKS;
+			    set |= GEOL_GRAPHICS_BIT;
+			    break;
 			case 'T':
-			  if (set & GEOL_GRAPHICS_BIT)
-			    err (no_line, "-tP with two graphics package specs");
-			  lang |= GEOL_TIKZ;
-			  set  |= GEOL_GRAPHICS_BIT;
-			  break;
+			    if (set & GEOL_GRAPHICS_BIT)
+				err(no_line,
+				    "-tP with two graphics package specs");
+			    lang |= GEOL_TIKZ;
+			    set |= GEOL_GRAPHICS_BIT;
+			    break;
 			case 'L':
-			  if (set & GEOL_TEX_MACROS_BIT)
-			    err (no_line, "-tP with two macro package specs");
-			  lang |= GEOL_LATEX;
-			  set  |= GEOL_TEX_MACROS_BIT;
-			  break;
+			    if (set & GEOL_TEX_MACROS_BIT)
+				err(no_line,
+				    "-tP with two macro package specs");
+			    lang |= GEOL_LATEX;
+			    set |= GEOL_TEX_MACROS_BIT;
+			    break;
 			case 'C':
-			  if (set & GEOL_TEX_MACROS_BIT)
-			    err (no_line, "-tP with two macro package specs");
-			  lang |= GEOL_CONTEXT;
-			  set  |= GEOL_TEX_MACROS_BIT;
-			  break;
+			    if (set & GEOL_TEX_MACROS_BIT)
+				err(no_line,
+				    "-tP with two macro package specs");
+			    lang |= GEOL_CONTEXT;
+			    set |= GEOL_TEX_MACROS_BIT;
+			    break;
 			default:
-			  err (no_line, "unrecognized language spec after -Tp, '%c'", 
-			       argv[i][j]);
+			    err(no_line,
+				"unrecognized language spec after -Tp, '%c'",
+				argv[i][j]);
 			}
 		    }
-		  printf ("%% %s document template:\n%s",
-			  output_language_str[lang],
-			  doc_template_from_file (env->doc_template_file_name, lang));
-		  env->skip_input_p = 1;
-		}
-	      else if (argv[i][j] != '\0')
-		{
-		  err (no_line, "unrecognized modifier of option '-T%c'",
-		       argv[i][j]);
+		    printf("%% %s document template:\n%s",
+			   output_language_str[lang],
+			   doc_template_from_file(env->
+						  doc_template_file_name,
+						  lang));
+		    env->skip_input_p = 1;
+		} else if (argv[i][j] != '\0') {
+		    err(no_line, "unrecognized modifier of option '-T%c'",
+			argv[i][j]);
 		}
-	      break;
+		break;
 	    case 'V':
-	      if (argv[i][2] != '\0')
-		{
-		  parse_pst_version(env->pst_version, &argv[i][2], no_line);
-		  parse_tikz_version(env->tikz_version, &argv[i][2], no_line);
-		}
-	      else 
-		{
-		  if (i + 1 < argc) 
-		    {
-		      ++i;
-		      parse_pst_version(env->pst_version, &argv[i][0], no_line);
-		      parse_tikz_version(env->pst_version, &argv[i][0], no_line);
-		    }
-		  else
-		    {
-		      err (no_line, "missing PSTricks or TikZ version after -V");
+		if (argv[i][2] != '\0') {
+		    parse_pst_version(env->pst_version, &argv[i][2],
+				      no_line);
+		    parse_tikz_version(env->tikz_version, &argv[i][2],
+				       no_line);
+		} else {
+		    if (i + 1 < argc) {
+			++i;
+			parse_pst_version(env->pst_version, &argv[i][0],
+					  no_line);
+			parse_tikz_version(env->pst_version, &argv[i][0],
+					   no_line);
+		    } else {
+			err(no_line,
+			    "missing PSTricks or TikZ version after -V");
 		    }
 		}
-	      break;
+		break;
 	    case 'v':
-	      fprintf (stdout, "%% sketch version %s\n", VER_STRING);
-	      fprintf (stdout, "%% assumes PSTricks version %s\n", env->pst_version->str);
-	      fprintf (stdout, "%% assumes TikZ version %s\n", env->tikz_version->str);
-	      fprintf (stdout, "%% use -V to select earlier versions\n");
-	      env->skip_input_p = 1;
-	      break;
+		fprintf(stdout, "%% sketch version %s\n", VER_STRING);
+		fprintf(stdout, "%% assumes PSTricks version %s\n",
+			env->pst_version->str);
+		fprintf(stdout, "%% assumes TikZ version %s\n",
+			env->tikz_version->str);
+		fprintf(stdout, "%% use -V to select earlier versions\n");
+		env->skip_input_p = 1;
+		break;
 	    default:
-	      err (no_line, "unrecognized option '%s'", argv[i]);
-	      break;
+		err(no_line, "unrecognized option '%s'", argv[i]);
+		break;
 	    }
-	}
-      else
-	{
-	  // no leading -
-	  ++env->n_files;
-	  env->argv[env->argc++] = argv[i];
+	} else {
+	    // no leading -
+	    ++env->n_files;
+	    env->argv[env->argc++] = argv[i];
 	}
     }
-  env->argv = safe_realloc (env->argv, env->argc * sizeof (char *));
+    env->argv = safe_realloc(env->argv, env->argc * sizeof(char *));
 }
 
 // advance the environment initialized above until the next filename
 // has been found, processing non-global arguments
-char *
-advance_to_next_file_name (CMD_LINE_OPT_ENV * env)
+char *advance_to_next_file_name(CMD_LINE_OPT_ENV * env)
 {
-  for (; env->i < env->argc; env->i++)
-    {
-      if (env->argv[env->i][0] == '-')
-	{
-	  switch (env->argv[env->i][1])
-	    {
+    for (; env->i < env->argc; env->i++) {
+	if (env->argv[env->i][0] == '-') {
+	    switch (env->argv[env->i][1]) {
 	    case 'D':
-	      ++env->i;
-	      (void) new_symbol (env->sym_tab, env->argv[env->i], NULL,
-				 new_tag_def (), no_line);
-	      break;
+		++env->i;
+		(void) new_symbol(env->sym_tab, env->argv[env->i], NULL,
+				  new_tag_def(), no_line);
+		break;
 	    case 'U':
-	      // this will produce an error message if tag doesn't exist
-	      ++env->i;
-	      if (tag_exists_p (env->sym_tab, env->argv[env->i]))
-		remove_symbol (env->sym_tab, env->argv[env->i], no_line);
-	      break;
+		// this will produce an error message if tag doesn't exist
+		++env->i;
+		if (tag_exists_p(env->sym_tab, env->argv[env->i]))
+		    remove_symbol(env->sym_tab, env->argv[env->i],
+				  no_line);
+		break;
 	    default:
-	      die (no_line, "advance_to_next_file_name: unexpected option %c",
-		   env->argv[env->i][1]);
-	      break;
+		die(no_line,
+		    "advance_to_next_file_name: unexpected option %c",
+		    env->argv[env->i][1]);
+		break;
 	    }
-	}
-      else
-	{
-	  return env->argv[env->i++];
+	} else {
+	    return env->argv[env->i++];
 	}
     }
-  return NULL;
+    return NULL;
 }
diff --git a/cmdline.h b/cmdline.h
index 064717c..94fa5fd 100644
--- a/cmdline.h
+++ b/cmdline.h
@@ -24,30 +24,28 @@ http://www.gnu.org/copyleft */
 #include "langver.h"
 #include "symbol.h"
 
-typedef struct cmd_opt_env_t
-{
-  int i;			  // index of opt currently being processed (init zero)
-  int argc;			  // cmd line param count
-  char **argv;			  // cmd line params
-  SYMBOL_TABLE *sym_tab;          // symbol table
-  int bsp_only_p;		  // bsp only (default off)
-  char *doc_template_file_name;   // document template file name (default NULL)
-  char *out_file_name;		  // output file name (default NULL for stdout)
-  int skip_input_p;		  // true for options where processing input makes no sense
-  int n_files;                    // number of input file names
-  PST_VERSION pst_version[1];     // version of pstricks to generate for output
-  TIKZ_VERSION tikz_version[1];   // version of tikz to generate for output
-}
-CMD_LINE_OPT_ENV;
-
-void usage (int exit_code);
+typedef struct cmd_opt_env_t {
+    int i;			// index of opt currently being processed (init zero)
+    int argc;			// cmd line param count
+    char **argv;		// cmd line params
+    SYMBOL_TABLE *sym_tab;	// symbol table
+    int bsp_only_p;		// bsp only (default off)
+    char *doc_template_file_name;	// document template file name (default NULL)
+    char *out_file_name;	// output file name (default NULL for stdout)
+    int skip_input_p;		// true for options where processing input makes no sense
+    int n_files;		// number of input file names
+    PST_VERSION pst_version[1];	// version of pstricks to generate for output
+    TIKZ_VERSION tikz_version[1];	// version of tikz to generate for output
+} CMD_LINE_OPT_ENV;
+
+void usage(int exit_code);
 
 // process argv[1..argc-1] to fill in env and prepare it for wrapping
-void process_global_options (CMD_LINE_OPT_ENV * env, int argc, char **argv,
-			     SYMBOL_TABLE * sym_tab);
+void process_global_options(CMD_LINE_OPT_ENV * env, int argc, char **argv,
+			    SYMBOL_TABLE * sym_tab);
 
 // advance the environment initialized above until the next filename has been found
 // return a pointer to the name or NULL if there is none
-char *advance_to_next_file_name (CMD_LINE_OPT_ENV * env);
+char *advance_to_next_file_name(CMD_LINE_OPT_ENV * env);
 
 #endif
diff --git a/dynarray.h b/dynarray.h
index a2bec08..8fd4f59 100644
--- a/dynarray.h
+++ b/dynarray.h
@@ -159,7 +159,7 @@ void copy_filled_##NAME(ARRAY_TYPE *dst, ARRAY_TYPE *src);  \
 void reverse_copy_##NAME(ARRAY_TYPE *dst, ARRAY_TYPE *src);  \
 void clear_##NAME(ARRAY_TYPE *a);  \
 ELEMENT_TYPE *NAME##_##ELTS##_ptr(ARRAY_TYPE *a, int i);  \
-ELEMENT_TYPE NAME##_##ELTS(ARRAY_TYPE *a, int i);
+ELEMENT_TYPE NAME##_##ELTS(ARRAY_TYPE *a, int i)
 
 // use this for OTHER_INIT parameter when there is none
 #define NO_OTHER_INIT /**/
@@ -259,7 +259,8 @@ ELEMENT_TYPE NAME##_##ELTS(ARRAY_TYPE *a, int i) \
   if (i < 0 || i >= a->N_ELTS) \
     die(no_line, #NAME "_elt: " #ELEMENT_TYPE "_ARRAY reference [%d] out of bounds", i); \
   return a->ELTS[i]; \
-}
+} \
+void init_##NAME(ARRAY_TYPE *a)
 // ---- dyanmic arrays of elements that are static one-dimensional arrays ------
 // this is meant to be identical to the above except to compensate for C's strange
 // quirks regarding arrays of arrays
@@ -279,7 +280,7 @@ void copy_##NAME##_filled(ARRAY_TYPE *dst, ARRAY_TYPE *src); \
 void reverse_copy_##NAME(ARRAY_TYPE *dst, ARRAY_TYPE *src); \
 void clear_##NAME(ARRAY_TYPE *a); \
 SUB_ELEMENT_TYPE *NAME##_##ELTS(ARRAY_TYPE *a, int i); \
-SUB_ELEMENT_TYPE NAME##_##ELTS##_elt(ARRAY_TYPE *a, int i, int j);
+SUB_ELEMENT_TYPE NAME##_##ELTS##_elt(ARRAY_TYPE *a, int i, int j)
 #define DECLARE_DYNAMIC_2D_ARRAY_FUNCS(ARRAY_TYPE, ELEMENT_TYPE, SUB_ELEMENT_TYPE, NAME, ELTS, N_ELTS, OTHER_INIT) \
  \
 /* initialize raw array record */ \
@@ -378,5 +379,6 @@ SUB_ELEMENT_TYPE NAME##_##ELTS##_elt(ARRAY_TYPE *a, int i, int j) \
   if (i < 0 || i >= a->N_ELTS || j < 0 || j >= sizeof(ELEMENT_TYPE) / sizeof(SUB_ELEMENT_TYPE)) \
     die(no_line, #NAME "_subelt: " #ELEMENT_TYPE "_ARRAY reference [%d][%d] out of bounds", i, j); \
   return a->ELTS[i][j]; \
-}
+} \
+void init_##NAME(ARRAY_TYPE *a)
 #endif
diff --git a/emit.c b/emit.c
index 74aef17..c2a9190 100644
--- a/emit.c
+++ b/emit.c
@@ -26,839 +26,817 @@ http://www.gnu.org/copyleft */
 // ---- emit output -----------------------------------------------------------
 
 char standard_us_doc_template_file_name_flag[] =
-  "<standard us doc template file name flag>";
+    "<standard us doc template file name flag>";
 char standard_euro_doc_template_file_name_flag[] =
-  "<standard euro doc template file name flag>";
+    "<standard euro doc template file name flag>";
 
 // concise floating point output
 // idea of %g but with fixed rather than relative precision
 // removing excessive 0's often reduces output file size dramatically
 // and also eases reading
-char *
-flt_str_fmt (char *fmt, char *buf, double f)
+char *flt_str_fmt(char *fmt, char *buf, double f)
 {
-  size_t i;
-
-  sprintf (buf, fmt, f);
-
-  // trim off useless zeros and decimals
-  for (i = strlen (buf); i > 0 && buf[i - 1] == '0'; i--)
-    /* skip */ ;
-  if (i > 0 && buf[i - 1] == '.')
-    i--;
-  buf[i] = '\0';
-
-  // remove leading zeros before decimal
-  if (buf[0] == '0' && buf[1] == '.')
-    for (i = 0; (buf[i] = buf[i + 1]) != '\0'; i++)
-      /* skip */ ;
-  else if (buf[0] == '-' && buf[1] == '0' && buf[2] == '.')
-    for (i = 1; (buf[i] = buf[i + 1]) != '\0'; i++)
-      /* skip */ ;
-
-  // fix -0
-  if (strcmp (buf, "-0") == 0)
-    strcpy (buf, "0");
-
-  return buf;
+    size_t i;
+
+    sprintf(buf, fmt, f);
+
+    // trim off useless zeros and decimals
+    for (i = strlen(buf); i > 0 && buf[i - 1] == '0'; i--)
+	/* skip */ ;
+    if (i > 0 && buf[i - 1] == '.')
+	i--;
+    buf[i] = '\0';
+
+    // remove leading zeros before decimal
+    if (buf[0] == '0' && buf[1] == '.')
+	for (i = 0; (buf[i] = buf[i + 1]) != '\0'; i++)
+	    /* skip */ ;
+    else if (buf[0] == '-' && buf[1] == '0' && buf[2] == '.')
+	for (i = 1; (buf[i] = buf[i + 1]) != '\0'; i++)
+	    /* skip */ ;
+
+    // fix -0
+    if (strcmp(buf, "-0") == 0)
+	strcpy(buf, "0");
+
+    return buf;
 }
 
-char *
-flt_str (char *buf, double f)
+char *flt_str(char *buf, double f)
 {
-  return flt_str_fmt ("%.3f", buf, f);
-}
-
-// scan and return all the legal forms of special arg: ints, int range, 
-// *arg_len is set to number of chars consumed by scanning even if there are range errors
-// return value is number of good arg indices scanned into *arg_index_1|2
-static int
-scan_special_arg (SPECIAL_OBJECT * special, int i,	// start index
-		  int *arg_len,	// chars scanned
-		  int *arg_index_1,	// arg array indices (# - 1)
-		  int *arg_index_2, SRC_LINE line)	// line # for error messages
-{
-  int i1, i2, len, n_args, n_errs;
-
-  // try two-arg cases and then one arg and then assume zero
-  if (sscanf (&special->code[i], "%d-%d%n", &i1, &i2, &len) >= 2 ||
-      sscanf (&special->code[i], "{%d-%d}%n", &i1, &i2, &len) >= 2)
-    {
-      *arg_len = len;
-      *arg_index_1 = i1 - 1;
-      *arg_index_2 = i2 - 1;
-      n_args = 2;
-    }
-  else if (sscanf (&special->code[i], "%d%n", &i1, &len) >= 1 ||
-	   sscanf (&special->code[i], "{%d}%n", &i1, &len) >= 1)
-    {
-      *arg_len = len;
-      *arg_index_1 = i1 - 1;
-      n_args = 1;
-    }
-  else
-    {
-      *arg_len = 0;
-      n_args = 0;
-    }
-  n_errs = 0;
-  if (n_args >= 1 && (i1 < 1 || i1 > special->pts->n_pts))
-    {
-      err (line, "special arg #%d: out of range #[1-%d]", i1,
-	   special->pts->n_pts);
-      ++n_errs;
-    }
-  if (n_args >= 2 && (i2 < 1 || i2 > special->pts->n_pts))
-    {
-      err (line, "special arg #n-%d: out of range #[1-%d]", i2,
-	   special->pts->n_pts);
-      ++n_errs;
-    }
-  return n_errs > 0 ? 0 : n_args;
+    return flt_str_fmt("%.3f", buf, f);
 }
 
 // TikZ only does integer angles
-char *
-fmt_angle_tikz (char *buf, double theta, SRC_LINE line)
+char *fmt_angle_tikz(char *buf, double theta, SRC_LINE line)
 {
-  int i_theta = (int) ((theta >= 0) ? (theta + 0.5) : (theta - 0.5));
-  double err = theta - i_theta;
-  if (fabs (err) >= 0.1)
-    warn (line, "TikZ angle rounding error is %.2 degrees", err);
-  return flt_str_fmt ("%1.f", buf, theta);
+    int i_theta = (int) ((theta >= 0) ? (theta + 0.5) : (theta - 0.5));
+    double err = theta - i_theta;
+    if (fabs(err) >= 0.1)
+	warn(line, "TikZ angle rounding error is %.2 degrees", err);
+    return flt_str_fmt("%1.f", buf, theta);
 }
 
-char *
-fmt_angle_pst (char *buf, double theta, SRC_LINE line)
+char *fmt_angle_pst(char *buf, double theta, SRC_LINE line)
 {
-  return flt_str (buf, theta);
+    return flt_str(buf, theta);
 }
 
 typedef char *(*FMT_ANGLE_FUNC) (char *buf, double theta, SRC_LINE line);
 
 FMT_ANGLE_FUNC fmt_angle_tbl[] = {
-  fmt_angle_pst,
-  fmt_angle_tikz,
-  fmt_angle_pst,
-  fmt_angle_tikz,
+    fmt_angle_pst,
+    fmt_angle_tikz,
+    fmt_angle_pst,
+    fmt_angle_tikz,
 };
 
-// this parses, substitues, notes any errors, and (if f is set) prints special output
-// so it's used both for syntax checking during input and to generate output
-void
-process_special (FILE * f, SPECIAL_OBJECT * special, SRC_LINE line)
+#define SA_SCALAR_BIT (1 << SA_SCALAR)
+#define SA_POINT_BIT  (1 << SA_POINT)
+#define SA_VECTOR_BIT (1 << SA_VECTOR)
+
+SPECIAL_ARG *range_check(SPECIAL_OBJECT * special, int *p, int types,
+			 SRC_LINE line)
 {
-  char ch, buf1[16], buf2[16];
-  int i_arg_prev, i_arg, arg_len, arg_index_1, arg_index_2;
-
-  i_arg_prev = i_arg = arg_index_1 = arg_index_2 = 0;
-  while ((ch = special->code[i_arg]) != '\0')
-    {
-      if (ch == '#')
-	{
-	  if (special->code[i_arg + 1] == '#')
-	    {
-	      if (f)
-		fprintf (f, "%.*s#",
-			 i_arg - i_arg_prev, &special->code[i_arg_prev]);
-	      arg_len = 1;
-	    }
-	  else
-	    {
-	      switch (scan_special_arg(special, i_arg + 1, &arg_len, &arg_index_1, &arg_index_2, line))
-		{
-		case 2:
-		  if (f)
-		    fprintf (f, "%.*s{%s}", i_arg - i_arg_prev,	// number of chars to write
-			     &special->code[i_arg_prev],	// start of chars
-			     (*fmt_angle_tbl[global_env->output_language])(buf1,
-			       180 / PI * 
-			       atan2(special->pts->v[arg_index_2][Y] - special->pts->v[arg_index_1][Y],
-				     special->pts->v[arg_index_2][X] - special->pts->v[arg_index_1][X]), 
-                               line));
-		  break;
-		case 1:
-		  if (f)
-		    fprintf (f, "%.*s(%s,%s)", i_arg - i_arg_prev,	// number of chars to write
-			     &special->code[i_arg_prev],	// start of chars
-			     flt_str (buf1,
-				      special->pts->v[arg_index_1][X]),
-			     flt_str (buf2, special->pts->v[arg_index_1][Y]));
-		  break;
-		case 0:
-		  if (arg_len == 0)
-		    {		// couldn't scan an index at all
-		      if (f)
-			fprintf (f, "%.*s#", i_arg - i_arg_prev,
-				 &special->code[i_arg_prev]);
-		      warn (line,
-			    "use of '#' not as special arg (try ##)",
-			    arg_len, &special->code[i_arg]);
-		    }
-		  break;
-		}
-	    }
-	  i_arg += (arg_len + 1);
-	  i_arg_prev = i_arg;
+    int i = *p;
+    if (1 <= i && i <= special->args->n_args) {
+	SPECIAL_ARG *arg = &special->args->arg[i - 1];
+	if (arg->tag == SA_SCALAR && (types & SA_SCALAR_BIT) == 0)
+	    err(line, "reference to special arg %d cannot accept a scalar",
+		i);
+	if (arg->tag == SA_POINT && (types & SA_POINT_BIT) == 0)
+	    err(line, "reference to special arg %d cannot accept a point",
+		i);
+	if (arg->tag == SA_VECTOR && (types & SA_VECTOR_BIT) == 0)
+	    err(line, "reference to special arg %d cannot accept a vector",
+		i);
+	return arg;
+    }
+    err(line, "reference to special arg %d: out of range [1-%d]",
+	i, special->args->n_args);
+    *p = i = (i < 1) ? 1 : special->args->n_args;
+    return &special->args->arg[i - 1];
+}
+
+static int
+process_special_arg(FILE * f, SPECIAL_OBJECT * special, int p,
+		    SRC_LINE line)
+{
+    char tic, buf1[16], buf2[16], buf3[16];
+    int i1, i2, len;
+    FLOAT *v1, *v2;
+    SPECIAL_ARG *arg1, *arg2;
+
+    // try #, two-arg cases, then one with tic, then one, then assume zero
+    if (special->code[p] == '#') {
+	if (f)
+	    fprintf(f, "#");
+	len = 1;
+    } else if (sscanf(&special->code[p], "%d-%d%n", &i1, &i2, &len) >= 2 ||
+	       sscanf(&special->code[p], "{%d-%d}%n", &i1, &i2,
+		      &len) >= 2) {
+	arg1 = range_check(special, &i1, SA_POINT_BIT, line);
+	arg2 = range_check(special, &i2, SA_POINT_BIT, line);
+	v1 = arg1->val.pt;
+	v2 = arg2->val.pt;
+	if (f)
+	    fprintf(f, "{%s}",
+		    (*fmt_angle_tbl[global_env->output_language])
+		    (buf1, 180 / PI * atan2(v2[Y] - v1[Y], v2[X] - v1[X]),
+		     line));
+    } else if (sscanf(&special->code[p], "%d'%c%n", &i1, &tic, &len) >= 2) {
+	arg1 =
+	    range_check(special, &i1, (SA_POINT_BIT | SA_VECTOR_BIT),
+			line);
+	v1 = (arg1->tag == SA_POINT) ? arg1->val.pt : arg1->val.v;
+	switch (tic) {
+	case 'x':
+	case 'y':
+	case 'z':
+	    if (f)
+		fprintf(f, "%s", flt_str(buf1, v1[tic - 'x']));
+	    break;
+	case '2':
+	    if (f)
+		fprintf(f, "(%s,%s)",
+			flt_str(buf1, v1[X]), flt_str(buf2, v1[Y]));
+	    break;
+	case '3':
+	    if (f)
+		fprintf(f, "(%s,%s,%s)",
+			flt_str(buf1, v1[X]),
+			flt_str(buf2, v1[Y]), flt_str(buf3, v1[Z]));
+	    break;
+	default:
+	    if (f)
+		fprintf(f, "(%s,%s)'%c",
+			flt_str(buf1, v1[X]), flt_str(buf2, v1[Y]), tic);
+	    else
+		warn(line,
+		     "bad tick option character in #%d'%c (try #{%d}'%c)",
+		     i1, tic, i1, tic);
+	    break;
 	}
-      else
-	{
-	  ++i_arg;
+    } else if (sscanf(&special->code[p], "%d%n", &i1, &len) >= 1 ||
+	       sscanf(&special->code[p], "{%d}%n", &i1, &len) >= 1) {
+	// simple single arg can be scalar or point
+	arg1 =
+	    range_check(special, &i1,
+			(SA_SCALAR_BIT | SA_POINT_BIT | SA_VECTOR_BIT),
+			line);
+	switch (arg1->tag) {
+	case SA_SCALAR:
+	    if (f)
+		fprintf(f, "%s", flt_str(buf1, arg1->val.flt));
+	    break;
+	case SA_POINT:
+	case SA_VECTOR:
+	    v1 = (arg1->tag == SA_POINT) ? arg1->val.pt : arg1->val.v;
+	    if (f)
+		fprintf(f, "(%s,%s)",
+			flt_str(buf1, v1[X]), flt_str(buf2, v1[Y]));
+	    break;
+	default:
+	    die(line, "unknown special arg from flatten");
+	    break;
 	}
+    } else {
+	len = 0;
+	if (f)
+	    fprintf(f, "#");
+	else
+	    warn(line, "use of '#' not as special arg (try ##)");
     }
-  // print out the last stretch of code
-  if (f)
-    fprintf (f, "%s\n", &special->code[i_arg_prev]);
+    return p + len;
 }
 
-static void
-emit_points_pst (FILE * f, POINT_LIST_3D * pts)
+void process_special(FILE * f, SPECIAL_OBJECT * special, SRC_LINE line)
+{
+    int p, q;
+
+    // print stretches of code between args and call the
+    // arg processor to take care of them
+    p = q = 0;
+    while (special->code[p] != '\0') {
+	if (special->code[p] == '#') {
+	    if (f)
+		fprintf(f, "%.*s", p - q, &special->code[q]);
+	    p = q = process_special_arg(f, special, p + 1, line);
+	} else {
+	    p++;
+	}
+    }
+    if (f)
+	fprintf(f, "%.*s", p - q, &special->code[q]);
+}
+
+static void emit_points_pst(FILE * f, POINT_LIST_3D * pts)
 {
-  int i;
-  char buf1[16], buf2[16];
+    int i;
+    char buf1[16], buf2[16];
 
-  for (i = 0; i < pts->n_pts; i++)
-    fprintf (f, "(%s,%s)",
-	     flt_str (buf1, pts->v[i][X]), flt_str (buf2, pts->v[i][Y]));
+    for (i = 0; i < pts->n_pts; i++)
+	fprintf(f, "(%s,%s)",
+		flt_str(buf1, pts->v[i][X]), flt_str(buf2, pts->v[i][Y]));
 }
 
-static void
-emit_dots_pst (FILE * f, OBJECT * obj)
+static void emit_dots_pst(FILE * f, OBJECT * obj)
 {
-  DOTS_OBJECT *dots = (DOTS_OBJECT *) obj;
-  fprintf (f, "\\psdots");
-  emit_opts (f, dots->opts, global_env->output_language);
-  emit_points_pst (f, dots->pts);
-  fprintf (f, "\n");
+    DOTS_OBJECT *dots = (DOTS_OBJECT *) obj;
+    fprintf(f, "\\psdots");
+    emit_opts(f, dots->opts, global_env->output_language);
+    emit_points_pst(f, dots->pts);
+    fprintf(f, "\n");
 }
 
-static void
-emit_line_pst (FILE * f, OBJECT * obj)
+static void emit_line_pst(FILE * f, OBJECT * obj)
 {
-  LINE_OBJECT *line = (LINE_OBJECT *) obj;
-  fprintf (f, "\\psline");
-  emit_opts (f, line->opts, global_env->output_language);
-  emit_points_pst (f, line->pts);
-  fprintf (f, "\n");
+    LINE_OBJECT *line = (LINE_OBJECT *) obj;
+    fprintf(f, "\\psline");
+    emit_opts(f, line->opts, global_env->output_language);
+    emit_points_pst(f, line->pts);
+    fprintf(f, "\n");
 }
 
-static void
-emit_curve_pst (FILE * f, OBJECT * obj)
+static void emit_curve_pst(FILE * f, OBJECT * obj)
 {
-  CURVE_OBJECT *curve = (CURVE_OBJECT *) obj;
-  fprintf (f, "\\pscurve");
-  emit_opts (f, curve->opts, global_env->output_language);
-  emit_points_pst (f, curve->pts);
-  fprintf (f, "\n");
+    CURVE_OBJECT *curve = (CURVE_OBJECT *) obj;
+    fprintf(f, "\\pscurve");
+    emit_opts(f, curve->opts, global_env->output_language);
+    emit_points_pst(f, curve->pts);
+    fprintf(f, "\n");
 }
 
-static void
-emit_polygon_pst (FILE * f, OBJECT * obj)
+static void emit_polygon_pst(FILE * f, OBJECT * obj)
 {
-  POLYGON_OBJECT *poly = (POLYGON_OBJECT *) obj;
-  fprintf (f, "\\pspolygon");
-  emit_opts (f, poly->opts, global_env->output_language);
-  emit_points_pst (f, poly->pts);
-  fprintf (f, "\n");
+    POLYGON_OBJECT *poly = (POLYGON_OBJECT *) obj;
+    fprintf(f, "\\pspolygon");
+    emit_opts(f, poly->opts, global_env->output_language);
+    emit_points_pst(f, poly->pts);
+    fprintf(f, "\n");
 }
 
-static void
-emit_special_pst (FILE * f, OBJECT * obj)
+static void emit_special_pst(FILE * f, OBJECT * obj)
 {
-  process_special (f, (SPECIAL_OBJECT *) obj, no_line);
+    process_special(f, (SPECIAL_OBJECT *) obj, no_line);
 }
 
 typedef void (*EMIT_FUNC) (FILE * f, OBJECT *);
 
 static EMIT_FUNC emit_tbl_pst[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  emit_dots_pst,
-  emit_line_pst,
-  emit_curve_pst,
-  emit_polygon_pst,
-  emit_special_pst,
-  NULL,				// O_SWEEP (flattened)
-  NULL,				// O_REPEAT (flattened)
-  NULL,				// O_COMPOUND (flattened)
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    emit_dots_pst,
+    emit_line_pst,
+    emit_curve_pst,
+    emit_polygon_pst,
+    emit_special_pst,
+    NULL,			// O_SWEEP (flattened)
+    NULL,			// O_REPEAT (flattened)
+    NULL,			// O_COMPOUND (flattened)
 };
 
 static void
-emit_points_tkz (FILE * f, POINT_LIST_3D * pts, char *twixt, char *final)
+emit_points_tkz(FILE * f, POINT_LIST_3D * pts, char *twixt, char *final)
 {
-  int i;
-  char buf1[16], buf2[16];
-
-  for (i = 0; i < pts->n_pts; i++)
-    fprintf (f, "(%s,%s)%s",
-	     flt_str (buf1, pts->v[i][X]),
-	     flt_str (buf2, pts->v[i][Y]),
-	     (i == pts->n_pts - 1) ? final : twixt);
+    int i;
+    char buf1[16], buf2[16];
+
+    for (i = 0; i < pts->n_pts; i++)
+	fprintf(f, "(%s,%s)%s",
+		flt_str(buf1, pts->v[i][X]),
+		flt_str(buf2, pts->v[i][Y]),
+		(i == pts->n_pts - 1) ? final : twixt);
 }
 
-static void
-emit_dots_tkz (FILE * f, OBJECT * obj)
+static void emit_dots_tkz(FILE * f, OBJECT * obj)
 {
-  static char *skip[] = { "dotsize", NULL };
-  char *dotsize, *cmd;
+    static char *skip[] = { "dotsize", NULL };
+    char *dotsize, *cmd;
 
-  DOTS_OBJECT *dots = (DOTS_OBJECT *) obj;
+    DOTS_OBJECT *dots = (DOTS_OBJECT *) obj;
 
-  // An ugly hack because TikZ uses special syntax for circles...
-  dotsize = opt_val(dots->opts, "dotsize");
-  if (dotsize == NULL)
-    dotsize = "2pt";
-  cmd = safe_malloc(strlen(dotsize) + 100);
-  sprintf(cmd, " circle (%s)", dotsize);
+    // An ugly hack because TikZ uses special syntax for circles...
+    dotsize = opt_val(dots->opts, "dotsize");
+    if (dotsize == NULL)
+	dotsize = "2pt";
+    cmd = safe_malloc(strlen(dotsize) + 100);
+    sprintf(cmd, " circle (%s)", dotsize);
 
-  fprintf (f, "\\filldraw");
-  emit_opts_with_exceptions (f, dots->opts, skip, global_env->output_language);
-  emit_points_tkz (f, dots->pts, cmd, cmd);
-  fprintf (f, ";\n");
+    fprintf(f, "\\filldraw");
+    emit_opts_with_exceptions(f, dots->opts, skip,
+			      global_env->output_language);
+    emit_points_tkz(f, dots->pts, cmd, cmd);
+    fprintf(f, ";\n");
 
-  safe_free(cmd);
+    safe_free(cmd);
 }
 
-static void
-emit_line_tkz (FILE * f, OBJECT * obj)
+static void emit_line_tkz(FILE * f, OBJECT * obj)
 {
-  LINE_OBJECT *line = (LINE_OBJECT *) obj;
-  fprintf (f, "\\draw");
-  emit_opts (f, line->opts, global_env->output_language);
-  emit_points_tkz (f, line->pts, "--", "");
-  fprintf (f, ";\n");
+    LINE_OBJECT *line = (LINE_OBJECT *) obj;
+    fprintf(f, "\\draw");
+    emit_opts(f, line->opts, global_env->output_language);
+    emit_points_tkz(f, line->pts, "--", "");
+    fprintf(f, ";\n");
 }
 
-static void
-emit_curve_tkz (FILE * f, OBJECT * obj)
+static void emit_curve_tkz(FILE * f, OBJECT * obj)
 {
-  CURVE_OBJECT *curve = (CURVE_OBJECT *) obj;
-  fprintf (f, "\\curve");
-  emit_opts (f, curve->opts, global_env->output_language);
-  emit_points_tkz (f, curve->pts, "--", "");
-  fprintf (f, ";\n");
+    CURVE_OBJECT *curve = (CURVE_OBJECT *) obj;
+    fprintf(f, "\\curve");
+    emit_opts(f, curve->opts, global_env->output_language);
+    emit_points_tkz(f, curve->pts, "--", "");
+    fprintf(f, ";\n");
 }
 
-static void
-emit_polygon_tkz (FILE * f, OBJECT * obj)
+static void emit_polygon_tkz(FILE * f, OBJECT * obj)
 {
-  POLYGON_OBJECT *poly = (POLYGON_OBJECT *) obj;
-  fprintf (f, "\\filldraw");
-  emit_opts (f, poly->opts, global_env->output_language);
-  emit_points_tkz (f, poly->pts, "--", "--cycle");
-  fprintf (f, ";\n");
+    POLYGON_OBJECT *poly = (POLYGON_OBJECT *) obj;
+    fprintf(f, "\\filldraw");
+    emit_opts(f, poly->opts, global_env->output_language);
+    emit_points_tkz(f, poly->pts, "--", "--cycle");
+    fprintf(f, ";\n");
 }
 
-static void
-emit_special_tkz (FILE * f, OBJECT * obj)
+static void emit_special_tkz(FILE * f, OBJECT * obj)
 {
-  process_special (f, (SPECIAL_OBJECT *) obj, no_line);
+    process_special(f, (SPECIAL_OBJECT *) obj, no_line);
 }
 
 static EMIT_FUNC emit_tbl_tkz[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  emit_dots_tkz,
-  emit_line_tkz,
-  emit_curve_tkz,
-  emit_polygon_tkz,
-  emit_special_tkz,
-  NULL,				// O_SWEEP (flattened)
-  NULL,				// O_REPEAT (flattened)
-  NULL,				// O_COMPOUND (flattened)
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    emit_dots_tkz,
+    emit_line_tkz,
+    emit_curve_tkz,
+    emit_polygon_tkz,
+    emit_special_tkz,
+    NULL,			// O_SWEEP (flattened)
+    NULL,			// O_REPEAT (flattened)
+    NULL,			// O_COMPOUND (flattened)
 };
 
 static EMIT_FUNC *emit_tbl_tbl[] = {
-  emit_tbl_pst,
-  emit_tbl_tkz,
-  emit_tbl_pst,
-  emit_tbl_tkz,
+    emit_tbl_pst,
+    emit_tbl_tkz,
+    emit_tbl_pst,
+    emit_tbl_tkz,
 };
 
 #define DOC_TEMPLATE_ESCAPE_STRING "%%SKETCH_OUTPUT%%"
 #define DOC_TEMPLATE_ESCAPE_STRING_LEN (sizeof(DOC_TEMPLATE_ESCAPE_STRING) - 1)
 
 char standard_us_doc_template_tikz_latex[] =
-  "\\documentclass[letterpaper,12pt]{article}\n"
-  "\\usepackage[x11names,rgb]{xcolor}\n"
-  "\\usepackage{tikz}\n"
-  "\\usetikzlibrary{snakes}\n"
-  "\\usetikzlibrary{arrows}\n"
-  "\\usetikzlibrary{shapes}\n"
-  "\\usetikzlibrary{backgrounds}\n"
-  "\\usepackage{amsmath}\n"
-  "\\oddsidemargin 0in\n"
-  "\\evensidemargin 0in\n"
-  "\\topmargin 0in\n"
-  "\\headheight 0in\n"
-  "\\headsep 0in\n"
-  "\\textheight 9in\n"
-  "\\textwidth 6.5in\n"
-  "\\begin{document}\n"
-  "\\pagestyle{empty}\n"
-  "\\vspace*{\\fill}\n"
-  "\\begin{center}\n"
-  DOC_TEMPLATE_ESCAPE_STRING "\n"
-  "\\end{center}\n" "\\vspace*{\\fill}\n" "\\end{document}\n";
+    "\\documentclass[letterpaper,12pt]{article}\n"
+    "\\usepackage[x11names,rgb]{xcolor}\n"
+    "\\usepackage{tikz}\n"
+    "\\usetikzlibrary{snakes}\n"
+    "\\usetikzlibrary{arrows}\n"
+    "\\usetikzlibrary{shapes}\n"
+    "\\usetikzlibrary{backgrounds}\n"
+    "\\usepackage{amsmath}\n"
+    "\\oddsidemargin 0in\n"
+    "\\evensidemargin 0in\n"
+    "\\topmargin 0in\n"
+    "\\headheight 0in\n"
+    "\\headsep 0in\n"
+    "\\textheight 9in\n"
+    "\\textwidth 6.5in\n"
+    "\\begin{document}\n"
+    "\\pagestyle{empty}\n"
+    "\\vspace*{\\fill}\n"
+    "\\begin{center}\n"
+    DOC_TEMPLATE_ESCAPE_STRING "\n"
+    "\\end{center}\n" "\\vspace*{\\fill}\n" "\\end{document}\n";
 
 char standard_euro_doc_template_tikz_latex[] =
-  "\\documentclass[a4paper,12pt]{article}\n"
-  "\\usepackage[x11names,rgb]{xcolor}\n"
-  "\\usepackage{tikz}\n"
-  "\\usetikzlibrary{snakes}\n"
-  "\\usetikzlibrary{arrows}\n"
-  "\\usetikzlibrary{shapes}\n"
-  "\\usetikzlibrary{backgrounds}\n"
-  "\\usepackage{amsmath}\n"
-  "\\oddsidemargin -10mm\n"
-  "\\evensidemargin -10mm\n"
-  "\\topmargin 5mm\n"
-  "\\headheight 0cm\n"
-  "\\headsep 0cm\n"
-  "\\textheight 247mm\n"
-  "\\textwidth 160mm\n"
-  "\\begin{document}\n"
-  "\\pagestyle{empty}\n"
-  "\\vspace*{\\fill}\n"
-  "\\begin{center}\n"
-  DOC_TEMPLATE_ESCAPE_STRING "\n"
-  "\\end{center}\n" "\\vspace*{\\fill}\n" "\\end{document}\n";
+    "\\documentclass[a4paper,12pt]{article}\n"
+    "\\usepackage[x11names,rgb]{xcolor}\n"
+    "\\usepackage{tikz}\n"
+    "\\usetikzlibrary{snakes}\n"
+    "\\usetikzlibrary{arrows}\n"
+    "\\usetikzlibrary{shapes}\n"
+    "\\usetikzlibrary{backgrounds}\n"
+    "\\usepackage{amsmath}\n"
+    "\\oddsidemargin -10mm\n"
+    "\\evensidemargin -10mm\n"
+    "\\topmargin 5mm\n"
+    "\\headheight 0cm\n"
+    "\\headsep 0cm\n"
+    "\\textheight 247mm\n"
+    "\\textwidth 160mm\n"
+    "\\begin{document}\n"
+    "\\pagestyle{empty}\n"
+    "\\vspace*{\\fill}\n"
+    "\\begin{center}\n"
+    DOC_TEMPLATE_ESCAPE_STRING "\n"
+    "\\end{center}\n" "\\vspace*{\\fill}\n" "\\end{document}\n";
 
 char standard_us_doc_template_pst_latex[] =
-  "\\documentclass[letterpaper,12pt]{article}\n"
-  "\\usepackage{amsmath}\n"
-  "\\usepackage{pstricks}\n"
-  "\\usepackage{pstricks-add}\n"
-  "\\oddsidemargin 0in\n"
-  "\\evensidemargin 0in\n"
-  "\\topmargin 0in\n"
-  "\\headheight 0in\n"
-  "\\headsep 0in\n"
-  "\\textheight 9in\n"
-  "\\textwidth 6.5in\n"
-  "\\begin{document}\n"
-  "\\pagestyle{empty}\n"
-  "\\vspace*{\\fill}\n"
-  "\\begin{center}\n"
-  DOC_TEMPLATE_ESCAPE_STRING "\n"
-  "\\end{center}\n" "\\vspace*{\\fill}\n" "\\end{document}\n";
+    "\\documentclass[letterpaper,12pt]{article}\n"
+    "\\usepackage{amsmath}\n"
+    "\\usepackage{pstricks}\n"
+    "\\usepackage{pstricks-add}\n"
+    "\\oddsidemargin 0in\n"
+    "\\evensidemargin 0in\n"
+    "\\topmargin 0in\n"
+    "\\headheight 0in\n"
+    "\\headsep 0in\n"
+    "\\textheight 9in\n"
+    "\\textwidth 6.5in\n"
+    "\\begin{document}\n"
+    "\\pagestyle{empty}\n"
+    "\\vspace*{\\fill}\n"
+    "\\begin{center}\n"
+    DOC_TEMPLATE_ESCAPE_STRING "\n"
+    "\\end{center}\n" "\\vspace*{\\fill}\n" "\\end{document}\n";
 
 char standard_euro_doc_template_pst_latex[] =
-  "\\documentclass[a4paper,12pt]{article}\n"
-  "\\usepackage{amsmath}\n"
-  "\\usepackage{pstricks}\n"
-  "\\usepackage{pstricks-add}\n"
-  "\\oddsidemargin -10mm\n"
-  "\\evensidemargin -10mm\n"
-  "\\topmargin 5mm\n"
-  "\\headheight 0cm\n"
-  "\\headsep 0cm\n"
-  "\\textheight 247mm\n"
-  "\\textwidth 160mm\n"
-  "\\begin{document}\n"
-  "\\pagestyle{empty}\n"
-  "\\vspace*{\\fill}\n"
-  "\\begin{center}\n"
-  DOC_TEMPLATE_ESCAPE_STRING "\n"
-  "\\end{center}\n" "\\vspace*{\\fill}\n" "\\end{document}\n";
+    "\\documentclass[a4paper,12pt]{article}\n"
+    "\\usepackage{amsmath}\n"
+    "\\usepackage{pstricks}\n"
+    "\\usepackage{pstricks-add}\n"
+    "\\oddsidemargin -10mm\n"
+    "\\evensidemargin -10mm\n"
+    "\\topmargin 5mm\n"
+    "\\headheight 0cm\n"
+    "\\headsep 0cm\n"
+    "\\textheight 247mm\n"
+    "\\textwidth 160mm\n"
+    "\\begin{document}\n"
+    "\\pagestyle{empty}\n"
+    "\\vspace*{\\fill}\n"
+    "\\begin{center}\n"
+    DOC_TEMPLATE_ESCAPE_STRING "\n"
+    "\\end{center}\n" "\\vspace*{\\fill}\n" "\\end{document}\n";
 
 /* ---------------------------------------------------------------------- */
 
 char standard_us_doc_template_tikz_context[] =
-  "\\usemodule[tikz] \\usetikzlibrary[snakes,arrows,shapes,backgrounds]\n"
-  "\\setuppapersize[letter][letter]\n"
-  "\\setuplayout[topspace=0in,backspace=0in,header=0in,footer=0in,height=middle,width=middle]\n"
-  "\\setuppagenumbering[state=stop] % no page numbers\n"
-  "\\starttext\n"
-  "\\startalignment[middle]\n"
-  DOC_TEMPLATE_ESCAPE_STRING "\n"
-  "\\stopalignment\n"
-  "\\stoptext\n";
+    "\\usemodule[tikz] \\usetikzlibrary[snakes,arrows,shapes,backgrounds]\n"
+    "\\setuppapersize[letter][letter]\n"
+    "\\setuplayout[topspace=0in,backspace=0in,header=0in,footer=0in,height=middle,width=middle]\n"
+    "\\setuppagenumbering[state=stop] % no page numbers\n"
+    "\\starttext\n"
+    "\\startalignment[middle]\n"
+    DOC_TEMPLATE_ESCAPE_STRING "\n" "\\stopalignment\n" "\\stoptext\n";
 
 char standard_euro_doc_template_tikz_context[] =
-  "\\usemodule[tikz] \\usetikzlibrary[snakes,arrows,shapes,backgrounds]\n"
-  "\\setuppapersize[a4][a4]\n"
-  "\\setuplayout[topspace=0cm,backspace=0cm,header=0cm,footer=0cm,height=middle,width=middle]\n"
-  "\\setuppagenumbering[state=stop] % no page numbers\n"
-  "\\starttext\n"
-  "\\startalignment[middle]\n"
-  DOC_TEMPLATE_ESCAPE_STRING "\n"
-  "\\stopalignment\n"
-  "\\stoptext\n";
+    "\\usemodule[tikz] \\usetikzlibrary[snakes,arrows,shapes,backgrounds]\n"
+    "\\setuppapersize[a4][a4]\n"
+    "\\setuplayout[topspace=0cm,backspace=0cm,header=0cm,footer=0cm,height=middle,width=middle]\n"
+    "\\setuppagenumbering[state=stop] % no page numbers\n"
+    "\\starttext\n"
+    "\\startalignment[middle]\n"
+    DOC_TEMPLATE_ESCAPE_STRING "\n" "\\stopalignment\n" "\\stoptext\n";
 
 char standard_us_doc_template_pst_context[] =
-  "PSTricks does not work with ConTeXt as of 1 Feb 2008.\n";
+    "PSTricks does not work with ConTeXt as of 1 Feb 2008.\n";
 
 char standard_euro_doc_template_pst_context[] =
-  "PSTricks does not work with ConTeXt as of 1 Feb 2008.\n";
+    "PSTricks does not work with ConTeXt as of 1 Feb 2008.\n";
 
 char *standard_us_doc_template[] = {
-  standard_us_doc_template_pst_latex,
-  standard_us_doc_template_tikz_latex,
-  standard_us_doc_template_pst_context,
-  standard_us_doc_template_tikz_context,
+    standard_us_doc_template_pst_latex,
+    standard_us_doc_template_tikz_latex,
+    standard_us_doc_template_pst_context,
+    standard_us_doc_template_tikz_context,
 };
 
 char *standard_euro_doc_template[] = {
-  standard_euro_doc_template_pst_latex,
-  standard_euro_doc_template_tikz_latex,
-  standard_euro_doc_template_pst_context,
-  standard_euro_doc_template_tikz_context,
+    standard_euro_doc_template_pst_latex,
+    standard_euro_doc_template_tikz_latex,
+    standard_euro_doc_template_pst_context,
+    standard_euro_doc_template_tikz_context,
 };
 
-char *
-read_file_as_string (FILE * f)
+char *read_file_as_string(FILE * f)
 {
-  size_t len = 0;
-  int buf_size = 1024;
-  char *buf = safe_malloc (buf_size + 1);
-  for (;;)
-    {
-      len += fread (buf + len, 1, buf_size - len, f);
-      if (feof (f) || ferror (f))
-	{
-	  buf[len] = '\0';
-	  return buf;
+    size_t len = 0;
+    int buf_size = 1024;
+    char *buf = safe_malloc(buf_size + 1);
+    for (;;) {
+	len += fread(buf + len, 1, buf_size - len, f);
+	if (feof(f) || ferror(f)) {
+	    buf[len] = '\0';
+	    return buf;
 	}
-      buf_size *= 2;
-      buf = safe_realloc (buf, buf_size + 1);
+	buf_size *= 2;
+	buf = safe_realloc(buf, buf_size + 1);
     }
 }
 
-char *
-doc_template_from_file (char *file_name, int output_language)
+char *doc_template_from_file(char *file_name, int output_language)
 {
-  FILE *f;
-  char *r;
-
-  if (file_name == NULL)
-    return NULL;
-  if (file_name == standard_us_doc_template_file_name_flag)
-    return safe_strdup (standard_us_doc_template[output_language]);
-  if (file_name == standard_euro_doc_template_file_name_flag)
-    return safe_strdup (standard_euro_doc_template[output_language]);
-
-  f = fopen (file_name, "r");
-  if (!f)
-    {
-      err (no_line, "can't open document template '%s%' for input\n",
-	   file_name);
-      return safe_strdup (standard_us_doc_template_pst_latex);
+    FILE *f;
+    char *r;
+
+    if (file_name == NULL)
+	return NULL;
+    if (file_name == standard_us_doc_template_file_name_flag)
+	return safe_strdup(standard_us_doc_template[output_language]);
+    if (file_name == standard_euro_doc_template_file_name_flag)
+	return safe_strdup(standard_euro_doc_template[output_language]);
+
+    f = fopen(file_name, "r");
+    if (!f) {
+	err(no_line, "can't open document template '%s%' for input\n",
+	    file_name);
+	return safe_strdup(standard_us_doc_template_pst_latex);
     }
-  r = read_file_as_string (f);
-  fclose (f);
-  return r;
+    r = read_file_as_string(f);
+    fclose(f);
+    return r;
 }
 
-void
-emit_preamble_pst_latex (FILE * f, BOX_3D * ext, GLOBAL_ENV * env)
+void emit_preamble_pst_latex(FILE * f, BOX_3D * ext, GLOBAL_ENV * env)
 {
-  char buf1[16], buf2[16], buf3[16], buf4[16];
+    char buf1[16], buf2[16], buf3[16], buf4[16];
 
-  if (global_env_is_set_p (env, GE_OPTS))
-    {
-      fprintf (f, "\\psset{");
-      emit_opts_raw (f, env->opts, global_env->output_language);
-      fprintf (f, "}\n");
+    if (global_env_is_set_p(env, GE_OPTS)) {
+	fprintf(f, "\\psset{");
+	emit_opts_raw(f, env->opts, global_env->output_language);
+	fprintf(f, "}\n");
     }
 
-  if (global_env_is_set_p (env, GE_FRAME))
-    {
-      if (env->frame_opts)
-	fprintf (f, "\\psframebox[%s]{", env->frame_opts);
-      else
-	fprintf (f, "\\psframebox[framesep=0pt]{");
+    if (global_env_is_set_p(env, GE_FRAME)) {
+	if (env->frame_opts)
+	    fprintf(f, "\\psframebox[%s]{", env->frame_opts);
+	else
+	    fprintf(f, "\\psframebox[framesep=0pt]{");
     }
 
-  fprintf (f, "\\begin{pspicture%s}",
-	   global_env_is_set_p (env, GE_EXTENT) ? "*" : "");
-
-  if (global_env_is_set_p (env, GE_BASELINE))
-    fprintf (f, "[%s]", flt_str (buf1, env->baseline));
-
-  fprintf (f,
-	   "(%s,%s)(%s,%s)\n",
-	   flt_str (buf1, ext->min[X]),
-	   flt_str (buf2, ext->min[Y]),
-	   flt_str (buf3, ext->max[X]), flt_str (buf4, ext->max[Y]));
-
-  if (cmp_with_global_pst_version(env, STRINGIFY(PST_LINEJOIN_VERSION), no_line) < 0) 
-    {
-      // old way to set linejoin
-      fprintf (f, "\\pstVerb{1 setlinejoin}\n");
-    }
-  else
-    {
-      fprintf (f, 
-	       "%% If your PSTricks is earlier than Version "
-	       STRINGIFY(PST_LINEJOIN_VERSION) ", it will fail here.\n"
-	       "%% Use sketch -V option for backward compatibility.\n"
-	       "\\psset{linejoin=1}\n");
+    fprintf(f, "\\begin{pspicture%s}",
+	    global_env_is_set_p(env, GE_EXTENT) ? "*" : "");
+
+    if (global_env_is_set_p(env, GE_BASELINE))
+	fprintf(f, "[%s]", flt_str(buf1, env->baseline));
+
+    fprintf(f,
+	    "(%s,%s)(%s,%s)\n",
+	    flt_str(buf1, ext->min[X]),
+	    flt_str(buf2, ext->min[Y]),
+	    flt_str(buf3, ext->max[X]), flt_str(buf4, ext->max[Y]));
+
+    if (cmp_with_global_pst_version
+	(env, STRINGIFY(PST_LINEJOIN_VERSION), no_line) < 0) {
+	// old way to set linejoin
+	fprintf(f, "\\pstVerb{1 setlinejoin}\n");
+    } else {
+	fprintf(f,
+		"%% If your PSTricks is earlier than Version "
+		STRINGIFY(PST_LINEJOIN_VERSION) ", it will fail here.\n"
+		"%% Use sketch -V option for backward compatibility.\n"
+		"\\psset{linejoin=1}\n");
     }
 }
 
-void
-emit_preamble_tkz_latex (FILE * f, BOX_3D * ext, GLOBAL_ENV * env)
+void emit_preamble_tkz_latex(FILE * f, BOX_3D * ext, GLOBAL_ENV * env)
 {
-  char buf1[16], buf2[16], buf3[16], buf4[16];
-
-  if (global_env_is_set_p (env, GE_FRAME))
-    {
-      if (env->frame_opts)
-	warn (no_line, "frame options [%s] ignored (TikZ)", env->frame_opts);
-      else
-	{
-	  fprintf (f, "{\\fboxsep=0pt\\fbox{");
-	  warn (no_line,
-		"remove frame around TikZ/PGF pictures for debugging");
+    char buf1[16], buf2[16], buf3[16], buf4[16];
+
+    if (global_env_is_set_p(env, GE_FRAME)) {
+	if (env->frame_opts)
+	    warn(no_line, "frame options [%s] ignored (TikZ)",
+		 env->frame_opts);
+	else {
+	    fprintf(f, "{\\fboxsep=0pt\\fbox{");
+	    warn(no_line,
+		 "remove frame around TikZ/PGF pictures for debugging");
 	}
     }
 
-  if (cmp_with_global_tikz_version(env, STRINGIFY(TIKZ_DECORATIONS_VERSION), no_line) >= 0) 
-    {
-      remark (no_line, 
-	      "TikZ warning about deprecated decorations library is okay to ignore");
+    if (cmp_with_global_tikz_version
+	(env, STRINGIFY(TIKZ_DECORATIONS_VERSION), no_line) >= 0) {
+	remark(no_line,
+	       "TikZ warning about deprecated decorations library is okay to ignore");
     }
 
-  fprintf (f, "\\begin{tikzpicture}[line join=round");
-  if (global_env_is_set_p (env, GE_OPTS))
-    {
-      fprintf (f, ",");
-      emit_opts_raw (f, env->opts, global_env->output_language);
+    fprintf(f, "\\begin{tikzpicture}[line join=round");
+    if (global_env_is_set_p(env, GE_OPTS)) {
+	fprintf(f, ",");
+	emit_opts_raw(f, env->opts, global_env->output_language);
     }
-  if (global_env_is_set_p (env, GE_BASELINE))
-    {
-      fprintf (f, ",");
-      fprintf (f, "baseline=%s", flt_str (buf1, env->baseline));
+    if (global_env_is_set_p(env, GE_BASELINE)) {
+	fprintf(f, ",");
+	fprintf(f, "baseline=%s", flt_str(buf1, env->baseline));
     }
-  fprintf (f, "]\n");
-  if (global_env_is_set_p (env, GE_EXTENT))
-    {
-      flt_str (buf1, ext->min[X]);
-      flt_str (buf2, ext->min[Y]);
-      flt_str (buf3, ext->max[X]);
-      flt_str (buf4, ext->max[Y]);
-      fprintf (f,
-	       "\\useasboundingbox(%s,%s) rectangle (%s,%s);\n"
-	       "\\clip(%s,%s) rectangle (%s,%s);\n",
-	       buf1, buf2, buf3, buf4, buf1, buf2, buf3, buf4);
+    fprintf(f, "]\n");
+    if (global_env_is_set_p(env, GE_EXTENT)) {
+	flt_str(buf1, ext->min[X]);
+	flt_str(buf2, ext->min[Y]);
+	flt_str(buf3, ext->max[X]);
+	flt_str(buf4, ext->max[Y]);
+	fprintf(f,
+		"\\useasboundingbox(%s,%s) rectangle (%s,%s);\n"
+		"\\clip(%s,%s) rectangle (%s,%s);\n",
+		buf1, buf2, buf3, buf4, buf1, buf2, buf3, buf4);
     }
 }
 
 // -----------------------------------------------------------------
 
-void
-emit_preamble_pst_context (FILE * f, BOX_3D * ext, GLOBAL_ENV * env)
+void emit_preamble_pst_context(FILE * f, BOX_3D * ext, GLOBAL_ENV * env)
 {
-  char buf1[16], buf2[16], buf3[16], buf4[16];
+    char buf1[16], buf2[16], buf3[16], buf4[16];
 
-  if (global_env_is_set_p (env, GE_OPTS))
-    {
-      fprintf (f, "\\psset{");
-      emit_opts_raw (f, env->opts, global_env->output_language);
-      fprintf (f, "}\n");
+    if (global_env_is_set_p(env, GE_OPTS)) {
+	fprintf(f, "\\psset{");
+	emit_opts_raw(f, env->opts, global_env->output_language);
+	fprintf(f, "}\n");
     }
 
-  fprintf (f, 
-	   "%% ConTeXt does not yet support PSTricks.\n"
-	   "%% This is a guess at what the syntax might be.\n");
+    fprintf(f,
+	    "%% ConTeXt does not yet support PSTricks.\n"
+	    "%% This is a guess at what the syntax might be.\n");
 
-  if (global_env_is_set_p (env, GE_FRAME))
-    {
-      if (env->frame_opts)
-	fprintf (f, "\\psframebox[%s]{", env->frame_opts);
-      else
-	fprintf (f, "\\psframebox[framesep=0pt]{");
+    if (global_env_is_set_p(env, GE_FRAME)) {
+	if (env->frame_opts)
+	    fprintf(f, "\\psframebox[%s]{", env->frame_opts);
+	else
+	    fprintf(f, "\\psframebox[framesep=0pt]{");
     }
 
-  fprintf (f, "\\startpspicture%s",
-	   global_env_is_set_p (env, GE_EXTENT) ? "*" : "");
+    fprintf(f, "\\startpspicture%s",
+	    global_env_is_set_p(env, GE_EXTENT) ? "*" : "");
 
-  if (global_env_is_set_p (env, GE_BASELINE))
-    fprintf (f, "[%s]", flt_str (buf1, env->baseline));
+    if (global_env_is_set_p(env, GE_BASELINE))
+	fprintf(f, "[%s]", flt_str(buf1, env->baseline));
 
-  fprintf (f,
-	   "(%s,%s)(%s,%s)\n",
-	   flt_str (buf1, ext->min[X]),
-	   flt_str (buf2, ext->min[Y]),
-	   flt_str (buf3, ext->max[X]), flt_str (buf4, ext->max[Y]));
+    fprintf(f,
+	    "(%s,%s)(%s,%s)\n",
+	    flt_str(buf1, ext->min[X]),
+	    flt_str(buf2, ext->min[Y]),
+	    flt_str(buf3, ext->max[X]), flt_str(buf4, ext->max[Y]));
 
-  fprintf (f, "\\pstVerb{1 setlinejoin}\n");
+    fprintf(f, "\\pstVerb{1 setlinejoin}\n");
 }
 
-void
-emit_preamble_tkz_context (FILE * f, BOX_3D * ext, GLOBAL_ENV * env)
+void emit_preamble_tkz_context(FILE * f, BOX_3D * ext, GLOBAL_ENV * env)
 {
-  char buf1[16], buf2[16], buf3[16], buf4[16];
-
-  if (global_env_is_set_p (env, GE_FRAME))
-    {
-      if (env->frame_opts)
-	warn (no_line, "frame options [%s] ignored (TikZ)", env->frame_opts);
-      else
-	{
-	  fprintf (f, "{\\fboxsep=0pt\\fbox{");
-	  warn (no_line,
-		"remove frame around TikZ/PGF pictures for debugging");
+    char buf1[16], buf2[16], buf3[16], buf4[16];
+
+    if (global_env_is_set_p(env, GE_FRAME)) {
+	if (env->frame_opts)
+	    warn(no_line, "frame options [%s] ignored (TikZ)",
+		 env->frame_opts);
+	else {
+	    fprintf(f, "{\\fboxsep=0pt\\fbox{");
+	    warn(no_line,
+		 "remove frame around TikZ/PGF pictures for debugging");
 	}
     }
 
-  fprintf (f, "\\starttikzpicture[join=round");
-  if (global_env_is_set_p (env, GE_OPTS))
-    {
-      fprintf (f, ",");
-      emit_opts_raw (f, env->opts, global_env->output_language);
+    fprintf(f, "\\starttikzpicture[join=round");
+    if (global_env_is_set_p(env, GE_OPTS)) {
+	fprintf(f, ",");
+	emit_opts_raw(f, env->opts, global_env->output_language);
     }
-  if (global_env_is_set_p (env, GE_BASELINE))
-    {
-      fprintf (f, ",");
-      fprintf (f, "baseline=%s", flt_str (buf1, env->baseline));
+    if (global_env_is_set_p(env, GE_BASELINE)) {
+	fprintf(f, ",");
+	fprintf(f, "baseline=%s", flt_str(buf1, env->baseline));
     }
-  fprintf (f, "]\n");
-  if (global_env_is_set_p (env, GE_EXTENT))
-    {
-      flt_str (buf1, ext->min[X]);
-      flt_str (buf2, ext->min[Y]);
-      flt_str (buf3, ext->max[X]);
-      flt_str (buf4, ext->max[Y]);
-      fprintf (f,
-	       "\\useasboundingbox(%s,%s) rectangle (%s,%s);\n"
-	       "\\clip(%s,%s) rectangle (%s,%s);\n",
-	       buf1, buf2, buf3, buf4, buf1, buf2, buf3, buf4);
+    fprintf(f, "]\n");
+    if (global_env_is_set_p(env, GE_EXTENT)) {
+	flt_str(buf1, ext->min[X]);
+	flt_str(buf2, ext->min[Y]);
+	flt_str(buf3, ext->max[X]);
+	flt_str(buf4, ext->max[Y]);
+	fprintf(f,
+		"\\useasboundingbox(%s,%s) rectangle (%s,%s);\n"
+		"\\clip(%s,%s) rectangle (%s,%s);\n",
+		buf1, buf2, buf3, buf4, buf1, buf2, buf3, buf4);
     }
 }
 
-typedef void (*EMIT_PREAMBLE_FUNC) (FILE * f, BOX_3D * ext, GLOBAL_ENV * env);
+typedef void (*EMIT_PREAMBLE_FUNC) (FILE * f, BOX_3D * ext,
+				    GLOBAL_ENV * env);
 
 EMIT_PREAMBLE_FUNC emit_preamble_tbl[] = {
-  emit_preamble_pst_latex,
-  emit_preamble_tkz_latex,
-  emit_preamble_pst_context,
-  emit_preamble_tkz_context,
+    emit_preamble_pst_latex,
+    emit_preamble_tkz_latex,
+    emit_preamble_pst_context,
+    emit_preamble_tkz_context,
 };
 
-void
-emit_postamble_pst_latex (FILE * f, GLOBAL_ENV * env)
+void emit_postamble_pst_latex(FILE * f, GLOBAL_ENV * env)
 {
-  fprintf (f, "\\end{pspicture%s}",
-	   global_env_is_set_p (env, GE_EXTENT) ? "*" : "");
-  if (global_env_is_set_p (env, GE_FRAME))
-    fprintf (f, "}");
+    fprintf(f, "\\end{pspicture%s}",
+	    global_env_is_set_p(env, GE_EXTENT) ? "*" : "");
+    if (global_env_is_set_p(env, GE_FRAME))
+	fprintf(f, "}");
 }
 
-void
-emit_postamble_tkz_latex (FILE * f, GLOBAL_ENV * env)
+void emit_postamble_tkz_latex(FILE * f, GLOBAL_ENV * env)
 {
-  fprintf (f, "\\end{tikzpicture}");
-  if (global_env_is_set_p (env, GE_FRAME))
-    fprintf (f, "}}");
+    fprintf(f, "\\end{tikzpicture}");
+    if (global_env_is_set_p(env, GE_FRAME))
+	fprintf(f, "}}");
 }
 
-void
-emit_postamble_pst_context (FILE * f, GLOBAL_ENV * env)
+void emit_postamble_pst_context(FILE * f, GLOBAL_ENV * env)
 {
-  fprintf (f, "\\stoppspicture%s}",
-	   global_env_is_set_p (env, GE_EXTENT) ? "*" : "");
-  if (global_env_is_set_p (env, GE_FRAME))
-    fprintf (f, "}");
+    fprintf(f, "\\stoppspicture%s}",
+	    global_env_is_set_p(env, GE_EXTENT) ? "*" : "");
+    if (global_env_is_set_p(env, GE_FRAME))
+	fprintf(f, "}");
 }
 
-void
-emit_postamble_tkz_context (FILE * f, GLOBAL_ENV * env)
+void emit_postamble_tkz_context(FILE * f, GLOBAL_ENV * env)
 {
-  fprintf (f, "\\stoptikzpicture");
-  if (global_env_is_set_p (env, GE_FRAME))
-    fprintf (f, "}}");
+    fprintf(f, "\\stoptikzpicture");
+    if (global_env_is_set_p(env, GE_FRAME))
+	fprintf(f, "}}");
 }
 
 typedef void (*EMIT_POSTAMBLE_FUNC) (FILE * f, GLOBAL_ENV * env);
 
 EMIT_POSTAMBLE_FUNC emit_postamble_tbl[] = {
-  emit_postamble_pst_latex,
-  emit_postamble_tkz_latex,  
-  emit_postamble_pst_context,
-  emit_postamble_tkz_context,
+    emit_postamble_pst_latex,
+    emit_postamble_tkz_latex,
+    emit_postamble_pst_context,
+    emit_postamble_tkz_context,
 };
 
 void
-emit (FILE * f, OBJECT * obj, GLOBAL_ENV * env, char *doc_template_file_name)
+emit(FILE * f, OBJECT * obj, GLOBAL_ENV * env,
+     char *doc_template_file_name)
 {
-  BOX_3D ext[1];
-  int n_obj;
-  OBJECT *p;
-  char buf1[16], buf2[16], buf3[16], buf4[16];
-  char *escape, *doc_template;
-
-  doc_template =
-    doc_template_from_file (doc_template_file_name, env->output_language);
-
-  get_extent (obj, ext, &n_obj);
-  if (n_obj == 0)
-    err (no_line, "no objects to write");
-  else
-    {
-
-      remark (no_line, "scene bb=(%s,%s)(%s,%s)",
-	      flt_str (buf1, ext->min[X]),
-	      flt_str (buf2, ext->min[Y]),
-	      flt_str (buf3, ext->max[X]), flt_str (buf4, ext->max[Y]));
-
-      if (get_transformed_global_env_extent (ext, env))
-	{
-	  remark (no_line, "actual bb=(%s,%s)(%s,%s)",
-		  flt_str (buf1, ext->min[X]),
-		  flt_str (buf2, ext->min[Y]),
-		  flt_str (buf3, ext->max[X]), flt_str (buf4, ext->max[Y]));
+    BOX_3D ext[1];
+    int n_obj;
+    OBJECT *p;
+    char buf1[16], buf2[16], buf3[16], buf4[16];
+    char *escape, *doc_template;
+
+    doc_template =
+	doc_template_from_file(doc_template_file_name,
+			       env->output_language);
+
+    get_extent(obj, ext, &n_obj);
+    if (n_obj == 0)
+	err(no_line, "no objects to write");
+    else {
+
+	remark(no_line, "scene bb=(%s,%s)(%s,%s)",
+	       flt_str(buf1, ext->min[X]),
+	       flt_str(buf2, ext->min[Y]),
+	       flt_str(buf3, ext->max[X]), flt_str(buf4, ext->max[Y]));
+
+	if (get_transformed_global_env_extent(ext, env)) {
+	    remark(no_line, "actual bb=(%s,%s)(%s,%s)",
+		   flt_str(buf1, ext->min[X]),
+		   flt_str(buf2, ext->min[Y]),
+		   flt_str(buf3, ext->max[X]), flt_str(buf4, ext->max[Y]));
 	}
 
-      remark (no_line, "writing %d objects", n_obj);
-
-      fprintf (f,
-	       "%% Sketch output, version " VER_STRING "\n"
-	       "%% Output language: %s\n",
-	       output_language_str[env->output_language]);
-      escape = NULL;
-      if (doc_template)
-	{
-	  escape = strstr (doc_template, DOC_TEMPLATE_ESCAPE_STRING);
-	  if (escape)
-	    fprintf (f, "%.*s", (int)(escape - doc_template), doc_template);
-	  else
-	    warn (no_line,
-		  "document template with no escape '%s' has been ignored",
-		  DOC_TEMPLATE_ESCAPE_STRING);
+	remark(no_line, "writing %d objects", n_obj);
+
+	fprintf(f,
+		"%% Sketch output, version " VER_STRING "\n"
+		"%% Output language: %s\n",
+		output_language_str[env->output_language]);
+	escape = NULL;
+	if (doc_template) {
+	    escape = strstr(doc_template, DOC_TEMPLATE_ESCAPE_STRING);
+	    if (escape)
+		fprintf(f, "%.*s", (int) (escape - doc_template),
+			doc_template);
+	    else
+		warn(no_line,
+		     "document template with no escape '%s' has been ignored",
+		     DOC_TEMPLATE_ESCAPE_STRING);
 	}
 
-      (*emit_preamble_tbl[env->output_language]) (f, ext, env);
+	(*emit_preamble_tbl[env->output_language]) (f, ext, env);
 
-      for (p = obj; p; p = p->sibling)
-	{
-	  if (emit_tbl_tbl[global_env->output_language][p->tag] == NULL)
-	    die (no_line, "emit: bad tag %d", p->tag);
-	  if (xy_overlap_p (p, ext))
-	    (*emit_tbl_tbl[global_env->output_language][p->tag]) (f, p);
+	for (p = obj; p; p = p->sibling) {
+	    if (emit_tbl_tbl[global_env->output_language][p->tag] == NULL)
+		die(no_line, "emit: bad tag %d", p->tag);
+	    if (xy_overlap_p(p, ext))
+		(*emit_tbl_tbl[global_env->output_language][p->tag]) (f,
+								      p);
 	}
 
-      (*emit_postamble_tbl[env->output_language]) (f, env);
+	(*emit_postamble_tbl[env->output_language]) (f, env);
 
-      if (escape)
-	{
-	  escape += DOC_TEMPLATE_ESCAPE_STRING_LEN;
-	  fprintf (f, "%s", escape);
-	  if (strstr (escape, DOC_TEMPLATE_ESCAPE_STRING))
-	    warn (no_line,
-		  "more than one escape in document template; all but first ignored");
+	if (escape) {
+	    escape += DOC_TEMPLATE_ESCAPE_STRING_LEN;
+	    fprintf(f, "%s", escape);
+	    if (strstr(escape, DOC_TEMPLATE_ESCAPE_STRING))
+		warn(no_line,
+		     "more than one escape in document template; all but first ignored");
 	}
-      fprintf (f, "%% End sketch output\n");
+	fprintf(f, "%% End sketch output\n");
     }
 }
diff --git a/emit.h b/emit.h
index 18a8cd7..0d888b4 100644
--- a/emit.h
+++ b/emit.h
@@ -25,14 +25,14 @@ http://www.gnu.org/copyleft */
 #include "scene.h"
 #include "global.h"
 
-char *flt_str (char *buf, double f);
-void process_special (FILE * f, SPECIAL_OBJECT * special, SRC_LINE line);
+char *flt_str(char *buf, double f);
+void process_special(FILE * f, SPECIAL_OBJECT * special, SRC_LINE line);
 
-char *doc_template_from_file (char *file_name, int output_language);
+char *doc_template_from_file(char *file_name, int output_language);
 extern char standard_us_doc_template_file_name_flag[];
 extern char standard_euro_doc_template_file_name_flag[];
 
-void emit (FILE * f, OBJECT * obj, GLOBAL_ENV * env,
-	   char *doc_template_file_name);
+void emit(FILE * f, OBJECT * obj, GLOBAL_ENV * env,
+	  char *doc_template_file_name);
 
 #endif
diff --git a/error.c b/error.c
index 4a53482..b374348 100644
--- a/error.c
+++ b/error.c
@@ -25,117 +25,105 @@ http://www.gnu.org/copyleft */
 
 SRC_LINE no_line = { NULL, 0 };
 
-typedef enum error_type_t
-{
-  E_REMARK,
-  E_WARNING,
-  E_ERROR,
-  E_FATAL_ERROR,
-  E_N				// keep last; this is the number of error types
-}
-ERROR_TYPE;
+typedef enum error_type_t {
+    E_REMARK,
+    E_WARNING,
+    E_ERROR,
+    E_FATAL_ERROR,
+    E_N				// keep last; this is the number of error types
+} ERROR_TYPE;
 
 char *error_type_str[] = {
-  "remark",
-  "warning",
-  "error",
-  "fatal",
+    "remark",
+    "warning",
+    "error",
+    "fatal",
 };
 
 static int n_errors[E_N];	// assumes C initialization to zero
 
 static void
-print_error (ERROR_TYPE type, SRC_LINE line, char *fmt, va_list arg_list)
+print_error(ERROR_TYPE type, SRC_LINE line, char *fmt, va_list arg_list)
 {
-  n_errors[type]++;
-  if (line.file_name)
-    fprintf (stderr, "%s", line.file_name);
-  if (line.number > 0)
-    fprintf (stderr, "(%u) : ", line.number);
-  fprintf (stderr, "%s, ", error_type_str[type]);
-  vfprintf (stderr, fmt, arg_list);
-  fprintf (stderr, "\n");
+    n_errors[type]++;
+    if (line.file_name)
+	fprintf(stderr, "%s", line.file_name);
+    if (line.number > 0)
+	fprintf(stderr, "(%u) : ", line.number);
+    fprintf(stderr, "%s, ", error_type_str[type]);
+    vfprintf(stderr, fmt, arg_list);
+    fprintf(stderr, "\n");
 }
 
-void
-remark (SRC_LINE line, char *fmt, ...)
+void remark(SRC_LINE line, char *fmt, ...)
 {
-  va_list arg_list;
+    va_list arg_list;
 
-  va_start (arg_list, fmt);
-  print_error (E_REMARK, line, fmt, arg_list);
-  va_end (arg_list);
+    va_start(arg_list, fmt);
+    print_error(E_REMARK, line, fmt, arg_list);
+    va_end(arg_list);
 }
 
-void
-warn (SRC_LINE line, char *fmt, ...)
+void warn(SRC_LINE line, char *fmt, ...)
 {
-  va_list arg_list;
+    va_list arg_list;
 
-  va_start (arg_list, fmt);
-  print_error (E_WARNING, line, fmt, arg_list);
-  va_end (arg_list);
+    va_start(arg_list, fmt);
+    print_error(E_WARNING, line, fmt, arg_list);
+    va_end(arg_list);
 }
 
-void
-err (SRC_LINE line, char *fmt, ...)
+void err(SRC_LINE line, char *fmt, ...)
 {
-  va_list arg_list;
+    va_list arg_list;
 
-  va_start (arg_list, fmt);
-  print_error (E_ERROR, line, fmt, arg_list);
-  va_end (arg_list);
+    va_start(arg_list, fmt);
+    print_error(E_ERROR, line, fmt, arg_list);
+    va_end(arg_list);
 }
 
-void
-die (SRC_LINE line, char *fmt, ...)
+void die(SRC_LINE line, char *fmt, ...)
 {
-  va_list arg_list;
+    va_list arg_list;
 
-  va_start (arg_list, fmt);
-  print_error (E_FATAL_ERROR, line, fmt, arg_list);
-  va_end (arg_list);
-  report_errors ();
+    va_start(arg_list, fmt);
+    print_error(E_FATAL_ERROR, line, fmt, arg_list);
+    va_end(arg_list);
+    report_errors();
 }
 
-int
-trouble_p (void)
+int trouble_p(void)
 {
-  return n_errors[E_ERROR] > 0 || n_errors[E_FATAL_ERROR] > 0;
+    return n_errors[E_ERROR] > 0 || n_errors[E_FATAL_ERROR] > 0;
 }
 
-void
-report_errors (void)
+void report_errors(void)
 {
-  int i, n_total = 0;
-
-  // start printing summary
-  fprintf (stderr, "summary: ");
-  for (i = 0; i < E_N; i++)
-    {
-      if (n_errors[i] > 0)
-	{
-	  if (n_total > 0)
-	    fprintf (stderr, ", ");
-	  fprintf (stderr, "%d %s", n_errors[i], error_type_str[i]);
-	  n_total++;
+    int i, n_total = 0;
+
+    // start printing summary
+    fprintf(stderr, "summary: ");
+    for (i = 0; i < E_N; i++) {
+	if (n_errors[i] > 0) {
+	    if (n_total > 0)
+		fprintf(stderr, ", ");
+	    fprintf(stderr, "%d %s", n_errors[i], error_type_str[i]);
+	    n_total++;
 	}
     }
 
-  // see if we need to abort
-  if (trouble_p ())
-    {
-      fprintf (stderr, "\nquitting...\n");
-      exit (1);
+    // see if we need to abort
+    if (trouble_p()) {
+	fprintf(stderr, "\nquitting...\n");
+	exit(1);
     }
-  // not aborting, so finish up the summary
-  if (n_total == 0)
-    {
-      fprintf (stderr, "no errors");
+    // not aborting, so finish up the summary
+    if (n_total == 0) {
+	fprintf(stderr, "no errors");
     }
-  fprintf (stderr, "\n");
+    fprintf(stderr, "\n");
 
-  // zero the error counters
-  for (i = 0; i < E_N; i++)
-    n_errors[i] = 0;
+    // zero the error counters
+    for (i = 0; i < E_N; i++)
+	n_errors[i] = 0;
 }
diff --git a/error.h b/error.h
index a9ad563..30c01ef 100644
--- a/error.h
+++ b/error.h
@@ -21,22 +21,20 @@ http://www.gnu.org/copyleft */
 #ifndef __ERROR_H
 #define __ERROR_H
 
-typedef struct source_line_t
-{
-  char *file_name;
-  int include_p;
-  int number;
-}
-SRC_LINE;
+typedef struct source_line_t {
+    char *file_name;
+    int include_p;
+    int number;
+} SRC_LINE;
 
 extern SRC_LINE no_line;
 #define is_no_line_p(L) ((L).number <= 0)
 
-void remark (SRC_LINE line, char *fmt, ...);
-void warn (SRC_LINE line, char *fmt, ...);
-void err (SRC_LINE line, char *fmt, ...);
-void die (SRC_LINE line, char *fmt, ...);
-int trouble_p (void);
-void report_errors (void);
+void remark(SRC_LINE line, char *fmt, ...);
+void warn(SRC_LINE line, char *fmt, ...);
+void err(SRC_LINE line, char *fmt, ...);
+void die(SRC_LINE line, char *fmt, ...);
+int trouble_p(void);
+void report_errors(void);
 
 #endif
diff --git a/expr.c b/expr.c
index 6d78c52..086eac0 100644
--- a/expr.c
+++ b/expr.c
@@ -26,556 +26,485 @@ http://www.gnu.org/copyleft */
 #define F "%.3f"
 
 char *expr_val_type_str[] = {
-  "float",
-  "point",
-  "vector",
-  "transform",
+    "float",
+    "point",
+    "vector",
+    "transform",
 };
 
 // set expression value to given type and value
-void
-set_float (EXPR_VAL * r, FLOAT val)
+void set_float(EXPR_VAL * r, FLOAT val)
 {
-  r->tag = E_FLOAT;
-  r->val.flt = val;
+    r->tag = E_FLOAT;
+    r->val.flt = val;
 }
 
-void
-print_float (FILE * f, EXPR_VAL * val)
+void print_float(FILE * f, EXPR_VAL * val)
 {
-  fprintf (f, F, val->val.flt);
+    fprintf(f, F, val->val.flt);
 }
 
-void
-set_point (EXPR_VAL * r, POINT_3D val)
+void set_point(EXPR_VAL * r, POINT_3D val)
 {
-  r->tag = E_POINT;
-  copy_pt_3d (r->val.pt, val);
+    r->tag = E_POINT;
+    copy_pt_3d(r->val.pt, val);
 }
 
-void
-print_point (FILE * f, EXPR_VAL * val)
+void print_point(FILE * f, EXPR_VAL * val)
 {
-  FLOAT *p = val->val.pt;
-  fprintf (f, "(" F "," F "," F ")", p[X], p[Y], p[Z]);
+    FLOAT *p = val->val.pt;
+    fprintf(f, "(" F "," F "," F ")", p[X], p[Y], p[Z]);
 }
 
-void
-set_vector (EXPR_VAL * r, VECTOR_3D val)
+void set_vector(EXPR_VAL * r, VECTOR_3D val)
 {
-  r->tag = E_VECTOR;
-  copy_vec_3d (r->val.vec, val);
+    r->tag = E_VECTOR;
+    copy_vec_3d(r->val.vec, val);
 }
 
-void
-print_vector (FILE * f, EXPR_VAL * val)
+void print_vector(FILE * f, EXPR_VAL * val)
 {
-  FLOAT *v = val->val.vec;
-  fprintf (f, "[" F "," F "," F "]", v[X], v[Y], v[Z]);
+    FLOAT *v = val->val.vec;
+    fprintf(f, "[" F "," F "," F "]", v[X], v[Y], v[Z]);
 }
 
-void
-set_transform (EXPR_VAL * r, TRANSFORM val)
+void set_transform(EXPR_VAL * r, TRANSFORM val)
 {
-  r->tag = E_TRANSFORM;
-  copy_transform (r->val.xf, val);
+    r->tag = E_TRANSFORM;
+    copy_transform(r->val.xf, val);
 }
 
-void
-print_transform (FILE * f, EXPR_VAL * val)
+void print_transform(FILE * f, EXPR_VAL * val)
 {
-  FLOAT *xf = val->val.xf;
-  int i, j;
+    FLOAT *xf = val->val.xf;
+    int i, j;
 
-  fprintf (f, "[");
-  for (i = 0; i < 4; i++)
-    {
-      fprintf (f, "[");
-      for (j = 0; j < 16; j += 4)
-	fprintf (f, "%s" F, (j == 0) ? "" : ",", xf[i + j]);
-      fprintf (f, "]");
+    fprintf(f, "[");
+    for (i = 0; i < 4; i++) {
+	fprintf(f, "[");
+	for (j = 0; j < 16; j += 4)
+	    fprintf(f, "%s" F, (j == 0) ? "" : ",", xf[i + j]);
+	fprintf(f, "]");
     }
-  fprintf (f, "]");
+    fprintf(f, "]");
 }
 
 // coerce an expression value to given type 
 // generate error message if it can't be done
-void
-coerce_to_float (EXPR_VAL * r, FLOAT * val, SRC_LINE line)
+void coerce_to_float(EXPR_VAL * r, FLOAT * val, SRC_LINE line)
 {
-  if (r->tag == E_FLOAT)
-    {
-      *val = r->val.flt;
-    }
-  else
-    {
-      *val = 0;
-      err (line, "expected float, found %s", expr_val_type_str[r->tag]);
+    if (r->tag == E_FLOAT) {
+	*val = r->val.flt;
+    } else {
+	*val = 0;
+	err(line, "expected float, found %s", expr_val_type_str[r->tag]);
     }
 }
 
-void
-coerce_to_point (EXPR_VAL * r, POINT_3D val, SRC_LINE line)
+void coerce_to_point(EXPR_VAL * r, POINT_3D val, SRC_LINE line)
 {
-  if (r->tag == E_POINT)
-    {
-      copy_pt_3d (val, r->val.pt);
-    }
-  else
-    {
-      val[X] = val[Y] = val[Z] = 0;
-      err (line, "expected point, found %s", expr_val_type_str[r->tag]);
+    if (r->tag == E_POINT) {
+	copy_pt_3d(val, r->val.pt);
+    } else {
+	val[X] = val[Y] = val[Z] = 0;
+	err(line, "expected point, found %s", expr_val_type_str[r->tag]);
     }
 }
 
-void
-coerce_to_vector (EXPR_VAL * r, VECTOR_3D val, SRC_LINE line)
+void coerce_to_vector(EXPR_VAL * r, VECTOR_3D val, SRC_LINE line)
 {
-  if (r->tag == E_VECTOR)
-    {
-      copy_vec_3d (val, r->val.vec);
-    }
-  else
-    {
-      val[X] = val[Y] = val[Z] = 0;
-      err (line, "expected vector, found %s", expr_val_type_str[r->tag]);
+    if (r->tag == E_VECTOR) {
+	copy_vec_3d(val, r->val.vec);
+    } else {
+	val[X] = val[Y] = val[Z] = 0;
+	err(line, "expected vector, found %s", expr_val_type_str[r->tag]);
     }
 }
 
-void
-coerce_to_transform (EXPR_VAL * r, TRANSFORM val, SRC_LINE line)
+void coerce_to_transform(EXPR_VAL * r, TRANSFORM val, SRC_LINE line)
 {
-  if (r->tag == E_TRANSFORM)
-    {
-      copy_transform (val, r->val.xf);
-    }
-  else
-    {
-      set_ident (val);
-      err (line, "expected transform, found %s", expr_val_type_str[r->tag]);
+    if (r->tag == E_TRANSFORM) {
+	copy_transform(val, r->val.xf);
+    } else {
+	set_ident(val);
+	err(line, "expected transform, found %s",
+	    expr_val_type_str[r->tag]);
     }
 }
 
 typedef void (*PRINT_FUNC) (FILE *, EXPR_VAL *);
 
 static PRINT_FUNC print_expr_val_tbl[] = {
-  print_float,
-  print_point,
-  print_vector,
-  print_transform,
+    print_float,
+    print_point,
+    print_vector,
+    print_transform,
 };
 
-void
-print_expr_val (FILE * f, EXPR_VAL * r)
+void print_expr_val(FILE * f, EXPR_VAL * r)
 {
-  (*print_expr_val_tbl[r->tag]) (f, r);
+    (*print_expr_val_tbl[r->tag]) (f, r);
 }
 
 #define HASH(A, B) (((A) << 2) | (B))
 
-void
-do_add (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
-{
-  switch (HASH (a->tag, b->tag))
-    {
-    case HASH (E_FLOAT, E_FLOAT):
-      set_float (r, a->val.flt + b->val.flt);
-      break;
-    case HASH (E_POINT, E_VECTOR):
-      r->tag = E_POINT;
-      add_vec_to_pt_3d (r->val.pt, a->val.pt, b->val.vec);
-      break;
-    case HASH (E_VECTOR, E_POINT):
-      r->tag = E_POINT;
-      add_vec_to_pt_3d (r->val.pt, b->val.pt, a->val.vec);
-      break;
-    case HASH (E_VECTOR, E_VECTOR):
-      r->tag = E_VECTOR;
-      add_vecs_3d (r->val.vec, a->val.vec, b->val.vec);
-      break;
+void do_add(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
+{
+    switch (HASH(a->tag, b->tag)) {
+    case HASH(E_FLOAT, E_FLOAT):
+	set_float(r, a->val.flt + b->val.flt);
+	break;
+    case HASH(E_POINT, E_VECTOR):
+	r->tag = E_POINT;
+	add_vec_to_pt_3d(r->val.pt, a->val.pt, b->val.vec);
+	break;
+    case HASH(E_VECTOR, E_POINT):
+	r->tag = E_POINT;
+	add_vec_to_pt_3d(r->val.pt, b->val.pt, a->val.vec);
+	break;
+    case HASH(E_VECTOR, E_VECTOR):
+	r->tag = E_VECTOR;
+	add_vecs_3d(r->val.vec, a->val.vec, b->val.vec);
+	break;
     default:
-      err (line, "operands of + (types %s and %s) cannot be added",
-	   expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
-      set_float (r, 0);
-      break;
+	err(line, "operands of + (types %s and %s) cannot be added",
+	    expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
+	set_float(r, 0);
+	break;
     }
 }
 
-void
-do_sub (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
-{
-  switch (HASH (a->tag, b->tag))
-    {
-    case HASH (E_FLOAT, E_FLOAT):
-      set_float (r, a->val.flt - b->val.flt);
-      break;
-    case HASH (E_POINT, E_POINT):
-      r->tag = E_VECTOR;
-      sub_pts_3d (r->val.vec, a->val.pt, b->val.pt);
-      break;
-    case HASH (E_POINT, E_VECTOR):
-      r->tag = E_POINT;
-      add_scaled_vec_to_pt_3d (r->val.pt, a->val.pt, b->val.vec, -1);
-      break;
-    case HASH (E_VECTOR, E_VECTOR):
-      r->tag = E_VECTOR;
-      sub_vecs_3d (r->val.vec, a->val.vec, b->val.vec);
-      break;
+void do_sub(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
+{
+    switch (HASH(a->tag, b->tag)) {
+    case HASH(E_FLOAT, E_FLOAT):
+	set_float(r, a->val.flt - b->val.flt);
+	break;
+    case HASH(E_POINT, E_POINT):
+	r->tag = E_VECTOR;
+	sub_pts_3d(r->val.vec, a->val.pt, b->val.pt);
+	break;
+    case HASH(E_POINT, E_VECTOR):
+	r->tag = E_POINT;
+	add_scaled_vec_to_pt_3d(r->val.pt, a->val.pt, b->val.vec, -1);
+	break;
+    case HASH(E_VECTOR, E_VECTOR):
+	r->tag = E_VECTOR;
+	sub_vecs_3d(r->val.vec, a->val.vec, b->val.vec);
+	break;
     default:
-      err (line, "operands of - (types %s and %s) cannot be subtracted",
-	   expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
-      set_float (r, 0);
-      break;
+	err(line, "operands of - (types %s and %s) cannot be subtracted",
+	    expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
+	set_float(r, 0);
+	break;
     }
 }
 
-void
-do_mul (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
-{
-  switch (HASH (a->tag, b->tag))
-    {
-    case HASH (E_FLOAT, E_FLOAT):
-      set_float (r, a->val.flt * b->val.flt);
-      break;
-    case HASH (E_VECTOR, E_FLOAT):
-      r->tag = E_VECTOR;
-      scale_vec_3d (r->val.vec, a->val.vec, b->val.flt);
-      break;
-    case HASH (E_FLOAT, E_VECTOR):
-      r->tag = E_VECTOR;
-      scale_vec_3d (r->val.vec, b->val.vec, a->val.flt);
-      break;
-    case HASH (E_VECTOR, E_VECTOR):
-      r->tag = E_VECTOR;
-      cross (r->val.vec, a->val.vec, b->val.vec);
-      break;
-    case HASH (E_TRANSFORM, E_TRANSFORM):
-      r->tag = E_TRANSFORM;
-      compose (r->val.xf, a->val.xf, b->val.xf);
-      break;
-    case HASH (E_TRANSFORM, E_POINT):
-      r->tag = E_POINT;
-      transform_pt_3d (r->val.pt, a->val.xf, b->val.pt);
-      break;
-    case HASH (E_TRANSFORM, E_VECTOR):
-      r->tag = E_VECTOR;
-      transform_vec_3d (r->val.vec, a->val.xf, b->val.vec);
-      break;
+void do_mul(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
+{
+    switch (HASH(a->tag, b->tag)) {
+    case HASH(E_FLOAT, E_FLOAT):
+	set_float(r, a->val.flt * b->val.flt);
+	break;
+    case HASH(E_VECTOR, E_FLOAT):
+	r->tag = E_VECTOR;
+	scale_vec_3d(r->val.vec, a->val.vec, b->val.flt);
+	break;
+    case HASH(E_FLOAT, E_VECTOR):
+	r->tag = E_VECTOR;
+	scale_vec_3d(r->val.vec, b->val.vec, a->val.flt);
+	break;
+    case HASH(E_VECTOR, E_VECTOR):
+	r->tag = E_VECTOR;
+	cross(r->val.vec, a->val.vec, b->val.vec);
+	break;
+    case HASH(E_TRANSFORM, E_TRANSFORM):
+	r->tag = E_TRANSFORM;
+	compose(r->val.xf, a->val.xf, b->val.xf);
+	break;
+    case HASH(E_TRANSFORM, E_POINT):
+	r->tag = E_POINT;
+	transform_pt_3d(r->val.pt, a->val.xf, b->val.pt);
+	break;
+    case HASH(E_TRANSFORM, E_VECTOR):
+	r->tag = E_VECTOR;
+	transform_vec_3d(r->val.vec, a->val.xf, b->val.vec);
+	break;
     default:
-      err (line, "operands of * (types %s and %s) cannot be multiplied",
-	   expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
-      set_float (r, 0);
-      break;
+	err(line, "operands of * (types %s and %s) cannot be multiplied",
+	    expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
+	set_float(r, 0);
+	break;
     }
 }
 
-void
-do_thn (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
-{
-  switch (HASH (a->tag, b->tag))
-    {
-    case HASH (E_TRANSFORM, E_TRANSFORM):
-      r->tag = E_TRANSFORM;
-      compose (r->val.xf, b->val.xf, a->val.xf);
-      break;
-    case HASH (E_POINT, E_TRANSFORM):
-      r->tag = E_POINT;
-      transform_pt_3d (r->val.pt, b->val.xf, a->val.pt);
-      break;
-    case HASH (E_VECTOR, E_TRANSFORM):
-      r->tag = E_VECTOR;
-      transform_vec_3d (r->val.vec, b->val.xf, a->val.vec);
-      break;
+void do_thn(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
+{
+    switch (HASH(a->tag, b->tag)) {
+    case HASH(E_TRANSFORM, E_TRANSFORM):
+	r->tag = E_TRANSFORM;
+	compose(r->val.xf, b->val.xf, a->val.xf);
+	break;
+    case HASH(E_POINT, E_TRANSFORM):
+	r->tag = E_POINT;
+	transform_pt_3d(r->val.pt, b->val.xf, a->val.pt);
+	break;
+    case HASH(E_VECTOR, E_TRANSFORM):
+	r->tag = E_VECTOR;
+	transform_vec_3d(r->val.vec, b->val.xf, a->val.vec);
+	break;
     default:
-      err (line,
-	   "operands of 'then' (types %s and %s) cannot be multiplied",
-	   expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
-      set_float (r, 0);
-      break;
+	err(line,
+	    "operands of 'then' (types %s and %s) cannot be multiplied",
+	    expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
+	set_float(r, 0);
+	break;
     }
 }
 
-static FLOAT
-safe_dvd (FLOAT a, FLOAT b, SRC_LINE line)
+static FLOAT safe_dvd(FLOAT a, FLOAT b, SRC_LINE line)
 {
-  if (-FLOAT_EPS < b && b < FLOAT_EPS)
-    {
-      err (line, "attempt to divide " F " by zero", a);
-      return 0;
+    if (-FLOAT_EPS < b && b < FLOAT_EPS) {
+	err(line, "attempt to divide " F " by zero", a);
+	return 0;
     }
-  return a / b;
-}
-
-void
-do_dvd (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
-{
-  switch (HASH (a->tag, b->tag))
-    {
-    case HASH (E_FLOAT, E_FLOAT):
-      set_float (r, safe_dvd (a->val.flt, b->val.flt, line));
-      break;
-    case HASH (E_VECTOR, E_FLOAT):
-      r->tag = E_VECTOR;
-      scale_vec_3d (r->val.vec, a->val.vec, safe_dvd (1, b->val.flt, line));
-      break;
-    case HASH (E_FLOAT, E_VECTOR):
-      r->tag = E_VECTOR;
-      scale_vec_3d (r->val.vec, b->val.vec, safe_dvd (1, a->val.flt, line));
-      break;
+    return a / b;
+}
+
+void do_dvd(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
+{
+    switch (HASH(a->tag, b->tag)) {
+    case HASH(E_FLOAT, E_FLOAT):
+	set_float(r, safe_dvd(a->val.flt, b->val.flt, line));
+	break;
+    case HASH(E_VECTOR, E_FLOAT):
+	r->tag = E_VECTOR;
+	scale_vec_3d(r->val.vec, a->val.vec,
+		     safe_dvd(1, b->val.flt, line));
+	break;
+    case HASH(E_FLOAT, E_VECTOR):
+	r->tag = E_VECTOR;
+	scale_vec_3d(r->val.vec, b->val.vec,
+		     safe_dvd(1, a->val.flt, line));
+	break;
     default:
-      err (line, "operands of / (types %s and %s) cannot be divided",
-	   expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
-      set_float (r, 0);
-      break;
+	err(line, "operands of / (types %s and %s) cannot be divided",
+	    expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
+	set_float(r, 0);
+	break;
     }
 }
 
-void
-do_dot (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
-{
-  switch (HASH (a->tag, b->tag))
-    {
-    case HASH (E_VECTOR, E_VECTOR):
-      r->tag = E_FLOAT;
-      r->val.flt = dot_3d (a->val.vec, b->val.vec);
-      break;
-    case HASH (E_FLOAT, E_FLOAT):
-    case HASH (E_VECTOR, E_FLOAT):
-    case HASH (E_FLOAT, E_VECTOR):
-    case HASH (E_TRANSFORM, E_TRANSFORM):
-    case HASH (E_TRANSFORM, E_POINT):
-    case HASH (E_TRANSFORM, E_VECTOR):
-      do_mul (r, a, b, line);
-      break;
+void do_dot(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
+{
+    switch (HASH(a->tag, b->tag)) {
+    case HASH(E_VECTOR, E_VECTOR):
+	r->tag = E_FLOAT;
+	r->val.flt = dot_3d(a->val.vec, b->val.vec);
+	break;
+    case HASH(E_FLOAT, E_FLOAT):
+    case HASH(E_VECTOR, E_FLOAT):
+    case HASH(E_FLOAT, E_VECTOR):
+    case HASH(E_TRANSFORM, E_TRANSFORM):
+    case HASH(E_TRANSFORM, E_POINT):
+    case HASH(E_TRANSFORM, E_VECTOR):
+	do_mul(r, a, b, line);
+	break;
     default:
-      err (line, "operands of dot (types %s and %s) cannot be multiplied",
-	   expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
-      set_float (r, 0);
-      break;
+	err(line, "operands of dot (types %s and %s) cannot be multiplied",
+	    expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
+	set_float(r, 0);
+	break;
     }
 }
 
-void
-do_index (EXPR_VAL * r, EXPR_VAL * a, int index, SRC_LINE line)
+void do_index(EXPR_VAL * r, EXPR_VAL * a, int index, SRC_LINE line)
 {
-  switch (a->tag)
-    {
+    switch (a->tag) {
     case E_VECTOR:
-      set_float (r, a->val.vec[index]);
-      break;
+	set_float(r, a->val.vec[index]);
+	break;
     case E_POINT:
-      set_float (r, a->val.pt[index]);
-      break;
+	set_float(r, a->val.pt[index]);
+	break;
     default:
-      err (line,
-	   "operand of 'index is a %s and should be a point or a vector",
-	   expr_val_type_str[a->tag]);
-      set_float (r, 0);
-      break;
+	err(line,
+	    "operand of 'index is a %s and should be a point or a vector",
+	    expr_val_type_str[a->tag]);
+	set_float(r, 0);
+	break;
     }
 }
 
-void
-do_inverse (TRANSFORM inv, TRANSFORM xf, SRC_LINE line)
+void do_inverse(TRANSFORM inv, TRANSFORM xf, SRC_LINE line)
 {
-  FLOAT det;
-  invert (inv, &det, xf, 1e-4);
-  if (det == 0)
-    {
-      err (line, "inverse of singular transform");
-      set_ident (inv);
+    FLOAT det;
+    invert(inv, &det, xf, 1e-4);
+    if (det == 0) {
+	err(line, "inverse of singular transform");
+	set_ident(inv);
     }
 }
 
 // put a^n into r;  r and a can't both be the same storage
 // exploits a^(2n) = (a^n)^2 to reduce work
-void
-do_transform_power (TRANSFORM r, TRANSFORM a, int n, SRC_LINE line)
-{
-  if (n < 0)
-    {
-      TRANSFORM inv;
-      do_inverse (inv, a, line);
-      do_transform_power (r, inv, -n, line);
-    }
-  else if (n == 0)
-    {
-      set_ident (r);
-    }
-  else
-    {
-      int m = (int) bit (30);
-      while ((m & n) == 0)
-	m >>= 1;
-      copy_transform (r, a);
-      for (m >>= 1; m; m >>= 1)
-	{
-	  compose (r, r, r);
-	  if (m & n)
-	    compose (r, r, a);
+void do_transform_power(TRANSFORM r, TRANSFORM a, int n, SRC_LINE line)
+{
+    if (n < 0) {
+	TRANSFORM inv;
+	do_inverse(inv, a, line);
+	do_transform_power(r, inv, -n, line);
+    } else if (n == 0) {
+	set_ident(r);
+    } else {
+	int m = (int) bit(30);
+	while ((m & n) == 0)
+	    m >>= 1;
+	copy_transform(r, a);
+	for (m >>= 1; m; m >>= 1) {
+	    compose(r, r, r);
+	    if (m & n)
+		compose(r, r, a);
 	}
     }
 }
 
-int
-to_integer (FLOAT x, int *n)
+int to_integer(FLOAT x, int *n)
 {
-  double frac_part, int_part;
+    double frac_part, int_part;
 
-  frac_part = modf (x, &int_part);
-  if (-1e9 <= int_part && int_part <= 1e9)
-    {
-      *n = (int) int_part;
-      return 1;
+    frac_part = modf(x, &int_part);
+    if (-1e9 <= int_part && int_part <= 1e9) {
+	*n = (int) int_part;
+	return 1;
     }
-  return 0;
+    return 0;
 }
 
-void
-do_pwr (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
+void do_pwr(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
 {
-  TRANSFORM xf_pwr;
-  int n;
+    TRANSFORM xf_pwr;
+    int n;
 
-  switch (HASH (a->tag, b->tag))
-    {
-    case HASH (E_FLOAT, E_FLOAT):
-      set_float (r, pow (a->val.flt, b->val.flt));
-      break;
-    case HASH (E_TRANSFORM, E_FLOAT):
-      if (to_integer (b->val.flt, &n))
-	{
-	  do_transform_power (xf_pwr, a->val.xf, n, line);
+    switch (HASH(a->tag, b->tag)) {
+    case HASH(E_FLOAT, E_FLOAT):
+	set_float(r, pow(a->val.flt, b->val.flt));
+	break;
+    case HASH(E_TRANSFORM, E_FLOAT):
+	if (to_integer(b->val.flt, &n)) {
+	    do_transform_power(xf_pwr, a->val.xf, n, line);
+	} else {
+	    err(line, "transform power out of domain (integer -1e9..1e9)");
+	    set_ident(xf_pwr);
 	}
-      else
-	{
-	  err (line, "transform power out of domain (integer -1e9..1e9)");
-	  set_ident (xf_pwr);
-	}
-      set_transform (r, xf_pwr);
-      break;
+	set_transform(r, xf_pwr);
+	break;
     default:
-      err (line, "operands of ^ (types %s and %s) must be type float",
-	   expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
-      set_float (r, 0);
-      break;
+	err(line, "operands of ^ (types %s and %s) must be type float",
+	    expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
+	set_float(r, 0);
+	break;
     }
 }
 
-void
-do_mag (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
+void do_mag(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
 {
-  switch (a->tag)
-    {
+    switch (a->tag) {
     case E_FLOAT:
-      set_float (r, a->val.flt >= 0 ? a->val.flt : -a->val.flt);
-      break;
+	set_float(r, a->val.flt >= 0 ? a->val.flt : -a->val.flt);
+	break;
     case E_VECTOR:
-      set_float (r, length_vec_3d (a->val.vec));
-      break;
+	set_float(r, length_vec_3d(a->val.vec));
+	break;
     default:
-      err (line, "operand of magnitude operator (type %s) must be vector",
-	   expr_val_type_str[a->tag]);
-      *r = *a;
-      break;
+	err(line, "operand of magnitude operator (type %s) must be vector",
+	    expr_val_type_str[a->tag]);
+	*r = *a;
+	break;
     }
 }
 
-void
-do_neg (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
+void do_neg(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
 {
-  switch (a->tag)
-    {
+    switch (a->tag) {
     case E_FLOAT:
-      set_float (r, -a->val.flt);
-      break;
+	set_float(r, -a->val.flt);
+	break;
     case E_VECTOR:
-      r->tag = E_VECTOR;
-      negate_vec_3d (r->val.vec, a->val.vec);
-      break;
+	r->tag = E_VECTOR;
+	negate_vec_3d(r->val.vec, a->val.vec);
+	break;
     default:
-      err (line, "operand of unary minus (type %s) cannot be negated",
-	   expr_val_type_str[a->tag]);
-      *r = *a;
-      break;
+	err(line, "operand of unary minus (type %s) cannot be negated",
+	    expr_val_type_str[a->tag]);
+	*r = *a;
+	break;
     }
 }
 
-void
-do_unit (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
+void do_unit(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
 {
-  if (a->tag == E_VECTOR)
-    {
-      r->tag = E_VECTOR;
-      find_unit_vec_3d (r->val.vec, a->val.vec);
-    }
-  else
-    {
-      static VECTOR_3D k = { 0, 0, 1 };
-      err (line, "operand of unit operator (type %s) must be vector",
-	   expr_val_type_str[a->tag]);
-      set_vector (r, k);
+    if (a->tag == E_VECTOR) {
+	r->tag = E_VECTOR;
+	find_unit_vec_3d(r->val.vec, a->val.vec);
+    } else {
+	static VECTOR_3D k = { 0, 0, 1 };
+	err(line, "operand of unit operator (type %s) must be vector",
+	    expr_val_type_str[a->tag]);
+	set_vector(r, k);
     }
 }
 
-void
-do_sqrt (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
+void do_sqrt(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
 {
-  switch (a->tag)
-    {
+    switch (a->tag) {
     case E_FLOAT:
-      if (a->val.flt < 0)
-	err (line, "square root of negative number");
-      set_float (r, sqrt (a->val.flt));
-      break;
+	if (a->val.flt < 0)
+	    err(line, "square root of negative number");
+	set_float(r, sqrt(a->val.flt));
+	break;
     default:
-      err (line, "operand of sqrt (type %s) must be float",
-	   expr_val_type_str[a->tag]);
-      break;
+	err(line, "operand of sqrt (type %s) must be float",
+	    expr_val_type_str[a->tag]);
+	break;
     }
 }
 
-void
-do_sin (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
+void do_sin(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
 {
-  switch (a->tag)
-    {
+    switch (a->tag) {
     case E_FLOAT:
-      set_float (r, sin ((PI / 180) * a->val.flt));
-      break;
+	set_float(r, sin((PI / 180) * a->val.flt));
+	break;
     default:
-      err (line, "operand of sin (type %s) must be float",
-	   expr_val_type_str[a->tag]);
-      break;
+	err(line, "operand of sin (type %s) must be float",
+	    expr_val_type_str[a->tag]);
+	break;
     }
 }
 
-void
-do_cos (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
+void do_cos(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line)
 {
-  switch (a->tag)
-    {
+    switch (a->tag) {
     case E_FLOAT:
-      set_float (r, cos ((PI / 180) * a->val.flt));
-      break;
+	set_float(r, cos((PI / 180) * a->val.flt));
+	break;
     default:
-      err (line, "operand of cos (type %s) must be float",
-	   expr_val_type_str[a->tag]);
-      break;
+	err(line, "operand of cos (type %s) must be float",
+	    expr_val_type_str[a->tag]);
+	break;
     }
 }
 
-void
-do_atan2 (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
+void do_atan2(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line)
 {
-  switch (HASH (a->tag, b->tag))
-    {
-    case HASH (E_FLOAT, E_FLOAT):
-      set_float (r, (180 / PI) * atan2 (a->val.flt, b->val.flt));
-      break;
+    switch (HASH(a->tag, b->tag)) {
+    case HASH(E_FLOAT, E_FLOAT):
+	set_float(r, (180 / PI) * atan2(a->val.flt, b->val.flt));
+	break;
     default:
-      err (line, "operands of atan2 (types %s, %s) must be float",
-	   expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
-      break;
+	err(line, "operands of atan2 (types %s, %s) must be float",
+	    expr_val_type_str[a->tag], expr_val_type_str[b->tag]);
+	break;
     }
 }
diff --git a/expr.h b/expr.h
index a7577e2..0455809 100644
--- a/expr.h
+++ b/expr.h
@@ -26,63 +26,57 @@ http://www.gnu.org/copyleft */
 
 // used by parser for dynamically typed expression evaluation
 // must match expr_val_type_str[] in expr.c
-typedef enum expr_typa_t
-{
-  E_FLOAT,
-  E_POINT,
-  E_VECTOR,
-  E_TRANSFORM,
-}
-EXPR_TYPE;
+typedef enum expr_typa_t {
+    E_FLOAT,
+    E_POINT,
+    E_VECTOR,
+    E_TRANSFORM,
+} EXPR_TYPE;
 
 extern char *expr_val_type_str[];
 
-typedef struct expr_val_t
-{
-  EXPR_TYPE tag;
-  union
-  {
-    FLOAT flt;
-    POINT_3D pt;
-    VECTOR_3D vec;
-    TRANSFORM xf;
-  }
-  val;
-}
-EXPR_VAL;
+typedef struct expr_val_t {
+    EXPR_TYPE tag;
+    union {
+	FLOAT flt;
+	POINT_3D pt;
+	VECTOR_3D vec;
+	TRANSFORM xf;
+    } val;
+} EXPR_VAL;
 
 #define EXPR_TYPE_IS(E, T)  ((E)->tag == (T))
 
 // set expression value to given type and value
-void set_float (EXPR_VAL * r, FLOAT val);
-void set_point (EXPR_VAL * r, POINT_3D val);
-void set_vector (EXPR_VAL * r, VECTOR_3D val);
-void set_transform (EXPR_VAL * r, TRANSFORM val);
+void set_float(EXPR_VAL * r, FLOAT val);
+void set_point(EXPR_VAL * r, POINT_3D val);
+void set_vector(EXPR_VAL * r, VECTOR_3D val);
+void set_transform(EXPR_VAL * r, TRANSFORM val);
 
 // coerce an expression value to given type 
 // generate error message if it can't be done
-void coerce_to_float (EXPR_VAL * r, FLOAT * val, SRC_LINE line);
-void coerce_to_point (EXPR_VAL * r, POINT_3D val, SRC_LINE line);
-void coerce_to_vector (EXPR_VAL * r, VECTOR_3D val, SRC_LINE line);
-void coerce_to_transform (EXPR_VAL * r, TRANSFORM val, SRC_LINE line);
+void coerce_to_float(EXPR_VAL * r, FLOAT * val, SRC_LINE line);
+void coerce_to_point(EXPR_VAL * r, POINT_3D val, SRC_LINE line);
+void coerce_to_vector(EXPR_VAL * r, VECTOR_3D val, SRC_LINE line);
+void coerce_to_transform(EXPR_VAL * r, TRANSFORM val, SRC_LINE line);
 
-void print_expr_val (FILE * f, EXPR_VAL * r);
+void print_expr_val(FILE * f, EXPR_VAL * r);
 
-void do_add (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
-void do_sub (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
-void do_mul (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
-void do_thn (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
-void do_dvd (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
-void do_dot (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
-void do_pwr (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
-void do_mag (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
-void do_neg (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
-void do_unit (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
-void do_sqrt (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
-void do_sin (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
-void do_cos (EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
-void do_index (EXPR_VAL * r, EXPR_VAL * a, int index, SRC_LINE line);
-void do_atan2 (EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
-void do_inverse (TRANSFORM inv, TRANSFORM xf, SRC_LINE line);
+void do_add(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
+void do_sub(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
+void do_mul(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
+void do_thn(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
+void do_dvd(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
+void do_dot(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
+void do_pwr(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
+void do_mag(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
+void do_neg(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
+void do_unit(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
+void do_sqrt(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
+void do_sin(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
+void do_cos(EXPR_VAL * r, EXPR_VAL * a, SRC_LINE line);
+void do_index(EXPR_VAL * r, EXPR_VAL * a, int index, SRC_LINE line);
+void do_atan2(EXPR_VAL * r, EXPR_VAL * a, EXPR_VAL * b, SRC_LINE line);
+void do_inverse(TRANSFORM inv, TRANSFORM xf, SRC_LINE line);
 
 #endif
diff --git a/geometry.c b/geometry.c
index d6a167f..b71b3bc 100644
--- a/geometry.c
+++ b/geometry.c
@@ -34,1319 +34,1203 @@ VECTOR_2D J_2d = { 0, 1 };
 VECTOR_3D I_3d = { 1, 0, 0 };
 VECTOR_3D J_3d = { 0, 1, 0 };
 VECTOR_3D K_3d = { 0, 0, 1 };
+
 TRANSFORM identity = {
-  1, 0, 0, 0,
-  0, 1, 0, 0,
-  0, 0, 1, 0,
-  0, 0, 0, 1
+    1, 0, 0, 0,
+    0, 1, 0, 0,
+    0, 0, 1, 0,
+    0, 0, 0, 1
 };
 
 // numerics 
 
-FLOAT
-max_float (FLOAT x, FLOAT y)
+FLOAT max_float(FLOAT x, FLOAT y)
 {
-  return x > y ? x : y;
+    return x > y ? x : y;
 }
 
-FLOAT
-min_float (FLOAT x, FLOAT y)
+FLOAT min_float(FLOAT x, FLOAT y)
 {
-  return x < y ? x : y;
+    return x < y ? x : y;
 }
 
 // points
 
-void
-copy_pt_2d (POINT_2D r, POINT_2D s)
+void copy_pt_2d(POINT_2D r, POINT_2D s)
 {
-  r[X] = s[X];
-  r[Y] = s[Y];
+    r[X] = s[X];
+    r[Y] = s[Y];
 }
 
-void
-copy_pt_3d (POINT_3D r, POINT_3D s)
+void copy_pt_3d(POINT_3D r, POINT_3D s)
 {
-  r[X] = s[X];
-  r[Y] = s[Y];
-  r[Z] = s[Z];
+    r[X] = s[X];
+    r[Y] = s[Y];
+    r[Z] = s[Z];
 }
 
-void
-find_pt_3d_from_2d (POINT_3D r, POINT_2D pt)
+void find_pt_3d_from_2d(POINT_3D r, POINT_2D pt)
 {
-  r[X] = pt[X];
-  r[Y] = pt[Y];
-  r[Z] = 0;
+    r[X] = pt[X];
+    r[Y] = pt[Y];
+    r[Z] = 0;
 }
 
 // polyline initialization and cleanup
 
 #define SET_NEXT_NULL a->next = NULL;
 
-DECLARE_DYNAMIC_2D_ARRAY_FUNCS (POLYLINE_2D, POINT_2D, FLOAT, polyline_2d,
-				v, n_vertices, SET_NEXT_NULL)
-DECLARE_DYNAMIC_2D_ARRAY_FUNCS (POLYLINE_3D, POINT_3D, FLOAT, polyline_3d,
-				v, n_vertices, SET_NEXT_NULL)
+DECLARE_DYNAMIC_2D_ARRAY_FUNCS(POLYLINE_2D, POINT_2D, FLOAT, polyline_2d,
+			       v, n_vertices, SET_NEXT_NULL);
+DECLARE_DYNAMIC_2D_ARRAY_FUNCS(POLYLINE_3D, POINT_3D, FLOAT, polyline_3d,
+			       v, n_vertices, SET_NEXT_NULL);
 // polygon initialization and cleanup
-  DECLARE_DYNAMIC_2D_ARRAY_FUNCS (POLYGON_2D, POINT_2D, FLOAT, polygon_2d, v,
-				n_sides, SET_NEXT_NULL)
-DECLARE_DYNAMIC_2D_ARRAY_FUNCS (POLYGON_3D, POINT_3D, FLOAT, polygon_3d, v,
-				n_sides, SET_NEXT_NULL)
+DECLARE_DYNAMIC_2D_ARRAY_FUNCS(POLYGON_2D, POINT_2D, FLOAT, polygon_2d, v,
+			       n_sides, SET_NEXT_NULL);
+DECLARE_DYNAMIC_2D_ARRAY_FUNCS(POLYGON_3D, POINT_3D, FLOAT, polygon_3d, v,
+			       n_sides, SET_NEXT_NULL);
+
 // rudimentary vectors of variable size
-     void init_vec (VECTOR * v)
+void init_vec(VECTOR * v)
 {
-  *v = 0;
+    *v = 0;
 }
 
-void
-clear_vec (VECTOR * v)
+void clear_vec(VECTOR * v)
 {
-  safe_free (*v);
-  init_vec (v);
+    safe_free(*v);
+    init_vec(v);
 }
 
-void
-setup_vec (VECTOR * v, SIZE n)
+void setup_vec(VECTOR * v, SIZE n)
 {
-  clear_vec (v);
-  *v = safe_malloc (n * sizeof (FLOAT));
+    clear_vec(v);
+    *v = safe_malloc(n * sizeof(FLOAT));
 }
 
-void
-init_and_setup_vec (VECTOR * v, SIZE n)
+void init_and_setup_vec(VECTOR * v, SIZE n)
 {
-  *v = safe_malloc (n * sizeof (FLOAT));
+    *v = safe_malloc(n * sizeof(FLOAT));
 }
 
-void
-zero_vec (VECTOR r, SIZE n)
+void zero_vec(VECTOR r, SIZE n)
 {
-  INDEX i;
+    INDEX i;
 
-  for (i = 0; i < n; i++)
-    r[i] = 0;
+    for (i = 0; i < n; i++)
+	r[i] = 0;
 }
 
-void
-copy_vec (VECTOR r, VECTOR v, SIZE n)
+void copy_vec(VECTOR r, VECTOR v, SIZE n)
 {
-  INDEX i;
+    INDEX i;
 
-  for (i = 0; i < n; i++)
-    r[i] = v[i];
+    for (i = 0; i < n; i++)
+	r[i] = v[i];
 }
 
-FLOAT
-length_vec_2d (VECTOR_2D v)
+FLOAT length_vec_2d(VECTOR_2D v)
 {
-  return sqrt (dot_2d (v, v));
+    return sqrt(dot_2d(v, v));
 }
 
-FLOAT
-length_vec_3d (VECTOR_3D v)
+FLOAT length_vec_3d(VECTOR_3D v)
 {
-  return sqrt (dot_3d (v, v));
+    return sqrt(dot_3d(v, v));
 }
 
-FLOAT
-dist_2d (POINT_2D p1, POINT_2D p2)
+FLOAT dist_2d(POINT_2D p1, POINT_2D p2)
 {
-  VECTOR_2D dif;
-  sub_pts_2d (dif, p1, p2);
-  return length_vec_2d (dif);
+    VECTOR_2D dif;
+    sub_pts_2d(dif, p1, p2);
+    return length_vec_2d(dif);
 }
 
-FLOAT
-dist_3d (POINT_3D p1, POINT_3D p2)
+FLOAT dist_3d(POINT_3D p1, POINT_3D p2)
 {
-  VECTOR_3D dif;
-  sub_pts_3d (dif, p1, p2);
-  return length_vec_3d (dif);
+    VECTOR_3D dif;
+    sub_pts_3d(dif, p1, p2);
+    return length_vec_3d(dif);
 }
 
-FLOAT
-length_vec_2d_sqr (VECTOR_2D v)
+FLOAT length_vec_2d_sqr(VECTOR_2D v)
 {
-  return dot_2d (v, v);
+    return dot_2d(v, v);
 }
 
-FLOAT
-length_vec_3d_sqr (VECTOR_3D v)
+FLOAT length_vec_3d_sqr(VECTOR_3D v)
 {
-  return dot_3d (v, v);
+    return dot_3d(v, v);
 }
 
-FLOAT
-dist_2d_sqr (POINT_2D p1, POINT_2D p2)
+FLOAT dist_2d_sqr(POINT_2D p1, POINT_2D p2)
 {
-  VECTOR_2D dif;
-  sub_pts_2d (dif, p1, p2);
-  return length_vec_2d_sqr (dif);
+    VECTOR_2D dif;
+    sub_pts_2d(dif, p1, p2);
+    return length_vec_2d_sqr(dif);
 }
 
-FLOAT
-dist_3d_sqr (POINT_3D p1, POINT_3D p2)
+FLOAT dist_3d_sqr(POINT_3D p1, POINT_3D p2)
 {
-  VECTOR_3D dif;
-  sub_pts_3d (dif, p1, p2);
-  return length_vec_3d_sqr (dif);
+    VECTOR_3D dif;
+    sub_pts_3d(dif, p1, p2);
+    return length_vec_3d_sqr(dif);
 }
 
-void
-zero_vec_2d (VECTOR_2D v)
+void zero_vec_2d(VECTOR_2D v)
 {
-  v[X] = v[Y] = 0;
+    v[X] = v[Y] = 0;
 }
 
-void
-zero_vec_3d (VECTOR_3D v)
+void zero_vec_3d(VECTOR_3D v)
 {
-  v[X] = v[Y] = v[Z] = 0;
+    v[X] = v[Y] = v[Z] = 0;
 }
 
-void
-negate_vec_2d (VECTOR_2D r, VECTOR_2D v)
+void negate_vec_2d(VECTOR_2D r, VECTOR_2D v)
 {
-  r[X] = -v[X];
-  r[Y] = -v[Y];
+    r[X] = -v[X];
+    r[Y] = -v[Y];
 }
 
-void
-negate_vec_3d (VECTOR_3D r, VECTOR_3D v)
+void negate_vec_3d(VECTOR_3D r, VECTOR_3D v)
 {
-  r[X] = -v[X];
-  r[Y] = -v[Y];
-  r[Z] = -v[Z];
+    r[X] = -v[X];
+    r[Y] = -v[Y];
+    r[Z] = -v[Z];
 }
 
-void
-copy_vec_2d (VECTOR_2D r, VECTOR_2D s)
+void copy_vec_2d(VECTOR_2D r, VECTOR_2D s)
 {
-  r[X] = s[X];
-  r[Y] = s[Y];
+    r[X] = s[X];
+    r[Y] = s[Y];
 }
 
-void
-copy_vec_3d (VECTOR_3D r, VECTOR_3D s)
+void copy_vec_3d(VECTOR_3D r, VECTOR_3D s)
 {
-  r[X] = s[X];
-  r[Y] = s[Y];
-  r[Z] = s[Z];
+    r[X] = s[X];
+    r[Y] = s[Y];
+    r[Z] = s[Z];
 }
 
-void
-scale_vec_2d (VECTOR_2D r, VECTOR_2D v, FLOAT s)
+void scale_vec_2d(VECTOR_2D r, VECTOR_2D v, FLOAT s)
 {
-  r[X] = v[X] * s;
-  r[Y] = v[Y] * s;
+    r[X] = v[X] * s;
+    r[Y] = v[Y] * s;
 }
 
-void
-scale_vec_3d (VECTOR_3D r, VECTOR_3D v, FLOAT s)
+void scale_vec_3d(VECTOR_3D r, VECTOR_3D v, FLOAT s)
 {
-  r[X] = v[X] * s;
-  r[Y] = v[Y] * s;
-  r[Z] = v[Z] * s;
+    r[X] = v[X] * s;
+    r[Y] = v[Y] * s;
+    r[Z] = v[Z] * s;
 }
 
-int
-find_unit_vec_2d (VECTOR_2D r, VECTOR_2D v)
-{
-  FLOAT len = length_vec_2d (v);
-  if (len <= FLT_EPSILON)
-    {
-      r[X] = 1;
-      r[Y] = 0;
-      return 0;
-    }
-  else
-    {
-      scale_vec_2d (r, v, 1 / len);
-      return 1;
+int find_unit_vec_2d(VECTOR_2D r, VECTOR_2D v)
+{
+    FLOAT len = length_vec_2d(v);
+    if (len <= FLT_EPSILON) {
+	r[X] = 1;
+	r[Y] = 0;
+	return 0;
+    } else {
+	scale_vec_2d(r, v, 1 / len);
+	return 1;
     }
 }
 
-int
-find_unit_vec_3d (VECTOR_3D r, VECTOR_3D v)
-{
-  FLOAT len = length_vec_3d (v);
-  if (len == FLT_EPSILON)
-    {
-      r[X] = 1;
-      r[Y] = r[Z] = 0;
-      return 0;
-    }
-  else
-    {
-      scale_vec_3d (r, v, 1 / len);
-      return 1;
+int find_unit_vec_3d(VECTOR_3D r, VECTOR_3D v)
+{
+    FLOAT len = length_vec_3d(v);
+    if (len == FLT_EPSILON) {
+	r[X] = 1;
+	r[Y] = r[Z] = 0;
+	return 0;
+    } else {
+	scale_vec_3d(r, v, 1 / len);
+	return 1;
     }
 }
 
-void
-add_vecs_2d (VECTOR_2D r, VECTOR_2D a, VECTOR_2D b)
+void add_vecs_2d(VECTOR_2D r, VECTOR_2D a, VECTOR_2D b)
 {
-  r[X] = a[X] + b[X];
-  r[Y] = a[Y] + b[Y];
+    r[X] = a[X] + b[X];
+    r[Y] = a[Y] + b[Y];
 }
 
-void
-add_vecs_3d (VECTOR_3D r, VECTOR_3D a, VECTOR_3D b)
+void add_vecs_3d(VECTOR_3D r, VECTOR_3D a, VECTOR_3D b)
 {
-  r[X] = a[X] + b[X];
-  r[Y] = a[Y] + b[Y];
-  r[Z] = a[Z] + b[Z];
+    r[X] = a[X] + b[X];
+    r[Y] = a[Y] + b[Y];
+    r[Z] = a[Z] + b[Z];
 }
 
-void
-sub_vecs_2d (VECTOR_2D r, VECTOR_2D a, VECTOR_2D b)
+void sub_vecs_2d(VECTOR_2D r, VECTOR_2D a, VECTOR_2D b)
 {
-  r[X] = a[X] - b[X];
-  r[Y] = a[Y] - b[Y];
+    r[X] = a[X] - b[X];
+    r[Y] = a[Y] - b[Y];
 }
 
-void
-sub_vecs_3d (VECTOR_3D r, VECTOR_3D a, VECTOR_3D b)
+void sub_vecs_3d(VECTOR_3D r, VECTOR_3D a, VECTOR_3D b)
 {
-  r[X] = a[X] - b[X];
-  r[Y] = a[Y] - b[Y];
-  r[Z] = a[Z] - b[Z];
+    r[X] = a[X] - b[X];
+    r[Y] = a[Y] - b[Y];
+    r[Z] = a[Z] - b[Z];
 }
 
-void
-add_vec_to_pt_2d (POINT_2D r, POINT_2D pt, VECTOR_2D v)
+void add_vec_to_pt_2d(POINT_2D r, POINT_2D pt, VECTOR_2D v)
 {
-  r[X] = pt[X] + v[X];
-  r[Y] = pt[Y] + v[Y];
+    r[X] = pt[X] + v[X];
+    r[Y] = pt[Y] + v[Y];
 }
 
-void
-add_vec_to_pt_3d (POINT_3D r, POINT_3D pt, VECTOR_3D v)
+void add_vec_to_pt_3d(POINT_3D r, POINT_3D pt, VECTOR_3D v)
 {
-  r[X] = pt[X] + v[X];
-  r[Y] = pt[Y] + v[Y];
-  r[Z] = pt[Z] + v[Z];
+    r[X] = pt[X] + v[X];
+    r[Y] = pt[Y] + v[Y];
+    r[Z] = pt[Z] + v[Z];
 }
 
-void
-add_scaled_vec_to_pt_2d (POINT_2D r, POINT_2D pt, VECTOR_2D v, FLOAT s)
+void add_scaled_vec_to_pt_2d(POINT_2D r, POINT_2D pt, VECTOR_2D v, FLOAT s)
 {
-  r[X] = pt[X] + v[X] * s;
-  r[Y] = pt[Y] + v[Y] * s;
+    r[X] = pt[X] + v[X] * s;
+    r[Y] = pt[Y] + v[Y] * s;
 }
 
-void
-add_scaled_vec_to_pt_3d (POINT_3D r, POINT_3D pt, VECTOR_3D v, FLOAT s)
+void add_scaled_vec_to_pt_3d(POINT_3D r, POINT_3D pt, VECTOR_3D v, FLOAT s)
 {
-  r[X] = pt[X] + v[X] * s;
-  r[Y] = pt[Y] + v[Y] * s;
-  r[Z] = pt[Z] + v[Z] * s;
+    r[X] = pt[X] + v[X] * s;
+    r[Y] = pt[Y] + v[Y] * s;
+    r[Z] = pt[Z] + v[Z] * s;
 }
 
-void
-sub_pts_2d (VECTOR_2D r, POINT_2D a, POINT_2D b)
+void sub_pts_2d(VECTOR_2D r, POINT_2D a, POINT_2D b)
 {
-  r[X] = a[X] - b[X];
-  r[Y] = a[Y] - b[Y];
+    r[X] = a[X] - b[X];
+    r[Y] = a[Y] - b[Y];
 }
 
-void
-sub_pts_3d (VECTOR_3D r, POINT_3D a, POINT_3D b)
+void sub_pts_3d(VECTOR_3D r, POINT_3D a, POINT_3D b)
 {
-  r[X] = a[X] - b[X];
-  r[Y] = a[Y] - b[Y];
-  r[Z] = a[Z] - b[Z];
+    r[X] = a[X] - b[X];
+    r[Y] = a[Y] - b[Y];
+    r[Z] = a[Z] - b[Z];
 }
 
-void
-fold_min_pt_2d (POINT_2D min, POINT_2D new_pt)
+void fold_min_pt_2d(POINT_2D min, POINT_2D new_pt)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < 2; i++)
-    if (new_pt[i] < min[i])
-      min[i] = new_pt[i];
+    for (i = 0; i < 2; i++)
+	if (new_pt[i] < min[i])
+	    min[i] = new_pt[i];
 }
 
-void
-fold_min_pt_3d (POINT_3D min, POINT_3D new_pt)
+void fold_min_pt_3d(POINT_3D min, POINT_3D new_pt)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < 3; i++)
-    if (new_pt[i] < min[i])
-      min[i] = new_pt[i];
+    for (i = 0; i < 3; i++)
+	if (new_pt[i] < min[i])
+	    min[i] = new_pt[i];
 }
 
-void
-fold_max_pt_2d (POINT_2D max, POINT_3D new_pt)
+void fold_max_pt_2d(POINT_2D max, POINT_3D new_pt)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < 2; i++)
-    if (new_pt[i] > max[i])
-      max[i] = new_pt[i];
+    for (i = 0; i < 2; i++)
+	if (new_pt[i] > max[i])
+	    max[i] = new_pt[i];
 }
 
-void
-fold_max_pt_3d (POINT_3D max, POINT_3D new_pt)
+void fold_max_pt_3d(POINT_3D max, POINT_3D new_pt)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < 3; i++)
-    if (new_pt[i] > max[i])
-      max[i] = new_pt[i];
+    for (i = 0; i < 3; i++)
+	if (new_pt[i] > max[i])
+	    max[i] = new_pt[i];
 }
 
-FLOAT
-dot_2d (VECTOR_2D a, VECTOR_2D b)
+FLOAT dot_2d(VECTOR_2D a, VECTOR_2D b)
 {
-  return a[X] * b[X] + a[Y] * b[Y];
+    return a[X] * b[X] + a[Y] * b[Y];
 }
 
-FLOAT
-dot_3d (VECTOR_3D a, VECTOR_3D b)
+FLOAT dot_3d(VECTOR_3D a, VECTOR_3D b)
 {
-  return a[X] * b[X] + a[Y] * b[Y] + a[Z] * b[Z];
+    return a[X] * b[X] + a[Y] * b[Y] + a[Z] * b[Z];
 }
 
-void
-cross (VECTOR_3D r, VECTOR_3D a, VECTOR_3D b)
+void cross(VECTOR_3D r, VECTOR_3D a, VECTOR_3D b)
 {
-  r[X] = a[Y] * b[Z] - a[Z] * b[Y];
-  r[Y] = a[Z] * b[X] - a[X] * b[Z];
-  r[Z] = a[X] * b[Y] - a[Y] * b[X];
+    r[X] = a[Y] * b[Z] - a[Z] * b[Y];
+    r[Y] = a[Z] * b[X] - a[X] * b[Z];
+    r[Z] = a[X] * b[Y] - a[Y] * b[X];
 }
 
-void
-lerp_2d (POINT_2D r, FLOAT t, POINT_2D p1, POINT_2D p2)
+void lerp_2d(POINT_2D r, FLOAT t, POINT_2D p1, POINT_2D p2)
 {
-  r[0] = p1[0] + t * (p2[0] - p1[0]);
-  r[1] = p1[1] + t * (p2[1] - p1[1]);
+    r[0] = p1[0] + t * (p2[0] - p1[0]);
+    r[1] = p1[1] + t * (p2[1] - p1[1]);
 }
 
-void
-lerp_3d (POINT_3D r, FLOAT t, POINT_3D p1, POINT_3D p2)
+void lerp_3d(POINT_3D r, FLOAT t, POINT_3D p1, POINT_3D p2)
 {
-  r[0] = p1[0] + t * (p2[0] - p1[0]);
-  r[1] = p1[1] + t * (p2[1] - p1[1]);
-  r[2] = p1[2] + t * (p2[2] - p1[2]);
+    r[0] = p1[0] + t * (p2[0] - p1[0]);
+    r[1] = p1[1] + t * (p2[1] - p1[1]);
+    r[2] = p1[2] + t * (p2[2] - p1[2]);
 }
 
 int
-line_intersect_2d (POINT_2D a, POINT_2D b, POINT_2D c, POINT_2D d,
-		   FLOAT eps, FLOAT * t_ab, FLOAT * t_cd)
-{
-  FLOAT dx_ab, dy_ab, dx_dc, dy_dc, det, dx_ac, dy_ac;
-
-  dx_ab = b[X] - a[X];
-  dy_ab = b[Y] - a[Y];
-  dx_dc = c[X] - d[X];
-  dy_dc = c[Y] - d[Y];
-  det = dx_ab * dy_dc - dx_dc * dy_ab;
-  if (-eps < det && det < eps)
-    return 1;
-  dx_ac = c[X] - a[X];
-  dy_ac = c[Y] - a[Y];
-  *t_ab = (dx_ac * dy_dc - dx_dc * dy_ac) / det;
-  *t_cd = (dx_ab * dy_ac - dx_ac * dy_ab) / det;
-  return 0;
+line_intersect_2d(POINT_2D a, POINT_2D b, POINT_2D c, POINT_2D d,
+		  FLOAT eps, FLOAT * t_ab, FLOAT * t_cd)
+{
+    FLOAT dx_ab, dy_ab, dx_dc, dy_dc, det, dx_ac, dy_ac;
+
+    dx_ab = b[X] - a[X];
+    dy_ab = b[Y] - a[Y];
+    dx_dc = c[X] - d[X];
+    dy_dc = c[Y] - d[Y];
+    det = dx_ab * dy_dc - dx_dc * dy_ab;
+    if (-eps < det && det < eps)
+	return 1;
+    dx_ac = c[X] - a[X];
+    dy_ac = c[Y] - a[Y];
+    *t_ab = (dx_ac * dy_dc - dx_dc * dy_ac) / det;
+    *t_cd = (dx_ab * dy_ac - dx_ac * dy_ab) / det;
+    return 0;
 }
 
-void
-find_polygon_plane (PLANE * plane, POLYGON_3D * polygon)
-{
-  int i, j;
-  VECTOR_3D sum, dif;
-
-  zero_vec_3d (plane->p);
-  zero_vec_3d (plane->n);
-  for (i = 0, j = polygon->n_sides - 1; i < polygon->n_sides; j = i++)
-    {
-      add_vecs_3d (plane->p, plane->p, polygon->v[i]);
-      add_vecs_3d (sum, polygon->v[j], polygon->v[i]);
-      sub_vecs_3d (dif, polygon->v[j], polygon->v[i]);
-      plane->n[X] += dif[Y] * sum[Z];
-      plane->n[Y] += dif[Z] * sum[X];
-      plane->n[Z] += dif[X] * sum[Y];
+void find_polygon_plane(PLANE * plane, POLYGON_3D * polygon)
+{
+    int i, j;
+    VECTOR_3D sum, dif;
+
+    zero_vec_3d(plane->p);
+    zero_vec_3d(plane->n);
+    for (i = 0, j = polygon->n_sides - 1; i < polygon->n_sides; j = i++) {
+	add_vecs_3d(plane->p, plane->p, polygon->v[i]);
+	add_vecs_3d(sum, polygon->v[j], polygon->v[i]);
+	sub_vecs_3d(dif, polygon->v[j], polygon->v[i]);
+	plane->n[X] += dif[Y] * sum[Z];
+	plane->n[Y] += dif[Z] * sum[X];
+	plane->n[Z] += dif[X] * sum[Y];
     }
-  scale_vec_3d (plane->p, plane->p, 1.0 / polygon->n_sides);
-  find_unit_vec_3d (plane->n, plane->n);
-  plane->c = -dot_3d (plane->p, plane->n);
+    scale_vec_3d(plane->p, plane->p, 1.0 / polygon->n_sides);
+    find_unit_vec_3d(plane->n, plane->n);
+    plane->c = -dot_3d(plane->p, plane->n);
 }
 
-int
-pt_side_of_plane (PLANE * plane, POINT_3D p)
+int pt_side_of_plane(PLANE * plane, POINT_3D p)
 {
-  FLOAT d = dot_3d (p, plane->n) + plane->c;
-  return d < -PLANE_HALF_THICKNESS ? S_IN :
-    d > PLANE_HALF_THICKNESS ? S_OUT :
-    d < 0 ? S_IN_ON : d > 0 ? S_OUT_ON : S_ON;
+    FLOAT d = dot_3d(p, plane->n) + plane->c;
+    return d < -PLANE_HALF_THICKNESS ? S_IN :
+	d > PLANE_HALF_THICKNESS ? S_OUT :
+	d < 0 ? S_IN_ON : d > 0 ? S_OUT_ON : S_ON;
 }
 
-int
-polygon_side_of_plane (POLYGON_3D * polygon, PLANE * plane)
+int polygon_side_of_plane(POLYGON_3D * polygon, PLANE * plane)
 {
-  int i, j, i_side, j_side, n_in, n_out;
+    int i, j, i_side, j_side, n_in, n_out;
 
-  // initialize with last point in polygon
-  // scan for OUT-IN or IN-OUT pair
-  j = polygon->n_sides - 1;
-  j_side = pt_side_of_plane (plane, polygon->v[j]);
-  n_in = n_out = 0;
-  for (i = 0; i < polygon->n_sides; i++)
-    {
+    // initialize with last point in polygon
+    // scan for OUT-IN or IN-OUT pair
+    j = polygon->n_sides - 1;
+    j_side = pt_side_of_plane(plane, polygon->v[j]);
+    n_in = n_out = 0;
+    for (i = 0; i < polygon->n_sides; i++) {
 
-      // advance to next vertex
-      i_side = pt_side_of_plane (plane, polygon->v[i]);
+	// advance to next vertex
+	i_side = pt_side_of_plane(plane, polygon->v[i]);
 
-      if ((i_side | j_side) == (S_IN | S_OUT))
-	// found a straddling pair
-	return S_SPLIT;
+	if ((i_side | j_side) == (S_IN | S_OUT))
+	    // found a straddling pair
+	    return S_SPLIT;
 
-      if (i_side & (S_IN | S_OUT))
-	// found an IN or an OUT; remember it
-	j_side = i_side;
+	if (i_side & (S_IN | S_OUT))
+	    // found an IN or an OUT; remember it
+	    j_side = i_side;
 
-      // keep counts for polygons entirely inside the thick plane
-      if (i_side == S_OUT_ON)
-	n_out++;
-      if (i_side == S_IN_ON)
-	n_in++;
+	// keep counts for polygons entirely inside the thick plane
+	if (i_side == S_OUT_ON)
+	    n_out++;
+	if (i_side == S_IN_ON)
+	    n_in++;
     }
-  return
-    j_side & (S_IN | S_OUT) ? j_side :
-    (n_out > n_in) ? S_OUT : (n_in > n_out) ? S_IN : S_ON;
+    return
+	j_side & (S_IN | S_OUT) ? j_side :
+	(n_out > n_in) ? S_OUT : (n_in > n_out) ? S_IN : S_ON;
 }
 
-# if TREAT_POLYLINE_POINTS_ON_PLANE_AS_IN_OR_OUT
+#if TREAT_POLYLINE_POINTS_ON_PLANE_AS_IN_OR_OUT
 
 // this will work only with BSPs, not with depth sort
 // it causes polylines that end  on a plane to be split into a line and a point
-int
-polyline_side_of_plane (POLYLINE_3D * polyline, PLANE * plane)
-{
-  int i, j, i_side, j_side, n_in, n_out;
-  //  predicate for "if more than one bit set..."
-  //                       0  1  2  3  4  5  6  7
-  static int is_split_p[] = { 0, 0, 0, 1, 0, 1, 1, 1 };
-
-  // initialize with first point in polyline
-  // scan for OUT-IN or IN-OUT pair
-  j = 0;
-  i_side = pt_side_of_plane (plane, polyline->v[j]);
-  n_in = n_out = 0;
-  for (i = 1; i < polyline->n_vertices; i++)
-    {
-      // advance to next vertex, remembering side of last
-      j_side = i_side;
-      i_side = pt_side_of_plane (plane, polyline->v[i]);
-
-      if (is_split_p[(i_side | j_side) & 7])
-	return S_SPLIT;
-
-      // keep counts for polylines entirely inside the thick plane
-      if (i_side == S_OUT_ON)
-	n_out++;
-      if (i_side == S_IN_ON)
-	n_in++;
+int polyline_side_of_plane(POLYLINE_3D * polyline, PLANE * plane)
+{
+    int i, j, i_side, j_side, n_in, n_out;
+    //  predicate for "if more than one bit set..."
+    //                       0  1  2  3  4  5  6  7
+    static int is_split_p[] = { 0, 0, 0, 1, 0, 1, 1, 1 };
+
+    // initialize with first point in polyline
+    // scan for OUT-IN or IN-OUT pair
+    j = 0;
+    i_side = pt_side_of_plane(plane, polyline->v[j]);
+    n_in = n_out = 0;
+    for (i = 1; i < polyline->n_vertices; i++) {
+	// advance to next vertex, remembering side of last
+	j_side = i_side;
+	i_side = pt_side_of_plane(plane, polyline->v[i]);
+
+	if (is_split_p[(i_side | j_side) & 7])
+	    return S_SPLIT;
+
+	// keep counts for polylines entirely inside the thick plane
+	if (i_side == S_OUT_ON)
+	    n_out++;
+	if (i_side == S_IN_ON)
+	    n_in++;
     }
-  return
-    i_side & (S_IN | S_OUT) ? i_side :
-    (n_out > n_in) ? S_OUT : (n_in > n_out) ? S_IN : S_ON;
+    return
+	i_side & (S_IN | S_OUT) ? i_side :
+	(n_out > n_in) ? S_OUT : (n_in > n_out) ? S_IN : S_ON;
 }
 
 #else
 
-int
-polyline_side_of_plane (POLYLINE_3D * polyline, PLANE * plane)
+int polyline_side_of_plane(POLYLINE_3D * polyline, PLANE * plane)
 {
-  int i, j, i_side, j_side, n_in, n_out;
+    int i, j, i_side, j_side, n_in, n_out;
 
-  // initialize with last point in polygon
-  // scan for OUT-IN or IN-OUT pair
-  j = polyline->n_vertices - 1;
-  j_side = pt_side_of_plane (plane, polyline->v[j]);
-  n_in = n_out = 0;
-  for (i = 0; i < polyline->n_vertices; i++)
-    {
+    // initialize with last point in polygon
+    // scan for OUT-IN or IN-OUT pair
+    j = polyline->n_vertices - 1;
+    j_side = pt_side_of_plane(plane, polyline->v[j]);
+    n_in = n_out = 0;
+    for (i = 0; i < polyline->n_vertices; i++) {
 
-      // advance to next vertex
-      i_side = pt_side_of_plane (plane, polyline->v[i]);
+	// advance to next vertex
+	i_side = pt_side_of_plane(plane, polyline->v[i]);
 
-      if ((i_side | j_side) == (S_IN | S_OUT))
-	// found a straddling pair
-	return S_SPLIT;
+	if ((i_side | j_side) == (S_IN | S_OUT))
+	    // found a straddling pair
+	    return S_SPLIT;
 
-      if (i_side & (S_IN | S_OUT))
-	// found an IN or an OUT; remember it
-	j_side = i_side;
+	if (i_side & (S_IN | S_OUT))
+	    // found an IN or an OUT; remember it
+	    j_side = i_side;
 
-      // keep counts for polylines entirely inside the thick plane
-      if (i_side == S_OUT_ON)
-	n_out++;
-      if (i_side == S_IN_ON)
-	n_in++;
+	// keep counts for polylines entirely inside the thick plane
+	if (i_side == S_OUT_ON)
+	    n_out++;
+	if (i_side == S_IN_ON)
+	    n_in++;
     }
-  return
-    j_side & (S_IN | S_OUT) ? j_side :
-    (n_out > n_in) ? S_OUT : (n_in > n_out) ? S_IN : S_ON;
+    return
+	j_side & (S_IN | S_OUT) ? j_side :
+	(n_out > n_in) ? S_OUT : (n_in > n_out) ? S_IN : S_ON;
 }
 
 #endif
 
-void
-init_box_2d (BOX_2D * b)
+void init_box_2d(BOX_2D * b)
 {
-  b->min[X] = b->min[Y] = FLOAT_MAX;
-  b->max[X] = b->max[Y] = -FLOAT_MAX;
+    b->min[X] = b->min[Y] = FLOAT_MAX;
+    b->max[X] = b->max[Y] = -FLOAT_MAX;
 }
 
-void
-init_box_3d (BOX_3D * b)
+void init_box_3d(BOX_3D * b)
 {
-  b->min[X] = b->min[Y] = b->min[Z] = FLOAT_MAX;
-  b->max[X] = b->max[Y] = b->max[Z] = -FLOAT_MAX;
+    b->min[X] = b->min[Y] = b->min[Z] = FLOAT_MAX;
+    b->max[X] = b->max[Y] = b->max[Z] = -FLOAT_MAX;
 }
 
-void
-fold_min_max_pt_2d (BOX_2D * b, POINT_2D p)
+void fold_min_max_pt_2d(BOX_2D * b, POINT_2D p)
 {
-  fold_min_pt_2d (b->min, p);
-  fold_max_pt_2d (b->max, p);
+    fold_min_pt_2d(b->min, p);
+    fold_max_pt_2d(b->max, p);
 }
 
-void
-fold_min_max_pt_3d (BOX_3D * b, POINT_3D p)
+void fold_min_max_pt_3d(BOX_3D * b, POINT_3D p)
 {
-  fold_min_pt_3d (b->min, p);
-  fold_max_pt_3d (b->max, p);
+    fold_min_pt_3d(b->min, p);
+    fold_max_pt_3d(b->max, p);
 }
 
-void
-fold_min_max_polygon_2d (BOX_2D * b, POLYGON_2D * polygon)
+void fold_min_max_polygon_2d(BOX_2D * b, POLYGON_2D * polygon)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < polygon->n_sides; i++)
-    fold_min_max_pt_2d (b, polygon->v[i]);
+    for (i = 0; i < polygon->n_sides; i++)
+	fold_min_max_pt_2d(b, polygon->v[i]);
 }
 
-void
-fold_min_max_polygon_3d (BOX_3D * b, POLYGON_3D * polygon)
+void fold_min_max_polygon_3d(BOX_3D * b, POLYGON_3D * polygon)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < polygon->n_sides; i++)
-    fold_min_max_pt_3d (b, polygon->v[i]);
+    for (i = 0; i < polygon->n_sides; i++)
+	fold_min_max_pt_3d(b, polygon->v[i]);
 }
 
-void
-fold_min_max_polyline_2d (BOX_2D * b, POLYLINE_2D * polyline)
+void fold_min_max_polyline_2d(BOX_2D * b, POLYLINE_2D * polyline)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < polyline->n_vertices; i++)
-    fold_min_max_pt_2d (b, polyline->v[i]);
+    for (i = 0; i < polyline->n_vertices; i++)
+	fold_min_max_pt_2d(b, polyline->v[i]);
 }
 
-void
-fold_min_max_polyline_3d (BOX_3D * b, POLYLINE_3D * polyline)
+void fold_min_max_polyline_3d(BOX_3D * b, POLYLINE_3D * polyline)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < polyline->n_vertices; i++)
-    fold_min_max_pt_3d (b, polyline->v[i]);
+    for (i = 0; i < polyline->n_vertices; i++)
+	fold_min_max_pt_3d(b, polyline->v[i]);
 }
 
-void
-copy_box_2d (BOX_2D * r, BOX_2D * s)
+void copy_box_2d(BOX_2D * r, BOX_2D * s)
 {
-  *r = *s;
+    *r = *s;
 }
 
-void
-copy_box_3d (BOX_3D * r, BOX_3D * s)
+void copy_box_3d(BOX_3D * r, BOX_3D * s)
 {
-  *r = *s;
+    *r = *s;
 }
 
-int
-boxes_2d_intersect_p (BOX_2D * a, BOX_2D * b)
+int boxes_2d_intersect_p(BOX_2D * a, BOX_2D * b)
 {
-  if (a->max[X] < b->min[X])	// a left of b
-    return 0;
-  if (a->min[X] > b->max[X])	// a right of b
-    return 0;
-  if (a->max[Y] < b->min[Y])	// a below  b
-    return 0;
-  if (a->min[Y] > b->max[Y])	// a above b
-    return 0;
-  return 1;
+    if (a->max[X] < b->min[X])	// a left of b
+	return 0;
+    if (a->min[X] > b->max[X])	// a right of b
+	return 0;
+    if (a->max[Y] < b->min[Y])	// a below  b
+	return 0;
+    if (a->min[Y] > b->max[Y])	// a above b
+	return 0;
+    return 1;
 }
 
-int
-boxes_3d_intersect_p (BOX_2D * a, BOX_2D * b)
+int boxes_3d_intersect_p(BOX_2D * a, BOX_2D * b)
 {
-  if (a->max[X] < b->min[X])	// a left of b
-    return 0;
-  if (a->min[X] > b->max[X])	// a right of b
-    return 0;
-  if (a->max[Y] < b->min[Y])	// a below  b
-    return 0;
-  if (a->min[Y] > b->max[Y])	// a above b
-    return 0;
-  if (a->max[Z] < b->min[Z])	// a behind  b
-    return 0;
-  if (a->min[Z] > b->max[Z])	// a in front of b
-    return 0;
-  return 1;
+    if (a->max[X] < b->min[X])	// a left of b
+	return 0;
+    if (a->min[X] > b->max[X])	// a right of b
+	return 0;
+    if (a->max[Y] < b->min[Y])	// a below  b
+	return 0;
+    if (a->min[Y] > b->max[Y])	// a above b
+	return 0;
+    if (a->max[Z] < b->min[Z])	// a behind  b
+	return 0;
+    if (a->min[Z] > b->max[Z])	// a in front of b
+	return 0;
+    return 1;
 }
 
-void
-copy_transform (TRANSFORM r, TRANSFORM s)
+void copy_transform(TRANSFORM r, TRANSFORM s)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < 16; i++)
-    r[i] = s[i];
+    for (i = 0; i < 16; i++)
+	r[i] = s[i];
 }
 
 #define R(I,J) r[IT(I,J)]
 
-void
-set_ident (TRANSFORM r)
+void set_ident(TRANSFORM r)
 {
-  R (1, 1) = 1;			// hard code for speed
-  R (2, 1) = 0;
-  R (3, 1) = 0;
-  R (4, 1) = 0;
+    R(1, 1) = 1;		// hard code for speed
+    R(2, 1) = 0;
+    R(3, 1) = 0;
+    R(4, 1) = 0;
 
-  R (1, 2) = 0;
-  R (2, 2) = 1;
-  R (3, 2) = 0;
-  R (4, 2) = 0;
+    R(1, 2) = 0;
+    R(2, 2) = 1;
+    R(3, 2) = 0;
+    R(4, 2) = 0;
 
-  R (1, 3) = 0;
-  R (2, 3) = 0;
-  R (3, 3) = 1;
-  R (4, 3) = 0;
+    R(1, 3) = 0;
+    R(2, 3) = 0;
+    R(3, 3) = 1;
+    R(4, 3) = 0;
 
-  R (1, 4) = 0;
-  R (2, 4) = 0;
-  R (3, 4) = 0;
-  R (4, 4) = 1;
+    R(1, 4) = 0;
+    R(2, 4) = 0;
+    R(3, 4) = 0;
+    R(4, 4) = 1;
 }
 
-void
-set_scale (TRANSFORM r, FLOAT sx, FLOAT sy, FLOAT sz)
+void set_scale(TRANSFORM r, FLOAT sx, FLOAT sy, FLOAT sz)
 {
-  set_ident (r);
-  R (1, 1) = sx;
-  R (2, 2) = sy;
-  R (3, 3) = sz;
+    set_ident(r);
+    R(1, 1) = sx;
+    R(2, 2) = sy;
+    R(3, 3) = sz;
 }
 
-void
-set_translation (TRANSFORM r, FLOAT dx, FLOAT dy, FLOAT dz)
+void set_translation(TRANSFORM r, FLOAT dx, FLOAT dy, FLOAT dz)
 {
-  set_ident (r);
-  R (1, 4) = dx;
-  R (2, 4) = dy;
-  R (3, 4) = dz;
+    set_ident(r);
+    R(1, 4) = dx;
+    R(2, 4) = dy;
+    R(3, 4) = dz;
 }
 
 #define SQR(A) ((A) * (A))
 
-void
-set_angle_axis_rot (TRANSFORM r, FLOAT theta, VECTOR_3D u)
+void set_angle_axis_rot(TRANSFORM r, FLOAT theta, VECTOR_3D u)
 {
-  FLOAT c = cos (theta);
-  FLOAT s = sin (theta);
-  FLOAT d = 1 - c;
+    FLOAT c = cos(theta);
+    FLOAT s = sin(theta);
+    FLOAT d = 1 - c;
 
-  R (1, 1) = d * (SQR (u[X]) - 1) + 1;
-  R (1, 2) = d * u[X] * u[Y] - u[Z] * s;
-  R (1, 3) = d * u[X] * u[Z] + u[Y] * s;
+    R(1, 1) = d * (SQR(u[X]) - 1) + 1;
+    R(1, 2) = d * u[X] * u[Y] - u[Z] * s;
+    R(1, 3) = d * u[X] * u[Z] + u[Y] * s;
 
-  R (2, 1) = d * u[X] * u[Y] + u[Z] * s;
-  R (2, 2) = d * (SQR (u[Y]) - 1) + 1;
-  R (2, 3) = d * u[Y] * u[Z] - u[X] * s;
+    R(2, 1) = d * u[X] * u[Y] + u[Z] * s;
+    R(2, 2) = d * (SQR(u[Y]) - 1) + 1;
+    R(2, 3) = d * u[Y] * u[Z] - u[X] * s;
 
-  R (3, 1) = d * u[X] * u[Z] - u[Y] * s;
-  R (3, 2) = d * u[Y] * u[Z] + u[X] * s;
-  R (3, 3) = d * (SQR (u[Z]) - 1) + 1;
+    R(3, 1) = d * u[X] * u[Z] - u[Y] * s;
+    R(3, 2) = d * u[Y] * u[Z] + u[X] * s;
+    R(3, 3) = d * (SQR(u[Z]) - 1) + 1;
 
-  R (1, 4) = R (4, 1) = R (2, 4) = R (4, 2) = R (3, 4) = R (4, 3) = 0;
-  R (4, 4) = 1;
+    R(1, 4) = R(4, 1) = R(2, 4) = R(4, 2) = R(3, 4) = R(4, 3) = 0;
+    R(4, 4) = 1;
 }
 
 void
-set_angle_axis_rot_about_point (TRANSFORM r, FLOAT theta, POINT_3D p,
-				VECTOR_3D u)
+set_angle_axis_rot_about_point(TRANSFORM r, FLOAT theta, POINT_3D p,
+			       VECTOR_3D u)
 {
-  VECTOR_3D u_unit;
-  TRANSFORM tmp;
+    VECTOR_3D u_unit;
+    TRANSFORM tmp;
 
-  if (u)
-    {
-      find_unit_vec_3d (u_unit, u);
+    if (u) {
+	find_unit_vec_3d(u_unit, u);
+    } else {
+	u_unit[X] = u_unit[Y] = 0;
+	u_unit[Z] = 1;
     }
-  else
-    {
-      u_unit[X] = u_unit[Y] = 0;
-      u_unit[Z] = 1;
-    }
-  set_angle_axis_rot (r, theta, u_unit);
-  if (p)
-    {
-      set_translation (tmp, -p[X], -p[Y], -p[Z]);
-      compose (r, r, tmp);
-      set_translation (tmp, p[X], p[Y], p[Z]);
-      compose (r, tmp, r);
+    set_angle_axis_rot(r, theta, u_unit);
+    if (p) {
+	set_translation(tmp, -p[X], -p[Y], -p[Z]);
+	compose(r, r, tmp);
+	set_translation(tmp, p[X], p[Y], p[Z]);
+	compose(r, tmp, r);
     }
 }
 
-void
-set_perspective_projection (TRANSFORM r, FLOAT p)
+void set_perspective_projection(TRANSFORM r, FLOAT p)
 {
-  set_scale (r, p, p, p);
-  R (4, 4) = 0;
-  R (4, 3) = -1;
+    set_scale(r, p, p, p);
+    R(4, 4) = 0;
+    R(4, 3) = -1;
 }
 
-void
-set_perspective_transform (TRANSFORM r, FLOAT p)
+void set_perspective_transform(TRANSFORM r, FLOAT p)
 {
-  set_scale (r, p, p, 1);
-  R (3, 4) = 1;
-  R (4, 3) = -1;
-  R (4, 4) = 0;
+    set_scale(r, p, p, 1);
+    R(3, 4) = 1;
+    R(4, 3) = -1;
+    R(4, 4) = 0;
 }
 
-void
-set_parallel_projection (TRANSFORM r)
+void set_parallel_projection(TRANSFORM r)
 {
-  set_scale (r, 1, 1, 0);
+    set_scale(r, 1, 1, 0);
 }
 
 void
-set_view_transform (TRANSFORM r, POINT_3D eye, VECTOR_3D vd, VECTOR_3D up)
+set_view_transform(TRANSFORM r, POINT_3D eye, VECTOR_3D vd, VECTOR_3D up)
 {
-  static VECTOR_3D default_up = { 0, 1, 0 };
+    static VECTOR_3D default_up = { 0, 1, 0 };
 
-  VECTOR_3D unit_vd, unit_up, h, v;
-  TRANSFORM tmp;
+    VECTOR_3D unit_vd, unit_up, h, v;
+    TRANSFORM tmp;
 
-  if (vd)
-    {
-      find_unit_vec_3d (unit_vd, vd);
-    }
-  else
-    {
-      negate_vec_3d (unit_vd, eye);	// assumes point and vector are compatible
-      find_unit_vec_3d (unit_vd, unit_vd);
+    if (vd) {
+	find_unit_vec_3d(unit_vd, vd);
+    } else {
+	negate_vec_3d(unit_vd, eye);	// assumes point and vector are compatible
+	find_unit_vec_3d(unit_vd, unit_vd);
     }
 
-  if (up)
-    find_unit_vec_3d (unit_up, up);
-  else
-    copy_vec_3d (unit_up, default_up);
-
-  cross (h, unit_vd, unit_up);
-  cross (v, h, unit_vd);
-
-  R (1, 1) = h[X];
-  R (1, 2) = h[Y];
-  R (1, 3) = h[Z];
-  R (1, 4) = 0;
-  R (2, 1) = v[X];
-  R (2, 2) = v[Y];
-  R (2, 3) = v[Z];
-  R (2, 4) = 0;
-  R (3, 1) = -unit_vd[X];
-  R (3, 2) = -unit_vd[Y];
-  R (3, 3) = -unit_vd[Z];
-  R (3, 4) = 0;
-  R (4, 1) = 0;
-  R (4, 2) = 0;
-  R (4, 3) = 0;
-  R (4, 4) = 1;
-
-  if (eye)
-    {
-      set_translation (tmp, -eye[X], -eye[Y], -eye[Z]);
-      compose (r, r, tmp);
+    if (up)
+	find_unit_vec_3d(unit_up, up);
+    else
+	copy_vec_3d(unit_up, default_up);
+
+    cross(h, unit_vd, unit_up);
+    cross(v, h, unit_vd);
+
+    R(1, 1) = h[X];
+    R(1, 2) = h[Y];
+    R(1, 3) = h[Z];
+    R(1, 4) = 0;
+    R(2, 1) = v[X];
+    R(2, 2) = v[Y];
+    R(2, 3) = v[Z];
+    R(2, 4) = 0;
+    R(3, 1) = -unit_vd[X];
+    R(3, 2) = -unit_vd[Y];
+    R(3, 3) = -unit_vd[Z];
+    R(3, 4) = 0;
+    R(4, 1) = 0;
+    R(4, 2) = 0;
+    R(4, 3) = 0;
+    R(4, 4) = 1;
+
+    if (eye) {
+	set_translation(tmp, -eye[X], -eye[Y], -eye[Z]);
+	compose(r, r, tmp);
     }
 }
 
 void
-set_view_transform_with_look_at (TRANSFORM r, POINT_3D eye,
-				 POINT_3D look_at, VECTOR_3D up)
+set_view_transform_with_look_at(TRANSFORM r, POINT_3D eye,
+				POINT_3D look_at, VECTOR_3D up)
 {
-  VECTOR_3D vd;
-  sub_vecs_3d (vd, look_at, eye);
-  set_view_transform (r, eye, vd, up);
+    VECTOR_3D vd;
+    sub_vecs_3d(vd, look_at, eye);
+    set_view_transform(r, eye, vd, up);
 }
 
 #define M(I,J) m[IT(I,J)]
 
 // invert a transform using the method of cofactors
 // this code was generated by the Perl program geninv.pl
-void
-invert (TRANSFORM r, FLOAT * det_rtn, TRANSFORM m, FLOAT min_det)
-{
-  int i;
-  FLOAT det;
-  FLOAT t001, t002, t003, t004, t005, t006, t007, t008,
-    t009, t010, t011, t012, t013, t014, t015, t016,
-    t017, t018, t019, t020, t021, t022, t023, t024,
-    t025, t026, t027, t028, t029, t030, t031, t032,
-    t033, t034, t035, t036, t037, t038, t039, t040,
-    t057, t058, t061, t062, t065, t066, t072, t073,
-    t076, t077, t085, t086, t097, t098, t101, t102,
-    t105, t106, t112, t113, t116, t117, t125, t126;
-  t001 = M (3, 3) * M (4, 4);
-  t002 = M (3, 4) * M (4, 3);
-  t003 = t001 - t002;
-  t004 = M (2, 2) * t003;
-  t005 = M (3, 2) * M (4, 4);
-  t006 = M (3, 4) * M (4, 2);
-  t007 = t006 - t005;
-  t008 = M (2, 3) * t007;
-  t009 = M (3, 2) * M (4, 3);
-  t010 = M (3, 3) * M (4, 2);
-  t011 = t009 - t010;
-  t012 = M (2, 4) * t011;
-  t013 = t004 + t008 + t012;
-  R (1, 1) = t013;
-  t014 = t002 - t001;
-  t015 = M (2, 1) * t014;
-  t016 = M (3, 1) * M (4, 4);
-  t017 = M (3, 4) * M (4, 1);
-  t018 = t016 - t017;
-  t019 = M (2, 3) * t018;
-  t020 = M (3, 1) * M (4, 3);
-  t021 = M (3, 3) * M (4, 1);
-  t022 = t021 - t020;
-  t023 = M (2, 4) * t022;
-  t024 = t015 + t019 + t023;
-  R (2, 1) = t024;
-  t025 = t005 - t006;
-  t026 = M (2, 1) * t025;
-  t027 = t017 - t016;
-  t028 = M (2, 2) * t027;
-  t029 = M (3, 1) * M (4, 2);
-  t030 = M (3, 2) * M (4, 1);
-  t031 = t029 - t030;
-  t032 = M (2, 4) * t031;
-  t033 = t026 + t028 + t032;
-  R (3, 1) = t033;
-  t034 = t010 - t009;
-  t035 = M (2, 1) * t034;
-  t036 = t020 - t021;
-  t037 = M (2, 2) * t036;
-  t038 = t030 - t029;
-  t039 = M (2, 3) * t038;
-  t040 = t035 + t037 + t039;
-  R (4, 1) = t040;
-  det =
-    (M (1, 1) * t013) + (M (1, 2) * t024) + (M (1, 3) * t033) +
-    (M (1, 4) * t040);
-  R (1, 2) = (M (1, 2) * t014) + (M (1, 3) * t025) + (M (1, 4) * t034);
-  R (2, 2) = (M (1, 1) * t003) + (M (1, 3) * t027) + (M (1, 4) * t036);
-  R (3, 2) = (M (1, 1) * t007) + (M (1, 2) * t018) + (M (1, 4) * t038);
-  R (4, 2) = (M (1, 1) * t011) + (M (1, 2) * t022) + (M (1, 3) * t031);
-  t057 = M (2, 3) * M (4, 4);
-  t058 = M (2, 4) * M (4, 3);
-  t061 = M (2, 2) * M (4, 4);
-  t062 = M (2, 4) * M (4, 2);
-  t065 = M (2, 2) * M (4, 3);
-  t066 = M (2, 3) * M (4, 2);
-  R (1, 3) =
-    ((t057 - t058) * M (1, 2)) + ((t062 - t061) * M (1,
-						     3)) + ((t065 -
-							     t066) * M (1,
-									4));
-  t072 = M (2, 1) * M (4, 4);
-  t073 = M (2, 4) * M (4, 1);
-  t076 = M (2, 1) * M (4, 3);
-  t077 = M (2, 3) * M (4, 1);
-  R (2, 3) =
-    ((t058 - t057) * M (1, 1)) + ((t072 - t073) * M (1,
-						     3)) + ((t077 -
-							     t076) * M (1,
-									4));
-  t085 = M (2, 1) * M (4, 2);
-  t086 = M (2, 2) * M (4, 1);
-  R (3, 3) =
-    ((t061 - t062) * M (1, 1)) + ((t073 - t072) * M (1,
-						     2)) + ((t085 -
-							     t086) * M (1,
-									4));
-  R (4, 3) =
-    ((t066 - t065) * M (1, 1)) + ((t076 - t077) * M (1,
-						     2)) + ((t086 -
-							     t085) * M (1,
-									3));
-  t097 = M (2, 3) * M (3, 4);
-  t098 = M (2, 4) * M (3, 3);
-  t101 = M (2, 2) * M (3, 4);
-  t102 = M (2, 4) * M (3, 2);
-  t105 = M (2, 2) * M (3, 3);
-  t106 = M (2, 3) * M (3, 2);
-  R (1, 4) =
-    ((t098 - t097) * M (1, 2)) + ((t101 - t102) * M (1,
-						     3)) + ((t106 -
-							     t105) * M (1,
-									4));
-  t112 = M (2, 1) * M (3, 4);
-  t113 = M (2, 4) * M (3, 1);
-  t116 = M (2, 1) * M (3, 3);
-  t117 = M (2, 3) * M (3, 1);
-  R (2, 4) =
-    ((t097 - t098) * M (1, 1)) + ((t113 - t112) * M (1,
-						     3)) + ((t116 -
-							     t117) * M (1,
-									4));
-  t125 = M (2, 1) * M (3, 2);
-  t126 = M (2, 2) * M (3, 1);
-  R (3, 4) =
-    ((t102 - t101) * M (1, 1)) + ((t112 - t113) * M (1,
-						     2)) + ((t126 -
-							     t125) * M (1,
-									4));
-  R (4, 4) =
-    ((t105 - t106) * M (1, 1)) + ((t117 - t116) * M (1,
-						     2)) + ((t125 -
-							     t126) * M (1,
-									3));
-  if (-min_det <= det && det <= min_det)
-    {
-      *det_rtn = 0;
-    }
-  else
-    {
-      *det_rtn = det;
-      for (i = 0; i < 16; i++)
-	r[i] *= 1 / det;
+void invert(TRANSFORM r, FLOAT * det_rtn, TRANSFORM m, FLOAT min_det)
+{
+    int i;
+    FLOAT det;
+    FLOAT t001, t002, t003, t004, t005, t006, t007, t008,
+	t009, t010, t011, t012, t013, t014, t015, t016,
+	t017, t018, t019, t020, t021, t022, t023, t024,
+	t025, t026, t027, t028, t029, t030, t031, t032,
+	t033, t034, t035, t036, t037, t038, t039, t040,
+	t057, t058, t061, t062, t065, t066, t072, t073,
+	t076, t077, t085, t086, t097, t098, t101, t102,
+	t105, t106, t112, t113, t116, t117, t125, t126;
+    t001 = M(3, 3) * M(4, 4);
+    t002 = M(3, 4) * M(4, 3);
+    t003 = t001 - t002;
+    t004 = M(2, 2) * t003;
+    t005 = M(3, 2) * M(4, 4);
+    t006 = M(3, 4) * M(4, 2);
+    t007 = t006 - t005;
+    t008 = M(2, 3) * t007;
+    t009 = M(3, 2) * M(4, 3);
+    t010 = M(3, 3) * M(4, 2);
+    t011 = t009 - t010;
+    t012 = M(2, 4) * t011;
+    t013 = t004 + t008 + t012;
+    R(1, 1) = t013;
+    t014 = t002 - t001;
+    t015 = M(2, 1) * t014;
+    t016 = M(3, 1) * M(4, 4);
+    t017 = M(3, 4) * M(4, 1);
+    t018 = t016 - t017;
+    t019 = M(2, 3) * t018;
+    t020 = M(3, 1) * M(4, 3);
+    t021 = M(3, 3) * M(4, 1);
+    t022 = t021 - t020;
+    t023 = M(2, 4) * t022;
+    t024 = t015 + t019 + t023;
+    R(2, 1) = t024;
+    t025 = t005 - t006;
+    t026 = M(2, 1) * t025;
+    t027 = t017 - t016;
+    t028 = M(2, 2) * t027;
+    t029 = M(3, 1) * M(4, 2);
+    t030 = M(3, 2) * M(4, 1);
+    t031 = t029 - t030;
+    t032 = M(2, 4) * t031;
+    t033 = t026 + t028 + t032;
+    R(3, 1) = t033;
+    t034 = t010 - t009;
+    t035 = M(2, 1) * t034;
+    t036 = t020 - t021;
+    t037 = M(2, 2) * t036;
+    t038 = t030 - t029;
+    t039 = M(2, 3) * t038;
+    t040 = t035 + t037 + t039;
+    R(4, 1) = t040;
+    det =
+	(M(1, 1) * t013) + (M(1, 2) * t024) + (M(1, 3) * t033) +
+	(M(1, 4) * t040);
+    R(1, 2) = (M(1, 2) * t014) + (M(1, 3) * t025) + (M(1, 4) * t034);
+    R(2, 2) = (M(1, 1) * t003) + (M(1, 3) * t027) + (M(1, 4) * t036);
+    R(3, 2) = (M(1, 1) * t007) + (M(1, 2) * t018) + (M(1, 4) * t038);
+    R(4, 2) = (M(1, 1) * t011) + (M(1, 2) * t022) + (M(1, 3) * t031);
+    t057 = M(2, 3) * M(4, 4);
+    t058 = M(2, 4) * M(4, 3);
+    t061 = M(2, 2) * M(4, 4);
+    t062 = M(2, 4) * M(4, 2);
+    t065 = M(2, 2) * M(4, 3);
+    t066 = M(2, 3) * M(4, 2);
+    R(1, 3) =
+	((t057 - t058) * M(1, 2)) + ((t062 - t061) * M(1,
+						       3)) + ((t065 -
+							       t066) * M(1,
+									 4));
+    t072 = M(2, 1) * M(4, 4);
+    t073 = M(2, 4) * M(4, 1);
+    t076 = M(2, 1) * M(4, 3);
+    t077 = M(2, 3) * M(4, 1);
+    R(2, 3) =
+	((t058 - t057) * M(1, 1)) + ((t072 - t073) * M(1,
+						       3)) + ((t077 -
+							       t076) * M(1,
+									 4));
+    t085 = M(2, 1) * M(4, 2);
+    t086 = M(2, 2) * M(4, 1);
+    R(3, 3) =
+	((t061 - t062) * M(1, 1)) + ((t073 - t072) * M(1,
+						       2)) + ((t085 -
+							       t086) * M(1,
+									 4));
+    R(4, 3) =
+	((t066 - t065) * M(1, 1)) + ((t076 - t077) * M(1,
+						       2)) + ((t086 -
+							       t085) * M(1,
+									 3));
+    t097 = M(2, 3) * M(3, 4);
+    t098 = M(2, 4) * M(3, 3);
+    t101 = M(2, 2) * M(3, 4);
+    t102 = M(2, 4) * M(3, 2);
+    t105 = M(2, 2) * M(3, 3);
+    t106 = M(2, 3) * M(3, 2);
+    R(1, 4) =
+	((t098 - t097) * M(1, 2)) + ((t101 - t102) * M(1,
+						       3)) + ((t106 -
+							       t105) * M(1,
+									 4));
+    t112 = M(2, 1) * M(3, 4);
+    t113 = M(2, 4) * M(3, 1);
+    t116 = M(2, 1) * M(3, 3);
+    t117 = M(2, 3) * M(3, 1);
+    R(2, 4) =
+	((t097 - t098) * M(1, 1)) + ((t113 - t112) * M(1,
+						       3)) + ((t116 -
+							       t117) * M(1,
+									 4));
+    t125 = M(2, 1) * M(3, 2);
+    t126 = M(2, 2) * M(3, 1);
+    R(3, 4) =
+	((t102 - t101) * M(1, 1)) + ((t112 - t113) * M(1,
+						       2)) + ((t126 -
+							       t125) * M(1,
+									 4));
+    R(4, 4) =
+	((t105 - t106) * M(1, 1)) + ((t117 - t116) * M(1,
+						       2)) + ((t125 -
+							       t126) * M(1,
+									 3));
+    if (-min_det <= det && det <= min_det) {
+	*det_rtn = 0;
+    } else {
+	*det_rtn = det;
+	for (i = 0; i < 16; i++)
+	    r[i] *= 1 / det;
     }
 }
 
 #define A(I,J) a[IT(I,J)]
 #define B(I,J) b[IT(I,J)]
-void
-compose_unsafe (TRANSFORM r, TRANSFORM a, TRANSFORM b)
+void compose_unsafe(TRANSFORM r, TRANSFORM a, TRANSFORM b)
 {
-  int i, j;
-  FLOAT *p = r;
+    int i, j;
+    FLOAT *p = r;
 
-  for (j = 1; j <= 4; j++)
-    for (i = 1; i <= 4; i++)
-      *p++ =
-	A (i, 1) * B (1, j) + A (i, 2) * B (2, j) + A (i, 3) * B (3,
-								  j) +
-	A (i, 4) * B (4, j);
+    for (j = 1; j <= 4; j++)
+	for (i = 1; i <= 4; i++)
+	    *p++ =
+		A(i, 1) * B(1, j) + A(i, 2) * B(2, j) + A(i, 3) * B(3,
+								    j) +
+		A(i, 4) * B(4, j);
 }
 
-void
-compose (TRANSFORM r, TRANSFORM a, TRANSFORM b)
+void compose(TRANSFORM r, TRANSFORM a, TRANSFORM b)
 {
-  TRANSFORM t;
-  compose_unsafe (t, a, b);
-  copy_transform (r, t);
+    TRANSFORM t;
+    compose_unsafe(t, a, b);
+    copy_transform(r, t);
 }
 
-void
-transform_pt_3d (POINT_3D r, TRANSFORM m, POINT_3D p)
+void transform_pt_3d(POINT_3D r, TRANSFORM m, POINT_3D p)
 {
-  POINT_3D t;
-  FLOAT wi;
+    POINT_3D t;
+    FLOAT wi;
 
-  wi = 1 / (M (4, 1) * p[X] + M (4, 2) * p[Y] + M (4, 3) * p[Z] + M (4, 4));
-  t[X] =
-    (M (1, 1) * p[X] + M (1, 2) * p[Y] + M (1, 3) * p[Z] + M (1, 4)) * wi;
-  t[Y] =
-    (M (2, 1) * p[X] + M (2, 2) * p[Y] + M (2, 3) * p[Z] + M (2, 4)) * wi;
-  t[Z] =
-    (M (3, 1) * p[X] + M (3, 2) * p[Y] + M (3, 3) * p[Z] + M (3, 4)) * wi;
-  copy_pt_3d (r, t);
+    wi = 1 / (M(4, 1) * p[X] + M(4, 2) * p[Y] + M(4, 3) * p[Z] + M(4, 4));
+    t[X] =
+	(M(1, 1) * p[X] + M(1, 2) * p[Y] + M(1, 3) * p[Z] + M(1, 4)) * wi;
+    t[Y] =
+	(M(2, 1) * p[X] + M(2, 2) * p[Y] + M(2, 3) * p[Z] + M(2, 4)) * wi;
+    t[Z] =
+	(M(3, 1) * p[X] + M(3, 2) * p[Y] + M(3, 3) * p[Z] + M(3, 4)) * wi;
+    copy_pt_3d(r, t);
 }
 
-void
-transform_vec_3d (VECTOR_3D r, TRANSFORM m, VECTOR_3D v)
+void transform_vec_3d(VECTOR_3D r, TRANSFORM m, VECTOR_3D v)
 {
-  VECTOR_3D t;
+    VECTOR_3D t;
 
-  t[X] = M (1, 1) * v[X] + M (1, 2) * v[Y] + M (1, 3) * v[Z];
-  t[Y] = M (2, 1) * v[X] + M (2, 2) * v[Y] + M (2, 3) * v[Z];
-  t[Z] = M (3, 1) * v[X] + M (3, 2) * v[Y] + M (3, 3) * v[Z];
-  copy_vec_3d (r, t);
+    t[X] = M(1, 1) * v[X] + M(1, 2) * v[Y] + M(1, 3) * v[Z];
+    t[Y] = M(2, 1) * v[X] + M(2, 2) * v[Y] + M(2, 3) * v[Z];
+    t[Z] = M(3, 1) * v[X] + M(3, 2) * v[Y] + M(3, 3) * v[Z];
+    copy_vec_3d(r, t);
 }
 
-void
-set_ident_quat (QUATERNION q)
+void set_ident_quat(QUATERNION q)
 {
-  q[W] = 1;
-  q[X] = q[Y] = q[Z] = 0;
+    q[W] = 1;
+    q[X] = q[Y] = q[Z] = 0;
 }
 
-void
-set_angle_axis_quat (QUATERNION q, FLOAT theta, VECTOR_3D axis)
+void set_angle_axis_quat(QUATERNION q, FLOAT theta, VECTOR_3D axis)
 {
-  VECTOR_3D v;
+    VECTOR_3D v;
 
-  find_unit_vec_3d (v, axis);
-  scale_vec_3d (&q[X], v, sin (theta));
-  q[W] = cos (theta);
+    find_unit_vec_3d(v, axis);
+    scale_vec_3d(&q[X], v, sin(theta));
+    q[W] = cos(theta);
 }
 
-void
-mult_quat (QUATERNION r, QUATERNION a, QUATERNION b)
+void mult_quat(QUATERNION r, QUATERNION a, QUATERNION b)
 {
-  r[W] = a[W] * b[W] - a[X] * b[X] - a[Y] * b[Y] - a[Z] * b[Z];
-  r[X] = a[W] * b[X] + a[X] * b[W] + a[Y] * b[Z] - a[Z] * b[Y];
-  r[Y] = a[W] * b[Y] - a[X] * b[Z] + a[Y] * b[W] + a[Z] * b[X];
-  r[Z] = a[W] * b[Z] + a[X] * b[Y] - a[Y] * b[X] + a[Z] * b[W];
+    r[W] = a[W] * b[W] - a[X] * b[X] - a[Y] * b[Y] - a[Z] * b[Z];
+    r[X] = a[W] * b[X] + a[X] * b[W] + a[Y] * b[Z] - a[Z] * b[Y];
+    r[Y] = a[W] * b[Y] - a[X] * b[Z] + a[Y] * b[W] + a[Z] * b[X];
+    r[Z] = a[W] * b[Z] + a[X] * b[Y] - a[Y] * b[X] + a[Z] * b[W];
 }
 
 #define R(I,J) r[IT(I,J)]
 #define SQR(A) ((A) * (A))
 
-void
-find_rot_from_quat (TRANSFORM r, QUATERNION q)
+void find_rot_from_quat(TRANSFORM r, QUATERNION q)
 {
-  FLOAT len2 = SQR (q[W]) + SQR (q[X]) + SQR (q[Y]) + SQR (q[Z]);
-  FLOAT s = len2 > 0 ? 2 / len2 : 0;
+    FLOAT len2 = SQR(q[W]) + SQR(q[X]) + SQR(q[Y]) + SQR(q[Z]);
+    FLOAT s = len2 > 0 ? 2 / len2 : 0;
 
-  R (1, 1) = 1 - s * (SQR (q[Y]) + SQR (q[Z]));
-  R (1, 2) = s * (q[X] * q[Y] - q[W] * q[Z]);
-  R (1, 3) = s * (q[X] * q[Z] + q[W] * q[Y]);
+    R(1, 1) = 1 - s * (SQR(q[Y]) + SQR(q[Z]));
+    R(1, 2) = s * (q[X] * q[Y] - q[W] * q[Z]);
+    R(1, 3) = s * (q[X] * q[Z] + q[W] * q[Y]);
 
-  R (2, 1) = s * (q[X] * q[Y] + q[W] * q[Z]);
-  R (2, 2) = 1 - s * (SQR (q[X]) + SQR (q[Z]));
-  R (2, 3) = s * (q[Y] * q[Z] - q[W] * q[X]);
+    R(2, 1) = s * (q[X] * q[Y] + q[W] * q[Z]);
+    R(2, 2) = 1 - s * (SQR(q[X]) + SQR(q[Z]));
+    R(2, 3) = s * (q[Y] * q[Z] - q[W] * q[X]);
 
-  R (3, 1) = s * (q[X] * q[Z] - q[W] * q[Y]);
-  R (3, 2) = s * (q[Y] * q[Z] + q[W] * q[X]);
-  R (3, 3) = 1 - s * (SQR (q[X]) + SQR (q[Y]));
+    R(3, 1) = s * (q[X] * q[Z] - q[W] * q[Y]);
+    R(3, 2) = s * (q[Y] * q[Z] + q[W] * q[X]);
+    R(3, 3) = 1 - s * (SQR(q[X]) + SQR(q[Y]));
 
-  R (1, 4) = R (4, 1) = R (2, 4) = R (4, 2) = R (3, 4) = R (4, 3) = 0;
-  R (4, 4) = 1;
+    R(1, 4) = R(4, 1) = R(2, 4) = R(4, 2) = R(3, 4) = R(4, 3) = 0;
+    R(4, 4) = 1;
 }
 
-void
-find_quat_from_rot (QUATERNION q, TRANSFORM r)
-{
-  if (R (1, 1) + R (2, 2) + R (3, 3) >= 0)
-    {				// w first
-      FLOAT w2 = sqrt (R (1, 1) + R (2, 2) + R (3, 3) + 1);
-      q[W] = 0.5 * w2;		// 1st
-      q[X] = (0.5 / w2) * (R (3, 2) - R (2, 3));	// (f)
-      q[Y] = (0.5 / w2) * (R (1, 3) - R (3, 1));	// (d)
-      q[Z] = (0.5 / w2) * (R (2, 1) - R (1, 2));	// (b)
-      return;
+void find_quat_from_rot(QUATERNION q, TRANSFORM r)
+{
+    if (R(1, 1) + R(2, 2) + R(3, 3) >= 0) {	// w first
+	FLOAT w2 = sqrt(R(1, 1) + R(2, 2) + R(3, 3) + 1);
+	q[W] = 0.5 * w2;	// 1st
+	q[X] = (0.5 / w2) * (R(3, 2) - R(2, 3));	// (f)
+	q[Y] = (0.5 / w2) * (R(1, 3) - R(3, 1));	// (d)
+	q[Z] = (0.5 / w2) * (R(2, 1) - R(1, 2));	// (b)
+	return;
     }
-  // x, y, or z first
-  if (R (1, 1) > R (2, 2))
-    if (R (1, 1) > R (3, 3))
-      goto x_first;
+    // x, y, or z first
+    if (R(1, 1) > R(2, 2))
+	if (R(1, 1) > R(3, 3))
+	    goto x_first;
+	else
+	    goto z_first;
+    else			// R(2,2) >= R(1,1)
+    if (R(2, 2) > R(3, 3))
+	goto y_first;
     else
-      goto z_first;
-  else				// R(2,2) >= R(1,1)
-  if (R (2, 2) > R (3, 3))
-    goto y_first;
-  else
-    goto z_first;
-
-x_first:{
-    FLOAT x2 = sqrt (R (1, 1) - R (2, 2) - R (3, 3) + 1);
-    q[W] = (0.5 / x2) * (R (3, 2) - R (2, 3));	// (f)
-    q[X] = 0.5 * x2;		// 1st
-    q[Y] = (0.5 / x2) * (R (2, 1) + R (1, 2));	// (a)
-    q[Z] = (0.5 / x2) * (R (1, 3) + R (3, 1));	// (c)
-    return;
-  }
-
-y_first:{
-    FLOAT y2 = sqrt (-R (1, 1) + R (2, 2) - R (3, 3) + 1);
-    q[W] = (0.5 / y2) * (R (1, 3) - R (3, 1));	// (d)
-    q[X] = (0.5 / y2) * (R (2, 1) + R (1, 2));	// (a)
-    q[Y] = 0.5 * y2;		// 1st
-    q[Z] = (0.5 / y2) * (R (3, 2) + R (2, 3));	// (e)
-    return;
-  }
-
-z_first:{
-    FLOAT z2 = sqrt (-R (1, 1) - R (2, 2) + R (3, 3) + 1);
-    q[W] = (0.5 / z2) * (R (2, 1) - R (1, 2));	// (b)
-    q[X] = (0.5 / z2) * (R (1, 3) + R (3, 1));	// (c)
-    q[Y] = (0.5 / z2) * (R (3, 2) + R (2, 3));	// (e)
-    q[Z] = 0.5 * z2;		// 1st
-    return;
-  }
+	goto z_first;
+
+  x_first:{
+	FLOAT x2 = sqrt(R(1, 1) - R(2, 2) - R(3, 3) + 1);
+	q[W] = (0.5 / x2) * (R(3, 2) - R(2, 3));	// (f)
+	q[X] = 0.5 * x2;	// 1st
+	q[Y] = (0.5 / x2) * (R(2, 1) + R(1, 2));	// (a)
+	q[Z] = (0.5 / x2) * (R(1, 3) + R(3, 1));	// (c)
+	return;
+    }
+
+  y_first:{
+	FLOAT y2 = sqrt(-R(1, 1) + R(2, 2) - R(3, 3) + 1);
+	q[W] = (0.5 / y2) * (R(1, 3) - R(3, 1));	// (d)
+	q[X] = (0.5 / y2) * (R(2, 1) + R(1, 2));	// (a)
+	q[Y] = 0.5 * y2;	// 1st
+	q[Z] = (0.5 / y2) * (R(3, 2) + R(2, 3));	// (e)
+	return;
+    }
+
+  z_first:{
+	FLOAT z2 = sqrt(-R(1, 1) - R(2, 2) + R(3, 3) + 1);
+	q[W] = (0.5 / z2) * (R(2, 1) - R(1, 2));	// (b)
+	q[X] = (0.5 / z2) * (R(1, 3) + R(3, 1));	// (c)
+	q[Y] = (0.5 / z2) * (R(3, 2) + R(2, 3));	// (e)
+	q[Z] = 0.5 * z2;	// 1st
+	return;
+    }
 }
 
 #undef R
 
 void
-make_cso_polygon_2d (POLYGON_2D * r, POLYGON_2D * a, POINT_2D p,
-		     POLYGON_2D * b)
-{
-  int j, ia, ja, ib, jb, ir, nb;
-  FLOAT x, y, dx_a, dy_a, dx_b, dy_b;
-
-  setup_polygon_2d (r, a->n_sides + b->n_sides);
-  r->n_sides = a->n_sides + b->n_sides;
-
-  ja = 0;
-  x = a->v[ja][X];
-  for (j = 1; j < a->n_sides; j++)
-    if (a->v[j][X] < x)
-      {
-	x = a->v[j][X];
-	ja = j;
-      }
-
-  jb = 0;
-  x = b->v[0][X];
-  for (j = 1; j < b->n_sides; j++)
-    if (b->v[j][X] > x)
-      {
-	x = b->v[j][X];
-	jb = j;
-      }
-  // this point is certain to be an extreme point of the cso
-  x = b->v[jb][X] + (p[X] - a->v[ja][X]);
-  y = b->v[jb][Y] + (p[Y] - a->v[ja][Y]);
-
-  ia = (ja + 1) % a->n_sides;
-  dx_a = a->v[ja][X] - a->v[ia][X];
-  dy_a = a->v[ja][Y] - a->v[ia][Y];
-  ib = (jb + 1) % b->n_sides;
-  dx_b = b->v[ib][X] - b->v[jb][X];
-  dy_b = b->v[ib][Y] - b->v[jb][Y];
-  nb = b->n_sides;
-  ir = 0;
-  for (;;)
-    {
-
-      // record obstacle polygon point and quit if done
-      r->v[ir][X] = x;
-      r->v[ir][Y] = y;
-      if (++ir == r->n_sides)
-	break;
-
-      // merge next edge of lowest theta. */
-      if (nb == 0 || dx_a * dy_b - dy_a * dx_b > 0)
-	{
-	  x += dx_a;
-	  y += dy_a;
-	  ja = ia;
-	  ia = (ja + 1) % a->n_sides;
-	  dx_a = a->v[ja][X] - a->v[ia][X];
-	  dy_a = a->v[ja][Y] - a->v[ia][Y];
+make_cso_polygon_2d(POLYGON_2D * r, POLYGON_2D * a, POINT_2D p,
+		    POLYGON_2D * b)
+{
+    int j, ia, ja, ib, jb, ir, nb;
+    FLOAT x, y, dx_a, dy_a, dx_b, dy_b;
+
+    setup_polygon_2d(r, a->n_sides + b->n_sides);
+    r->n_sides = a->n_sides + b->n_sides;
+
+    ja = 0;
+    x = a->v[ja][X];
+    for (j = 1; j < a->n_sides; j++)
+	if (a->v[j][X] < x) {
+	    x = a->v[j][X];
+	    ja = j;
 	}
-      else
-	{
-	  x += dx_b;
-	  y += dy_b;
-	  jb = ib;
-	  ib = (jb + 1) % b->n_sides;
-	  dx_b = b->v[ib][X] - b->v[jb][X];
-	  dy_b = b->v[ib][Y] - b->v[jb][Y];
-	  nb--;
+
+    jb = 0;
+    x = b->v[0][X];
+    for (j = 1; j < b->n_sides; j++)
+	if (b->v[j][X] > x) {
+	    x = b->v[j][X];
+	    jb = j;
+	}
+    // this point is certain to be an extreme point of the cso
+    x = b->v[jb][X] + (p[X] - a->v[ja][X]);
+    y = b->v[jb][Y] + (p[Y] - a->v[ja][Y]);
+
+    ia = (ja + 1) % a->n_sides;
+    dx_a = a->v[ja][X] - a->v[ia][X];
+    dy_a = a->v[ja][Y] - a->v[ia][Y];
+    ib = (jb + 1) % b->n_sides;
+    dx_b = b->v[ib][X] - b->v[jb][X];
+    dy_b = b->v[ib][Y] - b->v[jb][Y];
+    nb = b->n_sides;
+    ir = 0;
+    for (;;) {
+
+	// record obstacle polygon point and quit if done
+	r->v[ir][X] = x;
+	r->v[ir][Y] = y;
+	if (++ir == r->n_sides)
+	    break;
+
+	// merge next edge of lowest theta. */
+	if (nb == 0 || dx_a * dy_b - dy_a * dx_b > 0) {
+	    x += dx_a;
+	    y += dy_a;
+	    ja = ia;
+	    ia = (ja + 1) % a->n_sides;
+	    dx_a = a->v[ja][X] - a->v[ia][X];
+	    dy_a = a->v[ja][Y] - a->v[ia][Y];
+	} else {
+	    x += dx_b;
+	    y += dy_b;
+	    jb = ib;
+	    ib = (jb + 1) % b->n_sides;
+	    dx_b = b->v[ib][X] - b->v[jb][X];
+	    dy_b = b->v[ib][Y] - b->v[jb][Y];
+	    nb--;
 	}
     }
 }
 
-int
-point_near_convex_polygon_2d_p (POINT_2D p, POLYGON_2D * a, FLOAT eps)
-{
-  int i, j;
-  VECTOR_2D vji_perp, vjp;
-
-  // if the point is more than eps right of any edge, we're outside
-  for (i = 0, j = a->n_sides - 1; i < a->n_sides; j = i++)
-    {
-      vji_perp[X] = a->v[j][Y] - a->v[i][Y];
-      vji_perp[Y] = a->v[i][X] - a->v[j][X];
-      find_unit_vec_2d (vji_perp, vji_perp);
-      sub_pts_2d (vjp, p, a->v[j]);
-      if (dot_2d (vjp, vji_perp) <= eps)
-	return 0;
+int point_near_convex_polygon_2d_p(POINT_2D p, POLYGON_2D * a, FLOAT eps)
+{
+    int i, j;
+    VECTOR_2D vji_perp, vjp;
+
+    // if the point is more than eps right of any edge, we're outside
+    for (i = 0, j = a->n_sides - 1; i < a->n_sides; j = i++) {
+	vji_perp[X] = a->v[j][Y] - a->v[i][Y];
+	vji_perp[Y] = a->v[i][X] - a->v[j][X];
+	find_unit_vec_2d(vji_perp, vji_perp);
+	sub_pts_2d(vjp, p, a->v[j]);
+	if (dot_2d(vjp, vji_perp) <= eps)
+	    return 0;
     }
-  // else we're inside!
-  return 1;
+    // else we're inside!
+    return 1;
 }
 
-int
-point_inside_convex_polygon_2d_p (POINT_2D p, POLYGON_2D * a)
+int point_inside_convex_polygon_2d_p(POINT_2D p, POLYGON_2D * a)
 {
-  int i, j;
+    int i, j;
 
-  // if the point is right of any edge, we're outside
-  for (i = 0, j = a->n_sides - 1; i < a->n_sides; j = i++)
-    if ((p[X] - a->v[j][X]) * (a->v[i][Y] - a->v[j][Y]) -
-	(p[Y] - a->v[j][Y]) * (a->v[i][X] - a->v[j][X]) >= 0)
-      return 0;
+    // if the point is right of any edge, we're outside
+    for (i = 0, j = a->n_sides - 1; i < a->n_sides; j = i++)
+	if ((p[X] - a->v[j][X]) * (a->v[i][Y] - a->v[j][Y]) -
+	    (p[Y] - a->v[j][Y]) * (a->v[i][X] - a->v[j][X]) >= 0)
+	    return 0;
 
-  // else we're inside!
-  return 1;
+    // else we're inside!
+    return 1;
 }
 
 // The Franklin code...
-int
-point_inside_polygon_2d_p (POINT_2D p, POLYGON_2D * a)
-{
-  int i, j, r = 0;
-  for (i = 0, j = a->n_sides - 1; i < a->n_sides; j = i++)
-    {
-      if (((a->v[i][Y] <= p[Y] && p[Y] < a->v[j][Y]) ||
-	   (a->v[j][Y] <= p[Y] && p[Y] < a->v[i][Y])) &&
-	  (p[X] < (a->v[j][X] - a->v[i][X]) * (p[Y] - a->v[i][Y]) /
-	   (a->v[j][Y] - a->v[i][Y]) + a->v[i][X]))
-	r ^= 1;
+int point_inside_polygon_2d_p(POINT_2D p, POLYGON_2D * a)
+{
+    int i, j, r = 0;
+    for (i = 0, j = a->n_sides - 1; i < a->n_sides; j = i++) {
+	if (((a->v[i][Y] <= p[Y] && p[Y] < a->v[j][Y]) ||
+	     (a->v[j][Y] <= p[Y] && p[Y] < a->v[i][Y])) &&
+	    (p[X] < (a->v[j][X] - a->v[i][X]) * (p[Y] - a->v[i][Y]) /
+	     (a->v[j][Y] - a->v[i][Y]) + a->v[i][X]))
+	    r ^= 1;
     }
-  return r;
+    return r;
 }
 
 #ifdef TEST_INVERT
 
-void
-print_transform (TRANSFORM m)
-{
-  int i, j;
-  printf ("[\n");
-  for (i = 1; i <= 4; i++)
-    {
-      printf ("[");
-      for (j = 1; j <= 4; j++)
-	{
-	  printf (" %8.3g", m[IT (i, j)]);
+void print_transform(TRANSFORM m)
+{
+    int i, j;
+    printf("[\n");
+    for (i = 1; i <= 4; i++) {
+	printf("[");
+	for (j = 1; j <= 4; j++) {
+	    printf(" %8.3g", m[IT(i, j)]);
 	}
-      printf ("]\n");
+	printf("]\n");
     }
-  printf ("]\n");
+    printf("]\n");
 }
 
-int
-main (void)
+int main(void)
 {
-  TRANSFORM m = { 1, 0, 1, 1, 2, 4, 0, 19, 3, 5, 6, 57, 14, -3, 34, 1 }, r;
-  FLOAT det;
-  VECTOR_3D axis = { 1, 2, 3 };
-  POINT_3D pt = { -10, 2, 41 };
+    TRANSFORM m =
+	{ 1, 0, 1, 1, 2, 4, 0, 19, 3, 5, 6, 57, 14, -3, 34, 1 }, r;
+    FLOAT det;
+    VECTOR_3D axis = { 1, 2, 3 };
+    POINT_3D pt = { -10, 2, 41 };
 
-  // set_angle_axis_rot_about_point(m, 30, pt, axis);
-  print_transform (m);
-  invert (r, &det, m, 1e-4);
-  printf ("det=%.3g\n", det);
-  print_transform (r);
-  invert (m, &det, r, 1e-4);
-  printf ("det=%.3g\n", det);
-  print_transform (m);
+    // set_angle_axis_rot_about_point(m, 30, pt, axis);
+    print_transform(m);
+    invert(r, &det, m, 1e-4);
+    printf("det=%.3g\n", det);
+    print_transform(r);
+    invert(m, &det, r, 1e-4);
+    printf("det=%.3g\n", det);
+    print_transform(m);
 }
 
 #endif
@@ -1354,67 +1238,61 @@ main (void)
 #ifdef TEST_DYNARRAY_H
 
 // we need a dynamic arrao of these things
-typedef struct foo_t
-{
-  char *name;
-  int count;
-}
-FOO;
+typedef struct foo_t {
+    char *name;
+    int count;
+} FOO;
 
-typedef struct foo_array_t
-{
-  DYNAMIC_ARRAY_FIELDS (FOO, val, n_vals);
-}
-FOO_ARRAY;
+typedef struct foo_array_t {
+    DYNAMIC_ARRAY_FIELDS(FOO, val, n_vals);
+} FOO_ARRAY;
 
 // do the prototypes for the constructor, destructor, and accessor functions
-DECLARE_DYNAMIC_ARRAY_PROTOS (FOO_ARRAY, FOO, foo_list, val, n_vals)
+DECLARE_DYNAMIC_ARRAY_PROTOS(FOO_ARRAY, FOO, foo_list, val, n_vals)
 // ---- in foo.c ----
 // create the bodies for the constructor, destructor, and accessor functions
-  DECLARE_DYNAMIC_ARRAY_FUNCS (FOO_ARRAY, FOO, foo_list, val, n_vals)
+    DECLARE_DYNAMIC_ARRAY_FUNCS(FOO_ARRAY, FOO, foo_list, val, n_vals)
 // use all the new stuff!
-     void do_stuff_with_foos (void)
-{
-  int i;
-  char buf[100];
-  FOO_ARRAY list[1];		// or FOO_ARRAY list; but then we're forever &'ing
-  FOO_ARRAY copy[1];
-
-  init_foo_list (list);		// do this JUST ONCE right after declaration
-  init_foo_list (copy);		// (not necessary for static/global decls)
-
-  setup_foo_list (list, 10);	// allow for 10 elements
-
-  // read some data and push it on the list tail
-  while (scanf ("%d %s", &i, buf) == 2)
-    {
-      // get pointer to new (empty) element at the end of array
-      FOO *p = pushed_foo_list_val (list);
-      // fill in field values
-      p->name = strdup (buf);
-      p->count = i;
+void do_stuff_with_foos(void)
+{
+    int i;
+    char buf[100];
+    FOO_ARRAY list[1];		// or FOO_ARRAY list; but then we're forever &'ing
+    FOO_ARRAY copy[1];
+
+    init_foo_list(list);	// do this JUST ONCE right after declaration
+    init_foo_list(copy);	// (not necessary for static/global decls)
+
+    setup_foo_list(list, 10);	// allow for 10 elements
+
+    // read some data and push it on the list tail
+    while (scanf("%d %s", &i, buf) == 2) {
+	// get pointer to new (empty) element at the end of array
+	FOO *p = pushed_foo_list_val(list);
+	// fill in field values
+	p->name = strdup(buf);
+	p->count = i;
     }
 
-  // shows unsafe access to elements
-  printf ("forward listing:\n");
-  for (i = 0; i < list->n_vals; i++)
-    printf ("name=%s count=%d (%d)\n", list->val[i].name,	// fast unsafe access
-	    foo_list_val_ptr (list, i)->count,	// slower safe pointer access
-	    foo_list_val (list, i).count);	// copying access
-
-  copy_foo_list_filled (copy, list);	// copies only filled elements
-
-  // print in reverse order by popping from tail
-  printf ("backward listing:\n");
-  while (copy->n_vals > 0)
-    {
-      FOO *p = popped_foo_list_val (copy);
-      printf ("name=%s count=%d\n", p->name, p->count);
+    // shows unsafe access to elements
+    printf("forward listing:\n");
+    for (i = 0; i < list->n_vals; i++)
+	printf("name=%s count=%d (%d)\n", list->val[i].name,	// fast unsafe access
+	       foo_list_val_ptr(list, i)->count,	// slower safe pointer access
+	       foo_list_val(list, i).count);	// copying access
+
+    copy_foo_list_filled(copy, list);	// copies only filled elements
+
+    // print in reverse order by popping from tail
+    printf("backward listing:\n");
+    while (copy->n_vals > 0) {
+	FOO *p = popped_foo_list_val(copy);
+	printf("name=%s count=%d\n", p->name, p->count);
     }
 
-  // clear out all the allocated storage for the ilst
-  clear_foo_list (list);
-  clear_foo_list (copy);
+    // clear out all the allocated storage for the ilst
+    clear_foo_list(list);
+    clear_foo_list(copy);
 }
 
 #endif
diff --git a/geometry.h b/geometry.h
index 5e1c764..c67ef5b 100644
--- a/geometry.h
+++ b/geometry.h
@@ -33,10 +33,10 @@ http://www.gnu.org/copyleft */
 #define ARRAY_SIZE(A) (sizeof (A) / sizeof (A)[0])
 
 // checking memory allocators
-void *safe_malloc (unsigned size);
-void *safe_realloc (void *p, unsigned size);
-char *safe_strdup (char *str);
-void safe_free (void *p);
+void *safe_malloc(unsigned size);
+void *safe_realloc(void *p, unsigned size);
+char *safe_strdup(char *str);
+void safe_free(void *p);
 #ifdef _DEBUG
 #define malloc(N)    __call_safe_malloc_instead()
 #define realloc(P,N) __call_safe_alloc_instead()
@@ -64,8 +64,8 @@ typedef double FLOAT;
 #define PI ((FLOAT)3.1415926535897932384626433832795028841971693993751)
 
 // Max and min operators
-FLOAT max_float (FLOAT x, FLOAT y);
-FLOAT min_float (FLOAT x, FLOAT y);
+FLOAT max_float(FLOAT x, FLOAT y);
+FLOAT min_float(FLOAT x, FLOAT y);
 
 // ---- points -----------------------------------------------------------------
 
@@ -77,124 +77,114 @@ FLOAT min_float (FLOAT x, FLOAT y);
 
 // points
 typedef FLOAT POINT_2D[2], POINT_3D[3];
-void copy_pt_2d (POINT_2D r, POINT_2D s);
-void copy_pt_3d (POINT_3D r, POINT_3D s);
-void find_pt_3d_from_2d (POINT_3D r, POINT_2D pt);
+void copy_pt_2d(POINT_2D r, POINT_2D s);
+void copy_pt_3d(POINT_3D r, POINT_3D s);
+void find_pt_3d_from_2d(POINT_3D r, POINT_2D pt);
 
 // ---- polylines --------------------------------------------------------------
 
 // polylines are just dynamic arrays of points
 
-typedef struct polyline_2d_t
-{
-  DYNAMIC_2D_ARRAY_FIELDS (POINT_2D, v, n_vertices);
-  struct polyline_2d_t *next;
-}
-POLYLINE_2D;
-
-DECLARE_DYNAMIC_2D_ARRAY_PROTOS (POLYLINE_2D, POINT_2D, FLOAT, polyline_2d,
-				 v, n_vertices)
-     typedef struct polyline_3d_t
-     {
-       DYNAMIC_2D_ARRAY_FIELDS (POINT_3D, v, n_vertices);
-       struct polyline_3d_t *next;
-     }
-POLYLINE_3D;
-
-DECLARE_DYNAMIC_2D_ARRAY_PROTOS (POLYLINE_3D, POINT_3D, FLOAT, polyline_3d,
-				 v, n_vertices)
+typedef struct polyline_2d_t {
+    DYNAMIC_2D_ARRAY_FIELDS(POINT_2D, v, n_vertices);
+    struct polyline_2d_t *next;
+} POLYLINE_2D;
+
+DECLARE_DYNAMIC_2D_ARRAY_PROTOS(POLYLINE_2D, POINT_2D, FLOAT, polyline_2d,
+				v, n_vertices);
+typedef struct polyline_3d_t {
+    DYNAMIC_2D_ARRAY_FIELDS(POINT_3D, v, n_vertices);
+    struct polyline_3d_t *next;
+} POLYLINE_3D;
+
+DECLARE_DYNAMIC_2D_ARRAY_PROTOS(POLYLINE_3D, POINT_3D, FLOAT, polyline_3d,
+				v, n_vertices);
 // ---- polygons ---------------------------------------------------------------
 // polygons are just a dynamic arrays of points; chains represent complex polygons
-     typedef struct polygon_2d_t
-     {
-       DYNAMIC_2D_ARRAY_FIELDS (POINT_2D, v, n_sides);
-       struct polygon_2d_t *next;
-     }
-POLYGON_2D;
-
-DECLARE_DYNAMIC_2D_ARRAY_PROTOS (POLYGON_2D, POINT_2D, FLOAT, polygon_2d, v,
-				 n_sides)
-     typedef struct polygon_3d_t
-     {
-       DYNAMIC_2D_ARRAY_FIELDS (POINT_3D, v, n_sides);
-       struct polygon_3d_t *next;
-     }
-POLYGON_3D;
-
-DECLARE_DYNAMIC_2D_ARRAY_PROTOS (POLYGON_3D, POINT_3D, FLOAT, polygon_3d, v,
-				 n_sides)
+typedef struct polygon_2d_t {
+    DYNAMIC_2D_ARRAY_FIELDS(POINT_2D, v, n_sides);
+    struct polygon_2d_t *next;
+} POLYGON_2D;
+
+DECLARE_DYNAMIC_2D_ARRAY_PROTOS(POLYGON_2D, POINT_2D, FLOAT, polygon_2d, v,
+				n_sides);
+typedef struct polygon_3d_t {
+    DYNAMIC_2D_ARRAY_FIELDS(POINT_3D, v, n_sides);
+    struct polygon_3d_t *next;
+} POLYGON_3D;
+
+DECLARE_DYNAMIC_2D_ARRAY_PROTOS(POLYGON_3D, POINT_3D, FLOAT, polygon_3d, v,
+				n_sides);
 // ---- vectors ----------------------------------------------------------------
-     typedef FLOAT *VECTOR;
+typedef FLOAT *VECTOR;
 
 // vectors of dynamic length
-     void init_vec (VECTOR * v);
-     void clear_vec (VECTOR * v);
-     void setup_vec (VECTOR * v, SIZE n);
-     void init_and_setup_vec (VECTOR * v, SIZE n);
-     void zero_vec (VECTOR r, SIZE n);
-     void copy_vec (VECTOR r, VECTOR v, SIZE n);
+void init_vec(VECTOR * v);
+void clear_vec(VECTOR * v);
+void setup_vec(VECTOR * v, SIZE n);
+void init_and_setup_vec(VECTOR * v, SIZE n);
+void zero_vec(VECTOR r, SIZE n);
+void copy_vec(VECTOR r, VECTOR v, SIZE n);
 
 // vectors of useful static length.
-     typedef FLOAT VECTOR_2D[2], VECTOR_3D[3], VECTOR_4D[4];
-
-     FLOAT length_vec_2d (VECTOR_2D v);
-     FLOAT length_vec_3d (VECTOR_3D v);
-     FLOAT dist_2d (POINT_2D p1, POINT_2D p2);
-     FLOAT dist_3d (POINT_3D p1, POINT_3D p2);
-     FLOAT length_vec_2d_sqr (VECTOR_2D v);
-     FLOAT length_vec_3d_sqr (VECTOR_3D v);
-     FLOAT dist_2d_sqr (POINT_2D p1, POINT_2D p2);
-     FLOAT dist_3d_sqr (POINT_3D p1, POINT_3D p2);
-     void zero_vec_2d (VECTOR_2D v);
-     void zero_vec_3d (VECTOR_3D v);
-     void negate_vec_2d (VECTOR_2D r, VECTOR_2D v);
-     void negate_vec_3d (VECTOR_3D r, VECTOR_3D v);
-     void copy_vec_2d (VECTOR_2D r, VECTOR_2D s);
-     void copy_vec_3d (VECTOR_3D r, VECTOR_3D s);
-     void scale_vec_2d (VECTOR_2D r, VECTOR_2D v, FLOAT s);
-     void scale_vec_3d (VECTOR_3D r, VECTOR_3D v, FLOAT s);
-     int find_unit_vec_2d (VECTOR_2D r, VECTOR_2D v);
-     int find_unit_vec_3d (VECTOR_3D r, VECTOR_3D v);
-     void add_vecs_2d (VECTOR_2D r, VECTOR_2D a, VECTOR_2D b);
-     void add_vecs_3d (VECTOR_3D r, VECTOR_3D a, VECTOR_3D b);
-     void sub_vecs_2d (VECTOR_2D r, VECTOR_2D a, VECTOR_2D b);
-     void sub_vecs_3d (VECTOR_3D r, VECTOR_3D a, VECTOR_3D b);
-     void add_vec_to_pt_2d (POINT_2D r, POINT_2D pt, VECTOR_2D v);
-     void add_vec_to_pt_3d (POINT_3D r, POINT_3D pt, VECTOR_3D v);
-     void add_scaled_vec_to_pt_2d (POINT_2D r, POINT_2D pt, VECTOR_2D v,
-				   FLOAT s);
-     void add_scaled_vec_to_pt_3d (POINT_3D r, POINT_3D pt, VECTOR_3D v,
-				   FLOAT s);
-     void sub_pts_2d (VECTOR_2D r, POINT_2D a, POINT_2D b);
-     void sub_pts_3d (VECTOR_3D r, POINT_3D a, POINT_3D b);
-     void fold_min_pt_2d (POINT_2D min, POINT_2D new_pt);
-     void fold_min_pt_3d (POINT_3D min, POINT_3D new_pt);
-     void fold_max_pt_2d (POINT_2D max, POINT_2D new_pt);
-     void fold_max_pt_3d (POINT_3D max, POINT_3D new_pt);
-
-     FLOAT dot_2d (VECTOR_2D a, VECTOR_2D b);
-     FLOAT dot_3d (VECTOR_3D a, VECTOR_3D b);
-     void cross (VECTOR_3D r, VECTOR_3D a, VECTOR_3D b);
+typedef FLOAT VECTOR_2D[2], VECTOR_3D[3], VECTOR_4D[4];
+
+FLOAT length_vec_2d(VECTOR_2D v);
+FLOAT length_vec_3d(VECTOR_3D v);
+FLOAT dist_2d(POINT_2D p1, POINT_2D p2);
+FLOAT dist_3d(POINT_3D p1, POINT_3D p2);
+FLOAT length_vec_2d_sqr(VECTOR_2D v);
+FLOAT length_vec_3d_sqr(VECTOR_3D v);
+FLOAT dist_2d_sqr(POINT_2D p1, POINT_2D p2);
+FLOAT dist_3d_sqr(POINT_3D p1, POINT_3D p2);
+void zero_vec_2d(VECTOR_2D v);
+void zero_vec_3d(VECTOR_3D v);
+void negate_vec_2d(VECTOR_2D r, VECTOR_2D v);
+void negate_vec_3d(VECTOR_3D r, VECTOR_3D v);
+void copy_vec_2d(VECTOR_2D r, VECTOR_2D s);
+void copy_vec_3d(VECTOR_3D r, VECTOR_3D s);
+void scale_vec_2d(VECTOR_2D r, VECTOR_2D v, FLOAT s);
+void scale_vec_3d(VECTOR_3D r, VECTOR_3D v, FLOAT s);
+int find_unit_vec_2d(VECTOR_2D r, VECTOR_2D v);
+int find_unit_vec_3d(VECTOR_3D r, VECTOR_3D v);
+void add_vecs_2d(VECTOR_2D r, VECTOR_2D a, VECTOR_2D b);
+void add_vecs_3d(VECTOR_3D r, VECTOR_3D a, VECTOR_3D b);
+void sub_vecs_2d(VECTOR_2D r, VECTOR_2D a, VECTOR_2D b);
+void sub_vecs_3d(VECTOR_3D r, VECTOR_3D a, VECTOR_3D b);
+void add_vec_to_pt_2d(POINT_2D r, POINT_2D pt, VECTOR_2D v);
+void add_vec_to_pt_3d(POINT_3D r, POINT_3D pt, VECTOR_3D v);
+void add_scaled_vec_to_pt_2d(POINT_2D r, POINT_2D pt, VECTOR_2D v,
+			     FLOAT s);
+void add_scaled_vec_to_pt_3d(POINT_3D r, POINT_3D pt, VECTOR_3D v,
+			     FLOAT s);
+void sub_pts_2d(VECTOR_2D r, POINT_2D a, POINT_2D b);
+void sub_pts_3d(VECTOR_3D r, POINT_3D a, POINT_3D b);
+void fold_min_pt_2d(POINT_2D min, POINT_2D new_pt);
+void fold_min_pt_3d(POINT_3D min, POINT_3D new_pt);
+void fold_max_pt_2d(POINT_2D max, POINT_2D new_pt);
+void fold_max_pt_3d(POINT_3D max, POINT_3D new_pt);
+
+FLOAT dot_2d(VECTOR_2D a, VECTOR_2D b);
+FLOAT dot_3d(VECTOR_3D a, VECTOR_3D b);
+void cross(VECTOR_3D r, VECTOR_3D a, VECTOR_3D b);
 
 // linear interpolation operators
-     void lerp_2d (POINT_2D r, FLOAT t, POINT_2D p1, POINT_2D p2);
-     void lerp_3d (POINT_3D r, FLOAT t, POINT_3D p1, POINT_3D p2);
+void lerp_2d(POINT_2D r, FLOAT t, POINT_2D p1, POINT_2D p2);
+void lerp_3d(POINT_3D r, FLOAT t, POINT_3D p1, POINT_3D p2);
 
 // find parameters of intersection point of two line segments
-     int line_intersect_2d (POINT_2D a, POINT_2D b, POINT_2D c, POINT_2D d,
-			    FLOAT eps, FLOAT * t_ab, FLOAT * t_cd);
+int line_intersect_2d(POINT_2D a, POINT_2D b, POINT_2D c, POINT_2D d,
+		      FLOAT eps, FLOAT * t_ab, FLOAT * t_cd);
 
 // ---- planes -----------------------------------------------------------------
-     typedef struct plane_t
-     {
-       VECTOR_3D n;
-       POINT_3D p;
-       FLOAT c;
-     }
-PLANE;
+typedef struct plane_t {
+    VECTOR_3D n;
+    POINT_3D p;
+    FLOAT c;
+} PLANE;
 
 // return description of the plane of a polygon using Newell's method
-     void find_polygon_plane (PLANE * plane, POLYGON_3D * polygon);
+void find_polygon_plane(PLANE * plane, POLYGON_3D * polygon);
 
 #define S_IN      (1)
 #define S_ON      (2)
@@ -210,53 +200,49 @@ PLANE;
 //   S_IN or S_OUT if the point is resp. inside or outside the thickness of the plane
 //   S_IN_ON or S_OUT_ON if the point is within half_thickness of the plane on the resp. side
 //   S_ON if the point is precisely on the plane; no IN or OUT determination can be made
-     int pt_side_of_plane (PLANE * plane, POINT_3D p);
+int pt_side_of_plane(PLANE * plane, POINT_3D p);
 
 // given a polygon and a plane, return:
 //   S_IN if all the verices are IN or ON the thickened plane
 //   S_OUT if all the verices are OUTside or ON the thickened plane
 //   S_ON if all vertice are ON the thickened plane
 //   S_SPLIT otherwise
-     int polygon_side_of_plane (POLYGON_3D * polygon, PLANE * plane);
+int polygon_side_of_plane(POLYGON_3D * polygon, PLANE * plane);
 
 // given a polyline and a plane, return:
 //   S_IN if all segments of the line are fully INside the thickened plane
 //   S_OUT if all segments of the line are fully OUTside the thickened plane
 //   S_ON if all vertice are ON the thickened plane
 //   S_SPLIT otherwise
-     int polyline_side_of_plane (POLYLINE_3D * polyline, PLANE * plane);
+int polyline_side_of_plane(POLYLINE_3D * polyline, PLANE * plane);
 
 // ---- boxes ------------------------------------------------------------------
 
-     typedef struct box_2d_t
-     {
-       POINT_2D min, max;
-     }
-BOX_2D;
-
-     typedef struct box_3d_t
-     {
-       POINT_3D min, max;
-     }
-BOX_3D;
-
-     void init_box_2d (BOX_2D * b);
-     void init_box_3d (BOX_3D * b);
-     void fold_min_max_pt_2d (BOX_2D * b, POINT_2D p);
-     void fold_min_max_pt_3d (BOX_3D * b, POINT_3D p);
-     void fold_min_max_polygon_2d (BOX_2D * b, POLYGON_2D * polygon);
-     void fold_min_max_polygon_3d (BOX_3D * b, POLYGON_3D * polygon);
-     void fold_min_max_polyline_2d (BOX_2D * b, POLYLINE_2D * polyline);
-     void fold_min_max_polyline_3d (BOX_3D * b, POLYLINE_3D * polyline);
-     void copy_box_2d (BOX_2D * r, BOX_2D * s);
-     void copy_box_3d (BOX_3D * r, BOX_3D * s);
-     int boxes_2d_intersect_p (BOX_2D * a, BOX_2D * b);
-     int boxes_3d_intersect_p (BOX_2D * a, BOX_2D * b);
+typedef struct box_2d_t {
+    POINT_2D min, max;
+} BOX_2D;
+
+typedef struct box_3d_t {
+    POINT_3D min, max;
+} BOX_3D;
+
+void init_box_2d(BOX_2D * b);
+void init_box_3d(BOX_3D * b);
+void fold_min_max_pt_2d(BOX_2D * b, POINT_2D p);
+void fold_min_max_pt_3d(BOX_3D * b, POINT_3D p);
+void fold_min_max_polygon_2d(BOX_2D * b, POLYGON_2D * polygon);
+void fold_min_max_polygon_3d(BOX_3D * b, POLYGON_3D * polygon);
+void fold_min_max_polyline_2d(BOX_2D * b, POLYLINE_2D * polyline);
+void fold_min_max_polyline_3d(BOX_3D * b, POLYLINE_3D * polyline);
+void copy_box_2d(BOX_2D * r, BOX_2D * s);
+void copy_box_3d(BOX_3D * r, BOX_3D * s);
+int boxes_2d_intersect_p(BOX_2D * a, BOX_2D * b);
+int boxes_3d_intersect_p(BOX_2D * a, BOX_2D * b);
 
 // ---- transformations --------------------------------------------------------
 
 // homogeneous transform stored in column major order
-     typedef FLOAT TRANSFORM[16];
+typedef FLOAT TRANSFORM[16];
 
 // for initializations of identity transforms
 #define IDENT_TRANSFORM  \
@@ -267,93 +253,92 @@ BOX_3D;
 
 // ---- global contstants ------------------------------------------------------
 
-     extern TRANSFORM identity;
-     extern POINT_2D origin_2d;
-     extern POINT_3D origin_3d;
-     extern VECTOR_2D I_2d;
-     extern VECTOR_2D J_2d;
-     extern VECTOR_3D I_3d;
-     extern VECTOR_3D J_3d;
-     extern VECTOR_3D K_3d;
+extern TRANSFORM identity;
+extern POINT_2D origin_2d;
+extern POINT_3D origin_3d;
+extern VECTOR_2D I_2d;
+extern VECTOR_2D J_2d;
+extern VECTOR_3D I_3d;
+extern VECTOR_3D J_3d;
+extern VECTOR_3D K_3d;
 
 // row-column tranform indexing matches OpenGL convention: column major
 #define IT(I,J) (4 * ((J) - 1) + ((I) - 1))
 
 // copy source to result transform
-     void copy_transform (TRANSFORM r, TRANSFORM s);
+void copy_transform(TRANSFORM r, TRANSFORM s);
 
 // set the result transform to the identity
-     void set_ident (TRANSFORM r);
+void set_ident(TRANSFORM r);
 
 // create a rotation transform thru angle theta about axis u (must be unit vec)
-     void set_angle_axis_rot (TRANSFORM r, FLOAT theta, VECTOR_3D u);
+void set_angle_axis_rot(TRANSFORM r, FLOAT theta, VECTOR_3D u);
 
 // create a rotation transform thru angle theta
 // u is optional axis which need not be a unit vector (default is [0,0,1])
 // p is optional center of rotation (default is (0,0,0))
-     void set_angle_axis_rot_about_point (TRANSFORM r, FLOAT theta,
-					  POINT_3D p, VECTOR_3D u);
+void set_angle_axis_rot_about_point(TRANSFORM r, FLOAT theta,
+				    POINT_3D p, VECTOR_3D u);
 
 // create a scale transform
-     void set_scale (TRANSFORM r, FLOAT sx, FLOAT sy, FLOAT sz);
+void set_scale(TRANSFORM r, FLOAT sx, FLOAT sy, FLOAT sz);
 
 // create a translation transform
-     void set_translation (TRANSFORM r, FLOAT dx, FLOAT dy, FLOAT dz);
+void set_translation(TRANSFORM r, FLOAT dx, FLOAT dy, FLOAT dz);
 
 // create a true perspective projection (depth = p for all projected points)
-     void set_perspective_projection (TRANSFORM r, FLOAT p);
+void set_perspective_projection(TRANSFORM r, FLOAT p);
 
 // create a perspective transformation (depth is a pseudodepth)
-     void set_perspective_transform (TRANSFORM r, FLOAT p);
+void set_perspective_transform(TRANSFORM r, FLOAT p);
 
 // create a true parallel projection (depth = 0 for all projected points)
-     void set_parallel_projection (TRANSFORM r);
+void set_parallel_projection(TRANSFORM r);
 
 // create an OpenGL-like view transformation matrix
-     void set_view_transform (TRANSFORM r, POINT_3D eye, VECTOR_3D vd,
-			      VECTOR_3D up);
-     void set_view_transform_with_look_at (TRANSFORM r, POINT_3D eye,
-					   POINT_3D look_at, VECTOR_3D up);
+void set_view_transform(TRANSFORM r, POINT_3D eye, VECTOR_3D vd,
+			VECTOR_3D up);
+void set_view_transform_with_look_at(TRANSFORM r, POINT_3D eye,
+				     POINT_3D look_at, VECTOR_3D up);
 
 // invert a given transform m; return its determinant; we give up if the 
 // determinant is too small
-     void invert (TRANSFORM r, FLOAT * det_rtn, TRANSFORM m, FLOAT min_det);
+void invert(TRANSFORM r, FLOAT * det_rtn, TRANSFORM m, FLOAT min_det);
 
 // compose two transforms, but result cannot be the same as either operand
-     void compose_unsafe (TRANSFORM r, TRANSFORM a, TRANSFORM b);
+void compose_unsafe(TRANSFORM r, TRANSFORM a, TRANSFORM b);
 
 // same as above, but safe to use either operand to hold result.
-     void compose (TRANSFORM r, TRANSFORM a, TRANSFORM b);
+void compose(TRANSFORM r, TRANSFORM a, TRANSFORM b);
 
-     void transform_pt_3d (POINT_3D r, TRANSFORM m, POINT_3D p);
-     void transform_vec_3d (VECTOR_3D r, TRANSFORM m, VECTOR_3D p);
+void transform_pt_3d(POINT_3D r, TRANSFORM m, POINT_3D p);
+void transform_vec_3d(VECTOR_3D r, TRANSFORM m, VECTOR_3D p);
 
 // ---- quaternions ------------------------------------------------------------
 
-     typedef FLOAT QUATERNION[4];
+typedef FLOAT QUATERNION[4];
 
 // for initializations of identity quaternions
 #define IDENT_QUAT { 0.0, 0.0, 0.0, 1.0 }
 
-     void set_ident_quat (QUATERNION q);
-     void set_angle_axis_quat (QUATERNION q, FLOAT theta, VECTOR_3D axis);
-     void find_rot_from_quat (TRANSFORM r, QUATERNION q);
-     void find_quat_from_rot (QUATERNION q, TRANSFORM r);
-     void mult_quat (QUATERNION r, QUATERNION a, QUATERNION b);
+void set_ident_quat(QUATERNION q);
+void set_angle_axis_quat(QUATERNION q, FLOAT theta, VECTOR_3D axis);
+void find_rot_from_quat(TRANSFORM r, QUATERNION q);
+void find_quat_from_rot(QUATERNION q, TRANSFORM r);
+void mult_quat(QUATERNION r, QUATERNION a, QUATERNION b);
 
 // clear any storage for vertices in a polygon; after this,
 // its state is the same as after init_polygon_2d()
-     void clear_polygon_2d (POLYGON_2D * poly);
+void clear_polygon_2d(POLYGON_2D * poly);
 
 // compute minkowski difference B - A with distinguished point p
-     void make_cso_polygon_2d (POLYGON_2D * r, POLYGON_2D * a, POINT_2D p,
-			       POLYGON_2D * b);
+void make_cso_polygon_2d(POLYGON_2D * r, POLYGON_2D * a, POINT_2D p,
+			 POLYGON_2D * b);
 
 // checks to see if p is left of or on all the edges of polygon a.
-     int point_inside_convex_polygon_2d_p (POINT_2D p, POLYGON_2D * a);
+int point_inside_convex_polygon_2d_p(POINT_2D p, POLYGON_2D * a);
 
 // checks to see if p is no more than eps right of all the edges of polygon a.
-     int point_near_convex_polygon_2d_p (POINT_2D p, POLYGON_2D * a,
-					 FLOAT eps);
+int point_near_convex_polygon_2d_p(POINT_2D p, POLYGON_2D * a, FLOAT eps);
 
 #endif
diff --git a/geomio.c b/geomio.c
index fd1e166..a03e0a3 100644
--- a/geomio.c
+++ b/geomio.c
@@ -20,55 +20,49 @@ http://www.gnu.org/copyleft */
 
 #include "geomio.h"
 
-void
-print_pt_2d (FILE * f, POINT_2D pt)
+void print_pt_2d(FILE * f, POINT_2D pt)
 {
-  fprintf (f, "(%.3f,%.3f)", pt[X], pt[Y]);
+    fprintf(f, "(%.3f,%.3f)", pt[X], pt[Y]);
 }
 
-void
-print_pt_3d (FILE * f, POINT_3D pt)
+void print_pt_3d(FILE * f, POINT_3D pt)
 {
-  fprintf (f, "(%.3f,%.3f,%.3f)", pt[X], pt[Y], pt[Z]);
+    fprintf(f, "(%.3f,%.3f,%.3f)", pt[X], pt[Y], pt[Z]);
 }
 
-void
-print_polyline_3d (FILE * f, POLYLINE_3D * polyline)
+void print_polyline_3d(FILE * f, POLYLINE_3D * polyline)
 {
-  int i;
+    int i;
 
-  fprintf (f, "\\line");
-  for (i = 0; i < polyline->n_vertices; i++)
-    print_pt_3d (f, polyline->v[i]);
-  fprintf (f, "\n");
+    fprintf(f, "\\line");
+    for (i = 0; i < polyline->n_vertices; i++)
+	print_pt_3d(f, polyline->v[i]);
+    fprintf(f, "\n");
 }
 
-void
-print_polygon_2d (FILE * f, POLYGON_2D * polygon)
+void print_polygon_2d(FILE * f, POLYGON_2D * polygon)
 {
-  int i;
+    int i;
 
-  fprintf (f, "\\polygon");
-  for (i = 0; i < polygon->n_sides; i++)
-    print_pt_2d (f, polygon->v[i]);
-  fprintf (f, "\n");
+    fprintf(f, "\\polygon");
+    for (i = 0; i < polygon->n_sides; i++)
+	print_pt_2d(f, polygon->v[i]);
+    fprintf(f, "\n");
 }
 
-void
-print_polygon_3d (FILE * f, POLYGON_3D * polygon)
+void print_polygon_3d(FILE * f, POLYGON_3D * polygon)
 {
-  int i;
+    int i;
 
-  fprintf (f, "\\polygon");
-  for (i = 0; i < polygon->n_sides; i++)
-    print_pt_3d (f, polygon->v[i]);
-  fprintf (f, "\n");
+    fprintf(f, "\\polygon");
+    for (i = 0; i < polygon->n_sides; i++)
+	print_pt_3d(f, polygon->v[i]);
+    fprintf(f, "\n");
 }
 
-void
-print_plane (FILE * f, PLANE * plane)
+void print_plane(FILE * f, PLANE * plane)
 {
-  fprintf (f, "\\plane[n=%.3f %.3f %.3f,p=%.3f %.3f %.3f,c=%.3f]\n",
-	   plane->n[X], plane->n[Y], plane->n[Z],
-	   plane->p[X], plane->p[Y], plane->p[Z], plane->c);
+    fprintf(f, "\\plane[n=%.3f %.3f %.3f,p=%.3f %.3f %.3f,c=%.3f]\n",
+	    plane->n[X], plane->n[Y], plane->n[Z],
+	    plane->p[X], plane->p[Y], plane->p[Z], plane->c);
 }
diff --git a/geomio.h b/geomio.h
index ba8d125..b91a3c9 100644
--- a/geomio.h
+++ b/geomio.h
@@ -24,12 +24,12 @@ http://www.gnu.org/copyleft */
 #include <stdio.h>
 #include "geometry.h"
 
-void print_pt_2d (FILE * f, POINT_2D pt);
-void print_pt_3d (FILE * f, POINT_3D pt);
-void print_polyline_3d (FILE * f, POLYLINE_3D * polyline);
-void print_polygon_2d (FILE * f, POLYGON_2D * polygon);
-void print_polygon_3d (FILE * f, POLYGON_3D * polygon);
-void print_plane (FILE * f, PLANE * plane);
+void print_pt_2d(FILE * f, POINT_2D pt);
+void print_pt_3d(FILE * f, POINT_3D pt);
+void print_polyline_3d(FILE * f, POLYLINE_3D * polyline);
+void print_polygon_2d(FILE * f, POLYGON_2D * polygon);
+void print_polygon_3d(FILE * f, POLYGON_3D * polygon);
+void print_plane(FILE * f, PLANE * plane);
 
 
 #endif
diff --git a/global.c b/global.c
index 6833363..2458774 100644
--- a/global.c
+++ b/global.c
@@ -24,159 +24,140 @@ GLOBAL_ENV __the_global_env[1];
 
 // must match GEOL_lang definitions in global.h
 char *output_language_str[] = {
-  "PSTricks,LaTeX",
-  "PGF/TikZ,LaTeX",
-  "PSTricks,ConTeXt",
-  "PGF/TikZ,ConTeXt",
+    "PSTricks,LaTeX",
+    "PGF/TikZ,LaTeX",
+    "PSTricks,ConTeXt",
+    "PGF/TikZ,ConTeXt",
 };
 
 void
-init_global_env (GLOBAL_ENV * env, 
-		 PST_VERSION *pst_version,
-		 TIKZ_VERSION *tikz_version)
+init_global_env(GLOBAL_ENV * env,
+		PST_VERSION * pst_version, TIKZ_VERSION * tikz_version)
 {
-  env->set_p_mask = 0;
-  set_ident (env->camera);
-  copy_pt_3d (env->bb1, origin_3d);
-  copy_pt_3d (env->bb2, origin_3d);
-  init_opts (env->opts);
-  env->baseline = 0;
-  env->output_language = GEOL_PSTRICKS | GEOL_LATEX;
-  *env->pst_version = *pst_version;
-  *env->tikz_version = *tikz_version;
+    env->set_p_mask = 0;
+    set_ident(env->camera);
+    copy_pt_3d(env->bb1, origin_3d);
+    copy_pt_3d(env->bb2, origin_3d);
+    init_opts(env->opts);
+    env->baseline = 0;
+    env->output_language = GEOL_PSTRICKS | GEOL_LATEX;
+    *env->pst_version = *pst_version;
+    *env->tikz_version = *tikz_version;
 }
 
-void
-set_global_baseline (GLOBAL_ENV * env, FLOAT baseline, SRC_LINE line)
+void set_global_baseline(GLOBAL_ENV * env, FLOAT baseline, SRC_LINE line)
 {
-  if (baseline == NO_BASELINE)
-    return;
-  if (global_env_is_set_p (env, GE_BASELINE))
-    {
-      err (line, "baseline is already set");
-      return;
+    if (baseline == NO_BASELINE)
+	return;
+    if (global_env_is_set_p(env, GE_BASELINE)) {
+	err(line, "baseline is already set");
+	return;
     }
-  env->set_p_mask |= bit (GE_BASELINE);
-  env->baseline = baseline;
+    env->set_p_mask |= bit(GE_BASELINE);
+    env->baseline = baseline;
 }
 
 void
-set_global_env_extent (GLOBAL_ENV * env, POINT_3D p1, POINT_3D p2,
-		       SRC_LINE line)
+set_global_env_extent(GLOBAL_ENV * env, POINT_3D p1, POINT_3D p2,
+		      SRC_LINE line)
 {
-  if (global_env_is_set_p (env, GE_EXTENT))
-    {
-      err (line, "bounding box is already set");
-      return;
+    if (global_env_is_set_p(env, GE_EXTENT)) {
+	err(line, "bounding box is already set");
+	return;
     }
-  env->set_p_mask |= bit (GE_EXTENT);
-  copy_pt_3d (env->bb1, p1);
-  copy_pt_3d (env->bb2, p2);
+    env->set_p_mask |= bit(GE_EXTENT);
+    copy_pt_3d(env->bb1, p1);
+    copy_pt_3d(env->bb2, p2);
 }
 
-int
-get_transformed_global_env_extent (BOX_3D * extent, GLOBAL_ENV * env)
+int get_transformed_global_env_extent(BOX_3D * extent, GLOBAL_ENV * env)
 {
-  POINT_3D t;
-  int i;
-
-  if (!global_env_is_set_p (env, GE_EXTENT))
-    return 0;
-
-  init_box_3d (extent);
-  if (global_env_is_set_p (env, GE_CAMERA))
-    {
-      for (i = 0; i < 8; i++)
-	{
-	  t[X] = (i & 1) ? env->bb1[X] : env->bb2[X];
-	  t[Y] = (i & 2) ? env->bb1[Y] : env->bb2[Y];
-	  t[Z] = (i & 4) ? env->bb1[Z] : env->bb2[Z];
-	  transform_pt_3d (t, env->camera, t);
-	  fold_min_max_pt_3d (extent, t);
+    POINT_3D t;
+    int i;
+
+    if (!global_env_is_set_p(env, GE_EXTENT))
+	return 0;
+
+    init_box_3d(extent);
+    if (global_env_is_set_p(env, GE_CAMERA)) {
+	for (i = 0; i < 8; i++) {
+	    t[X] = (i & 1) ? env->bb1[X] : env->bb2[X];
+	    t[Y] = (i & 2) ? env->bb1[Y] : env->bb2[Y];
+	    t[Z] = (i & 4) ? env->bb1[Z] : env->bb2[Z];
+	    transform_pt_3d(t, env->camera, t);
+	    fold_min_max_pt_3d(extent, t);
 	}
+    } else {
+	fold_min_max_pt_3d(extent, env->bb1);
+	fold_min_max_pt_3d(extent, env->bb2);
     }
-  else
-    {
-      fold_min_max_pt_3d (extent, env->bb1);
-      fold_min_max_pt_3d (extent, env->bb2);
-    }
-  return 1;
+    return 1;
 }
 
-void
-set_global_env_opts (GLOBAL_ENV * env, char *opt_str, SRC_LINE line)
+void set_global_env_opts(GLOBAL_ENV * env, char *opt_str, SRC_LINE line)
 {
-  if (global_env_is_set_p (env, GE_OPTS))
-    {
-      err (line, "global options are already set");
-      return;
+    if (global_env_is_set_p(env, GE_OPTS)) {
+	err(line, "global options are already set");
+	return;
     }
-  env->set_p_mask |= bit (GE_OPTS);
-  setup_opts (env->opts, opt_str, no_line);
+    env->set_p_mask |= bit(GE_OPTS);
+    setup_opts(env->opts, opt_str, no_line);
 }
 
-void
-set_global_env_frame (GLOBAL_ENV * env, char *opt_str, SRC_LINE line)
+void set_global_env_frame(GLOBAL_ENV * env, char *opt_str, SRC_LINE line)
 {
-  if (global_env_is_set_p (env, GE_FRAME))
-    {
-      err (line, "frame is already set");
-      return;
+    if (global_env_is_set_p(env, GE_FRAME)) {
+	err(line, "frame is already set");
+	return;
     }
-  env->set_p_mask |= bit (GE_FRAME);
-  safe_free (env->frame_opts);
-  env->frame_opts = opt_str ? safe_strdup (opt_str) : NULL;
+    env->set_p_mask |= bit(GE_FRAME);
+    safe_free(env->frame_opts);
+    env->frame_opts = opt_str ? safe_strdup(opt_str) : NULL;
 }
 
 void
-set_global_env_camera (GLOBAL_ENV * env, TRANSFORM camera, SRC_LINE line)
+set_global_env_camera(GLOBAL_ENV * env, TRANSFORM camera, SRC_LINE line)
 {
-  if (global_env_is_set_p (env, GE_CAMERA))
-    {
-      err (line, "camera is already set");
-      return;
+    if (global_env_is_set_p(env, GE_CAMERA)) {
+	err(line, "camera is already set");
+	return;
     }
-  env->set_p_mask |= bit (GE_CAMERA);
-  copy_transform (env->camera, camera);
+    env->set_p_mask |= bit(GE_CAMERA);
+    copy_transform(env->camera, camera);
 }
 
 void
-set_global_output_language (GLOBAL_ENV * env, int output_language,
-			    SRC_LINE line)
+set_global_output_language(GLOBAL_ENV * env, int output_language,
+			   SRC_LINE line)
 {
-  if (global_env_is_set_p (env, GE_OUTPUT_LANGUAGE))
-    {
-      err (line, "output language is already set");
-      return;
+    if (global_env_is_set_p(env, GE_OUTPUT_LANGUAGE)) {
+	err(line, "output language is already set");
+	return;
     }
-  env->set_p_mask |= bit (GE_OUTPUT_LANGUAGE);
-  env->output_language = output_language;
+    env->set_p_mask |= bit(GE_OUTPUT_LANGUAGE);
+    env->output_language = output_language;
 }
 
-int
-get_global_output_language (int * output_language, GLOBAL_ENV * env)
+int get_global_output_language(int *output_language, GLOBAL_ENV * env)
 {
-  *output_language = env->output_language;
-  return global_env_is_set_p (env, GE_OUTPUT_LANGUAGE);
+    *output_language = env->output_language;
+    return global_env_is_set_p(env, GE_OUTPUT_LANGUAGE);
 }
 
 int cmp_with_global_pst_version(GLOBAL_ENV * env,
-				char * version_str, 
-				SRC_LINE line)
+				char *version_str, SRC_LINE line)
 {
-  PST_VERSION v[1];
+    PST_VERSION v[1];
 
-  parse_pst_version(v, version_str, line);
-  return pst_version_cmp(env->pst_version, v);
+    parse_pst_version(v, version_str, line);
+    return pst_version_cmp(env->pst_version, v);
 }
 
 int cmp_with_global_tikz_version(GLOBAL_ENV * env,
-				 char * version_str, 
-				 SRC_LINE line)
+				 char *version_str, SRC_LINE line)
 {
-  PST_VERSION v[1];
+    PST_VERSION v[1];
 
-  parse_tikz_version(v, version_str, line);
-  return tikz_version_cmp(env->tikz_version, v);
+    parse_tikz_version(v, version_str, line);
+    return tikz_version_cmp(env->tikz_version, v);
 }
-
diff --git a/global.h b/global.h
index 58dbde6..efcfed7 100644
--- a/global.h
+++ b/global.h
@@ -45,42 +45,39 @@ http://www.gnu.org/copyleft */
 // this must match string table in global.c
 extern char *output_language_str[];
 
-typedef struct global_env_t
-{
-  unsigned set_p_mask;
-  OPTS opts[1];
-  POINT_3D bb1, bb2;		// bounding box 
-  char *frame_opts;		// null if frame has none
-  FLOAT baseline;
-  int split_p;
-  TRANSFORM camera;
-  int output_language;
-  PST_VERSION pst_version[1];
-  TIKZ_VERSION tikz_version[1];
-}
-GLOBAL_ENV;
+typedef struct global_env_t {
+    unsigned set_p_mask;
+    OPTS opts[1];
+    POINT_3D bb1, bb2;		// bounding box 
+    char *frame_opts;		// null if frame has none
+    FLOAT baseline;
+    int split_p;
+    TRANSFORM camera;
+    int output_language;
+    PST_VERSION pst_version[1];
+    TIKZ_VERSION tikz_version[1];
+} GLOBAL_ENV;
 
 #define global_env_is_set_p(Env, F) ((Env)->set_p_mask & bit(F))
 
-void init_global_env (GLOBAL_ENV * env, PST_VERSION *pst_version, TIKZ_VERSION *tikz_version);
-void set_global_baseline (GLOBAL_ENV * env, FLOAT baseline, SRC_LINE line);
+void init_global_env(GLOBAL_ENV * env, PST_VERSION * pst_version,
+		     TIKZ_VERSION * tikz_version);
+void set_global_baseline(GLOBAL_ENV * env, FLOAT baseline, SRC_LINE line);
 #define NO_BASELINE FLT_MAX
-void set_global_env_extent (GLOBAL_ENV * env, POINT_3D p1, POINT_3D p2,
-			    SRC_LINE line);
-int get_transformed_global_env_extent (BOX_3D * extent, GLOBAL_ENV * env);
-void set_global_env_opts (GLOBAL_ENV * env, char *opt_str, SRC_LINE line);
-void set_global_env_frame (GLOBAL_ENV * env, char *opt_str, SRC_LINE line);
-void set_global_env_camera (GLOBAL_ENV * env, TRANSFORM camera,
-			    SRC_LINE line);
-void set_global_output_language (GLOBAL_ENV * env, int output_language,
-				 SRC_LINE line);
-int get_global_output_language (int *output_language, GLOBAL_ENV * env);
-int cmp_with_global_pst_version(GLOBAL_ENV * env,
-				char * version_str, 
+void set_global_env_extent(GLOBAL_ENV * env, POINT_3D p1, POINT_3D p2,
+			   SRC_LINE line);
+int get_transformed_global_env_extent(BOX_3D * extent, GLOBAL_ENV * env);
+void set_global_env_opts(GLOBAL_ENV * env, char *opt_str, SRC_LINE line);
+void set_global_env_frame(GLOBAL_ENV * env, char *opt_str, SRC_LINE line);
+void set_global_env_camera(GLOBAL_ENV * env, TRANSFORM camera,
+			   SRC_LINE line);
+void set_global_output_language(GLOBAL_ENV * env, int output_language,
 				SRC_LINE line);
+int get_global_output_language(int *output_language, GLOBAL_ENV * env);
+int cmp_with_global_pst_version(GLOBAL_ENV * env,
+				char *version_str, SRC_LINE line);
 int cmp_with_global_tikz_version(GLOBAL_ENV * env,
-				 char * version_str, 
-				 SRC_LINE line);
+				 char *version_str, SRC_LINE line);
 
 extern GLOBAL_ENV __the_global_env[1];
 
diff --git a/langver.c b/langver.c
index 0a535a9..81c09a7 100644
--- a/langver.c
+++ b/langver.c
@@ -21,125 +21,99 @@ http://www.gnu.org/copyleft */
 #include <string.h>
 #include "langver.h"
 
-int
-is_digit (int ch)
+int is_digit(int ch)
 {
-  return '0' <= ch && ch <= '9';
+    return '0' <= ch && ch <= '9';
 }
 
-int
-lower (int ch)
+int lower(int ch)
 {
-  return ('A' <= ch && ch <= 'Z') ? ch + ('a' - 'A') : ch;
+    return ('A' <= ch && ch <= 'Z') ? ch + ('a' - 'A') : ch;
 }
 
-int
-is_alpha(int ch)
+int is_alpha(int ch)
 {
-  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z');
+    return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z');
 }
 
-int
-parse_pst_version (PST_VERSION *v, char *str, SRC_LINE line)
+int parse_pst_version(PST_VERSION * v, char *str, SRC_LINE line)
 {
 #define M (sizeof v->key / 2)
-  int i = 0, iv = 0, i_minor = -1;
+    int i = 0, iv = 0, i_minor = -1;
 
-  memset(v->key, '0', sizeof v->key);
-  memset(v->str, '\0', sizeof v->str);
+    memset(v->key, '0', sizeof v->key);
+    memset(v->str, '\0', sizeof v->str);
 
-  if (strlen(str) > sizeof v->str - 1) 
-    {
-      err (line, "PSTricks version string too long");
-      return 1;
+    if (strlen(str) > sizeof v->str - 1) {
+	err(line, "PSTricks version string too long");
+	return 1;
     }
 //A :
-    if ( is_digit (str[i]) )
-      {
+    if (is_digit(str[i])) {
 	v->str[iv++] = str[i++];
 	goto B;
-      }
-    else
-      {
-	err (line, "bad character '%c' in PSTricks version", str[i]);
+    } else {
+	err(line, "bad character '%c' in PSTricks version", str[i]);
 	return 2;
-      }
-  B :
-    if ( is_digit (str[i]) )
-      {
+    }
+  B:
+    if (is_digit(str[i])) {
 	v->str[iv++] = str[i++];
 	goto B;
-      }
-    else if ( str[i] == '.' )
-      {
-	memcpy (&v->key[M - i], v->str, i); // save major in key
+    } else if (str[i] == '.') {
+	memcpy(&v->key[M - i], v->str, i);	// save major in key
 	v->str[iv++] = str[i++];
-	i_minor = iv; // remember where minor version starts
+	i_minor = iv;		// remember where minor version starts
 	goto C;
-      }
-    else 
-      {
-	err (line, "expected dot in PSTricks version");
+    } else {
+	err(line, "expected dot in PSTricks version");
 	return 3;
-      }
-  C :
-    if ( is_digit (str[i]) ) 
-      {
+    }
+  C:
+    if (is_digit(str[i])) {
 	v->str[iv++] = str[i++];
 	goto D;
-      }
-    else
-      {
-	err (line, "expected digit after dot in PSTricks version");
+    } else {
+	err(line, "expected digit after dot in PSTricks version");
 	return 4;
-      }
-  D :
-    if ( is_digit (str[i]) ) 
-      {
+    }
+  D:
+    if (is_digit(str[i])) {
 	v->str[iv++] = str[i++];
 	goto D;
-      }
-    else if ( is_alpha(str[i]) ) 
-      {
-	v->str[iv++] = lower (str[i++]);
+    } else if (is_alpha(str[i])) {
+	v->str[iv++] = lower(str[i++]);
 	goto F;
-      }
-    else if ( str[i] == '\0' ) 
-      {
-	memcpy (&v->key[M], &v->str[i_minor], i - i_minor); // save minor in key
-	return 0; /* accept */
-      }
-    else
-      {
-	err (line, "expected digit or subversion letter in PSTricks version");
+    } else if (str[i] == '\0') {
+	memcpy(&v->key[M], &v->str[i_minor], i - i_minor);	// save minor in key
+	return 0;		/* accept */
+    } else {
+	err(line,
+	    "expected digit or subversion letter in PSTricks version");
 	return 5;
-      }
- F:
-  if ( str[i] == '\0' ) 
-    {
-      memcpy (&v->key[M], &v->str[i_minor], i - i_minor);
-      return 0; /* accept */
     }
-  else
-    {
-      err (line, "expected end of PSTricks version, found '%c'", str[i]);
-      return 6;
+  F:
+    if (str[i] == '\0') {
+	memcpy(&v->key[M], &v->str[i_minor], i - i_minor);
+	return 0;		/* accept */
+    } else {
+	err(line, "expected end of PSTricks version, found '%c'", str[i]);
+	return 6;
     }
-  return -1;
+    return -1;
 }
 
-int
-pst_version_cmp(PST_VERSION *a, PST_VERSION *b)
+int pst_version_cmp(PST_VERSION * a, PST_VERSION * b)
 {
-  return strncmp(a->key, b->key, sizeof a->key);
+    return strncmp(a->key, b->key, sizeof a->key);
 }
 
-int parse_tikz_version (TIKZ_VERSION *v, char *str, SRC_LINE line)
+int parse_tikz_version(TIKZ_VERSION * v, char *str, SRC_LINE line)
 {
-  return parse_pst_version(v, str, line);
+    return parse_pst_version(v, str, line);
 }
 
-int tikz_version_cmp(TIKZ_VERSION *a, TIKZ_VERSION *b)
+int tikz_version_cmp(TIKZ_VERSION * a, TIKZ_VERSION * b)
 {
-  return pst_version_cmp(a, b);
+    return pst_version_cmp(a, b);
 }
diff --git a/langver.h b/langver.h
index 31c33e2..dd9165a 100644
--- a/langver.h
+++ b/langver.h
@@ -25,15 +25,13 @@ http://www.gnu.org/copyleft */
 
 #define MAX_PST_VERSION_STRING_SIZE 10
 
-typedef struct pst_version_t 
-{
-  char str[MAX_PST_VERSION_STRING_SIZE];
-  char key[MAX_PST_VERSION_STRING_SIZE * 2];
-}
-PST_VERSION;
+typedef struct pst_version_t {
+    char str[MAX_PST_VERSION_STRING_SIZE];
+    char key[MAX_PST_VERSION_STRING_SIZE * 2];
+} PST_VERSION;
 
-int parse_pst_version (PST_VERSION *v, char *str, SRC_LINE line);
-int pst_version_cmp(PST_VERSION *a, PST_VERSION *b);
+int parse_pst_version(PST_VERSION * v, char *str, SRC_LINE line);
+int pst_version_cmp(PST_VERSION * a, PST_VERSION * b);
 
 /* Version 1.20 added linejoin option, where pstverb was 
    needed previously. */
@@ -41,14 +39,14 @@ int pst_version_cmp(PST_VERSION *a, PST_VERSION *b);
 
 /* This should be set to the latest version that 
    makes a difference for Sketch output. */
-#define ASSUMED_PST_VERSION PST_LINEJOIN_VERSION 
+#define ASSUMED_PST_VERSION PST_LINEJOIN_VERSION
 
 /* TikZ versions are just like PSTricks versions (except
    no letter qualifiers yet */
 typedef PST_VERSION TIKZ_VERSION;
 
-int parse_tikz_version (TIKZ_VERSION *v, char *str, SRC_LINE line);
-int tikz_version_cmp(TIKZ_VERSION *a, TIKZ_VERSION *b);
+int parse_tikz_version(TIKZ_VERSION * v, char *str, SRC_LINE line);
+int tikz_version_cmp(TIKZ_VERSION * a, TIKZ_VERSION * b);
 
 #define TIKZ_DECORATIONS_VERSION 2.00
 
diff --git a/main.c b/main.c
index 0486a5f..f66aa5e 100644
--- a/main.c
+++ b/main.c
@@ -26,106 +26,94 @@ http://www.gnu.org/copyleft */
 
 static CMD_LINE_OPT_ENV wrap_env[1];
 
-int
-main (int argc, char *argv[])
+int main(int argc, char *argv[])
 {
-  OBJECT *scene, *hsr_scene;
-  int ret;
-  FILE *out_file;
-  SYMBOL_TABLE *sym_tab;
-
-  // create the outer symbol table
-  sym_tab = new_scope (NULL);
-
-  // make first pass through options to process those that are position-independent
-  // save the rest in the wrap environment for later processing
-  process_global_options (wrap_env, argc, argv, sym_tab);
-
-  // die if there were errors parsing options
-  if (trouble_p ())
-    report_errors ();
-
-  // if options show no interest in input
-  if (wrap_env->skip_input_p) {
-    if (wrap_env->n_files > 0)
-      warn (no_line, "input ignored");
-    return 0;
-  }
-
-  if (wrap_env->out_file_name)
-    {
-      out_file = fopen (wrap_env->out_file_name, "w");
-      if (!out_file)
-	err (no_line, "can't open '%s' for output", wrap_env->out_file_name);
+    OBJECT *scene, *hsr_scene;
+    int ret;
+    FILE *out_file;
+    SYMBOL_TABLE *sym_tab;
+
+    // create the outer symbol table
+    sym_tab = new_scope(NULL);
+
+    // make first pass through options to process those that are position-independent
+    // save the rest in the wrap environment for later processing
+    process_global_options(wrap_env, argc, argv, sym_tab);
+
+    // die if there were errors parsing options
+    if (trouble_p())
+	report_errors();
+
+    // if options show no interest in input
+    if (wrap_env->skip_input_p) {
+	if (wrap_env->n_files > 0)
+	    warn(no_line, "input ignored");
+	return 0;
     }
-  else
-    {
-      out_file = stdout;
+
+    if (wrap_env->out_file_name) {
+	out_file = fopen(wrap_env->out_file_name, "w");
+	if (!out_file)
+	    err(no_line, "can't open '%s' for output",
+		wrap_env->out_file_name);
+    } else {
+	out_file = stdout;
     }
 
-  // die if there were errors preparing output stream
-  if (trouble_p ())
-    report_errors ();
+    // die if there were errors preparing output stream
+    if (trouble_p())
+	report_errors();
 
-  // set up the global environment for the parser
-  init_global_env (global_env, wrap_env->pst_version, wrap_env->tikz_version);
+    // set up the global environment for the parser
+    init_global_env(global_env, wrap_env->pst_version,
+		    wrap_env->tikz_version);
 
-  // process first set of tag defs and set up first input file
-  ret = yywrap ();
+    // process first set of tag defs and set up first input file
+    ret = yywrap();
 
-  // quits if there were file opening errors in wrap
-  if (ret == 0)
-    {
-      if (trouble_p ())
-	report_errors ();
-    }
-  else
-    {
-      set_lexer_file ("<stdin>", stdin);
+    // quits if there were file opening errors in wrap
+    if (ret == 0) {
+	if (trouble_p())
+	    report_errors();
+    } else {
+	set_lexer_file("<stdin>", stdin);
     }
 
-  if (parse (sym_tab) != 0 && !trouble_p ())
-    // emit an error to ensure report_errors halts 
-    err (line, "parse error");
+    if (parse(sym_tab) != 0 && !trouble_p())
+	// emit an error to ensure report_errors halts 
+	err(line, "parse error");
 
-  // quits if there is trouble
-  report_errors ();
+    // quits if there is trouble
+    report_errors();
 
-  // flatten the object hierarchy into a scene
-  scene = flat_scene (parsed_objects (), global_env);
+    // flatten the object hierarchy into a scene
+    scene = flat_scene(parsed_objects(), global_env);
 
-  // painter's algorithm for HSR / HLR
-  if (wrap_env->bsp_only_p)
-    {
-      hsr_scene = hsr_scene_with_bsp (scene);
-    }
-  else
-    {
-      hsr_scene = hsr_scene_with_depth_sort (scene);
+    // painter's algorithm for HSR / HLR
+    if (wrap_env->bsp_only_p) {
+	hsr_scene = hsr_scene_with_bsp(scene);
+    } else {
+	hsr_scene = hsr_scene_with_depth_sort(scene);
     }
 
-  // emit PStricks or TikZ
-  emit (out_file, hsr_scene, global_env, wrap_env->doc_template_file_name);
+    // emit PStricks or TikZ
+    emit(out_file, hsr_scene, global_env,
+	 wrap_env->doc_template_file_name);
 
-  return 0;
+    return 0;
 }
 
-int
-yywrap (void)
+int yywrap(void)
 {
-  char *file_name = advance_to_next_file_name (wrap_env);
-  if (file_name)
-    {
-      FILE *f = fopen (file_name, "r");
-      if (f)
-	{
-	  set_lexer_file (file_name, f);
-	  return 0;
-	}
-      else
-	{
-	  err (no_line, "can't open file '%s' for input", file_name);
+    char *file_name = advance_to_next_file_name(wrap_env);
+    if (file_name) {
+	FILE *f = fopen(file_name, "r");
+	if (f) {
+	    set_lexer_file(file_name, f);
+	    return 0;
+	} else {
+	    err(no_line, "can't open file '%s' for input", file_name);
 	}
     }
-  return 1;
+    return 1;
 }
diff --git a/main.h b/main.h
index 9dca77f..75f046a 100644
--- a/main.h
+++ b/main.h
@@ -21,7 +21,7 @@ http://www.gnu.org/copyleft */
 #ifndef __MAIN_H
 #define __MAIN_H
 
-int main (int argc, char *argv[]);
-int yywrap (void);
+int main(int argc, char *argv[]);
+int yywrap(void);
 
 #endif
diff --git a/makefile b/makefile
index 8dad3d1..ad96ad7 100644
--- a/makefile
+++ b/makefile
@@ -6,6 +6,7 @@
 # makefile v0.03
 #
 CC = gcc -O1 -g -Wall
+#CC = gcc -g -Wall
 YACC = bison --defines --debug --report=all --yacc
 LEX = flex
 
diff --git a/memutil.c b/memutil.c
index 17a04ae..435c0de 100644
--- a/memutil.c
+++ b/memutil.c
@@ -21,45 +21,38 @@ http://www.gnu.org/copyleft */
 #include <stdio.h>
 #include "memutil.h"
 
-void *
-safe_malloc (unsigned size)
+void *safe_malloc(unsigned size)
 {
 #undef malloc
-  void *p = malloc (size);
-  if (size > 0 && p == NULL)
-    {
-      fprintf (stderr, "\nsafe_malloc: out of memory\n");
-      exit (1);
+    void *p = malloc(size);
+    if (size > 0 && p == NULL) {
+	fprintf(stderr, "\nsafe_malloc: out of memory\n");
+	exit(1);
     }
-  return p;
+    return p;
 }
 
-void *
-safe_realloc (void *p, unsigned size)
+void *safe_realloc(void *p, unsigned size)
 {
 #undef realloc
-  void *q = realloc (p, size);
-  if (size > 0 && q == NULL)
-    {
-      fprintf (stderr, "\nsafe_realloc: out of memory\n");
-      exit (1);
+    void *q = realloc(p, size);
+    if (size > 0 && q == NULL) {
+	fprintf(stderr, "\nsafe_realloc: out of memory\n");
+	exit(1);
     }
-  return q;
+    return q;
 }
 
-char *
-safe_strdup (char *str)
+char *safe_strdup(char *str)
 {
 #undef strdup
-  char *new_str = safe_malloc (strlen (str) + 1);
-  strcpy (new_str, str);
-  return new_str;
+    char *new_str = safe_malloc(strlen(str) + 1);
+    strcpy(new_str, str);
+    return new_str;
 }
 
-void
-safe_free (void *p)
+void safe_free(void *p)
 {
 #undef free
-  free (p);
+    free(p);
 }
-
diff --git a/memutil.h b/memutil.h
index 997d6e6..a3edba0 100644
--- a/memutil.h
+++ b/memutil.h
@@ -40,10 +40,10 @@ typedef int bool;
 #define SET_ARRAY_ZERO(A)  memset((A), 0, sizeof (A))
 
 // checking memory allocators
-void *safe_malloc (unsigned size);
-void *safe_realloc (void *p, unsigned size);
-char *safe_strdup (char *str);
-void safe_free (void *p);
+void *safe_malloc(unsigned size);
+void *safe_realloc(void *p, unsigned size);
+char *safe_strdup(char *str);
+void safe_free(void *p);
 
 #define MALLOC_STRUCT(P)  (P) = safe_malloc(sizeof *(P))
 
diff --git a/opts.c b/opts.c
index b56fe8a..0904b75 100644
--- a/opts.c
+++ b/opts.c
@@ -21,605 +21,554 @@ http://www.gnu.org/copyleft */
 #include "opts.h"
 #include "geometry.h"
 
-DECLARE_DYNAMIC_ARRAY_FUNCS (OPT_LIST, OPT, opt_list, elt, n_elts, NO_OTHER_INIT)
+DECLARE_DYNAMIC_ARRAY_FUNCS(OPT_LIST, OPT, opt_list, elt, n_elts,
+			    NO_OTHER_INIT);
 
 // ---- useful string stuff ----------------------------------------------------
 // slice a string using Perl/Python position indexing conventions
 // (position == dst_size is always at the end of the string)
 
-char *str_slice (char *dst, int dst_size, char *src, int beg, int end)
+char *str_slice(char *dst, int dst_size, char *src, int beg, int end)
 {
-  int len;
-
-  if (dst_size > 0)
-    {
-      len = strlen (src);
-      if (beg < 0)
-	beg = len + beg;
-      else if (beg > len)
-	beg = len;
-      if (end < 0)
-	end = len + end;
-      else if (end > len)
-	end = len;
-      len = end - beg;
-      if (len <= 0)
-	{
-	  dst[0] = '\0';
-	}
-      else
-	{
-	  if (len >= dst_size)
-	    len = dst_size - 1;
-	  memcpy (dst, &src[beg], len);
-	  dst[len] = '\0';
+    int len;
+
+    if (dst_size > 0) {
+	len = strlen(src);
+	if (beg < 0)
+	    beg = len + beg;
+	else if (beg > len)
+	    beg = len;
+	if (end < 0)
+	    end = len + end;
+	else if (end > len)
+	    end = len;
+	len = end - beg;
+	if (len <= 0) {
+	    dst[0] = '\0';
+	} else {
+	    if (len >= dst_size)
+		len = dst_size - 1;
+	    memcpy(dst, &src[beg], len);
+	    dst[len] = '\0';
 	}
     }
-  return dst;
+    return dst;
 }
 
 // a modified version of C library strtok
 // uses state variable p, which should be
 // initially set to zero.
-char *
-istrtok (int *p, char *s, char sep)
+char *istrtok(int *p, char *s, char sep)
 {
-  int i, r;
+    int i, r;
 
-  // advance r to next non-space character
-  for (r = *p; s[r] == ' ' || s[r] == '\t'; r++)
-    /* skip */ ;
+    // advance r to next non-space character
+    for (r = *p; s[r] == ' ' || s[r] == '\t'; r++)
+	/* skip */ ;
 
-  // if we're at terminating null, return null
-  if (s[r] == '\0')
-    {
-      *p = r;
-      return NULL;
+    // if we're at terminating null, return null
+    if (s[r] == '\0') {
+	*p = r;
+	return NULL;
     }
-  // look for a separator character
-  for (i = r; s[i] != '\0'; i++)
-    {
-      if (s[i] == sep)
-	{
-	  // found one; set to null char,
-	  // advance state variable, and
-	  // return pointer to first char
-	  s[i] = '\0';
-	  *p = i + 1;
-	  return &s[r];
+    // look for a separator character
+    for (i = r; s[i] != '\0'; i++) {
+	if (s[i] == sep) {
+	    // found one; set to null char,
+	    // advance state variable, and
+	    // return pointer to first char
+	    s[i] = '\0';
+	    *p = i + 1;
+	    return &s[r];
 	}
     }
-  // did not find a terminator, so this
-  // is the last token; return it
-  *p = i;
-  return &s[r];
+    // did not find a terminator, so this
+    // is the last token; return it
+    *p = i;
+    return &s[r];
 }
 
-int
-str_last_occurance (char *src, char *set)
+int str_last_occurance(char *src, char *set)
 {
-  int i;
+    int i;
 
-  for (i = 0; src[i]; i++)
-    /* skip */ ;
-  for (--i; i >= 0 && !strchr (set, src[i]); --i)
-    /* skip */ ;
-  return i;
+    for (i = 0; src[i]; i++)
+	/* skip */ ;
+    for (--i; i >= 0 && !strchr(set, src[i]); --i)
+	/* skip */ ;
+    return i;
 }
 
 // ---- options ----------------------------------------------------------------
 
-void
-init_opts (OPTS * opts)
+void init_opts(OPTS * opts)
 {
-  init_opt_list (opts->list);
+    init_opt_list(opts->list);
 }
 
-OPTS *
-raw_opts (void)
+OPTS *raw_opts(void)
 {
-  OPTS *r = safe_malloc (sizeof *r);
-  init_opts (r);
-  return r;
+    OPTS *r = safe_malloc(sizeof *r);
+    init_opts(r);
+    return r;
 }
 
-void
-setup_opts (OPTS * opts, char *opts_str, SRC_LINE line)
+void setup_opts(OPTS * opts, char *opts_str, SRC_LINE line)
 {
-  int p_pair, p_side;
-  char *pair, *key, *val, *buf;
-  OPT *opt;
-
-  clear_opts (opts);
-  buf = safe_strdup (opts_str);
-  p_pair = 0;
-  while ((pair = istrtok (&p_pair, buf, ',')) != NULL)
-    {
-      p_side = 0;
-      key = istrtok (&p_side, pair, '=');
-      if (key == NULL)
-	{
-	  err (line, "null keyword in option");
-	  key = "";
+    int p_pair, p_side;
+    char *pair, *key, *val, *buf;
+    OPT *opt;
+
+    clear_opts(opts);
+    buf = safe_strdup(opts_str);
+    p_pair = 0;
+    while ((pair = istrtok(&p_pair, buf, ',')) != NULL) {
+	p_side = 0;
+	key = istrtok(&p_side, pair, '=');
+	if (key == NULL) {
+	    err(line, "null keyword in option");
+	    key = "";
 	}
-      val = istrtok (&p_side, pair, ',');
-      if (val == NULL)
-	{
-	  err (line, "null value in option");
-	  val = "";
+	val = istrtok(&p_side, pair, ',');
+	if (val == NULL) {
+	    err(line, "null value in option");
+	    val = "";
 	}
-      opt = pushed_opt_list_elt (opts->list);
-      opt->key = safe_strdup (key);
-      opt->val = safe_strdup (val);
+	opt = pushed_opt_list_elt(opts->list);
+	opt->key = safe_strdup(key);
+	opt->val = safe_strdup(val);
     }
-  safe_free (buf);
+    safe_free(buf);
 }
 
-OPTS *
-new_opts (char *opts_str, SRC_LINE line)
+OPTS *new_opts(char *opts_str, SRC_LINE line)
 {
-  OPTS *r = raw_opts ();
-  setup_opts (r, opts_str, line);
-  return r;
+    OPTS *r = raw_opts();
+    setup_opts(r, opts_str, line);
+    return r;
 }
 
-void
-clear_opts (OPTS * opts)
+void clear_opts(OPTS * opts)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < opts->list->n_elts; ++i)
-    {
-      safe_free (opts->list->elt[i].key);
-      safe_free (opts->list->elt[i].val);
+    for (i = 0; i < opts->list->n_elts; ++i) {
+	safe_free(opts->list->elt[i].key);
+	safe_free(opts->list->elt[i].val);
     }
-  clear_opt_list (opts->list);
+    clear_opt_list(opts->list);
 }
 
-char *
-opt_val (OPTS * opts, char *opt)
+char *opt_val(OPTS * opts, char *opt)
 {
-  int i;
+    int i;
 
-  if (!opts)
-    return 0;
+    if (!opts)
+	return 0;
 
-  for (i = 0; i < opts->list->n_elts; i++)
-    if (strcmp (opts->list->elt[i].key, opt) == 0)
-      return opts->list->elt[i].val;
-  return NULL;
+    for (i = 0; i < opts->list->n_elts; i++)
+	if (strcmp(opts->list->elt[i].key, opt) == 0)
+	    return opts->list->elt[i].val;
+    return NULL;
 }
 
-int
-bool_opt_p (OPTS * opts, char *opt, int default_p)
+int bool_opt_p(OPTS * opts, char *opt, int default_p)
 {
-  char *r = opt_val (opts, opt);
-  if (!r)
-    return default_p;
-  return strcmp (r, "false") != 0;	// all not false is true
+    char *r = opt_val(opts, opt);
+    if (!r)
+	return default_p;
+    return strcmp(r, "false") != 0;	// all not false is true
 }
 
-typedef struct opt_desc_t
-{
-  char *opt;
-  int type;
-}
-OPT_DESC;
+typedef struct opt_desc_t {
+    char *opt;
+    int type;
+} OPT_DESC;
 
-typedef struct opt_desc_tbl_t
-{
-  OPT_DESC *key_desc;
-  int n_key_desc;
-  OPT_DESC *val_desc;
-  int n_val_desc;
-}
-OPT_DESC_TBL;
+typedef struct opt_desc_tbl_t {
+    OPT_DESC *key_desc;
+    int n_key_desc;
+    OPT_DESC *val_desc;
+    int n_val_desc;
+} OPT_DESC_TBL;
 
 static OPT_DESC key_tbl_pst[] = {
-  {"arrows", OPT_LINE},
-  {"cull", OPT_INTERNAL},
-  {"dash", OPT_LINE},
-  {"dotsep", OPT_LINE},
-  {"fillcolor", OPT_POLYGON | OPT_FILL_COLOR},
-  {"fillstyle", OPT_POLYGON | OPT_FILL_STYLE},
-  {"lay", OPT_INTERNAL},
-  {"linecolor", OPT_LINE},
-  {"linestyle", OPT_LINE | OPT_LINE_STYLE},
-  {"linewidth", OPT_LINE},
-  {"opacity", OPT_POLYGON},
-  {"showpoints", OPT_LINE | OPT_POLYGON},
-  {"split", OPT_INTERNAL},
-  {"strokeopacity", OPT_LINE },
-  {"transpalpha", OPT_POLYGON}
+    {"arrows", OPT_LINE},
+    {"cull", OPT_INTERNAL},
+    {"dash", OPT_LINE},
+    {"dotsep", OPT_LINE},
+    {"fillcolor", OPT_POLYGON | OPT_FILL_COLOR},
+    {"fillstyle", OPT_POLYGON | OPT_FILL_STYLE},
+    {"lay", OPT_INTERNAL},
+    {"linecolor", OPT_LINE},
+    {"linestyle", OPT_LINE | OPT_LINE_STYLE},
+    {"linewidth", OPT_LINE},
+    {"opacity", OPT_POLYGON},
+    {"showpoints", OPT_LINE | OPT_POLYGON},
+    {"split", OPT_INTERNAL},
+    {"strokeopacity", OPT_LINE},
+    {"transpalpha", OPT_POLYGON}
 };
 
 OPT_DESC_TBL opt_desc_tbl_pst[1] = { {
-				      key_tbl_pst, ARRAY_SIZE (key_tbl_pst),
+				      key_tbl_pst, ARRAY_SIZE(key_tbl_pst),
 				      NULL, 0}
 };
 
 static OPT_DESC opt_key_tbl_tikz[] = {
-  {"arrows", OPT_LINE},
-  {"cap", OPT_LINE},
-  {"color", OPT_LINE | OPT_POLYGON | OPT_FILL_COLOR},
-  {"cull", OPT_INTERNAL},
-  {"dash pattern", OPT_LINE},
-  {"dash phase", OPT_LINE},
-  {"double distance", OPT_LINE},
-  {"double", OPT_LINE | OPT_LINE_STYLE},
-  {"draw", OPT_LINE | OPT_LINE_STYLE},
-  {"draw opacity", OPT_LINE},
-  {"fill", OPT_POLYGON | OPT_FILL_COLOR},
-  {"fill opacity", OPT_POLYGON},
-  {"fill style", OPT_POLYGON | OPT_FILL_COLOR | OPT_EMIT_VAL},
-  {"join", OPT_LINE},
-  {"lay", OPT_INTERNAL},
-  {"line style", OPT_LINE | OPT_EMIT_VAL},
-  {"line width", OPT_LINE},
-  {"miter limit", OPT_LINE},
-  {"pattern", OPT_POLYGON | OPT_FILL_COLOR},
-  {"pattern color", OPT_POLYGON},
-  {"split", OPT_INTERNAL},
-  {"style", OPT_TYPE_IN_VAL | OPT_EMIT_VAL},
+    {"arrows", OPT_LINE},
+    {"cap", OPT_LINE},
+    {"color", OPT_LINE | OPT_POLYGON | OPT_FILL_COLOR},
+    {"cull", OPT_INTERNAL},
+    {"dash pattern", OPT_LINE},
+    {"dash phase", OPT_LINE},
+    {"double distance", OPT_LINE},
+    {"double", OPT_LINE | OPT_LINE_STYLE},
+    {"draw", OPT_LINE | OPT_LINE_STYLE},
+    {"draw opacity", OPT_LINE},
+    {"fill", OPT_POLYGON | OPT_FILL_COLOR},
+    {"fill opacity", OPT_POLYGON},
+    {"fill style", OPT_POLYGON | OPT_FILL_COLOR | OPT_EMIT_VAL},
+    {"join", OPT_LINE},
+    {"lay", OPT_INTERNAL},
+    {"line style", OPT_LINE | OPT_EMIT_VAL},
+    {"line width", OPT_LINE},
+    {"miter limit", OPT_LINE},
+    {"pattern", OPT_POLYGON | OPT_FILL_COLOR},
+    {"pattern color", OPT_POLYGON},
+    {"split", OPT_INTERNAL},
+    {"style", OPT_TYPE_IN_VAL | OPT_EMIT_VAL},
 };
 
 static OPT_DESC opt_val_tbl_tikz[] = {
-  {"dashed", OPT_LINE},
-  {"densely dashed", OPT_LINE},
-  {"densely dotted", OPT_LINE},
-  {"dotted", OPT_LINE},
-  {"double", OPT_LINE},
-  {"loosely dashed", OPT_LINE},
-  {"loosely dotted", OPT_LINE},
-  {"nearly opaque", OPT_POLYGON},
-  {"nearly transparent", OPT_POLYGON},
-  {"semithick", OPT_LINE},
-  {"semitransparent", OPT_POLYGON},
-  {"solid", OPT_LINE},
-  {"thick", OPT_LINE},
-  {"thin", OPT_LINE},
-  {"transparent", OPT_POLYGON},
-  {"ultra nearly transparent", OPT_POLYGON},
-  {"ultra thick", OPT_LINE},
-  {"ultra thin", OPT_LINE},
-  {"very nearly transparent", OPT_POLYGON},
-  {"very thick", OPT_LINE},
-  {"very thin", OPT_LINE},
+    {"dashed", OPT_LINE},
+    {"densely dashed", OPT_LINE},
+    {"densely dotted", OPT_LINE},
+    {"dotted", OPT_LINE},
+    {"double", OPT_LINE},
+    {"loosely dashed", OPT_LINE},
+    {"loosely dotted", OPT_LINE},
+    {"nearly opaque", OPT_POLYGON},
+    {"nearly transparent", OPT_POLYGON},
+    {"semithick", OPT_LINE},
+    {"semitransparent", OPT_POLYGON},
+    {"solid", OPT_LINE},
+    {"thick", OPT_LINE},
+    {"thin", OPT_LINE},
+    {"transparent", OPT_POLYGON},
+    {"ultra nearly transparent", OPT_POLYGON},
+    {"ultra thick", OPT_LINE},
+    {"ultra thin", OPT_LINE},
+    {"very nearly transparent", OPT_POLYGON},
+    {"very thick", OPT_LINE},
+    {"very thin", OPT_LINE},
 };
 
 OPT_DESC_TBL opt_desc_tbl_tikz[1] = { {
 				       opt_key_tbl_tikz,
-				       ARRAY_SIZE (opt_key_tbl_tikz),
+				       ARRAY_SIZE(opt_key_tbl_tikz),
 				       opt_val_tbl_tikz,
-				       ARRAY_SIZE (opt_val_tbl_tikz),
+				       ARRAY_SIZE(opt_val_tbl_tikz),
 				       }
 };
 
-int
-opt_index (char *opt, OPT_DESC * desc, int n_desc)
+int opt_index(char *opt, OPT_DESC * desc, int n_desc)
 {
-  int hi, lo, mid, cmp_val;
-
-  hi = n_desc - 1;
-  lo = 0;
-  while (hi >= lo)
-    {
-      mid = (hi + lo) / 2;
-      cmp_val = strcmp (opt, desc[mid].opt);
-      if (cmp_val < 0)
-	hi = mid - 1;
-      else if (cmp_val > 0)
-	lo = mid + 1;
-      else
-	return mid;
+    int hi, lo, mid, cmp_val;
+
+    hi = n_desc - 1;
+    lo = 0;
+    while (hi >= lo) {
+	mid = (hi + lo) / 2;
+	cmp_val = strcmp(opt, desc[mid].opt);
+	if (cmp_val < 0)
+	    hi = mid - 1;
+	else if (cmp_val > 0)
+	    lo = mid + 1;
+	else
+	    return mid;
     }
-  return -1;
+    return -1;
 }
 
 static OPT_DESC_TBL *lang_to_opt_desc_tbl[] = {
-  opt_desc_tbl_pst,
-  opt_desc_tbl_tikz,
-  opt_desc_tbl_pst,
-  opt_desc_tbl_tikz,
+    opt_desc_tbl_pst,
+    opt_desc_tbl_tikz,
+    opt_desc_tbl_pst,
+    opt_desc_tbl_tikz,
 };
 
-int
-simple_opt_type (OPT * opt, int default_type, int lang)
+int simple_opt_type(OPT * opt, int default_type, int lang)
 {
-  OPT_DESC_TBL *desc;
-  int i;
-
-  if (lang < 0)
-    return default_type;
-  desc = lang_to_opt_desc_tbl[lang];
-  i = opt_index (opt->key, desc->key_desc, desc->n_key_desc);
-  return (i < 0) ? default_type : desc->key_desc[i].type;
-}
+    OPT_DESC_TBL *desc;
+    int i;
 
-int
-opt_type (OPT * opt, int default_type, int lang)
-{
-  OPT_DESC_TBL *desc;
-  int i, type;
-
-  type = simple_opt_type (opt, default_type, lang);
-  if (type & OPT_TYPE_IN_VAL)
-    {
-      desc = lang_to_opt_desc_tbl[lang];
-      i = opt_index (opt->val, desc->val_desc, desc->n_val_desc);
-      if (i < 0)
+    if (lang < 0)
 	return default_type;
-      type = desc->val_desc[i].type;
-    }
-  return type;
+    desc = lang_to_opt_desc_tbl[lang];
+    i = opt_index(opt->key, desc->key_desc, desc->n_key_desc);
+    return (i < 0) ? default_type : desc->key_desc[i].type;
 }
 
-typedef struct opts_desc_t
+int opt_type(OPT * opt, int default_type, int lang)
 {
-  OPT *opts;
-  int n_opts;
+    OPT_DESC_TBL *desc;
+    int i, type;
+
+    type = simple_opt_type(opt, default_type, lang);
+    if (type & OPT_TYPE_IN_VAL) {
+	desc = lang_to_opt_desc_tbl[lang];
+	i = opt_index(opt->val, desc->val_desc, desc->n_val_desc);
+	if (i < 0)
+	    return default_type;
+	type = desc->val_desc[i].type;
+    }
+    return type;
 }
-OPTS_DESC;
+
+typedef struct opts_desc_t {
+    OPT *opts;
+    int n_opts;
+} OPTS_DESC;
 
 OPT no_edges_opts_pst[] = {
-  {"linestyle", "none"}
+    {"linestyle", "none"}
 };
 
 OPT no_edges_opts_tikz[] = {
-  {"draw", "none"}
+    {"draw", "none"}
 };
 
 OPTS_DESC no_edges_opts_desc_tbl[] = {
-  {no_edges_opts_pst, ARRAY_SIZE (no_edges_opts_pst)},
-  {no_edges_opts_tikz, ARRAY_SIZE (no_edges_opts_tikz)},
-  {no_edges_opts_pst, ARRAY_SIZE (no_edges_opts_pst)},
-  {no_edges_opts_tikz, ARRAY_SIZE (no_edges_opts_tikz)},
+    {no_edges_opts_pst, ARRAY_SIZE(no_edges_opts_pst)},
+    {no_edges_opts_tikz, ARRAY_SIZE(no_edges_opts_tikz)},
+    {no_edges_opts_pst, ARRAY_SIZE(no_edges_opts_pst)},
+    {no_edges_opts_tikz, ARRAY_SIZE(no_edges_opts_tikz)},
 };
 
-static int
-any_opt_p (OPTS * opts, int type, int lang)
+static int any_opt_p(OPTS * opts, int type, int lang)
 {
-  int i;
+    int i;
 
-  if (!opts)
+    if (!opts)
+	return 0;
+    for (i = 0; i < opts->list->n_elts; i++)
+	if (type & opt_type(&opts->list->elt[i], OPT_NONE, lang))
+	    return 1;
     return 0;
-  for (i = 0; i < opts->list->n_elts; i++)
-    if (type & opt_type (&opts->list->elt[i], OPT_NONE, lang))
-      return 1;
-  return 0;
 }
 
-static void
-add_default_opt (OPTS ** opts_ptr, OPT * default_opt, int lang)
+static void add_default_opt(OPTS ** opts_ptr, OPT * default_opt, int lang)
 {
-  OPT *opt;
-  OPTS *opts;
-  int default_type;
-
-  opts = *opts_ptr;
-  default_type = opt_type (default_opt, OPT_NONE, lang) & OPT_DEFAULTS;
-  if (any_opt_p (opts, default_type, lang))
-    return;
-  if (!opts)
-    opts = raw_opts ();
-  opt = pushed_opt_list_elt (opts->list);
-  opt->key = safe_strdup (default_opt->key);
-  opt->val = safe_strdup (default_opt->val);
-  *opts_ptr = opts;
+    OPT *opt;
+    OPTS *opts;
+    int default_type;
+
+    opts = *opts_ptr;
+    default_type = opt_type(default_opt, OPT_NONE, lang) & OPT_DEFAULTS;
+    if (any_opt_p(opts, default_type, lang))
+	return;
+    if (!opts)
+	opts = raw_opts();
+    opt = pushed_opt_list_elt(opts->list);
+    opt->key = safe_strdup(default_opt->key);
+    opt->val = safe_strdup(default_opt->val);
+    *opts_ptr = opts;
 }
 
 static void
-add_default_opts (OPTS ** opts_ptr, OPTS_DESC * opts_desc, int lang)
+add_default_opts(OPTS ** opts_ptr, OPTS_DESC * opts_desc, int lang)
 {
-  int i;
-  for (i = 0; i < opts_desc->n_opts; i++)
-    add_default_opt (opts_ptr, &opts_desc->opts[i], lang);
+    int i;
+    for (i = 0; i < opts_desc->n_opts; i++)
+	add_default_opt(opts_ptr, &opts_desc->opts[i], lang);
 }
 
-void
-add_no_edges_default_opt (OPTS ** opts_ptr, int lang)
+void add_no_edges_default_opt(OPTS ** opts_ptr, int lang)
 {
-  add_default_opts (opts_ptr, &no_edges_opts_desc_tbl[lang], lang);
+    add_default_opts(opts_ptr, &no_edges_opts_desc_tbl[lang], lang);
 }
 
 OPT solid_white_opts_pst[] = {
-  {"fillstyle", "solid"},
-  {"fillcolor", "white"}
+    {"fillstyle", "solid"},
+    {"fillcolor", "white"}
 };
 
 OPT solid_white_opts_tikz[] = {
-  {"fill", "white"}
+    {"fill", "white"}
 };
 
 OPTS_DESC solid_white_opts_desc_tbl[] = {
-  {solid_white_opts_pst, ARRAY_SIZE (solid_white_opts_pst)},
-  {solid_white_opts_tikz, ARRAY_SIZE (solid_white_opts_tikz)},
-  {solid_white_opts_pst, ARRAY_SIZE (solid_white_opts_pst)},
-  {solid_white_opts_tikz, ARRAY_SIZE (solid_white_opts_tikz)},
+    {solid_white_opts_pst, ARRAY_SIZE(solid_white_opts_pst)},
+    {solid_white_opts_tikz, ARRAY_SIZE(solid_white_opts_tikz)},
+    {solid_white_opts_pst, ARRAY_SIZE(solid_white_opts_pst)},
+    {solid_white_opts_tikz, ARRAY_SIZE(solid_white_opts_tikz)},
 };
 
-void
-add_solid_white_default_opt (OPTS ** opts_ptr, int lang)
+void add_solid_white_default_opt(OPTS ** opts_ptr, int lang)
 {
-  add_default_opts (opts_ptr, &solid_white_opts_desc_tbl[lang], lang);
+    add_default_opts(opts_ptr, &solid_white_opts_desc_tbl[lang], lang);
 }
 
 void
-check_opts (OPTS * opts,
-	    int allowed, char *allowed_msg, int lang, SRC_LINE line)
+check_opts(OPTS * opts,
+	   int allowed, char *allowed_msg, int lang, SRC_LINE line)
 {
-  int i, type;
+    int i, type;
 
-  if (!opts)
-    return;
+    if (!opts)
+	return;
 
-  for (i = 0; i < opts->list->n_elts; i++)
-    {
-      type = opt_type (&opts->list->elt[i], OPT_NONE, lang);
-      if ((type & allowed) == 0)
-	warn (line, allowed_msg, opts->list->elt[i].key,
-	      opts->list->elt[i].val);
+    for (i = 0; i < opts->list->n_elts; i++) {
+	type = opt_type(&opts->list->elt[i], OPT_NONE, lang);
+	if ((type & allowed) == 0)
+	    warn(line, allowed_msg, opts->list->elt[i].key,
+		 opts->list->elt[i].val);
     }
 }
 
 // selective copy for splitting option lists by type
-OPTS *
-copy_opts (OPTS * opts, int type_mask, int lang)
+OPTS *copy_opts(OPTS * opts, int type_mask, int lang)
 {
-  int i;
-  OPTS *r;
-  OPT *opt;
-
-  if (!opts)
-    return NULL;
-
-  r = raw_opts ();
-  for (i = 0; i < opts->list->n_elts; i++)
-    if (type_mask & opt_type (&opts->list->elt[i], OPT_NONE, lang))
-      {
-	opt = pushed_opt_list_elt (r->list);
-	opt->key = safe_strdup (opts->list->elt[i].key);
-	opt->val = safe_strdup (opts->list->elt[i].val);
-      }
-  return r;
+    int i;
+    OPTS *r;
+    OPT *opt;
+
+    if (!opts)
+	return NULL;
+
+    r = raw_opts();
+    for (i = 0; i < opts->list->n_elts; i++)
+	if (type_mask & opt_type(&opts->list->elt[i], OPT_NONE, lang)) {
+	    opt = pushed_opt_list_elt(r->list);
+	    opt->key = safe_strdup(opts->list->elt[i].key);
+	    opt->val = safe_strdup(opts->list->elt[i].val);
+	}
+    return r;
 }
 
-OPTS *
-cat_opts (OPTS * dst, OPTS * src)
+OPTS *cat_opts(OPTS * dst, OPTS * src)
 {
-  int i;
-  OPT *opt;
-
-  for (i = 0; i < src->list->n_elts; i++) 
-    {
-      opt = pushed_opt_list_elt (dst->list);
-      opt->key = safe_strdup(src->list->elt[i].key);
-      opt->val = safe_strdup(src->list->elt[i].val);
+    int i;
+    OPT *opt;
+
+    for (i = 0; i < src->list->n_elts; i++) {
+	opt = pushed_opt_list_elt(dst->list);
+	opt->key = safe_strdup(src->list->elt[i].key);
+	opt->val = safe_strdup(src->list->elt[i].val);
     }
-  return dst;
+    return dst;
 }
 
 // selective copy for splitting out line options and modifying arrows
-OPTS *
-copy_line_opts (OPTS * opts, int first_p, int last_p, int lang)
+OPTS *copy_line_opts(OPTS * opts, int first_p, int last_p, int lang)
 {
-  int i;
-  OPTS *r;
-  char buf[100];
-
-  if (!opts)
-    return NULL;
-
-  // no modifications necessary if line contains first and last points
-  if (first_p && last_p)
-    return opts;
-
-  // make a clean copy and modify the arrows
-  r = copy_opts (opts, OPT_LINE, lang);
-
-  for (i = 0; i < r->list->n_elts; i++)
-    {
-      if (strcmp ("arrows", r->list->elt[i].key) == 0)
-	{
-	  char *val = r->list->elt[i].val;
-	  char *dash = strchr (val, '-');
-	  if (!dash)
-	    {
-	      warn (no_line,
-		    "could not find '-' while splitting arrows option");
-	      continue;
-	    }
-	  if (first_p)
-	    {
-	      str_slice (buf, sizeof buf, val, 0, dash - val + 1);
-	    }
-	  else if (last_p)
-	    {
-	      str_slice (buf, sizeof buf, val, dash - val, SLICE_TO_END);
+    int i;
+    OPTS *r;
+    char buf[100];
+
+    if (!opts)
+	return NULL;
+
+    // no modifications necessary if line contains first and last points
+    if (first_p && last_p)
+	return opts;
+
+    // make a clean copy and modify the arrows
+    r = copy_opts(opts, OPT_LINE, lang);
+
+    for (i = 0; i < r->list->n_elts; i++) {
+	if (strcmp("arrows", r->list->elt[i].key) == 0) {
+	    char *val = r->list->elt[i].val;
+	    char *dash = strchr(val, '-');
+	    if (!dash) {
+		warn(no_line,
+		     "could not find '-' while splitting arrows option");
+		continue;
 	    }
-	  else
-	    {
-	      // could just delete option entirely, but this is good for debugging
-	      str_slice (buf, sizeof buf, val, dash - val, dash - val + 1);
+	    if (first_p) {
+		str_slice(buf, sizeof buf, val, 0, dash - val + 1);
+	    } else if (last_p) {
+		str_slice(buf, sizeof buf, val, dash - val, SLICE_TO_END);
+	    } else {
+		// could just delete option entirely, but this is good for debugging
+		str_slice(buf, sizeof buf, val, dash - val,
+			  dash - val + 1);
 	    }
-	  r->list->elt[i].val = safe_strdup (buf);
+	    r->list->elt[i].val = safe_strdup(buf);
 	}
     }
-  return r;
+    return r;
 }
 
 static int member_p(char *str, char **str_list)
 {
-  if (str_list == NULL)
-    return 0;
+    if (str_list == NULL)
+	return 0;
 
-  while (*str_list) 
-    {
-      if (strcmp(str, *str_list) == 0)
-	return 1;
-      ++str_list;
+    while (*str_list) {
+	if (strcmp(str, *str_list) == 0)
+	    return 1;
+	++str_list;
     }
-  return 0;
+    return 0;
 }
 
 static void
-emit_opts_internal (FILE * f, OPTS * opts, char ** exceptions, int brackets_p, int lang)
+emit_opts_internal(FILE * f, OPTS * opts, char **exceptions,
+		   int brackets_p, int lang)
 {
-  int i, n, type;
+    int i, n, type;
 
-  // do nothing if no options
-  if (!opts || !opts->list || opts->list->n_elts == 0)
-    return;
+    // do nothing if no options
+    if (!opts || !opts->list || opts->list->n_elts == 0)
+	return;
 
-  // do nothing if no non-excepted options
-  for (n = i = 0; i < opts->list->n_elts; i++)
-    {
-      if ( !member_p(opts->list->elt[i].key, exceptions) )
-	++n;
+    // do nothing if no non-excepted options
+    for (n = i = 0; i < opts->list->n_elts; i++) {
+	if (!member_p(opts->list->elt[i].key, exceptions))
+	    ++n;
     }
-  if (n == 0)
-    return;
-
-  if (brackets_p)
-    fputc ('[', f);
-
-  for (n = i = 0; i < opts->list->n_elts; i++)
-    {
-
-      if ( member_p(opts->list->elt[i].key, exceptions) )
-	continue;
-
-      type = simple_opt_type (&opts->list->elt[i], OPT_NONE, lang);
-      if ((type & OPT_INTERNAL) == 0)
-	{
-	  if (n > 0)
-	    fprintf (f, ",");
-	  if (type & OPT_EMIT_VAL)
-	    fprintf (f, "%s", opts->list->elt[i].val);
-	  else
-	    fprintf (f, "%s=%s", opts->list->elt[i].key,
-		     opts->list->elt[i].val);
-	  ++n;
+    if (n == 0)
+	return;
+
+    if (brackets_p)
+	fputc('[', f);
+
+    for (n = i = 0; i < opts->list->n_elts; i++) {
+
+	if (member_p(opts->list->elt[i].key, exceptions))
+	    continue;
+
+	type = simple_opt_type(&opts->list->elt[i], OPT_NONE, lang);
+	if ((type & OPT_INTERNAL) == 0) {
+	    if (n > 0)
+		fprintf(f, ",");
+	    if (type & OPT_EMIT_VAL)
+		fprintf(f, "%s", opts->list->elt[i].val);
+	    else
+		fprintf(f, "%s=%s", opts->list->elt[i].key,
+			opts->list->elt[i].val);
+	    ++n;
 	}
     }
-  if (brackets_p)
-    fputc (']', f);
+    if (brackets_p)
+	fputc(']', f);
 }
 
-void
-emit_opts_raw (FILE * f, OPTS * opts, int lang)
+void emit_opts_raw(FILE * f, OPTS * opts, int lang)
 {
-  emit_opts_internal (f, opts, NULL, 0, lang);
+    emit_opts_internal(f, opts, NULL, 0, lang);
 }
 
-void
-emit_opts (FILE * f, OPTS * opts, int lang)
+void emit_opts(FILE * f, OPTS * opts, int lang)
 {
-  emit_opts_internal (f, opts, NULL, 1, lang);
+    emit_opts_internal(f, opts, NULL, 1, lang);
 }
 
 void
-emit_opts_with_exceptions (FILE * f, OPTS * opts, char ** exceptions, int lang)
+emit_opts_with_exceptions(FILE * f, OPTS * opts, char **exceptions,
+			  int lang)
 {
-  emit_opts_internal (f, opts, exceptions, 1, lang);
+    emit_opts_internal(f, opts, exceptions, 1, lang);
 }
diff --git a/opts.h b/opts.h
index 949e173..a61e4f8 100644
--- a/opts.h
+++ b/opts.h
@@ -45,65 +45,59 @@ http://www.gnu.org/copyleft */
 #define OPT_EMIT_VAL		0x80
 
 // some dynamic array types
-typedef struct opt_t
-{
-  char *key, *val;
-}
-OPT;
+typedef struct opt_t {
+    char *key, *val;
+} OPT;
 
-typedef struct opt_list_t
-{
-  DYNAMIC_ARRAY_FIELDS (OPT, elt, n_elts);
-}
-OPT_LIST;
+typedef struct opt_list_t {
+    DYNAMIC_ARRAY_FIELDS(OPT, elt, n_elts);
+} OPT_LIST;
 
-DECLARE_DYNAMIC_ARRAY_PROTOS (OPT_LIST, OPT, opt_list, elt, n_elts)
+DECLARE_DYNAMIC_ARRAY_PROTOS(OPT_LIST, OPT, opt_list, elt, n_elts);
 
 #define OPTS_LAY 0
 #define LAY_IN  0
 #define LAY_OVER 1
 #define LAY_UNDER -1
 
-typedef struct opts_t
-{
-  OPT_LIST list[1];
-
-  // Cached values.
-  unsigned long set_p_mask;
-  int lay;
-}
-OPTS;
-
-void init_opts (OPTS * opts);
-void setup_opts (OPTS * opts, char *opt_str, SRC_LINE line);
-OPTS *raw_opts (void);
-OPTS *new_opts (char *opts_str, SRC_LINE line);
-void clear_opts (OPTS * opts);
-char *opt_val (OPTS * opts, char *opt);
-int bool_opt_p (OPTS * opts, char *opt, int default_p);
-int opt_type (OPT * opt, int default_type, int lang);
-void add_no_edges_default_opt (OPTS ** opts_ptr, int lang);
-void add_solid_white_default_opt (OPTS ** opts_ptr, int lang);
+typedef struct opts_t {
+    OPT_LIST list[1];
+
+    // Cached values.
+    unsigned long set_p_mask;
+    int lay;
+} OPTS;
+
+void init_opts(OPTS * opts);
+void setup_opts(OPTS * opts, char *opt_str, SRC_LINE line);
+OPTS *raw_opts(void);
+OPTS *new_opts(char *opts_str, SRC_LINE line);
+void clear_opts(OPTS * opts);
+char *opt_val(OPTS * opts, char *opt);
+int bool_opt_p(OPTS * opts, char *opt, int default_p);
+int opt_type(OPT * opt, int default_type, int lang);
+void add_no_edges_default_opt(OPTS ** opts_ptr, int lang);
+void add_solid_white_default_opt(OPTS ** opts_ptr, int lang);
 // selective copy for splitting option lists by type
-OPTS *copy_opts (OPTS * opts, int type_mask, int lang);
-OPTS *cat_opts (OPTS * dst, OPTS * src);
+OPTS *copy_opts(OPTS * opts, int type_mask, int lang);
+OPTS *cat_opts(OPTS * dst, OPTS * src);
 // selective copy for splitting out line options and modifying arrows
-OPTS *copy_line_opts (OPTS * opts, int first_p, int last_p, int lang);
-void emit_opts_raw (FILE * f, OPTS * opts, int lang);
-void emit_opts (FILE * f, OPTS * opts, int lang);
-void emit_opts_with_exceptions (FILE * f, OPTS * opts, char ** exceptions, int lang);
-void check_opts (OPTS * opts,
-		 int allowed, char *allowed_msg, int lang,
-		 SRC_LINE line);
+OPTS *copy_line_opts(OPTS * opts, int first_p, int last_p, int lang);
+void emit_opts_raw(FILE * f, OPTS * opts, int lang);
+void emit_opts(FILE * f, OPTS * opts, int lang);
+void emit_opts_with_exceptions(FILE * f, OPTS * opts, char **exceptions,
+			       int lang);
+void check_opts(OPTS * opts, int allowed, char *allowed_msg, int lang,
+		SRC_LINE line);
 
 // slice src into dest using Perl/Python conventions
-char *str_slice (char *dst, int dst_size, char *src, int beg, int end);
+char *str_slice(char *dst, int dst_size, char *src, int beg, int end);
 #define SLICE_TO_END  ((int)(~0u >> 1))
 
 // find last occurance of aachar in set in src; return index or -1 if none
-int str_last_occurance (char *src, char *set);
+int str_last_occurance(char *src, char *set);
 
 // strtok with a state variable instead of static
-char *istrtok (int *p, char *s, char sep);
-     
+char *istrtok(int *p, char *s, char sep);
+
 #endif
diff --git a/parse.h b/parse.h
index bd2f8de..e188e4a 100644
--- a/parse.h
+++ b/parse.h
@@ -29,8 +29,8 @@ extern int yydebug;
 extern SRC_LINE line;
 extern GLOBAL_ENV parsed_global_env[1];
 
-void set_lexer_file (char *file_name, FILE * f);
-int parse (SYMBOL_TABLE * st);
-OBJECT *parsed_objects (void);
+void set_lexer_file(char *file_name, FILE * f);
+int parse(SYMBOL_TABLE * st);
+OBJECT *parsed_objects(void);
 
 #endif
diff --git a/scene.c b/scene.c
index 235cba7..c9856d1 100644
--- a/scene.c
+++ b/scene.c
@@ -1,568 +1,621 @@
 /* scene.c
-   Copyright (C) 2005,2006,2007,2008 Eugene K. Ressler, Jr.
+   Copyright (C) 2005,2006,2007,2008,2009,2010,2011 Eugene K. Ressler, Jr.
 
-This file is part of Sketch, a small, simple system for making 
-3d drawings with LaTeX and the PSTricks or TikZ package.
+   This file is part of Sketch, a small, simple system for making 
+   3d drawings with LaTeX and the PSTricks or TikZ package.
 
-Sketch is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
+   Sketch is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
 
-Sketch is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   Sketch is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with Sketch; see the file COPYING.txt.  If not, see
-http://www.gnu.org/copyleft */
+   You should have received a copy of the GNU General Public License
+   along with Sketch; see the file COPYING.txt.  If not, see
+   http://www.gnu.org/copyleft */
 
 #include <stdio.h>
 #include <math.h>
 #include "scene.h"
 #include "emit.h"
 
-DECLARE_DYNAMIC_2D_ARRAY_FUNCS (POINT_LIST_3D, POINT_3D, FLOAT,
-				point_list_3d, v, n_pts, NO_OTHER_INIT)
-DECLARE_DYNAMIC_2D_ARRAY_FUNCS (TRANSFORM_LIST, TRANSFORM, FLOAT,
-				transform_list, xf, n_xfs, NO_OTHER_INIT)
+DECLARE_DYNAMIC_2D_ARRAY_FUNCS(POINT_LIST_3D, POINT_3D, FLOAT,
+			       point_list_3d, v, n_pts, NO_OTHER_INIT);
+DECLARE_DYNAMIC_2D_ARRAY_FUNCS(TRANSFORM_LIST, TRANSFORM, FLOAT,
+			       transform_list, xf, n_xfs, NO_OTHER_INIT);
+DECLARE_DYNAMIC_ARRAY_FUNCS(SPECIAL_ARG_LIST, SPECIAL_ARG,
+			    special_arg_list, arg, n_args, NO_OTHER_INIT);
+
 // this must match the definition of OBJECT_TYPE
-     char *object_type_str[] = {
-       "base",
-       "tag",
-       "option list",
-       "scalar",
-       "point",
-       "vector",
-       "transform",
-       "dots",
-       "line",
-       "curve",
-       "polygon",
-       "special",
-       "sweep",
-       "repeat",
-       "compound",
-     };
+char *object_type_str[] = {
+    "base",
+    "tag",
+    "option list",
+    "scalar",
+    "point",
+    "vector",
+    "transform",
+    "dots",
+    "line",
+    "curve",
+    "polygon",
+    "special",
+    "sweep",
+    "repeat",
+    "compound",
+};
 
 #define LAY_IN  0
 #define LAY_OVER 1
 #define LAY_UNDER -1
 
-int lay_val (OPTS * opts, int lay_default)
-{
-  char *val = opt_val (opts, "lay");
-  if (!val)
-    return lay_default;
-  if (strcmp (val, "over") == 0)
-    return LAY_OVER;
-  else if (strcmp (val, "under") == 0)
-    return LAY_UNDER;
-  else if (strcmp (val, "in") == 0)
-    return LAY_IN;
-  else
-    {
-      warn (no_line, "lay=%s has been ignored", val);
-      return lay_default;
+int lay_val(OPTS * opts, int lay_default)
+{
+    char *val = opt_val(opts, "lay");
+    if (!val)
+	return lay_default;
+    if (strcmp(val, "over") == 0)
+	return LAY_OVER;
+    else if (strcmp(val, "under") == 0)
+	return LAY_UNDER;
+    else if (strcmp(val, "in") == 0)
+	return LAY_IN;
+    else {
+	warn(no_line, "lay=%s has been ignored", val);
+	return lay_default;
     }
 }
 
-OBJECT *
-new_tag_def (void)
+OBJECT *new_tag_def(void)
 {
-  TAG_DEF *r = safe_malloc (sizeof *r);
-  r->tag = O_TAG_DEF;
-  r->sibling = NULL;
-  return (OBJECT *) r;
+    TAG_DEF *r = safe_malloc(sizeof *r);
+    r->tag = O_TAG_DEF;
+    r->sibling = NULL;
+    return (OBJECT *) r;
 }
 
-OBJECT *
-new_opts_def (char *opts_str, SRC_LINE line)
+OBJECT *new_opts_def_copy(OPTS * opts)
 {
-  OPTS_DEF *r = safe_malloc (sizeof *r);
-  r->tag = O_OPTS_DEF;
-  r->sibling = NULL;
-  r->opts = new_opts (opts_str, line);
-  return (OBJECT *) r;
+    OPTS_DEF *r = safe_malloc(sizeof *r);
+    r->tag = O_OPTS_DEF;
+    r->sibling = NULL;
+    r->opts = opts;
+    return (OBJECT *) r;
 }
 
-OBJECT *
-new_scalar_def (FLOAT val)
+OBJECT *new_opts_def(char *opts_str, SRC_LINE line)
 {
-  SCALAR_DEF *r = safe_malloc (sizeof *r);
-  r->tag = O_SCALAR_DEF;
-  r->sibling = NULL;
-  r->val = val;
-  return (OBJECT *) r;
+    return new_opts_def_copy(new_opts(opts_str, line));
 }
 
-OBJECT *
-new_point_def (POINT_3D p)
+OBJECT *new_scalar_def(FLOAT val)
 {
-  POINT_DEF *r = safe_malloc (sizeof *r);
-  r->tag = O_POINT_DEF;
-  r->sibling = NULL;
-  copy_pt_3d (r->p, p);
-  return (OBJECT *) r;
+    SCALAR_DEF *r = safe_malloc(sizeof *r);
+    r->tag = O_SCALAR_DEF;
+    r->sibling = NULL;
+    r->val = val;
+    return (OBJECT *) r;
 }
 
-OBJECT *
-new_vector_def (VECTOR_3D v)
+OBJECT *new_point_def(POINT_3D p)
 {
-  VECTOR_DEF *r = safe_malloc (sizeof *r);
-  r->tag = O_VECTOR_DEF;
-  r->sibling = NULL;
-  copy_vec_3d (r->v, v);
-  return (OBJECT *) r;
+    POINT_DEF *r = safe_malloc(sizeof *r);
+    r->tag = O_POINT_DEF;
+    r->sibling = NULL;
+    copy_pt_3d(r->p, p);
+    return (OBJECT *) r;
 }
 
-OBJECT *
-new_transform_def (TRANSFORM xf)
+OBJECT *new_vector_def(VECTOR_3D v)
 {
-  TRANSFORM_DEF *r = safe_malloc (sizeof *r);
-  r->tag = O_TRANSFORM_DEF;
-  r->sibling = NULL;
-  copy_transform (r->xf, xf);
-  return (OBJECT *) r;
+    VECTOR_DEF *r = safe_malloc(sizeof *r);
+    r->tag = O_VECTOR_DEF;
+    r->sibling = NULL;
+    copy_vec_3d(r->v, v);
+    return (OBJECT *) r;
 }
 
-void
-translate_points (POINT_LIST_3D * dst, OBJECT * src_obj)
+OBJECT *new_transform_def(TRANSFORM xf)
+{
+    TRANSFORM_DEF *r = safe_malloc(sizeof *r);
+    r->tag = O_TRANSFORM_DEF;
+    r->sibling = NULL;
+    copy_transform(r->xf, xf);
+    return (OBJECT *) r;
+}
+
+void translate_points(POINT_LIST_3D * dst, OBJECT * src_obj)
 {
-  POINT_DEF *sibling, *src = (POINT_DEF *) src_obj;
+    POINT_DEF *sibling, *src = (POINT_DEF *) src_obj;
 
-  while (src)
-    {
-      copy_pt_3d (pushed_point_list_3d_v (dst), src->p);
-      sibling = (POINT_DEF *) src->sibling;
-      safe_free (src);
-      src = sibling;
+    while (src) {
+	copy_pt_3d(pushed_point_list_3d_v(dst), src->p);
+	sibling = (POINT_DEF *) src->sibling;
+	safe_free(src);
+	src = sibling;
+    }
+}
+
+void translate_special_args(SPECIAL_ARG_LIST * dst, OBJECT * src)
+{
+    OBJECT *sibling;
+
+    while (src) {
+	SPECIAL_ARG *arg = pushed_special_arg_list_arg(dst);
+	switch (src->tag) {
+	case O_SCALAR_DEF:{
+		SCALAR_DEF *scalar_def = (SCALAR_DEF *) src;
+		arg->tag = SA_SCALAR;
+		arg->val.flt = scalar_def->val;
+	    }
+	    break;
+	case O_POINT_DEF:{
+		POINT_DEF *pt_def = (POINT_DEF *) src;
+		arg->tag = SA_POINT;
+		copy_pt_3d(arg->val.pt, pt_def->p);
+	    }
+	    break;
+	case O_VECTOR_DEF:{
+		VECTOR_DEF *vec_def = (VECTOR_DEF *) src;
+		arg->tag = SA_VECTOR;
+		copy_vec_3d(arg->val.v, vec_def->v);
+	    }
+	    break;
+	default:
+	    die(no_line, "unexpected special arg object %s(%d)",
+		object_type_str[src->tag], src->tag);
+	}
+	sibling = src->sibling;
+	safe_free(src);
+	src = sibling;
     }
 }
 
-DOTS_OBJECT *
-raw_dots (OPTS * opts)
+DOTS_OBJECT *raw_dots(OPTS * opts)
 {
-  DOTS_OBJECT *r = safe_malloc (sizeof *r);
-  r->tag = O_DOTS;
-  r->sibling = NULL;
-  r->opts = opts;
-  init_point_list_3d (r->pts);
-  return r;
+    DOTS_OBJECT *r = safe_malloc(sizeof *r);
+    r->tag = O_DOTS;
+    r->sibling = NULL;
+    r->opts = opts;
+    init_point_list_3d(r->pts);
+    return r;
 }
 
-OBJECT *
-new_dots (OPTS * opts, OBJECT * pts)
+OBJECT *new_dots(OPTS * opts, OBJECT * pts)
 {
-  DOTS_OBJECT *r = raw_dots (opts);
-  translate_points (r->pts, pts);
-  return (OBJECT *) r;
+    DOTS_OBJECT *r = raw_dots(opts);
+    translate_points(r->pts, pts);
+    return (OBJECT *) r;
 }
 
-OBJECT *
-copy_dots (OBJECT * obj)
+OBJECT *copy_dots(OBJECT * obj)
 {
-  DOTS_OBJECT *org = (DOTS_OBJECT *) obj, *r = raw_dots (org->opts);
-  copy_point_list_3d (r->pts, org->pts);
-  return (OBJECT *) r;
+    DOTS_OBJECT *org = (DOTS_OBJECT *) obj, *r = raw_dots(org->opts);
+    copy_point_list_3d(r->pts, org->pts);
+    return (OBJECT *) r;
 }
 
-LINE_OBJECT *
-raw_line (OPTS * opts)
+LINE_OBJECT *raw_line(OPTS * opts)
 {
-  LINE_OBJECT *r = safe_malloc (sizeof *r);
-  r->tag = O_LINE;
-  r->sibling = NULL;
-  r->opts = opts;
-  init_point_list_3d (r->pts);
-  return r;
+    LINE_OBJECT *r = safe_malloc(sizeof *r);
+    r->tag = O_LINE;
+    r->sibling = NULL;
+    r->opts = opts;
+    init_point_list_3d(r->pts);
+    return r;
 }
 
-OBJECT *
-new_line (OPTS * opts, OBJECT * pts)
+OBJECT *new_line(OPTS * opts, OBJECT * pts)
 {
-  LINE_OBJECT *r = raw_line (opts);
-  translate_points (r->pts, pts);
-  return (OBJECT *) r;
+    LINE_OBJECT *r = raw_line(opts);
+    translate_points(r->pts, pts);
+    return (OBJECT *) r;
 }
 
-OBJECT *
-copy_line (OBJECT * obj)
+OBJECT *copy_line(OBJECT * obj)
 {
-  LINE_OBJECT *org = (LINE_OBJECT *) obj, *r = raw_line (org->opts);
-  copy_point_list_3d (r->pts, org->pts);
-  return (OBJECT *) r;
+    LINE_OBJECT *org = (LINE_OBJECT *) obj, *r = raw_line(org->opts);
+    copy_point_list_3d(r->pts, org->pts);
+    return (OBJECT *) r;
 }
 
-CURVE_OBJECT *
-raw_curve (OPTS * opts)
+CURVE_OBJECT *raw_curve(OPTS * opts)
 {
-  CURVE_OBJECT *r = safe_malloc (sizeof *r);
-  r->tag = O_CURVE;
-  r->sibling = NULL;
-  r->opts = opts;
-  init_point_list_3d (r->pts);
-  return r;
+    CURVE_OBJECT *r = safe_malloc(sizeof *r);
+    r->tag = O_CURVE;
+    r->sibling = NULL;
+    r->opts = opts;
+    init_point_list_3d(r->pts);
+    return r;
 }
 
-OBJECT *
-new_curve (OPTS * opts, OBJECT * pts)
+OBJECT *new_curve(OPTS * opts, OBJECT * pts)
 {
-  CURVE_OBJECT *r = raw_curve (opts);
-  translate_points (r->pts, pts);
-  return (OBJECT *) r;
+    CURVE_OBJECT *r = raw_curve(opts);
+    translate_points(r->pts, pts);
+    return (OBJECT *) r;
 }
 
-OBJECT *
-copy_curve (OBJECT * obj)
+OBJECT *copy_curve(OBJECT * obj)
 {
-  CURVE_OBJECT *org = (CURVE_OBJECT *) obj, *r = raw_curve (org->opts);
-  copy_point_list_3d (r->pts, org->pts);
-  return (OBJECT *) r;
+    CURVE_OBJECT *org = (CURVE_OBJECT *) obj, *r = raw_curve(org->opts);
+    copy_point_list_3d(r->pts, org->pts);
+    return (OBJECT *) r;
 }
 
-POLYGON_OBJECT *
-raw_polygon (OPTS * opts)
+POLYGON_OBJECT *raw_polygon(OPTS * opts)
 {
-  POLYGON_OBJECT *r = safe_malloc (sizeof *r);
-  r->tag = O_POLYGON;
-  r->sibling = NULL;
-  r->opts = opts;
-  init_point_list_3d (r->pts);
-  r->border_p = 0;
-  return r;
+    POLYGON_OBJECT *r = safe_malloc(sizeof *r);
+    r->tag = O_POLYGON;
+    r->sibling = NULL;
+    r->opts = opts;
+    init_point_list_3d(r->pts);
+    r->border_p = 0;
+    return r;
 }
 
-OBJECT *
-new_polygon (OPTS * opts, OBJECT * pts)
+OBJECT *new_polygon(OPTS * opts, OBJECT * pts)
 {
-  POLYGON_OBJECT *r = raw_polygon (opts);
-  translate_points (r->pts, pts);
-  return (OBJECT *) r;
+    POLYGON_OBJECT *r = raw_polygon(opts);
+    translate_points(r->pts, pts);
+    return (OBJECT *) r;
 }
 
-OBJECT *
-copy_polygon (OBJECT * obj)
+OBJECT *copy_polygon(OBJECT * obj)
 {
-  POLYGON_OBJECT *org = (POLYGON_OBJECT *) obj, *r = raw_polygon (org->opts);
-  copy_point_list_3d (r->pts, org->pts);
-  return (OBJECT *) r;
+    POLYGON_OBJECT *org = (POLYGON_OBJECT *) obj, *r =
+	raw_polygon(org->opts);
+    copy_point_list_3d(r->pts, org->pts);
+    return (OBJECT *) r;
 }
 
-static SPECIAL_OBJECT *
-raw_special (OPTS * opts)
+static SPECIAL_OBJECT *raw_special(OPTS * opts)
 {
-  SPECIAL_OBJECT *r = safe_malloc (sizeof *r);
-  r->tag = O_SPECIAL;
-  r->sibling = NULL;
-  r->code = NULL;
-  r->opts = opts;
-  init_point_list_3d (r->pts);
-  return r;
+    SPECIAL_OBJECT *r = safe_malloc(sizeof *r);
+    r->tag = O_SPECIAL;
+    r->sibling = NULL;
+    r->code = NULL;
+    r->opts = opts;
+    init_special_arg_list(r->args);
+    return r;
 }
 
-OBJECT *
-new_special (char *code, OPTS * opts, OBJECT * pts, SRC_LINE line)
+/* The parser may put options anywhere in the arg list. We must
+   flag options in any location except the first as an error. 
+   In the first location, we unlink from args list and install. */
+OBJECT *new_special(char *code, OBJECT * args, SRC_LINE line)
 {
-  SPECIAL_OBJECT *r = raw_special (opts);
-  r->code = code;
-  translate_points (r->pts, pts);
-  // syntax check
-  process_special (NULL, r, line);
-  return (OBJECT *) r;
+    SPECIAL_OBJECT *r;
+    OPTS_DEF *d;
+    OBJECT *p, *q;
+
+    // use the first arg as options if that's what's there
+    if (args && args->tag == O_OPTS_DEF) {
+	d = (OPTS_DEF *) args;
+	r = raw_special(d->opts);
+	args = args->sibling;
+	safe_free(d);
+    } else {
+	r = raw_special(NULL);
+    }
+    // ensure no options are left
+    q = NULL;
+    for (p = args; p != NULL; p = p->sibling) {
+	if (p->tag == O_OPTS_DEF) {
+	    err(line, "unexpected options found in special argument list");
+	    // unlink
+	    if (q == NULL)
+		args = p->sibling;
+	    else
+		q->sibling = p->sibling;
+	} else {
+	    q = p;
+	}
+    }
+
+    r->code = code;
+    translate_special_args(r->args, args);
+    // syntax check
+    process_special(NULL, r, line);
+    return (OBJECT *) r;
 }
 
-OBJECT *
-copy_special (OBJECT * obj)
+OBJECT *copy_special(OBJECT * obj)
 {
-  SPECIAL_OBJECT *org = (SPECIAL_OBJECT *) obj, *r = raw_special (org->opts);
-  copy_point_list_3d (r->pts, org->pts);
-  r->code = safe_strdup (org->code);
-  return (OBJECT *) r;
+    SPECIAL_OBJECT *org = (SPECIAL_OBJECT *) obj, *r =
+	raw_special(org->opts);
+    copy_special_arg_list(r->args, org->args);
+    r->code = safe_strdup(org->code);
+    return (OBJECT *) r;
 }
 
-SWEEP_OBJECT *
-raw_sweep (OPTS * opts)
+SWEEP_OBJECT *raw_sweep(OPTS * opts)
 {
-  SWEEP_OBJECT *r = safe_malloc (sizeof *r);
-  r->tag = O_SWEEP;
-  r->sibling = NULL;
-  r->n_slices = 0;
-  r->closed_p = 0;
-  init_transform_list (r->xforms);
-  r->opts = opts;
-  r->swept = NULL;
-  return r;
+    SWEEP_OBJECT *r = safe_malloc(sizeof *r);
+    r->tag = O_SWEEP;
+    r->sibling = NULL;
+    r->n_slices = 0;
+    r->closed_p = 0;
+    init_transform_list(r->xforms);
+    r->opts = opts;
+    r->swept = NULL;
+    return r;
 }
 
-void
-translate_transforms (TRANSFORM_LIST * dst, OBJECT * src_obj)
-{
-  TRANSFORM_DEF *sibling, *src = (TRANSFORM_DEF *) src_obj;
-  while (src)
-    {
-      copy_transform (pushed_transform_list_xf (dst), src->xf);
-      sibling = (TRANSFORM_DEF *) src->sibling;
-      safe_free (src);
-      src = sibling;
+void translate_transforms(TRANSFORM_LIST * dst, OBJECT * src_obj)
+{
+    TRANSFORM_DEF *sibling, *src = (TRANSFORM_DEF *) src_obj;
+    while (src) {
+	copy_transform(pushed_transform_list_xf(dst), src->xf);
+	sibling = (TRANSFORM_DEF *) src->sibling;
+	safe_free(src);
+	src = sibling;
     }
 }
 
-OBJECT *
-new_sweep (OPTS * opts, int n_slices, int closed_p, OBJECT * xfs,
-	   OBJECT * swept)
+OBJECT *new_sweep(OPTS * opts, int n_slices, int closed_p, OBJECT * xfs,
+		  OBJECT * swept)
 {
-  SWEEP_OBJECT *r = raw_sweep (opts);
-  r->n_slices = n_slices;
-  r->closed_p = closed_p;
-  translate_transforms (r->xforms, xfs);
-  r->swept = swept;
-  return (OBJECT *) r;
+    SWEEP_OBJECT *r = raw_sweep(opts);
+    r->n_slices = n_slices;
+    r->closed_p = closed_p;
+    translate_transforms(r->xforms, xfs);
+    r->swept = swept;
+    return (OBJECT *) r;
 }
 
 // this is a shallow copy
-OBJECT *
-copy_sweep (OBJECT * obj)
+OBJECT *copy_sweep(OBJECT * obj)
 {
-  SWEEP_OBJECT *org = (SWEEP_OBJECT *) obj, *r = raw_sweep (org->opts);
-  r->n_slices = org->n_slices;
-  r->closed_p = org->closed_p;
-  copy_transform_list (r->xforms, org->xforms);
-  r->swept = org->swept;
-  return (OBJECT *) r;
+    SWEEP_OBJECT *org = (SWEEP_OBJECT *) obj, *r = raw_sweep(org->opts);
+    r->n_slices = org->n_slices;
+    r->closed_p = org->closed_p;
+    copy_transform_list(r->xforms, org->xforms);
+    r->swept = org->swept;
+    return (OBJECT *) r;
 }
 
-REPEAT_OBJECT *
-raw_repeat (void)
+REPEAT_OBJECT *raw_repeat(void)
 {
-  REPEAT_OBJECT *r = safe_malloc (sizeof *r);
-  r->tag = O_REPEAT;
-  r->sibling = NULL;
-  r->n = 0;
-  init_transform_list (r->xforms);
-  r->repeated = NULL;
-  return r;
+    REPEAT_OBJECT *r = safe_malloc(sizeof *r);
+    r->tag = O_REPEAT;
+    r->sibling = NULL;
+    r->n = 0;
+    init_transform_list(r->xforms);
+    r->repeated = NULL;
+    return r;
 }
 
-OBJECT *
-new_repeat (int n, OBJECT * xfs, OBJECT * repeated)
+OBJECT *new_repeat(int n, OBJECT * xfs, OBJECT * repeated)
 {
-  REPEAT_OBJECT *r = raw_repeat ();
-  r->n = n;
-  translate_transforms (r->xforms, xfs);
-  r->repeated = repeated;
-  return (OBJECT *) r;
+    REPEAT_OBJECT *r = raw_repeat();
+    r->n = n;
+    translate_transforms(r->xforms, xfs);
+    r->repeated = repeated;
+    return (OBJECT *) r;
 }
 
-OBJECT *
-copy_repeat (OBJECT * obj)
+OBJECT *copy_repeat(OBJECT * obj)
 {
-  REPEAT_OBJECT *org = (REPEAT_OBJECT *) obj, *r = raw_repeat ();
-  r->n = org->n;
-  copy_transform_list (r->xforms, org->xforms);
-  r->repeated = org->repeated;	// shallow copy
-  return (OBJECT *) r;
+    REPEAT_OBJECT *org = (REPEAT_OBJECT *) obj, *r = raw_repeat();
+    r->n = org->n;
+    copy_transform_list(r->xforms, org->xforms);
+    r->repeated = org->repeated;	// shallow copy
+    return (OBJECT *) r;
 }
 
-OBJECT *
-new_compound (TRANSFORM xform, OBJECT * child)
+OBJECT *new_compound(TRANSFORM xform, OBJECT * child)
 {
-  COMPOUND_OBJECT *r = safe_malloc (sizeof *r);
-  r->tag = O_COMPOUND;
-  r->sibling = NULL;
-  copy_transform (r->xform, xform);
-  r->child = child;
-  return (OBJECT *) r;
+    COMPOUND_OBJECT *r = safe_malloc(sizeof *r);
+    r->tag = O_COMPOUND;
+    r->sibling = NULL;
+    copy_transform(r->xform, xform);
+    r->child = child;
+    return (OBJECT *) r;
 }
 
 // this is a shallow copy
-OBJECT *
-copy_compound (OBJECT * obj)
+OBJECT *copy_compound(OBJECT * obj)
 {
-  COMPOUND_OBJECT *org = (COMPOUND_OBJECT *) obj;
-  return new_compound (org->xform, org->child);
+    COMPOUND_OBJECT *org = (COMPOUND_OBJECT *) obj;
+    return new_compound(org->xform, org->child);
 }
 
 typedef OBJECT *(*COPY_FUNC) (OBJECT *);
 
 static COPY_FUNC copy_tbl[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  copy_dots,
-  copy_line,
-  copy_curve,
-  copy_polygon,
-  copy_special,
-  copy_sweep,
-  copy_repeat,
-  copy_compound,
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    copy_dots,
+    copy_line,
+    copy_curve,
+    copy_polygon,
+    copy_special,
+    copy_sweep,
+    copy_repeat,
+    copy_compound,
 };
 
-OBJECT *
-copy_drawable_without_siblings(OBJECT * obj)
+OBJECT *copy_drawable_without_siblings(OBJECT * obj)
 {
-  return (*copy_tbl[obj->tag]) (obj);
+    return (*copy_tbl[obj->tag]) (obj);
 }
 
-OBJECT *
-copy_drawable (OBJECT * obj)
+OBJECT *copy_drawable(OBJECT * obj)
 {
-  OBJECT *r = NULL;
-  while (obj)
-    {
-      if (copy_tbl[obj->tag])
-	{
-	  OBJECT *copy = copy_drawable_without_siblings(obj);
-	  copy->sibling = r;
-	  r = copy;
-	}
-      else
-	{
-	  die (no_line, "copy_drawable: attempt to copy non-drawable %s",
-	       object_type_str[obj->tag]);
+    OBJECT *r = NULL;
+    while (obj) {
+	if (copy_tbl[obj->tag]) {
+	    OBJECT *copy = copy_drawable_without_siblings(obj);
+	    copy->sibling = r;
+	    r = copy;
+	} else {
+	    die(no_line, "copy_drawable: attempt to copy non-drawable %s",
+		object_type_str[obj->tag]);
 	}
-      obj = obj->sibling;
+	obj = obj->sibling;
     }
-  return sibling_reverse (r);
+    return sibling_reverse(r);
 }
 
-OBJECT *
-sibling_reverse (OBJECT * obj)
+OBJECT *sibling_reverse(OBJECT * obj)
 {
-  OBJECT *p, *q, *t;
+    OBJECT *p, *q, *t;
 
-  // pop from p and push onto q until p is empty
-  p = obj;
-  q = NULL;
-  while (p)
-    {
-      t = p;
-      p = p->sibling;		// pop
-      t->sibling = q;
-      q = t;			// push
+    // pop from p and push onto q until p is empty
+    p = obj;
+    q = NULL;
+    while (p) {
+	t = p;
+	p = p->sibling;		// pop
+	t->sibling = q;
+	q = t;			// push
     }
-  return q;
+    return q;
 }
 
-OBJECT *
-object_from_expr (EXPR_VAL * val)
+OBJECT *object_from_expr(EXPR_VAL * val)
 {
-  switch (val->tag)
-    {
+    switch (val->tag) {
     case E_FLOAT:
-      return new_scalar_def (val->val.flt);
+	return new_scalar_def(val->val.flt);
     case E_POINT:
-      return new_point_def (val->val.pt);
+	return new_point_def(val->val.pt);
     case E_VECTOR:
-      return new_vector_def (val->val.vec);
+	return new_vector_def(val->val.vec);
     case E_TRANSFORM:
-      return new_transform_def (val->val.xf);
+	return new_transform_def(val->val.xf);
     default:
-      die (no_line, "object_from_expr: unknown value tag %d", val->tag);
+	die(no_line, "object_from_expr: unknown value tag %d", val->tag);
     }
-  return NULL;			// never occurs
+    return NULL;		// never occurs
 }
 
 void
-transform_points (POINT_LIST_3D * dst_pts, TRANSFORM xf,
-		  POINT_LIST_3D * src_pts)
+transform_points(POINT_LIST_3D * dst_pts, TRANSFORM xf,
+		 POINT_LIST_3D * src_pts)
 {
-  int i;
+    int i;
 
-  setup_point_list_3d (dst_pts, src_pts->n_pts);
-  for (i = 0; i < src_pts->n_pts; i++)
-    transform_pt_3d (dst_pts->v[i], xf, src_pts->v[i]);
-  dst_pts->n_pts = src_pts->n_pts;
+    setup_point_list_3d(dst_pts, src_pts->n_pts);
+    for (i = 0; i < src_pts->n_pts; i++)
+	transform_pt_3d(dst_pts->v[i], xf, src_pts->v[i]);
+    dst_pts->n_pts = src_pts->n_pts;
+}
+
+void
+transform_special_args(SPECIAL_ARG_LIST * dst_args, TRANSFORM xf,
+		       SPECIAL_ARG_LIST * src_args)
+{
+    int i;
+
+    setup_special_arg_list(dst_args, src_args->n_args);
+    for (i = 0; i < src_args->n_args; i++) {
+	switch (dst_args->arg[i].tag = src_args->arg[i].tag) {
+	case SA_SCALAR:
+	    dst_args->arg[i].val.flt = src_args->arg[i].val.flt;
+	    break;
+	case SA_POINT:
+	    transform_pt_3d(dst_args->arg[i].val.pt, xf,
+			    src_args->arg[i].val.pt);
+	    break;
+	case SA_VECTOR:
+	    transform_vec_3d(dst_args->arg[i].val.v, xf,
+			     src_args->arg[i].val.v);
+	    break;
+	default:
+	    die(no_line, "unexpected special arg type");
+	}
+    }
+    dst_args->n_args = src_args->n_args;
 }
 
 static void
-fill_transform_accum (TRANSFORM_LIST * accum, TRANSFORM_LIST * inc)
+fill_transform_accum(TRANSFORM_LIST * accum, TRANSFORM_LIST * inc)
 {
-  int i;
+    int i;
 
-  setup_transform_list (accum, inc->n_xfs);
-  accum->n_xfs = inc->n_xfs;
-  for (i = 0; i < inc->n_xfs; i++)
-    set_ident (accum->xf[i]);
+    setup_transform_list(accum, inc->n_xfs);
+    accum->n_xfs = inc->n_xfs;
+    for (i = 0; i < inc->n_xfs; i++)
+	set_ident(accum->xf[i]);
 }
 
 static void
-advance_transform_accum (TRANSFORM_LIST * accum, TRANSFORM_LIST * inc)
+advance_transform_accum(TRANSFORM_LIST * accum, TRANSFORM_LIST * inc)
 {
-  int i;
-  for (i = 0; i < accum->n_xfs; i++)
-    compose (accum->xf[i], accum->xf[i], inc->xf[i]);
+    int i;
+    for (i = 0; i < accum->n_xfs; i++)
+	compose(accum->xf[i], accum->xf[i], inc->xf[i]);
 }
 
 static void
-compose_transform_accum (TRANSFORM xf, TRANSFORM_LIST * accum,
-			 TRANSFORM model_view_xf)
+compose_transform_accum(TRANSFORM xf, TRANSFORM_LIST * accum,
+			TRANSFORM model_view_xf)
 {
-  int i;
+    int i;
 
-  if (accum->n_xfs <= 0)
-    die (no_line, "zero size accumulator");
-  copy_transform (xf, accum->xf[0]);
-  // left-multiply because accumulator is in "then" order
-  for (i = 1; i < accum->n_xfs; i++)
-    compose (xf, accum->xf[i], xf);
-  if (model_view_xf)
-    compose (xf, model_view_xf, xf);
+    if (accum->n_xfs <= 0)
+	die(no_line, "zero size accumulator");
+    copy_transform(xf, accum->xf[0]);
+    // left-multiply because accumulator is in "then" order
+    for (i = 1; i < accum->n_xfs; i++)
+	compose(xf, accum->xf[i], xf);
+    if (model_view_xf)
+	compose(xf, model_view_xf, xf);
 }
 
-OBJECT *
-flat_dots (OBJECT * obj, TRANSFORM xf)
+OBJECT *flat_dots(OBJECT * obj, TRANSFORM xf)
 {
-  DOTS_OBJECT *s = (DOTS_OBJECT *) obj, *dots = raw_dots (s->opts);
-  transform_points (dots->pts, xf, s->pts);
-  return (OBJECT *) dots;
+    DOTS_OBJECT *s = (DOTS_OBJECT *) obj, *dots = raw_dots(s->opts);
+    transform_points(dots->pts, xf, s->pts);
+    return (OBJECT *) dots;
 }
 
-OBJECT *
-flat_line (OBJECT * obj, TRANSFORM xf)
+OBJECT *flat_line(OBJECT * obj, TRANSFORM xf)
 {
-  LINE_OBJECT *s = (LINE_OBJECT *) obj, *line = raw_line (s->opts);
-  check_opts (s->opts, OPT_INTERNAL | OPT_LINE,
-	      "unknown line option %s=%s will be ignored",
-	      global_env->output_language, no_line);
-  transform_points (line->pts, xf, s->pts);
-  return (OBJECT *) line;
+    LINE_OBJECT *s = (LINE_OBJECT *) obj, *line = raw_line(s->opts);
+    check_opts(s->opts, OPT_INTERNAL | OPT_LINE,
+	       "unknown line option %s=%s will be ignored",
+	       global_env->output_language, no_line);
+    transform_points(line->pts, xf, s->pts);
+    return (OBJECT *) line;
 }
 
-OBJECT *
-flat_curve (OBJECT * obj, TRANSFORM xf)
+OBJECT *flat_curve(OBJECT * obj, TRANSFORM xf)
 {
-  CURVE_OBJECT *s = (CURVE_OBJECT *) obj, *curve = raw_curve (s->opts);
-  transform_points (curve->pts, xf, s->pts);
-  return (OBJECT *) curve;
+    CURVE_OBJECT *s = (CURVE_OBJECT *) obj, *curve = raw_curve(s->opts);
+    transform_points(curve->pts, xf, s->pts);
+    return (OBJECT *) curve;
 }
 
-OBJECT *
-flat_polygon (OBJECT * obj, TRANSFORM xf)
+OBJECT *flat_polygon(OBJECT * obj, TRANSFORM xf)
 {
-  POLYGON_OBJECT *s = (POLYGON_OBJECT *) obj,
-    *polygon = raw_polygon (s->opts);
-  check_opts (s->opts, OPT_INTERNAL | OPT_POLYGON | OPT_LINE,
-	      "unknown polygon option %s=%s will be ignored",
-	      global_env->output_language, no_line);
-  transform_points (polygon->pts, xf, s->pts);
-  return (OBJECT *) polygon;
+    POLYGON_OBJECT *s = (POLYGON_OBJECT *) obj,
+	*polygon = raw_polygon(s->opts);
+    check_opts(s->opts, OPT_INTERNAL | OPT_POLYGON | OPT_LINE,
+	       "unknown polygon option %s=%s will be ignored",
+	       global_env->output_language, no_line);
+    transform_points(polygon->pts, xf, s->pts);
+    return (OBJECT *) polygon;
 }
 
-OBJECT *
-flat_special (OBJECT * obj, TRANSFORM xf)
+OBJECT *flat_special(OBJECT * obj, TRANSFORM xf)
 {
-  SPECIAL_OBJECT *s = (SPECIAL_OBJECT *) obj,
-    *special = raw_special (s->opts);
-  special->code = safe_strdup (s->code);
-  transform_points (special->pts, xf, s->pts);
-  return (OBJECT *) special;
+    SPECIAL_OBJECT *s = (SPECIAL_OBJECT *) obj,
+	*special = raw_special(s->opts);
+    special->code = safe_strdup(s->code);
+    transform_special_args(special->args, xf, s->args);
+    return (OBJECT *) special;
 }
 
 #define MAX_WARP  1e-5
@@ -571,682 +624,652 @@ flat_special (OBJECT * obj, TRANSFORM xf)
 // return 0 if best spilt is on the 0--2 line
 // return 1 if best split is on the 1--3 line
 static int
-best_triangle_split (POINT_3D v0, POINT_3D v1, POINT_3D v2, POINT_3D v3)
+best_triangle_split(POINT_3D v0, POINT_3D v1, POINT_3D v2, POINT_3D v3)
 {
-  VECTOR_3D n, d0, d1, e, e_max;
-  FLOAT e_len_sqr, e_max_len_sqr, warp;
+    VECTOR_3D n, d0, d1, e, e_max;
+    FLOAT e_len_sqr, e_max_len_sqr, warp;
 
-  sub_vecs_3d (d0, v2, v0);
-  sub_vecs_3d (d1, v3, v1);
-  cross (n, d0, d1);
+    sub_vecs_3d(d0, v2, v0);
+    sub_vecs_3d(d1, v3, v1);
+    cross(n, d0, d1);
 
-  // if the cross product is zero length, the polygon is degenerate and can
-  // be considered flat; no need to traingulate
-  if (!find_unit_vec_3d (n, n))
-    return -1;
+    // if the cross product is zero length, the polygon is degenerate and can
+    // be considered flat; no need to traingulate
+    if (!find_unit_vec_3d(n, n))
+	return -1;
 
-  // find the edge of maximum length; probably not necessary
-  sub_vecs_3d (e_max, v1, v0);
-  e_max_len_sqr = dot_3d (e_max, e_max);
+    // find the edge of maximum length; probably not necessary
+    sub_vecs_3d(e_max, v1, v0);
+    e_max_len_sqr = dot_3d(e_max, e_max);
 
-  sub_vecs_3d (e, v2, v1);
-  e_len_sqr = dot_3d (e, e);
-  if (e_len_sqr > e_max_len_sqr)
-    {
-      e_max_len_sqr = e_len_sqr;
-      copy_vec_3d (e_max, e);
+    sub_vecs_3d(e, v2, v1);
+    e_len_sqr = dot_3d(e, e);
+    if (e_len_sqr > e_max_len_sqr) {
+	e_max_len_sqr = e_len_sqr;
+	copy_vec_3d(e_max, e);
     }
 
-  sub_vecs_3d (e, v3, v2);
-  e_len_sqr = dot_3d (e, e);
-  if (e_len_sqr > e_max_len_sqr)
-    {
-      e_max_len_sqr = e_len_sqr;
-      copy_vec_3d (e_max, e);
+    sub_vecs_3d(e, v3, v2);
+    e_len_sqr = dot_3d(e, e);
+    if (e_len_sqr > e_max_len_sqr) {
+	e_max_len_sqr = e_len_sqr;
+	copy_vec_3d(e_max, e);
     }
 
-  sub_vecs_3d (e, v0, v3);
-  e_len_sqr = dot_3d (e, e);
-  if (e_len_sqr > e_max_len_sqr)
-    {
-      e_max_len_sqr = e_len_sqr;
-      copy_vec_3d (e_max, e);
+    sub_vecs_3d(e, v0, v3);
+    e_len_sqr = dot_3d(e, e);
+    if (e_len_sqr > e_max_len_sqr) {
+	e_max_len_sqr = e_len_sqr;
+	copy_vec_3d(e_max, e);
     }
-  // flat if projection of edge on normal is small, else split on shortest diagonal
-  warp = dot_3d (e_max, n);
-  return
-    -MAX_WARP <= warp && warp <= MAX_WARP ? -1 :
-    dot_3d (d0, d0) < dot_3d (d1, d1) ? 0 : 1;
+    // flat if projection of edge on normal is small, else split on shortest diagonal
+    warp = dot_3d(e_max, n);
+    return
+	-MAX_WARP <= warp && warp <= MAX_WARP ? -1 :
+	dot_3d(d0, d0) < dot_3d(d1, d1) ? 0 : 1;
 }
 
 // add triangular or quadrilateral faces to object list depending on flatness
 static void
-make_faces (OBJECT ** r, OPTS * opts, TRANSFORM xf,
-	    POINT_3D v0, POINT_3D v1, POINT_3D v2, POINT_3D v3, int split_p)
+make_faces(OBJECT ** r, OPTS * opts, TRANSFORM xf,
+	   POINT_3D v0, POINT_3D v1, POINT_3D v2, POINT_3D v3, int split_p)
 {
-  POLYGON_OBJECT *new_polygon;
+    POLYGON_OBJECT *new_polygon;
 
-  if (!split_p)
-    goto no_split;
+    if (!split_p)
+	goto no_split;
 
-  switch (best_triangle_split (v0, v1, v2, v3))
-    {
+    switch (best_triangle_split(v0, v1, v2, v3)) {
     case -1:
-    no_split:
-      new_polygon = raw_polygon (opts);
-      setup_point_list_3d (new_polygon->pts, 4);
-      transform_pt_3d (new_polygon->pts->v[0], xf, v0);
-      transform_pt_3d (new_polygon->pts->v[1], xf, v1);
-      transform_pt_3d (new_polygon->pts->v[2], xf, v2);
-      transform_pt_3d (new_polygon->pts->v[3], xf, v3);
-      new_polygon->pts->n_pts = 4;
-      new_polygon->sibling = *r;
-      *r = (OBJECT *) new_polygon;
-      break;
+      no_split:
+	new_polygon = raw_polygon(opts);
+	setup_point_list_3d(new_polygon->pts, 4);
+	transform_pt_3d(new_polygon->pts->v[0], xf, v0);
+	transform_pt_3d(new_polygon->pts->v[1], xf, v1);
+	transform_pt_3d(new_polygon->pts->v[2], xf, v2);
+	transform_pt_3d(new_polygon->pts->v[3], xf, v3);
+	new_polygon->pts->n_pts = 4;
+	new_polygon->sibling = *r;
+	*r = (OBJECT *) new_polygon;
+	break;
 
     case 0:
-      new_polygon = raw_polygon (opts);
-      setup_point_list_3d (new_polygon->pts, 3);
-      transform_pt_3d (new_polygon->pts->v[0], xf, v0);
-      transform_pt_3d (new_polygon->pts->v[1], xf, v1);
-      transform_pt_3d (new_polygon->pts->v[2], xf, v2);
-      new_polygon->pts->n_pts = 3;
-      new_polygon->sibling = *r;
-      *r = (OBJECT *) new_polygon;
-      new_polygon = raw_polygon (opts);
-      setup_point_list_3d (new_polygon->pts, 3);
-      transform_pt_3d (new_polygon->pts->v[0], xf, v2);
-      transform_pt_3d (new_polygon->pts->v[1], xf, v3);
-      transform_pt_3d (new_polygon->pts->v[2], xf, v0);
-      new_polygon->pts->n_pts = 3;
-      new_polygon->sibling = *r;
-      *r = (OBJECT *) new_polygon;
-      break;
+	new_polygon = raw_polygon(opts);
+	setup_point_list_3d(new_polygon->pts, 3);
+	transform_pt_3d(new_polygon->pts->v[0], xf, v0);
+	transform_pt_3d(new_polygon->pts->v[1], xf, v1);
+	transform_pt_3d(new_polygon->pts->v[2], xf, v2);
+	new_polygon->pts->n_pts = 3;
+	new_polygon->sibling = *r;
+	*r = (OBJECT *) new_polygon;
+	new_polygon = raw_polygon(opts);
+	setup_point_list_3d(new_polygon->pts, 3);
+	transform_pt_3d(new_polygon->pts->v[0], xf, v2);
+	transform_pt_3d(new_polygon->pts->v[1], xf, v3);
+	transform_pt_3d(new_polygon->pts->v[2], xf, v0);
+	new_polygon->pts->n_pts = 3;
+	new_polygon->sibling = *r;
+	*r = (OBJECT *) new_polygon;
+	break;
 
     case 1:
-      new_polygon = raw_polygon (opts);
-      setup_point_list_3d (new_polygon->pts, 3);
-      transform_pt_3d (new_polygon->pts->v[0], xf, v1);
-      transform_pt_3d (new_polygon->pts->v[1], xf, v2);
-      transform_pt_3d (new_polygon->pts->v[2], xf, v3);
-      new_polygon->pts->n_pts = 3;
-      new_polygon->sibling = *r;
-      *r = (OBJECT *) new_polygon;
-      new_polygon = raw_polygon (opts);
-      setup_point_list_3d (new_polygon->pts, 3);
-      transform_pt_3d (new_polygon->pts->v[0], xf, v3);
-      transform_pt_3d (new_polygon->pts->v[1], xf, v0);
-      transform_pt_3d (new_polygon->pts->v[2], xf, v1);
-      new_polygon->pts->n_pts = 3;
-      new_polygon->sibling = *r;
-      *r = (OBJECT *) new_polygon;
-      break;
+	new_polygon = raw_polygon(opts);
+	setup_point_list_3d(new_polygon->pts, 3);
+	transform_pt_3d(new_polygon->pts->v[0], xf, v1);
+	transform_pt_3d(new_polygon->pts->v[1], xf, v2);
+	transform_pt_3d(new_polygon->pts->v[2], xf, v3);
+	new_polygon->pts->n_pts = 3;
+	new_polygon->sibling = *r;
+	*r = (OBJECT *) new_polygon;
+	new_polygon = raw_polygon(opts);
+	setup_point_list_3d(new_polygon->pts, 3);
+	transform_pt_3d(new_polygon->pts->v[0], xf, v3);
+	transform_pt_3d(new_polygon->pts->v[1], xf, v0);
+	transform_pt_3d(new_polygon->pts->v[2], xf, v1);
+	new_polygon->pts->n_pts = 3;
+	new_polygon->sibling = *r;
+	*r = (OBJECT *) new_polygon;
+	break;
     }
 }
 
-OBJECT *
-flat_sweep (OBJECT * obj, TRANSFORM xf)
+OBJECT *flat_sweep(OBJECT * obj, TRANSFORM xf)
 {
-  int i, j, jj, split_p;
-  POINT_LIST_3D *a, *b, *t;
-  OBJECT *swept, *r;
-  TRANSFORM sweep_xf;
-  POINT_LIST_3D pts_1[1], pts_2[1];
-  TRANSFORM_LIST sweep_accum[1];
+    int i, j, jj, split_p;
+    POINT_LIST_3D *a, *b, *t;
+    OBJECT *swept, *r;
+    TRANSFORM sweep_xf;
+    POINT_LIST_3D pts_1[1], pts_2[1];
+    TRANSFORM_LIST sweep_accum[1];
 
-  SWEEP_OBJECT *s = (SWEEP_OBJECT *) obj;
+    SWEEP_OBJECT *s = (SWEEP_OBJECT *) obj;
 
-  init_point_list_3d (pts_1);
-  init_point_list_3d (pts_2);
-  init_transform_list (sweep_accum);
+    init_point_list_3d(pts_1);
+    init_point_list_3d(pts_2);
+    init_transform_list(sweep_accum);
 
-  split_p = bool_opt_p (s->opts, "split", 1)
-    && bool_opt_p (global_env->opts, "split", 1);
+    split_p = bool_opt_p(s->opts, "split", 1)
+	&& bool_opt_p(global_env->opts, "split", 1);
 
-  r = NULL;
+    r = NULL;
 
 #define ADD_TO_OUTPUT(O)  do { \
   (O)->sibling = r; \
   r = (OBJECT*)(O); \
 } while (0)
 
-  // handle definitions first; a point becomes a single line or a polygon
-  if (s->swept->tag == O_POINT_DEF)
-    {
-      fill_transform_accum (sweep_accum, s->xforms);
-      for (swept = s->swept; swept; swept = swept->sibling)
-	{
-	  POINT_DEF *pd = (POINT_DEF *) swept;
-	  if (s->closed_p)
-	    {
-	      POLYGON_OBJECT *polygon = raw_polygon (s->opts);
-	      for (i = 0; i < s->n_slices; i++)
-		{
-		  compose_transform_accum (sweep_xf, sweep_accum, xf);
-		  transform_pt_3d (pushed_point_list_3d_v (polygon->pts),
-				   sweep_xf, pd->p);
-		  advance_transform_accum (sweep_accum, s->xforms);
+    // handle definitions first; a point becomes a single line or a polygon
+    if (s->swept->tag == O_POINT_DEF) {
+	fill_transform_accum(sweep_accum, s->xforms);
+	for (swept = s->swept; swept; swept = swept->sibling) {
+	    POINT_DEF *pd = (POINT_DEF *) swept;
+	    if (s->closed_p) {
+		POLYGON_OBJECT *polygon = raw_polygon(s->opts);
+		for (i = 0; i < s->n_slices; i++) {
+		    compose_transform_accum(sweep_xf, sweep_accum, xf);
+		    transform_pt_3d(pushed_point_list_3d_v(polygon->pts),
+				    sweep_xf, pd->p);
+		    advance_transform_accum(sweep_accum, s->xforms);
 		}
-	      ADD_TO_OUTPUT (polygon);
-	    }
-	  else
-	    {
-	      LINE_OBJECT *line = raw_line (s->opts);
-	      for (i = 0; i < s->n_slices + 1; i++)
-		{
-		  compose_transform_accum (sweep_xf, sweep_accum, xf);
-		  transform_pt_3d (pushed_point_list_3d_v (line->pts),
-				   sweep_xf, pd->p);
-		  advance_transform_accum (sweep_accum, s->xforms);
+		ADD_TO_OUTPUT(polygon);
+	    } else {
+		LINE_OBJECT *line = raw_line(s->opts);
+		for (i = 0; i < s->n_slices + 1; i++) {
+		    compose_transform_accum(sweep_xf, sweep_accum, xf);
+		    transform_pt_3d(pushed_point_list_3d_v(line->pts),
+				    sweep_xf, pd->p);
+		    advance_transform_accum(sweep_accum, s->xforms);
 		}
-	      ADD_TO_OUTPUT (line);
+		ADD_TO_OUTPUT(line);
 	    }
 	}
-    }
-  else
-    {
-
-      // it's drawable; recursively flatten swept object in its own coordinates
-      for (swept = flat_scene (s->swept, NULL); swept; swept = swept->sibling)
-	{
-
-	  // refill with identity for each swept object
-	  fill_transform_accum (sweep_accum, s->xforms);
-
-	  // now the different flavors of sweep depend on what's being swept and
-	  // the setting of the closure tag
-	  if (swept->tag == O_LINE)
-	    {
-	      // a line becomes a surface represented by a sequence of 4-sided polygons
-	      LINE_OBJECT *line = (LINE_OBJECT *) swept;
-
-	      // a is the trail buffer and b the lead
-	      a = pts_1;
-	      b = pts_2;
-	      copy_point_list_3d (a, line->pts);
-
-	      if (s->closed_p)
-		{
-		  POLYGON_OBJECT *e1 = raw_polygon (s->opts);
-		  POLYGON_OBJECT *e2 = raw_polygon (s->opts);
-		  OPTS *face_opts = line->opts ? line->opts : s->opts;
-
-		  // set up in advance; e1 is filled in forward, e2 in reverse
-		  setup_point_list_3d (e1->pts, s->n_slices);
-		  e1->pts->n_pts = s->n_slices;
-		  setup_point_list_3d (e2->pts, s->n_slices);
-		  e2->pts->n_pts = s->n_slices;
-		  for (i = 0; i < s->n_slices - 1; i++)
-		    {
-		      advance_transform_accum (sweep_accum, s->xforms);
-		      compose_transform_accum (sweep_xf, sweep_accum, 0);	// apply mv transform in make_faces
-		      transform_points (b, sweep_xf, line->pts);
-		      // copy first and last points for 'end caps'
-		      transform_pt_3d (e1->pts->v[i], xf, b->v[b->n_pts - 1]);
-		      transform_pt_3d (e2->pts->v[s->n_slices - 1 - i],
-				       xf, b->v[0]);
-		      for (jj = 0, j = 1; j < a->n_pts; jj = j++)
-			make_faces (&r, face_opts, xf, b->v[jj],
-				    b->v[j], a->v[j], a->v[jj], split_p);
-		      t = a;
-		      a = b;
-		      b = t;	// swap a and b for next pass
+    } else {
+
+	// it's drawable; recursively flatten swept object in its own coordinates
+	for (swept = flat_scene(s->swept, NULL); swept;
+	     swept = swept->sibling) {
+
+	    // refill with identity for each swept object
+	    fill_transform_accum(sweep_accum, s->xforms);
+
+	    // now the different flavors of sweep depend on what's being swept and
+	    // the setting of the closure tag
+	    if (swept->tag == O_LINE) {
+		// a line becomes a surface represented by a sequence of 4-sided polygons
+		LINE_OBJECT *line = (LINE_OBJECT *) swept;
+
+		// a is the trail buffer and b the lead
+		a = pts_1;
+		b = pts_2;
+		copy_point_list_3d(a, line->pts);
+
+		if (s->closed_p) {
+		    POLYGON_OBJECT *e1 = raw_polygon(s->opts);
+		    POLYGON_OBJECT *e2 = raw_polygon(s->opts);
+		    OPTS *face_opts = line->opts ? line->opts : s->opts;
+
+		    // set up in advance; e1 is filled in forward, e2 in reverse
+		    setup_point_list_3d(e1->pts, s->n_slices);
+		    e1->pts->n_pts = s->n_slices;
+		    setup_point_list_3d(e2->pts, s->n_slices);
+		    e2->pts->n_pts = s->n_slices;
+		    for (i = 0; i < s->n_slices - 1; i++) {
+			advance_transform_accum(sweep_accum, s->xforms);
+			compose_transform_accum(sweep_xf, sweep_accum, 0);	// apply mv transform in make_faces
+			transform_points(b, sweep_xf, line->pts);
+			// copy first and last points for 'end caps'
+			transform_pt_3d(e1->pts->v[i], xf,
+					b->v[b->n_pts - 1]);
+			transform_pt_3d(e2->pts->v[s->n_slices - 1 - i],
+					xf, b->v[0]);
+			for (jj = 0, j = 1; j < a->n_pts; jj = j++)
+			    make_faces(&r, face_opts, xf, b->v[jj],
+				       b->v[j], a->v[j], a->v[jj],
+				       split_p);
+			t = a;
+			a = b;
+			b = t;	// swap a and b for next pass
 		    }
-		  // closure: add last point of original line. first to ends, then as faces
-		  transform_pt_3d (e1->pts->v[i], xf,
-				   line->pts->v[line->pts->n_pts - 1]);
-		  transform_pt_3d (e2->pts->v[0], xf, line->pts->v[0]);
-		  for (jj = 0, j = 1; j < a->n_pts; jj = j++)
-		    make_faces (&r, face_opts, xf, line->pts->v[jj],
-				line->pts->v[j], a->v[j], a->v[jj], split_p);
-
-		  // add ends to output
-		  ADD_TO_OUTPUT (e1);
-		  ADD_TO_OUTPUT (e2);
-		}
-	      else
-		{
-		  for (i = 0; i < s->n_slices; i++)
-		    {
-		      advance_transform_accum (sweep_accum, s->xforms);
-		      compose_transform_accum (sweep_xf, sweep_accum, 0);
-		      transform_points (b, sweep_xf, line->pts);
-		      for (jj = 0, j = 1; j < a->n_pts; jj = j++)
-			make_faces (&r, s->opts, xf, b->v[jj], b->v[j],
-				    a->v[j], a->v[jj], split_p);
-		      t = a;
-		      a = b;
-		      b = t;	// swap a and b for next pass
+		    // closure: add last point of original line. first to ends, then as faces
+		    transform_pt_3d(e1->pts->v[i], xf,
+				    line->pts->v[line->pts->n_pts - 1]);
+		    transform_pt_3d(e2->pts->v[0], xf, line->pts->v[0]);
+		    for (jj = 0, j = 1; j < a->n_pts; jj = j++)
+			make_faces(&r, face_opts, xf, line->pts->v[jj],
+				   line->pts->v[j], a->v[j], a->v[jj],
+				   split_p);
+
+		    // add ends to output
+		    ADD_TO_OUTPUT(e1);
+		    ADD_TO_OUTPUT(e2);
+		} else {
+		    for (i = 0; i < s->n_slices; i++) {
+			advance_transform_accum(sweep_accum, s->xforms);
+			compose_transform_accum(sweep_xf, sweep_accum, 0);
+			transform_points(b, sweep_xf, line->pts);
+			for (jj = 0, j = 1; j < a->n_pts; jj = j++)
+			    make_faces(&r, s->opts, xf, b->v[jj], b->v[j],
+				       a->v[j], a->v[jj], split_p);
+			t = a;
+			a = b;
+			b = t;	// swap a and b for next pass
 		    }
 		}
-	    }
-	  else if (swept->tag == O_POLYGON)
-	    {
-	      // a polygon becomes a surface represented by a sequence of 4-sided polygons (with "end caps")
-	      POLYGON_OBJECT *new_polygon, *polygon =
-		(POLYGON_OBJECT *) swept;
-	      OPTS *end_opts = polygon->opts ? polygon->opts : s->opts;
-
-	      if (s->closed_p)
-		warn (no_line,
-		      "closure tag on polygon sweep ignored (sorry, no line number)");
-
-	      a = pts_1;
-	      b = pts_2;
-	      copy_point_list_3d (a, polygon->pts);
-
-	      // initial end cap
-	      new_polygon = raw_polygon (end_opts);
-	      transform_points (new_polygon->pts, xf, a);
-	      ADD_TO_OUTPUT (new_polygon);
-
-	      for (i = 0; i < s->n_slices; i++)
-		{
-		  advance_transform_accum (sweep_accum, s->xforms);
-		  compose_transform_accum (sweep_xf, sweep_accum, 0);
-		  transform_points (b, sweep_xf, polygon->pts);
-		  for (jj = a->n_pts - 1, j = 0; j < a->n_pts; jj = j++)
-		    make_faces (&r, s->opts, xf, b->v[jj], b->v[j],
-				a->v[j], a->v[jj], split_p);
-		  t = a;
-		  a = b;
-		  b = t;	// swap a and b for next pass
+	    } else if (swept->tag == O_POLYGON) {
+		// a polygon becomes a surface represented by a sequence of 4-sided polygons (with "end caps")
+		POLYGON_OBJECT *new_polygon, *polygon =
+		    (POLYGON_OBJECT *) swept;
+		OPTS *end_opts = polygon->opts ? polygon->opts : s->opts;
+
+		if (s->closed_p)
+		    warn(no_line,
+			 "closure tag on polygon sweep ignored (sorry, no line number)");
+
+		a = pts_1;
+		b = pts_2;
+		copy_point_list_3d(a, polygon->pts);
+
+		// initial end cap
+		new_polygon = raw_polygon(end_opts);
+		transform_points(new_polygon->pts, xf, a);
+		ADD_TO_OUTPUT(new_polygon);
+
+		for (i = 0; i < s->n_slices; i++) {
+		    advance_transform_accum(sweep_accum, s->xforms);
+		    compose_transform_accum(sweep_xf, sweep_accum, 0);
+		    transform_points(b, sweep_xf, polygon->pts);
+		    for (jj = a->n_pts - 1, j = 0; j < a->n_pts; jj = j++)
+			make_faces(&r, s->opts, xf, b->v[jj], b->v[j],
+				   a->v[j], a->v[jj], split_p);
+		    t = a;
+		    a = b;
+		    b = t;	// swap a and b for next pass
 		}
 
-	      // final end cap is copy of a (note reverse point order)
-	      new_polygon = raw_polygon (end_opts);
-	      reverse_copy_point_list_3d (new_polygon->pts, a);
-	      transform_points (new_polygon->pts, xf, new_polygon->pts);
-	      ADD_TO_OUTPUT (new_polygon);
-	    }
-	  else
-	    {
-	      warn (no_line,
-		    "cannot sweep a %s; object ignored (sorry, no line number)",
-		    object_type_str[swept->tag]);
+		// final end cap is copy of a (note reverse point order)
+		new_polygon = raw_polygon(end_opts);
+		reverse_copy_point_list_3d(new_polygon->pts, a);
+		transform_points(new_polygon->pts, xf, new_polygon->pts);
+		ADD_TO_OUTPUT(new_polygon);
+	    } else {
+		warn(no_line,
+		     "cannot sweep a %s; object ignored (sorry, no line number)",
+		     object_type_str[swept->tag]);
 	    }
 	}
     }
 
-  clear_point_list_3d (pts_1);
-  clear_point_list_3d (pts_2);
-  clear_transform_list (sweep_accum);
-  return r;
+    clear_point_list_3d(pts_1);
+    clear_point_list_3d(pts_2);
+    clear_transform_list(sweep_accum);
+    return r;
 #undef ADD_TO_OUTPUT
 }
 
 // forward declaration
-static OBJECT *rev_transformed_flat_scene (OBJECT * obj, TRANSFORM xf);
+static OBJECT *rev_transformed_flat_scene(OBJECT * obj, TRANSFORM xf);
 
-OBJECT *
-flat_repeat (OBJECT * obj, TRANSFORM xf)
+OBJECT *flat_repeat(OBJECT * obj, TRANSFORM xf)
 {
-  int i;
-  REPEAT_OBJECT *s = (REPEAT_OBJECT *) obj;
-  OBJECT *flat_repeated, *r;
-  TRANSFORM_LIST repeat_accum[1];
-  TRANSFORM child_xf;
+    int i;
+    REPEAT_OBJECT *s = (REPEAT_OBJECT *) obj;
+    OBJECT *flat_repeated, *r;
+    TRANSFORM_LIST repeat_accum[1];
+    TRANSFORM child_xf;
 
-  init_transform_list (repeat_accum);
+    init_transform_list(repeat_accum);
 
-  if (s->n <= 0)
-    return NULL;
+    if (s->n <= 0)
+	return NULL;
 
-  // recursively flatten repeated object in its own coordinates
-  flat_repeated = flat_scene (s->repeated, NULL);
+    // recursively flatten repeated object in its own coordinates
+    flat_repeated = flat_scene(s->repeated, NULL);
 
-  fill_transform_accum (repeat_accum, s->xforms);
-  r = NULL;
-  for (i = 0; i < s->n; i++)
-    {
-      compose_transform_accum (child_xf, repeat_accum, xf);
-      r = cat_objects (rev_transformed_flat_scene
-		       (flat_repeated, child_xf), r);
-      advance_transform_accum (repeat_accum, s->xforms);
+    fill_transform_accum(repeat_accum, s->xforms);
+    r = NULL;
+    for (i = 0; i < s->n; i++) {
+	compose_transform_accum(child_xf, repeat_accum, xf);
+	r = cat_objects(rev_transformed_flat_scene
+			(flat_repeated, child_xf), r);
+	advance_transform_accum(repeat_accum, s->xforms);
     }
-  // flat_repeated is a memory leak
-  return r;
+    // flat_repeated is a memory leak
+    return r;
 }
 
-OBJECT *
-flat_compound (OBJECT * obj, TRANSFORM xf)
+OBJECT *flat_compound(OBJECT * obj, TRANSFORM xf)
 {
-  COMPOUND_OBJECT *compound = (COMPOUND_OBJECT *) obj;
-  TRANSFORM child_xf;
-  compose (child_xf, xf, compound->xform);
-  return rev_transformed_flat_scene (compound->child, child_xf);
+    COMPOUND_OBJECT *compound = (COMPOUND_OBJECT *) obj;
+    TRANSFORM child_xf;
+    compose(child_xf, xf, compound->xform);
+    return rev_transformed_flat_scene(compound->child, child_xf);
 }
 
 typedef OBJECT *(*FLATTEN_FUNC) (OBJECT *, TRANSFORM);
 
 static FLATTEN_FUNC flatten_tbl[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  flat_dots,
-  flat_line,
-  flat_curve,
-  flat_polygon,
-  flat_special,
-  flat_sweep,
-  flat_repeat,
-  flat_compound,
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    flat_dots,
+    flat_line,
+    flat_curve,
+    flat_polygon,
+    flat_special,
+    flat_sweep,
+    flat_repeat,
+    flat_compound,
 };
 
-OBJECT *
-cat_objects (OBJECT * lft, OBJECT * rgt)
+OBJECT *cat_objects(OBJECT * lft, OBJECT * rgt)
 {
-  OBJECT *p;
+    OBJECT *p;
 
-  if (!lft)
-    return rgt;
-  for (p = lft; p->sibling; p = p->sibling)
-    /* skip */ ;
-  p->sibling = rgt;
-  return lft;
+    if (!lft)
+	return rgt;
+    for (p = lft; p->sibling; p = p->sibling)
+	/* skip */ ;
+    p->sibling = rgt;
+    return lft;
 }
 
-static OBJECT *
-rev_transformed_flat_scene (OBJECT * obj, TRANSFORM xf)
+static OBJECT *rev_transformed_flat_scene(OBJECT * obj, TRANSFORM xf)
 {
-  OBJECT *r = NULL;
-  while (obj)
-    {
-      // flatten the object
-      if (flatten_tbl[obj->tag] == NULL)
-	die (no_line, "rev_transformed_flat_scene: bad tag %d", obj->tag);
+    OBJECT *r = NULL;
+    while (obj) {
+	// flatten the object
+	if (flatten_tbl[obj->tag] == NULL)
+	    die(no_line, "rev_transformed_flat_scene: bad tag %d",
+		obj->tag);
 
-      // join scene sibling lists
-      r = cat_objects ((*flatten_tbl[obj->tag]) (obj, xf), r);
+	// join scene sibling lists
+	r = cat_objects((*flatten_tbl[obj->tag]) (obj, xf), r);
 
-      // on to next object
-      obj = obj->sibling;
+	// on to next object
+	obj = obj->sibling;
     }
-  return r;
+    return r;
 }
 
 // call with null env omits camera transformation
-OBJECT *
-flat_scene (OBJECT * obj, GLOBAL_ENV * env)
+OBJECT *flat_scene(OBJECT * obj, GLOBAL_ENV * env)
 {
-  FLOAT *camera = env
-    && global_env_is_set_p (env, GE_CAMERA) ? env->camera : identity;
-  return sibling_reverse (rev_transformed_flat_scene (obj, camera));
+    FLOAT *camera = env
+	&& global_env_is_set_p(env, GE_CAMERA) ? env->camera : identity;
+    return sibling_reverse(rev_transformed_flat_scene(obj, camera));
 }
 
 // ---- overlay/underlay/depth sort flag --------------------------------------
 
-static int
-dots_lay_val (OBJECT * obj)
+static int dots_lay_val(OBJECT * obj)
 {
-  return lay_val (((DOTS_OBJECT *) obj)->opts, LAY_IN);
+    return lay_val(((DOTS_OBJECT *) obj)->opts, LAY_IN);
 }
 
-static int
-line_lay_val (OBJECT * obj)
+static int line_lay_val(OBJECT * obj)
 {
-  return lay_val (((LINE_OBJECT *) obj)->opts, LAY_IN);
+    return lay_val(((LINE_OBJECT *) obj)->opts, LAY_IN);
 }
 
-static int
-curve_lay_val (OBJECT * obj)
+static int curve_lay_val(OBJECT * obj)
 {
-  return lay_val (((CURVE_OBJECT *) obj)->opts, LAY_IN);
+    return lay_val(((CURVE_OBJECT *) obj)->opts, LAY_IN);
 }
 
-static int
-polygon_lay_val (OBJECT * obj)
+static int polygon_lay_val(OBJECT * obj)
 {
-  return lay_val (((POLYGON_OBJECT *) obj)->opts, LAY_IN);
+    return lay_val(((POLYGON_OBJECT *) obj)->opts, LAY_IN);
 }
 
-static int
-special_lay_val (OBJECT * obj)
+static int special_lay_val(OBJECT * obj)
 {
-  return lay_val (((SPECIAL_OBJECT *) obj)->opts, LAY_OVER);
+    return lay_val(((SPECIAL_OBJECT *) obj)->opts, LAY_OVER);
 }
 
 typedef int (*LAY_VAL_FUNC) (OBJECT *);
 
 static LAY_VAL_FUNC lay_val_tbl[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  dots_lay_val,
-  line_lay_val,
-  curve_lay_val,
-  polygon_lay_val,
-  special_lay_val,
-  NULL,				// O_SWEEP (flattened)
-  NULL,				// O_REPEAT (flattened)
-  NULL,				// O_COMPOUND (flattened)
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    dots_lay_val,
+    line_lay_val,
+    curve_lay_val,
+    polygon_lay_val,
+    special_lay_val,
+    NULL,			// O_SWEEP (flattened)
+    NULL,			// O_REPEAT (flattened)
+    NULL,			// O_COMPOUND (flattened)
 };
 
-int
-object_lay_val (OBJECT * obj)
+int object_lay_val(OBJECT * obj)
 {
-  if (!lay_val_tbl[obj->tag])
-    die (no_line, "bad tag in object_lay_val");
-  return (*lay_val_tbl[obj->tag]) (obj);
+    if (!lay_val_tbl[obj->tag])
+	die(no_line, "bad tag in object_lay_val");
+    return (*lay_val_tbl[obj->tag]) (obj);
 }
 
 // ---- binary space partition ------------------------------------------------
 
-static void
-add_dots_object_to_bsp_pass_1 (OBJECT * obj, BSP_TREE * bsp)
+static void add_dots_object_to_bsp_pass_1(OBJECT * obj, BSP_TREE * bsp)
 {
 }
 
-static void
-add_line_object_to_bsp_pass_1 (OBJECT * obj, BSP_TREE * bsp)
+static void add_line_object_to_bsp_pass_1(OBJECT * obj, BSP_TREE * bsp)
 {
 }
 
-static void
-add_curve_object_to_bsp_pass_1 (OBJECT * obj, BSP_TREE * bsp)
+static void add_curve_object_to_bsp_pass_1(OBJECT * obj, BSP_TREE * bsp)
 {
 }
 
-static void
-add_polygon_object_to_bsp_pass_1 (OBJECT * obj, BSP_TREE * bsp)
+static void add_polygon_object_to_bsp_pass_1(OBJECT * obj, BSP_TREE * bsp)
 {
-  int i;
-  POLYGON_3D *polygon;
-  POLYGON_OBJECT *polygon_obj = (POLYGON_OBJECT *) obj;
-  PLANE plane[1];
+    int i;
+    POLYGON_3D *polygon;
+    POLYGON_OBJECT *polygon_obj = (POLYGON_OBJECT *) obj;
+    PLANE plane[1];
 
-  // copy point list to new polygon
-  polygon = new_polygon_3d (polygon_obj->pts->n_pts);
-  polygon->n_sides = polygon_obj->pts->n_pts;
-  for (i = 0; i < polygon->n_sides; i++)
-    copy_pt_3d (polygon->v[i], polygon_obj->pts->v[i]);
+    // copy point list to new polygon
+    polygon = new_polygon_3d(polygon_obj->pts->n_pts);
+    polygon->n_sides = polygon_obj->pts->n_pts;
+    for (i = 0; i < polygon->n_sides; i++)
+	copy_pt_3d(polygon->v[i], polygon_obj->pts->v[i]);
 
-  find_polygon_plane (plane, polygon);
+    find_polygon_plane(plane, polygon);
 
-  // backface elimination
-  // put the new polygon in the tree
-  if (plane->n[Z] >= -FLOAT_EPS ||
-      !bool_opt_p (polygon_obj->opts, "cull", 1) ||
-      !bool_opt_p (global_env->opts, "cull", 1))
-    {
+    // backface elimination
+    // put the new polygon in the tree
+    if (plane->n[Z] >= -FLOAT_EPS ||
+	!bool_opt_p(polygon_obj->opts, "cull", 1) ||
+	!bool_opt_p(global_env->opts, "cull", 1)) {
 
-      add_polygon_to_bsp (bsp, polygon, obj);
-    }
-  else
-    {
-      delete_polygon_3d (polygon);
+	add_polygon_to_bsp(bsp, polygon, obj);
+    } else {
+	delete_polygon_3d(polygon);
     }
 }
 
-static void
-add_special_object_to_bsp_pass_1 (OBJECT * obj, BSP_TREE * bsp)
+static void add_special_object_to_bsp_pass_1(OBJECT * obj, BSP_TREE * bsp)
 {
 }
 
 typedef void (*BSP_INSERT_FUNC) (OBJECT *, BSP_TREE *);
 
 static BSP_INSERT_FUNC insert_in_bsp_pass_1_tbl[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  add_dots_object_to_bsp_pass_1,
-  add_line_object_to_bsp_pass_1,
-  add_curve_object_to_bsp_pass_1,
-  add_polygon_object_to_bsp_pass_1,
-  add_special_object_to_bsp_pass_1,
-  NULL,				// O_SWEEP (flattened)
-  NULL,				// O_REPEAT (flattened)
-  NULL,				// O_COMPOUND (flattened)
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    add_dots_object_to_bsp_pass_1,
+    add_line_object_to_bsp_pass_1,
+    add_curve_object_to_bsp_pass_1,
+    add_polygon_object_to_bsp_pass_1,
+    add_special_object_to_bsp_pass_1,
+    NULL,			// O_SWEEP (flattened)
+    NULL,			// O_REPEAT (flattened)
+    NULL,			// O_COMPOUND (flattened)
 };
 
-static void
-add_dots_object_to_bsp_pass_2 (OBJECT * obj, BSP_TREE * bsp)
-{
-  int i;
-  DOTS_OBJECT *dots_obj = (DOTS_OBJECT *) obj;
-  // insert each dot as a polyline with only one vertex
-  for (i = 0; i < dots_obj->pts->n_pts; i++)
-    {
-      POLYLINE_3D *dot = new_polyline_3d (1);
-      dot->n_vertices = 1;
-      copy_pt_3d (dot->v[0], dots_obj->pts->v[i]);
-      add_polyline_to_bsp (bsp, dot, obj);
+static void add_dots_object_to_bsp_pass_2(OBJECT * obj, BSP_TREE * bsp)
+{
+    int i;
+    DOTS_OBJECT *dots_obj = (DOTS_OBJECT *) obj;
+    // insert each dot as a polyline with only one vertex
+    for (i = 0; i < dots_obj->pts->n_pts; i++) {
+	POLYLINE_3D *dot = new_polyline_3d(1);
+	dot->n_vertices = 1;
+	copy_pt_3d(dot->v[0], dots_obj->pts->v[i]);
+	add_polyline_to_bsp(bsp, dot, obj);
     }
 }
 
-static void
-add_line_object_to_bsp_pass_2 (OBJECT * obj, BSP_TREE * bsp)
+static void add_line_object_to_bsp_pass_2(OBJECT * obj, BSP_TREE * bsp)
 {
-  int i;
-  POLYLINE_3D *polyline;
-  LINE_OBJECT *line_obj = (LINE_OBJECT *) obj;
+    int i;
+    POLYLINE_3D *polyline;
+    LINE_OBJECT *line_obj = (LINE_OBJECT *) obj;
 
-  // copy point list to new polyline
-  polyline = new_polyline_3d (line_obj->pts->n_pts);
-  polyline->n_vertices = line_obj->pts->n_pts;
-  for (i = 0; i < line_obj->pts->n_pts; i++)
-    copy_pt_3d (polyline->v[i], line_obj->pts->v[i]);
+    // copy point list to new polyline
+    polyline = new_polyline_3d(line_obj->pts->n_pts);
+    polyline->n_vertices = line_obj->pts->n_pts;
+    for (i = 0; i < line_obj->pts->n_pts; i++)
+	copy_pt_3d(polyline->v[i], line_obj->pts->v[i]);
 
-  // fprintf(stderr, "adding to bsp [%p(%d)]\n", line_obj->opts, line_obj->opts->list->n_elts); // DEBUG
+    // fprintf(stderr, "adding to bsp [%p(%d)]\n", line_obj->opts, line_obj->opts->list->n_elts); // DEBUG
 
-  // put the new polyline in the tree
-  add_polyline_to_bsp (bsp, polyline, obj);
+    // put the new polyline in the tree
+    add_polyline_to_bsp(bsp, polyline, obj);
 }
 
-static void
-add_curve_object_to_bsp_pass_2 (OBJECT * obj, BSP_TREE * bsp)
+static void add_curve_object_to_bsp_pass_2(OBJECT * obj, BSP_TREE * bsp)
 {
 }
 
-static void
-add_polygon_object_to_bsp_pass_2 (OBJECT * obj, BSP_TREE * bsp)
+static void add_polygon_object_to_bsp_pass_2(OBJECT * obj, BSP_TREE * bsp)
 {
 }
 
-static void
-add_special_object_to_bsp_pass_2 (OBJECT * obj, BSP_TREE * bsp)
+static int special_first_point_index(SPECIAL_OBJECT * special)
+{
+    int i;
+    for (i = 0; i < special->args->n_args; i++)
+	if (special->args->arg[i].tag == SA_POINT)
+	    return i;
+    return -1;
+}
+
+// Really returninga location of a POINT_3D here
+static FLOAT *special_first_point(SPECIAL_OBJECT * special)
+{
+    int i = special_first_point_index(special);
+    return (i >= 0) ? special->args->arg[i].val.pt : origin_3d;
+}
+
+static void add_special_object_to_bsp_pass_2(OBJECT * obj, BSP_TREE * bsp)
 {
-  SPECIAL_OBJECT *special_obj = (SPECIAL_OBJECT *) obj;
-  POLYLINE_3D *special = new_polyline_3d (1);
-  special->n_vertices = 1;
-  copy_pt_3d (special->v[0], special_obj->pts->v[0]);
-  add_polyline_to_bsp (bsp, special, obj);
+    SPECIAL_OBJECT *special_obj = (SPECIAL_OBJECT *) obj;
+    POLYLINE_3D *special = new_polyline_3d(1);
+    special->n_vertices = 1;
+    // Find the first point.
+    copy_pt_3d(special->v[0], special_first_point(special_obj));
+    add_polyline_to_bsp(bsp, special, obj);
 }
 
 static BSP_INSERT_FUNC insert_in_bsp_pass_2_tbl[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF  
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  add_dots_object_to_bsp_pass_2,
-  add_line_object_to_bsp_pass_2,
-  add_curve_object_to_bsp_pass_2,
-  add_polygon_object_to_bsp_pass_2,
-  add_special_object_to_bsp_pass_2,
-  NULL,				// O_SWEEP (flattened)
-  NULL,				// O_REPEAT (flattened)
-  NULL,				// O_COMPOUND (flattened)
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF  
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    add_dots_object_to_bsp_pass_2,
+    add_line_object_to_bsp_pass_2,
+    add_curve_object_to_bsp_pass_2,
+    add_polygon_object_to_bsp_pass_2,
+    add_special_object_to_bsp_pass_2,
+    NULL,			// O_SWEEP (flattened)
+    NULL,			// O_REPEAT (flattened)
+    NULL,			// O_COMPOUND (flattened)
 };
 
 // table functions are called in 
 // OBJECT *hsr_scene_with_bsp(OBJECT *scene);
 
 static void
-get_dots_from_polyline (OBJECT * src, OBJECT ** output,
-			BSP_POLYLINE_NODE * polyline_node)
+get_dots_from_polyline(OBJECT * src, OBJECT ** output,
+		       BSP_POLYLINE_NODE * polyline_node)
 {
-  DOTS_OBJECT *dots_src = (DOTS_OBJECT *) src;
-  DOTS_OBJECT *new_obj = raw_dots (dots_src->opts);
-  copy_point_list_3d (new_obj->pts,
-		      (POINT_LIST_3D *) polyline_node->polyline);
-  new_obj->sibling = *output;
-  *output = (OBJECT *) new_obj;
+    DOTS_OBJECT *dots_src = (DOTS_OBJECT *) src;
+    DOTS_OBJECT *new_obj = raw_dots(dots_src->opts);
+    copy_point_list_3d(new_obj->pts,
+		       (POINT_LIST_3D *) polyline_node->polyline);
+    new_obj->sibling = *output;
+    *output = (OBJECT *) new_obj;
 }
 
 static void
-get_line_from_polyline (OBJECT * src, OBJECT ** output,
-			BSP_POLYLINE_NODE * polyline_node)
+get_line_from_polyline(OBJECT * src, OBJECT ** output,
+		       BSP_POLYLINE_NODE * polyline_node)
 {
-  LINE_OBJECT *line_src = (LINE_OBJECT *) src;
-  LINE_OBJECT *new_obj = raw_line (copy_line_opts (line_src->opts,
+    LINE_OBJECT *line_src = (LINE_OBJECT *) src;
+    LINE_OBJECT *new_obj = raw_line(copy_line_opts(line_src->opts,
 						   polyline_node->first_p,
 						   polyline_node->last_p,
-						   global_env->
-						   output_language));
-  copy_point_list_3d (new_obj->pts,
-		      (POINT_LIST_3D *) polyline_node->polyline);
-  new_obj->sibling = *output;
-  *output = (OBJECT *) new_obj;
+						   global_env->output_language));
+    copy_point_list_3d(new_obj->pts,
+		       (POINT_LIST_3D *) polyline_node->polyline);
+    new_obj->sibling = *output;
+    *output = (OBJECT *) new_obj;
 }
 
 static void
-get_curve_from_polyline (OBJECT * src, OBJECT ** output,
-			 BSP_POLYLINE_NODE * polyline_node)
+get_curve_from_polyline(OBJECT * src, OBJECT ** output,
+			BSP_POLYLINE_NODE * polyline_node)
 {
 }
 
 static void
-get_polygon_border_from_polyline (OBJECT * src,
-				  OBJECT ** output,
-				  BSP_POLYLINE_NODE * polyline_node)
+get_polygon_border_from_polyline(OBJECT * src,
+				 OBJECT ** output,
+				 BSP_POLYLINE_NODE * polyline_node)
 {
-  // no longer used
-  POLYGON_OBJECT *polygon_src = (POLYGON_OBJECT *) src;
-  LINE_OBJECT *new_obj = raw_line (copy_opts (polygon_src->opts, OPT_LINE,
-					      global_env->output_language));
-  copy_point_list_3d (new_obj->pts,
-		      (POINT_LIST_3D *) polyline_node->polyline);
-  new_obj->sibling = *output;
-  *output = (OBJECT *) new_obj;
+    // no longer used
+    POLYGON_OBJECT *polygon_src = (POLYGON_OBJECT *) src;
+    LINE_OBJECT *new_obj = raw_line(copy_opts(polygon_src->opts, OPT_LINE,
+					      global_env->
+					      output_language));
+    copy_point_list_3d(new_obj->pts,
+		       (POINT_LIST_3D *) polyline_node->polyline);
+    new_obj->sibling = *output;
+    *output = (OBJECT *) new_obj;
 }
 
 static void
-get_special_from_polyline (OBJECT * src, OBJECT ** output,
-			   BSP_POLYLINE_NODE * polyline_node)
+get_special_from_polyline(OBJECT * src, OBJECT ** output,
+			  BSP_POLYLINE_NODE * polyline_node)
 {
-  SPECIAL_OBJECT *special_src = (SPECIAL_OBJECT *) src;
-  SPECIAL_OBJECT *new_obj =
-    raw_special (copy_opts (special_src->opts, OPT_INTERNAL,
-			    global_env->output_language));
-  copy_point_list_3d (new_obj->pts, special_src->pts);	// go back to original special since we didn't split
-  new_obj->code = safe_strdup (special_src->code);
-  new_obj->sibling = *output;
-  *output = (OBJECT *) new_obj;
+    SPECIAL_OBJECT *special_src = (SPECIAL_OBJECT *) src;
+    SPECIAL_OBJECT *new_obj =
+	raw_special(copy_opts(special_src->opts, OPT_INTERNAL,
+			      global_env->output_language));
+    // go back to original special since we didn't split
+    copy_special_arg_list(new_obj->args, special_src->args);
+    new_obj->code = safe_strdup(special_src->code);
+    new_obj->sibling = *output;
+    *output = (OBJECT *) new_obj;
 }
 
 typedef void (*GET_OBJ_FROM_POLYLINE_FUNC) (OBJECT * src, OBJECT ** output,
@@ -1254,429 +1277,389 @@ typedef void (*GET_OBJ_FROM_POLYLINE_FUNC) (OBJECT * src, OBJECT ** output,
 					    polyline_node);
 
 static GET_OBJ_FROM_POLYLINE_FUNC get_obj_from_polyline_tbl[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF  
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  get_dots_from_polyline,
-  get_line_from_polyline,
-  get_curve_from_polyline,
-  get_polygon_border_from_polyline,
-  get_special_from_polyline,
-  NULL,				// O_SWEEP (flattened)
-  NULL,				// O_REPEAT (flattened)
-  NULL,				// O_COMPOUND (flattened)
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF  
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    get_dots_from_polyline,
+    get_line_from_polyline,
+    get_curve_from_polyline,
+    get_polygon_border_from_polyline,
+    get_special_from_polyline,
+    NULL,			// O_SWEEP (flattened)
+    NULL,			// O_REPEAT (flattened)
+    NULL,			// O_COMPOUND (flattened)
 };
 
-void
-get_objects_from_bsp_node (BSP_NODE * bsp, void *env)
+void get_objects_from_bsp_node(BSP_NODE * bsp, void *env)
 {
-  int i, j, k, broken_border_p;
-  OBJECT **output = (OBJECT **) env;
+    int i, j, k, broken_border_p;
+    OBJECT **output = (OBJECT **) env;
 
-  if (bsp == NULL)
-    return;
+    if (bsp == NULL)
+	return;
 
-  if (bsp->tag == BSP_POLYGON)
-    {
-      OPTS *opts;
-      LINE_OBJECT *new_line_obj = NULL;
-      BSP_POLYGON_NODE *polygon_node = (BSP_POLYGON_NODE *) bsp;
-      POLYGON_OBJECT *src = bsp->attr, *new_polygon_obj;
+    if (bsp->tag == BSP_POLYGON) {
+	OPTS *opts;
+	LINE_OBJECT *new_line_obj = NULL;
+	BSP_POLYGON_NODE *polygon_node = (BSP_POLYGON_NODE *) bsp;
+	POLYGON_OBJECT *src = bsp->attr, *new_polygon_obj;
 
-      broken_border_p = 0;
-      for (i = 0; i < polygon_node->polygon->n_sides; i++)
-	{
-	  if (!polygon_node->polygon_attr->elt[i].border_p)
-	    {
-	      broken_border_p = 1;
-	      break;
+	broken_border_p = 0;
+	for (i = 0; i < polygon_node->polygon->n_sides; i++) {
+	    if (!polygon_node->polygon_attr->elt[i].border_p) {
+		broken_border_p = 1;
+		break;
 	    }
 	}
-      if (broken_border_p)
-	{
-
-	  //  add these options if user didn't specify them
-	  opts =
-	    copy_opts (src->opts, OPT_POLYGON, global_env->output_language);
-	  add_no_edges_default_opt (&opts, global_env->output_language);
-	  add_solid_white_default_opt (&opts, global_env->output_language);
-
-	  new_polygon_obj = raw_polygon (opts);
-	  copy_point_list_3d (new_polygon_obj->pts,
-			      (POINT_LIST_3D *) polygon_node->polygon);
-	  new_polygon_obj->sibling = *output;
-	  *output = (OBJECT *) new_polygon_obj;
-
-	  // create the border from edges that did not result from splitting
-	  //
-	  // find a break in the border if there is one
-	  for (j = polygon_node->polygon->n_sides - 1, i = 0;
-	       i < polygon_node->polygon->n_sides; j = i++)
-	    {
-	      if (!polygon_node->polygon_attr->elt[j].border_p)
-		break;
+	if (broken_border_p) {
+
+	    //  add these options if user didn't specify them
+	    opts =
+		copy_opts(src->opts, OPT_POLYGON,
+			  global_env->output_language);
+	    add_no_edges_default_opt(&opts, global_env->output_language);
+	    add_solid_white_default_opt(&opts,
+					global_env->output_language);
+
+	    new_polygon_obj = raw_polygon(opts);
+	    copy_point_list_3d(new_polygon_obj->pts,
+			       (POINT_LIST_3D *) polygon_node->polygon);
+	    new_polygon_obj->sibling = *output;
+	    *output = (OBJECT *) new_polygon_obj;
+
+	    // create the border from edges that did not result from splitting
+	    //
+	    // find a break in the border if there is one
+	    for (j = polygon_node->polygon->n_sides - 1, i = 0;
+		 i < polygon_node->polygon->n_sides; j = i++) {
+		if (!polygon_node->polygon_attr->elt[j].border_p)
+		    break;
 	    }
-	  if (i == polygon_node->polygon->n_sides)
-	    i = 0;
-	  // j->i now isn't inside a border edge section, which is what we want
-	  for (k = 0;
-	       k < polygon_node->polygon->n_sides;
-	       j = i, i = (i + 1) % polygon_node->polygon->n_sides, k++)
+	    if (i == polygon_node->polygon->n_sides)
+		i = 0;
+	    // j->i now isn't inside a border edge section, which is what we want
+	    for (k = 0;
+		 k < polygon_node->polygon->n_sides;
+		 j = i, i = (i + 1) % polygon_node->polygon->n_sides, k++)
 	    {
-	      if (polygon_node->polygon_attr->elt[j].border_p)
-		{
-		  if (new_line_obj == NULL)
-		    {
-		      opts =
-			copy_opts (src->opts, OPT_LINE,
-				   global_env->output_language);
-		      new_line_obj = raw_line (opts);
-		      copy_pt_3d (pushed_point_list_3d_v
-				  (new_line_obj->pts),
-				  polygon_node->polygon->v[j]);
+		if (polygon_node->polygon_attr->elt[j].border_p) {
+		    if (new_line_obj == NULL) {
+			opts =
+			    copy_opts(src->opts, OPT_LINE,
+				      global_env->output_language);
+			new_line_obj = raw_line(opts);
+			copy_pt_3d(pushed_point_list_3d_v
+				   (new_line_obj->pts),
+				   polygon_node->polygon->v[j]);
 		    }
-		  copy_pt_3d (pushed_point_list_3d_v (new_line_obj->pts),
-			      polygon_node->polygon->v[i]);
-		}
-	      else if (new_line_obj)
-		{
-		  new_line_obj->sibling = *output;
-		  *output = (OBJECT *) new_line_obj;
-		  new_line_obj = NULL;
+		    copy_pt_3d(pushed_point_list_3d_v(new_line_obj->pts),
+			       polygon_node->polygon->v[i]);
+		} else if (new_line_obj) {
+		    new_line_obj->sibling = *output;
+		    *output = (OBJECT *) new_line_obj;
+		    new_line_obj = NULL;
 		}
 	    }
-	  if (new_line_obj)
-	    {
-	      new_line_obj->sibling = *output;
-	      *output = (OBJECT *) new_line_obj;
-	      new_line_obj = NULL;
+	    if (new_line_obj) {
+		new_line_obj->sibling = *output;
+		*output = (OBJECT *) new_line_obj;
+		new_line_obj = NULL;
 	    }
+	} else {
+	    opts =
+		copy_opts(src->opts, OPT_POLYGON | OPT_LINE,
+			  global_env->output_language);
+	    add_solid_white_default_opt(&opts,
+					global_env->output_language);
+
+	    new_polygon_obj = raw_polygon(opts);
+	    new_polygon_obj->border_p = 1;
+	    copy_point_list_3d(new_polygon_obj->pts,
+			       (POINT_LIST_3D *) polygon_node->polygon);
+	    new_polygon_obj->sibling = *output;
+	    *output = (OBJECT *) new_polygon_obj;
 	}
-      else
-	{
-	  opts =
-	    copy_opts (src->opts, OPT_POLYGON | OPT_LINE,
-		       global_env->output_language);
-	  add_solid_white_default_opt (&opts, global_env->output_language);
-
-	  new_polygon_obj = raw_polygon (opts);
-	  new_polygon_obj->border_p = 1;
-	  copy_point_list_3d (new_polygon_obj->pts,
-			      (POINT_LIST_3D *) polygon_node->polygon);
-	  new_polygon_obj->sibling = *output;
-	  *output = (OBJECT *) new_polygon_obj;
-	}
-    }
-  else
-    {				// BSP_POLYLINE
-      OBJECT *src = bsp->attr;
-      (*get_obj_from_polyline_tbl[src->tag]) (src, output,
-					      (BSP_POLYLINE_NODE *) bsp);
+    } else {			// BSP_POLYLINE
+	OBJECT *src = bsp->attr;
+	(*get_obj_from_polyline_tbl[src->tag]) (src, output,
+						(BSP_POLYLINE_NODE *) bsp);
     }
 }
 
-static void
-add_default_fill_opts(POLYGON_OBJECT *src)
+static void add_default_fill_opts(POLYGON_OBJECT * src)
 {
-  OPTS *opts = 
-    copy_opts (src->opts, OPT_POLYGON | OPT_LINE,
-	       global_env->output_language);
-  add_solid_white_default_opt (&opts, global_env->output_language);
-  src->opts = opts;
+    OPTS *opts = copy_opts(src->opts, OPT_POLYGON | OPT_LINE,
+			   global_env->output_language);
+    add_solid_white_default_opt(&opts, global_env->output_language);
+    src->opts = opts;
 }
 
-static void 
-add_default_fill_opts_to_polygons(OBJECT *src)
+static void add_default_fill_opts_to_polygons(OBJECT * src)
 {
-  OBJECT *obj;
+    OBJECT *obj;
 
-  for (obj = src; obj; obj = obj->sibling)
-    if (obj->tag == O_POLYGON)
-      add_default_fill_opts((POLYGON_OBJECT*) obj);
+    for (obj = src; obj; obj = obj->sibling)
+	if (obj->tag == O_POLYGON)
+	    add_default_fill_opts((POLYGON_OBJECT *) obj);
 }
 
-OBJECT *
-hsr_scene_with_bsp (OBJECT * scene)
+OBJECT *hsr_scene_with_bsp(OBJECT * scene)
 {
-  OBJECT *p, *t, *underlay, *overlay, *sorted;
-  BSP_TREE bsp;
+    OBJECT *p, *t, *underlay, *overlay, *sorted;
+    BSP_TREE bsp;
 
-  // two passes are needed to serve the bsp requirement
-  // that polylines be inserted after all polygons are
-  // already there
-  // also take care of underlays and ovelays in the first pass
-  bsp = NULL;
-  underlay = overlay = sorted = NULL;
-  for (p = scene; p; p = p->sibling)
-    {
-      switch (object_lay_val (p))
-	{
+    // two passes are needed to serve the bsp requirement
+    // that polylines be inserted after all polygons are
+    // already there
+    // also take care of underlays and ovelays in the first pass
+    bsp = NULL;
+    underlay = overlay = sorted = NULL;
+    for (p = scene; p; p = p->sibling) {
+	switch (object_lay_val(p)) {
 	case LAY_UNDER:
-	  t = copy_drawable_without_siblings (p);
-	  t->sibling = underlay;
-	  underlay = t;
-	  break;
+	    t = copy_drawable_without_siblings(p);
+	    t->sibling = underlay;
+	    underlay = t;
+	    break;
 	case LAY_IN:
-	  (*insert_in_bsp_pass_1_tbl[p->tag]) (p, &bsp);
-	  break;
+	    (*insert_in_bsp_pass_1_tbl[p->tag]) (p, &bsp);
+	    break;
 	case LAY_OVER:
-	  t = copy_drawable_without_siblings (p);
-	  t->sibling = overlay;
-	  overlay = t;
-	  break;
+	    t = copy_drawable_without_siblings(p);
+	    t->sibling = overlay;
+	    overlay = t;
+	    break;
 	default:
-	  die (no_line, "bad lay value in hsr_scene_with_bsp");
-	  break;
+	    die(no_line, "bad lay value in hsr_scene_with_bsp");
+	    break;
 	}
     }
-  for (p = scene; p; p = p->sibling)
-    if (object_lay_val (p) == LAY_IN)
-      (*insert_in_bsp_pass_2_tbl[p->tag]) (p, &bsp);
-  traverse_bsp (bsp, get_objects_from_bsp_node, &sorted);
-  // Overlay and underlay polygons still need fill options added.
-  add_default_fill_opts_to_polygons(overlay);
-  add_default_fill_opts_to_polygons(underlay);
-  // All three sublists are now in reverse order, so cat overlay then underlay
-  sorted = cat_objects (overlay, sorted);
-  sorted = cat_objects (sorted, underlay);
-  // Final reverse makes everything right.
-  sorted = sibling_reverse (sorted);
-  return sorted;
+    for (p = scene; p; p = p->sibling)
+	if (object_lay_val(p) == LAY_IN)
+	    (*insert_in_bsp_pass_2_tbl[p->tag]) (p, &bsp);
+    traverse_bsp(bsp, get_objects_from_bsp_node, &sorted);
+    // Overlay and underlay polygons still need fill options added.
+    add_default_fill_opts_to_polygons(overlay);
+    add_default_fill_opts_to_polygons(underlay);
+    // All three sublists are now in reverse order, so cat overlay then underlay
+    sorted = cat_objects(overlay, sorted);
+    sorted = cat_objects(sorted, underlay);
+    // Final reverse makes everything right.
+    sorted = sibling_reverse(sorted);
+    return sorted;
 }
 
 // ---- depth sort ------------------------------------------------------------
 
-static void
-add_dots_object_to_sort (OBJECT * obj, BSP_TREE * bsp)
+static void add_dots_object_to_sort(OBJECT * obj, BSP_TREE * bsp)
 {
-  int i;
-  DOTS_OBJECT *dots_obj = (DOTS_OBJECT *) obj;
-  POLYLINE_3D dot[1];
+    int i;
+    DOTS_OBJECT *dots_obj = (DOTS_OBJECT *) obj;
+    POLYLINE_3D dot[1];
 
-  init_polyline_3d (dot);
-  setup_polyline_3d (dot, 1);
-  dot->n_vertices = 1;
+    init_polyline_3d(dot);
+    setup_polyline_3d(dot, 1);
+    dot->n_vertices = 1;
 
-  // insert each dot as a polyline with only one vertex
-  for (i = 0; i < dots_obj->pts->n_pts; i++)
-    {
-      copy_pt_3d (dot->v[0], dots_obj->pts->v[i]);
-      add_polyline_to_sort (bsp, dot, obj);
+    // insert each dot as a polyline with only one vertex
+    for (i = 0; i < dots_obj->pts->n_pts; i++) {
+	copy_pt_3d(dot->v[0], dots_obj->pts->v[i]);
+	add_polyline_to_sort(bsp, dot, obj);
     }
-  clear_polyline_3d (dot);
+    clear_polyline_3d(dot);
 }
 
-static void
-add_line_object_to_sort (OBJECT * obj, BSP_TREE * bsp)
+static void add_line_object_to_sort(OBJECT * obj, BSP_TREE * bsp)
 {
-  LINE_OBJECT *line_obj = (LINE_OBJECT *) obj;
-  // DANGER: assumes point list in polyline object is congruent to a geometry.h polyline
-  add_polyline_to_sort (bsp, (POLYLINE_3D *) line_obj->pts, obj);
+    LINE_OBJECT *line_obj = (LINE_OBJECT *) obj;
+    // DANGER: assumes point list in polyline object is congruent to a geometry.h polyline
+    add_polyline_to_sort(bsp, (POLYLINE_3D *) line_obj->pts, obj);
 }
 
-static void
-add_curve_object_to_sort (OBJECT * obj, BSP_TREE * bsp)
+static void add_curve_object_to_sort(OBJECT * obj, BSP_TREE * bsp)
 {
 }
 
-static void
-add_polygon_object_to_sort (OBJECT * obj, BSP_TREE * bsp)
+static void add_polygon_object_to_sort(OBJECT * obj, BSP_TREE * bsp)
 {
-  POLYGON_OBJECT *polygon_obj = (POLYGON_OBJECT *) obj;
-  PLANE plane[1];
+    POLYGON_OBJECT *polygon_obj = (POLYGON_OBJECT *) obj;
+    PLANE plane[1];
 
-  // backface elimination
-  // put the new polygon in the tree
-  find_polygon_plane (plane, (POLYGON_3D *) polygon_obj->pts);
-  if (plane->n[Z] >= -FLOAT_EPS ||
-      !bool_opt_p (polygon_obj->opts, "cull", 1) ||
-      !bool_opt_p (global_env->opts, "cull", 1))
-    add_polygon_to_sort (bsp, (POLYGON_3D *) polygon_obj->pts, obj);
+    // backface elimination
+    // put the new polygon in the tree
+    find_polygon_plane(plane, (POLYGON_3D *) polygon_obj->pts);
+    if (plane->n[Z] >= -FLOAT_EPS ||
+	!bool_opt_p(polygon_obj->opts, "cull", 1) ||
+	!bool_opt_p(global_env->opts, "cull", 1))
+	add_polygon_to_sort(bsp, (POLYGON_3D *) polygon_obj->pts, obj);
 }
 
-static void
-add_special_object_to_sort (OBJECT * obj, BSP_TREE * bsp)
+static void add_special_object_to_sort(OBJECT * obj, BSP_TREE * bsp)
 {
-  SPECIAL_OBJECT *special_obj = (SPECIAL_OBJECT *) obj;
-  POLYLINE_3D *special = new_polyline_3d (1);
-  special->n_vertices = 1;
-  copy_pt_3d (special->v[0], special_obj->pts->v[0]);
-  add_polyline_to_sort (bsp, special, obj);
+    SPECIAL_OBJECT *special_obj = (SPECIAL_OBJECT *) obj;
+    POLYLINE_3D *special = new_polyline_3d(1);
+    special->n_vertices = 1;
+    copy_pt_3d(special->v[0], special_first_point(special_obj));
+    add_polyline_to_sort(bsp, special, obj);
 }
 
 typedef void (*ADD_TO_DS_FUNC) (OBJECT *, BSP_TREE *);
 
 static ADD_TO_DS_FUNC add_to_sort_tbl[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  add_dots_object_to_sort,
-  add_line_object_to_sort,
-  add_curve_object_to_sort,
-  add_polygon_object_to_sort,
-  add_special_object_to_sort,
-  NULL,				// O_SWEEP (flattened)
-  NULL,				// O_REPEAT (flattened)
-  NULL,				// O_COMPOUND (flattened)
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    add_dots_object_to_sort,
+    add_line_object_to_sort,
+    add_curve_object_to_sort,
+    add_polygon_object_to_sort,
+    add_special_object_to_sort,
+    NULL,			// O_SWEEP (flattened)
+    NULL,			// O_REPEAT (flattened)
+    NULL,			// O_COMPOUND (flattened)
 };
 
-OBJECT *
-hsr_scene_with_depth_sort (OBJECT * scene)
-{
-  OBJECT *p, *t, *underlay, *overlay, *sorted;
-  BSP_TREE bsp;
-
-  // two passes are needed to serve the bsp requirement
-  // that polylines be inserted after all polygons are
-  // already there
-  // also take care of underlays and ovelays in the first pass
-  bsp = NULL;
-  underlay = overlay = sorted = NULL;
-  for (p = scene; p; p = p->sibling)
-    {
-      switch (object_lay_val (p))
-	{
+OBJECT *hsr_scene_with_depth_sort(OBJECT * scene)
+{
+    OBJECT *p, *t, *underlay, *overlay, *sorted;
+    BSP_TREE bsp;
+
+    // two passes are needed to serve the bsp requirement
+    // that polylines be inserted after all polygons are
+    // already there
+    // also take care of underlays and ovelays in the first pass
+    bsp = NULL;
+    underlay = overlay = sorted = NULL;
+    for (p = scene; p; p = p->sibling) {
+	switch (object_lay_val(p)) {
 	case LAY_UNDER:
-	  t = copy_drawable_without_siblings (p);
-	  t->sibling = underlay;
-	  underlay = t;
-	  break;
+	    t = copy_drawable_without_siblings(p);
+	    t->sibling = underlay;
+	    underlay = t;
+	    break;
 	case LAY_IN:
-	  (*add_to_sort_tbl[p->tag]) (p, &bsp);
-	  break;
+	    (*add_to_sort_tbl[p->tag]) (p, &bsp);
+	    break;
 	case LAY_OVER:
-	  t = copy_drawable_without_siblings (p);
-	  t->sibling = overlay;
-	  overlay = t;
-	  break;
+	    t = copy_drawable_without_siblings(p);
+	    t->sibling = overlay;
+	    overlay = t;
+	    break;
 	default:
-	  die (no_line, "bad lay value in hsr_scene_with_depth_sort");
-	  break;
+	    die(no_line, "bad lay value in hsr_scene_with_depth_sort");
+	    break;
 	}
     }
-  sort_by_depth (&bsp);
-  traverse_depth_sort (bsp, get_objects_from_bsp_node, &sorted);
-  // Overlay and underlay polygons still need fill options added.
-  add_default_fill_opts_to_polygons(overlay);
-  add_default_fill_opts_to_polygons(underlay);
-  // all three sublists are now in reverse order, so cat overlay to start
-  sorted = cat_objects (overlay, sorted);
-  sorted = cat_objects (sorted, underlay);
-  // final reverse makes everything good.
-  sorted = sibling_reverse (sorted);
-  return sorted;
+    sort_by_depth(&bsp);
+    traverse_depth_sort(bsp, get_objects_from_bsp_node, &sorted);
+    // Overlay and underlay polygons still need fill options added.
+    add_default_fill_opts_to_polygons(overlay);
+    add_default_fill_opts_to_polygons(underlay);
+    // all three sublists are now in reverse order, so cat overlay to start
+    sorted = cat_objects(overlay, sorted);
+    sorted = cat_objects(sorted, underlay);
+    // final reverse makes everything good.
+    sorted = sibling_reverse(sorted);
+    return sorted;
 }
 
 // ---- extent finding --------------------------------------------------------
 
-static void
-get_extent_of_points (POINT_LIST_3D * pts, BOX_3D * e)
+static void get_extent_of_points(POINT_LIST_3D * pts, BOX_3D * e)
 {
-  int i;
+    int i;
 
-  for (i = 0; i < pts->n_pts; i++)
-    fold_min_max_pt_3d (e, pts->v[i]);
+    for (i = 0; i < pts->n_pts; i++)
+	fold_min_max_pt_3d(e, pts->v[i]);
 }
 
-static void
-get_extent_of_dots (OBJECT * obj, BOX_3D * e)
+static void get_extent_of_dots(OBJECT * obj, BOX_3D * e)
 {
-  DOTS_OBJECT *dots = (DOTS_OBJECT *) obj;
-  get_extent_of_points (dots->pts, e);
+    DOTS_OBJECT *dots = (DOTS_OBJECT *) obj;
+    get_extent_of_points(dots->pts, e);
 }
 
-static void
-get_extent_of_line (OBJECT * obj, BOX_3D * e)
+static void get_extent_of_line(OBJECT * obj, BOX_3D * e)
 {
-  LINE_OBJECT *line = (LINE_OBJECT *) obj;
-  get_extent_of_points (line->pts, e);
+    LINE_OBJECT *line = (LINE_OBJECT *) obj;
+    get_extent_of_points(line->pts, e);
 }
 
-static void
-get_extent_of_curve (OBJECT * obj, BOX_3D * e)
+static void get_extent_of_curve(OBJECT * obj, BOX_3D * e)
 {
-  CURVE_OBJECT *curve = (CURVE_OBJECT *) obj;
-  get_extent_of_points (curve->pts, e);
+    CURVE_OBJECT *curve = (CURVE_OBJECT *) obj;
+    get_extent_of_points(curve->pts, e);
 }
 
-static void
-get_extent_of_polygon (OBJECT * obj, BOX_3D * e)
+static void get_extent_of_polygon(OBJECT * obj, BOX_3D * e)
 {
-  POLYGON_OBJECT *polygon = (POLYGON_OBJECT *) obj;
-  get_extent_of_points (polygon->pts, e);
+    POLYGON_OBJECT *polygon = (POLYGON_OBJECT *) obj;
+    get_extent_of_points(polygon->pts, e);
 }
 
-static void
-get_extent_of_special (OBJECT * obj, BOX_3D * e)
+static void get_extent_of_special(OBJECT * obj, BOX_3D * e)
 {
-  SPECIAL_OBJECT *special = (SPECIAL_OBJECT *) obj;
-  fold_min_max_pt_3d (e, special->pts->v[0]);
+    SPECIAL_OBJECT *special = (SPECIAL_OBJECT *) obj;
+    fold_min_max_pt_3d(e, special_first_point(special));
 }
 
 typedef void (*EXTENT_FUNC) (OBJECT *, BOX_3D *);
 
 static EXTENT_FUNC extent_tbl[] = {
-  NULL,				// O_BASE
-  NULL,				// O_TAG_DEF
-  NULL,				// O_OPTS_DEF
-  NULL,				// O_SCALAR_DEF
-  NULL,				// O_POINT_DEF
-  NULL,				// O_VECTOR_DEF
-  NULL,				// O_TRANSFORM_DEF
-  get_extent_of_dots,
-  get_extent_of_line,
-  get_extent_of_curve,
-  get_extent_of_polygon,
-  get_extent_of_special,
-  NULL,				// O_SWEEP (flattened)
-  NULL,				// O_REPEAT (flattened)
-  NULL,				// O_COMPOUND (flattened)
+    NULL,			// O_BASE
+    NULL,			// O_TAG_DEF
+    NULL,			// O_OPTS_DEF
+    NULL,			// O_SCALAR_DEF
+    NULL,			// O_POINT_DEF
+    NULL,			// O_VECTOR_DEF
+    NULL,			// O_TRANSFORM_DEF
+    get_extent_of_dots,
+    get_extent_of_line,
+    get_extent_of_curve,
+    get_extent_of_polygon,
+    get_extent_of_special,
+    NULL,			// O_SWEEP (flattened)
+    NULL,			// O_REPEAT (flattened)
+    NULL,			// O_COMPOUND (flattened)
 };
 
-void
-get_extent (OBJECT * obj, BOX_3D * e, int *n_obj)
-{
-  if (obj)
-    {
-      int n = 0;
-      init_box_3d(e);
-      while (obj)
-	{
-	  if (extent_tbl[obj->tag] == NULL)
-	    die (no_line, "get_extent: bad tag %d", obj->tag);
-	  (*extent_tbl[obj->tag]) (obj, e);
-	  obj = obj->sibling;
-	  ++n;
+void get_extent(OBJECT * obj, BOX_3D * e, int *n_obj)
+{
+    if (obj) {
+	int n = 0;
+	init_box_3d(e);
+	while (obj) {
+	    if (extent_tbl[obj->tag] == NULL)
+		die(no_line, "get_extent: bad tag %d", obj->tag);
+	    (*extent_tbl[obj->tag]) (obj, e);
+	    obj = obj->sibling;
+	    ++n;
 	}
-      *n_obj = n;
-    }
-  else
-    {
-      // reasonable empty box
-      e->min[X] = e->min[Y] = e->min[Z] = 0;
-      e->max[X] = e->max[Y] = e->max[Z] = 1;
-      *n_obj = 0;
+	*n_obj = n;
+    } else {
+	// reasonable empty box
+	e->min[X] = e->min[Y] = e->min[Z] = 0;
+	e->max[X] = e->max[Y] = e->max[Z] = 1;
+	*n_obj = 0;
     }
 }
 
-int
-xy_overlap_p (OBJECT * obj, BOX_3D * e)
+int xy_overlap_p(OBJECT * obj, BOX_3D * e)
 {
-  BOX_3D e_obj[1];
+    BOX_3D e_obj[1];
 
-  init_box_3d(e_obj);
-  (*extent_tbl[obj->tag]) (obj, e_obj);
-  return 
-    !(e_obj->max[X] < e->min[X] ||
-      e_obj->min[X] > e->max[X] ||
-      e_obj->max[Y] < e->min[Y] || 
-      e_obj->min[Y] > e->max[Y]);
+    init_box_3d(e_obj);
+    (*extent_tbl[obj->tag]) (obj, e_obj);
+    return
+	!(e_obj->max[X] < e->min[X] ||
+	  e_obj->min[X] > e->max[X] ||
+	  e_obj->max[Y] < e->min[Y] || e_obj->min[Y] > e->max[Y]);
 }
diff --git a/scene.h b/scene.h
index 555e539..9c292f9 100644
--- a/scene.h
+++ b/scene.h
@@ -1,22 +1,22 @@
 /* scene.h
    Copyright (C) 2005,2006,2007,2008 Eugene K. Ressler, Jr.
 
-This file is part of Sketch, a small, simple system for making 
-3d drawings with LaTeX and the PSTricks or TikZ package.
+   This file is part of Sketch, a small, simple system for making 
+   3d drawings with LaTeX and the PSTricks or TikZ package.
 
-Sketch is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
+   Sketch is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
 
-Sketch is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   Sketch is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with Sketch; see the file COPYING.txt.  If not, see
-http://www.gnu.org/copyleft */
+   You should have received a copy of the GNU General Public License
+   along with Sketch; see the file COPYING.txt.  If not, see
+   http://www.gnu.org/copyleft */
 
 #ifndef __SCENE_H
 #define __SCENE_H
@@ -29,202 +29,191 @@ http://www.gnu.org/copyleft */
 #include "dynarray.h"
 #include "global.h"
 
-typedef struct point_list_3d_t
-{
-  DYNAMIC_2D_ARRAY_FIELDS (POINT_3D, v, n_pts);
-}
-POINT_LIST_3D;
-
-DECLARE_DYNAMIC_2D_ARRAY_PROTOS (POINT_LIST_3D, POINT_3D, FLOAT,
-				 point_list_3d, v, n_pts)
-     typedef struct transform_list_t
-     {
-       DYNAMIC_2D_ARRAY_FIELDS (TRANSFORM, xf, n_xfs);
-     }
-TRANSFORM_LIST;
-
-DECLARE_DYNAMIC_2D_ARRAY_PROTOS (TRANSFORM_LIST, TRANSFORM, FLOAT,
-				 transform_list, xf, n_xfs)
+typedef struct point_list_3d_t {
+    DYNAMIC_2D_ARRAY_FIELDS(POINT_3D, v, n_pts);
+} POINT_LIST_3D;
+
+DECLARE_DYNAMIC_2D_ARRAY_PROTOS(POINT_LIST_3D, POINT_3D, FLOAT,
+				point_list_3d, v, n_pts);
+typedef struct transform_list_t {
+    DYNAMIC_2D_ARRAY_FIELDS(TRANSFORM, xf, n_xfs);
+} TRANSFORM_LIST;
+
+DECLARE_DYNAMIC_2D_ARRAY_PROTOS(TRANSFORM_LIST, TRANSFORM, FLOAT,
+				transform_list, xf, n_xfs);
+
 // object_type_str[] definition in scene.c must match!
-     typedef enum object_type_t
-     {
-       O_BASE,
-       O_TAG_DEF,
-       O_OPTS_DEF,
-       O_SCALAR_DEF,
-       O_POINT_DEF,
-       O_VECTOR_DEF,
-       O_TRANSFORM_DEF,
-       O_DOTS,
-       O_LINE,
-       O_CURVE,
-       O_POLYGON,
-       O_SPECIAL,
-       O_SWEEP,
-       O_REPEAT,
-       O_COMPOUND,
-     }
-OBJECT_TYPE;
+typedef enum object_type_t {
+    O_BASE,
+    O_TAG_DEF,
+    O_OPTS_DEF,
+    O_SCALAR_DEF,
+    O_POINT_DEF,
+    O_VECTOR_DEF,
+    O_TRANSFORM_DEF,
+    O_DOTS,
+    O_LINE,
+    O_CURVE,
+    O_POLYGON,
+    O_SPECIAL,
+    O_SWEEP,
+    O_REPEAT,
+    O_COMPOUND,
+} OBJECT_TYPE;
 
 #define is_drawable(P)  ((P)->tag >= O_DOTS)
 
-     extern char *object_type_str[];
+extern char *object_type_str[];
 
 #define BASE_OBJECT_FIELDS  \
   struct object_t *sibling; \
   OBJECT_TYPE tag
 
-     typedef struct object_t
-     {
-       BASE_OBJECT_FIELDS;
-     }
-OBJECT;
-
-     typedef OBJECT TAG_DEF;
-     OBJECT *new_tag_def (void);
-
-     typedef struct opts_def_t
-     {
-       BASE_OBJECT_FIELDS;
-       OPTS *opts;
-     }
-OPTS_DEF;
-
-     OBJECT *new_opts_def (char *opts_str, SRC_LINE line);
-
-     typedef struct scalar_def_t
-     {
-       BASE_OBJECT_FIELDS;
-       FLOAT val;
-     }
-SCALAR_DEF;
-
-     OBJECT *new_scalar_def (FLOAT val);
-
-     typedef struct point_def_t
-     {
-       BASE_OBJECT_FIELDS;
-       POINT_3D p;
-     }
-POINT_DEF;
-
-     OBJECT *new_point_def (POINT_3D p);
-
-     typedef struct vector_def_t
-     {
-       BASE_OBJECT_FIELDS;
-       VECTOR_3D v;
-     }
-VECTOR_DEF;
-
-     OBJECT *new_vector_def (VECTOR_3D v);
-
-     typedef struct transform_def_t
-     {
-       BASE_OBJECT_FIELDS;
-       TRANSFORM xf;
-     }
-TRANSFORM_DEF;
-
-     OBJECT *new_transform_def (TRANSFORM xf);
-
-     typedef struct dots_t
-     {
-       BASE_OBJECT_FIELDS;
-       OPTS *opts;
-       POINT_LIST_3D pts[1];
-     }
-DOTS_OBJECT;
-
-     OBJECT *new_dots (OPTS * opts, OBJECT * pts);
-
-     typedef struct line_object_t
-     {
-       BASE_OBJECT_FIELDS;
-       OPTS *opts;
-       POINT_LIST_3D pts[1];
-     }
-LINE_OBJECT;
-
-     OBJECT *new_line (OPTS * opts, OBJECT * pts);
-
-     typedef struct curve_t
-     {
-       BASE_OBJECT_FIELDS;
-       OPTS *opts;
-       POINT_LIST_3D pts[1];
-     }
-CURVE_OBJECT;
-
-     OBJECT *new_curve (OPTS * opts, OBJECT * pts);
-
-     typedef struct polygon_t
-     {
-       BASE_OBJECT_FIELDS;
-       OPTS *opts;
-       int border_p;
-       POINT_LIST_3D pts[1];
-     }
-POLYGON_OBJECT;
-
-     OBJECT *new_polygon (OPTS * opts, OBJECT * pts);
-
-     typedef struct special_t
-     {
-       BASE_OBJECT_FIELDS;
-       char *code;
-       OPTS *opts;
-       POINT_LIST_3D pts[1];
-     }
-SPECIAL_OBJECT;
-
-     OBJECT *new_special (char *code, OPTS * opts, OBJECT * pts,
-			  SRC_LINE line);
-
-     typedef struct sweep_t
-     {
-       BASE_OBJECT_FIELDS;
-       OPTS *opts;
-       int n_slices;
-       int closed_p;
-       TRANSFORM_LIST xforms[1];
-       OBJECT *swept;
-     }
-SWEEP_OBJECT;
-
-     OBJECT *new_sweep (OPTS * opts, int n_slices, int closed_p, OBJECT * xfs,
-			OBJECT * swept);
-
-     typedef struct repeat_t
-     {
-       BASE_OBJECT_FIELDS;
-       int n;
-       TRANSFORM_LIST xforms[1];
-       OBJECT *repeated;
-     }
-REPEAT_OBJECT;
-
-     OBJECT *new_repeat (int n, OBJECT * xfs, OBJECT * repeated);
-
-     typedef struct compound_t
-     {
-       BASE_OBJECT_FIELDS;
-       TRANSFORM xform;
-       OBJECT *child;
-     }
-COMPOUND_OBJECT;
-
-     OBJECT *new_compound (TRANSFORM xform, OBJECT * child);
-
-     OBJECT *copy_drawable (OBJECT * obj);
-     OBJECT *cat_objects (OBJECT * lft, OBJECT * rgt);
-     OBJECT *sibling_reverse (OBJECT * obj);
-     OBJECT *object_from_expr (EXPR_VAL * val);
-
-     OBJECT *flat_scene (OBJECT * obj, GLOBAL_ENV * env);
-     OBJECT *hsr_scene_with_bsp (OBJECT * scene);
-     OBJECT *hsr_scene_with_depth_sort (OBJECT * scene);
-     void get_extent (OBJECT * obj, BOX_3D * e, int *n_obj);
-     int xy_overlap_p (OBJECT * obj, BOX_3D * e);
+typedef struct object_t {
+    BASE_OBJECT_FIELDS;
+} OBJECT;
+
+typedef OBJECT TAG_DEF;
+OBJECT *new_tag_def(void);
+
+typedef struct opts_def_t {
+    BASE_OBJECT_FIELDS;
+    OPTS *opts;
+} OPTS_DEF;
+
+OBJECT *new_opts_def(char *opts_str, SRC_LINE line);
+OBJECT *new_opts_def_copy(OPTS * opts);
+
+typedef struct scalar_def_t {
+    BASE_OBJECT_FIELDS;
+    FLOAT val;
+} SCALAR_DEF;
+
+OBJECT *new_scalar_def(FLOAT val);
+
+typedef struct point_def_t {
+    BASE_OBJECT_FIELDS;
+    POINT_3D p;
+} POINT_DEF;
+
+OBJECT *new_point_def(POINT_3D p);
+
+typedef struct vector_def_t {
+    BASE_OBJECT_FIELDS;
+    VECTOR_3D v;
+} VECTOR_DEF;
+
+OBJECT *new_vector_def(VECTOR_3D v);
+
+typedef struct transform_def_t {
+    BASE_OBJECT_FIELDS;
+    TRANSFORM xf;
+} TRANSFORM_DEF;
+
+OBJECT *new_transform_def(TRANSFORM xf);
+
+typedef struct dots_t {
+    BASE_OBJECT_FIELDS;
+    OPTS *opts;
+    POINT_LIST_3D pts[1];
+} DOTS_OBJECT;
+
+OBJECT *new_dots(OPTS * opts, OBJECT * pts);
+
+typedef struct line_object_t {
+    BASE_OBJECT_FIELDS;
+    OPTS *opts;
+    POINT_LIST_3D pts[1];
+} LINE_OBJECT;
+
+OBJECT *new_line(OPTS * opts, OBJECT * pts);
+
+typedef struct curve_t {
+    BASE_OBJECT_FIELDS;
+    OPTS *opts;
+    POINT_LIST_3D pts[1];
+} CURVE_OBJECT;
+
+OBJECT *new_curve(OPTS * opts, OBJECT * pts);
+
+typedef struct polygon_t {
+    BASE_OBJECT_FIELDS;
+    OPTS *opts;
+    int border_p;
+    POINT_LIST_3D pts[1];
+} POLYGON_OBJECT;
+
+OBJECT *new_polygon(OPTS * opts, OBJECT * pts);
+
+typedef enum {
+    SA_SCALAR,
+    SA_POINT,
+    SA_VECTOR,
+} SPECIAL_ARG_TYPE;
+
+typedef struct special_arg_t {
+    SPECIAL_ARG_TYPE tag;
+    union val_u {
+	POINT_3D pt;
+	VECTOR_3D v;
+	FLOAT flt;
+    } val;
+} SPECIAL_ARG;
+
+typedef struct special_arg_list_t {
+    DYNAMIC_ARRAY_FIELDS(SPECIAL_ARG, arg, n_args);
+} SPECIAL_ARG_LIST;
+
+DECLARE_DYNAMIC_ARRAY_PROTOS(SPECIAL_ARG_LIST, SPECIAL_ARG,
+			     special_arg_list, arg, n_args);
+
+typedef struct special_t {
+    BASE_OBJECT_FIELDS;
+    char *code;
+    OPTS *opts;
+    SPECIAL_ARG_LIST args[1];
+} SPECIAL_OBJECT;
+
+OBJECT *new_special(char *code, OBJECT * pts, SRC_LINE line);
+
+typedef struct sweep_t {
+    BASE_OBJECT_FIELDS;
+    OPTS *opts;
+    int n_slices;
+    int closed_p;
+    TRANSFORM_LIST xforms[1];
+    OBJECT *swept;
+} SWEEP_OBJECT;
+
+OBJECT *new_sweep(OPTS * opts, int n_slices, int closed_p, OBJECT * xfs,
+		  OBJECT * swept);
+
+typedef struct repeat_t {
+    BASE_OBJECT_FIELDS;
+    int n;
+    TRANSFORM_LIST xforms[1];
+    OBJECT *repeated;
+} REPEAT_OBJECT;
+
+OBJECT *new_repeat(int n, OBJECT * xfs, OBJECT * repeated);
+
+typedef struct compound_t {
+    BASE_OBJECT_FIELDS;
+    TRANSFORM xform;
+    OBJECT *child;
+} COMPOUND_OBJECT;
+
+OBJECT *new_compound(TRANSFORM xform, OBJECT * child);
+
+OBJECT *copy_drawable(OBJECT * obj);
+OBJECT *cat_objects(OBJECT * lft, OBJECT * rgt);
+OBJECT *sibling_reverse(OBJECT * obj);
+OBJECT *object_from_expr(EXPR_VAL * val);
+
+OBJECT *flat_scene(OBJECT * obj, GLOBAL_ENV * env);
+OBJECT *hsr_scene_with_bsp(OBJECT * scene);
+OBJECT *hsr_scene_with_depth_sort(OBJECT * scene);
+void get_extent(OBJECT * obj, BOX_3D * e, int *n_obj);
+int xy_overlap_p(OBJECT * obj, BOX_3D * e);
 
 #endif
diff --git a/sketch.l b/sketch.l
index 21a6f4e..5df50b7 100644
--- a/sketch.l
+++ b/sketch.l
@@ -81,7 +81,7 @@ WS [ \t\r\n]
   line.number++; 
 }
 
-"["[^\]=]+=[^\]]+"]" { /* [<stuff>=<stuff>] */
+"["[^\]=]+"="[^\]]+"]" { /* [<stuff>=<stuff>] */
   // elide the brackets
   yylval.str = safe_malloc(yyleng + 1 - 2);
   str_slice(yylval.str, yyleng + 1 - 2, yytext, 1, -1);
diff --git a/sketch.y b/sketch.y
index 9842fd1..ba72325 100644
--- a/sketch.y
+++ b/sketch.y
@@ -71,7 +71,7 @@ static OBJECT *objects;
 %token <name>ID <name>PAREN_ID <name>BRACKET_ID 
 %token <name>DBL_BRACKET_ID <name>CURLY_ID <name>ANGLE_ID
 %token <flt>NUM 
-%token <str>OPTS_STR <str>SPECIAL
+%token <str>OPTS_STR <str>SPECIAL 
 %token <index>TICK
 %token THEN DEF EMPTY_ANGLE
 %token DOTS LINE CURVE POLYGON REPEAT SWEEP PUT SPECIAL
@@ -84,11 +84,12 @@ static OBJECT *objects;
 %type <opts>  options option_id_list
 %type <flt>   scalar scalar_expr opt_baseline
 %type <pt>    point point_expr
-%type <vec>   vector vector_expr
+%type <vec>   vector_literal vector_id vector vector_expr
 %type <xf>    transform transform_expr
 %type <exv>   expr
-%type <obj>   defs_and_decls rev_defs_and_decls decl def_or_decl 
-%type <obj>   defable points rev_points transforms rev_transforms
+%type <obj>   defs_and_decls rev_defs_and_decls decl def_or_decl defable
+%type <obj>   points rev_points transforms rev_transforms special_arg
+%type <obj>   special_args rev_special_args
 %type <bool>  opt_star
 %type <index> output_language comma_macro_package graphics_language macro_package
 
@@ -193,22 +194,21 @@ decl                  : DOTS options points		  { $$ = new_dots($2, $3); }
                       | LINE options points     { $$ = new_line($2, $3); }
                       | CURVE options points    { $$ = new_curve($2, $3); }
                       | POLYGON options points  { $$ = new_polygon($2, $3); }
-					            | SWEEP options '{' scalar_expr opt_star ',' transforms '}' point 
-					                { 
-						                $$ = new_sweep($2, $4, $5, $7, new_point_def($9));
-						              }
-					            | SWEEP options '{' scalar_expr opt_star ',' transforms '}' decl
-					                {
-						                $$ = new_sweep($2, $4, $5, $7, $9);
-						              }
-					            | REPEAT '{' scalar_expr ',' transforms '}' decl
-					                {
-						                $$ = new_repeat($3, $5, $7);
-						              }
+		      | SWEEP options '{' scalar_expr opt_star ',' transforms '}' point 
+		          { 
+                              $$ = new_sweep($2, $4, $5, $7, new_point_def($9));
+                          }
+                      | SWEEP options '{' scalar_expr opt_star ',' transforms '}' decl
+			  {
+                              $$ = new_sweep($2, $4, $5, $7, $9);
+                          }
+                      | REPEAT '{' scalar_expr ',' transforms '}' decl
+                          {
+                              $$ = new_repeat($3, $5, $7);
+                          }
                       | PUT '{' transform_expr '}' decl { $$ = new_compound($3, $5); }
-                      | SPECIAL options points  { $$ = new_special($1, $2, $3, line); }
-                      | SPECIAL options         { $$ = new_special($1, $2, new_point_def(origin_3d), line); }
-                      | CURLY_ID  { look_up_drawable(sym_tab, &$$, line, $1); }
+                      | SPECIAL special_args { $$ = new_special($1, $2, line); }
+                      | CURLY_ID { look_up_drawable(sym_tab, &$$, line, $1); }
                       | '{'             { sym_tab = new_scope(sym_tab); }
                         defs_and_decls  { sym_tab = old_scope(sym_tab); }
                         '}'
@@ -226,7 +226,7 @@ opt_star              : EMPTY_ANGLE { $$ = 1; }
 option_id_list        : option_id_list ',' ID
                           { 
                             $$ = look_up_and_append_to_opts(sym_tab, &$1, line, $3);
-			  }
+                          }
                       | ID 
                           { 
                             $$ = NULL;
@@ -246,12 +246,26 @@ points                : rev_points  { $$ = sibling_reverse($1); }
 rev_points            : rev_points point  { $$ = cat_objects(new_point_def($2), $1); }
                       | point             { $$ = new_point_def($1); }
                       ;
- 
+
+special_args          : rev_special_args { $$ = sibling_reverse($1); }
+                      ;
+
+rev_special_args      : rev_special_args special_arg { $$ = cat_objects($2, $1); }
+                      | /* empty */                  { $$ = NULL; }
+                      ;
+
+special_arg           : scalar                 { $$ = new_scalar_def($1); }
+                      | point                  { $$ = new_point_def($1); }
+                      | vector_literal         { $$ = new_vector_def($1); }
+                      | OPTS_STR               { $$ = new_opts_def($1, line); }
+                      | BRACKET_ID             { look_up_vector_or_opts(sym_tab, &$$, line, $1); }
+                      ;
+
 transforms            : rev_transforms { $$ = sibling_reverse($1); }
                       ;
 
-rev_transforms        : rev_transforms ',' transform_expr { $$ = cat_objects(new_transform_def($3), $1); }
-                      | transform_expr                    { $$ = new_transform_def($1); }
+rev_transforms        : rev_transforms ',' transform_expr { $$ = cat_objects(new_transform_def($3), $1); } 
+                      | transform_expr                    { $$ = new_transform_def($1); } 
                       ;
 
 expr                  : scalar                      { set_float(&$$, $1); }
@@ -297,7 +311,11 @@ point                 : '(' scalar_expr ',' scalar_expr ',' scalar_expr ')'
 point_expr            : expr  { coerce_to_point(&$1, $$, line); }
                       ;
 
-vector                : '[' scalar_expr ',' scalar_expr ',' scalar_expr ']'
+vector                : vector_literal { copy_vec_3d($$, $1); }
+                      | vector_id      { copy_vec_3d($$, $1); }
+                      ;
+
+vector_literal        : '[' scalar_expr ',' scalar_expr ',' scalar_expr ']'
                           { 
                             $$[X] = $2; $$[Y] = $4; $$[Z] = $6;
                           }
@@ -305,7 +323,10 @@ vector                : '[' scalar_expr ',' scalar_expr ',' scalar_expr ']'
                           { 
                             $$[X] = $2; $$[Y] = $4; $$[Z] = 0;
                           }
-                      | BRACKET_ID { look_up_vector(sym_tab, $$, line, $1); }
+                      ;
+
+vector_id             : BRACKET_ID { look_up_vector(sym_tab, $$, line, $1); }
+                      ;
 
 vector_expr           : expr  { coerce_to_vector(&$1, $$, line); }
                       ;
@@ -402,7 +423,7 @@ int parse(SYMBOL_TABLE *st)
 {
   int ret;
 
-	objects = NULL;
+  objects = NULL;
   sym_tab = st;
   ret = yyparse();
 
diff --git a/symbol.c b/symbol.c
index cf02c47..6ea0265 100644
--- a/symbol.c
+++ b/symbol.c
@@ -25,34 +25,30 @@ http://www.gnu.org/copyleft */
 #include "symbol.h"
 
 // dragon book hash function due to as&u.
-unsigned
-hash (char *s)
+unsigned hash(char *s)
 {
-  unsigned h = 0, g;
-
-  while (*s)
-    {
-      h = (h << 4) + *s++;
-      if ((g = h & 0xf0000000L) != 0)
-	{
-	  h ^= (g >> 24);
-	  h ^= g;
+    unsigned h = 0, g;
+
+    while (*s) {
+	h = (h << 4) + *s++;
+	if ((g = h & 0xf0000000L) != 0) {
+	    h ^= (g >> 24);
+	    h ^= g;
 	}
     }
-  return h;
+    return h;
 }
 
 // chain a new scope onto an existing symbol table (or NULL)
 // and return the new table
-SYMBOL_TABLE *
-new_scope (SYMBOL_TABLE * sym_tab)
+SYMBOL_TABLE *new_scope(SYMBOL_TABLE * sym_tab)
 {
-  int i;
-  SYMBOL_TABLE *new_sym_tab = safe_malloc (sizeof *new_sym_tab);
-  new_sym_tab->enclosing = sym_tab;
-  for (i = 0; i < ARRAY_SIZE (new_sym_tab->head); i++)
-    new_sym_tab->head[i] = NULL;
-  return new_sym_tab;
+    int i;
+    SYMBOL_TABLE *new_sym_tab = safe_malloc(sizeof *new_sym_tab);
+    new_sym_tab->enclosing = sym_tab;
+    for (i = 0; i < ARRAY_SIZE(new_sym_tab->head); i++)
+	new_sym_tab->head[i] = NULL;
+    return new_sym_tab;
 }
 
 // unchain the inner scope from an existing symbol table
@@ -62,327 +58,330 @@ new_scope (SYMBOL_TABLE * sym_tab)
 //
 // we are not worrying about freeing storage; the def nodes
 // are needed for object names anyway
-SYMBOL_TABLE *
-old_scope (SYMBOL_TABLE * sym_tab)
+SYMBOL_TABLE *old_scope(SYMBOL_TABLE * sym_tab)
 {
-  int i;
-  SYMBOL *sym, *sym_next;
-  SYMBOL_TABLE *sym_tab_enclosing;
-
-  // warn of unreferenced symbols
-  for (i = 0; i < ARRAY_SIZE (sym_tab->head); i++)
-    {
-      for (sym = sym_tab->head[i]; sym; sym = sym_next)
-	{
-	  sym_next = sym->next;
-	  if (sym->n_references == 0 && !sym->def_line.include_p)
-	    {
-	      if (sym->obj)
-		warn (sym->def_line, "%s '%s' is never referenced",
-		      object_type_str[sym->obj->tag], sym->name);
-	      else
-		warn (sym->def_line, "'%s' is never referenced", sym->name);
+    int i;
+    SYMBOL *sym, *sym_next;
+    SYMBOL_TABLE *sym_tab_enclosing;
+
+    // warn of unreferenced symbols
+    for (i = 0; i < ARRAY_SIZE(sym_tab->head); i++) {
+	for (sym = sym_tab->head[i]; sym; sym = sym_next) {
+	    sym_next = sym->next;
+	    if (sym->n_references == 0 && !sym->def_line.include_p) {
+		if (sym->obj)
+		    warn(sym->def_line, "%s '%s' is never referenced",
+			 object_type_str[sym->obj->tag], sym->name);
+		else
+		    warn(sym->def_line, "'%s' is never referenced",
+			 sym->name);
 	    }
-	  safe_free (sym);
+	    safe_free(sym);
 	}
     }
-  sym_tab_enclosing = sym_tab->enclosing;
-  safe_free (sym_tab);
-  return sym_tab_enclosing;
+    sym_tab_enclosing = sym_tab->enclosing;
+    safe_free(sym_tab);
+    return sym_tab_enclosing;
 }
 
-static SYMBOL *
-lookup_in_inner_scope (SYMBOL_TABLE * sym_tab, char *name, unsigned index)
+static SYMBOL *lookup_in_inner_scope(SYMBOL_TABLE * sym_tab, char *name,
+				     unsigned index)
 {
-  SYMBOL *sym;
+    SYMBOL *sym;
 
-  for (sym = sym_tab->head[index]; sym; sym = sym->next)
-    if (strncmp (name, sym->name, sizeof sym->name - 1) == 0)
-      return sym;
-  return NULL;
+    for (sym = sym_tab->head[index]; sym; sym = sym->next)
+	if (strncmp(name, sym->name, sizeof sym->name - 1) == 0)
+	    return sym;
+    return NULL;
 }
 
-SYMBOL *
-lookup (SYMBOL_TABLE * sym_tab, char *name)
+SYMBOL *lookup(SYMBOL_TABLE * sym_tab, char *name)
 {
-  SYMBOL *sym;
-  unsigned index;
-
-  index = hash (name) % ARRAY_SIZE (sym_tab->head);
-  do
-    {
-      sym = lookup_in_inner_scope (sym_tab, name, index);
-      if (sym)
-	{
-	  sym->n_references++;
-	  return sym;
+    SYMBOL *sym;
+    unsigned index;
+
+    index = hash(name) % ARRAY_SIZE(sym_tab->head);
+    do {
+	sym = lookup_in_inner_scope(sym_tab, name, index);
+	if (sym) {
+	    sym->n_references++;
+	    return sym;
 	}
-      sym_tab = sym_tab->enclosing;
+	sym_tab = sym_tab->enclosing;
     }
-  while (sym_tab);
-  return NULL;
+    while (sym_tab);
+    return NULL;
 }
 
-static OBJECT *
-lookup_with_type_check (SYMBOL_TABLE * sym_tab,
-			OBJECT_TYPE tag, SRC_LINE line, char *name)
+static OBJECT *lookup_with_type_check(SYMBOL_TABLE * sym_tab,
+				      OBJECT_TYPE tag, SRC_LINE line,
+				      char *name)
 {
-  SYMBOL *sym = lookup (sym_tab, name);
-  if (sym)
-    {
-      if (sym->obj)
-	{
-	  if (sym->obj->tag == tag)
-	    return sym->obj;
-	  else
-	    err (line, "expected %s to be a %s and instead it's a %s",
-		 name, object_type_str[tag], object_type_str[sym->obj->tag]);
-	}
-      else
-	{
-	  err (line, "%s has a null definition", name);
+    SYMBOL *sym = lookup(sym_tab, name);
+    if (sym) {
+	if (sym->obj) {
+	    if (sym->obj->tag == tag)
+		return sym->obj;
+	    else
+		err(line, "expected %s to be a %s and instead it's a %s",
+		    name, object_type_str[tag],
+		    object_type_str[sym->obj->tag]);
+	} else {
+	    err(line, "%s has a null definition", name);
 	}
+    } else {
+	err(line, "found undefined identifier %s while looking for %s",
+	    name, object_type_str[tag]);
     }
-  else
-    {
-      err (line, "found undefined identifier %s while looking for %s",
-	   name, object_type_str[tag]);
-    }
-  return NULL;
+    return NULL;
 }
 
 void
-look_up_tag (SYMBOL_TABLE * sym_tab, int *exists_p, SRC_LINE line, char *name)
+look_up_tag(SYMBOL_TABLE * sym_tab, int *exists_p, SRC_LINE line,
+	    char *name)
 {
-  SYMBOL *sym;
+    SYMBOL *sym;
 
-  if (name)
-    {
-      sym = lookup (sym_tab, name);
-      *exists_p = sym && sym->obj && sym->obj->tag == O_TAG_DEF;
-    }
-  else
-    {
-      *exists_p = 0;
+    if (name) {
+	sym = lookup(sym_tab, name);
+	*exists_p = sym && sym->obj && sym->obj->tag == O_TAG_DEF;
+    } else {
+	*exists_p = 0;
     }
 }
 
-int
-tag_exists_p (SYMBOL_TABLE * sym_tab, char *name)
+int tag_exists_p(SYMBOL_TABLE * sym_tab, char *name)
 {
-  int exists_p;
-  look_up_tag (sym_tab, &exists_p, no_line, name);
-  if (!exists_p)
-    err (no_line, "undefined tag %s", name);
-  return exists_p;
+    int exists_p;
+    look_up_tag(sym_tab, &exists_p, no_line, name);
+    if (!exists_p)
+	err(no_line, "undefined tag %s", name);
+    return exists_p;
 }
 
 void
-look_up_opts (SYMBOL_TABLE * sym_tab, OPTS ** r, SRC_LINE line, char *name)
+look_up_opts(SYMBOL_TABLE * sym_tab, OPTS ** r, SRC_LINE line, char *name)
 {
-  OPTS_DEF *def =
-    (OPTS_DEF *) lookup_with_type_check (sym_tab, O_OPTS_DEF, line,
-					 name);
-  *r = def ? def->opts : NULL;
+    OPTS_DEF *def =
+	(OPTS_DEF *) lookup_with_type_check(sym_tab, O_OPTS_DEF, line,
+					    name);
+    *r = def ? def->opts : NULL;
 }
 
-OPTS *
-look_up_and_append_to_opts(SYMBOL_TABLE * sym_tab, OPTS ** r, SRC_LINE line, char *name)
+OPTS *look_up_and_append_to_opts(SYMBOL_TABLE * sym_tab, OPTS ** r,
+				 SRC_LINE line, char *name)
 {
-  OPTS *opts;
-  look_up_opts(sym_tab, &opts, line, name);
-  if (opts) 
-    {
-      if (*r == NULL)
-	*r = raw_opts();
-      cat_opts(*r, opts);
+    OPTS *opts;
+    look_up_opts(sym_tab, &opts, line, name);
+    if (opts) {
+	if (*r == NULL)
+	    *r = raw_opts();
+	cat_opts(*r, opts);
     }
-  return *r;
+    return *r;
 }
 
 void
-look_up_scalar (SYMBOL_TABLE * sym_tab, FLOAT * r, SRC_LINE line, char *name)
+look_up_scalar(SYMBOL_TABLE * sym_tab, FLOAT * r, SRC_LINE line,
+	       char *name)
 {
-  SCALAR_DEF *def =
-    (SCALAR_DEF *) lookup_with_type_check (sym_tab, O_SCALAR_DEF, line,
-					   name);
-  *r = def ? def->val : 0;
+    SCALAR_DEF *def =
+	(SCALAR_DEF *) lookup_with_type_check(sym_tab, O_SCALAR_DEF, line,
+					      name);
+    *r = def ? def->val : 0;
 }
 
 void
-look_up_point (SYMBOL_TABLE * sym_tab, POINT_3D r, SRC_LINE line, char *name)
+look_up_point(SYMBOL_TABLE * sym_tab, POINT_3D r, SRC_LINE line,
+	      char *name)
 {
-  POINT_DEF *def =
-    (POINT_DEF *) lookup_with_type_check (sym_tab, O_POINT_DEF, line,
-					  name);
-  if (def)
-    copy_pt_3d (r, def->p);
-  else
-    r[X] = r[Y] = r[Z] = 0;
+    POINT_DEF *def =
+	(POINT_DEF *) lookup_with_type_check(sym_tab, O_POINT_DEF, line,
+					     name);
+    if (def)
+	copy_pt_3d(r, def->p);
+    else
+	r[X] = r[Y] = r[Z] = 0;
 }
 
 void
-look_up_vector (SYMBOL_TABLE * sym_tab, VECTOR_3D r, SRC_LINE line,
-		char *name)
+look_up_vector(SYMBOL_TABLE * sym_tab, VECTOR_3D r, SRC_LINE line,
+	       char *name)
 {
-  VECTOR_DEF *def =
-    (VECTOR_DEF *) lookup_with_type_check (sym_tab, O_VECTOR_DEF, line,
-					   name);
-  if (def)
-    copy_vec_3d (r, def->v);
-  else
-    zero_vec_3d (r);
+    VECTOR_DEF *def =
+	(VECTOR_DEF *) lookup_with_type_check(sym_tab, O_VECTOR_DEF, line,
+					      name);
+    if (def)
+	copy_vec_3d(r, def->v);
+    else
+	zero_vec_3d(r);
 }
 
 void
-look_up_transform (SYMBOL_TABLE * sym_tab, TRANSFORM r, SRC_LINE line,
-		   char *name)
+look_up_transform(SYMBOL_TABLE * sym_tab, TRANSFORM r, SRC_LINE line,
+		  char *name)
 {
-  TRANSFORM_DEF *def =
-    (TRANSFORM_DEF *) lookup_with_type_check (sym_tab, O_TRANSFORM_DEF,
-					      line, name);
-  if (def)
-    copy_transform (r, def->xf);
-  else
-    set_ident (r);
+    TRANSFORM_DEF *def =
+	(TRANSFORM_DEF *) lookup_with_type_check(sym_tab, O_TRANSFORM_DEF,
+						 line, name);
+    if (def)
+	copy_transform(r, def->xf);
+    else
+	set_ident(r);
 }
 
 void
-look_up_drawable (SYMBOL_TABLE * sym_tab, OBJECT ** r, SRC_LINE line,
-		  char *name)
+look_up_drawable(SYMBOL_TABLE * sym_tab, OBJECT ** r, SRC_LINE line,
+		 char *name)
 {
-  SYMBOL *sym = lookup (sym_tab, name);
-  *r = NULL;
-  if (sym)
-    {
-      if (sym->obj)
-	{
-	  if (is_drawable (sym->obj))
-	    *r = copy_drawable (sym->obj);	// copy needed so concat of lookup result is ok
-	  else
-	    {
-	      err (line,
-		   "expected %s to be a drawable object and instead it's a %s",
-		   name, object_type_str[sym->obj->tag]);
+    SYMBOL *sym = lookup(sym_tab, name);
+    *r = NULL;
+    if (sym) {
+	if (sym->obj) {
+	    if (is_drawable(sym->obj))
+		*r = copy_drawable(sym->obj);	// copy needed so concat of lookup result is ok
+	    else {
+		err(line,
+		    "expected %s to be a drawable object and instead it's a %s",
+		    name, object_type_str[sym->obj->tag]);
 	    }
+	} else {
+	    err(line, "%s contains no drawable objects", name);
 	}
-      else
-	{
-	  err (line, "%s contains no drawable objects", name);
-	}
+    } else {
+	err(line,
+	    "found undefined identifier %s while looking for a drawable object",
+	    name);
     }
-  else
-    {
-      err (line,
-	   "found undefined identifier %s while looking for a drawable object",
-	   name);
+}
+
+void look_up_vector_or_opts(SYMBOL_TABLE * sym_tab, OBJECT ** r,
+			    SRC_LINE line, char *name)
+{
+    SYMBOL *sym = lookup(sym_tab, name);
+    *r = NULL;
+    if (sym) {
+	if (sym->obj) {
+	    switch (sym->obj->tag) {
+	    case O_VECTOR_DEF:{
+		    VECTOR_DEF *d = (VECTOR_DEF *) sym->obj;
+		    *r = new_vector_def(d->v);
+		}
+		break;
+	    case O_OPTS_DEF:{
+		    OPTS_DEF *d = (OPTS_DEF *) sym->obj;
+		    *r = new_opts_def_copy(d->opts);
+		}
+		break;
+	    default:
+		err(line, "expected %s to be special options or argument",
+		    name);
+		break;
+	    }
+	}
+    } else {
+	err(line,
+	    "found undefined identifier %s while looking for special options or argument",
+	    name);
     }
 }
 
-OBJECT *
-remove_from_inner_scope (SYMBOL_TABLE * sym_tab, char *name, unsigned index)
+OBJECT *remove_from_inner_scope(SYMBOL_TABLE * sym_tab, char *name,
+				unsigned index)
 {
-  OBJECT *r;
-  SYMBOL *sym, *prev_sym;
-
-  for (prev_sym = NULL, sym = sym_tab->head[index]; sym;
-       prev_sym = sym, sym = sym->next)
-    if (strncmp (name, sym->name, sizeof sym->name - 1) == 0)
-      {
-	if (prev_sym)
-	  prev_sym->next = sym->next;
-	else
-	  sym_tab->head[index] = sym->next;
-	r = sym->obj;
-	safe_free (sym);
-	return r;
-      }
-  return NULL;
+    OBJECT *r;
+    SYMBOL *sym, *prev_sym;
+
+    for (prev_sym = NULL, sym = sym_tab->head[index]; sym;
+	 prev_sym = sym, sym = sym->next)
+	if (strncmp(name, sym->name, sizeof sym->name - 1) == 0) {
+	    if (prev_sym)
+		prev_sym->next = sym->next;
+	    else
+		sym_tab->head[index] = sym->next;
+	    r = sym->obj;
+	    safe_free(sym);
+	    return r;
+	}
+    return NULL;
 }
 
-OBJECT *
-remove_symbol (SYMBOL_TABLE * sym_tab, char *name, SRC_LINE line)
+OBJECT *remove_symbol(SYMBOL_TABLE * sym_tab, char *name, SRC_LINE line)
 {
-  unsigned index;
-  OBJECT *obj;
-
-  index = hash (name) % ARRAY_SIZE (sym_tab->head);
-  do
-    {
-      obj = remove_from_inner_scope (sym_tab, name, index);
-      if (obj)
-	return obj;
-      sym_tab = sym_tab->enclosing;
+    unsigned index;
+    OBJECT *obj;
+
+    index = hash(name) % ARRAY_SIZE(sym_tab->head);
+    do {
+	obj = remove_from_inner_scope(sym_tab, name, index);
+	if (obj)
+	    return obj;
+	sym_tab = sym_tab->enclosing;
     }
-  while (sym_tab);
-  return NULL;
+    while (sym_tab);
+    return NULL;
 }
 
-SYMBOL *
-new_symbol (SYMBOL_TABLE * sym_tab, char *name, char *tag,
-	    OBJECT * obj, SRC_LINE def_line)
+SYMBOL *new_symbol(SYMBOL_TABLE * sym_tab, char *name, char *tag,
+		   OBJECT * obj, SRC_LINE def_line)
 {
-  int exists_p;
-  unsigned index;
-  SYMBOL *sym;
+    int exists_p;
+    unsigned index;
+    SYMBOL *sym;
 
-  if (!name || !name[0])
-    return NULL;
+    if (!name || !name[0])
+	return NULL;
 
-  index = hash (name) % ARRAY_SIZE (sym_tab->head);
+    index = hash(name) % ARRAY_SIZE(sym_tab->head);
 
-  // def has a tag that is undefined, so ignore it
-  if (tag)
-    {
-      look_up_tag (sym_tab, &exists_p, def_line, tag);
-      if (!exists_p)
-	return NULL;
+    // def has a tag that is undefined, so ignore it
+    if (tag) {
+	look_up_tag(sym_tab, &exists_p, def_line, tag);
+	if (!exists_p)
+	    return NULL;
     }
 
-  sym = lookup_in_inner_scope (sym_tab, name, index);
-
-  // ok to redefine if tag is given and the existing definition 
-  // is default and no uses have yet occurred
-  if (sym && !(tag && !sym->tag[0] && sym->n_references == 0))
-    {
-      // symbol already defined in the inner scope; this is an error
-      if (is_no_line_p (sym->def_line))
-	err (def_line, "name %s is already defined", name);
-      else
-	err (def_line, "name %s is already defined on line %d",
-	     name, sym->def_line.number);
-      return NULL;
+    sym = lookup_in_inner_scope(sym_tab, name, index);
+
+    // ok to redefine if tag is given and the existing definition 
+    // is default and no uses have yet occurred
+    if (sym && !(tag && !sym->tag[0] && sym->n_references == 0)) {
+	// symbol already defined in the inner scope; this is an error
+	if (is_no_line_p(sym->def_line))
+	    err(def_line, "name %s is already defined", name);
+	else
+	    err(def_line, "name %s is already defined on line %d",
+		name, sym->def_line.number);
+	return NULL;
     }
-  if (sym)
-    warn (def_line, "def of '%s' with tag '%s' after default", name, tag);
+    if (sym)
+	warn(def_line, "def of '%s' with tag '%s' after default", name,
+	     tag);
 
-  // create a new symbol and fill it in 
-  sym = safe_malloc (sizeof *sym);
+    // create a new symbol and fill it in 
+    sym = safe_malloc(sizeof *sym);
 
-  // copy up chars that fit then make sure the last is \0
-  strncpy (sym->name, name, sizeof sym->name);
-  sym->name[sizeof sym->name - 1] = '\0';
+    // copy up chars that fit then make sure the last is \0
+    strncpy(sym->name, name, sizeof sym->name);
+    sym->name[sizeof sym->name - 1] = '\0';
 
-  if (strlen (name) > sizeof sym->name - 1)
-    warn (def_line, "long identifier shortened to '%s'", sym->name);
+    if (strlen(name) > sizeof sym->name - 1)
+	warn(def_line, "long identifier shortened to '%s'", sym->name);
 
-  if (tag)
-    {
-      strncpy (sym->tag, tag, sizeof sym->tag);
-      sym->tag[sizeof sym->tag - 1] = '\0';
-    }
-  else
-    sym->tag[0] = '\0';
+    if (tag) {
+	strncpy(sym->tag, tag, sizeof sym->tag);
+	sym->tag[sizeof sym->tag - 1] = '\0';
+    } else
+	sym->tag[0] = '\0';
 
-  // other fields
-  sym->def_line = def_line;
-  sym->n_references = 0;
-  sym->obj = obj;
+    // other fields
+    sym->def_line = def_line;
+    sym->n_references = 0;
+    sym->obj = obj;
 
-  // push onto hash table list
-  sym->next = sym_tab->head[index];
-  sym_tab->head[index] = sym;
+    // push onto hash table list
+    sym->next = sym_tab->head[index];
+    sym_tab->head[index] = sym;
 
-  return sym;
+    return sym;
 }
-
diff --git a/symbol.h b/symbol.h
index 0d2c22b..5809a9a 100644
--- a/symbol.h
+++ b/symbol.h
@@ -26,67 +26,65 @@ http://www.gnu.org/copyleft */
 
 typedef char SYMBOL_NAME[32];
 
-typedef struct symbol_t
-{
-  struct symbol_t *next;
-  SYMBOL_NAME name, tag;
-  SRC_LINE def_line;
-  int n_references;
-  OBJECT *obj;
-}
-SYMBOL;
+typedef struct symbol_t {
+    struct symbol_t *next;
+    SYMBOL_NAME name, tag;
+    SRC_LINE def_line;
+    int n_references;
+    OBJECT *obj;
+} SYMBOL;
 
 #define SYMBOL_HASH_SIZE  79
 
-typedef struct symbol_table_t
-{
-  struct symbol_table_t *enclosing;
-  SYMBOL *head[SYMBOL_HASH_SIZE];
-}
-SYMBOL_TABLE;
+typedef struct symbol_table_t {
+    struct symbol_table_t *enclosing;
+    SYMBOL *head[SYMBOL_HASH_SIZE];
+} SYMBOL_TABLE;
 
 // chain a new scope onto an existing symbol table (or NULL)
 // and return the new table
-SYMBOL_TABLE *new_scope (SYMBOL_TABLE * sym_tab);
+SYMBOL_TABLE *new_scope(SYMBOL_TABLE * sym_tab);
 
 // unchain the inner scope from an existing symbol table
 // and return the next outer scope or NULL if this was
 // the outermost scope
-SYMBOL_TABLE *old_scope (SYMBOL_TABLE * sym_tab);
+SYMBOL_TABLE *old_scope(SYMBOL_TABLE * sym_tab);
 
 // look up a symbol of the given name in all the scopes of the
 // provided symbol table
-SYMBOL *lookup (SYMBOL_TABLE * sym_tab, char *name);
+SYMBOL *lookup(SYMBOL_TABLE * sym_tab, char *name);
 
 // look up a symbol with type checking and value extraction
-void look_up_tag (SYMBOL_TABLE * sym_tab, int *exists_p, SRC_LINE line,
+void look_up_tag(SYMBOL_TABLE * sym_tab, int *exists_p, SRC_LINE line,
+		 char *name);
+void look_up_opts(SYMBOL_TABLE * sym_tab, OPTS ** opts, SRC_LINE line,
 		  char *name);
-void look_up_opts (SYMBOL_TABLE * sym_tab, OPTS ** opts, SRC_LINE line,
+void look_up_scalar(SYMBOL_TABLE * sym_tab, FLOAT * r, SRC_LINE line,
+		    char *name);
+void look_up_point(SYMBOL_TABLE * sym_tab, POINT_3D r, SRC_LINE line,
 		   char *name);
-void look_up_scalar (SYMBOL_TABLE * sym_tab, FLOAT * r, SRC_LINE line,
-		     char *name);
-void look_up_point (SYMBOL_TABLE * sym_tab, POINT_3D r, SRC_LINE line,
+void look_up_vector(SYMBOL_TABLE * sym_tab, VECTOR_3D r, SRC_LINE line,
 		    char *name);
-void look_up_vector (SYMBOL_TABLE * sym_tab, VECTOR_3D r, SRC_LINE line,
-		     char *name);
-void look_up_transform (SYMBOL_TABLE * sym_tab, TRANSFORM r, SRC_LINE line,
-			char *name);
-void look_up_drawable (SYMBOL_TABLE * sym_tab, OBJECT ** r, SRC_LINE line,
+void look_up_transform(SYMBOL_TABLE * sym_tab, TRANSFORM r, SRC_LINE line,
 		       char *name);
+void look_up_drawable(SYMBOL_TABLE * sym_tab, OBJECT ** r, SRC_LINE line,
+		      char *name);
+void look_up_vector_or_opts(SYMBOL_TABLE * sym_tab, OBJECT ** r,
+			    SRC_LINE line, char *name);
 
 // predicated for tag existence; raises error if not
-int tag_exists_p (SYMBOL_TABLE * sym_tab, char *name);
+int tag_exists_p(SYMBOL_TABLE * sym_tab, char *name);
 
 // insert a given name in the symbol table
-SYMBOL *new_symbol (SYMBOL_TABLE * sym_tab, char *name, char *tag,
-		    OBJECT * obj, SRC_LINE def_line);
-OBJECT *remove_symbol (SYMBOL_TABLE * sym_tab, char *name, SRC_LINE line);
+SYMBOL *new_symbol(SYMBOL_TABLE * sym_tab, char *name, char *tag,
+		   OBJECT * obj, SRC_LINE def_line);
+OBJECT *remove_symbol(SYMBOL_TABLE * sym_tab, char *name, SRC_LINE line);
 
 // look up the name, which must be an option
 // if the lookup succeeds, append the option to options at *r (creating a new raw option
 // structure in the case where *r is null)
 // return the options *r
-OPTS *
-look_up_and_append_to_opts(SYMBOL_TABLE * sym_tab, OPTS ** r, SRC_LINE line, char *name);
+OPTS *look_up_and_append_to_opts(SYMBOL_TABLE * sym_tab, OPTS ** r,
+				 SRC_LINE line, char *name);
 
 #endif
diff --git a/updates.htm b/updates.htm
index 88faadc..68ac953 100644
--- a/updates.htm
+++ b/updates.htm
@@ -6,9 +6,18 @@
 <body>
 <h1>Sketch Update Log</h1>
 <ul>
+<li>Version 0.3 (build 2, Sun Feb  6 13:50:26 2011) Sun Feb  6 13:50:39 2011:
+<br>    Fixed a typo in the manual - extra {} in description of special arg options.
+<br>    Used a more recent version of indent to clean up macro confusion. Back to K&R style.
+</li>
+<li>Version 0.3 (build 1, Sat Jan 29 21:39:53 2011) Sat Jan 29 22:05:01 2011:
+<br>    Added new special argument substitution options.  Thanks to Don for the suggestion.
+<br>    Fixed a bug where duplicate error messages could be emitted for bad special args.
+</li>
 <li>Version 0.2 (build 187, Fri Dec 17 23:57:13 2010) Sat Dec 18 12:21:11 2010:
 <br>    Fixed bug where over/underlay polygons did not receive fillstyle=solid automatically
-<br>      as do polygons with lay=in.  All polygon fills are how handled similarly.</li>
+<br>      as do polygons with lay=in.  All polygon fills are how handled similarly.
+</li>
 <li>Version 0.2 (build 183, Mon Aug  9 23:18:38 2010) Mon Aug  9 23:23:11 2010:
 <br>    Fixed one more case where [lay=under] and [lay=over] object order was reversed with
 <br>      respect to the input: simple blocks.
diff --git a/version.dat b/version.dat
index 207570d..a6ac57b 100644
--- a/version.dat
+++ b/version.dat
@@ -1,5 +1,5 @@
-minor = 2
+minor = 3
 major = 0
-build = 187
-time = 1292648233
+build = 2
+time = 1297018226
 dist=1
diff --git a/version.h b/version.h
index 40ba98a..d5665ff 100644
--- a/version.h
+++ b/version.h
@@ -1,11 +1,11 @@
 // Produced by makever.pl.  Don't edit.
 #define VER_MAJOR 0
-#define VER_MINOR 2
-#define VER_BUILD 187
-#define VER_BUILD_TIME 1292648233
+#define VER_MINOR 3
+#define VER_BUILD 2
+#define VER_BUILD_TIME 1297018226
 #ifndef STRINGIFY
 #define ___S(X) #X
 #define STRINGIFY(X) ___S(X)
 #endif
-#define VER_BUILD_TIME_STRING STRINGIFY(Fri Dec 17 23:57:13 2010)
+#define VER_BUILD_TIME_STRING STRINGIFY(Sun Feb  6 13:50:26 2011)
 #define VER_STRING STRINGIFY(VER_MAJOR) "." STRINGIFY(VER_MINOR) " (build " STRINGIFY(VER_BUILD) ", " VER_BUILD_TIME_STRING ")"
diff --git a/y.tab.c b/y.tab.c
index c14c99c..99af4ee 100644
--- a/y.tab.c
+++ b/y.tab.c
@@ -382,18 +382,18 @@ union yyalloc
 #endif
 
 /* YYFINAL -- State number of the termination state. */
-#define YYFINAL  32
+#define YYFINAL  33
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   589
+#define YYLAST   599
 
 /* YYNTOKENS -- Number of terminals. */
 #define YYNTOKENS  60
 /* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  35
+#define YYNNTS  40
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  110
+#define YYNRULES  119
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  254
+#define YYNSTATES  263
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -447,14 +447,14 @@ static const unsigned short int yyprhs[] =
       30,    33,    35,    38,    41,    43,    46,    48,    50,    53,
       54,    56,    58,    62,    63,    65,    68,    70,    72,    74,
       78,    82,    86,    91,    95,    97,    99,   101,   105,   109,
-     113,   117,   127,   137,   145,   151,   155,   158,   160,   161,
-     162,   168,   170,   171,   175,   177,   179,   181,   185,   186,
-     188,   191,   193,   195,   199,   201,   203,   205,   207,   209,
-     213,   217,   221,   225,   229,   233,   237,   240,   244,   248,
-     252,   256,   260,   264,   270,   273,   275,   277,   279,   287,
-     293,   295,   297,   305,   311,   313,   315,   354,   358,   364,
-     372,   376,   380,   383,   387,   391,   399,   405,   409,   413,
-     415
+     113,   117,   127,   137,   145,   151,   154,   156,   157,   158,
+     164,   166,   167,   171,   173,   175,   177,   181,   182,   184,
+     187,   189,   191,   194,   195,   197,   199,   201,   203,   205,
+     207,   211,   213,   215,   217,   219,   221,   225,   229,   233,
+     237,   241,   245,   249,   252,   256,   260,   264,   268,   272,
+     276,   282,   285,   287,   289,   291,   299,   305,   307,   309,
+     311,   313,   321,   327,   329,   331,   370,   374,   380,   388,
+     392,   396,   399,   403,   407,   415,   421,   425,   429,   431
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
@@ -462,63 +462,65 @@ static const yysigned_char yyrhs[] =
 {
       61,     0,    -1,    70,    62,    -1,    35,    52,    63,    53,
       -1,    -1,    63,    64,    -1,    64,    -1,    36,    10,    -1,
-      37,    54,    88,    55,    -1,    37,    69,    89,    89,    -1,
-      39,    94,    -1,    38,    -1,    38,    10,    -1,    40,    65,
+      37,    54,    91,    55,    -1,    37,    69,    92,    92,    -1,
+      39,    99,    -1,    38,    -1,    38,    10,    -1,    40,    65,
       -1,    73,    -1,    66,    67,    -1,    41,    -1,    42,    -1,
-      56,    68,    -1,    -1,    43,    -1,    44,    -1,    54,    88,
+      56,    68,    -1,    -1,    43,    -1,    44,    -1,    54,    91,
       55,    -1,    -1,    71,    -1,    71,    72,    -1,    72,    -1,
       73,    -1,    76,    -1,    14,     3,    75,    -1,    74,    15,
       75,    -1,    14,     3,    15,    -1,    14,     3,     8,    75,
-      -1,    74,     8,    75,    -1,    86,    -1,    76,    -1,    10,
+      -1,    74,     8,    75,    -1,    89,    -1,    76,    -1,    10,
       -1,    16,    81,    82,    -1,    17,    81,    82,    -1,    18,
       81,    82,    -1,    19,    81,    82,    -1,    21,    81,    52,
-      88,    79,    56,    84,    53,    89,    -1,    21,    81,    52,
-      88,    79,    56,    84,    53,    76,    -1,    20,    52,    88,
-      56,    84,    53,    76,    -1,    22,    52,    94,    53,    76,
-      -1,    11,    81,    82,    -1,    11,    81,    -1,     7,    -1,
-      -1,    -1,    52,    77,    70,    78,    53,    -1,    15,    -1,
-      -1,    80,    56,     3,    -1,     3,    -1,    10,    -1,     5,
-      -1,    54,    80,    55,    -1,    -1,    83,    -1,    83,    89,
-      -1,    89,    -1,    85,    -1,    85,    56,    94,    -1,    94,
-      -1,    87,    -1,    89,    -1,    91,    -1,    93,    -1,    86,
-      46,    86,    -1,    86,    45,    86,    -1,    86,    47,    86,
-      -1,    86,    48,    86,    -1,    86,    49,    86,    -1,    86,
-      13,    86,    -1,    57,    86,    57,    -1,    45,    86,    -1,
-      86,    51,    86,    -1,    58,    86,    59,    -1,    33,    86,
-      59,    -1,    29,    86,    59,    -1,    30,    86,    59,    -1,
-      31,    86,    59,    -1,    32,    86,    56,    86,    59,    -1,
-      86,    12,    -1,     9,    -1,     3,    -1,    86,    -1,    58,
-      88,    56,    88,    56,    88,    59,    -1,    58,    88,    56,
-      88,    59,    -1,     4,    -1,    86,    -1,    54,    88,    56,
-      88,    56,    88,    55,    -1,    54,    88,    56,    88,    55,
-      -1,     5,    -1,    86,    -1,    54,    54,    88,    56,    88,
-      56,    88,    56,    88,    55,    54,    88,    56,    88,    56,
-      88,    56,    88,    55,    54,    88,    56,    88,    56,    88,
-      56,    88,    55,    54,    88,    56,    88,    56,    88,    56,
-      88,    55,    55,    -1,    24,    88,    59,    -1,    24,    88,
-      56,    86,    59,    -1,    24,    88,    56,    90,    56,    92,
-      59,    -1,    23,    92,    59,    -1,    25,    86,    59,    -1,
-      26,    59,    -1,    26,    88,    59,    -1,    27,    88,    59,
-      -1,    28,    90,    56,    86,    56,    92,    59,    -1,    28,
-      90,    56,    86,    59,    -1,    28,    90,    59,    -1,    34,
-      94,    59,    -1,     6,    -1,    86,    -1
+      91,    79,    56,    87,    53,    92,    -1,    21,    81,    52,
+      91,    79,    56,    87,    53,    76,    -1,    20,    52,    91,
+      56,    87,    53,    76,    -1,    22,    52,    99,    53,    76,
+      -1,    11,    84,    -1,     7,    -1,    -1,    -1,    52,    77,
+      70,    78,    53,    -1,    15,    -1,    -1,    80,    56,     3,
+      -1,     3,    -1,    10,    -1,     5,    -1,    54,    80,    55,
+      -1,    -1,    83,    -1,    83,    92,    -1,    92,    -1,    85,
+      -1,    85,    86,    -1,    -1,    90,    -1,    92,    -1,    95,
+      -1,    10,    -1,     5,    -1,    88,    -1,    88,    56,    99,
+      -1,    99,    -1,    90,    -1,    92,    -1,    94,    -1,    98,
+      -1,    89,    46,    89,    -1,    89,    45,    89,    -1,    89,
+      47,    89,    -1,    89,    48,    89,    -1,    89,    49,    89,
+      -1,    89,    13,    89,    -1,    57,    89,    57,    -1,    45,
+      89,    -1,    89,    51,    89,    -1,    58,    89,    59,    -1,
+      33,    89,    59,    -1,    29,    89,    59,    -1,    30,    89,
+      59,    -1,    31,    89,    59,    -1,    32,    89,    56,    89,
+      59,    -1,    89,    12,    -1,     9,    -1,     3,    -1,    89,
+      -1,    58,    91,    56,    91,    56,    91,    59,    -1,    58,
+      91,    56,    91,    59,    -1,     4,    -1,    89,    -1,    95,
+      -1,    96,    -1,    54,    91,    56,    91,    56,    91,    55,
+      -1,    54,    91,    56,    91,    55,    -1,     5,    -1,    89,
+      -1,    54,    54,    91,    56,    91,    56,    91,    56,    91,
+      55,    54,    91,    56,    91,    56,    91,    56,    91,    55,
+      54,    91,    56,    91,    56,    91,    56,    91,    55,    54,
+      91,    56,    91,    56,    91,    56,    91,    55,    55,    -1,
+      24,    91,    59,    -1,    24,    91,    56,    89,    59,    -1,
+      24,    91,    56,    93,    56,    97,    59,    -1,    23,    97,
+      59,    -1,    25,    89,    59,    -1,    26,    59,    -1,    26,
+      91,    59,    -1,    27,    91,    59,    -1,    28,    93,    56,
+      89,    56,    97,    59,    -1,    28,    93,    56,    89,    59,
+      -1,    28,    93,    59,    -1,    34,    99,    59,    -1,     6,
+      -1,    89,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short int yyrline[] =
 {
-       0,   104,   104,   107,   108,   111,   112,   115,   119,   123,
-     128,   132,   136,   140,   144,   147,   150,   151,   154,   155,
-     158,   159,   162,   163,   166,   169,   170,   173,   174,   178,
-     179,   180,   183,   184,   187,   188,   189,   192,   193,   194,
-     195,   196,   200,   204,   208,   209,   210,   211,   212,   213,
-     212,   222,   223,   226,   230,   237,   238,   239,   240,   243,
-     246,   247,   250,   253,   254,   257,   258,   259,   260,   261,
-     262,   263,   264,   265,   266,   267,   268,   269,   270,   271,
-     272,   273,   274,   275,   276,   279,   280,   283,   286,   290,
-     294,   297,   300,   304,   308,   310,   313,   325,   329,   339,
-     343,   347,   364,   365,   366,   367,   377,   387,   392,   393,
-     396
+       0,   105,   105,   108,   109,   112,   113,   116,   120,   124,
+     129,   133,   137,   141,   145,   148,   151,   152,   155,   156,
+     159,   160,   163,   164,   167,   170,   171,   174,   175,   179,
+     180,   181,   184,   185,   188,   189,   190,   193,   194,   195,
+     196,   197,   201,   205,   209,   210,   211,   212,   213,   212,
+     222,   223,   226,   230,   237,   238,   239,   240,   243,   246,
+     247,   250,   253,   254,   257,   258,   259,   260,   261,   264,
+     267,   268,   271,   272,   273,   274,   275,   276,   277,   278,
+     279,   280,   281,   282,   283,   284,   285,   286,   287,   288,
+     289,   290,   293,   294,   297,   300,   304,   308,   311,   314,
+     315,   318,   322,   328,   331,   334,   346,   350,   360,   364,
+     368,   385,   386,   387,   388,   398,   408,   413,   414,   417
 };
 #endif
 
@@ -540,8 +542,10 @@ static const char *const yytname[] =
   "macro_package", "opt_baseline", "defs_and_decls", "rev_defs_and_decls",
   "def_or_decl", "def", "tagged_defs", "defable", "decl", "@1", "@2",
   "opt_star", "option_id_list", "options", "points", "rev_points",
-  "transforms", "rev_transforms", "expr", "scalar", "scalar_expr", "point",
-  "point_expr", "vector", "vector_expr", "transform", "transform_expr", 0
+  "special_args", "rev_special_args", "special_arg", "transforms",
+  "rev_transforms", "expr", "scalar", "scalar_expr", "point", "point_expr",
+  "vector", "vector_literal", "vector_id", "vector_expr", "transform",
+  "transform_expr", 0
 };
 #endif
 
@@ -566,14 +570,14 @@ static const unsigned char yyr1[] =
       64,    64,    64,    64,    64,    65,    66,    66,    67,    67,
       68,    68,    69,    69,    70,    71,    71,    72,    72,    73,
       73,    73,    74,    74,    75,    75,    75,    76,    76,    76,
-      76,    76,    76,    76,    76,    76,    76,    76,    77,    78,
-      76,    79,    79,    80,    80,    81,    81,    81,    81,    82,
-      83,    83,    84,    85,    85,    86,    86,    86,    86,    86,
-      86,    86,    86,    86,    86,    86,    86,    86,    86,    86,
-      86,    86,    86,    86,    86,    87,    87,    88,    89,    89,
-      89,    90,    91,    91,    91,    92,    93,    93,    93,    93,
-      93,    93,    93,    93,    93,    93,    93,    93,    93,    93,
-      94
+      76,    76,    76,    76,    76,    76,    76,    77,    78,    76,
+      79,    79,    80,    80,    81,    81,    81,    81,    82,    83,
+      83,    84,    85,    85,    86,    86,    86,    86,    86,    87,
+      88,    88,    89,    89,    89,    89,    89,    89,    89,    89,
+      89,    89,    89,    89,    89,    89,    89,    89,    89,    89,
+      89,    89,    90,    90,    91,    92,    92,    92,    93,    94,
+      94,    95,    95,    96,    97,    98,    98,    98,    98,    98,
+      98,    98,    98,    98,    98,    98,    98,    98,    98,    99
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -583,14 +587,14 @@ static const unsigned char yyr2[] =
        2,     1,     2,     2,     1,     2,     1,     1,     2,     0,
        1,     1,     3,     0,     1,     2,     1,     1,     1,     3,
        3,     3,     4,     3,     1,     1,     1,     3,     3,     3,
-       3,     9,     9,     7,     5,     3,     2,     1,     0,     0,
-       5,     1,     0,     3,     1,     1,     1,     3,     0,     1,
-       2,     1,     1,     3,     1,     1,     1,     1,     1,     3,
-       3,     3,     3,     3,     3,     3,     2,     3,     3,     3,
-       3,     3,     3,     5,     2,     1,     1,     1,     7,     5,
-       1,     1,     7,     5,     1,     1,    38,     3,     5,     7,
-       3,     3,     2,     3,     3,     7,     5,     3,     3,     1,
-       1
+       3,     9,     9,     7,     5,     2,     1,     0,     0,     5,
+       1,     0,     3,     1,     1,     1,     3,     0,     1,     2,
+       1,     1,     2,     0,     1,     1,     1,     1,     1,     1,
+       3,     1,     1,     1,     1,     1,     3,     3,     3,     3,
+       3,     3,     3,     2,     3,     3,     3,     3,     3,     3,
+       5,     2,     1,     1,     1,     7,     5,     1,     1,     1,
+       1,     7,     5,     1,     1,    38,     3,     5,     7,     3,
+       3,     2,     3,     3,     7,     5,     3,     3,     1,     1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -598,83 +602,85 @@ static const unsigned char yyr2[] =
    means the default is an error.  */
 static const unsigned char yydefact[] =
 {
-       0,    47,    58,     0,    58,    58,    58,    58,     0,    58,
-       0,    48,     0,     4,    24,    26,    27,     0,    28,    56,
-      55,     0,    46,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     1,     0,     2,    25,     0,     0,    54,     0,
-      90,     0,    45,    59,    61,    86,    94,   109,     0,    85,
-      36,    31,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    29,    35,
-      34,    65,    66,    67,    68,    37,    38,    39,    40,    87,
-       0,     0,   110,     0,    49,     0,    33,    30,    57,     0,
-       0,    60,    32,    95,     0,     0,     0,   102,     0,     0,
-      91,     0,     0,     0,     0,     0,     0,     0,    76,     0,
-       0,     0,    87,    84,     0,     0,     0,     0,     0,     0,
-       0,     0,    52,     0,     0,     0,    23,    11,     0,     0,
-       0,     6,    14,    53,     0,   100,     0,    97,   101,   103,
-     104,     0,   107,    80,    81,    82,     0,    79,   108,     0,
-       0,    75,    78,    74,    70,    69,    71,    72,    73,    77,
-       0,    62,    64,    51,     0,    44,    50,     7,     0,     0,
-      12,    10,    16,    17,    13,    19,     3,     5,     0,    91,
+       0,    46,    63,     0,    57,    57,    57,    57,     0,    57,
+       0,    47,     0,     4,    24,    26,    27,     0,    28,    45,
+      61,     0,    55,    54,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     1,     0,     2,    25,     0,     0,    93,
+      97,    68,    92,    67,     0,     0,    62,    64,    65,    66,
+     103,   118,     0,    36,    31,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    15,     0,    89,    98,     0,     0,   106,    83,     0,
-      93,     0,    43,    63,     0,     8,     9,    20,    21,    18,
-       0,     0,     0,     0,     0,     0,    88,    99,   105,     0,
-      92,    42,    41,     0,     0,     0,     0,     0,     0,     0,
+       0,    29,    35,    34,    72,    73,    74,    99,   100,    75,
+      53,     0,    37,    58,    60,    38,    39,    40,    94,     0,
+       0,   119,     0,    48,     0,    33,    30,     0,     0,    32,
+     104,     0,     0,     0,   111,     0,     0,    98,     0,     0,
+       0,     0,     0,     0,     0,    83,     0,     0,    94,    91,
+       0,     0,     0,     0,     0,     0,     0,    56,     0,    59,
+       0,    51,     0,     0,     0,    23,    11,     0,     0,     0,
+       6,    14,     0,     0,   109,     0,   106,   110,   112,   113,
+       0,   116,    87,    88,    89,     0,    86,   117,     0,    82,
+      85,    81,    77,    76,    78,    79,    80,    84,    52,     0,
+      69,    71,    50,     0,    44,    49,     7,     0,     0,    12,
+      10,    16,    17,    13,    19,     3,     5,     0,     0,    98,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      15,   102,     0,     0,    96,   107,     0,     0,   115,    90,
+       0,    43,    70,     0,     8,     9,    20,    21,    18,     0,
+       0,     0,     0,     0,     0,   101,    95,   108,   114,     0,
+      42,    41,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    96
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   105
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
 static const short int yydefgoto[] =
 {
-      -1,    12,    34,   130,   131,   174,   175,   191,   209,   169,
-      13,    14,    15,    16,    17,    68,    69,    31,   124,   164,
-      39,    22,    42,    43,   160,   161,    79,    71,    90,    72,
-     101,    73,    94,    74,   162
+      -1,    12,    35,   139,   140,   183,   184,   200,   218,   178,
+      13,    14,    15,    16,    17,    71,    72,    32,   133,   173,
+      81,    25,    82,    83,    19,    20,    46,   169,   170,    88,
+      74,    97,    75,   108,    76,    77,    78,   101,    79,   171
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -94
+#define YYPACT_NINF -78
 static const short int yypact[] =
 {
-     520,   -94,     3,    21,     3,     3,     3,     3,   -35,     3,
-     -26,   -94,    35,    11,   520,   -94,   -94,     6,   -94,   -94,
-     -94,    49,    15,   255,    15,    15,    15,    15,    84,   -14,
-      84,   520,   -94,    30,   -94,   -94,   323,   323,   -94,    -5,
-     -94,    84,   -94,    15,   -94,   -94,   -94,   -94,   323,   -94,
-     -94,   -94,    84,    84,    84,    38,    84,    84,    84,    84,
-      84,    84,    84,    84,    84,   379,    84,    84,   -94,   -94,
-     346,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   346,
-      48,    84,   346,     5,   -94,   210,   -94,   -94,   -94,    83,
-      63,   -94,   -94,   346,    32,   -41,   111,   -94,    61,    62,
-     346,   -20,   133,   406,   426,   533,   433,    67,    -2,   379,
-      72,   516,   448,   -94,    84,    84,    84,    84,    84,    84,
-      84,    84,    79,   536,    77,   121,    78,   151,    84,    14,
-     113,   -94,   -94,   -94,    84,   -94,    84,   -94,   -94,   -94,
-     -94,    84,   -94,   -94,   -94,   -94,    84,   -94,   -94,    87,
-      84,   -94,   -94,   346,   142,   142,    -2,    -2,    -2,    -2,
-     112,   115,   -94,   -94,   116,   -94,   -94,   -94,    84,    15,
-     -94,   -94,   -94,   -94,   -94,   118,   -94,   -94,   -11,   457,
-     119,    88,   474,    84,     4,   536,    84,    84,   114,    15,
-      36,   -94,    84,   -94,   -94,    84,    84,   -94,   -94,    29,
-     -94,    84,   -94,   -94,   123,    16,   -94,   -94,   -94,   -94,
-     108,   124,   127,    84,   122,   410,   -94,   -94,   -94,    43,
-     -94,   -94,   -94,    84,   141,   134,    84,   143,    84,   147,
-      84,   149,    84,   155,   152,    84,   156,    84,   163,    84,
-     165,    84,   168,   171,    84,   172,    84,   173,    84,   175,
-      84,   179,   188,   -94
+     226,   -78,   -78,     4,    26,    26,    26,    26,   -47,    26,
+     -31,   -78,    38,    -9,   226,   -78,   -78,    50,   -78,   -78,
+       9,   283,   -78,   -78,    37,    -2,    -2,    -2,    -2,    66,
+       5,    66,   226,   -78,    16,   -78,   -78,   357,   357,   -78,
+     -78,   -78,   -78,   -78,    66,    66,   -78,   -78,   -78,   -78,
+     -78,   -78,   357,   -78,   -78,    66,    66,    66,    19,    66,
+      66,    66,    66,    66,    66,    66,    66,    66,   112,    66,
+      66,   -78,   -78,   548,   -78,   -78,   -78,   -78,   -78,   -78,
+     -78,    -1,   -78,    -2,   -78,   -78,   -78,   -78,   548,    18,
+      66,   548,    28,   -78,    89,   -78,   -78,    48,    56,   -78,
+     548,    75,   -24,   400,   -78,    88,    90,   548,   -22,   407,
+     422,   429,   534,   448,   108,     8,   112,   518,   470,   -78,
+      66,    66,    66,    66,    66,    66,    66,   -78,   168,   -78,
+      66,   157,   537,   130,   174,   131,   176,    66,    60,    69,
+     -78,   -78,    66,    66,   -78,    66,   -78,   -78,   -78,   -78,
+      66,   -78,   -78,   -78,   -78,    66,   -78,   -78,   140,   -78,
+     -78,   548,   107,   107,     8,     8,     8,     8,   -78,   144,
+     142,   -78,   -78,   143,   -78,   -78,   -78,    66,    -2,   -78,
+     -78,   -78,   -78,   -78,   145,   -78,   -78,    97,    23,   477,
+     146,   380,   492,    66,   537,    66,    66,   149,    -2,   116,
+     -78,   -78,    66,    66,   -78,   -78,    66,    66,   -78,   -78,
+     121,   -78,   -78,   147,     2,   -78,   -78,   -78,   -78,   150,
+     152,   154,   155,    66,   171,   -78,   -78,   -78,   -78,   124,
+     -78,   -78,    66,   161,   164,    66,   153,    66,   175,    66,
+     178,    66,   165,   173,    66,   179,    66,   180,    66,   185,
+      66,   194,   196,    66,   195,    66,   198,    66,   199,    66,
+     197,   202,   -78
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const short int yypgoto[] =
 {
-     -94,   -94,   -94,   -94,    97,   -94,   -94,   -94,   -94,   -94,
-     166,   -94,   219,   -76,   -94,   -25,     2,   -94,   -94,   -94,
-     -94,    25,    51,   -94,    64,   -94,   178,   -94,   -28,   -21,
-     117,   -94,   -93,   -94,   -23
+     -78,   -78,   -78,   -78,   120,   -78,   -78,   -78,   -78,   -78,
+     228,   -78,   255,   -77,   -78,   113,     1,   -78,   -78,   -78,
+     -78,    79,   104,   -78,   -78,   -78,   -78,    76,   -78,   201,
+     253,   -29,   -17,   129,   -78,   256,   -78,   -44,   -78,   -27
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -684,128 +690,130 @@ static const short int yypgoto[] =
 #define YYTABLE_NINF -23
 static const short int yytable[] =
 {
-      80,    44,    18,    44,    44,    44,    44,    83,    19,   132,
-     113,    86,    87,    20,    36,   136,    18,    28,   137,    40,
-     -22,    37,    91,    92,    23,    95,    30,    98,    99,    24,
-      25,    26,    27,    18,    29,    32,   141,   110,    81,   142,
-     107,    45,    40,    46,    47,   192,    33,    49,   193,   120,
-      88,    89,    38,   122,   132,   172,   173,    21,   123,   200,
-     201,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    41,   -22,    75,    76,    77,    78,   207,
-     208,   149,    85,    64,   200,   213,   133,    45,    40,    46,
-      47,   135,    65,    49,   163,    66,    67,    97,   220,   223,
-     113,   114,   211,   212,   121,   171,   178,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,   134,
-     139,   140,   184,   113,   114,   165,   148,     3,   150,    64,
-     166,   167,   168,   115,   116,   117,   118,   119,    65,   120,
-     188,    66,    67,   183,   196,   113,   114,   197,   189,   125,
-     126,   127,   128,   129,   113,   199,   115,   116,   117,   118,
-     119,   170,   120,   203,   210,   185,   176,   216,   206,   205,
-     138,   186,   187,   214,   190,   195,   215,   220,   115,   116,
-     117,   118,   119,   217,   120,   219,   218,   202,   226,   117,
-     118,   119,   143,   120,   222,   224,   225,    84,   227,   228,
-     229,    70,   231,   230,   233,   232,   235,   236,    82,   238,
-     234,   240,   237,   242,    70,    70,   245,   221,   247,   239,
-     249,   241,   251,   243,     3,   244,    70,   177,   246,   248,
-      93,   250,    96,    35,   252,   100,   102,   103,   104,   105,
-     106,    82,   108,   253,   111,   112,   125,   126,   127,   128,
-     129,   204,     0,   180,     0,     0,     0,     0,    45,    40,
-      46,    47,     1,    48,    49,    50,     2,     0,     0,     0,
-      51,     4,     5,     6,     7,     8,     9,    10,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-       0,     0,   153,   154,   155,   156,   157,   158,   159,    82,
-      64,     0,     0,     0,     0,     0,    82,    11,     0,    65,
-       0,     0,    66,    67,   179,     0,     0,     0,     0,   181,
-       0,     0,     0,     0,   182,     0,    45,    40,    46,    47,
-       1,     0,    49,    50,     2,     0,     0,     0,     0,     4,
-       5,     6,     7,     8,     9,    10,    52,    53,    54,    55,
-      56,    57,    58,    59,    60,    61,    62,    63,   113,   114,
-       0,     0,     0,     0,    82,    82,     0,     0,    64,     0,
-       0,     0,     0,    93,    93,    11,     0,    65,     0,     0,
-      66,    67,    45,    40,    46,    47,     0,     0,    49,     0,
-       0,   115,   116,   117,   118,   119,     0,   120,     0,     0,
-       0,     0,    52,    53,    54,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    40,     0,     0,     1,   113,   114,
-       0,     2,     0,     0,    64,     0,     4,     5,     6,     7,
-       8,     9,    10,   109,     0,     0,    66,    67,   113,   114,
-       0,     0,     0,     0,     0,   113,   114,     0,     0,     0,
-       0,   115,   116,   117,   118,   119,     0,   120,     0,     0,
-     113,   114,    11,     0,     0,   144,     0,     0,    41,   113,
-     114,   115,   116,   117,   118,   119,     0,   120,   115,   116,
-     117,   118,   119,     0,   120,   145,   113,   114,     0,     0,
-       0,     0,   147,   115,   116,   117,   118,   119,     0,   120,
-       0,     0,   115,   116,   117,   118,   119,   152,   120,     0,
-       0,     0,     0,     0,     0,     0,   194,     0,     0,   115,
-     116,   117,   118,   119,     0,   120,     0,     1,   113,   114,
-       0,     2,     0,   198,     3,     0,     4,     5,     6,     7,
-       8,     9,    10,     1,     0,   113,   114,     2,     0,     0,
-       0,     0,     4,     5,     6,     7,     8,     9,    10,     0,
-       0,   115,   116,   117,   118,   119,     0,   120,     0,     0,
-       0,     0,    11,   151,     0,     0,     0,     0,   115,   116,
-     117,   118,   119,     0,   120,     0,     0,     0,    11,   146
+      89,    18,    40,    48,    92,    29,   -22,    21,    84,    84,
+      84,    84,    39,    40,    41,    18,    98,   141,    42,    43,
+     119,    31,    39,    40,    50,    51,    34,   102,    42,   105,
+     106,    22,   145,    18,   150,   146,    23,   151,    33,   114,
+      80,    98,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,   127,   128,    45,    90,    37,   126,
+     -22,   131,   141,    44,    67,    38,   129,    45,    94,    39,
+      40,    50,    51,    68,   130,    42,    69,    70,   104,   203,
+      24,   132,   204,     3,    26,    27,    28,   158,    30,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,   181,   182,     3,   142,   134,   135,   136,   137,   138,
+     180,    67,   143,   187,   188,    39,    40,    50,    51,   119,
+      68,    42,   185,    69,    70,   134,   135,   136,   137,   138,
+      85,    86,    87,   174,   144,    55,    56,    57,    58,    59,
+      60,    61,    62,    63,    64,    65,    66,   148,   197,   149,
+      95,    96,   201,   202,   123,   124,   125,    67,   126,   216,
+     217,   198,   221,   222,   210,    99,   116,   157,   212,    69,
+      70,   168,   172,   219,   220,    40,   201,   223,     1,   225,
+     232,   215,     2,   175,   176,   177,   179,     4,     5,     6,
+       7,     8,     9,    10,   229,   211,   193,   194,   195,   196,
+     224,   199,   206,   233,   214,   225,   236,   231,   238,   237,
+     240,   226,   242,   227,   228,   245,   234,   247,   235,   249,
+     243,   251,    73,    11,   254,   230,   256,   244,   258,    45,
+     260,   239,    91,     1,   241,   246,   248,     2,    73,    73,
+       3,   250,     4,     5,     6,     7,     8,     9,    10,   252,
+     253,   255,   261,    73,   257,   259,   100,   262,   103,   186,
+      93,   107,   109,   110,   111,   112,   113,    91,   115,    36,
+     117,   118,   213,    47,   190,     0,    49,     0,    11,     0,
+       0,     0,     0,     0,     0,     0,    39,    40,    50,    51,
+       1,    52,    42,    53,     2,     0,     0,     0,    54,     4,
+       5,     6,     7,     8,     9,    10,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,     0,     0,
+       0,   161,   162,   163,   164,   165,   166,   167,    67,     0,
+       0,    91,     0,     0,     0,    11,     0,    68,    91,     0,
+      69,    70,     0,     0,     0,     0,   189,     0,     0,     0,
+       0,   191,     0,     0,     0,     0,   192,     0,     0,     0,
+      39,    40,    50,    51,     1,     0,    42,    53,     2,     0,
+       0,     0,     0,     4,     5,     6,     7,     8,     9,    10,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,   119,   120,     0,     0,    91,    91,     0,     0,
+       0,     0,    67,     0,     0,     0,     0,   100,   100,    11,
+       0,    68,   119,   120,    69,    70,     0,     0,     0,   119,
+     120,     0,     0,     0,     0,   121,   122,   123,   124,   125,
+       0,   126,     0,     0,   119,   120,   207,     0,     0,   208,
+       0,   119,   120,     0,     0,   121,   122,   123,   124,   125,
+       0,   126,   121,   122,   123,   124,   125,     0,   126,   147,
+     119,   120,     0,     0,     0,     0,   152,   121,   122,   123,
+     124,   125,     0,   126,   121,   122,   123,   124,   125,     0,
+     126,   153,   119,   120,     0,     0,     0,     0,   154,   119,
+     120,     0,     0,   121,   122,   123,   124,   125,     0,   126,
+       0,     0,     0,     0,   119,   120,     0,   156,     0,     0,
+       0,     0,     0,     0,     0,   121,   122,   123,   124,   125,
+       0,   126,   121,   122,   123,   124,   125,     0,   126,   160,
+     119,   120,     0,     0,     0,     0,   205,   121,   122,   123,
+     124,   125,     0,   126,     1,     0,   119,   120,     2,     0,
+       0,   209,     0,     4,     5,     6,     7,     8,     9,    10,
+     119,   120,     0,   121,   122,   123,   124,   125,     0,   126,
+       0,     0,     0,     0,     0,   159,     0,     0,     0,   121,
+     122,   123,   124,   125,     0,   126,     0,     0,     0,    11,
+     155,     0,     0,   121,   122,   123,   124,   125,     0,   126
 };
 
 static const short int yycheck[] =
 {
-      28,    22,     0,    24,    25,    26,    27,    30,     5,    85,
-      12,    36,    37,    10,     8,    56,    14,    52,    59,     4,
-       4,    15,    43,    48,     3,    53,    52,    55,    56,     4,
-       5,     6,     7,    31,     9,     0,    56,    65,    52,    59,
-      63,     3,     4,     5,     6,    56,    35,     9,    59,    51,
-      55,    56,     3,    81,   130,    41,    42,    54,    53,    55,
-      56,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    58,    58,    24,    25,    26,    27,    43,
-      44,   109,    52,    45,    55,    56,     3,     3,     4,     5,
-       6,    59,    54,     9,    15,    57,    58,    59,    55,    56,
-      12,    13,   195,   196,    56,   128,   134,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    56,
-      59,    59,   150,    12,    13,   123,    59,    14,    56,    45,
-      53,    10,    54,    45,    46,    47,    48,    49,    54,    51,
-     168,    57,    58,    56,    56,    12,    13,    59,   169,    36,
-      37,    38,    39,    40,    12,   183,    45,    46,    47,    48,
-      49,    10,    51,   186,   192,    53,    53,    59,   189,    55,
-      59,    56,    56,   201,    56,    56,    53,    55,    45,    46,
-      47,    48,    49,    59,    51,   213,    59,   185,    54,    47,
-      48,    49,    59,    51,   215,   223,    55,    31,   226,    56,
-     228,    23,   230,    56,   232,    56,    54,   235,    30,   237,
-      55,   239,    56,   241,    36,    37,   244,   215,   246,    56,
-     248,    56,   250,    55,    14,    54,    48,   130,    56,    56,
-      52,    56,    54,    14,    55,    57,    58,    59,    60,    61,
-      62,    63,    64,    55,    66,    67,    36,    37,    38,    39,
-      40,   187,    -1,   136,    -1,    -1,    -1,    -1,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    -1,    -1,    -1,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      -1,    -1,   114,   115,   116,   117,   118,   119,   120,   121,
-      45,    -1,    -1,    -1,    -1,    -1,   128,    52,    -1,    54,
-      -1,    -1,    57,    58,   136,    -1,    -1,    -1,    -1,   141,
-      -1,    -1,    -1,    -1,   146,    -1,     3,     4,     5,     6,
-       7,    -1,     9,    10,    11,    -1,    -1,    -1,    -1,    16,
+      29,     0,     4,    20,    31,    52,     4,     3,    25,    26,
+      27,    28,     3,     4,     5,    14,    45,    94,     9,    10,
+      12,    52,     3,     4,     5,     6,    35,    56,     9,    58,
+      59,     5,    56,    32,    56,    59,    10,    59,     0,    66,
+       3,    70,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    55,    56,    58,    52,     8,    51,
+      58,    90,   139,    54,    45,    15,    83,    58,    52,     3,
+       4,     5,     6,    54,    56,     9,    57,    58,    59,    56,
+      54,    53,    59,    14,     5,     6,     7,   116,     9,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    41,    42,    14,    56,    36,    37,    38,    39,    40,
+     137,    45,    56,   142,   143,     3,     4,     5,     6,    12,
+      54,     9,    53,    57,    58,    36,    37,    38,    39,    40,
+      26,    27,    28,   132,    59,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    59,   177,    59,
+      37,    38,    55,    56,    47,    48,    49,    45,    51,    43,
+      44,   178,   206,   207,   193,    52,    54,    59,   195,    57,
+      58,     3,    15,   202,   203,     4,    55,    56,     7,    55,
+      56,   198,    11,    53,    10,    54,    10,    16,    17,    18,
+      19,    20,    21,    22,   223,   194,    56,    53,    56,    56,
+      53,    56,    56,   232,    55,    55,   235,   224,   237,    56,
+     239,    59,   241,    59,    59,   244,    55,   246,    54,   248,
+      55,   250,    21,    52,   253,   224,   255,    54,   257,    58,
+     259,    56,    31,     7,    56,    56,    56,    11,    37,    38,
+      14,    56,    16,    17,    18,    19,    20,    21,    22,    55,
+      54,    56,    55,    52,    56,    56,    55,    55,    57,   139,
+      32,    60,    61,    62,    63,    64,    65,    66,    67,    14,
+      69,    70,   196,    20,   145,    -1,    20,    -1,    52,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    -1,    -1,    -1,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    12,    13,
-      -1,    -1,    -1,    -1,   186,   187,    -1,    -1,    45,    -1,
-      -1,    -1,    -1,   195,   196,    52,    -1,    54,    -1,    -1,
-      57,    58,     3,     4,     5,     6,    -1,    -1,     9,    -1,
-      -1,    45,    46,    47,    48,    49,    -1,    51,    -1,    -1,
-      -1,    -1,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,     4,    -1,    -1,     7,    12,    13,
-      -1,    11,    -1,    -1,    45,    -1,    16,    17,    18,    19,
-      20,    21,    22,    54,    -1,    -1,    57,    58,    12,    13,
-      -1,    -1,    -1,    -1,    -1,    12,    13,    -1,    -1,    -1,
-      -1,    45,    46,    47,    48,    49,    -1,    51,    -1,    -1,
-      12,    13,    52,    -1,    -1,    59,    -1,    -1,    58,    12,
-      13,    45,    46,    47,    48,    49,    -1,    51,    45,    46,
-      47,    48,    49,    -1,    51,    59,    12,    13,    -1,    -1,
-      -1,    -1,    59,    45,    46,    47,    48,    49,    -1,    51,
-      -1,    -1,    45,    46,    47,    48,    49,    59,    51,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    59,    -1,    -1,    45,
-      46,    47,    48,    49,    -1,    51,    -1,     7,    12,    13,
-      -1,    11,    -1,    59,    14,    -1,    16,    17,    18,    19,
-      20,    21,    22,     7,    -1,    12,    13,    11,    -1,    -1,
-      -1,    -1,    16,    17,    18,    19,    20,    21,    22,    -1,
-      -1,    45,    46,    47,    48,    49,    -1,    51,    -1,    -1,
-      -1,    -1,    52,    57,    -1,    -1,    -1,    -1,    45,    46,
-      47,    48,    49,    -1,    51,    -1,    -1,    -1,    52,    56
+      27,    28,    29,    30,    31,    32,    33,    34,    -1,    -1,
+      -1,   120,   121,   122,   123,   124,   125,   126,    45,    -1,
+      -1,   130,    -1,    -1,    -1,    52,    -1,    54,   137,    -1,
+      57,    58,    -1,    -1,    -1,    -1,   145,    -1,    -1,    -1,
+      -1,   150,    -1,    -1,    -1,    -1,   155,    -1,    -1,    -1,
+       3,     4,     5,     6,     7,    -1,     9,    10,    11,    -1,
+      -1,    -1,    -1,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    12,    13,    -1,    -1,   195,   196,    -1,    -1,
+      -1,    -1,    45,    -1,    -1,    -1,    -1,   206,   207,    52,
+      -1,    54,    12,    13,    57,    58,    -1,    -1,    -1,    12,
+      13,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,
+      -1,    51,    -1,    -1,    12,    13,    56,    -1,    -1,    59,
+      -1,    12,    13,    -1,    -1,    45,    46,    47,    48,    49,
+      -1,    51,    45,    46,    47,    48,    49,    -1,    51,    59,
+      12,    13,    -1,    -1,    -1,    -1,    59,    45,    46,    47,
+      48,    49,    -1,    51,    45,    46,    47,    48,    49,    -1,
+      51,    59,    12,    13,    -1,    -1,    -1,    -1,    59,    12,
+      13,    -1,    -1,    45,    46,    47,    48,    49,    -1,    51,
+      -1,    -1,    -1,    -1,    12,    13,    -1,    59,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,
+      -1,    51,    45,    46,    47,    48,    49,    -1,    51,    59,
+      12,    13,    -1,    -1,    -1,    -1,    59,    45,    46,    47,
+      48,    49,    -1,    51,     7,    -1,    12,    13,    11,    -1,
+      -1,    59,    -1,    16,    17,    18,    19,    20,    21,    22,
+      12,    13,    -1,    45,    46,    47,    48,    49,    -1,    51,
+      -1,    -1,    -1,    -1,    -1,    57,    -1,    -1,    -1,    45,
+      46,    47,    48,    49,    -1,    51,    -1,    -1,    -1,    52,
+      56,    -1,    -1,    45,    46,    47,    48,    49,    -1,    51
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -813,31 +821,32 @@ static const short int yycheck[] =
 static const unsigned char yystos[] =
 {
        0,     7,    11,    14,    16,    17,    18,    19,    20,    21,
-      22,    52,    61,    70,    71,    72,    73,    74,    76,     5,
-      10,    54,    81,     3,    81,    81,    81,    81,    52,    81,
-      52,    77,     0,    35,    62,    72,     8,    15,     3,    80,
-       4,    58,    82,    83,    89,     3,     5,     6,     8,     9,
-      10,    15,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    45,    54,    57,    58,    75,    76,
-      86,    87,    89,    91,    93,    82,    82,    82,    82,    86,
-      88,    52,    86,    94,    70,    52,    75,    75,    55,    56,
-      88,    89,    75,    86,    92,    88,    86,    59,    88,    88,
-      86,    90,    86,    86,    86,    86,    86,    94,    86,    54,
-      88,    86,    86,    12,    13,    45,    46,    47,    48,    49,
-      51,    56,    88,    53,    78,    36,    37,    38,    39,    40,
-      63,    64,    73,     3,    56,    59,    56,    59,    59,    59,
-      59,    56,    59,    59,    59,    59,    56,    59,    59,    88,
-      56,    57,    59,    86,    86,    86,    86,    86,    86,    86,
-      84,    85,    94,    15,    79,    76,    53,    10,    54,    69,
-      10,    94,    41,    42,    65,    66,    53,    64,    88,    86,
-      90,    86,    86,    56,    88,    53,    56,    56,    88,    89,
-      56,    67,    56,    59,    59,    56,    56,    59,    59,    88,
-      55,    56,    76,    94,    84,    55,    89,    43,    44,    68,
-      88,    92,    92,    56,    88,    53,    59,    59,    59,    88,
-      55,    76,    89,    56,    88,    55,    54,    88,    56,    88,
-      56,    88,    56,    88,    55,    54,    88,    56,    88,    56,
-      88,    56,    88,    55,    54,    88,    56,    88,    56,    88,
-      56,    88,    55,    55
+      22,    52,    61,    70,    71,    72,    73,    74,    76,    84,
+      85,     3,     5,    10,    54,    81,    81,    81,    81,    52,
+      81,    52,    77,     0,    35,    62,    72,     8,    15,     3,
+       4,     5,     9,    10,    54,    58,    86,    90,    92,    95,
+       5,     6,     8,    10,    15,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    45,    54,    57,
+      58,    75,    76,    89,    90,    92,    94,    95,    96,    98,
+       3,    80,    82,    83,    92,    82,    82,    82,    89,    91,
+      52,    89,    99,    70,    52,    75,    75,    91,    91,    75,
+      89,    97,    91,    89,    59,    91,    91,    89,    93,    89,
+      89,    89,    89,    89,    99,    89,    54,    89,    89,    12,
+      13,    45,    46,    47,    48,    49,    51,    55,    56,    92,
+      56,    91,    53,    78,    36,    37,    38,    39,    40,    63,
+      64,    73,    56,    56,    59,    56,    59,    59,    59,    59,
+      56,    59,    59,    59,    59,    56,    59,    59,    91,    57,
+      59,    89,    89,    89,    89,    89,    89,    89,     3,    87,
+      88,    99,    15,    79,    76,    53,    10,    54,    69,    10,
+      99,    41,    42,    65,    66,    53,    64,    91,    91,    89,
+      93,    89,    89,    56,    53,    56,    56,    91,    92,    56,
+      67,    55,    56,    56,    59,    59,    56,    56,    59,    59,
+      91,    76,    99,    87,    55,    92,    43,    44,    68,    91,
+      91,    97,    97,    56,    53,    55,    59,    59,    59,    91,
+      76,    92,    56,    91,    55,    54,    91,    56,    91,    56,
+      91,    56,    91,    55,    54,    91,    56,    91,    56,    91,
+      56,    91,    55,    54,    91,    56,    91,    56,    91,    56,
+      91,    55,    55
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -1507,26 +1516,26 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-#line 104 "sketch.y"
+#line 105 "sketch.y"
     { objects = (yyvsp[-1].obj); }
     break;
 
   case 7:
-#line 116 "sketch.y"
+#line 117 "sketch.y"
     { 
                             set_global_env_opts(global_env, (yyvsp[0].str), line);
                           }
     break;
 
   case 8:
-#line 120 "sketch.y"
+#line 121 "sketch.y"
     { 
                             set_global_baseline(global_env, (yyvsp[-1].flt), line);
                           }
     break;
 
   case 9:
-#line 124 "sketch.y"
+#line 125 "sketch.y"
     { 
                             set_global_baseline(global_env, (yyvsp[-2].flt), line);
                             set_global_env_extent(global_env, (yyvsp[-1].pt), (yyvsp[0].pt), line);
@@ -1534,215 +1543,210 @@ yyreduce:
     break;
 
   case 10:
-#line 129 "sketch.y"
+#line 130 "sketch.y"
     {
                             set_global_env_camera(global_env, (yyvsp[0].xf), line);
                           }
     break;
 
   case 11:
-#line 133 "sketch.y"
+#line 134 "sketch.y"
     { 
                             set_global_env_frame(global_env, NULL, line);
                           }
     break;
 
   case 12:
-#line 137 "sketch.y"
+#line 138 "sketch.y"
     { 
                             set_global_env_frame(global_env, (yyvsp[0].str), line);
                           }
     break;
 
   case 13:
-#line 141 "sketch.y"
+#line 142 "sketch.y"
     {
                             set_global_output_language(global_env, (yyvsp[0].index), line);
 		          }
     break;
 
   case 15:
-#line 147 "sketch.y"
+#line 148 "sketch.y"
     { (yyval.index) = (yyvsp[-1].index) | (yyvsp[0].index); }
     break;
 
   case 16:
-#line 150 "sketch.y"
+#line 151 "sketch.y"
     { (yyval.index) = GEOL_PSTRICKS; }
     break;
 
   case 17:
-#line 151 "sketch.y"
+#line 152 "sketch.y"
     { (yyval.index) = GEOL_TIKZ; }
     break;
 
   case 18:
-#line 154 "sketch.y"
+#line 155 "sketch.y"
     { (yyval.index) = (yyvsp[0].index); }
     break;
 
   case 19:
-#line 155 "sketch.y"
+#line 156 "sketch.y"
     { (yyval.index) = GEOL_LATEX; }
     break;
 
   case 20:
-#line 158 "sketch.y"
+#line 159 "sketch.y"
     { (yyval.index) = GEOL_LATEX; }
     break;
 
   case 21:
-#line 159 "sketch.y"
+#line 160 "sketch.y"
     { (yyval.index) = GEOL_CONTEXT; }
     break;
 
   case 22:
-#line 162 "sketch.y"
+#line 163 "sketch.y"
     { (yyval.flt) = (yyvsp[-1].flt); }
     break;
 
   case 23:
-#line 163 "sketch.y"
+#line 164 "sketch.y"
     { (yyval.flt) = NO_BASELINE; }
     break;
 
   case 24:
-#line 166 "sketch.y"
+#line 167 "sketch.y"
     { (yyval.obj) = sibling_reverse((yyvsp[0].obj)); }
     break;
 
   case 25:
-#line 169 "sketch.y"
+#line 170 "sketch.y"
     { (yyval.obj) = cat_objects(sibling_reverse((yyvsp[0].obj)), (yyvsp[-1].obj)); }
     break;
 
   case 26:
-#line 170 "sketch.y"
+#line 171 "sketch.y"
     { (yyval.obj) = sibling_reverse((yyvsp[0].obj)); }
     break;
 
   case 27:
-#line 173 "sketch.y"
+#line 174 "sketch.y"
     { (yyval.obj) = NULL; }
     break;
 
   case 28:
-#line 174 "sketch.y"
+#line 175 "sketch.y"
     { (yyval.obj) = (yyvsp[0].obj); }
     break;
 
   case 29:
-#line 178 "sketch.y"
+#line 179 "sketch.y"
     { new_symbol(sym_tab, (yyvsp[-1].name), 0, (yyvsp[0].obj), line); }
     break;
 
   case 30:
-#line 179 "sketch.y"
+#line 180 "sketch.y"
     { new_symbol(sym_tab, (yyvsp[-2].name), 0, (yyvsp[0].obj), line); }
     break;
 
   case 31:
-#line 180 "sketch.y"
+#line 181 "sketch.y"
     { new_symbol(sym_tab, (yyvsp[-1].name), 0, new_tag_def(), line); }
     break;
 
   case 32:
-#line 183 "sketch.y"
+#line 184 "sketch.y"
     { strcpy((yyval.name), new_symbol(sym_tab, (yyvsp[-2].name), (yyvsp[-1].name), (yyvsp[0].obj), line) ? "" : (yyvsp[-2].name)); }
     break;
 
   case 33:
-#line 184 "sketch.y"
+#line 185 "sketch.y"
     { strcpy((yyval.name), new_symbol(sym_tab, (yyvsp[-2].name), (yyvsp[-1].name), (yyvsp[0].obj), line) ? "" : (yyvsp[-2].name)); }
     break;
 
   case 34:
-#line 187 "sketch.y"
+#line 188 "sketch.y"
     { (yyval.obj) = object_from_expr(&(yyvsp[0].exv)); }
     break;
 
   case 35:
-#line 188 "sketch.y"
+#line 189 "sketch.y"
     { (yyval.obj) = (yyvsp[0].obj); }
     break;
 
   case 36:
-#line 189 "sketch.y"
+#line 190 "sketch.y"
     { (yyval.obj) = new_opts_def((yyvsp[0].str), line); }
     break;
 
   case 37:
-#line 192 "sketch.y"
+#line 193 "sketch.y"
     { (yyval.obj) = new_dots((yyvsp[-1].opts), (yyvsp[0].obj)); }
     break;
 
   case 38:
-#line 193 "sketch.y"
+#line 194 "sketch.y"
     { (yyval.obj) = new_line((yyvsp[-1].opts), (yyvsp[0].obj)); }
     break;
 
   case 39:
-#line 194 "sketch.y"
+#line 195 "sketch.y"
     { (yyval.obj) = new_curve((yyvsp[-1].opts), (yyvsp[0].obj)); }
     break;
 
   case 40:
-#line 195 "sketch.y"
+#line 196 "sketch.y"
     { (yyval.obj) = new_polygon((yyvsp[-1].opts), (yyvsp[0].obj)); }
     break;
 
   case 41:
-#line 197 "sketch.y"
+#line 198 "sketch.y"
     { 
-						                (yyval.obj) = new_sweep((yyvsp[-7].opts), (yyvsp[-5].flt), (yyvsp[-4].bool), (yyvsp[-2].obj), new_point_def((yyvsp[0].pt)));
-						              }
+                              (yyval.obj) = new_sweep((yyvsp[-7].opts), (yyvsp[-5].flt), (yyvsp[-4].bool), (yyvsp[-2].obj), new_point_def((yyvsp[0].pt)));
+                          }
     break;
 
   case 42:
-#line 201 "sketch.y"
+#line 202 "sketch.y"
     {
-						                (yyval.obj) = new_sweep((yyvsp[-7].opts), (yyvsp[-5].flt), (yyvsp[-4].bool), (yyvsp[-2].obj), (yyvsp[0].obj));
-						              }
+                              (yyval.obj) = new_sweep((yyvsp[-7].opts), (yyvsp[-5].flt), (yyvsp[-4].bool), (yyvsp[-2].obj), (yyvsp[0].obj));
+                          }
     break;
 
   case 43:
-#line 205 "sketch.y"
+#line 206 "sketch.y"
     {
-						                (yyval.obj) = new_repeat((yyvsp[-4].flt), (yyvsp[-2].obj), (yyvsp[0].obj));
-						              }
+                              (yyval.obj) = new_repeat((yyvsp[-4].flt), (yyvsp[-2].obj), (yyvsp[0].obj));
+                          }
     break;
 
   case 44:
-#line 208 "sketch.y"
+#line 209 "sketch.y"
     { (yyval.obj) = new_compound((yyvsp[-2].xf), (yyvsp[0].obj)); }
     break;
 
   case 45:
-#line 209 "sketch.y"
-    { (yyval.obj) = new_special((yyvsp[-2].str), (yyvsp[-1].opts), (yyvsp[0].obj), line); }
-    break;
-
-  case 46:
 #line 210 "sketch.y"
-    { (yyval.obj) = new_special((yyvsp[-1].str), (yyvsp[0].opts), new_point_def(origin_3d), line); }
+    { (yyval.obj) = new_special((yyvsp[-1].str), (yyvsp[0].obj), line); }
     break;
 
-  case 47:
+  case 46:
 #line 211 "sketch.y"
     { look_up_drawable(sym_tab, &(yyval.obj), line, (yyvsp[0].name)); }
     break;
 
-  case 48:
+  case 47:
 #line 212 "sketch.y"
     { sym_tab = new_scope(sym_tab); }
     break;
 
-  case 49:
+  case 48:
 #line 213 "sketch.y"
     { sym_tab = old_scope(sym_tab); }
     break;
 
-  case 50:
+  case 49:
 #line 215 "sketch.y"
     {
                             if ((yyvsp[-2].obj) == NULL)
@@ -1751,24 +1755,24 @@ yyreduce:
                           }
     break;
 
-  case 51:
+  case 50:
 #line 222 "sketch.y"
     { (yyval.bool) = 1; }
     break;
 
-  case 52:
+  case 51:
 #line 223 "sketch.y"
     { (yyval.bool) = 0; }
     break;
 
-  case 53:
+  case 52:
 #line 227 "sketch.y"
     { 
                             (yyval.opts) = look_up_and_append_to_opts(sym_tab, &(yyvsp[-2].opts), line, (yyvsp[0].name));
-			  }
+                          }
     break;
 
-  case 54:
+  case 53:
 #line 231 "sketch.y"
     { 
                             (yyval.opts) = NULL;
@@ -1776,221 +1780,271 @@ yyreduce:
 			  }
     break;
 
-  case 55:
+  case 54:
 #line 237 "sketch.y"
     { (yyval.opts) = new_opts((yyvsp[0].str), line); }
     break;
 
-  case 56:
+  case 55:
 #line 238 "sketch.y"
     { look_up_opts(sym_tab, &(yyval.opts), line, (yyvsp[0].name)); }
     break;
 
-  case 57:
+  case 56:
 #line 239 "sketch.y"
     { (yyval.opts) = (yyvsp[-1].opts); }
     break;
 
-  case 58:
+  case 57:
 #line 240 "sketch.y"
     { (yyval.opts) = NULL; }
     break;
 
-  case 59:
+  case 58:
 #line 243 "sketch.y"
     { (yyval.obj) = sibling_reverse((yyvsp[0].obj)); }
     break;
 
-  case 60:
+  case 59:
 #line 246 "sketch.y"
     { (yyval.obj) = cat_objects(new_point_def((yyvsp[0].pt)), (yyvsp[-1].obj)); }
     break;
 
-  case 61:
+  case 60:
 #line 247 "sketch.y"
     { (yyval.obj) = new_point_def((yyvsp[0].pt)); }
     break;
 
-  case 62:
+  case 61:
 #line 250 "sketch.y"
     { (yyval.obj) = sibling_reverse((yyvsp[0].obj)); }
     break;
 
-  case 63:
+  case 62:
 #line 253 "sketch.y"
-    { (yyval.obj) = cat_objects(new_transform_def((yyvsp[0].xf)), (yyvsp[-2].obj)); }
+    { (yyval.obj) = cat_objects((yyvsp[0].obj), (yyvsp[-1].obj)); }
     break;
 
-  case 64:
+  case 63:
 #line 254 "sketch.y"
-    { (yyval.obj) = new_transform_def((yyvsp[0].xf)); }
+    { (yyval.obj) = NULL; }
     break;
 
-  case 65:
+  case 64:
 #line 257 "sketch.y"
-    { set_float(&(yyval.exv), (yyvsp[0].flt)); }
+    { (yyval.obj) = new_scalar_def((yyvsp[0].flt)); }
     break;
 
-  case 66:
+  case 65:
 #line 258 "sketch.y"
-    { set_point(&(yyval.exv), (yyvsp[0].pt)); }
+    { (yyval.obj) = new_point_def((yyvsp[0].pt)); }
     break;
 
-  case 67:
+  case 66:
 #line 259 "sketch.y"
-    { set_vector(&(yyval.exv), (yyvsp[0].vec)); }
+    { (yyval.obj) = new_vector_def((yyvsp[0].vec)); }
     break;
 
-  case 68:
+  case 67:
 #line 260 "sketch.y"
-    { set_transform(&(yyval.exv), (yyvsp[0].xf)); }
+    { (yyval.obj) = new_opts_def((yyvsp[0].str), line); }
     break;
 
-  case 69:
+  case 68:
 #line 261 "sketch.y"
-    { do_add(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
+    { look_up_vector_or_opts(sym_tab, &(yyval.obj), line, (yyvsp[0].name)); }
+    break;
+
+  case 69:
+#line 264 "sketch.y"
+    { (yyval.obj) = sibling_reverse((yyvsp[0].obj)); }
     break;
 
   case 70:
-#line 262 "sketch.y"
-    { do_sub(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
+#line 267 "sketch.y"
+    { (yyval.obj) = cat_objects(new_transform_def((yyvsp[0].xf)), (yyvsp[-2].obj)); }
     break;
 
   case 71:
-#line 263 "sketch.y"
-    { do_mul(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
+#line 268 "sketch.y"
+    { (yyval.obj) = new_transform_def((yyvsp[0].xf)); }
     break;
 
   case 72:
-#line 264 "sketch.y"
-    { do_dvd(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
+#line 271 "sketch.y"
+    { set_float(&(yyval.exv), (yyvsp[0].flt)); }
     break;
 
   case 73:
-#line 265 "sketch.y"
-    { do_dot(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
+#line 272 "sketch.y"
+    { set_point(&(yyval.exv), (yyvsp[0].pt)); }
     break;
 
   case 74:
-#line 266 "sketch.y"
-    { do_thn(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
+#line 273 "sketch.y"
+    { set_vector(&(yyval.exv), (yyvsp[0].vec)); }
     break;
 
   case 75:
-#line 267 "sketch.y"
-    { do_mag(&(yyval.exv), &(yyvsp[-1].exv), line); }
+#line 274 "sketch.y"
+    { set_transform(&(yyval.exv), (yyvsp[0].xf)); }
     break;
 
   case 76:
-#line 268 "sketch.y"
-    { do_neg(&(yyval.exv), &(yyvsp[0].exv), line); }
+#line 275 "sketch.y"
+    { do_add(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
     break;
 
   case 77:
-#line 269 "sketch.y"
-    { do_pwr(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
+#line 276 "sketch.y"
+    { do_sub(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
     break;
 
   case 78:
-#line 270 "sketch.y"
-    { (yyval.exv) = (yyvsp[-1].exv); }
+#line 277 "sketch.y"
+    { do_mul(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
     break;
 
   case 79:
-#line 271 "sketch.y"
-    { do_unit(&(yyval.exv), &(yyvsp[-1].exv), line); }
+#line 278 "sketch.y"
+    { do_dvd(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
     break;
 
   case 80:
-#line 272 "sketch.y"
-    { do_sqrt(&(yyval.exv), &(yyvsp[-1].exv), line); }
+#line 279 "sketch.y"
+    { do_dot(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
     break;
 
   case 81:
-#line 273 "sketch.y"
-    { do_sin(&(yyval.exv), &(yyvsp[-1].exv), line); }
+#line 280 "sketch.y"
+    { do_thn(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
     break;
 
   case 82:
-#line 274 "sketch.y"
-    { do_cos(&(yyval.exv), &(yyvsp[-1].exv), line); }
+#line 281 "sketch.y"
+    { do_mag(&(yyval.exv), &(yyvsp[-1].exv), line); }
     break;
 
   case 83:
-#line 275 "sketch.y"
-    { do_atan2(&(yyval.exv), &(yyvsp[-3].exv), &(yyvsp[-1].exv), line); }
+#line 282 "sketch.y"
+    { do_neg(&(yyval.exv), &(yyvsp[0].exv), line); }
     break;
 
   case 84:
-#line 276 "sketch.y"
-    { do_index(&(yyval.exv), &(yyvsp[-1].exv), (yyvsp[0].index), line); }
+#line 283 "sketch.y"
+    { do_pwr(&(yyval.exv), &(yyvsp[-2].exv), &(yyvsp[0].exv), line); }
     break;
 
   case 85:
-#line 279 "sketch.y"
-    { (yyval.flt) = (yyvsp[0].flt); }
+#line 284 "sketch.y"
+    { (yyval.exv) = (yyvsp[-1].exv); }
     break;
 
   case 86:
-#line 280 "sketch.y"
-    { look_up_scalar(sym_tab, &(yyval.flt), line, (yyvsp[0].name)); }
+#line 285 "sketch.y"
+    { do_unit(&(yyval.exv), &(yyvsp[-1].exv), line); }
     break;
 
   case 87:
-#line 283 "sketch.y"
-    { coerce_to_float(&(yyvsp[0].exv), &(yyval.flt), line); }
+#line 286 "sketch.y"
+    { do_sqrt(&(yyval.exv), &(yyvsp[-1].exv), line); }
     break;
 
   case 88:
 #line 287 "sketch.y"
+    { do_sin(&(yyval.exv), &(yyvsp[-1].exv), line); }
+    break;
+
+  case 89:
+#line 288 "sketch.y"
+    { do_cos(&(yyval.exv), &(yyvsp[-1].exv), line); }
+    break;
+
+  case 90:
+#line 289 "sketch.y"
+    { do_atan2(&(yyval.exv), &(yyvsp[-3].exv), &(yyvsp[-1].exv), line); }
+    break;
+
+  case 91:
+#line 290 "sketch.y"
+    { do_index(&(yyval.exv), &(yyvsp[-1].exv), (yyvsp[0].index), line); }
+    break;
+
+  case 92:
+#line 293 "sketch.y"
+    { (yyval.flt) = (yyvsp[0].flt); }
+    break;
+
+  case 93:
+#line 294 "sketch.y"
+    { look_up_scalar(sym_tab, &(yyval.flt), line, (yyvsp[0].name)); }
+    break;
+
+  case 94:
+#line 297 "sketch.y"
+    { coerce_to_float(&(yyvsp[0].exv), &(yyval.flt), line); }
+    break;
+
+  case 95:
+#line 301 "sketch.y"
     { 
                             (yyval.pt)[X] = (yyvsp[-5].flt); (yyval.pt)[Y] = (yyvsp[-3].flt); (yyval.pt)[Z] = (yyvsp[-1].flt);
                           }
     break;
 
-  case 89:
-#line 291 "sketch.y"
+  case 96:
+#line 305 "sketch.y"
     { 
                             (yyval.pt)[X] = (yyvsp[-3].flt); (yyval.pt)[Y] = (yyvsp[-1].flt); (yyval.pt)[Z] = 0;
                           }
     break;
 
-  case 90:
-#line 294 "sketch.y"
+  case 97:
+#line 308 "sketch.y"
     { look_up_point(sym_tab, (yyval.pt), line, (yyvsp[0].name)); }
     break;
 
-  case 91:
-#line 297 "sketch.y"
+  case 98:
+#line 311 "sketch.y"
     { coerce_to_point(&(yyvsp[0].exv), (yyval.pt), line); }
     break;
 
-  case 92:
-#line 301 "sketch.y"
+  case 99:
+#line 314 "sketch.y"
+    { copy_vec_3d((yyval.vec), (yyvsp[0].vec)); }
+    break;
+
+  case 100:
+#line 315 "sketch.y"
+    { copy_vec_3d((yyval.vec), (yyvsp[0].vec)); }
+    break;
+
+  case 101:
+#line 319 "sketch.y"
     { 
                             (yyval.vec)[X] = (yyvsp[-5].flt); (yyval.vec)[Y] = (yyvsp[-3].flt); (yyval.vec)[Z] = (yyvsp[-1].flt);
                           }
     break;
 
-  case 93:
-#line 305 "sketch.y"
+  case 102:
+#line 323 "sketch.y"
     { 
                             (yyval.vec)[X] = (yyvsp[-3].flt); (yyval.vec)[Y] = (yyvsp[-1].flt); (yyval.vec)[Z] = 0;
                           }
     break;
 
-  case 94:
-#line 308 "sketch.y"
+  case 103:
+#line 328 "sketch.y"
     { look_up_vector(sym_tab, (yyval.vec), line, (yyvsp[0].name)); }
     break;
 
-  case 95:
-#line 310 "sketch.y"
+  case 104:
+#line 331 "sketch.y"
     { coerce_to_vector(&(yyvsp[0].exv), (yyval.vec), line); }
     break;
 
-  case 96:
-#line 319 "sketch.y"
+  case 105:
+#line 340 "sketch.y"
     { // transform is column major while elements are row major
                             (yyval.xf)[0] = (yyvsp[-35].flt);  (yyval.xf)[4] = (yyvsp[-33].flt);  (yyval.xf)[8]  = (yyvsp[-31].flt);  (yyval.xf)[12] = (yyvsp[-29].flt);
                             (yyval.xf)[1] = (yyvsp[-26].flt); (yyval.xf)[5] = (yyvsp[-24].flt); (yyval.xf)[9]  = (yyvsp[-22].flt); (yyval.xf)[13] = (yyvsp[-20].flt);
@@ -1999,15 +2053,15 @@ yyreduce:
                           }
     break;
 
-  case 97:
-#line 326 "sketch.y"
+  case 106:
+#line 347 "sketch.y"
     {
                             set_angle_axis_rot_about_point((yyval.xf), (yyvsp[-1].flt) * (PI/180), 0, 0);
                           }
     break;
 
-  case 98:
-#line 330 "sketch.y"
+  case 107:
+#line 351 "sketch.y"
     {
                             if (EXPR_TYPE_IS(&(yyvsp[-1].exv), E_POINT))
                               set_angle_axis_rot_about_point((yyval.xf), (yyvsp[-3].flt) * (PI/180), (yyvsp[-1].exv).val.pt, 0);
@@ -2019,22 +2073,22 @@ yyreduce:
                           }
     break;
 
-  case 99:
-#line 340 "sketch.y"
+  case 108:
+#line 361 "sketch.y"
     {
                             set_angle_axis_rot_about_point((yyval.xf), (yyvsp[-5].flt) * (PI/180), (yyvsp[-3].pt), (yyvsp[-1].vec));
                           }
     break;
 
-  case 100:
-#line 344 "sketch.y"
+  case 109:
+#line 365 "sketch.y"
     {
                             set_translation((yyval.xf), (yyvsp[-1].vec)[X], (yyvsp[-1].vec)[Y], (yyvsp[-1].vec)[Z]);
                           }
     break;
 
-  case 101:
-#line 348 "sketch.y"
+  case 110:
+#line 369 "sketch.y"
     {
                             if ((yyvsp[-1].exv).tag == E_FLOAT) {
                               FLOAT s = (yyvsp[-1].exv).val.flt;
@@ -2053,23 +2107,23 @@ yyreduce:
                           }
     break;
 
-  case 102:
-#line 364 "sketch.y"
+  case 111:
+#line 385 "sketch.y"
     { set_parallel_projection((yyval.xf)); }
     break;
 
-  case 103:
-#line 365 "sketch.y"
+  case 112:
+#line 386 "sketch.y"
     { set_perspective_projection((yyval.xf), (yyvsp[-1].flt)); }
     break;
 
-  case 104:
-#line 366 "sketch.y"
+  case 113:
+#line 387 "sketch.y"
     { set_perspective_transform((yyval.xf), (yyvsp[-1].flt)); }
     break;
 
-  case 105:
-#line 368 "sketch.y"
+  case 114:
+#line 389 "sketch.y"
     {
                             if ((yyvsp[-3].exv).tag == E_VECTOR)
                               set_view_transform((yyval.xf), (yyvsp[-5].pt), (yyvsp[-3].exv).val.vec, (yyvsp[-1].vec));
@@ -2081,8 +2135,8 @@ yyreduce:
                           }
     break;
 
-  case 106:
-#line 378 "sketch.y"
+  case 115:
+#line 399 "sketch.y"
     {
                             if ((yyvsp[-1].exv).tag == E_VECTOR)
                               set_view_transform((yyval.xf), (yyvsp[-3].pt), (yyvsp[-1].exv).val.vec, NULL);
@@ -2094,25 +2148,25 @@ yyreduce:
                           }
     break;
 
-  case 107:
-#line 388 "sketch.y"
+  case 116:
+#line 409 "sketch.y"
     {
                             set_view_transform((yyval.xf), (yyvsp[-1].pt), NULL, NULL);
                           }
     break;
 
-  case 108:
-#line 392 "sketch.y"
+  case 117:
+#line 413 "sketch.y"
     { do_inverse((yyval.xf), (yyvsp[-1].xf), line); }
     break;
 
-  case 109:
-#line 393 "sketch.y"
+  case 118:
+#line 414 "sketch.y"
     { look_up_transform(sym_tab, (yyval.xf), line, (yyvsp[0].name)); }
     break;
 
-  case 110:
-#line 396 "sketch.y"
+  case 119:
+#line 417 "sketch.y"
     { coerce_to_transform(&(yyvsp[0].exv), (yyval.xf), line); }
     break;
 
@@ -2121,7 +2175,7 @@ yyreduce:
     }
 
 /* Line 1126 of yacc.c.  */
-#line 2125 "y.tab.c"
+#line 2179 "y.tab.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -2389,14 +2443,14 @@ yyreturn:
 }
 
 
-#line 399 "sketch.y"
+#line 420 "sketch.y"
 
 
 int parse(SYMBOL_TABLE *st)
 {
   int ret;
 
-	objects = NULL;
+  objects = NULL;
   sym_tab = st;
   ret = yyparse();
 

-- 
Debian packaging for sketch 3D line drawing software



More information about the debian-science-commits mailing list