% extern.tex copyright 1992 Victor Eijkhout
%                  copyright 2014--2016 Vafa Khalighi
%
%
%    This program is free software: you can redistribute it and/or modify
%    it under the terms of the GNU General Public License as published by
%    the Free Software Foundation, either version 3 of the License, or
%    (at your option) any later version.
%
%    This program is distributed in the hope that it will be useful,
%    but WITHOUT ANY WARRANTY; without even the implied warranty of
%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%    GNU General Public License for more details.
%
%    You should have received a copy of the GNU General Public License
%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
%
%
\Chapter[chap:referencing]
Referencing

In manuals and scientific documents you often want to write something
like `see Chapter~4'. But what if you shuffle the chapters a bit? It
would be nice if the number would be updated automatically. With
\Lollipop, as with many other \TeX\ macro packages, this is easily
done.

Here is an example to set the mood for the rest of this chapter.
The sort of thing that is referred to most is a heading. So suppose
you want to refer to a section number.

\Example
\DefineHeading:TestSection
 line:start Style:italic TestSectionCounter Spaces:2 title
 line:stop Stop
\TestSection[one:section?] First section\par
After this section will come section~\ref[other:section!].

\TestSection[other:section!] Another section\par
This is the section that came after section~\ref[one:section?].
\ExampleStop

\Section What and how do you reference?

You can reference not only headings but everything that has a
counter. Thus all generic constructs can be referenced, and in
addition you can reference item numbers in a list (there are examples
of this latter possibility in section~\ref[sec:bib]). The simplest way
of referencing something is to put the key in square brackets behind
it:

\Ver>\Section[this:section] The title of This Section<Rev
You can then reference the key by \refcs{ref}, or the page
where it appeared by~\refcs{pgref}:
\Ver>Section \ref[this:section] on page \pgref[this:section]<Rev

As you may have guessed from the above examples, keys can contain all
sorts of characters. Only brackets, braces, and the hash sign are
excepted. You get an error message if you try to use the same key
twice.

Another way of declaring a key is to use the command \refcs{label}
carrying the key
\Ver>\label[the:key]<Rev
This can be useful if you want to declare two keys for a single
reference. Make sure that the \cs{label} command is not part of the
title. Unexplained phenomena occur if you do that. Instead put the
label after the construct you want to reference:
\Ver>\Section Precautions and remedies

\label[sec:precautions]\label[sec:remedies]
In this section ...<Rev

\Section[sec:shape:reference] The shape of the reference

By default, a reference consists of just the number of the thing you
reference. There are two ways in which you can change this, one
systematic, and one on-the-fly.

\SubSection Defining the shape of the reference

You can customize the way an object is
referenced by using the option \refopt{label} in its definition. For
instance, often you want things like parentheses around references.
Putting this information in the label definition saves you a lot of
work in case you change your mind later.

\Example
\DefineHeading:TestSection
 line:start Style:italic TestSectionCounter Spaces:2 title line:stop
 label:start ( TestSectionCounter ) label:stop Stop
\TestSection[one:section?2] First section\par
After this section will come section~\ref[other:section!2].

\TestSection[other:section!2] Another section\par
This is the section that came after section~\ref[one:section?2].
\ExampleStop

Another use of customized labels is including other counters in the
reference:
 
\Example
\DefineHeading:TestChapter 
 line:start Style:bold TestChapterCounter / title line:stop Stop
\DefineHeading:TestSection
 line:start Style:italic TestSectionCounter Spaces:2 title line:stop
 label:start TestChapterCounter . 
             TestSectionCounter label:stop Stop
\TestChapter First chapter\par
Pretty short chapter
\TestChapter Second chapter\par
\TestSection[one:section?3] First section\par
After this section will come section~\ref[other:section!3].

\TestSection[other:section!3] Another section\par
This is the section that came after section~\ref[one:section?3].
\ExampleStop

A more surprising application of explicit definition of labels is
inclusion of the title in the reference.
\Example
\DefineHeading:TestSection
 line:start Style:italic TestSectionCounter Spaces:2 title line:stop 
 label:start TestSectionCounter literal: Spaces:1 
             Style:italic title label:stop Stop
\TestSection[one:section?4] First section\par
After this section will come section~\ref[other:section!4].

\TestSection[other:section!4] Another section\par
This is the section that came after section~\ref[one:section?4].
\ExampleStop

\SubSection[sec:exp-ref] Explicit specification of the reference

For every specific object referenced you can specify the reference by
using an optional argument before the label key. Have a look at the
next example.

\Example
\DefineHeading:TestSection counter:A
 line:start Style:bold TestSectionCounter . Spaces:2 title line:stop
 Stop
\TestSection[ref:one] Lalala\par
This is before section \ref[ref:two].
\TestSection<`the Didi section'>[ref:two] Dididi\par
This is after section \ref[ref:one].
\ExampleStop

This mechanism is also used in lists, where it's mostly useful for
bibliographies generated by Bib\TeX; see section~\ref[sec:BibTeX].

\Section[sec:ref-local] Local references

