仅为一个列表项设置 \emergencystretch 的最干净的方法是什么?

仅为一个列表项设置 \emergencystretch 的最干净的方法是什么?

喂养pdflatex

\documentclass{article}
\pagestyle{empty}
\usepackage[USenglish,latin]{babel}
\babelprovide[hyphenrules=nohyphenation]{latin}
\usepackage{enumitem}%%% the same problem occurrs with usual LaTeX lists, but I use enumitem anyway in my non-minimal text, so let's have it in our example and suggested solutions, too.
\usepackage{lipsum}
\begin{document}
\begin{otherlanguage}{USenglish}%
  Text before the list.%
\end{otherlanguage}%
%\begingroup\setlength\emergencystretch{.13em}%%% if we do this, an unwanted indent after the list appears.
\begin{itemize}
\item \lipsum[1]
%\begingroup\setlength\emergencystretch{.13em}%%% if we do this, the group logically spans slightly more than it should span, doesn't it?
\item \lipsum[2]%
%\endgroup%%% terminating the group here has no effect.
\item \lipsum[3]%
%\endgroup%%% if we do this, the group logically spans slightly more than it should span, doesn't it?
\item \lipsum[4]
\end{itemize}%
%\endgroup%%% if we do this, an unwanted indent after the list appears.
\begin{otherlanguage}{USenglish}%
  Text after the list.
  Text after the list.
  Text after the list.
  Text after the list.
  Text after the list.
\end{otherlanguage}%
\end{document}

导致过满:

输出

为了消除第二项中过满的“vestibulum”,我在本地将其设置\emergencystretch为一些可能较小的值(理想情况下小于 的 3em \sloppy),以便更改不会对其余排版产生太大影响。我知道以下类似的解决方案:

  1. 将整个列表包装到\begingroup\setlength{\emergencystretch}{.13em}[…]中\endgroup。但是,这会在列表后产生缩进,而之前并没有缩进。您可以使用 来抵消此问题\noindent,但从逻辑上讲,这是一种黑客行为,会消除无关解决方案的副作用。(也许,在某些情况下,首选的分页符或列表与以下文本之间的距离可能会发生变化,尽管我在我的示例中没有观察到这种变化。)

  2. 将第二个和(部分?)第三个项目包装到\begingroup\setlength{\emergencystretch}{.13em}[…]中\endgroup。但是,从逻辑上讲,它跨越的范围超过了它应该跨越的范围;也就是说,跨度包括(部分?)第三个项目,但没有换行符。此外,如果列表在超额项目之后没有项目(在我们的最小示例中:如果没有第三个项目),则此解决方案不可用。

  3. 将第二项和(部分?)第三项包装到\setlength{\emergencystretch}{.13em}[…]中\setlength{\emergencystretch}{0pt}。但是,这会导致两次设置长度(而不是设置长度然后撤消本地更改),这可能会导致在进一步的文本编辑过程中难以发现的错误。

有没有更清洁的解决方案?如果有,那会是什么?

答案1

{\setlength{\emergencystretch}{<dimen>}\par}在项目末尾使用。

在这里我将nopar选项传递给lipsum,以便真正模拟一个正常的段落。

\documentclass{article}
\pagestyle{empty}
\usepackage[USenglish,latin]{babel}
\babelprovide[hyphenrules=nohyphenation]{latin}
\usepackage{enumitem}
\usepackage[nopar]{lipsum}

\begin{document}

\begin{otherlanguage}{USenglish}
  Text before the list.
\end{otherlanguage}
\begin{itemize}
\item \lipsum[2]
\item \lipsum[2]{\setlength{\emergencystretch}{.13em}\par}
\item \lipsum[2]
\end{itemize}
\begin{otherlanguage}{USenglish}
  Text after the list.
  Text after the list.
  Text after the list.
  Text after the list.
  Text after the list.
\end{otherlanguage}

\end{document}

在此处输入图片描述

为什么它会起作用?因为设置为\emergencystretch是执行 的组的本地设置\par。启用此设置后,段落会被中断,但在 被}感知后,它会恢复到之前的值(通常为 0pt)。

瞧,妈妈!没有 %!

相关内容