% $Id: xhyper.tex 60 2022-10-05 22:42:54Z karl $
% (This file is public domain.)
%
% This file demonstrates the following features of Eplain:
%
%   - explicit and implicit hyperlinks;
%   - symbolic cross-references;
%   - inserting external graphics using |\includegraphics| from
%     the \LaTeX\ package |graphicx.sty|.
%   - rotating text using |\rotatebox| from |graphicx.sty|.
%
% The compiled demo can be downloaded from
%
%   https://tug.org/eplain/demo
%
% In order to compile this file yourself, you will need the CTAN lion
% drawing by Duane Bibby from
%
%   ftp://tug.ctan.org/ftpmaint/CTAN_lion/ctan_lion_350x350.png
%
% (thanks, |www.ctan.org|).  Place the image file in the same
% directory with this file, and change to that directory.  Now, to
% produce a PDF, run twice the command
%
%   pdftex xhyper.tex
%
% During the first run, Eplain will write the information about the
% cross-references into |xhyper.aux|, and during the second run this
% information will be read by Eplain to typeset the references.
%
% Demo case:
%
%   Suppose you are using pdf\TeX, have a figure you want to insert
%   scaled to $200\,pt$ horizontally, and you want this figure to
%   completely fill the PDF viewer's window whenever the reader
%   selects a link pointing to this figure.  Additionally, you want to
%   typeset some text as live hyperlinks, clicking on which will start
%   a Web browser and open a URL.

\input eplain

% Load \LaTeX\ packages.
\beginpackages
  % |url.sty| provides the |\url| command which we will use to typeset
  % a URL.  We request that |url.sty| be the version from June~27,
  % 2005, or later, because earlier versions had problems interacting
  % with plain \TeX.
  \usepackage{url}[2005/06/27]
  % |color.sty| provides support for colored text; all hyperlinks are
  % automatically colored by Eplain when this package is loaded.  We give
  % the |dvipsnames| option because we want to use named colors from the
  % |dvips| graphics driver.
  \usepackage[dvipsnames]{color}
  % Finally, we load |graphicx.sty|, for the macros |\includegraphics|
  % and |\rotatebox|.
  \usepackage{graphicx}
\endpackages

% Remember that hyperlinks are off by default.  Therefore, we need to
% enable them.
\enablehyperlinks

% Customize some hyperlink options.  First, we set border width to~$0$
% for all links to get rid of the default boxes around links (we
% prefer colored links over the boxed links). Next, we say that all
% links created by the |url| hyperlink group (which means the |\url|
% command from |url.sty|) must be colored using the named color
% |BlueViolet|.
\hlopts{bwidth=0}
\hlopts[url]{colormodel=named,color=BlueViolet}

% Inhibit page numbering (we have only one page).
\nopagenumbers

% Define a class word for the cross-reference class |figure|.  This
% word, when defined, will be automatically prepended by Eplain to the
% reference created by |\ref| (read on to see its use).
\def\figureword{fig.}

% Allocate a count register for the figure's number, and a box
% register which we'll use to measure dimensions of the image.
\newcount\fignumber
\newbox\imgbox

