使用 pdflatex 创建包含所有文本链接的目录,并为各节和页码设置不同的颜色

使用 pdflatex 创建包含所有文本链接的目录,并为各节和页码设置不同的颜色

介绍

我想创建一个包含所有内容的链接的目录文本 页码但文本和页码的颜色不同,应该使用 pdflatex 编译

完工

我有下面的(最小)工作代码。

\documentclass[11pt, letterpaper, openany, oneside]{book}

\usepackage{sectsty}
\usepackage{titlesec}
\usepackage{color}

\usepackage[bookmarks,hypertexnames=false,debug,linktocpage=true,hidelinks]{hyperref}

\hypersetup{
    colorlinks,
    linktoc=all,
    linkcolor={blue},
    citecolor={blue},
    urlcolor={blue}
}



\begin{document}

\titleformat{\chapter}{\color{red}\normalfont\Huge\bfseries}{\thechapter}{1em}{}[]
\sectionfont{\color{red}}
\subsectionfont{\color{red}}

\tableofcontents

\chapter{Chapter One}
\section{A Section}
Text goes here.
\section{Another Section}
Text goes here.
\subsection{A Sub Section}
Text goes here.
\section{One more section Section}
Text goes here.

\chapter{Chapter One}
Text goes here.
\section{A Section}
Text goes here.
\section{Another Section}
Text goes here.

\end{document}

这将为目录提供以下输出:

在此处输入图片描述

它还给出了章节的以下输出

在此处输入图片描述

期望的结果

我想要一个目录在哪里全部文本(章节标题、节标题、小节标题、页码等)是超链接到相关部分,但有定制颜色用于目录中的章节标题、小节标题和页码。

还应使用 pdflatex 编译(不是 xelatex、lualatex 等)。

以下是所需输出的摘要:

在此处输入图片描述

答案1

在这里,我修补\contentsline命令以根据目录类型本地更改目录条目的标题部分(与页码部分相比)使用的链接颜色。

在以下示例中,

  • 章节目录条目的标题部分更改为red\def\toccolor@chapter{red}并且
  • 章节和小节目录条目的标题部分分别更改black\def\toccolor@section{black}\def\toccolor@subsection{black}

要将其应用于其他类型的目录条目,

  1. 查找相应的辅助文件。例如,\listoftables使用 aux 文件.lot
  2. 查找此列表使用的目录条目的类型。例如,在.lot文件中,您可以看到类似 的行\contentsline {table}{\numberline {1}{\ignorespaces Title}}{1}%,然后table( 的第一个参数\contentsline)是类型名称。
  3. 提供相应的\toccolor@<type>命令。在上例中,使用\def\toccolor@table{<color>},目录条目的标题部分的颜色table将以 排版<color>
\documentclass[11pt, letterpaper, openany, oneside]{book}

\usepackage{sectsty}
\usepackage{titlesec}
\usepackage{color}
\usepackage{xpatch}

\usepackage[bookmarks,hypertexnames=false,debug,linktocpage=true,hidelinks]{hyperref}

\hypersetup{
    colorlinks,
    linktoc=all,
    linkcolor={blue},
    citecolor={blue},
    urlcolor={blue}
}


\titleformat{\chapter}
  {\color{red}\normalfont\Huge\bfseries}
  {\thechapter}{1em}
  {}[]
\sectionfont{\color{red}}
\subsectionfont{\color{red}}


\makeatletter
% redefine \contentsline, locally change linkcolor
\IfPackageAtLeastTF{hyperref}{2022-11-13}{\@tempswatrue}{\@tempswafalse}
\if@tempswa
  % see https://github.com/latex3/hyperref/commit/7bf9ab4c99c434c30d0d00771326ae3d487fb092
  \xpatchcmd\contentsline
    {%
      \csname l@#1\endcsname{%
        \Hy@toclinkstart{#2}\Hy@toclinkend
      }{%
        \Hy@toclinkstart{#3}\Hy@toclinkend
      }%
    }
    {%
      \csname l@#1\endcsname{%
        \begingroup
          \def\@linkcolor{black}%
          \Hy@toclinkstart{#2}\Hy@toclinkend
        \endgroup
      }{%
        \Hy@toclinkstart{#3}\Hy@toclinkend
      }%
    }
    {}{\PatchFailedII}
\else
  \xpatchcmd\contentsline
    {%
      \csname l@#1\endcsname{%
        \hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend
      }{%
        \hyper@linkstart{link}{\Hy@tocdestname}{#3}\hyper@linkend
      }%
    }
    {%
      \csname l@#1\endcsname{%
        \begingroup
          \Hy@toccolor{#1}%
          \hyper@linkstart{link}{\Hy@tocdestname}{#2}\hyper@linkend
        \endgroup
      }{%
        \hyper@linkstart{link}{\Hy@tocdestname}{#3}\hyper@linkend
      }%
    }
    {}{\PatchFailedI}
\fi

% choose toc linkcolor, #1 is first arg of \contetnsline, 
% eg "chapter", "section"
\def\Hy@toccolor#1{%
  \ifcsname toccolor@#1\endcsname
    \edef\@linkcolor{\csname toccolor@#1\endcsname}%
  \fi
}

\def\toccolor@chapter{red}
\def\toccolor@section{black}
\def\toccolor@subsection{black}
\makeatother

\begin{document}
\tableofcontents

\chapter{Chapter One}
\section{A Section}
Text goes here.
\section{Another Section}
Text goes here.
\subsection{A Sub Section}
Text goes here.
\section{One more section Section}
Text goes here.

\chapter{Chapter One}
Text goes here.
\section{A Section}
Text goes here.
\section{Another Section}
Text goes here.

\end{document}

在此处输入图片描述

相关内容