我精心编写了一份文档,将其放在 4 页内;但是当我添加\raggedright
(或\RaggedRight
使用ragged2e
包)时,长度会变长。此外,从 Linux 计算机上的 Web2c 移动到 Windows 计算机上的最新版本 MiKTeX 时,输出突然变得不稳定。
这是一个展示该行为的测试用例:
\documentclass[11pt,a4paper]{article}
\usepackage[a4paper,margin=20mm,nohead,foot=7mm]{geometry}
\usepackage{lipsum}
\usepackage{microtype}
\usepackage{txfonts}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}
\lipsum[1-35]
\end{document}
这样可以生成超过 4 页的内容,Web2c 和 MikTeX 可以生成视觉上相同的 PDF 文件。但现在考虑:
\documentclass[11pt,a4paper]{article}
\usepackage[a4paper,margin=20mm,nohead,foot=7mm]{geometry}
\usepackage{lipsum}
\usepackage{ragged2e}
\usepackage{microtype}
\usepackage{txfonts}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}
\newlength{\saveparindent}
\setlength{\saveparindent}{\parindent}
\RaggedRight
\setlength{\parindent}{\saveparindent}
\lipsum[1-35]
\end{document}
在 Web2c 上,这会增加两行文档的长度;但在 MikTeX 上,这会增加 7 行!发生了什么?
更新:正如一些评论非常有帮助地指出的那样,软件包版本可能会有所不同,而且不出所料,情况似乎确实如此——我的 Web2C 安装(不受我控制!)已经过时了。然而,最初的问题仍然存在——为什么使用\RaggedRight
和不使用之间会有什么不同?
答案1
\raggedright
0pt plus 1fil
在行尾添加无限粘连 ( )。正如 jon 所评论的,这将使连字符 (next to) 变得不可能,从而导致每行的单词数减少。
\RaggedRight
另一方面,添加了有限粘连(默认值为0pt plus 2em
),因此连字再次成为可能——但这惯于导致与对齐文本相同的连字/换行模式。原因是,使用时可能具有可接受的(对于 TeX 的换行算法而言)单词间距的行\RaggedRight
对于对齐文本来说会变得太间隔,因此 TeX 宁愿选择将一个单词挤入相应行的解决方案。如果您使用microtype
及其字体扩展功能,这种效果会更频繁地发生。
下面的例子可以说明这一点:
使用
\raggedright
(andmicrotype
) 时,“fermentum”一词不会被连字符连接,而是整体移至段落的第四行。\RaggedRight
允许连字符(“fer-mentum”)。两端对齐的文本加法
microtype
允许将单词“laoreet”放在第一行,从而允许将整个“fermentum”放在第三行,这将导致段落短一行。不带 的对齐文本无法
microtype
将“laoreet”挤进第一行,这反过来意味着连字符(“fer-mentum”)成为第三行的首选解决方案。与 不同\RaggedRight
,单词“sed”将成为第四行的一部分。
\documentclass{article}
\usepackage{ragged2e}
\usepackage{microtype}
\usepackage{lipsum}
\newlength{\saveparindent}
\setlength{\saveparindent}{\parindent}
\makeatletter
\g@addto@macro{\raggedright}{\setlength{\parindent}{\saveparindent}}
\g@addto@macro{\RaggedRight}{\setlength{\parindent}{\saveparindent}}
\makeatother
\begin{document}
\raggedright
\lipsum[6]
\RaggedRight
\lipsum[6]
\justifying
\lipsum[6]
\microtypesetup{activate=false}
\lipsum[6]
\end{document}
答案2
正如评论中指出的那样,不同安装之间的差异可能是由于不同包中的连字符不同,有时还由于不同的语言设置。
raggedright 经常比完全对齐的文本给出更多的行数,其原因与 TeX 的换行算法的复杂性有关。这是一个相当明显的陈述,所以我将尝试根据我的理解解释发生了什么。
段落不完美都会受到“惩罚”,TeX 会尝试找到能将段落总惩罚最小化的换行符。连字会受到惩罚,过度拉伸(松散)或压缩(紧绷)的线条也会受到惩罚,尤其是相邻的松散和紧绷线条。
因此,对于完全对齐的文本,换行算法必须更加努力地寻找一组足够好的换行符,并且如果这是最佳解决方案,则会设置紧密的行。这将压缩行的次数与拉伸行的次数一样多(初步估计)。
对于不规则右对齐,\rightskip
不为零,因此在每行末尾添加了额外的可拉伸空间(粘连),并且这个空间足够拉伸,以至于当 TeX 实际布置每行的间距时,它根本不会拉伸标准的单词间距。 这样做的结果是,当搜索换行符时,将行尾间距拉伸到最大值(\rightskip=0pt plus 2em
在 plain.tex 中,\rightskip=0pt plus 1fil
在 latex.ltx 中)的解决方案比将额外的单词或部分单词挤到该行上的紧密行更具吸引力。 因此设置的紧密行相对较少。
解决方案(如果您想要针对特定文档的解决方案)是尝试鼓励 TeX 支持紧密行,或者至少找到一组不太糟糕的断点,这些断点使用的行数少于找到的最佳断点。这里的标准技巧是将其\looseness=-1
放在有问题的段落的末尾(或开头)。否则,您可以开始弄乱换行算法的内部参数:连字符惩罚、单词间粘合、容忍度、预容忍度……
...这里有龙!