@SubSection
    @Tag { style }
    @Title { Context-sensitive attributes of objects }
@Begin
@PP
Although we are free to place any object in any context, the context
must influence the appearance of the object, since otherwise
@ID @Code "A short paragraph of text."
could not appear in a variety of fonts, column widths, etc.  This
influence cannot take the purely static form that block-structured
languages use to associate values with identifiers, for then an operator
could not influence the appearance of its parameters; and a state
variable solution is not compatible with the overall functional design.
@PP
The information needed from the context seems quite limited, comprising
the font family, face, and size to use, the style of paragraph breaking
required, how much space to substitute between the words of paragraphs,
and how much horizontal and vertical space is available to receive the
object.  These four items constitute the so-called `style information'
of Lout.  As graphics rendering hardware improves, the style information
will probably grow to include colour and texture information.
@PP
The way to deal with fonts at least is very clear:
@ID @Code "{ Times Slope 12p } @Font { Hello, world }"
should have result
@ID { { Times Slope 12p } @Font { Hello, world } }
Lout also provides @Code "@Break" and @Code "@Space" symbols for
controlling the paragraph breaking and space styles mentioned
above.  These work in the same way, returning their right
parameters in the style of their left.  The implementation is very
simple:  one merely broadcasts the style information down into the parse
tree of the right parameter.  A font, for example, is converted to an
8-bit internal name and stored in each leaf, while a breaking style is
stored in the root node of each paragraph.
@PP
The same language design can be used for available width and height,
only here the implementation is much more demanding:
@ID @Code {
"2i @Wide {"
"(1)  |0.1i  An example"
"containing a small"
"paragraph of filled text."
"}"
}
is guaranteed to be two inches wide:
@ID {
2i @Wide {
(1)  |0.1i  An example
containing a small
paragraph of filled text.
}
}
One must calculate that 1.9 inches minus the width of @Code "(1)" is
available
to the paragraph, and break it accordingly; Basser Lout does this in two
stages.  In the first, upward-moving stage, widths are calculated using the
formulae of Section {@NumberOf objects}, which assume that available
space is infinite.  If the upward movement reaches a @Eq { WIDE }
node, corresponding to a @Code "@Wide" operator, and
the calculated width exceeds that allowed, a second, downward-moving stage
is initiated which attempts to reduce the width by finding and breaking
paragraphs.  This second stage is quite routine except at @Code "|" nodes,
whose children are the columns of a table.  It is necessary to apportion
the available width (minus inter-column gaps) among the columns.  Basser
Lout leaves narrow columns unbroken and breaks the remaining columns to
equal width, using up all of the available space.
@PP
The size of an object is not clearly determined when the upward-moving
size is less than the downward-moving available space, and the object
contains constructs that depend on available space (e.g. right
justification).  For example, in
@ID @Code "2i @Wide { Heading // a |1rt b }"
it seems natural to assign a width of two inches to the subobject
@Code "a |1rt b" because of the right justification, but it would be
equally plausible if the width of @Code Heading was assigned to the
subobject instead.  The author is conscious of having failed to resolve
this matter properly; an extra operator for controlling available space
is probably necessary.
@PP
The actual paragraph breaking is just a simple transformation on the
parse tree; the real issue is how to describe the various styles:  ragged
right, adjusted, outdented, and so on.  Their diversity suggests that
they should somehow be defined using more basic features; but then there
are algorithms for high-quality paragraph breaking, which presumably
must be built-in.  This dilemma was not clearly grasped by the author in
1985, and he included a built-in paragraph breaker, with the @Code
"@Break" operator selecting from a fixed set of styles.  A much better
solution based on galleys will be given in Section {@NumberOf horizontal},
but, regrettably, it is not implemented.
@End @SubSection
