4.4 Block-areasBlock-areas
Block-areas have several traits which typically affect the placement of their
children. The line-height is used in line placement calculations.
The line-stacking-strategy trait controls what kind of allocation
is used for descendant line-areas and has an enumerated value
(either font-height, max-height,
or line-height). This is all rigorously described below.
All areas have these traits,
but they only have relevance for areas which have stacked line-area children.
The space-before and space-after traits
determine the
distance between the block-area and surrounding block-areas.
A block-area which is not a line-area typically has its size in the
inline-progression-direction determined
by its start-indent and end-indent and by the size of its nearest ancestor
reference-area.
A block-area which is not a line-area must be properly stacked (as defined in
[area-stackblock]
below)
unless otherwise specified in the description of its generating formatting object.
In this case it its block-progression-dimension will be subject to constraints based
on the block-progression-dimensions and space-specifiers of its descendants.
See
[bpd-slack]
Stacked Block-areas[top]
Stacked Block-areas
Block-area children of an area are typically stacked in the
block-progression-direction
within their parent area, and this is the default method of
positioning block-areas. However, formatting objects
are free to specify other methods of positioning child areas of areas which
they generate, for example list-items or tables.
For a parent area P whose children are
block-areas, P is defined to be properly
stacked if all of the following conditions hold:
-
For each block-area B which is a descendant of P,
the following hold:
-
the before-edge and after-edge
of its allocation-rectangle are parallel to the before-edge and after-edges of the
content-rectangle of P,
-
the start-edge of its allocation-rectangle is parallel to the start-edge
of the content-rectangle of R (where R is the closest
ancestor reference-area of B), and offset from it inward
by a distance equal to
the block-area's start-indent plus its
start-intrusion-adjustment
(as defined below), minus its border-start,
padding-start, and space-start values, and
-
the end-edge of its allocation-rectangle is parallel to the
end-edge
of the content-rectangle of R, and offset from it inward
by a distance equal to
the block-area's end-indent plus its
end-intrusion-adjustment
(as defined below),
minus its border-end, padding-end, and space-end
values.
Content Rectangle of Reference Area
NOTE:
The notion of indent is intended to apply to the content-rectangle, but
the constraint is written in terms of the
allocation-rectangle, because as noted earlier
(
[area-geo]
)
the edges of the
content-rectangle may not
correspond to like-named edges of the
allocation-rectangle.
The start-intrusion-adjustment and
end-intrusion-adjustment are traits used to
deal with intrusions from
floats in the inline-progression-direction.
-
For each pair of normal areas B and B'
in the subtree below P, if
B and B' have a block-stacking constraint S
and B is not empty (see
[area-stackcon]
),
then the distance between the adjacent edges of B and B'
is consistent with the
constraint imposed by the
resolved values of the space-specifiers in S.
Example. In the diagram, if area
A
has a space-after value of 3 points, B a
space-before
of 1 point, and C a space-before of 2 points, all
with
precedence of force, and with zero border and padding,
then the constraints will place B's
allocation-rectangle
4 points below that of A, and C's
allocation-rectangle
6 points below that
of A. Thus the 4-point gap receives the
background color
from P, and the 2-point gap before C
receives the background color from B.
Intrusion Adjustments[top]
Intrusion Adjustments
Intrusion adjustments (both start- and end-) are defined to account for the
indentation that occurs as the result of side floats.
If A and B are areas which have the same nearest reference area ancestor, then A
and B are defined to be inline-overlapping if there is some line
parallel to the inline-progression-direction, which intersects both the
allocation-rectangle of A and the allocation-rectangle of B.
If
A is an area of class xsl-side-float with float="start", and B is a block-area, and A and B
have the same nearest reference area ancestor, then A is defined to encroach upon B if A and B
are inline-overlapping and the start-indent of B is less than the sum of the start-indent of A
and the inline-progression-dimension of A. The start-encroachment of A on B is then defined to
be amount by which the start-indent of B is less than the sum of the start-indent of A and
the inline-progression-dimension of A.
If A is an area of class xsl-side-float with float="end", and B is a block-area, and A and B
have the same nearest reference area ancestor, then A is defined to encroach upon B if A and B
are inline-overlapping and the end-indent of B is less than the sum of the end-indent of A
and the inline-progression-dimension of A. The end-encroachment of A on B is then
defined to be amount by which the end-indent of B is less than the sum of the end-indent of A and
the inline-progression-dimension of A.
If B is a block-area which is not a line-area, then its local-start-intrusion-adjustment is computed as the maximum of
the following lengths:
-
zero;
-
if the parent of B is not a reference area: the start-intrusion-adjustment of the parent of B;
and
-
if B has float-displace="block",
then for each area A of class xsl-side-float
with float="start" such that the generating formatting object of A is not a descendant of
the generating formatting object of B, and such that A encroaches upon some line-area child of
B: the start-encroachment of A on B;
and
-
if B has float-displace = "block", then for each area A of class xsl-side-float with float="start"
such that A and B are inline-overlapping, and for each block-area ancestor B' of B which is
a descendant of the nearest reference area ancestor of B, such that A encroaches on a line-area
child of B': the start-encroachment of A on B'.
The start-intrusion-adjustment of a block-area B is then defined to be
the maximum of the local-start-intrusion-adjustments of the normal block-areas generated
and returned by the generating formatting object of B.
If L is a line-area, then its start-intrusion-adjustment is computed as the maximum of
the following lengths:
-
the start-intrusion-adjustment of the parent of L;
-
for each area A of class xsl-side-float with float="start" such that A encroaches upon L:
the start-encroachment of A on L; and
-
if the parent of L has float-displace = "indent",
then for each area A of class xsl-side-float with float="start" such that
A and L are inline-overlapping, and for each block-area ancestor B' of L which is
a descendant of the nearest reference area ancestor of L, such that A encroaches on some line-area
child L' of B': the start-encroachment of A on B'.
The end-intrusion-adjustment for a block-area is computed in a precisely analogous manner.
That is:
If B is a block-area which is not a line-area, then its local-end-intrusion-adjustment is computed as the maximum of
the following lengths:
-
zero;
-
if the parent of B is not a reference area: the end-intrusion-adjustment of the parent of B;
and
-
if B has float-displace="block",
then for each area A of class xsl-side-float
with float="end" such that the generating formatting object of A is not a descendant of
the generating formatting object of B, and such that A encroaches upon some line-area child of
B: the end-encroachment of A on B;
and
-
if B has float-displace = "block", then for each area A of class xsl-side-float with float="end"
such that A and B are inline-overlapping, and for each block-area ancestor B' of B which is
a descendant of the nearest reference area ancestor of B, such that A encroaches on a line-area
child of B': the end-encroachment of A on B'.
The end-intrusion-adjustment of a block-area B is then defined to be
the maximum of the local-end-intrusion-adjustments of the normal block-areas generated
and returned by the generating formatting object of B.
If L is a line-area, then its end-intrusion-adjustment is computed as the maximum of
the following lengths:
-
the end-intrusion-adjustment of the parent of L;
-
for each area A of class xsl-side-float with float="end" such that A encroaches upon L:
the end-encroachment of A on L; and
-
if the parent of L has float-displace = "indent",
then for each area A of class xsl-side-float with float="end" such that
A and L are inline-overlapping, and for each block-area ancestor B' of L which is
a descendant of the nearest reference area ancestor of L, such that A encroaches on some line-area
child L' of B': the end-encroachment of A on B'.
|