调整换行

在合理的段落内,LaTeX 自动优化换行位置。通常这就足够了——但有时你想要说:“在此处打破”或“不要在此处打破”。本页不是关于分隔段落的(请参阅“换行符和段落符”)。它是用于微调段落内*断行位置的工具包:强制断行、防止断行、控制连字以及接受过满/未满警告。

首先是基本规则:分隔段落(用空行)与此处介绍的换行调整不同。空行开始一个新段落,并具有缩进和段落间距。接下来的内容会推动行*结束*落在单个段落中的位置。如果这种区别感觉模糊,请先阅读“换行符和段落符”。

强制换行

为了强制在段落中间中断,有两个命令系列。第一个是 \\\newline。两者都只是“在此结束行”,而没有离开段落模式。至关重要的是,它们 打破了文本的自然长度,而不拉伸它 - 因此该行在没有到达右边距的地方停止并保持较短。这适合地址或诗句,其中每一行都应该在您想要的位置准确结束。

第二个是 \linebreak。它打破*和* 拉伸字间空间,使该行对齐到右边距。因此,与 \\ 不同的是,该行永远不会短 - 相反,字间距可能会变得间隙很大。它的强度由 \linebreak[n] 设置(n 是一个 0-4 的整数):4 表示“强制中断”(没有参数的默认值),而 1 是温和的“另一个位置可能会更好,但这里是可以接受的”。简而言之,\linebreak 是关于在哪里中断的*建议*,而该线的最终拉伸则留给LaTeX 的合理性。

一旦你编译它,对比就很明显了。将 \\ 放在句子中间,该行就会在那里折断,在继续移动时在右侧留下空白。将 \linebreak 放在同一位置,该线会一直延伸到右边缘,从而在单词之间打开尴尬的间隙。助记符:\\ 用于缩短,\linebreak 用于对齐边距。 请注意,\\ 具有扩展 — 方括号中的长度,如 \\[2ex] 中那样,在该行之后添加垂直空间,而 \\* 禁止在该点处分页(请参阅“换行符和段落符”)。

latex
% \\ は短く折る/\linebreak は右端まで引き伸ばす
第一の道は険しく\\
第二の道はなだらかだ。

非常に長い一文をここで\linebreak 区切ると、左側の語間が広がります。

在段落模式下,\newline 等于 \\,但在表格 (tabular) 内,它们的角色是分开的: 在段落制作单元格(如 p{...} 列)中,\newline 仅在单元格内中断,而 \\ 则中断整行。 当您希望在一个单元格内的两行上显示一个地址而不结束该行时,请使用 \newline。在没有行结束的地方(例如在段落的开头)使用 \\ 会引发错误 There's no line here to end

防止换行

对于相反的需求——“不要在这里中断”——有一套匹配的工具。最方便的是波形符~(“领带”):一个不间断的字间空格,用于将两边的内容保持在同一行上,如 Fig.~3Dr.~SmithChapter~12equation~\ref{eq:1} 中。 ~ 是普通字间空间的宽度;唯一的区别是那里不会发生换行。因为它仍然允许相邻单词连字符,所以它比使用 \mbox 粘合整个单词更温和,并且通常是首选。

要设置抵抗中断的强度,请使用 \nolinebreak[n]\linebreak 的镜像,n 为 0 到 4:4(默认值)完全禁止此处中断,而 1 则是温和的“请避免此处中断”。当整个短语不能被分割时,\mbox{...} 很方便:它将其内容视为一个单独的框,并且既不会跨行断开它们,也不会用连字符连接它们(考虑防止 T-34 分割成 T-34)。 \mbox 是LaTeX 相当于普通TeX 的\hbox,直接写\hbox{...} 的行为是一样的。低级 \nobreak 在该点放置了无限的“不要在此处中断”惩罚,并且是 ~ 等命令的基础。

一个警告:用 \mbox 包裹的单词永远不会被打破,所以如果它不合适,它会超出右边距并成为一个 Overfull 框。因此,将真正易碎的东西(长 URL、化学名称)冻结在 \mbox 中会适得其反。当您只想保护一个空格时,请使用~,而\mbox 仅用于您不得拆分的短语。

控制连字符

在西方文本中,LaTeX 自动执行连字符,插入连字符以跨行分隔单词。它通常是明智的,但可能会在字典中没有的专有名词或行话上出错。对于一次性修复,请使用 \- (反斜杠连字符、任意或可选连字符)。它将权限嵌入到一个单词中 - “如果需要,您可以在此处中断” - 因此,例如,编写 man\-u\-script 可以让该单词仅在标记点处中断。