Some documents are
collated out of parts that were documents in themselves. 
The \Lollipop\ command \cs{InputFile} facilitates in a number
of ways working with such a segmented file (see
section~\ref[sec:InputFile]). One of the problems with input files is
that in such a case it may happen that the same reference key is used
in more than one part of the document. This phenomenon is
not at all unknown in multiple authored documents. Ordinarily this
would result in incorrect references.

To prevent such collisions \Lollipop\ can use local
references: the command \refcs{LocalReferences} has default \n{no},
and specifying 
\Ver>LocalReferences:yes<Rev
creates local \file{aux} files for each input file.

\Section[sec:bib] Bibliography citations

\Lollipop\ has an interface to Bib\TeX. However, since a bibliography
is just a list, referencing items in it is quite easy, even if you
don't use Bib\TeX.

\SubSection Bibliographies without Bib\TeX

This section doesn't tell you anything that cannot be found elsewhere
in this manual. The following two examples define a bibliography as
just a list, and by giving labels to the items you can refer to them.

\Example
\DefineList:BibList item:left [ itemCounter ] item:stop
 label:start [ itemCounter ] label:stop Stop
In this example we shall have occasion to refer to 
\ref[Abee80] and~\ref[Ceede79].\par
\Indent:no Bibliography
\BibList \item[Ace55] C.D. Ace, Inscrutible title.
\item[Abee80] E.F. Abee, Worthless drivel.
\item[Ceede79] G.H. Ceede, Contractual obligation.
\>
\ExampleStop

Here is a way to customize the label (if you need to refresh your
memory about description lists, see
section~\ref[sec:description:list]).

\Example
\DefineList:BibList item:left [ itemCounter ] item:stop
 label:start ( description ) label:stop Stop
In this example we shall have occasion to refer to 
\ref[Abe80] and~\ref[Ceedee79].\par
\Indent:no Bibliography
\BibList \item[Aace55] Aace55
C.D. Aace, Inscrutible title.
\item[Abe80] Abe80
E.F. Abe, Worthless drivel.
\item[Ceedee79] Ceedee79
G.H. Ceedee, Contractual obligation.
\>
\ExampleStop

\SubSection[sec:BibTeX] Bibliographies with Bib\TeX

\Lollipop has  an interface to the popular Bib\TeX\
bibliography database program, based on the `BtxMac' macros
by Karl Berry and Oren Patashnik. \Lollipop\ is set up for them, you
only have to \cs{input} the file \file{btxmac.tex}. (The version
of btxmac used to test this is \n{0.99h}.) You can find global
information about Bib\TeX\ in the \LaTeX\ book~{%\tracingmacros=2
%\tracingcommands\tracingmacros 
\bibref[La:book]},
since Bib\TeX\ was
originally written for \LaTeX.

Since there is some redefining going on between btxmac and \Lollipop\
you have to load the btxmac file before the \cs{Start} command (see
section~\ref[sec:doc-start-stop]).

Since the btxmac file already has a default way of formatting the
bibliography you can get away with just putting the lines
 \Ver>\bibliography{ <bfile> }
\bibliographystyle{ <bstyle> }<Rev
 in your file wherever you want the bibliography.

If you want to define your own bibliography, you have to use
\refcs{DefineBBL} which is practically a synonym for
\ver>\DefineList:BBL>, so you can see in the `lists' chapter of this
manual what options apply.

For example:
 \Ver>\DefineBBL line:start Style:italic literal:Literature line:stop
  item:left [ begingroup Style:bold itemCounter 
            endgroup ] item:stop
 Stop<Rev

