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
和一。至少,这是我解决问题的尝试。您可以直接重新定义环境:\widowpenalty10000
mindflow
\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]
。