LaTeX教程(008)-LaTeX文档结构(08)

LaTeX教程(008)- LaTeX \LaTeX LATEX文档结构(08)

接上一篇。before-sepafter-sep参数接收一个固定的长度数值外,还可以接收一个可变的长度数值。这使我们可以进行一些弹性设计。在上一篇中,你可能留意到我们用了一些*n形式的参数。这里n是一个十进制数,可以是整数也可以是小数。以这种方式输入的距离的具有收缩性的。

在这里n是倍数,ex是个单位,1ex表示当前字体字号下,字符x的高度,是一个变化的值。

我们在before-sep中输入*n,表示n倍的1ex,并且带有一点(0.3ex)拉伸空间,以及一点点(0.06ex)收缩空间。如果在after-sep在使用*n,则表示n倍的1ex,带有一点(0.1ex)拉伸空间(没有收缩空间)。

接下来,我们讲两个命令。

  • \raggedright,使段落靠左对齐。
  • \raggedleft,使段落靠右对齐。

首先我们需要知道,默认情况下,每一个段落都是两端对齐的(最后一行除外,最后一行靠左对齐)。你可能会疑惑,难道每一行单词和标点符号,以及它们之间的距离,都恰好能占满一整行吗?实际上,单词与单词之间的距离,是一个弹性距离, LaTeX \LaTeX LATEX会对这些距离进行微调,以便它们能在两端保持对齐,仅管如此,也会有一些不得不用连字符在行尾处断开某些单词的情况。而使用了\ragged...命令之后,段落就会往一侧对齐,同时单词之间的距离不再被调整,另一侧就会变得参差不齐。因此我们最好在单行里使用它。

我们演示一下它们的用法:

\documentclass{article}
\usepackage{ctex}
\usepackage{kantlipsum}
\begin{document}

这是一个默认两端对齐的段落。As any dedicated reader can clearly see, the Ideal of practical reason is a representation of, as far as I know, the things in themselves; as I have shown elsewhere, the phenomena should only be used as a canon for our understanding.

\vrule width11cm height1.5pt depth-1pt
%它用来生成一条横线

{\raggedright
这是一个左对齐的段落,它的右边参差不齐。\kant[1]
}

\vrule width11cm height1.5pt depth-1pt

{\raggedleft
这是一个右对齐的段落,它的左边参差不齐。\kant[3]
}
\end{document}

编译:

在这里插入图片描述

在第006篇中,我们为过长的标题文本提供了一种选择,就是在titlesec包的选项中指定raggedright,它使标题文本靠左对齐。

我们也可以在\titleformat命令的before-code参数中使用\tagged...命令来使标题靠左或靠右对齐。但是这样会有一个问题,一旦我们使用了\tagged...命令,它就会使我们在\titlespacingleft-sep参数和right-sep参数中指定的距离无效。我们演示一下:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage{titlesec}
\begin{document}
\titleformat{\section}[block]{\normalfont}{\footnotesize \enspace SECTION \thesection\enspace}{6pt}{\large\bfseries\raggedleft}
\titlespacing*{\section}{1cm}{*4}{*2.3}[1cm]
\noindent \ldots some text before \ldots
\section{A Title Test}
Some text to prove that this paragraph is not indented and that the title has a margin of 1pc on either side.
% 我们使用了带星号的`titlespacing*`命令,因此第一段没有首行缩进。
% 同时,标题的左右两侧各增加了1cm的缩进。
\end{document}

编译:

在这里插入图片描述

仔细观察,我们使用\titlespacing命令在标题的左右两侧指定了1cm的间距,但是在\titleformat中使用了\raggedleft之后,那1cm的间距无效了。内部的定义影响到了外部。为了避免这一问题,我们需要使用一些替代命令。

我们先看一个例子:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage{titlesec}
\begin{document}
\titleformat{\section}[block]{\normalfont}{\footnotesize \enspace SECTION \thesection\enspace}{6pt}{\large\bfseries\filleft}
\titlespacing*{\section}{1cm}{*4}{*2.3}[1cm]
\noindent \ldots some text before \ldots
\section{A Title Test}
Some text to prove that this paragraph is not indented and that the title has a margin of 1pc on either side.
% 我们使用了带星号的`titlespacing*`命令,因此第一段没有首行缩进。
% 同时,标题的左右两侧各增加了1cm的缩进。
\end{document}

编译:

在这里插入图片描述

可以看出,我们用\filleft替代\raggedleft之后,两侧的距离都没受影响。除了\filleft\filright\raggedleft\raggedright作用基本上相同,不同的就是它们不会影响外部定义的间距。因此,我们总是建议在\titleformat中用\fil...来替代\ragged...

除此之外,还有\filcenter\fillast\filinner\filouter等。

