使用这个答案,我已chapters
在目录中突出显示。
但是,对于较长的章节名称,该框会变得不稳定,因为P1.north west
和P1.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
我会用
coordinate
s 而不是node
s (参见重命名的\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}