如何删除 \tableofcontents 上方的顶部边距

如何删除 \tableofcontents 上方的顶部边距

如果 LateX 不会强制在目录顶部自动出现空白块,我的目录页将适合放在一侧。

有什么方法可以删除这个阻止并从\tableofcontents页面顶部开始?

答案1

在标准文档类中(如bookreport),\tableofcontents设置为\chapter*

\newcommand\tableofcontents{%
    \if@twocolumn
      \@restonecoltrue\onecolumn
    \else
      \@restonecolfalse
    \fi
    \chapter*{\contentsname
        \@mkboth{%
           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
    \@starttoc{toc}%
    \if@restonecol\twocolumn\fi
    }

因此,可以暂时修改章节标题宏,以不插入太多垂直空间。以下是\chapter*标题宏\@makeschapterhead

\def\@makeschapterhead#1{%
  \vspace*{50\p@}%
  {\parindent \z@ \raggedright
    \normalfont
    \interlinepenalty\@M
    \Huge \bfseries  #1\par\nobreak
    \vskip 40\p@
  }}

\vspace*{50\p@}注意在设置标题之前插入垂直空格( )。因此,我们可以暂时重新定义此宏以不插入垂直空格:

在此处输入图片描述

\documentclass{book}
\usepackage{showframe}% http://ctan.org/pkg/showframe
\begin{document}

\begingroup
\makeatletter
% Redefine the \chapter* header macro to remove vertical space
\def\@makeschapterhead#1{%
  %\vspace*{50\p@}% Remove the vertical space
  {\parindent \z@ \raggedright
    \normalfont
    \interlinepenalty\@M
    \Huge \bfseries  #1\par\nobreak
    \vskip 40\p@
  }}
\makeatother

\tableofcontents
\endgroup
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\end{document}

重新定义的分组使它成为本地的。因此,之后所有修改都会恢复\endgroup

由于\chapter*标题宏仅用于\vspace*{..}插入文本块和章节标题之间的间隙,因此您也可以重新定义\vspace以吞噬两个参数(*{50\p@}):

\documentclass{book}
\usepackage{showframe}% http://ctan.org/pkg/showframe
\begin{document}
\begingroup
\renewcommand{\vspace}[2]{}% Gobble 2 arguments after \vspace
\tableofcontents
\endgroup
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\chapter{A chapter}\section{A section}\subsection{A subsection}
\end{document}

showframe包裹突出显示文本块边界(除其他元素外),因此在本例中仅用于展示目录的垂直对齐。最终文档中不需要它。


也许更干净的方法是使用etoolbox到 patch \@makeschapterhead。这还允许您将文档结构与内容分开(使环境中的内容document仅与内容相关)。将以下内容添加到文档序言中:

\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter
\let\oldtableofcontents\tableofcontents
\renewcommand{\tableofcontents}{\begingroup%
  \patchcmd{\@makeschapterhead}% <cmd>
    {\vspace*{50\p@}}% <search>
    {}% <replace>
    {}{}% <success><failure>
  \oldtableofcontents%
  \endgroup%
}
\makeatother

上述操作在调用常规目录之前,在内部进行本地搜索和替换\@makeschapterhead(替换为空)。重新定义(搜索和替换)在组范围内进行本地化。\vspace*{50\p@}

答案2

以下是tocloft目前还未提及的一种方法:

tocloft提供\cftbeforeXtitleskip\cftafterXtitleskip长度,其中X代表tocloflot,具体取决于具体的需求。

使用它的优点tocloft是它隐藏了特定的类设置,但是不要tocloft与 KOMA 类一起使用——不推荐这样做。

给定示例中的值只是任意的!

\documentclass{book}

\usepackage{tocloft}
\usepackage{blindtext}

\setlength{\cftbeforetoctitleskip}{0pt}
\setlength{\cftaftertoctitleskip}{0pt}

\begin{document}
\tableofcontents
\blinddocument[2]

\end{document}

答案3

我用的是这个:

\renewcommand{\contentsname}{\vspace{-1cm} \hfill\bfseries\LARGE TABLE OF CONTENTS \hfill \vspace{0.2cm}}

第一个/第二个里面的值\vspace{}控制“目录”之前/之后的垂直空间。

记得将命令放在里面\begin{document} ... \end{document}

相关内容