\filcenter使标题居中,并且是在外部间距固定了之后,在剩下的空间里居中:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage{titlesec}
\begin{document}
\titleformat{\section}[frame]{\normalfont}{\footnotesize \enspace SECTION \thesection\enspace}{3pt}{\large\bfseries\filcenter}
\titlespacing*{\section}{3cm}{*4}{*2.3}[0.5cm]
\noindent \ldots some text before \ldots
\section{A Title Test}
Some text to prove that this paragraph is not indented and that the title has a margin of 1pc on either side.
% 我们将前面的文本直接拿来用,这些文本内容和例子无关,仅用于填充
\end{document}

编译:

在这里插入图片描述

\fillast在功能上可以替代\centering命令。\centering使文本居中。它和ragged...一样,一但使用在一个段落上,单词之间的距离就不再被调整,两端都会变得参差不齐:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage{titlesec}
\usepackage{kantlipsum}
\begin{document}
\centering centering test
\centering \kant[1]
\end{document}

编译:

在这里插入图片描述

\fillast\centering进行了改进,对于段落来说,整行部分仍然两端对齐,只有不满一行的部分(通常是最后一行)居中:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage{titlesec}
\usepackage{kantlipsum}
\begin{document}
\fillast \kant[1]
\end{document}

编译:

在这里插入图片描述

\filinner\filouter分别使标题向内侧或外侧对齐,它们通过判断页码是奇数还是偶数来决定使用\filleft\filright。但是由于 TeX \TeX TEX的异步断页算法,它们只支持那些由新页面开始的标题,如\chapter。当然,我们也有办法使其他的标题满足条件,后面会讲到。

通过前面的学习,我们知道了,在\titlespacing命令中,before-sep参数表示标题上方的垂直距离,after-sep参数表示标题下方的垂直距离。那么,两个相邻标题之间的垂直距离,由什么决定?

对于两个相邻的标题(不管这两个标题是相同的还是不同的),默认情况下,它们之间的垂直距离是由第一个标题的after-sep决定的。如果这不是你想要的,那么可以在调用titlesec包时指定选项largestsep来改变它(\usepackage[largestsep]{titlesec})。指定了该选项之后,两个相邻标题之间的垂直距离则会成为第一个标题的after-sep和第二个标题的before-sep中最大的那个(书上是这么说的,但经笔者个人测试,两个相邻标题之间的垂直距离似乎是第一个标题的after-sep和第二个标题的before-sep加起来的距离,请读者自行测试)。

正常情况下,一个陈列标题(display)占据的垂直空间,是before-sep指定的垂直距离、标题文本的高度,以及after-sep指定的垂直距离的总和。这意味着,标题的行数会影响标题占据的空间。而在有些情景下,我们希望它不再被标题的行数影响,那么我们可以在调用titlesec包时指定rigidchapters选项来实现。指定了该选项之后,after-sep不再指标题下方的空间,而是始终从标题文本的顶部开始。这就是说,after-sep指定的垂直距离也包括了标题文本的高度,而一个标题所占据的垂直空间,就是before-sepafter-sep的和。尽管它名字是rigidchapters,但该选项适用于任何top类标题(会开启一个新页,并出现在一页最上面的标题,后面再详细介绍标题的种类)。我们做个演示:

\documentclass{book}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage[rigidchapters]{titlesec}
\begin{document}
\titleformat{\chapter}[display]{\bfseries}{\footnotesize CHAPTER \thechapter}{3pt}{\large\bfseries}
\titlespacing*{\chapter}{0cm}{1cm}{1.5cm}[1cm]
\chapter{A chapter}
Some text ......
\end{document}

编译:

在这里插入图片描述

现在,我们换一个长标题,即,将\chapter{A chapter}改成

\chapter{A very very very \dots long \LaTeX\ title of a chapter}

编译:

在这里插入图片描述

可以看到,第二行标题文本放置在了剩余的间距中,从标题文本顶部到后面的内容的距离并没有增加。此时标题文本的高度也被算在了after-sep之内,因此标题的总垂直距离不会增加。

标题不会被单独放置在一个页面的最底部。 LaTeX \LaTeX LATEX会确保在标题所在的页面上,至少有两行的段落文本放置在标题之后,如果一页剩余的空间在放置一个标题后,无法再容纳两行的段落文本,那么 LaTeX \LaTeX LATEX就会将这个标题放置在新的一页。如果你认为两行不够,可以在周用titlesec包时指定选项nobottomtitles或者nobottomtitles*。这两个选项使得一个页面在放置了标题之后,如果剩余空间小于\bottomtitlespace,就将标题放在一个新的页面上。\bottomtitlespace定义为0.2\textheight,我们可以使用\renewcommand修改它。另外,在这两个选项中,我们更建议使用星号形式的选项,因为它以更高的准确性计算剩余空间,除非你使用的是dropmarginwrap形状的标题。

