LaTeX教程(006)- LaTeX \LaTeX LATEX文档结构(06)
2.2.7 titlesec
-一个设计标题的包方案
对于标题,我们已经讲了相当多的内容,并且我们知道,想要更灵活地修改标题样式,就要了解标题命令的定义结构,并且能够重定义它们。而现在,有了titlesec
包(由Javier Bezos创建)之后,我们就可以不必了解它们了,titlesec
包对标准
LaTeX
\LaTeX
LATEX的标题工具提供了基本的重实现,非常灵活且全面,因此,如果想要调整或者设计新的文档类,这是一个不错的选择。titlesec
可以用在大多数文档类中,但memoir和KOMA-Script类是例外,这两个类都有自己的工具来设置标题结构。
这种方式克服了原生 LaTeX \LaTeX LATEX工具中的一些固有限制,并提供了更清晰、更通用的接口。该包支持两个接口,一个用于小幅度调整的简单接口,主要通过包的选项来实现; 一个用于复杂修改的扩展接口。
基本接口
基本接口允许我们通过指定一个或者多个选项来全局地修改所有标题的字体特性,这些选项可以设置字体族(font family),如rm
,sf
,tt
; 字体系列(font series),如md
,bf
; 或者字形(font shape),如up
,it
,sl
,sc
。除了字体,还有一些选项可以设置标题的字号(字的大小),如big
(大的,与标准类默认字号相同)、tiny
(极小的,除了章标题,都与正文文本大小相同),medium
(中等的)和small
(小的)。还可以通过选项设置对齐方式,如raggedleft
(右对齐)、center
(居中)或raggedright
(左对齐)。指定compact
选项可以缩小垂直间距。
要改变标题编号的格式,可以使用\titlelabel
命令。其中\thetitle
指所有的章节标题编号,包括\thesection
,\thesubsection
等(经测试,似乎不包括\thechapter
)。有了这个命令,我们就不需要分别指定各层级的标题,而可以一次性设置所有标题编号了。我们用一个例子演示:
\documentclass{article}
\usepackage[a5paper]{geometry}
\usepackage[sf,bf,tiny,center]{titlesec}
% 在选项中指定了sf字体族,bf字体系列,tiny(极小)字号,以及居中
\usepackage{kantlipsum}
\begin{document}
\titlelabel{\thetitle.\enspace}
% 将标题编号改成的"标题编号+.+一段水平间隔"的格式,\enspace命令生成一段水平间隔
\section{A section}
\subsection{A subsection}
\subsubsection{A subsubsection}
\kant[1]
\end{document}
编译:
基本接口还提供了一个命令\titleformat*{cmd}{format}
,它有两个参数,cmd是标题命令(注意不是编号,是整个标题),如\section
,\subsection
等,format包含了我们要用于这个标题的格式化命令。\titleformat*{cmd}{format}
命令让我们可以单独修改某一层级的标题的格式(不仅仅是编号),它会覆盖包引用中的选项的设置。第二个参数中使用的最后一个命令可以是一个能够接收一个参数的命令,这个命令会接收编号后面的标题文本作为它的参数。我们用一个例子演示:
\documentclass{article}
\usepackage[a5paper]{geometry}
\usepackage[rm,it,raggedleft,tiny,compact]{titlesec}
% 选项中是对所有标题的设置
\titleformat*{\subsubsection}{\scshape\MakeLowercase}
% 这里是对\subsubsection标题编号的全局设置,最后一个命令\MakeLowercase是一个可以
% 接收一个参数的命令,它会接收标题文本,将标题文本变成小号的大写字母格式
\usepackage{kantlipsum}
\begin{document}
\section{A section}
\subsection{A subsection}
\subsubsection{A subsubsection}
\kant[1]
\end{document}
编译:
在多数文档类中,如果一个标题文本特别长,那么标题文本会默认在编号后面对齐。标题会自动换行,并且使除最后一行的所有行的两端对齐,必要时还会使用连字符将单词断开。如示例所示:
\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
% margin=1in使页边距为1in
\begin{document}
\section{A very long heading that shows the default behavior of \LaTeX's sectioning commands}
\subsection{A subsection}
\subsubsection{A subsubsection}
\end{document}
编译:
如果这并不是我们想要的,那么我们可以使用\\
手动换行(不能在代码行中用回车换行)。如:
\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\begin{document}
\section{A very long heading that\\
shows the default behavior\\
of \LaTeX's sectioning commands}
\subsection{A subsection}
\subsubsection{A subsubsection}
\end{document}
编译:
在你这样做时,最好在划分命令的可选参数中(我们在003篇中讲过的\section[toc-entry]{title}
命令)将标题文本重写一次,否则这样的手动断行也会出现在目录中(若不理解原因,请回顾003篇)。
也可以使用基本接口中的raggedright
选项(左对齐),当然,这样它会对所有标题有效:
\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage[raggedright]{titlesec}
\begin{document}
\section{A very long heading that shows the default behavior of \LaTeX's sectioning commands}
\subsection{A subsection}
\subsubsection{A subsubsection}
\end{document}
编译:
可以看到连字符没了。
还有两个选项可能对这种情形有一点其他的帮助。一个是newlinetospace
,如果你在调用titlesec
包时指定了newlinetospace
选项,那么标题文本中的所有换行符\\
或\\*
,在目录和页眉中都会被替换成空格,这样就不需要仅仅因为标题文本中有换行符而在\section[toc-entry]{title}
的可选参数中重写一遍标题文本了。另一个是toctitles
,调用该选项,可以改变命令\section[toc-entry]{title}
的可选参数的使用方式。默认情况下,title会出现在标题文本中,而toc-entry会出现在目录和页眉中。在调用titlesec
时指定了toctitles
选项后,toc-entry只出现在页眉中,而目录中依旧是title。这两个选项可以一起使用(经测试,似乎对\chapter
命令无效)。我们演示一下:
\documentclass{book}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage[newlinetospace,toctitles]{titlesec}
\usepackage{kantlipsum}
\begin{document}
\tableofcontents
\chapter{A chapter}
\section[A section]{This is a\\section}
\subsection{A subsection}
\kant[1]
\kant[2]
\kant[3]
\kant[4]
\end{document}
编译(注意,有目录这种交叉引用的,都编译两次,另外,文件过长,我们只截取关键部分):
由于我们同时使用了这两个选项,可以看到,\section[A section]{This is a\\section}
中,This is a\\section
在标题中有换行,而A section
只出现在页眉中,目录中依旧是This is a\\section
,并且在目录中将换行替换成了空格。
在前面的一篇中,我们说到标题后的第一段的首行缩进问题,可以使用titlesec
包解决。titlesec
包有两个选项可以控制标题后第一段的首行缩进,一个是indentafter
,指定这个选项之后,所有标题后的第一段的首行都将缩进。另一个是noindentafter
,使所有标题后的第一段的首行都不缩进。
我们在上一篇中讲到使用indentfirst
包使首段缩进,那么如果indentfirst
包和noindentafter
选项同时使用,会怎么样呢?
\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage{indentfirst}
\usepackage[noindentafter]{titlesec}
\usepackage{kantlipsum}
\begin{document}
\section{A section}
\kant[1]
\end{document}
编译:
可以看到,仍有缩进,这说明indentfirst
包会优先起作用。
另外要注意,这两个选项同时对所有标题起作用,若要单独对某一级设置,则需要用到扩展接口。
在前面(003篇)我们讲过,章(chapter)的标题总是出现在一页纸的正面,这就导致会经常生成一个空白的背面。但这个背面通常并不是完全空白的,而是会有页码和页眉。如果我们想将它变成完全空白的,可以使用titlesec
包的clearempty
选项。这个十分简单,可以自行演示。
\part
命令通常不受基本接口的影响。如果你想修改它,你必须扩展接口。
扩展接口比基本接口复杂得多,我们在下一篇讲解。
致会经常生成一个空白的背面。但这个背面通常并不是完全空白的,而是会有页码和页眉。如果我们想将它变成完全空白的,可以使用titlesec
包的clearempty
选项。这个十分简单,可以自行演示。
\part
命令通常不受基本接口的影响。如果你想修改它,你必须扩展接口。
扩展接口比基本接口复杂得多,我们在下一篇讲解。
关注【年轻人 你渴望力量么】