以下环境,复制自这个网站是关于如何处理过满的水平盒子的,允许只更改\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 寄存器,所以可以使用\emergencystretch
LaTeX来本地设置:\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。