hypcap 无法与自定义 \caption{} 命令配合使用

hypcap 无法与自定义 \caption{} 命令配合使用

我正在尝试使用数据包hypcap选项captionhypcap数据包本身。如果我\caption{...}在浮点数中使用,一切都会正常工作,并且我的图表列表中的超链接会跳转到顶部而不是图表的标题。但我正在使用自定义命令\mycaption{...}来增强图表列表的更多细节。使用此命令,hypcap包无法找到\caption{...}后面的命令\capstart,因为只有我自定义的命令。我怎样才能知道hypcapcaption搜索我的命令,或者我需要在我的定义中添加什么\mycaption{...}才能hypcap检测到它?


梅威瑟:

\documentclass{scrreprt}

\makeatletter
\newcommand{\myrawcaption}[2]{%
    \def\n{\hfill\break}
    \refstepcounter{figure}%
    \addcontentsline{lof}{figure}%
      {\protect\numberline{\thefigure}{\ignorespaces #1}}%
    \addtocontents{lof}{\protect\nopagebreak[4]}
    \addtocontents{lof}{\begingroup\leftskip3.8em #2\par\endgroup}
    \begingroup
      \def\n{\break}
      \@makecaption{\csname fnum@figure\endcsname}{\ignorespaces #1}\par
    \endgroup

}
\makeatother

\newcommand{\myfirstcaption}[1]{\myrawcaption{#1}
{Source:~My lovely source\protect\\*
License:~The fancy license}}

\usepackage{lipsum}
\setlipsumdefault{3}
\usepackage{hyperref}
\usepackage[figure]{hypcap}
\usepackage{scrhack}

\begin{document}

\chapter{chapter}

\lipsum

\begin{figure}[htbp]
\vspace{5cm}
\myfirstcaption{this is a caption}\label{label1}
\end{figure}

\lipsum

\listoffigures

\end{document}

错误

! 软件包 hypcap 错误:您忘记使用 \caption。

答案1

您可以\caption在定义中使用\myrawcaption

\documentclass{scrreprt}

\makeatletter
\newcommand{\myrawcaption}[2]{%
  \caption[#1]{#1}%
  \addtocontents{\@nameuse{ext@\@captype}}{\protect\nopagebreak}%
  \addtocontents{\@nameuse{ext@\@captype}}{\protect\begingroup
    \protect\leftskip 3.8em
    #2\protect\par
    \protect\endgroup
  }%
}%
\makeatother

\newcommand{\myfirstcaption}[1]{\myrawcaption{#1}
{Source:~My lovely source\protect\\*
License:~The fancy license}}

\usepackage{lipsum}
\setlipsumdefault{3}
\usepackage{hyperref}
\usepackage[figure]{hypcap}
\usepackage{scrhack}

\begin{document}
\listoffigures
\chapter{chapter}

\lipsum

\begin{figure}[htbp]
\vspace{5cm}
\myfirstcaption{this is a caption}\label{label1}
\end{figure}

\lipsum

\listoffigures

\end{document}

如果你需要改变定义\n,我会使用

\BeforeStartingTOC[lof]{\renewcommand*{\n\break}}

\protect\n并在标题文本中使用,将未扩展的内容添加到文件\nlof

\addtocontents我还建议不要使用,而是定义一个新的条目类型,并将 分别与此条目类型一起figureinfo使用。您可以使用来定义新的条目类型。\addcontentslinetocbasic\addxcontentsline\DeclareTOCStyleEntry

\documentclass{scrreprt}

\makeatletter
\newcommand{\myrawcaption}[2]{%
  \caption[#1]{#1}%
  \addxcontentsline{\@nameuse{ext@\@captype}}{figureinfo}{#2}%
}%
\makeatother

\DeclareTOCStyleEntry{tocline}{figure}
\DeclareTOCStyleEntry[%
  level=1,% same a (default of) figure
  numwidth=0pt,% no number no width
  indent=3.8em,% numwidth + indent of figure
  onstartsamelevel=\nopagebreak,%
  pagenumberbox=\csname @gobble\endcsname,%
  linefill=\hfill
]{tocline}{figureinfo}

\newcommand{\myfirstcaption}[1]{\myrawcaption{#1}
{Source:~My lovely source\protect\\*
License:~The fancy license}}

\usepackage{lipsum}
\setlipsumdefault{3}
\usepackage{hyperref}
\usepackage[figure]{hypcap}
\usepackage{scrhack}

\begin{document}
\listoffigures
\chapter{chapter}

\lipsum

\begin{figure}[htbp]
\vspace{5cm}
\makeatletter
\@whilenum\value{figure}<20\do{% only for demonstrating page break in LoF
  \myfirstcaption{this is a caption}\label{label\thefigure}
}
\makeatother

\end{figure}

\lipsum

\listoffigures

\end{document}

注意:此解决方案也适用于标准类(和其他几个类),但在这种情况下,您需要tocbasic先加载包\DeclareTOCStyleEntry

相关内容