% \iffalse meta-comment % % hypcap.dtx % % This file is part of the package `hypcap' for use with LaTeX2e. % % Function: Adjusting anchors of captions. % % Copyright (C) 1999-2001 Heiko Oberdiek. % % This program may be distributed and/or modified under % the conditions of the LaTeX Project Public License, % either version 1.2 of this license or (at your option) % any later version. The latest version of this license % is in % http://www.latex-project.org/lppl.txt % and version 1.2 or later is part of all distributions % of LaTeX version 1999/12/01 or later. % % Please send error reports and suggestions for improvements to % Heiko Oberdiek . % %<*dtx> \ProvidesFile{hypcap.dtx} % %\ProvidesPackage{hypcap} %\ProvidesFile{hypcap.drv} % \fi % \ProvidesFile{hypcap.dtx} [2001/08/27 v1.3 Adjusting anchors of captions (HO)] % % \GetFileInfo{hypcap.dtx} % \CheckSum{131} % %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} %% % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage{holtxdoc} \begin{document} \DocInput{hypcap.dtx} \end{document} % % \fi % % \DoNotIndex{\else,\fi,\csname,\endcsname} % \DoNotIndex{\def,\edef,\long,\begingroup,\endgroup} % \DoNotIndex{\the,\relax,\expandafter} % % \SetupTitle{hyperref, caption, anchor, TeX} % \maketitle % % \begin{abstract} % This package tries a solution of the problem with % hyperref, that links to floats points below the % caption and not at the beginning of the float. % Therefore this package divides the task into two % part, the link setting with \cmd{\capstart} or % automatically at the beginning of a float and % the rest in the \cmd{\caption} command. % \end{abstract} % % \tableofcontents % % \section{Usage} % The package \Package{hypcap} requires that \Package{hyperref} % is loaded first: % \begin{quote} % |\usepackage[...]{hyperref}|\\ % |\usepackage[...]{hypcap}| % \end{quote} % % \subsection{Package options} % The names of the four float environments |figure|, |figure*|, % |table|, or |table*| can be used as option. Then the package % overloads the environment in order to insert \cmd{\capstart} % (see below) in the beginning of the environment automatically. % % Option |all| enables the overloading of all four % float environments. For other environments see % the user command \cmd{\hypcapredef}. % % \subsection{User commands} % \begin{description} % \item[\cmd{\capstart}:]\DescribeMacro{\capstart} % First it increments the counter (\cmd{\@captype}). Then it % makes an anchor for package \Package{hyperref}. % At last \cmd{\caption} is redefined to remove the % anchor setting part from \Package{hyperref}'s \cmd{\caption}. % % The package expects the following structure of a float % environment: % \begin{quote} % |\begin{|\textit{|float|}|}...|\\ % |\capstart|\\ % |...|\\ % |\caption{...}|\\ % |...|\\ % |\end{|\textit{|float|}|}| % \end{quote} % There can be several \cmd{\caption} commands. For these % you need \cmd{\capstart} again: % \begin{quote} % |\capstart ... \caption... \capstart ... \caption...| % \end{quote} % And the \cmd{\caption} command itself can be put in a group. % % The options, described above, safe writing the % first \cmd{\capstart} in the float environment. % But also there must be a \cmd{\caption} in every % environment of this type. % \item[\cmd{\hypcapspace}:]\DescribeMacro{\hypcapspace} % Because it looks poor, if the link points exactly at top of % the figure, there is additional space: \cmd{\hypcapspace}, % the default is |0.5\baselineskip|, examples: % \begin{quote} % |\renewcommand{\hypcapspace}{0pt}| removes the space\\ % |\renewcommand{\hypcapspace}{1pt}| sets a fix value % \end{quote} % \item[\cmd{\hypcapredef}:]\DescribeMacro{\hypcapredef} % If there are other float environments, that % should automatically execute \cmd{\capstart}, then % a redefinition with \cmd{\hypcapredef} can be tried: % \begin{quote} % |\hypcapredef{myfloat}| % \end{quote} % Only environments with one optional parameter are % supported. % \end{description} % % \subsection{Limitations} % \begin{itemize} % \item Package \Package{subfigure} does not work. % \item Packages that redefine \cmd{\caption} or % \cmd{\@caption}. % \end{itemize} % % \Installation % % \StopEventually{} % % \section{Implementation} % \begin{macrocode} %<*package> % \end{macrocode} % The package identification is done at the top of the |.dtx| file % in order to use only one identification string. % % For unique command names this package uses |hc@| as prefix % for internal command names. % % First we check, if package \Package{hyperref} is loaded: % \begin{macrocode} \@ifundefined{hyper@@anchor}{% \PackageError{hypcap}{You have to load 'hyperref' first}\@ehc \endinput }{} % \end{macrocode} % % \begin{macro}{\hc@org@caption} % Save the original meaning of \cmd{\caption}: % \begin{macrocode} \newcommand*\hc@org@caption{} \let\hc@org@caption\caption % \end{macrocode} % \end{macro} % % \newcommand*{\BeginMacro}[1]{\expandafter\DoBeginMacro\csname#1\endcsname} % \newcommand*{\DoBeginMacro}[1]{\begin{macro}{#1}} % \newcommand*{\Cmd}[1]{\expandafter\cmd\csname#1\endcsname} % \BeginMacro{if@capstart} % The switch \Cmd{if@capstart} helps to detect % \cmd{\capstart} commands with missing \cmd{\caption} macros. % Because \cmd{\caption} can occur inside a group, assignments % to the switch have to be made global. % \begin{macrocode} \newif\if@capstart % \end{macrocode} % \end{macro} % % \begin{macro}{\hypcapspace} % The anchor is raised.by \cmd{\hypcapspace}. % \begin{macrocode} \newcommand*\hypcapspace{.5\baselineskip} % \end{macrocode} % \end{macro} % % \begin{macro}{\capstart} % The macro \cmd{\capstart} contains the first part of % the \cmd{\caption} command: Incrementing the counter % and setting the anchor. % \begin{macrocode} \newcommand*\capstart{% \H@refstepcounter\@captype % first part of caption \hyper@makecurrent\@captype \vspace*{-\hypcapspace}% \begingroup \let\leavevmode\relax \hyper@@anchor\@currentHref\relax \endgroup \vspace*{\hypcapspace}% \let\caption\hc@caption \global\@capstarttrue } % \end{macrocode} % \end{macro} % % \begin{macro}{\hc@caption} % The new \cmd{\caption} command without the first part % is defined in the macro \cmd{\hc@caption}. % \begin{macrocode} \def\hc@caption{% \@dblarg{\hc@@caption\@captype}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\hc@@caption} % This is a copy of package \Package{hyperref}'s \cmd{\@caption} % macro without making the anchor, because this is already done % in \cmd{\capstart}. % \begin{macrocode} \long\def\hc@@caption#1[#2]#3{% \let\caption\hc@org@caption \global\@capstartfalse \hyper@makecurrent\@captype \par\addcontentsline{% \csname ext@#1\endcsname}{#1}{% \protect\numberline{% \csname the#1\endcsname }{\ignorespaces #2}% }% \begingroup \@parboxrestore \normalsize \@makecaption{\csname fnum@#1\endcsname}{% \ignorespaces#3% }% \par \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\hypcapredef} % The macro \cmd{\hypcapredef} prepares the call of % \cmd{\hc@redef} that will redefine the environment % that is given in the argument. % \begin{macrocode} \def\hypcapredef#1{% \expandafter\hc@redef\csname hc@org#1\expandafter\endcsname \csname hc@orgend#1\expandafter\endcsname \expandafter{#1}% } % \end{macrocode} % \end{macro} % \begin{macro}{\hc@redef} % The old meaning of the environment is saved. Then % \cmd{\capstart} is appended in the begin part. % The end part contains a check % that produces an error message in case of \cmd{\capstart} % without \cmd{\capstart} (\cmd{\capstart} has incremented % the counter). % \begin{macrocode} \def\hc@redef#1#2#3{% \newcommand#1{}% \expandafter\let\expandafter#1\csname#3\endcsname \expandafter\let\expandafter#2\csname end#3\endcsname \renewenvironment*{#3}[1][]{% \ifx\\##1\\% #1\relax \else #1[##1]% \fi \capstart }{% \if@capstart \PackageError{hypcap}{You have forgotten to use \string\caption}% \global\@capstartfalse \else \fi #2% }% } % \end{macrocode} % \end{macro} % % At last the options are defined and processed. % \begin{macrocode} \DeclareOption{figure}{\hypcapredef{\CurrentOption}} \DeclareOption{figure*}{\hypcapredef{\CurrentOption}} \DeclareOption{table}{\hypcapredef{\CurrentOption}} \DeclareOption{table*}{\hypcapredef{\CurrentOption}} \DeclareOption{all}{% \hypcapredef{figure}% \hypcapredef{figure*}% \hypcapredef{table}% \hypcapredef{table*}% } \ProcessOptions\relax % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \StartHistory % \HistVersion{1999/02/13 v1.0} % \begin{itemize} % \item A beginning version. % \end{itemize} % \HistVersion{2000/08/14 v1.1} % \begin{itemize} % \item Global assignments of |\if@capstart| % in order to allow |\caption| in groups. % \item Option |all| added. % \end{itemize} % \HistVersion{2000/09/07 v1.2} % \begin{itemize} % \item Package in dtx format. % \end{itemize} % \HistVersion{2001/08/27 v1.3} % \begin{itemize} % \item Bug fix with hyperref's pdfmark driver\\ % (\verb|\leavevmode| in % \verb|\hyper@@anchor|/\verb|\pdf@rect|). % \end{itemize} % % \PrintIndex % % \Finale \endinput