@Section
   @Title { Cross references and links }
   @Tag { cross }
@Begin
@PP
Cross references are a useful feature of documents, but they are a
cross.ref @Index { cross references }
problem for authors.  Suppose that at one point of your document
you have
@ID @OneRow @Code {
"We hold these truths to be self-evident, that all men are created equal,"
"that they are endowed by their Creator with certain inalienable Rights,"
"that among these are Life, Liberty, and the pursuit of Happiness..."
}
and that at some other point, earlier or later, you have
@ID @OneRow @Code {
"The anti-slavery cause, founded as it was on the Declaration"
"of Independence (page 181), could appeal to patriotic as"
"well as moral sentiments..."
}
This is a @I { cross reference }, and the problem is that as the document
is revised, the Declaration of Independence might move to page 185, and
the cross reference must be found and changed.
@PP
Lout has a simple solution to this problem.  Instead of writing the
pageof. @Index @Code "@PageOf"
page number, write
@ID @OneRow @Code {
"The anti-slavery cause, founded as it was on the Declaration"
"of Independence (page @PageOf { decl.of.ind }), could appeal to"
"patriotic as well as moral sentiments..."
}
instead, and at the point referred to, write
pagemark. @Index @Code "@PageMark"
@ID @OneRow @Code {
"We @PageMark decl.of.ind hold these truths to be self-evident, that..."
}
Inserting @Code "@PageMark decl.of.ind" will not affect the result,
but Lout makes a note of the number of the page on which the word
preceding it appears, and inserts that number in place of
{@Code "@PageOf decl.of.ind"}.  The tag, {@Code "decl.of.ind"}, may be
any simple word (actually Lout will accept a multi-word tag, but they
are very inconvenient and better avoided).  The braces are there, as
usual, to control grouping:  we don't want the following punctuation
characters in the tag.
@PP
One tag called @Code "last.page" is created automatically
"last.page.tag" @Index { @Code "last.page" tag }
for you.  @Code "@PageOf last.page" gives the number of the last page
of the document.  For example, the result for this document is
{@PageOf last.page}.
@PP
Cross referencing also applies to large-scale structure symbols such as
@Code "@Chapter" and @Code "@Section" (any symbol with a @Code "@Title"
option), as well as @Code { "@FootNote" }, @Code { "@EndNote" },
@Code { "@Figure" }, @Code { "@Table" }, the numbered display
symbols, and @Code "@ListItem" and @Code "@DropListItem" (but not
@Code "@TagItem" and {@Code "@DropTagItem"}).  Each of these symbols
has a @Code "@Tag" option:
tag.option. @Index { @Code "@Tag" option }
@ID @OneRow @Code {
"@Section"
"   @Title { Cross references }"
"   @Tag { cross }"
"@Begin"
"@PP"
"Cross references are a useful ..."
}
Now you can use the @Code "@PageOf" symbol to find the
number of the page on which the symbol's result begins, and the
@Code "@NumberOf" symbol to find its number:
numberof. @Index @Code "@NumberOf"
@ID @OneRow @Code {
"For further information on this point, please consult"
"Section @NumberOf cross (page @PageOf { cross })."
}
produces
@QD {
For further information on this point, please consult
Section @NumberOf cross (page @PageOf { cross }).
}
For symbols with a @Code "@Title" option (chapters, sections, etc.)
there is also the @Code "@TitleOf" symbol:
@ID @OneRow @Code {
"For further information on this point, please consult"
"the @TitleOf { cross } section."
}
produces
@QD {
For further information on this point, please consult
the @TitleOf { cross } section.
}
But this symbol won't work for footnotes, list items, and other
things without a title.
@PP
Like all tags, the value of the @Code "@Tag" option should be a simple
word (although Lout does accept multi-word tags).  Cross referencing of
list items yields just the number of the item, in Arabic, Roman, or
whatever; it does not include the surrounding parentheses or other
decorations introducted by the list's @Code "style" option.
@PP
To work cross references out, Lout has to process your document more
multiple.runs @Index { multiple runs, why needed }
than once, storing information between runs in special files it
creates whose names end in @Code ".li" and {@Code ".ld"}.
A complex document like this Guide requires five runs, but since every
run produces a perfectly good PostScript file suitable for proof reading,
in fact you need two runs to start with and one run per cycle of revision
thereafter, only one more than would have been necessary in any case.
@PP
The cross referencing system assumes that each Unix directory contains
directories @Index { directories, Lout files and }
only one Lout document (possibly spread over many files).  If you keep
several documents in one directory you can turn off the cross referencing
with the @Code "-s" flag:
@ID @Code "lout  -s  simple  >  simple.ps"
Since this will cause question marks to replace footnote and section
numbers, and other products of cross referencing, it is only feasible
for simple documents.  Alternatively, you can reset cross referencing
when switching from one document to another, by removing file
lout.li @Index { @Code lout.li file }
{@Code "lout.li"}.  You should also remove this file if your document
changes radically -- from a report to a book, say.
@FootNote {
An unfortunate and long-standing bug causes Lout to crash occasionally
when reading from a cross-reference database
file that it wrote on the preceding run.  The problem has to do with
mistakenly taking a literal word, or part of such a word, as an invocation
of a symbol.  The crash will occur on the @I second run (because the
database file is written, not read, on the first run), and might be
accompanied by an error message mentioning routine @I { AttachEnv } or
@I { SetTarget }.  You can make it happen, for example, by including
@ID @Code "pnformat @Index { watch me crash! }"
in your document -- the @Code pnformat tag, a literal word, will be
mistaken for the @Code pnformat option of @Code "@Index" by the
database reader.  If this problem appears, try enclosing tags that you
entered recently in double quotes.  Enclosing @Code pnformat above
in double quotes fixes the example problem.
}
@PP
PDF viewers and recent versions of PostScript viewers offer a high-tech
version of cross references called {@I links}, which allow the user to
click on, say, the entry for a section in a table of contents and be
immediately transported to the page on which that section begins.  In
principle, anything could happen when a link is clicked on, but Lout
only offers two kinds of links:  @I { internal links } that transport
the user to some page in the current document, and @I { external
links } that transports the user to a URL location on the World Wide Web.
@PP
Lout automatically makes an internal link out of every page number it
prints in the table of contents and in the index, and every reference
citation.  You can also insert your own links, using the
@Code "@CrossLink" symbol like this:
@ID @Code "See cross @CrossLink { Section @NumberOf cross }"
The @Code "@CrossLink" symbol consumes two objects, one to its left and the
other to its right, and we'll explain each of these now.
@PP
The object on the right (@Code "Section @NumberOf cross" in our
example) can be an arbitrary Lout object:  you don't have to have
@Code "@NumberOf" or @Code "@PageOf" inside it, although in practice
you often will, since it makes sense to put a low-tech link wherever
you have a high-tech one, for the benefit of readers of paper
versions.  This object on the right is what is printed, so the
overall result in this example is
@ID { See cross @CrossLink { Section @NumberOf cross } }
But, beyond this, clicking anywhere on this object on the screen will
invoke the link, transporting the user to some other page.
@PP
The object on the left (@Code cross in our example) must be a tag
that is acceptable to the @Code "@PageOf" symbol described earlier
in this section.  The link will transport the user who clicks on
it to the page that @Code "@PageOf" would point to if given that
tag.  You can ensure that your tag is acceptable in the usual
ways:  by using {@Code "@PageMark"}, or by giving the tag as the
@Code "@Tag" option of a chapter, section, etc. as described earlier
in this section.
@PP
A moment ago we said that the object to the right of @Code "@CrossLink"
is what is printed by the @Code "@CrossLink" symbol.  This is true by
default, but there is a @Code "@CrossLinkFormat" option in the setup
files which allows you to change the appearance of this printed
object.  (See Section {@NumberOf setup} for a general description
of setup files and their options.)  The default value of
@Code "@CrossLinkFormat" is
@ID @Code "@CrossLinkFormat { @Body }"
Within the @Code "@CrossLinkFormat" option, the @Code "@Body" symbol
stands for the object to the right of {@Code "@CrossLink"}.  It is
actually the value of @Code "@CrossLinkFormat" that is printed, so,
for example, changing it to
@ID @Code "@CrossLinkFormat { blue @Colour @Underline @Body }"
causes all link objects to be printed in blue and underlined.  If
you want a special format just for one link, there is a @Code "@Format"
option to @Code "@CrossLink" that overrides {@Code "@CrossLinkFormat"}:
@ID @Code "cross @CrossLink @Format { @CurveBox @Body } { Section @NumberOf cross }"
You can also give the formatting you want directly, since the object
to the right of @Code "@CrossLink" can be an arbitrary Lout object:
@ID @Code "cross @CrossLink @CurveBox { Section @NumberOf cross }"
However, in this form the @Code "@CrossLinkFormat" setup file option
is still applied.
@PP
External links are obtained in much the same way as internal ones,
except that the symbol to use is @Code "@ExternalLink" and instead
of supplying a tag, you need to supply a URL:
@ID @Code {
"\"http://snark.ptc.spbu.ru/~uwe/lout/lout.html\" @ExternalLink { Lout Home Page }"
}
Once again the result is the object to the right, modified by any
@Code "@Format" option; and there is an {@Code "@ExternalLinkFormat"}
setup file option that works in the same way as
{@Code "@CrossLinkFormat"}.  This time, though, the effect is to
jump right out of your document to the given place on the World
Wide Web, assuming that the software you are using to display your
document is capable of such a thing.
@PP
At present, the @Code "@CrossLink" and @Code "@ExternalLink" symbols
behave as though a @Code "@OneCol" symbol encloses the object to their
right.  This means that that object is kept together on one line of any
enclosing paragraph, and inter-word spaces within it are not adjusted
along with the inter-word spaces of any enclosing paragraph.  This
deficiency might be corrected in the future, but meanwhile it means
that it is best to keep your objects on the right short.
@End @Section
