下面的代码在方程式或几行文本周围生成了一个漂亮的框,但在下一页上继续使用荒谬的水平线来显示框。当然,我可以通过添加
nobreak=true,
;\newmdenv
但对于其他更大的框,我需要分页符。因此,我需要另一种解决方案来解决 mdframed 的这种不良行为。
下面是我能得到的最简单的代码示例:
\documentclass[a4paper,11pt,fleqn]{report}
\setlength{\headheight}{15pt}
\setlength{\textheight}{430pt}
\renewcommand{\arraystretch}{1.3}
\usepackage{amsmath}
\usepackage[bold-style=ISO]{unicode-math} % must come after ams and symbols
\usepackage{xcolor}
\usepackage{mdframed}
\newmdenv[
usetwoside=false,
skipabove=3pt minus 1pt plus 3pt,
skipbelow=3pt minus 1pt plus 3pt,
leftmargin=-4pt,
rightmargin=-4pt,
innerleftmargin=2pt,
innerrightmargin=2pt,
innertopmargin=4pt,
innerbottommargin=4pt,
backgroundcolor=\boxcolor!20,
topline=false,
bottomline=false,
linecolor=\boxcolor,
linewidth=2pt,
]{aux*}
\newenvironment{mybox} {\begin{aux*}} {\end{aux*}}
\begin{document}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
and now the problematic box
\def\boxcolor{green}
\begin{mybox}%
\begin{equation}\label{Edwba}
\sum
\end{equation}%
\end{mybox}
See just above the nonsensical line produced by mdframed!
\begin{equation}ab\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}ab\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}ab\end{equation}
\begin{equation}ab\end{equation}
\def\boxcolor{red}
\begin{mybox}%
Here comes an example with three lines of text in the box.
Three lines is a lot of text bla bla bla bla bla bla blaaa.
Three lines is a lot of text bla bla bla bla bla bla blaaa.
\end{mybox}
See again the scandalous page break.
\end{document}
以下是生成的三个页面的截图:
--
--
答案1
该包会检测到这种情况并警告分页符处的最后一个框架段为空。但它会输出该段,否则您将无法获得框架的最终边框。
虽然这里只有侧边,所以(我想,我不太了解这段代码)丢弃最后一段是安全的。至少在这里它似乎有效。(参见标记的两个地方CHANGE
)
\documentclass[a4paper,11pt,fleqn]{report}
\setlength{\headheight}{15pt}
\setlength{\textheight}{430pt}
\renewcommand{\arraystretch}{1.3}
\usepackage{amsmath}
\usepackage[bold-style=ISO]{unicode-math} % must come after ams and symbols
\usepackage{xcolor}
\usepackage{mdframed}
\makeatletter
\def\mdf@put@frame@ii{%
\setlength{\mdf@freevspace@length}{\vsize}%
\ifbool{mdf@repeatframetitle}%
{%repeating title -- more robust using hooks.
\toggletrue{mdf@notfirstframetitle}%
\splitmaxdepth\z@ \splittopskip\z@%
\setbox\mdf@splitbox@one=\vbox{\break\unvbox\mdf@splitbox@one}%
\mdf@ignorevbadness%
\setbox0=\vsplit\mdf@splitbox@one to \z@\relax%
\setbox\mdf@splitbox@one=\vbox{\unvbox\mdf@splitbox@one}%
\setbox\mdf@splitbox@one\vbox%
{%
\parskip\z@\relax%
\parindent\z@\relax%
\vskip\mdf@frametitleaboveskip@length%
\unvcopy\mdf@frametitlebox\relax%
\mdf@@frametitlerule\relax%
\unvbox\mdf@splitbox@one\relax%
}%
\setbox\mdf@splitbox@one=\vbox{\unvbox\mdf@splitbox@one}%
}{}%
\setlength{\dimen@}{\dimexpr\ht\mdf@splitbox@one+\dp\mdf@splitbox@one\relax}%
\mdf@dolist{\mdf@advancelength@add{\dimen@}}%
{innerbottommargin,innerlinewidth,middlelinewidth,outerlinewidth}%
\ifboolexpr { bool {mdf@everyline} and bool {mdf@topline} }%
{%
\mdf@dolist{\mdf@advancelength@add{\dimen@}}%
{innerlinewidth,middlelinewidth,outerlinewidth}%
}{}%
\notbool{mdf@bottomline}%remove bottom if neccessary
{%
\mdf@dolist{\mdf@advancelength@sub{\dimen@}}%
{innerlinewidth,middlelinewidth,outerlinewidth}%
}{}%
\ifdimgreater{\dimen@}{\mdf@freevspace@length}%
{%have a middle box
\advance\mdf@freevspace@length by -\mdf@splitbottomskip@length\relax%
\ifbool{mdf@everyline}%regard top and bottom if everyline is used
{%
\ifbool{mdf@topline}%
{%
\mdf@dolist{\mdf@advancelength@sub{\mdf@freevspace@length}}%
{innerlinewidth,middlelinewidth,outerlinewidth}%
}{}%
\ifbool{mdf@bottomline}%
{%
\mdf@dolist{\mdf@advancelength@sub{\mdf@freevspace@length}}%
{innerlinewidth,middlelinewidth,outerlinewidth}%
}{}%
}{}%
\setbox\mdf@splitbox@save=\vbox{\unvcopy\mdf@splitbox@one}%
\splitmaxdepth\z@ \splittopskip\mdf@splittopskip@length%
\mdf@ignorevbadness%
\setbox\mdf@splitbox@two\vsplit\mdf@splitbox@one to \mdf@freevspace@length%
\setbox\mdf@splitbox@two\vbox{\unvbox\mdf@splitbox@two}%
\setbox\mdf@splitbox@one\vbox{\unvbox\mdf@splitbox@one}%
\ifdimgreater{\ht\mdf@splitbox@two+\dp\mdf@splitbox@two}%
{\mdf@freevspace@length}%
{%splitted wrong
\mdf@PackageInfo{Box was splittet wrong^^J
starting loop to iterate
the splitting point\MessageBreak}%
\dimen@i=\mdf@freevspace@length%\relax
\@tempcnta=\z@\relax
\loop
\ifdim\dimexpr\ht\mdf@splitbox@two+\dp\mdf@splitbox@two\relax>%
\mdf@freevspace@length\relax
\advance\dimen@i by -\p@\relax%
\advance\@tempcnta by \@ne\relax%
\ifnum\@tempcnta>100
\let\iterate\relax%
\mdf@PackageWarning{correct box splittet fails^^J
It seems you are using a non splittable
contents\MessageBreak}%
\fi
\mdf@ignorevbadness%
\setbox\mdf@splitbox@one=\vbox{\unvcopy\mdf@splitbox@save}%
\splitmaxdepth\z@ \splittopskip\mdf@splittopskip@length%
\mdf@ignorevbadness%
\setbox\mdf@splitbox@two\vsplit\mdf@splitbox@one to \dimen@i\relax%
\setbox\mdf@splitbox@two\vbox{\unvbox\mdf@splitbox@two}%
\setbox\mdf@splitbox@one\vbox{\unvbox\mdf@splitbox@one}%
\repeat%
}{}%
\ifvoid\mdf@splitbox@one\relax%
\mdf@PackageWarning{You got a bad break because the splittet box is
empty^^J
You have to change the page settings^^J
like enlargethispage or something else^^J
the package increases do
\enlargethispage{\baselineskip}\MessageBreak}%
\setbox\mdf@splitbox@one=\vbox{\unvcopy\mdf@splitbox@save}%
\enlargethispage{\baselineskip}%
\def\mdf@reserved@a{\mdf@put@frame@ii}%
\else
\setbox\mdf@splitbox@two=\vbox%
{%
\hrule \@height\z@ \@width\mdfboundingboxwidth\relax%
\unvcopy\mdf@splitbox@two%
}%
\begingroup%
\mdf@@setzref%
\booltrue{mdfmiddleframe}%
\mdf@beforebreak%
\mdf@putbox@middle%
\mdf@afterbreak%
\endgroup%
\hrule \@height\z@ \@width\hsize%
\vfill\eject%
\def\mdf@reserved@a{\mdf@put@frame@ii}%
\fi
}%End middle box case
{%start last box case
\ifvoid\mdf@splitbox@one
\mdf@PackageWarning{You got a bad break\MessageBreak
because the last split box is empty\MessageBreak
You have to change the settings1}%%
%CHANGE: leave final box as void
\iffalse
\setbox\mdf@splitbox@one=\vbox%
{%
\unvbox\mdf@splitbox@one%
\hrule \@height\z@ \@width\mdfboundingboxwidth
}%
\fi
%end CHANGE
\fi%
\ifdimless{\ht\mdf@splitbox@one}{1sp}%
{%
\mdf@PackageWarning{You got a bad break\MessageBreak
because the last split box is empty\MessageBreak
You have to change the settings2}%
\let\mdf@reserved@a\relax%
%CHANGE: add discard final box
\iffalse
\setbox\mdf@splitbox@one=\vbox%
{%
\unvbox\mdf@splitbox@one%
\hrule \@height\z@ \@width\mdfboundingboxwidth
}%
\fi
%END CHANGE
\setbox\mdf@splitbox@one\box\voidb@x
}{}%
\begingroup%
\toggletrue{mdflastframe}%
\mdf@beforebreak%
\begingroup%
\mdf@@setzref%
\booltrue{mdflastframe}%
\mdf@beforelastframe%
\mdf@putbox@second%
\mdf@afterlastframe%
\endgroup%
\hrule \@height\z@ \@width\hsize%
\mdf@afterbreak%
\endgroup%
\let\mdf@reserved@a\relax%
}%
\mdf@reserved@a%
}
\makeatother
\newmdenv[
usetwoside=false,
skipabove=3pt minus 1pt plus 3pt,
skipbelow=3pt minus 1pt plus 3pt,
leftmargin=-4pt,
rightmargin=-4pt,
innerleftmargin=2pt,
innerrightmargin=2pt,
innertopmargin=4pt,
innerbottommargin=4pt,
backgroundcolor=\boxcolor!20,
topline=false,
bottomline=false,
linecolor=\boxcolor,
linewidth=2pt,
]{aux*}
\newenvironment{mybox} {\begin{aux*}} {\end{aux*}}
\begin{document}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
and now the problematic box
\def\boxcolor{green}
\begin{mybox}%
\begin{equation}\label{Edwba}
\sum
\end{equation}%
\end{mybox}
See just above the nonsensical line produced by mdframed!
\begin{equation}ab\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}\frac{a}{b}\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}ab\end{equation}
Mix text and equation to insert lots of glue
\begin{equation}ab\end{equation}
\begin{equation}ab\end{equation}
\def\boxcolor{red}
\begin{mybox}%
Here comes an example with three lines of text in the box.
Three lines is a lot of text bla bla bla bla bla bla blaaa.
Three lines is a lot of text bla bla bla bla bla bla blaaa.
\end{mybox}
See again the scandalous page break.
\end{document}