大多数的布局中,标题编号不是在标题文本的上面,就是在标题文本的左边。如果这样的布局不是我们想要的,我们也可以改变它。在讲到下一个例子之前,我们先讲解几个将要用到的命令。

我们前面讲过\newcommand的简单使用方法,现在我们讲一下,如何使用它定义带参数的命令。\newcommand命令本身有一个可选参数,可以填一个整数,用来表示我们要定义的命令带有几个参数。完整的形式是:

\newcommand{\mycommand}[2]{... #1,... #2}

其中\mycommand是我们要定义的命令,[2]这个命令的参数的个数。#1#2分别是两个参数的占位符。在使用命令时,我们输入的第一个参数就会出现在#1处,第二个参数会出现在#2处,以此类推。我们做个测试:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\begin{document}
\newcommand{\mycommand}[2]{#1 is #2 years old}
\mycommand{Jack}{25}
\end{document}

编译:

在这里插入图片描述

不管是命令的定义内容还是参数,也都可以是命令,只要它们组合起来是合法的。 LaTeX \LaTeX LATEX中的宏定义仅仅起到字符串拼接的作用。

前面我们讲过,\titleformatbefore-code参数中,可以填入一系列的命令,最后一个命令可以是带有一个参数的命令,它将接收标题文本作为参数。现在,我们可以通过自定义一个带有参数的命令,将标题的编号放置到标题文本的右侧:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage{titlesec}
\newcommand{\secformat}[1]{#1 \thesection}
% 我们定义一个带有一个参数的命令,在参数后面放置编号\thesection
\begin{document}
\titleformat{\section}[hang]{\bfseries}{}{3pt}{\secformat}
% 原本放置\thesection命令的label参数,现在不再放任何东西
% 将我们定义好的\secformat参数放入before-code`,它将接收标题文本作为参数
\titlespacing*{\section}{0cm}{1cm}{1.5cm}[1cm]
\section{A section}
\end{document}

编译:

在这里插入图片描述

这样并不美观,甚至看起来很奇怪。我们可以基于上述原理,对这个标题进行一些改进。但在这之前,我们还需要了解几个命令。

\parbox命令生成一个垂直盒子,关于盒子,我们暂时不讲太多,只需要知道垂直盒子是一块垂直的矩形空间,里面的元素只能垂直排列,我们可以用参数定义盒子的宽度以及盒子中内容的对齐方向。我们用一个例子演示:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage{kantlipsum}
\begin{document}
    \fbox{\parbox{6cm}{\kant[1]}}
\end{document}

编译:

在这里插入图片描述

\parbox命令的形式是\parbox[position]{width}{text},其中position是对齐方式,默认左对齐。t是顶部对齐,b是底部对齐,还有c,居中对齐,s分散对齐。width是宽度,填一个长度数值。text是要放入的文本。\fbox命令是一个水平盒子命令,在这里的作用是将边框显示出来。单独的\parbox命令是没有边框的,只会定义一块矩形区域。

\rule命令用来定义一条具有厚度的线段。实际上它更像一个内部用黑色填满了的盒子。它的形式是\rule[lift]{width}{thickness}。这三个参数均填长度数值。其中lift表示这条直线向上移动的距离,width表示宽度,thickness表示厚度。我们演示一下:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\begin{document}
    some \rule[0mm]{0.5cm}{0.1mm} text ... some \rule[2mm]{1cm}{2mm} text ... some \rule[-2mm]{1cm}{2mm} text
\end{document}

编译:

在这里插入图片描述

第一条线段没有向上移动,后面两条分别向上向下移动了2mm(向下就是-2mm)。

\fontsize是改变字形大小的命令。它的形式是\fontsize{size}{skip}size是字号(大小),skip是行间距。这个命令我们不再单独演示。下面是我们进行标题的改进:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\usepackage{titlesec}
\begin{document}
\newcommand\secformat[1]{%
    \parbox[b]{.5\textwidth}{\filleft\bfseries #1}
    \quad\rule[-12pt]{2pt}{70pt}\quad
    {\fontsize{60}{60}\selectfont\thesection}}
% 我们用一对大括号将字体定义的命令和内容括起来,这样会将这些命令的影响范围限制在大括号内。
% 仔细分析\secformat命令的定义结构
\titleformat{\section}[block]{\filleft\normalfont\sffamily}{}{0pt}{\secformat}\titlespacing*{\section}{0pt}{*3}{*2}[1pc]
\section{A Title\\ on Two Lines}
In this example the heading number appears to
the right of the heading text.
\end{document}

编译:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值