这是该问题的后续问题:
这个问题的答案很棒,但我需要:
- 维护章节和小节编号
- 刷新左侧条目
换句话说,除了整个目录的中心对齐和在中心项目符号上对齐的数字之外,样式应该与默认样式相同。
编辑上一个问题的答案似乎很容易,但我不知道如何复制默认样式的编号和正确间距。此外,该解决方案涉及内部 LaTeX 宏:有没有办法以更干净的方式做到这一点,比如说,tocloft
(我已经用它来定制其他东西了)?
答案1
您可以将整个目录放入一个小页面中。\fbox
和\rule
只是为了演示居中。
重新添加章节和节号有点棘手。为了让列对齐,我必须保持字体大小不变。否则,您还不如用pt
眼睛来调整。
\documentclass{book}
\usepackage{xcolor}
\newlength{\tocwidth}
\def\MBox#1#2#3{%
\parbox[t]{\dimexpr \textwidth -3.5em}{\raggedright #1}%
\hfil{\color{red}#2}\hfil%
\makebox[2em][r]{#3}\linebreak}
\makeatletter
\def\WBox#1#2#3{% get width of #1
\settowidth{\@tempdima}{#1}%
\ifdim\@tempdima>\tocwidth \global\tocwidth=\@tempdima\fi
}
\renewcommand*\l@chapter[2]{\par\MBox{\bfseries\hangindent=1.5em \@tempdima=1.5em #1}{\textbullet}{#2}}
\renewcommand*\l@section[2]{\MBox{\bfseries\hangindent=3.8em \@tempdima=2.3em \hspace{1.5em}#1}{\textbullet}{#2}}
\renewcommand*\l@subsection[2]{\MBox{\bfseries\hangindent=7em \@tempdima=3.2em \hspace{3.8em}#1}{\textbullet}{#2}}
\renewcommand*\numberline[1]{\makebox[\@tempdima][l]{#1}}% left align numbers
\let\old@toc=\tableofcontents
\renewcommand{\tableofcontents}
{\bgroup% get width of largest line (excluding bullet and page number)
\let\MBox=\WBox
\tocwidth=0pt
\rlap{\@input{\jobname.toc}}% read toc file, write nothing
\egroup% restore defaults
\advance\tocwidth by 3.5em
\ifdim\tocwidth>\textwidth \tocwidth=\textwidth\fi
\begin{minipage}{\tocwidth}%
\old@toc
\end{minipage}}
\makeatother
\begin{document}
\centering\fbox{\tableofcontents}
\noindent\rule{\textwidth}{1pt}
\chapter{First Chapter}
\section{foo}
\newpage
\section{bar}
\newpage
\subsection{foobar}
foobar
\end{document}