LaTeX 中的水平和垂直间距

速览

本节的主体内容摘自:一份不太简短的 LaTeX2e 介绍(版本 5.01),根据自己的理解为该内容补充了一些案例和代码注释。本文将主要介绍一下几个命令

1
2
3
4
5
\hspace{length}
\hspace{\stretch{n}}
\setlength{parameter}{length}
\addtolength{parameter}{length}
\usepackage{layout}

水平间距

hspace 命令

语法

1
2
\hspace{length}
\hspace*{length} %如果这个水平间距在行首或者行末也需要保持的话,可以使用带星的命令

案例 1:单行文字中设置水平间距

1
2
3
4
5
6
7
8
9
\documentclass{ctexart}
\usepackage{zhlipsum} %中文假文宏包

\begin{document}
\zhlipsum[1]
\vspace{60pt} %增加垂直间距
\noindent 本人签名:\underline{\hspace{3.5cm}} %填充3.5cm的下划线
\hspace{2cm}日期:\underline{\hspace{3.5cm}} %与“本人签名”之间水平间距2cm
\end{document}

01-hspace命令增加水平间隔.png

关于以上代码中的 zhlipsum 中文假文宏包的使用:可参考 Latex 之 zhlipsum 中文假文宏包使用说明

stretch 命令

stretch 将产生一个可变长的长度(弹性长度),产生一个能把行内剩余所有空隙填满的空白,如果多个 \hspace{\stretch{n}} 命令位于同一行,那么它们将根据伸缩参数分配空间,非常类似于 HTML 当中的 flex 布局(分蛋糕)

语法

1
2
\stretch{n} %这是一个长度,可嵌在\hspace命令中使用
\hspace{\stretch{n}}

案例 2

1
2
3
4
5
6
\documentclass{ctexart}
\begin{document}
\noindent 居庙堂之高则忧其民 \hspace{\stretch{1} }处江湖之远则忧其君%只分一块蛋糕,行内所有的空余空间全部都分给了\stretch{1}

\noindent 而或长烟一空 \hspace{\stretch{1} } 皓月千里 \hspace{\stretch{1} } 浮光跃金 \hspace{\stretch{1} } 静影沉璧 \hspace{\stretch{1} } 渔歌互答 \hspace{\stretch{1} } 此乐何极!
\end{document}

02-stretch弹性长度.png

同样,对于垂直间距,也存在水平间距对应的命令:hspace ⇒ vspace

垂直间距

在页面中,段落、章节标题、行间公式、列表、浮动体等元素之间的间距是 latex 预设的。比如 \parskip,默认设置为 0pt plus 1pt(弹性长度)。

什么是 “弹性长度”:如 12pt plus 2pt minus 3pt 表示基础长度为 12pt,可以伸展到 14pt,也可以收缩到 9pt。也可只定义 plus 或者 minus 的部分,如 0pt plus 5pt

如果我们想要人为地增加段落之间的垂直间距,可以在两个段落之间的位置使用 \vspace 命令:

1
2
3
A paragraph.
\vspace{2ex}
Another paragraph.

\vspace 命令生成的垂直间距在一页的顶端或底端可能被 “吞掉”,对应地,\vspace* 命令产生不会因断页而消失的垂直间距。

更有趣的长度

setlength:给参数一个固定的值

语法

1
\setlength{parameter}{length} 

addtolength:给参数增加一个长度

语法

1
\addtolength{parameter}{length}

第二个命令实际上比 \setlength 更为实用,因为可以相对于现有的设置来获得所需的结果。比如,为了将文本的宽度增加 1cm,我将如下的命令放置在文档导言区

1
2
\addtolength{\hoffset}{-0.5cm} %页面左右两侧均有hoffset,两边减小的空隙等于版心增加的间隙,页面总宽度不变
\addtolength{\textwidth}{1cm}

比如使用默认的 ctexart 文档类,其默认的布局参数如下所示:
PS:按住 Ctrl 键或 Command 键 + 滚动鼠标中键可进行放大,亦可全屏观看

如何查看文档的页面布局参数

1
2
3
\usepackage{layout} %在导言区使用Layout宏包
%...
\layout %在正文区使用layout命令

比如

1
2
3
4
5
6
\documentclass{ctexart}
\usepackage{layout}

\begin{document}
\layout
\end{document}

输出文档布局参数如下

03-页面相关的所有距离参数.png

只要可能,就应该避免在 Latex 文档中使用绝对长度。比如说通过 \textwidth 可作为图片的宽度,使其恰好充满整个页面
下面的三个命令允许你获得一个文本串的宽度、高度以及深度

1
2
3
\settoheight{variable}{text} %获取text的宽度,将其值传给variable变量
\settodepth{variable}{text}
\settowidth{variable}{text}
1
2
3
4
5
6
7
8
9
\documentclass{ctexart}

\begin{document}
\settowidth{\parindent}{666666} %修改段落缩进值,将缩进值设为6个数字字符长度(3个汉字宽度)传给\parindent

壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵明月之诗,歌窈窕之章。少焉,月出于东山之上,徘徊于斗牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。

于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,如怨如慕,如泣如诉;余音袅袅,不绝如缕。舞幽壑之潜蛟,泣孤舟之嫠妇。
\end{document}

05-通过settowidth获取文本的宽度.png

06-settowidth的实际应用.png

待续

参考资料