You refer to a bibliography item by \refcs{bibref}, as in
\ver>\bibref[Knuth80]>. This command has a very simple definition
 \Ver>\def\bibref[#1]{[\ref[#1]]\nocite{#1}}<Rev
so you can easily redefine it. For instance
 \Ver>\def\supref[#1]{$^{\rm \ref[#1]}$\nocite{#1}}<Rev
 will make your references into superscripts.
Make sure that
the call to \cs{nocite} appears, because that generates the request for
Bib\TeX.

The \Lollipop\ command \ver>\WriteExtern:no> (see
section~\ref[sec:write-extern]) defines \cs{noauxfile} to prevent
regeneration of the bib entries in the \file{.aux} file. 
You don't have to do that anymore.

\Section Obscure details

For the sake of efficiency, not all macros in Lollipop automatically
accept labels for referencing, only the ones that use the \n{label}
option, or that have a counter (remember, the default form of the
reference is just the counter). If you want a macro that has no
counter and no label specification to accept a label, use the option
\refopt{haslabel}. One reason for doing this is that you have access to
the label itself through the control sequence \refcs{RefLabel}.

\Chapter[chap:external-files] External Files

Some document require information to be collected during a run. Such
information typically is a table of contents or index, and it is
gathered in an external file. (The reason for gathering such
information in a file at all is that often some external manipulation,
for instance sorting of an index, is needed.) Since there are many
possibilities for external files (mathematical monographs may have a
list of definitions, or a list of notations) \Lollipop\ does not
predefine such files, but supplies all of the tools for creating them.

External files involve four actions: 
\Enumerate\item The file should be declared.
\item It should be specified what information is to be written to the
file.
\item The formatting of the contents of the file has to be specified.
\item The file has to be loaded.
\>

You can have at most 15 external files per document.

\Section[sec:write-extern] Declaring and loading an external file

The first act, declaring the existence of the external file is very
easy with the command \refcs{DefineExternalFile}:
 an internal name and a three-character file name extension have
to be given as parameters.
\Ver>\DefineExternalFile:contents=toc<Rev
With this definition, if the document is called \file{book.tex} then
the `contents' will be gathered in a file called \file{book.toc}.
(The declaration of an external file has to come before any calls
to \cs{ExternalItem} or any options \n{external} that write
to this file.)

For each external file \n{Foo} there is a command to determine whether
that file will be regenerated in the next run of \TeX:
\refcs{WriteFoo} with values \n{yes}/\n{no} will allow or prevent the
file being regenerated. The value \opt{yes} is default. The
command \refcs{WriteExtern} (values \n{yes}/\n{no})
can be used to prevent writing out any external files (including the
\file{.aux} file that keeps track of references).

The final act, loading an external file, is as easy as declaring it:
use \refcs{LoadExternalFile} as in
\Ver>\LoadExternalFile:contents<Rev
This does not cause any page breaks or headings to be set over the
loaded material, so you have to do that explicitly.

\Section[sec:ext-option] Generating external files

Next, macros that write to the table of contents have to declare this
information. The \refopt{external} option is used for this.
Any counter that the construct has will be written out
automatically, and the style designer usually has to specify only
that the title will be written out.
\Ver>\DefineHeading:Section
    [...]
    external:contents title external:stop<Rev

There is no objection to a construct writing information to more than
one external file.

If you write more than just \n{title} to an external file, know that
any control sequence you specify is automatically protected from 
expansion. See section~\ref[opt:csname] for an exception to this.

Other titles can be included by specifying \opt{title:OtherThing}.
Using \opt{OtherThingTitle} would not work, because of the protection
of control sequences mentioned above.

You can write arbitrary information to an external file, if you see a
reason to do so, by \refcs{ToExternalFile}, which takes a file name
and an text argument. The example below has an instance of this
command. In order to format this information you have to define an
external construct of type \cs{anon}.

\Section[sec:ext-item] Formatting an external file

The hardest part is declaring the formatting of an external file. For
this a separate generic construct exists: the `external item' with
defining command \refcs{DefineExternalItem}. For example, if
\cs{Section} writes to \n{contents}, than an external item \n{Section}
corresponding to this file has to be declared. The option
\refopt{file} is use to declare to which file the external item
belongs. This way the same name can be reused for more than one file.

\Ver>\DefineExternalItem:Section file:contents
    [...] Stop<Rev

An external item is basically a list with just one item. Thus, the
option \refopt{item} is available. The elements of an external item are
the label (the counter value), the page number where the information
was generated, and the title. 
For the label (say for a construct \cs{Foo})
an option \refopt{FooLabel} is created.
Thus the typical formating looks like
\Ver>\DefineExternalItem:Chapter file:contents
    item:left ChapterLabel item:stop
    title begingroup Spaces:2 Style:italic Page endgroup
    Stop<Rev
In fact, a control sequence \refcs{FooLabel} is created, which
can be used in other external items.

Since an external item is a list in itself, you have to pull a
certain trick to get items for subsections to indent further than
those for sections. This is what the command \cs{PushIndentLevel} was
designed for.

A typical indented item looks like:
\Ver>\DefineExternalItem:SubSection file:contents
    PushIndentLevel PushIndentLevel
    item:left SectionLabel . SubSectionLabel item:stop
    title begingroup Spaces:2 Style:italic Page endgroup
    Stop<Rev

\Section Example

The following example is for a typical table of contents that
records sections and subsections. In good old-fashioned style, the
subsections are indented with respect to the sections.
\endinput
\Example
\DefineExternalFile:TheContents=tct
\DefineHeading:TestChapter Style:bold
 line:start TestChapterCounter Spaces:2 title line:stop
 external:TheContents title external:stop Stop
\DefineExternalItem:TestChapter file:TheContents
 item:left Style:bold TestChapterLabel item:stop title white:5pt
      Page par Stop
\DefineHeading:TestSection Style:italic
 line:start TestChapterCounter . TestSectionCounter 
            Spaces:2 title line:stop
 external:TheContents title external:stop Stop
\GoverningCounter:TestSection=TestChapter
\DefineExternalItem:TestSection file:TheContents PushIndentLevel
 item:left Style:bold TestChapterLabel . TestSectionLabel item:stop 
 title white:5pt Page par Stop
\DefineExternalItem:anon file:TheContents begingroup
 Style:italic title white:5pt Page par Stop

\LoadExternalFile:TheContents
\TestChapter First heading\par
\TestSection First subheading\par
Some text might be nice.
\TestSection Second subheading\par
Some more text.
\ToExternalFile:TheContents={Enclosed Graphics}
\TestChapter Second heading\par
\TestSection Third subheading\par
Yet more text.
\TestSection Fourth subheading\par
And again: text.
\ExampleStop

\endinput

% 92/11/26 BibTeX section
