aboutsummaryrefslogtreecommitdiffstats
path: root/doc/user/dia_node
diff options
context:
space:
mode:
authorJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 19:21:41 +0000
committerJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 19:21:41 +0000
commit71bdb35d52747e6d7d9f55df4524d57c2966be94 (patch)
tree480ee5eefccc40d5f3331cc52d66f722fd19bfb9 /doc/user/dia_node
parentb41263ea7578fa9742486135c762803b52794105 (diff)
downloadlout-71bdb35d52747e6d7d9f55df4524d57c2966be94.tar.gz
Lout 3.17.
git-svn-id: http://svn.savannah.nongnu.org/svn/lout/trunk@2 9365b830-b601-4143-9ba8-b4a8e2c3339c
Diffstat (limited to 'doc/user/dia_node')
-rw-r--r--doc/user/dia_node512
1 files changed, 512 insertions, 0 deletions
diff --git a/doc/user/dia_node b/doc/user/dia_node
new file mode 100644
index 0000000..b72c6e2
--- /dev/null
+++ b/doc/user/dia_node
@@ -0,0 +1,512 @@
+@Section
+ @Tag { dia_node }
+ @Title { Nodes }
+@Begin
+@PP
+@Code "@Diag" has one basic symbol for creating nodes. It is called
+node. @Index { @Code "@Node" }
+{@Code "@Node"}, and it takes the following object and encloses it in an
+outline whose shape is determined by the {@Code "outline"} option:
+@ID {
+@Code {
+"@Node"
+" outline { curvebox }"
+"{ Hello, world }"
+}
+||7ct
+@Diag {
+@Node
+ outline { curvebox }
+{ Hello, world }
+}
+}
+As Section {@NumberOf dia_defi} explains, the @Code outline option may be
+used to produce an outline of any shape. There are also nine values that
+produce standard shapes: {@Code box}, {@Code curvebox}, {@Code shadowbox},
+{@Code square}, {@Code diamond}, {@Code polygon}, {@Code isosceles},
+{@Code ellipse}, and {@Code circle}.
+@PP
+The shape of the outline is determined by the @Code outline option, but
+its size and position depend on the size and position of its
+{@I base}: the following object with a small margin around it. For
+example, this is how a circle is positioned over its base (shown in
+grey):
+@ID @OneRow {
+@Code {
+"@Node"
+" outline { circle }"
+"{ Hello, world }"
+}
+||7ct
+@Diag {
+@Box paint { lightgrey } outlinestyle { noline } margin { 0c }
+@Node
+ outline { circle }
+{ Hello, world }
+}
+}
+Lout works only with the base, having no idea where the outline is, which
+explains why this circle is too high for the space allowed
+it. Section {@NumberOf dia_summ} shows how each of the standard
+outlines is positioned over its base.
+@PP
+The @Code "@Node" symbol has many options, but all of them without
+exception share the following very useful property: they may be given
+to the @Code "@Diag" symbol as well, where they apply to every node in
+the diagram:
+@ID @OneRow {
+@Code {
+"@Diag"
+" outline { circle }"
+"{"
+" @Node @I a"
+" @DP"
+" @Node @I b"
+"}"
+}
+||7ct
+@Diag
+ outline { circle }
+{
+ @Node @I a
+ @DP
+ @Node @I b
+}
+}
+These options also appear in the setup file ({@Code diag});
+if set there, they apply to every node in every diagram of the
+document. As the number of nodes increases, it becomes very tedious and
+error-prone to duplicate options at all the nodes. Giving each option
+just once, at the @Code "@Diag" symbol or in the setup file, saves time
+and makes it easy to change all the nodes into squares or any other shape
+later on. Any setup file option may be overridden in a diagram by
+giving the option to its @Code "@Diag" symbol; any @Code "@Diag" option
+or setup file option may be overridden at any node by giving the option
+again there.
+@PP
+To save time in simple cases, @Code "@Diag" provides nine other
+node symbols called
+{@Code "@Box"},
+box.fig @Index { @Code "@Box" in @Code "@Diag" }
+{@Code "@CurveBox"},
+curvebox.fig @Index { @Code "@CurveBox" in @Code "@Diag" }
+{@Code "@ShadowBox"},
+shadowbox.fig @Index { @Code "@ShadowBox" in @Code "@Diag" }
+{@Code "@Square"},
+square. @Index @Code "@Square"
+{@Code "@Diamond"},
+diamond. @Index @Code "@Diamond"
+{@Code "@Polygon"},
+{@Code "@Isosceles"},
+isosceles. @Index @Code "@Isosceles"
+{@Code "@Ellipse"},
+ellipse. @Index @Code "@Ellipse"
+and {@Code "@Circle"}. These are just abbreviations for @Code "@Node"
+with the appropriate value of {@Code outline}, nothing more. They take
+the same options as {@Code "@Node"} (except that @Code outline is
+already fixed), and everything works in the same way.
+@PP
+There is a @Code shadow option which determines the depth of the shadow
+in shadow boxes:
+@ID {
+@Code {
+"@Node"
+" outline { shadowbox }"
+" shadow { 0.4f }"
+"{ WARNING }"
+}
+||7ct
+@Diag {
+@Node
+ outline { shadowbox }
+ shadow { 0.4f }
+{ WARNING }
+}
+}
+This example shows the default value, 0.4 times the current font
+size. For polygons there is a @Code sides option for specifying the number
+polygon. @Index @Code "@Polygon"
+of sides, and an @Code angle option for rotating the outline:
+@IL
+@LI {
+@Code {
+"@Polygon"
+" sides { 5 }"
+}
+||7ct
+@Diag {
+@Polygon
+ sides { 5 }
+{ 1c @High 1c @Wide }
+}
+}
+
+@LI {
+@Code {
+"@Polygon"
+" sides { 5 }"
+" angle { 0d }"
+}
+||7ct
+@Diag {
+@Polygon
+ sides { 5 }
+ angle { 0d }
+{ 1c @High 1c @Wide }
+}
+}
+@EL
+Setting @Code angle to @Code 0d causes the first vertex to be placed
+directly underneath the centre, and as the angle increases, the
+position of the first vertex rotates anticlockwise. The defaults are
+3 sides and the angle that gives the polygon a
+horizontal base (i.e. 180 degrees divided by the number of sides). Thus
+the two cases with symmetry about a vertical axis are obtained by the
+default angle and @Code "0d" respectively, which is convenient. The
+{@Code "shadow"}, {@Code "sides"}, and {@Code "angle"} options may be
+given to any node, and also to {@Code "@Diag"} and in the setup file,
+where they apply to every node as usual. However, they only affect the
+appearance of shadow boxes and polygons, respectively.
+@PP
+The {@Code outlinestyle}, {@Code outlinedashlength}, and {@Code outlinewidth}
+options apply to any node and affect the appearance of the outline:
+@ID @OneRow {
+@Code {
+"@CurveBox"
+" outlinestyle { solid }"
+" outlinedashlength { 0.2f }"
+" outlinewidth { thin }"
+"{ Hello, world }"
+}
+||7ct
+@Diag {
+@CurveBox
+ outlinestyle { solid }
+ outlinedashlength { 0.2f }
+ outlinewidth { thin }
+{ Hello, world }
+}
+}
+This example shows the default values of these options. The
+{@Code outlinestyle} option may be {@Code solid}, {@Code dashed},
+dashed. @Index { dashed lines }
+dotted. @Index { dotted lines }
+{@Code cdashed}, {@Code dotted}, or {@Code noline}:
+@ID @OneRow {
+@Code {
+"@CurveBox"
+" outlinestyle { cdashed }"
+"{ Hello, world }"
+}
+||7ct
+@Diag {
+@CurveBox
+ outlinestyle { cdashed }
+{ Hello, world }
+}
+}
+The @Code dashed option makes all dashes the same length, whereas
+@Code cdashed halves the length of the first and last dash on each segment,
+which usually looks better. The length of dashes is {@Code outlinedashlength},
+and the distance between dashes or dots is at most {@Code outlinedashlength},
+reduced to make the dashes or dots fit evenly. The @Code outlinewidth
+option determines the width of the line, dashes, or dots, and may be
+{@Code thin}, {@Code medium}, {@Code thick}, or any length. The values
+used for {@Code thin}, {@Code medium}, and {@Code thick} are
+{@Code 0.04f}, {@Code 0.08f}, and {@Code 0.12f}.
+@PP
+The {@Code outlinestyle} option may contain a sequence of the values
+mentioned above, meaning that they are to be applied in turn to each
+segment of the outline:
+@ID @OneRow {
+@Code {
+"@CurveBox"
+" outlinestyle { solid cdashed }"
+"{ Hello, world }"
+}
+||7ct
+@Diag {
+@CurveBox
+ outlinestyle { solid cdashed }
+{ Hello, world }
+}
+}
+If there are more segments than values, {@Code outlinestyle} cycles back
+to the first value again; this is why a single value is applied to all
+segments. Section {@NumberOf dia_summ} shows how each of the
+standard shapes is divided into segments.
+@PP
+Nodes may be painted any of the colours listed in Section
+{@NumberOf colour}, using the @Code "paint" option:
+@ID @OneRow {
+@Code {
+"@Box"
+" paint { grey }"
+"@Diamond"
+" outlinestyle { noline }"
+" paint { white }"
+"{ Hello, world }"
+}
+||7ct
+@Diag {
+@Box
+ paint { grey }
+@Diamond
+ outlinestyle { noline }
+ paint { white }
+{ Hello, world }
+}
+}
+In this example the object following @Code "@Box" is a diamond containing
+{@Code "Hello, world"}. The default value of @Code "paint" is
+{@Code nopaint}, a special value (not a colour) meaning don't use any paint.
+@PP
+When painting it is important to know what order things are done in, because
+anything put down earlier will disappear under the paint. This is why
+@Code nopaint and @Code white are different. Painting is done first, then
+boundaries, and finally the following object.
+@PP
+Each node symbol has
+@Code "font" and @Code "break" options which may be used to
+set the font and paragraph breaking style of the following object:
+@ID @OneRow {
+@Code {
+"@Box"
+" font { Helvetica Base }"
+" break { clines }"
+"{"
+"WARNING"
+"DANGEROUS"
+"PENGUINS"
+"}"
+}
+||7ct
+@Diag {
+@Box
+ font { Helvetica Base }
+ break { clines }
+{
+WARNING
+DANGEROUS
+PENGUINS
+}
+}
+}
+Both options have empty default values, which leave the font and break
+style unchanged. There is also a @Code "format" option for making more
+radical changes to the appearance of the following object:
+@ID @OneRow {
+@Code {
+"@Box"
+" format {"
+" {0.8 1.5} @Scale @S @Body"
+" }"
+"{"
+"Dangerous Penguins"
+"}"
+}
+||7ct
+@Diag {
+@Box
+ format { { 0.8 1.5 } @Scale @S @Body }
+{
+Dangerous Penguins
+}
+}
+}
+The result is the @Code "format" option with any @Code "@Body" symbol
+within it replaced by the following object. These are very useful when
+attached to the @Code "@Diag" symbol:
+@ID @OneRow @Code {
+"@Diag"
+" font { Helvetica Base }"
+" break { clines }"
+" format { { 0.8 1.5 } @Scale @S @Body }"
+"{"
+" ..."
+"}"
+}
+since then they apply to every node, as usual, thereby eliminating
+a lot of tedious, error-prone duplication of formatting information
+at each node.
+@PP
+The @Code margin option determines the size of the margin added to
+the following object:
+@ID @OneRow {
+@Code {
+"@Box"
+" margin { 0c }"
+"{ Hello, world }"
+}
+||7ct
+@Diag {
+@Box
+ margin { 0c }
+{ Hello, world }
+}
+}
+These margins are included in the node's base (described above), so a
+larger margin enlarges the base and hence the outline as well. The
+default value of @Code margin is {@Code 0.6f} (six-tenths of the current
+font size), and so the margin will automatically increase when the font size
+does, for example in overhead transparencies.
+@PP
+The @Code margin option adds the same margin to all four sides. For
+finer control, the @Code hmargin option determines the horizontal (left
+and right) margins only, overriding {@Code margin}. Similarly, the
+@Code vmargin option determines the vertical (top and foot) margins. There
+are also {@Code leftmargin}, {@Code rightmargin},
+{@Code topmargin}, and {@Code footmargin} options which override
+{@Code margin}, {@Code hmargin}, and {@Code vmargin}.
+@PP
+When nodes appear side by side, the {@Code valign} option is
+useful for controlling their vertical position with respect to each
+other. For example,
+@ID @OneRow {
+@Code {
+"@Diag"
+" valign { foot }"
+"{"
+"@Box font { 24p } Big"
+"@Box font { 8p } Small"
+"}"
+}
+||7ct
+@Diag
+ valign { foot }
+{
+@Box font { 24p } Big
+@Box font { 8p } Small
+}
+}
+causes the feet of the boxes to be aligned. In this example it is
+applied to all nodes at once, but of course it can be applied
+to individual nodes as well. The value of {@Code valign} can be a
+length, which means that the point of alignment is
+to be that far down from the top of the base (including margins); or
+it may be {@Code top}, {@Code ctr}, or {@Code foot}, meaning alignment
+through the top, centre (the default value), or foot.
+@PP
+The {@Code vsize} option specifies a particular
+height for a node (not including margins):
+@ID @OneRow {
+@Code {
+"@Diag"
+" vsize { 2f }"
+"{"
+"@Box font { 24p } Big"
+"@Box font { 8p } Small"
+"}"
+}
+||7ct
+@Diag
+ vsize { 2f }
+{
+@Box font { 24p } Big
+@Box font { 8p } Small
+}
+}
+The font size used when calculating @Code vsize is not affected by
+the value of any @Code font option. If the following object is too
+tall for the chosen height, Lout will print a warning message (`forced
+to enlarge {@Code "@High"}', probably) and enlarge the base.
+@PP
+There is a @Code vindent option which is effective only when @Code vsize
+is used. It controls where in the vertical space the following object
+is to appear:
+@ID @OneRow {
+@Code {
+"@Diag"
+" vsize { 3f }"
+"{"
+"@Box vindent { top } Top"
+"@Box Centre"
+"@Box vindent { foot } Foot"
+"}"
+}
+||7ct
+@Diag
+ vsize { 3f }
+ vindent { ctr }
+{
+@Box vindent { top } Top
+@Box Centre
+@Box vindent { foot } Foot
+}
+}
+The value may be {@Code top} for at the top, {@Code ctr} (the default
+value) for in the centre, {@Code foot} for at the foot, or a length,
+meaning that distance down from the top. These values are the same as
+for the @Code valign option.
+@PP
+Small discrepancies in the size of nodes can be very annoying,
+particularly when the nodes appear side by side:
+@ID @OneRow {
+@Code {
+"@Diag"
+"{"
+"@Box Hole @Box in"
+"@Box my @Box pocket"
+"}"
+}
+||7ct
+@Diag
+{
+@Box Hole @Box in
+@Box my @Box pocket
+}
+}
+These are caused by the slightly different heights of the objects within
+the nodes. Selecting a fixed vertical size for all nodes goes some way
+towards solving this problem:
+@ID @OneRow {
+@Code {
+"@Diag"
+" vsize { 1f }"
+"{"
+"@Box Hole @Box in"
+"@Box my @Box pocket"
+"}"
+}
+||7ct
+@Diag
+ vsize { 1f }
+{
+@Box Hole @Box in
+@Box my @Box pocket
+}
+}
+The size @Code "1f" is a good choice because most fonts are designed to
+be @Code "1f" high from the top of the tallest character to the foot of the
+deepest. However, there is still a problem with the baselines of the words
+being misaligned. A better solution is to insert a @I { vertical strut }
+into each node: an invisible object with zero width and height equal to
+{@Code 1f}. This is done using the @Code vstrut option:
+@ID @OneRow {
+@Code {
+"@Diag"
+" vstrut { yes }"
+"{"
+"@Box Hole @Box in"
+"@Box my @Box pocket"
+"}"
+}
+||7ct
+@Diag
+ vstrut { yes }
+{
+@Box Hole @Box in
+@Box my @Box pocket
+}
+}
+The @Code vstrut option may be {@Code yes}, {@Code no} (the default value), or
+a length, meaning to insert a strut of this height. So @Code "vstrut { yes }"
+is equivalent to {@Code "vstrut { 1.0f }"}.
+@PP
+There are {@Code halign}, {@Code hsize}, {@Code hindent}, and {@Code hstrut}
+options which work horizontally exactly as {@Code valign}, {@Code vsize},
+{@Code vindent}, and {@Code vstrut} work vertically, except that they
+use {@Code left} and {@Code right} where the vertical ones use
+{@Code top} and {@Code foot}. The best way to fix horizontal size
+discrepancies is with {@Code hsize}, not {@Code hstrut}.
+@End @Section