修改 \@dottedtocline 以包含超链接

修改 \@dottedtocline 以包含超链接

我正在尝试编辑 \@dottedtocline 命令,以在点上提供超链接以及章节标题和页码。我搜索了这一点,找到了我想要的东西这里,不幸的是,我被迫为此文件使用自定义文档类,因此解决方案不起作用。我设法找到了导致问题的确切更新命令,但我不知道命令的语法,无法自己修复它,因此任何帮助都将不胜感激。明确地说,我可以访问文档类文件,并且可以对其进行(微小)编辑。

以下是 cls 文件中导致问题的代码:

\renewcommand{\@dottedtocline}[5]{%
  \ifnum #1>\c@tocdepth \else
    \vskip \z@ \@plus.2\p@
    {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
     \parindent #2\relax\@afterindenttrue
     \interlinepenalty\@M
     \leavevmode
     \@tempdima #3\relax
%%   Handling those sections that are included in TOC, but have
%%   no section numbering. Also including hanging indent when the
%%   NoTocHang option was not used. Only the following 4 lines added.
     \ifthenelse{#1 > \value{secnumdepth}}{%
     \setlength{\@tempdima}{0pt}}{}%
    % \ifthenelse{#1 > \value{secnumdepth} \or \boolean{RS@TOCHang}}{%
    % \addtolength{\leftskip}{\RS@TOChdent}}{}%
     \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
     {#4}\nobreak
     \leaddots
     \nobreak
     \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
     \par}%
  \fi}

这是建议的修复(代码本身编译得很好,但使用自定义 cls 就不能再解决我的问题了)。

    \documentclass{report}
\usepackage[linktoc=all]{hyperref}
\usepackage{etoolbox}

\makeatletter
\pretocmd{\contentsline}
  {\patchcmd{\@dottedtocline}
     {\leaders}
     {\hyper@linkstart{link}{#4}\leaders}
     {}
     {}%
   \patchcmd{\@dottedtocline}
     {\hfill}
     {\hfill\hyper@linkend}
     {}
     {}}
  {}
  {}
\makeatother

\begin{document}
\tableofcontents
\chapter{First Chapter} \pagebreak
\section{First Section} \pagebreak
\subsection{First Subsection}
\chapter{Second Chapter} \pagebreak
\section{Second Section} \pagebreak
\subsection{Second Subsection}
\end{document}

我正在尝试编译上述代码的副本,但使用的是 cls 文档类型。上述代码(建议的修复代码)本身完全按照预期工作(可以工作)。使用 CLS 文件类型,它可以很好地编译,但结果就像上述补丁不存在一样(无论是否注释掉,结果都相同)。非常感谢您的帮助,谢谢!

答案1

以下可实现您所寻找的内容:

在此处输入图片描述

\documentclass{ufthesis}
\usepackage[linktoc=all]{hyperref}

\makeatletter

\renewcommand{\@dottedtocline}[5]{%
  \ifnum #1>\c@tocdepth \else
    \vskip \z@ \@plus.2\p@
    {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
     \parindent #2\relax\@afterindenttrue
     \interlinepenalty\@M
     \leavevmode
     \@tempdima #3\relax
%%   Handling those sections that are included in TOC, but have
%%   no section numbering. Also including hanging indent when the
%%   NoTocHang option was not used. Only the following 4 lines added.
     \ifthenelse{#1 > \value{secnumdepth}}{%
     \setlength{\@tempdima}{0pt}}{}%
    % \ifthenelse{#1 > \value{secnumdepth} \or \boolean{RS@TOCHang}}{%
    % \addtolength{\leftskip}{\RS@TOChdent}}{}%
     \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
     \hyper@linkstart{link}{\Hy@tocdestname}{#4}\nobreak% <-- hyperlink start
     \leaddots
     \nobreak
     \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
     \hyper@linkend% <-- hyperlink end
     \par}%
  \fi}

\def\contentsline#1#2#3#4{%
  \begingroup
    \Hy@safe@activestrue
  \edef\x{\endgroup
    \def\noexpand\Hy@tocdestname{#4}%
  }\x
  \ifx\Hy@tocdestname\ltx@empty
    \csname l@#1\endcsname{#2}{#3}%
  \else
    \ifcase\Hy@linktoc % none
      \csname l@#1\endcsname{#2}{#3}%
    \or % section
      \csname l@#1\endcsname{%
        \hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend
      }{#3}%
    \or % page
      \def\Hy@temp{#3}%
      \ifx\Hy@temp\ltx@empty
        \csname l@#1\endcsname{#2}{#3}%
      \else
        \csname l@#1\endcsname{{#2}}{%
          \hyper@linkstart{link}{\Hy@tocdestname}{#3}\hyper@linkend
        }%
      \fi
    \else % all
      \def\Hy@temp{#3}%
      \ifx\Hy@temp\ltx@empty
        \csname l@#1\endcsname{%
          \hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend
        }{}%
      \else
        \csname l@#1\endcsname{%
          #2%\hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend
        }{%
          #3%\hyper@linkstart{link}{\Hy@tocdestname}{#3}\hyper@linkend
        }%
      \fi
    \fi
  \fi
}

\makeatother

\begin{document}

\tableofcontents
\chapter{First Chapter} \pagebreak
\section{First Section} \pagebreak
\subsection{First Subsection}
\chapter{Second Chapter} \pagebreak
\section{Second Section} \pagebreak
\subsection{Second Subsection}

\end{document}

上述代码更新\@dottedtocline班上ufthesis以及\contentsline来自hyperref。它会从后者中删除任何超链接插入,并将其作为前者的一部分。这样,超链接就会从目录条目标题延伸到页码(包括前导点)。

相关内容