如何使超链接指向链接图形和枚举项的顶部?

如何使超链接指向链接图形和枚举项的顶部?

我想创建一本问题手册。每个问题编号为 ,enumerate最多有一个图形,该图形可以位于其中marginpar或浮动并占据整个宽度。

每个图的标题都有指向相应问题的超链接。从问题中,我们也可以找到指向相应图的链接。

我使用自动生成的标签

\def\qMark{Q.\arabic{chapter}.\arabic{section}.\arabic{enumi}}
\def\fMark{F.\arabic{chapter}.\arabic{section}.\arabic{enumi}}

建立链接。

我添加了\usepackage[all]{hypcap}以获得更好的链接行为,即,单击超链接将引导我们到链接对象的顶部而不是需要我们调整视图的点。

\documentclass[12pt]{book}
\usepackage[
    a4paper,
    vmargin=2cm,
    outermargin=9cm,
    innermargin=2cm,
    marginparwidth=7cm,
    marginparsep=20pt
]{geometry}


\usepackage{graphicx}
\usepackage{marginfix}
\usepackage{ifoddpage}
\usepackage{caption}

\usepackage{lipsum}

\usepackage[colorlinks,bookmarksnumbered]{hyperref}
\usepackage[all]{hypcap}


\def\qMark{Q.\arabic{chapter}.\arabic{section}.\arabic{enumi}}
\def\fMark{F.\arabic{chapter}.\arabic{section}.\arabic{enumi}}

\let\tempItem=\item
\renewcommand\item{\tempItem\label{\qMark}}

\def\getQRef{Problem~\ref{\qMark}}
\def\getFRef{\figurename~\ref{\fMark}}


\newcommand\MarginFig{%
\marginpar{\includegraphics[width=\linewidth]{example-image-a}
\captionof{figure}{For \getQRef.}\label{\fMark}%
}}

\newcommand\FullFig{%
\begin{figure}[hbtp]
    \checkoddpage
  \edef\side{\ifoddpage l\else r\fi}%
    \makebox[\textwidth][\side]{% 
    \parbox{\dimexpr\textwidth+\marginparwidth+\marginparsep\relax}{%
        \includegraphics[width=\linewidth]{example-image-b}
        \caption{For \getQRef.}
        \label{\fMark}}}
\end{figure}
}


\begin{document}
\chapter{Higgs Boson}

\begin{enumerate}
\item
\MarginFig
\getFRef\
\lipsum[1]

\item
\lipsum[1]

\item
\FullFig
\lipsum[1]\getFRef.

\item
\MarginFig
\lipsum[1]\getFRef.

\item
\FullFig
\lipsum[1]\getFRef.

\item
\MarginFig
\lipsum[1]\getFRef.

\item
\lipsum[1]
\end{enumerate}

\end{document}

不幸的是,单击例如Figure 1.3或 的Problem 3行为并不像预期的那样。请亲自尝试一下以了解情况。

如何解决这个问题?

答案1

你可以把它放在\label框的顶部。(我也在%行尾添加了一些)

\documentclass[12pt]{book}
\usepackage[
    a4paper,
    vmargin=2cm,
    outermargin=9cm,
    innermargin=2cm,
    marginparwidth=7cm,
    marginparsep=20pt
]{geometry}


\usepackage{graphicx}
\usepackage{marginfix}
\usepackage{ifoddpage}
\usepackage{caption}

\usepackage{lipsum}

\usepackage[colorlinks,bookmarksnumbered]{hyperref}
\usepackage[all]{hypcap}


\def\qMark{Q.\arabic{chapter}.\arabic{section}.\arabic{enumi}}
\def\fMark{F.\arabic{chapter}.\arabic{section}.\arabic{enumi}}

\let\tempItem=\item
\renewcommand\item{\tempItem\leavevmode\label{\qMark}\ignorespaces}

\def\getQRef{Problem~\ref{\qMark}}
\def\getFRef{\figurename~\ref{\fMark}}

\makeatletter
\newcommand\MarginFig{%
\marginpar{%
\refstepcounter{figure}%
\label{\fMark}%
\let\refstepcounter\@gobble
\let\H@refstepcounter\@gobble
\let\hyper@@anchor\@gobble
\includegraphics[width=\linewidth]{example-image-a}%
\captionof{figure}{For \getQRef.}%
}}

\newcommand\FullFig{%
\begin{figure}[hbtp]%
    \checkoddpage
  \edef\side{\ifoddpage l\else r\fi}%
\refstepcounter{figure}%
    \makebox[\textwidth][\side]{\label{\fMark}% 
    \parbox{\dimexpr\textwidth+\marginparwidth+\marginparsep\relax}{%
\let\refstepcounter\@gobble
\let\H@refstepcounter\@gobble
\let\hyper@@anchor\@gobble
        \includegraphics[width=\linewidth]{example-image-b}%
        \caption{For \getQRef.}}}%
\end{figure}%
}
\makeatother

\begin{document}
\chapter{Higgs Boson}

\begin{enumerate}
\item
\MarginFig
\getFRef\
\lipsum[1]

\item
\lipsum[1]

\item
\FullFig
\lipsum[1]\getFRef.

\item
\MarginFig
\lipsum[1]\getFRef.

\item
\FullFig
\lipsum[1]\getFRef.

\item
\MarginFig
\lipsum[1]\getFRef.

\item
\lipsum[1]
\end{enumerate}

\end{document}

答案2

hypcap 修改四个环境(带有选项all):figurefigure*和。 以下几行通过table启动重新定义:table*hypcap.sty\hypcapredef

\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*}%
}

进行这种修改的原因是它必须将超引用锚点放置在环境的开始处,而不是在调用处\caption。因此,简而言之,hypcap如果您在这四个环境之外“使用它”,它将无法按预期执行。

解决方法是使用其中一个环境没有让它浮动——这就是 a 的\marginpar作用。为此,float包裹很方便,因为它提供了H浮点说明符。因此,以下定义\MarginFig按预期工作:

\usepackage{float}% http://ctan.org/pkg/float
\newcommand\MarginFig{%
  \marginpar{%
    \begin{minipage}{\marginparwidth}
      \begin{figure}[H]
        \includegraphics[width=\linewidth]{example-image-a}
        %\captionof{figure}{For \getQRef.}\label{\fMark}%
        \caption{For \getQRef.}\label{\fMark}%
      \end{figure}
    \end{minipage}
  }}

内部的额外换行minipage是为了确保生成的图形具有适当的宽度。您可能会发现 的垂直对齐方式有所不同,\marginpar因为其内容被换行在 内minipage。这是 的典型minipage行为,因此可能需要进行一些调整。

相关内容