如何自定义目录的布局?我的意思不是自定义目录节点的样式(章节名称、页码等),而是这里。相反,我想在它的侧面添加带有任意文本(不是从书的内容中获取的)的文本框。类似于这种安排(颜色仅用于说明我想要的结构):
以下是示例代码:
\documentclass{book}
\usepackage{lipsum,titletoc}
\begin{document}
% TOC CONTENT
%% Right column:
\tableofcontents
%% Left column
%%% Box 1:
\textbf{Authors:}
\begin{itemize}
\item[] Barry
\item[] Betty
\item[] Berty
\end{itemize}
%%% Box 2:
This is a rather good cookbook, I'm sure you'll agree.
% ACTUAL CONTENT
\chapter{Vegetables}
\lipsum
\chapter{Fruit}
\lipsum
\chapter{Seaweed}
\lipsum
\end{document}
答案1
这是一种可能的方法tcolorbox
,使用TikZ
底层中的节点。
外框环绕,并移至右侧,然后绘制两个“侧”面板,每个面板都是一个单独的节点。可以使用和等\tableofcontents
来控制侧面板的尺寸。sidepanel xshift
bottom sidepanel yshift
一个底层用于未破损的盒子,另一个底层仅用于第一个盒子(如果盒子破损)。
如果目录没有分页符,tcbraster
当然会更容易。
\documentclass{book}
\usepackage{lipsum}%,titletoc}
\usepackage[margin=2cm]{geometry}
\usepackage[most]{tcolorbox}
\usetikzlibrary{calc}
\makeatletter
\tcbset{%
sidepanel xshift/.store in=\tocbox@sidepanel@xshift,
sidepanel xshift=5cm,
sidepanel width/.store in=\tocbox@sidepanel@width,
sidepanel width=4cm,
bottomsidepanel yshift/.store in=\tocbox@bottomsidepanel@yshift,
bottomsidepanel yshift=1cm,
tocback/.colorlet=tcbcol@tocback,
tocback=gray!40!white,
topsidepanel/.style={enhanced,sharp corners, frame hidden, colback=tcbcol@tocback},
bottomsidepanel/.style={topsidepanel},
}
\DeclareTotalTColorBox{\tableofcontentsbox}{+O{}+m+m}{
enhanced,
breakable,
colupper=white,
left skip=\tocbox@sidepanel@xshift,
sharp corners,
colback=tcbcol@tocback,
frame hidden,
remember,
underlay={%
\coordinate (topsidepanel) at ($(frame.north west)+(-\tocbox@sidepanel@xshift,0pt)$);
\node[below right,inner sep=0pt] (topsidepanelnode) at (topsidepanel) {
\begin{tcolorbox}[topsidepanel,width=\tocbox@sidepanel@width,colupper=white,
overlay={\node[inner sep=0pt, outer sep=0pt] (topsidepanelbottom) at (frame.south west) {};},#1]
#2%
\end{tcolorbox}};
\node[below right,inner sep=0pt] (bottomsidepanelnode) at ($(topsidepanelbottom) + (0pt,-\tocbox@bottomsidepanel@yshift)$) {
\begin{tcolorbox}[bottomsidepanel,width=\tocbox@sidepanel@width,colupper=white,#1]
#3%
\end{tcolorbox}};
},
underlay first={%
\coordinate (topsidepanel) at ($(frame.north west)+(-\tocbox@sidepanel@xshift,0pt)$);
\node[below right,inner sep=0pt] (topsidepanelnode) at (topsidepanel) {
\begin{tcolorbox}[topsidepanel,width=\tocbox@sidepanel@width,colupper=white,
overlay={\node[inner sep=0pt, outer sep=0pt] (topsidepanelbottom) at (frame.south west) {};},#1]
#2%
\end{tcolorbox}};
\node[below right,inner sep=0pt] (bottomsidepanelnode) at ($(topsidepanelbottom) + (0pt,-\tocbox@bottomsidepanel@yshift)$) {
\begin{tcolorbox}[bottomsidepanel,width=\tocbox@sidepanel@width,colupper=white,#1]
#3%
\end{tcolorbox}};
},
#1}{%
\tableofcontents
}
\makeatother
\begin{document}
% TOC CONTENT
%% Right column:
\tableofcontentsbox[fontupper=\large,bottomsidepanel yshift=0.5cm]{\textbf{Authors:}
\begin{itemize}
\item[] Barry
\item[] Betty
\item[] Berty
\end{itemize}
}{
This is a rather good cookbook, I'm sure you'll agree.%
}
% ACTUAL CONTENT
\chapter{Vegetables}
\lipsum
\chapter{Fruit}
\lipsum
\chapter{Seaweed}
\lipsum
\end{document}
答案2
最后我推断出定制目录最稳定的方法是将其他框作为目录内容的背景,这样当它改变大小时就不会受到影响。
首先,我为目录列表创建了一个新的几何图形,以便将目录推到右侧。
\newcommand{\tocgeometry}{
\newgeometry{
onecolumn,
includefoot,
top=3.2cm,
width=17.5cm,
height=27.2cm
}
}
然后我使用 \AddToShipoutPictureFG 创建了一个背景模板,有三个选项:内容(#3)、与页面左下角的水平距离(#1)和与页面左下角的垂直距离(#2)。带星号的版本指定仅放置在此页面上,而不是每个页面上。
\newcommand{\placethis}[3]{
\AddToShipoutPictureFG*{\put(#1,#2){#3}}}
我从 article.cls 复制了 \tableofcontents 函数,以便可以在我的序言中对其进行自定义。
\makeatletter
\renewcommand\tableofcontents{
% Parbox allows for multi-line text.
\placethis{125}{450}{\parbox{15cm}{
Authors:
\begin{itemize}
\item Barry
\item Betty
\item Berty
\end{itemize}}}
%
\placethis{75}{257}{\parbox{15cm}{
This is a rather good cookbook, I'm sure you'll agree.
}
\@starttoc{toc}
}
\makeatother
这也允许我使用 \includegraphics 将图像放置在 \parbox 的位置。
这样我就可以将目录包含到我的书的正文中,如下所示:
\tocgeometry
\tableofcontents*
\addtocontents{toc}{\protect\thispagestyle{empty}}
\thispagestyle{empty}
\restoregeometry
这就是定制我的目录所需要的全部内容:)