@SubSection
@Tag { galleys }
@Title { The galley abstraction }
@Begin
@PP
Let us take the footnote as a representative example. At some point in
the document, we wish to write
@ID @OneRow @Code {
"preceding text"
"@FootNote { footnote text }"
"following text"
}
and we expect the formatter to remove the footnote from this context and
place it at the bottom of the current page, possibly splitting some or
all of it onto a following page if space is insufficient.
@PP
An object appears in the final document at the point it is invoked, but
this basic property does not hold for footnotes: the point of
invocation and the point of appearance are different. In some way, the
footnote is attached to the document at both points, introducing a cross
linking (Section {@NumberOf genesis}) that cannot be described in purely
functional terms.
@PP
Since the interpretation of any object depends on an environment and
style inherited from the context, the first question must be whether
the footnote inherits them through the invocation point or through
the point(s) of appearance.
@PP
If symbols are to be interpreted statically as heretofore, then environments
must be inherited through the invocation point alone. Dynamic inheritance
through the point of appearance is enticing in some ways: it might
replace the body parameter, and it might help with automatic numbering,
since the number of a footnote is known only at the point of appearance;
but the implementation problems are severe, and static inheritance seems
much simpler and more comprehensible to the user. Style, at least its
available width and height part, must of necessity be inherited through
the point of appearance. For consistency, the entire style should be
inherited in this way. There is a suggestive analogy here with actual
parameters, which have a point of invocation from which they inherit an
environment, and a point of appearance within the body of the enclosing
definition, from which they inherit a style. It may be possible to treat
a footnote as the actual parameter of some symbol, therefore, although
the details seem very obscure.
@PP
But the most profound consequence of having two types of attachment
point is that it leads to two distinctive tree structures. Considering
invocation points only leads to static trees like this one:
@ID @I @Fig margin { 0.3c } { @Tree {
@Node @Ellipse { body text }
@LeftSub { @Node @Ellipse footnote }
@RightSub {
@Node @Ellipse figure
@FirstSub { @Node @Ellipse footnote }
}
}}
which shows that the body text contains a footnote and a figure, the
latter itself containing a footnote. Considering points of appearance
only gives a completely different, dynamic tree:
@ID @I @Fig margin { 0.3c } { @Tree {
@Node @Ellipse { sequence of pages }
@FirstSub { @Node @Ellipse { body text } }
@NextSub { @Node @Ellipse { footnote } }
@NextSub { @Node @Ellipse { figure } }
@NextSub { @Node @Ellipse { footnote } }
}}
The tree can be deeper, for example with sections appearing within
chapters which appear within the body text, which appears within the
final sequence of pages. Document formatting languages generally shirk
the issues raised by this dual tree structure, by making the dynamic
tree built-in, by limiting one or both trees to two levels, and so on,
providing a classic example of the impoverishing effect of failing to
permit language features to attain their natural level of generality.
@PP
We are thus led to propose a second abstraction for document formatting,
which we name the @I galley in recognition of its similarity to the
galleys used in manual typesetting. A galley consists of an object (such
as a footnote) together with a sequence of places where that object may
appear (such as the bottoms of the current and following pages). Splitting
occurs quite naturally when space at any place is insufficient to hold
the entire object.
@PP
In Lout, a footnote galley and its place of appearance are defined
as follows:
@ID @OneRow @Code {
"def @FootPlace { @Galley }"
""
"def @FootNote into { @FootPlace&&following }"
" right x"
"{ x }"
}
The @Code "@FootPlace" symbol contains the special symbol {@Code "@Galley"},
indicating that it is a point of appearance for a galley. By placing
invocations of @Code "@FootPlace" at the bottoms of pages, as in Section
{@NumberOf recursion}, we define the desired points of appearance for
footnotes. Symbols whose body contains @Code "@Galley" either directly
or indirectly are called receptive symbols, meaning receptive to
galleys, and they are expanded only on demand. The effect of the
@Code "into" clause is to make each invocation of @Code "@FootNote" a
galley whose object is the result of the invocation in the usual way,
and whose sequence of points of appearance is specified by the @Code "into"
clause; in this example, the sequence of all @Code "@FootPlace" symbols
following the invocation point.
@PP
Lout permits galleys to be invoked within other galleys to arbitrary
depth, so that one may have footnotes within figures within the body
text galley, for example, creating arbitrary static trees. Receptive
symbols like @Code "@FootPlace" may appear within any galley, creating
arbitrary dynamic trees as well. The root of the dynamic tree, which
would normally consist of the sequence of pages of the complete assembled
document, is considered to be a galley whose point of appearance is the
output file. Points of appearance may be @Code preceding or @Code following
the invocation point; entries in tables of contents are the main users
of {@Code preceding}.
@PP
The galley abstraction is adequate for all of the applications listed at
the beginning of this section, except that there is no provision for
sorting index entries and references. Sorting of galleys has been added
to Lout as a built-in feature, invoked by adding a special @Code "@Key"
parameter to the galleys, and using its value as the sort key. The author
was at a loss to find any other way, or any useful generalization of this
feature. Its implementation will be discussed in Section
{@NumberOf cross.impl}.
@End @SubSection