在环境中创建自定义段落格式时,everypar 的更安全替代方案?

在环境中创建自定义段落格式时,everypar 的更安全替代方案?

我正在尝试创建一个环境,其中每个段落

  • 在其前面添加一些风格化的文本(例如“尖端:“)
  • 不允许跨页拆分

基于这个答案,我已经设法使用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}

L3 提示

相关内容