如何使用自定义函数获取链接到图形列表中条目的图形标题

如何使用自定义函数获取链接到图形列表中条目的图形标题

我正在尝试实现以下内容,我有一个条件定义的新命令,可以与 caption 命令一起使用,以便我可以给它一个简短的长标题,或者只是一个长标题,通过以下方式实现

\documentclass{book} 
\usepackage{graphicx}
\usepackage{hyperref}

\usepackage{xparse}
\NewDocumentCommand \capLF { m o }{%
\IfNoValueTF{#2}
    {% No optional 'o' given which is 2nd entry -> use mandatory option, which is 1st arguemnt 'm'
    \caption[#1]{\hyperlink{LoF}{#1}}%
    }
    {% Optional given -> use both
    \caption[#2]{\hyperlink{LoF}{#1}}
    }%
}

\begin{document}

\hypertarget{LoF}{}\listoffigures

\newpage

\begin{figure}[htb]
    \centering 
    \includegraphics[width=0.5\textwidth]{G.pdf}
    \capLF{Long Caption for Image}[Short Caption]
    \label{fig:sample_image}
\end{figure}

\begin{figure}[htb]
    \centering 
    \includegraphics[width=0.5\textwidth]{G.pdf}
    \capLF{Long Caption for Image}
    \label{fig:sample_image}
\end{figure}


\end{document}

目前,当单击标题时,它会将您带到页面顶部的图表列表 (lof),但是,我希望能够实现这样的功能:当单击标题时,它会将您带到 lof 中的标题条目,就像已经完成的那样 这里,我按照以下方式使用

\documentclass{book} 
\usepackage[demo]{graphicx}
\usepackage{hyperref}

\newcounter{mycntr}
\makeatletter
\newcommand\LCaption{%
  \stepcounter{mycntr}\@dblarg\@LCaption}
\def\@LCaption[#1]#2{%
  \caption[\protect\hypertarget{image\themycntr}{#1}]%
    {\hyperlink{image\themycntr}{#2}}}
\makeatother

\begin{document}

\listoffigures

\newpage

\begin{figure}[htb]
    \centering 
    \includegraphics[width=0.5\textwidth]{G.pdf}
    \LCaption[Description in LOF, taken from]{Caption for Image}
    \label{fig:sample_image}
\end{figure}


\end{document}

我想将这两者结合起来,同时保留我定义的命令的功能,我将不胜感激任何关于如何实现这一点的建议,因为我不完全熟悉 \NewDocumentCommand 以及如何将第二个 MWE 合并到其中。

顺便提一下,第二个 MWE 会转到 lof 列表中的条目,但是,它会转到条目的正下方,也就是说,您需要向上滚动才能看到实际条目。如果有人知道如何修复此问题,我将不胜感激,尽管它不像原始问题那么严重。

编辑

回应 Ulrike Fischer 的回答,这几乎让我达到了我想要的效果,当我尝试您的代码时,它可以工作,但是,当单击 lof 链接时,它会将我带到标题的顶部,而不是图形本身的图像顶部。

使用序言中的标题包可以解决这个问题,但是,图形的标题链接现在会将您带到整个文档的顶部而不是 lof 条目,当我添加目录 (toc) 或 lof 上方的任何其他内容时,也会发生同样的情况。

\documentclass{book}
\usepackage[demo]{graphicx}
\usepackage{hyperref}
\usepackage{etoolbox}
\usepackage{xparse}
\usepackage{caption}
\usepackage[nottoc,numbib]{tocbibind} 

\makeatletter
\patchcmd\contentsline{\hyper@linkstart}%
  {\def\my@content@Htargetname{#4}\csname my@content@hypertarget@#1\endcsname\hyper@linkstart}{}{\fail}
\newcommand\my@content@hypertarget@figure{\raisebox{15pt}[0pt][0pt]{\hypertarget{lof.\my@content@Htargetname}{}}}
\NewDocumentCommand \capLF { m o }{%
\IfNoValueTF{#2}
    {% No optional 'o' given which is 2nd entry -> use mandatory option, which is 1st arguemnt 'm'
    \caption[#1]{\hyperlink{lof.figure.\theHfigure}{#1}}%
    }
    {% Optional given -> use both
    \caption[#2]{\hyperlink{lof.figure.\theHfigure}{#1}}
    }%
}

\makeatother

\begin{document}

Text

\tableofcontents

\listoffigures

\newpage

\chapter{figure 1}

\begin{figure}[htb]
    \centering 
    \includegraphics{image.pdf}
    \capLF{Long Caption for Image}[Short Caption]
    \label{fig:sample_image}
\end{figure}

\chapter{figure 2}

\begin{figure}[htb]
    \centering 
    \includegraphics{image.pdf}
    \capLF{Long Caption for Image}
    \label{fig:sample_image}
\end{figure}

\end{document}

编辑2

上述作品,提供\usepackage[all]{hypcap}用来代替\usepackage{caption},感谢@UlrikeFischer 的所有帮助。

答案1

我真的看不出有什么用处。能够从图片列表转到特定图片很不错,但我从来不想在看标题时找到图片列表。但如果你想要:更好的补丁 \contentsline:

\documentclass{book}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{etoolbox}

\makeatletter
\patchcmd\contentsline{\hyper@linkstart}%
  {\def\my@content@Htargetname{#4}\csname my@content@hypertarget@#1\endcsname\hyper@linkstart}{}{\fail}

\newcommand\my@content@hypertarget@figure{\raisebox{15pt}[0pt][0pt]{\hypertarget{lof.\my@content@Htargetname}{}}}
\NewDocumentCommand \capLF {  o m }{%
\IfNoValueTF{#2}
    {% No optional 'o' given which is 2nd entry -> use mandatory option, which is 1st arguemnt 'm'
    \caption[#1]{\hyperlink{lof.figure.\theHfigure}{#1}}%
    }
    {% Optional given -> use both
    \caption[#2]{\hyperlink{lof.figure.\theHfigure}{#1}}
    }%
}
\makeatother

\begin{document}


\listoffigures

\newpage

\begin{figure}[htb]
    \centering
    \includegraphics[width=0.5\textwidth]{example-image-duck.pdf}
    \capLF[Description in LOF, taken from]{Caption for Image}
    \label{fig:sample_image}
\end{figure}

\begin{figure}[htb]
    \centering
    \includegraphics[width=0.5\textwidth,page=2]{example-image-duck.pdf}
    \capLF[Second Description in LOF, taken from]{Second Caption for Image}
    \label{fig:sample_image2}
\end{figure}


\end{document}

相关内容