@Section
   @Title { "@LinkSource", "@LinkDest", and "@URLLink" }
   @Tag { link_source }
@Begin
@PP
The two symbols @@LinkSource and @@LinkDest
link.source.sym @Index { @@LinkSource symbol }
link.dest.sym @Index { @@LinkDest symbol }
work together to create @I { cross links } in a document, that is, points
where a user viewing the document on screen can click and be transported to
another point in the document.  We call the point where the user
clicks the @I source of the link, and the point where the user
arrives the @I destination of the link.
@PP
To create a source point, place
@ID { @I tag @Code "@LinkSource" @I object }
at some point in the document, where the value of @I tag is a legal
cross reference tag, and @I object is an arbitrary Lout object.  The
result of this is just {@I object}, but if the user of a screen
viewer clicks on any point within the rectangular bounding box
of that object, a link will be entered.
@PP
At present, @I object above is treated as though it were enclosed
in @@OneCol.  This means that a long link source or destination point
will not break over two lines as part of an enclosing paragraph.
@PP
To create a destination point, place
@ID { @I tag @Code "@LinkDest" @I object }
at some point in the document.  Again, @I tag must evaluate to a
legal cross reference tag, and @I object may be any Lout
object.  All @Code "@LinkSource" symbols whose
tag is equal to this one are linked to this destination point.
@PP
For every source point there must be exactly one destination point with
the same tag, otherwise it will not be clear where the link is
supposed to take the user.  Lout will print a warning if this
condition is violated anywhere; it will refuse to insert a
destination point with the same name as a previous one, but it is not
able to refrain from inserting a source point with no corresponding
destination point, and such points must cause errors of some kind when
viewed (exactly what error will depend on the viewer).
@PP
The @@URLLink symbol is similar to @@LinkSource in being the
source point of a link, but instead of a tag you supply a URL
to some other document altogether:
@ID @Code {
"\"http://snark.ptc.spbu.ru/~uwe/lout/lout.html\" @URLLink { Lout Home Page }"
}
The URL will need to be enclosed in quotes, because of the "/"
characters which are otherwise taken to be concatenation operations.  As
for @@LinkSource, the result is just the object to the right, like this:
@ID { "http://snark.ptc.spbu.ru/~uwe/lout/lout.html" @URLLink { Lout Home Page } }
but if the user clicks on this object on the screen they enter a
link that takes them to the given URL location, assuming that
the software which they are using to display the document is
clever enough to do this.
@PP
For the purposes of @@Common, @@Rump, and @@Meld, two @@LinkSource
objects are considered to be equal if their right parameters are
equal; the left parameters are not considered.  This behaviour is
needed, for example, to make index entries look reasonable when
melded.  If two @@LinkSource objects with equal right parameters but
different left parameters are melded into one, one of the two will
be the result, but which one is undefined.  Notice that melding
cannot produce an undefined link, since the worst it can do is
delete a @@LinkSource.
@PP
Practically speaking, the right parameters of @@LinkSource
and @@URLLink need to be non-null, non-empty objects, since
otherwise there is nothing visible for the user to click on.
(This condition is not checked or enforced by Lout.)  However,
the right parameter of @@LinkDest could reasonably be empty
or null.  Usually, when @@Null lies inside a non-concatenation
object, for example
@ID "@OneCol @Null"
the effect of the @@Null is lost -- the result in this example
is equivalent to an empty object.  However, when the right
parameter of @@LinkDest is @@Null:
@ID "@LinkDest @Null"
or when it is some object treated like @@Null by Lout (e.g.
a @@Tagged symbol), then the @@LinkDest itself has the effect
on surrounding concatentation operators that @@Null has,
allowing it to be made effectively invisible in the printed
document, though still really there.
@End @Section
