如何使目录居中并保持章节和小节的编号?

如何使目录居中并保持章节和小节的编号?

这是该问题的后续问题:

如何使目录居中?

这个问题的答案很棒,但我需要:

  1. 维护章节和小节编号
  2. 刷新左侧条目

换句话说,除了整个目录的中心对齐和在中心项目符号上对齐的数字之外,样式应该与默认样式相同。

在此处输入图片描述

编辑上一个问题的答案似乎很容易,但我不知道如何复制默认样式的编号和正确间距。此外,该解决方案涉及内部 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}

居中目录

相关内容