summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/gmiflink/gmiflink.sty
blob: d383622f58568e7e10206ab85c394682dd65b823 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
%
% \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: