@Section
   @Tag { cross }
   @Title { Cross references }
@Begin
@PP
A cross reference
cross.ref @Index { Cross reference }
in common terminology is something like `see Table 6'
or `see page 57' -- a reference within a document to some other part of
the document.  Readers find them very useful, but they are a major
bookkeeping problem for authors.  As the document is revised, Table 6
becomes Table 7, the thing on page 57 moves to page 63, and all the
cross references must be changed.
@PP
The Scribe
scribe @Index { Scribe }
document formatter, developed by Brian K. Reid @Cite { $reid1980scribe },
reid.brian @Index { Reid, Brian K. }
introduced a scheme for keeping track of cross
references.  It allows you to give names to tables, figures, etc., and to
refer to them by name.  The formatter inserts the appropriate numbers in
place of the names, so that as the document is revised, the
cross references are kept up to date automatically.  Lout has adopted
and extended this scheme.
@PP
In Lout, automatic cross referencing works in the following way.  First
define a symbol with a parameter with the special name @Code "@Tag":
@ID @OneRow @Code {
"def @Table"
"   left @Tag"
"   right @Value"
"{"
"   ||1i  @Value"
"}"
}
When this symbol is invoked, the value given to @Code "@Tag" should be a
simple word like {@Code "cities"}, or several simple words juxtaposed
like {@Code "cities compare"}; it serves to name the invocation:
@ID @OneRow @Code {
"{ cities compare } @Table"
"{"
"    Washington  |0.5i  Canberra"
"}"
}
We may now refer to this invocation elsewhere in the document, using the
@I {cross reference} @Code "@Table&&{ cities compare }".  Here @Code "&&"
is the {@I {cross reference symbol}}; its left parameter is a symbol and
its right parameter is the value of the @Code "@Tag" parameter of some
invocation of that symbol.  Of course it's simplest if you use just a
one-word tag; then no braces are needed.
@PP
A cross reference is not an object; the reader should think of it as
an arrow in the final printed document, beginning at the cross reference
symbol and ending at the top of the target
target.cr @Index { Target of cross reference }
invocation, like this:
@ID 8p @Font {
  { @LittlePage // @LittlePage }
  ||0io ||0.7c
  { //2c 
    { @Code "@Table&&cities" }
    //0.1c
    ||0.5c 90d @Rotate @Arrow 2.5c
    //0.05c
    @HContract @VContract
      @Fig { @Box margin { 0c } paint { grey } { 1.5c @Wide 1c @High } }
  }
}
@PP
Three special values may be given to the right parameter of
{@Code "&&"}:  {@Code preceding}, {@Code following}, and
preceding. @Index { @Code preceding }
following. @Index { @Code following }
foll_or_prec. @Index { @Code following }
{@Code foll_or_prec}.  The cross
reference @Code "@Table&&preceding" points to some table
appearing earlier in the final printed document than itself; that is, the
arrow is guaranteed to point backwards through the document.  Usually it
points to the nearest preceding invocation.  Similarly, 
@Code "@Table&&following" points forwards, usually to the
nearest following invocation of @Code "@Table".  The third special
value, @Code "@Table&&foll_or_prec" is the same as @Code "@Table&&following"
if it exists, otherwise it is the same as {@Code "@Table&&preceding"}.
@PP
This section has been concerned with what a cross reference is -- an
arrow from one point in a document to another -- but not with how it is
used.  One simple way to use a cross reference is to put it where an
object is expected, like this:
@ID @Code {
"a  |  @Table&&cities  |  c"
}
In this case the cross reference will be replaced by a copy of the
invocation it points to:  in the example just given, a table will appear
between @Code a and @Code c.  Other applications of cross references may be
found in Chapter {@NumberOf examples}, including finding the number of
the page where something appears, producing running page headers and footers,
and accessing databases of Roman numerals, references, etc.  Cross
references are also used by galleys, as will be explained in the next section.
@PP
The implementation of cross referencing copies every symbol invocation with
a @Code "@Tag" parameter into the @I { cross-reference database },
a collection of files whose names end in {@Code ".ld"} indexed by one file
whose name is {@Code "lout.li"}.  It is generally the case that the bulk
content of a symbol such as the table above is contained in its right or
body parameter, and that this bulk content is not needed by cross references
to the symbol.  Hence, to save space in the database, Lout replaces the
right parameter of each symbol it writes into it by the word "???" whenever
the right parameter appears to be large.  The table above would appear as
"???" because of this optimization, and in general, the user must ensure
that any content required by cross references is contained in parameters
other than the right or body parameter.  This optimization does not apply
when the symbol being written into the cross-reference database is a galley.
@End @Section
