我正在尝试创建一个环境,其中每个段落
- 在其前面添加一些风格化的文本(例如“尖端:“)
- 不允许跨页拆分
基于这个答案,我已经设法使用everypar
和实现这一点windowpenalties
,但我想知道是否有更好的方法。我已经读由于许多软件包都会覆盖它,因此如果可能的话应该尽量everypar
避免这种情况。
虽然我主要关注的是 的使用everypar
,但我也希望得到有关 的建议windowpenalties
。 有没有更好的方法?
梅威瑟:
\documentclass[oneside]{book}
\usepackage{lipsum}
\usepackage{parskip}
\raggedbottom
\newenvironment{tips}
{%
\widowpenalties 1 10000%
\everypar{{\fontshape{\itdefault}\fontseries{\bfdefault}\selectfont Tip:\enspace}}%
}
{}
\begin{document}
\lipsum[1-10]
\begin{tips}
\lipsum[1-10]
\end{tips}
\lipsum[1-10]
\end{document}
答案1
另一个并不完美的选择。
\documentclass{scrartcl}
\usepackage{kantlipsum}
\newenvironment{tips}
{\def\par{\futurelet\tmptoken\dopar}%
\def\dopar{\ifx\tmptoken\par\else\ifx\tmptoken\endgraf\else\ifx\tmptoken\end\else
\endgraf\nobreak\textbf{\textit{Tip}:\enspace}\fi\fi\fi}%
\interlinepenalty=10000 \par}
{\endgraf}
\begin{document}
\begin{tips}
\kant*[1]
\kant*[2]
\kant*[3]
\end{tips}
\end{document}
不过,我认为这更安全(并且同样简单):
\newenvironment{tips}
{\par
\def\tip{\par\nobreak\textbf{\textit{Tip}:\enspace}}%
\interlinepenalty=10000 }
{\par}
并使用
\begin{tips}
\tip whatever
\tip you
\tip want
\tip \kant[2]
\end{tips}
答案2
我不建议使用这个。坚持使用\everypar
。这会更安全。不过,由于 LaTeX 3 开发人员的努力,目前正在进行的工作将使这一过程在未来变得更加容易。
以下是一个例子,仅供参考\everypar
:
\documentclass[oneside]{book}
\usepackage{lipsum}
\usepackage{parskip,l3galley,xparse}
\raggedbottom
\ExplSyntaxOn
\tl_new:N \g_splicer_saved_tl
\NewDocumentEnvironment{tips}{}
{
\group_begin:
\tl_gset:NV \g_splicer_saved_tl \g_galley_par_begin_hook_tl
\tl_gput_right:Nn \g_galley_par_begin_hook_tl
{
\textit{ \bfseries Tip: } \enspace
}
}
{
\tl_gset:NV \g_galley_par_begin_hook_tl \g_splicer_saved_tl
\group_end:
}
\ExplSyntaxOff
\begin{document}
\lipsum[1-10]
\begin{tips}
\lipsum[1-10]
\end{tips}
\lipsum[1-10]
\end{document}