我正在尝试编辑 \@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
。它会从后者中删除任何超链接插入,并将其作为前者的一部分。这样,超链接就会从目录条目标题延伸到页码(包括前导点)。