这里潜藏着微妙之处。即使在一个单词中插入一个 \-LaTeX 也会*仅*在您标记的点上连字符,而不会在其他它自己发现的点上连字符。因此,\- 的意思不是“您也可以在此处中断”,而是“您只能在此处中断。”因此,您必须拼写出您想要的每个断点。请注意,\- 不会*强制*中断 - 它只是说“如果你中断,它一定是这些点之一。”

如果相同的单词在整个文档中重复出现,请在序言中注册一次例外,而不会弄乱正文。列出单词,其断点用连字符标记在 \hyphenation{...} 中。这是一个适用于整个文档的全局设置,并且多个声明会累积。两个注意事项:使用小写字母,并且 TeX 匹配 完全 - 变形形式(复数等)单独处理。其中 \- 是“就在这里,就在现在”,将 \hyphenation 视为“整个文档的字典条目”。

latex
% プリアンブルで分割例外を一括登録(小文字・分割点をハイフンで)
\hyphenation{man-u-script analy-sis FORTRAN}

% 本文では、その場かぎりの任意ハイフン
super\-cali\-fragi\-listic

相反,要完全禁止对特定单词使用连字符,请将其包装在 \mbox{...} 中:盒子的内容永远不会中断,因此不会插入连字符。不过,如上所述,牢不可破的单词可能会超出该行并导致出现 Overfull 框。从这个意义上说,日语文本没有连字符,因此 \-\hyphenation 本质上是西方语言部分的工具。

过满/未满 \hbox 警告

在编译时,您可能会看到 Overfull \hboxUnderfull \hbox 警告。 \hbox(水平框)是单个排版行。 过满意味着“线条不合适,卡在右边距之外”,欠满意味着“线条太松,字间间距拉长。” Knuth 选择警告而不是默默接受不合格的排版,将修复留给您。 draft 类选项在每条过满的行旁边打印一条黑色规则,以便您可以发现它。

为什么LaTeX 在边缘处留下一条线?因为当 TeX 在允许的拉伸范围内找不到一组“合适的”中断时,它将溢出显示为警告,而不是怪诞地间隔行。通常的罪魁祸首是不会中断的长单词、URL 或专有名词。首先要尝试的是上面部分中的本地修复:使用\-给出单词断点,在附近放置一个\linebreak,或者使用~解开空格。通常这就解决了。

当本地修复很乏味并且您愿意接受一些松散来减少警告时,请切换到 生硬的工具。 \sloppy 声明大大放宽了断裂容差(在内部将 \tolerance 设置为 9999),接受宽松的字间间距以换取避免过满的框。默认值为 \fussy,它优先考虑均匀间距,但代价是偶尔箱子满了。发出 \sloppy 后,在您想要影响的延伸结束时返回 \fussy

不过,这些声明有一个怪癖。换行遵循段落结束时生效的声明,因此要使 \sloppy 影响给定段落,您必须在 \sloppy 的范围内包含空行或将其结束的 \par。为了将效果限制在单个段落中,sloppypar 环境更安全:只有\begin{sloppypar}\end{sloppypar} 之间的文本被设置为就像在\sloppy 下一样,并且退出时恢复正常行为。

更精细的方法是 \emergencystretch — 例如\setlength{\emergencystretch}{3em} - 仅作为最后手段才允许额外拉伸,修剪过满的盒子而不会像\sloppy那样直接破坏间距。 microtype 包可以巧妙地扩展或收缩字形以适应边距,也有帮助。下表总结了每个命令的作用。

命令角色延长线?
\\ , \newline强制换行(不是段落分隔)否 — 留短
\linebreak[n]建议中断(n=4 强制执行)是的 — 证明保证金合理
\nolinebreak[n]禁止在那里休息(n=4 完全)
~不间断空格(并列);仍然允许连字符
\mbox{...}将内容包装在一个盒子中;没有中断,没有连字符
\-任意连字符;只在这里打破这个词
\hyphenation{...}前言中的全局中断异常(小写,精确)
\sloppy / \fussy放宽容差/默认;通过 sloppypar 本地化\sloppy 往往会放松间距

修复换行警告的命令

如果您通过在可见行上放置\\ 来消除过满或欠满\hbox 警告,则另一行通常会在稍后中断。顺序是:首先修改措辞,然后添加连字符机会,然后使用局部不间断或中断提示,最后放宽段落容差。 TeX 优化整个段落的换行,因此逐行强制应该是最后一步。

  • 长单词、URL和公式:首先识别它们,看看它们是否可以自然缩短或用专用命令破坏。
  • 技术术语: 添加\hyphenation{...}\-,这样同一个字就不需要重复的手动修复。
  • 名称、数字和单位: 仅将不可读的分割与~\nolinebreak 保留在一起。
  • 最后的手段:本地化sloppypar\emergencystretch;不要放松整个文档的字间距。