在困难的段落中自动增加`\rightskip`

在困难的段落中自动增加`\rightskip`

假设我想将文本设置为右边不规则,但不阻止连字符,因此,说 \rightskip=0pt plus 4em (或使用ragged2e和其他类似的包来获得更多的灵活性,为简单起见,这里我将仅使用最基本的参数来显示我所面临的问题)

但是,这偶尔会导致框过满。我想在不将容差提高到过高的情况下防止框过满。因此,我使用\emergencystretch。现在,在第三遍中,对有问题的线条添加了一个有点“假想”的拉伸。但是,这会导致框未满。

我真正想要的是,如果 TeX 无法制作段落,我希望它暂时增加\rightskip可拉伸性。也就是说,我宁愿偶尔有几个段落比平时更“粗糙”一些。我可以手动完成。但是,有没有可能自动完成这个?或者其他方法来实现类似的效果?我正在使用 LuaTeX,所以基于 lua 的解决方案也是可以接受的。

例子,

\hsize=1in
\rightskip=0pt plus 0.5em % for demonstration purpose only
\overfullrule=1ex
% \emergencystretch=0.5in

A wonderful serenity has taken possession of my entire soul, like these sweet
mornings of spring which I enjoy with my whole heart. I am alone, and feel
the charm of existence in this spot, which was created for the bliss of souls
like mine.

\end

这将使盒子满满的, 在此处输入图片描述

添加注释掉的行,

\emergencystretch=0.5in

我们进入了满满的箱子,

在此处输入图片描述

不完美的解决方案 基于http://wiki.luatex.org/index.php/Post_linebreak_filter

\directlua{
  function mclass_ragged (head)
    for line in node.traverse_id(node.id("hlist"), head) do
      if line.glue_order == 0 then
        line.list = node.hpack(line.list)
      end
    end
    return head
  end

  luatexbase.add_to_callback(
    "post_linebreak_filter", mclass_ragged, "mclass_ragged")

}

\rightskip=0pt plus 2em
\dim_set:Nn\emergencystretch{0.5\textwidth}

如果将尖叫线设置为自然宽度,这将导致较小的“overfullbox”。但是,我认为在不规则的设置下,它几乎不会被注意到。甚至单词空间也更好。(或者,可以先消除可收缩性)

它以某种方式干扰titletochyperref。由于我习惯于\filright将 toc 条目设置为完全不规则的,因此我只在 toc 之后添加回调。特别是,我将其挂接到 may\mainmatter定义中。

答案1

一个简单的解决方案,可以与任何 tex 引擎一起使用,并且比使用 lua 回调更不可能干扰其他包,那就是冻结单词间空间(普通 TeX 和\raggedrightragged2e 版本一样这样做)。

与此结合\emergencystretch意味着所有额外的空间都位于右侧,因此在下面的示例中,虽然从of my entire技术上讲它是不完整的,但它并没有出现过度拉伸,而是线比参数\rightskip允许的更短(更粗糙)。

在此处输入图片描述

相关内容