使用 TikZ 和 tocloft 用彩色矩形突出显示目录中的条目

使用 TikZ 和 tocloft 用彩色矩形突出显示目录中的条目

解决方案如何在 tocloft 格式的目录中突出显示特定条目不适用于彩色背景。使用颜色时会出现问题,因为彩色矩形总是绘制在文本前面。

我还添加了从部分到部分的颜色变化。以下是生成问题的最小脚本:

\documentclass{article}
\usepackage{tocloft}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{backgrounds}

\newcounter{seccntr}
\setcounter{seccntr}{-1}

\newcommand*{\hnode}[1]{%
    \tikz[remember picture] \node[minimum size=0pt,inner sep=0pt,outer sep=4.5pt] (#1) {};}
% create a node at the beginning of the section entry
\renewcommand{\cftsecfont}{\hnode{P1} \bfseries\Large}
\renewcommand{\cftsecpagefont}{\bfseries}
% create a node at the end of the section number and draw the gray box
\renewcommand{\cftsecafterpnum}{%
  \stepcounter{seccntr} %
  \ifcase\value{seccntr}%
        \hnode{P2} \tikz[remember picture,overlay] \draw (P1.north west)  [line width={17pt}, red,opacity=0.3] -- (P2.north east); %----- 0 --
    \or  \hnode{P2}\tikz[remember picture,overlay] \draw (P1.north west)  [line width={17pt}, green,opacity=0.4] -- (P2.north east);%---- 1 --
    \or  \hnode{P2}\tikz[remember picture,overlay]  \draw (P1.north west)  [line width={17pt}, yellow,opacity=0.5] -- (P2.north east);%--- 2 --
    \or  \hnode{P2}\tikz[remember picture,overlay]  \draw (P1.north west)  [line width={17pt}, blue,opacity=0.6] -- (P2.north east);%---- 3 --
    \or  \hnode{P2}\tikz[remember picture,overlay]  \draw (P1.north west)  [line width={17pt}, orange,opacity=0.7] -- (P2.north east);%-- default
    \else  \hnode{P2}\tikz[remember picture,overlay] \draw (P1.north west)  [line width={17pt}, gray,opacity=0.8] -- (P2.north east);%-- default
    \fi  %
} %

\begin{document}
\tableofcontents

\section{First Section}
\subsection{A subsubsection}
\subsection{A subsubsection}
\section{Second Section}
\subsection{A subsubsection}
\end{document}

有人可以帮忙把彩色盒子放在背景中吗?

另外添加

\begin{pgfonlayer}{background}\tikz .... \end{pgfonlayer}

没有帮助,因为它只是图片的背景。

答案1

您可以做的是将矩形放在文本之前。但是,这样我们就不能使用页码的位置,因此我们必须以另一种方式确定结束位置。我所做的只是在同一点开始线条,只是将其画长\textwidth + 1ex。这看起来相当不错,并且导致文本稍后绘制,因此位于线条顶部。我不知道这有多好,如果您更改页码的位置或进一步缩进开头,它可能会中断。这是代码:

\documentclass{article}
\usepackage{tocloft}
\usepackage{xcolor}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\usetikzlibrary{calc}

\newcounter{seccntr}
\setcounter{seccntr}{-1}

\newcommand*{\hnode}[1]{%
    \tikz[remember picture] \node[minimum size=0pt,inner sep=0pt,outer sep=4.5pt] (#1) {};}
% create a node at the beginning of the section entry
\renewcommand{\cftsecfont}{\hnode{P1}\bfseries\Large
  \stepcounter{seccntr}%
  \ifcase\value{seccntr}%
        \tikz[remember picture,overlay] \draw (P1.north west)  [line width={17pt}, red,opacity=0.3] -- ++($(\textwidth,0) + (1ex,0)$);%----- 0 --
    \or\tikz[remember picture,overlay] \draw (P1.north west)  [line width={17pt}, green,opacity=0.4] -- ++($(\textwidth,0) + (1ex,0)$);%---- 1 --
    \or\tikz[remember picture,overlay]  \draw (P1.north west)  [line width={17pt}, yellow,opacity=1] -- ++($(\textwidth,0) + (1ex,0)$);%--- 2 --
    \or\tikz[remember picture,overlay]  \draw (P1.north west)  [line width={17pt}, blue,opacity=0.6] -- ++($(\textwidth,0) + (1ex,0)$);%---- 3 --
    \or\tikz[remember picture,overlay]  \draw (P1.north west)  [line width={17pt}, orange,opacity=0.7] -- ++($(\textwidth,0) + (1ex,0)$);%-- default
    \else\tikz[remember picture,overlay] \draw (P1.north west)  [line width={17pt}, gray,opacity=0.8] -- ++($(\textwidth,0) + (1ex,0)$);%-- default
    \fi  %
}
\renewcommand{\cftsecpagefont}{\bfseries}

\begin{document}
\tableofcontents

\section{First Section}
\subsection{A subsubsection}
\subsection{A subsubsection}
\section{Second Section}
\subsection{A subsubsection}
  \lipsum[1-100]
\section{Third Section}
\end{document}

这是相关的输出(注意1第三部分的不透明度):

彩色背景内容

使用 lipsum 来检查较长的页码是否不会引起问题。

相关内容