在 mindflow 环境中抑制分页符

在 mindflow 环境中抑制分页符

mindflow包“mindflow”提供的环境将文本换行成两行宽行,\mfSepLine其定义为

\newcommand*{\mfSepLine}{%
  \parskip=0pt
  \LNturnsONfalse%
  \ifLineNumbers\LNturnsONtrue\fi\nolinenumbers%
  \par\noindent\nopagebreak%
  \if@mindflow@incolumn%
    \makebox[\linewidth]{\rule{\linewidth}{\mindflowLineHeight}}%
  \else%
    \hspace*{-\paperwidth}%
    \makebox[\linewidth]{\rule{4\paperwidth}{\mindflowLineHeight}}%
  \fi%
  \nopagebreak\par%
  \ifLNturnsON\linenumbers\fi%
}

但是,即使\nopagebreak分隔线前后各有两个 s,有时分隔线仍会位于新的页面上。以下是第二条分隔线单独位于下一页的示例:

\documentclass{article}

\usepackage[a4paper]{geometry}
\usepackage{mindflow}
\usepackage{blindtext}

\begin{document}

\blindtext[5]
\begin{mindflow}
    \blindtext
    More text
    % \nopagebreak
\end{mindflow}

\end{document}

生成结果:

在此处输入图片描述

我该如何纠正这个行为?

顺便问一下,当靠近分页符时,是否可以确保该分隔线至少有两行文本?

答案1

您必须在环境中添加两个\nobreak和一。至少,这是我解决问题的尝试。您可以直接重新定义环境:\widowpenalty10000mindflow

\makeatletter
\renewcommand{\endmindflow}{%
  \widowpenalty10000%<---MODIFIED
  \par\nobreak%<---MODIFIED
    \vspace{-.5\baselineskip}\color{mindflowLine}\nobreak\mfSepLine%<---MODIFIED
    \ifLNturnsON\linenumbers\fi%
    \setcounter{mfLN}{\value{linenumber}}%
    \setcounter{linenumber}{\value{recordLN}}%
}
\makeatother

或者使用etoolbox,如以下 MWE 所示:

\documentclass{article}

\usepackage[a4paper]{geometry}
\usepackage{mindflow}
\usepackage{blindtext}

\usepackage{etoolbox}
\patchcmd{\endmindflow}
  {\par\vspace{-.5\baselineskip}\color{mindflowLine}\mfSepLine}
  {\widowpenalty10000
    \par\nobreak\vspace{-.5\baselineskip}\color{mindflowLine}\nobreak\mfSepLine}
  {}
  {}

\begin{document}

\blindtext[5]
\begin{mindflow}
\blindtext
    More text%
\end{mindflow}

\end{document}

如果你愿意,你可以加载nowidow包并替换\widowpenalty10000\nowidow[2]。优点是,如果你想将三行而不是两行放在一起,那么就足够了:\nowidow[3]

在此处输入图片描述

相关内容