%
% \GetFileInfo{gmiflink.sty}
% \title{The \pk{gmiflink} Package\thfileinfo}
% \author{Grzegorz `Natror' Murzynowski}
% \maketitle
%
%
% \begin{copyrnote}
%
%%   Written by Grzegorz `Natror' Murzynowski,
%%   natror at o2 dot pl
%%
%% \copyright\,2005, 2006 by Grzegorz `Natror' Murzynowski.
%%
%% This program is subject to the \LaTeX\ Project Public License.
%% See ^^A
%% \url{http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html} ^^A
%% for the details of that license.
%%
%% LPPL status: "author-maintained".\par
%
%\end{copyrnote}
%
% \CheckSum{61}
%% 

% \skiplines
% This is a~driver. To learn how to use it, read the README
% or the documentation in .pdf

\ifnum\catcode`\@=12
\documentclass[codespacesgrey, noindex, nochanges, pagella]{gmdocc}% ^^A
% the package is to small to make an index of its macros and it's too
% old to have the |\changes| ^^A( 
% history ;-)\,.
\begin{document}
\DocInput{gmiflink.sty}
\afterfi{\end{document}}
\fi

% \endskiplines


\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{gmiflink}
     [2006/08/16 v0.97 Conditionally hyperlinking package (GM)]

%%
%% \division{Introduction, usage}
%%
%% This package protects you against an error when a link is
%% dangling and typesets some plain text instead of a hyperlink then. It
%% is intended for use with the \pk{hyperref} package. Needs
%% \emph{two} \LaTeX\ runs.
%
% I used it for typesetting the names of the objects in
% a~documentation of a~computer program. If the object had been
% defined a \cs{hyperlink} to its definition was made, otherwise a
% plain object's name was typeset.  I also use this package in
% authomatic making of hyperlinking indexes.
% \dekmedskip
%
% The package provides the macros \cs{gmiflink}, \cs{gmifref} and
% \cs{gmhypertarget} for conditional making of hyperlinks in your
% document.
%
% \newcommand*\aName{\gmiflink[@name]{\hskip-1.5pt @name}}
% \TextUsage\gmhypertarget\oarg{name}\marg{\gmiflink{text}} makes
% a~\cs{hypertarget\marg{\aName}\marg{text}} and \possfil
% a~\cs{label\marg{\aName}}.
%
% \TextUsage\gmiflink\oarg{name}\marg{text} makes
% a~\cs{hyperlink\marg{\aName}\marg{text}} to a~proper hypertarget if
% the corresponding \emph{label} exists, otherwise it typesets
% \<text>.
%
% \TextUsage\gmifref\oarg{name}\marg{text} makes a~(hyper-)
% \cs{ref\marg{\aName}} to the given label if the label exists,
% otherwise it typesets \<text>.
%
% The \raisebox{1em}[0pt]{\gmhypertarget[@name]{}}\<\hskip-1.5pt @name>
% ^^A~raisebox 'cause Acrobat sets the hypertarget at the baseline
% argument is just \<name> if the \<name>
% is given, otherwise it's \<text> in all three macros.
%
% For the example(s) of use, examine the \pk{gmiflink.sty} file, lines
% 45--58.
%
% \begin{gmlonely}
%   \subdivision{Installation}
%
%   Unpack the \file{gmiflink-tds.zip} (this is an archive conforming
%   the \acro{TDS} standard, see \file{CTAN/tds/tds.pdf}) in
%   a~\file{texmf} directory or put the \pk{gmiflink.sty} somewhere in
%   the \file{texmf/\:tex/\:latex} branch on your own. (Creating
%   a~\file{texmf/\:tex/\:latex/\:gm} directory may be advisable if
%   you consider using other packages written by me.)
%
%   Then you should refresh your \TeX\ distribution's files' database
%   most probably. 
% \end{gmlonely}
%
%
% \subdivision{Contents of the \pk{gmiflink.zip} archive}
%
% The distribution of the \pk{gmiflink} package consists of the
% following three files and a~\acro{TDS}-compliant archive.
% \begin{verse}
%   \pk{gmiflink.sty}\\
%   \pk{README}\\
%   \pk{gmiflink.pdf}\\
%   \pk{gmiflink.tds.zip}
% \end{verse}
%
%
% \begin{gmlonely}
%   \subdivision{Compiling the Documentation}
%
%   The last of the above files (the \pk{.pdf}, i.e., \emph{this
%     file}) is a~documentation compiled from the \pk{.sty} file by
%   running \LaTeX\ on the \pk{gmiflink.sty} file 
%   (|xelatex gmiflink.sty| in the directory you wish the
%   documentation to be in, you don't have copy the \file{.sty} file
%   there, \TeX\ will find it).  Compiling the documentation requires the
%   packages: \pk{gmdoc} (\pk{gmdoc.sty} and \pk{gmdocc.cls}),
%   \pk{gmverb.sty}, \pk{gmutils.sty}, \pk{gmiflink.sty} and also some
%   standard packages: \pk{hyperref.sty}, \pk{xcolor.sty},
%   \pk{geometry.sty}, \pk{multicol.sty}, \pk{lmodern.sty},
%   \pk{fontenc.sty} that should be installed on your computer by
%   default.
%
%   If you had not installed the \pk{mwcls} classes (available on
%   CTAN and present in \TeX\ Live e.g.), the result of your
%   compilation might differ a~bit from the \pk{.pdf} provided in this
%   \pk{.zip} archive in formatting: If you had not installed
%   \pk{mwcls}, the standard \pk{article.cls} class would be used.
% \end{gmlonely}
%
% \StopEventually{\NoEOF}
%
% 
% \division{The Code}

\@ifpackageloaded{hyperref}{}{\message {^^J^^J gmiflink package:
    There's no use of me without hyperref package, I end my input.^^J}\endinput}

\providecommand\empty{} 
% A~new counter, just in case
\newcounter{GMhlabel}
\setcounter{GMhlabel}{0}

% The macro given below creates both hypertarget and hyperlabel, 
% so that you may reference both ways: via |\hyperlink| and via |\ref|.
% It's pattern is the |\label| macro, see \LaTeX\ Source2e, file x, line 32.
%
% But we don't want to gobble spaces before and after.
% First argument will be a~name of the hypertarget,
% by default the same as typeset text, i.e., argument |#2|.
% \Define\gmhypertarget
\DeclareRobustCommand*\gmhypertarget{%
  \@ifnextchar{[}{\gm@hypertarget}{\@dblarg{\gm@hypertarget}}}
%^^A]

\def\gm@hypertarget[#1]#2{% ^^A
  % If argument |#1|\equals|\empty|, then we'll use |#2|, i.e., the same as
  % name of hypertarget.
  \refstepcounter{GMhlabel}% ^^A
  % we |\label{\gmht@firstpar}|
  \hypertarget{#1}{#2}%
  \protected@write\@auxout{}{%
    \string\newlabel{#1}{{#2}{\thepage}{\relax}{GMhlabel.\arabic{GMhlabel}}{}}}%
}% end of |\gm@hypertartget|.

% We define a~macro such that if the target exists, it makes
% |\ref|, else it typesets ordinary text.
% \Define\gmifref
\DeclareRobustCommand*\gmifref{\@ifnextchar{[}{\gm@ifref}{%]
    \@dblarg{\gm@ifref}}}

\def\gm@ifref[#1]#2{%
  \expandafter\ifx\csname r@#1\endcsname\relax\relax%
  #2\else\ref{#1}\fi%
}%  end of |\gm@ifref|

% \Define\gmiflink
\DeclareRobustCommand*\gmiflink{\@ifnextchar{[}{\gm@iflink}{%^^A]
    \@dblarg{\gm@iflink}}}

\def\gm@iflink[#1]#2{%
  \expandafter\ifx\csname r@#1\endcsname\relax\relax%
  #2\else\hyperlink{#1}{#2}\fi%
}% end of |\gm@iflink|
%
% It's robust because when just |\newcommand*|ed, use of |\gmiflink| in an
% indexing macro resulted in errors: |\@ifnextchar| has to be
% |\noexpand|ed in |\edef|s.

\endinput

% The old version --- all three were this way primarily.
%\begin{verbatim}
\newcommand*\gmiflink[2][\empty]{{%
  \def\gmht@test{\empty}\def\gmht@firstpar{#1}%
  \ifx\gmht@test\gmht@firstpar\def\gmht@firstpar{#2}\fi%
  \expandafter\ifx\csname r@\gmht@firstpar\endcsname\relax\relax%
  #2\else\hyperlink{\gmht@firstpar}{#2}\fi%
}}
% \end{verbatim}
% \Finale

% (For my GNU Emacs:)
%%% Local Variables: 
%%% mode: doctex
%%% End: