本地设置 \emergencystretch 的环境

本地设置 \emergencystretch 的环境

以下环境,复制自这个网站是关于如何处理过满的水平盒子的,允许只更改\tolerance其所包含的段落的参数:

\newenvironment{tolerant}[1]{%
  \par\tolerance=#1\relax
}{%
  \par
}

不幸的是,该网站没有指定用于本地更改的类似环境\emergencystretch。由于上述定义中的大部分代码(特别是命令\par\relax)目前超出了我的理解范围,我不知道如何为本地设置创建类似的环境\emergencystretch——但我确信 TeX.SE 上的某个人会知道。

如何编写一个可以本地改变值的环境\emergencystretch(并确保更改得到应用)?

答案1

更改\tolerance\emergencystretch并传递长度而不是数字。

\par表示段落结束,与空白行相同。\relax是一个原始命令,它不执行任何操作,但如果文本以数字开头,它会停止扫描数字。

\tolerance=1\relax 2 is ...

将公差设置为 1,并排版为 2,但没有\relax或空格

 \tolerance=12 is..

将其设置为 12,而不是排版 2。

答案2

TeX 使用段落末尾的设置\tolerance或。因此,第一个设置结束使用旧设置排版的当前段落。in确保环境中的最新段落也使用环境的特殊设置完成并排版。\emergencystretch\par\par\end{emergency}

因为是一个 dimen 寄存器,所以可以使用\emergencystretchLaTeX来本地设置:\setlength\emergencystretch

\newenvironment{emergency}[1]{%
  \par
  \setlength{\emergencystretch}{#1}%
}{%
  \par
}

答案3

事实上,我会做如下的事情:

\newenvironment{xtolerant}[2]{%
  \par
  \ifx\empty#1\empty\else\tolerance=#1\relax\fi
  \ifx\empty#2\empty\else\emergencystretch=#2\relax\fi
}{%
  \par
}

这样,您就可以决定是否设置\tolerance\emergencystretch同时设置两者。只需将一个环境参数留空即可不设置它。

因此,

\begin{xtolerant}{300}{}
  ...
\end{xtolerant}

将设置\tolerance为 300 并保持\emergencystretch原样,

\begin{xtolerant}{}{2em}
  ...
\end{xtolerant}

将设置\emergencystretch为 2em 并保持\tolerance不变,并且

\begin{xtolerant}{300}{2em}
  ...
\end{xtolerant}

将设置\tolerance为 300 并设置\emergencystretch为 2em。

相关内容