¿Cómo evitar que mdframed escriba una línea viuda que contenga solo un poco de vspace con fondo de color?

¿Cómo evitar que mdframed escriba una línea viuda que contenga solo un poco de vspace con fondo de color?

El siguiente código produce un bonito cuadro alrededor de una ecuación o unas pocas líneas de texto, pero continúa los cuadros en la página siguiente con una regla horizontal absurda. Por supuesto que puedo deshacerme de este escandaloso salto de página agregando

nobreak=true,

a \newmdenv; pero para otros cuadros más grandes necesitaré saltos de página. Por lo tanto, necesito otra solución para solucionar este comportamiento no deseado de mdframed.

Aquí el ejemplo de código, lo más mínimo que pude conseguir:

\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}

Y aquí las capturas de pantalla de las tres páginas generadas:

ingrese la descripción de la imagen aquí

--

ingrese la descripción de la imagen aquí

--

ingrese la descripción de la imagen aquí

Respuesta1

El paquete detecta esto y advierte que el segmento final del marco en el salto de página está vacío. Sin embargo, genera el segmento; de lo contrario, no obtendría el borde final del marco.

Aunque aquí solo tienes bordes laterales, por lo que (creo que no conozco muy bien este código) es seguro descartar el segmento final. Parece funcionar al menos aquí. (Ver los dos lugares marcados CHANGE)

ingrese la descripción de la imagen aquí

\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}

información relacionada