我正在尝试实现以下内容,我有一个条件定义的新命令,可以与 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}