![如何删除 \tableofcontents 上方的顶部边距](https://linux22.com/image/251945/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%20%5Ctableofcontents%20%E4%B8%8A%E6%96%B9%E7%9A%84%E9%A1%B6%E9%83%A8%E8%BE%B9%E8%B7%9D.png)
如果 LateX 不会强制在目录顶部自动出现空白块,我的目录页将适合放在一侧。
有什么方法可以删除这个阻止并从\tableofcontents
页面顶部开始?
答案1
在标准文档类中(如book
和report
),\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
代表toc
,lof
或lot
,具体取决于具体的需求。
使用它的优点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}
。