
以下のコードは、数式や数行のテキストの周りにきれいなボックスを作成しますが、次のページに不合理な水平線でボックスが続きます。もちろん、次のコードを追加することで、このとんでもない改ページを取り除くことができます。
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}
生成された 3 つのページのスクリーンショットは次のとおりです。
--
--
答え1
パッケージはこれを検出し、ページ区切りの最後のフレーム セグメントが空であることを警告します。ただし、セグメントは出力されます。そうしないと、フレームの最後の境界が得られません。
ただし、ここではサイドボーダーのみがあるため、(このコードをよく知らないので、そう思いますが) 最後のセグメントを破棄するだけで安全です。少なくともここでは機能しているようです。(マークされた 2 つの場所を参照してください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}