使用不带页码的 TikZ 正确突出显示较长的目录条目

使用不带页码的 TikZ 正确突出显示较长的目录条目

使用这个答案,我已chapters在目录中突出显示。

但是,对于较长的章节名称,该框会变得不稳定,因为P1.north westP1.north east没有跨越整行:

north west       north east                                      line end
-------------------------------------------------------------------------
This is a longer chapter heading than can fit in an entire line this is a
longer chapter heading than.

不管是否使用页码,这都是一个问题。当\cftpagenumbersoff{chapter} 用过的:

没有页码

并附有页码:

在此处输入图片描述

我目前的项目 ToC 不使用页码。未来的项目将会使用,并且理想的解决方案是两者兼顾。

如何使用这种方法正确突出显示长目录条目?

梅威瑟:

\documentclass{report}
\usepackage{tocloft}
\usepackage{tikz}
\usepackage{xcolor}
% command to make a hidden node
\newcommand*{\hnode}[1]{%
    \tikz[remember picture] \node[minimum size=0pt,inner sep=0pt,outer sep=5pt] (#1) {};}
% create a node at the beginning of the chapter entry
\renewcommand{\cftchapfont}{\hnode{P1}\bfseries\Large}
\renewcommand{\cftchappagefont}{\bfseries}
% create a node at the end of the chap page number and draw the gray box
\renewcommand{\cftchapafterpnum}{%
  \hnode{P2}\tikz[remember picture,overlay]
  \draw (P1.north west)  [line width={25pt}, gray,opacity=.2] -- (\textwidth,0 |- P2);}
  %\draw (P1.north west)  [line width={25pt}, gray,opacity=.2] -- (P2.north east);}


\begin{document}
\cftpagenumbersoff{chapter}
\tableofcontents
\addcontentsline{toc}{chapter}{This is a longer chapter title than can fit in a single line}
\end{document}

我的尝试,到目前为止还没有成功:从概念上讲,如果我要实施解决方案,我会首先检查章节标题是否跨越多行(也许是字符数?)。然后,我会使用预定值cm和预定节点高度作为右下角TikZ节点坐标。

我认为\linelength可以起作用(没有页码,突出显示会很粗糙,并且在我的脑海中,我的尝试将会产生一个很好的副作用来解决这个问题):

\draw (P1.north west)  [line width={25pt}, gray,opacity=.2] -- (\textwidth,0 |- P2);}

但这导致突出显示延伸到行上的最后一个单词之外,并且框不是水平的。交叉点坐标并不是严格需要的,但我不知道为什么 - 我认为我必须指定坐标y

在此处输入图片描述

答案1

我会用

  • coordinates 而不是nodes (参见重命名的\tikzcoordinate宏),特别是如果你不overlay这样做,并且
  • 路径rectangle而不是线。

此外,TikZ 图片的点原点位于单词之后line(与单词所在的位置相同,P2但由于这个事实,您实际上不需要它),(\textwidth,0pt)然后该点突出到边缘。参见使用 tikz 绘制一条与文本宽度相同的线对于类似的问题。

因此,必须重新建立线的末端,这是通过@aux放置在

\coordinate (@aux) at ([xshift=+\linewidth] P1);

然后可以使用它来查找最后一行的行尾(@aux |- 0,0)


你可以避免很多问题,如果你使用tikzmark库中,您可以在文档中实际定义坐标之前引用坐标(伪装成空的 PGF 图片)。这样就可以放下键opacity并实际绘制文本后面的矩形。

代码

\documentclass{report}
\usepackage{tocloft,tikz}
\usepackage[showframe,pass]{geometry} % just for this example
\newcommand*{\tikzcoordinate}[1]{%
    \tikz[remember picture] \coordinate (#1);}
\renewcommand{\cftchapfont}{\tikzcoordinate{P1}\bfseries\Large}
\renewcommand{\cftchappagefont}{\bfseries}
\renewcommand{\cftchapafterpnum}{%
  \tikz[remember picture,overlay]{%
    \coordinate (@aux) at ([xshift=+\linewidth] P1);
    \fill[gray,opacity=.2] ([yshift=+1.3333em,xshift=-.3333em]P1)  rectangle
                                    ([xshift=.3333em,yshift=+-1ex]@aux |- 0,0);
  }%
}
\begin{document}
\cftpagenumbersoff{chapter}
\tableofcontents
\addcontentsline{toc}{chapter}{This is a longer chapter title than can fit in a single line}
\end{document}

输出

在此处输入图片描述

在此处输入图片描述

代码 (tikzmark

\documentclass{report}
\usepackage{tocloft,tikz}
\usepackage[showframe,pass]{geometry} % just for this example
\usetikzlibrary{tikzmark}
\renewcommand{\cftchapfont}{%
  \tikz[remember picture,overlay]%
    \fill[gray!20] (+-.3333em,+1.3333em) rectangle ([xshift=+.333em,yshift=+-1ex] +\linewidth,+0pt |- {pic cs:toc-chap-end});%
  \bfseries\Large}
\renewcommand{\cftchappagefont}{\bfseries}
\renewcommand{\cftchapafterpnum}{\pgfmark{toc-chap-end}}
\begin{document}
\cftpagenumbersoff{chapter}
\tableofcontents
\addcontentsline{toc}{chapter}{This is a longer chapter title than can fit in a single line}
\end{document}

输出 (tikzmark

在此处输入图片描述

在此处输入图片描述

相关内容