![使用 TikZ 和 tocloft 用彩色矩形突出显示目录中的条目](https://linux22.com/image/242240/%E4%BD%BF%E7%94%A8%20TikZ%20%E5%92%8C%20tocloft%20%E7%94%A8%E5%BD%A9%E8%89%B2%E7%9F%A9%E5%BD%A2%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%9D%A1%E7%9B%AE.png)
解决方案如何在 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 来检查较长的页码是否不会引起问题。