% Now comes the fun part--constructing the figure for the image of the
% \CTAN\ lion.  We define a macro
%
%   \fig{LABEL}{FILENAME}{CAPTION}{WIDTH}
%
% which creates a figure using LABEL for the cross-reference and
% hyperlink label, reading the image from file FILENAME, using CAPTION
% to name the figure, and WIDTH to scale the image horizontally.
\def\fig#1#2#3#4{%
  % Leave some space above the figure.  This will also ensure that we
  % are in the vertical mode before we produce a |\vbox|.
  \medskip
  % Advance the figure number.  |\global| ensures that the change to
  % the count register is global, even when |\fig| is buried inside a
  % group.
  \global\advance\fignumber by 1
  % We use |\includegraphics| (from |graphicx.sty|) to load the image,
  % scaled to the specified width, into our ``measuring'' box
  % |\imgbox|.
  \setbox\imgbox = \hbox{\includegraphics[width=#4]{#2}}%
  % To make the demo even more exciting, let's put the figure's
  % caption to the left of the image into the |\indent| space of the
  % new paragraph, and rotate the caption~$90^\circ$.
  \textindent{%
    \rotatebox{90}{F{\sc IGURE}~\the\fignumber.  #3}%
  }%
  % Continue the paragraph by constructing a |\vbox| with the image of
  % the lion.  We use |\definexref| to define the cross-reference
  % label.
  \vbox{%
    % In addition to the cross-reference label, |\definexref| will
    % create a hyperlink destination with the same label.  Therefore,
    % we customize this destination to do what we need.  We say that
    % destination type for the hyperlink group |definexref| (to which
    % |\definexref| belongs) should be |fitr|.  This destination type
    % will magnify the rectangle specified by the options |width|,
    % |height| and |depth| to the PDF viewer's window.  Therefore, we
    % set those options accordingly with |\hldestopts| (notice the use
    % of |depth| instead of |height|---we will want the rectangle to
    % extend {\it downward}, to cover the image which will come
    % next).  Notice that these settings will be isolated within the
    % current group (i.e., the |\vbox| we're constructing).
    \hldesttype[definexref]{fitr}%
    \hldestopts[definexref]{width=\wd\imgbox,height=0pt,depth=\ht\imgbox}%
    % We define a symbolic label so that we can later refer
    % to the figure with |\ref|.  The command |\definexref| does
    % exactly that.  The last argument to |\definexref| specifies
    % class of the label, which determines the word used by |\ref| in
    % front of the reference text (remember that we've defined
    % |\figureword| above).
    \definexref{#1}{\the\fignumber}{figure}%
    % Finally, produce the image which we've been stashing in the box
    % register |\imgbox|.
    \box\imgbox
  }%
  \medskip
}

% Create the figure.
\fig{CTANlion}{ctan_lion_350x350}{Lion in the archives}{200pt}

% Finished with the fun part, we can relax and typeset some
% hyperlinks.  The easiest way to do that is to use the |\ref|
% cross-reference command.  We can even pass an optional argument
% (|the lion in|), which will be placed before the class word (|fig.|)
% and become part of the link (to make sure the reader does not have
% to aim too hard).
Show me \ref[the lion in]{CTANlion}.

% If you are the restless kind, here's another way to create a
% hyperlink to the image:  we create a link explicitly by using
% |\hlstart ... \hlend|.  We don't specify the link type, therefore
% the default type |name| will be used (these are ``named links'',
% i.e., links pointing to destinations identified by labels).  In the
% options argument, we specify that the border of the link should be
% inverted when the user clicks the link (|hlight=O|), and also set
% special color for this link, overriding the default dark-red.  The
% label for the destination is the same as the cross-reference label,
% |CTANlion|.
Show me
\hlstart{}{hlight=O,colormodel=named,color=OliveGreen}{CTANlion}
  the CTAN lion\hlend.

% Let's now point somewhere outside our document.  Eplain homepage is
% a good target.  In the similar spirit, let's consider two
% approaches.  The easy one is to use the |\url| command from
% |url.sty|.  Remember that we have customized the color of |url|
% hyperlinks, so this one will show up with a different color than the
% default dark-red.
Take me to \url{https://tug.org/eplain}.

% The second approach is to create an explicit URL link.  We specify
% yet another border highlighting mode, |P|, which means that the
% region underneath the bounding box of the link will be drawn inset
% into the page.  Also, let's set the color of the hyperlink to an RGB
% color |0.4,0.1,0.4|.  Since we cannot use commas to separate the
% color elements inside the options parameter to |\hlstart| (commas
% there separate options), we have to first create a user-defined
% color with |\definecolor| from |color.sty|, and use that in
% |\hlstart|.
\definecolor{mycolor}{rgb}{0.4,0.1,0.4}

Take me to
\hlstart{url}{hlight=P,colormodel=,color=mycolor}{https://tug.org/eplain}
  Eplain homepage\hlend.

\bye
