使用 mdframed 的 Excursus 环境:分页符问题

使用 mdframed 的 Excursus 环境:分页符问题

此问题是以下问题的后续问题:使用 TikZ 访问 mdframed 节点坐标?

@MarcoDaniel:很棒的软件包(mdframed)!代码也非常干净。

@Tobi:我真的很喜欢你的新excursus环境!但是,在页面上拆分时会出现一个问题:第一个框(\mdf@putbox@first)被发送到以下页面。使用你之前的代码:

\documentclass{scrartcl}

\usepackage{tikz}
   \usetikzlibrary{calc,arrows}
\usepackage{etoolbox}
\usepackage[framemethod=tikz]{mdframed}

\tikzstyle{excursus arrow}=[%
   line width=4pt,
   draw=blue,
   rounded corners=2ex
]
\tikzstyle{excursus head}=[%
   fill=white,
   font={\bfseries\sffamily},
   text=blue,
   anchor=base,
]

\makeatletter
\newcommand{\drawexcursusarrow}{%
   \patchcmd{\mdf@putbox@single}{\mdfcreateextratikz}{
      \path let \p1=(P), \p2=(O) in (\x2,\y1) coordinate (Q);
      \path let \p1=(Q), \p2=(O) in (\x1,{(\y1-\y2)/2}) coordinate (M);
      \path [excursus arrow, round cap->]
         ($(O)+(5em,0ex)$) -| (M) |- %
         ($(Q)+(6em,0ex)$) .. controls +(0:16em) and +(185:6em) .. %
         ++(23em,2ex);
      \node [excursus head] at ($(Q)+(4.5em,-2pt)$) {Excursus};
   }{}{}%
   \patchcmd{\mdf@putbox@first}{\mdfcreateextratikz}{
      \path let \p1=(P), \p2=(O) in (\x2,\y1) coordinate (Q);
      \path [excursus arrow,->]
         (O) |- %
         ($(Q)+(6em,0ex)$) .. controls +(0:16em) and +(185:6em) .. %
         ++(23em,2ex);
      \node [excursus head] at ($(Q)+(4.5em,-2pt)$) {Excursus};
   }{}{}%
   \patchcmd{\mdf@putbox@second}{\mdfcreateextratikz}{
      \path let \p1=(P), \p2=(O) in (\x2,\y1) coordinate (Q);
      \path [excursus arrow,round cap-]
         ($(O)+(5em,0ex)$) -| (Q);
   }{}{}%
   \patchcmd{\mdf@putbox@middle}{\mdfcreateextratikz}{
      \path let \p1=(P), \p2=(O) in (\x2,\y1) coordinate (Q);
      \path [excursus arrow]
         (O) -- (Q);
   }{}{}%
}
\makeatother
\newmdenv[%
   middlelinewidth=24pt,
   middlelinecolor=white,
   rightline=false,
   innertopmargin=0ex,
   innerbottommargin=0ex,
   innerrightmargin=2pt,
   innerleftmargin=0ex,
   leftmargin=-11pt,
   skipabove=12pt,
   skipbelow=-1pt,%=12-24/2-2/2
   settings=\drawexcursusarrow,
]{excursus}

\usepackage{lipsum}

\begin{document}

\lipsum[3]
\begin{excursus}
   \lipsum[1]
\end{excursus}
\lipsum[3]
%\vspace*{-2\baselineskip}
\begin{excursus}   %% Added to illustrate the splitting problem
   \lipsum[1-2]
\end{excursus}
\lipsum[3]

\end{document}

您可以取消注释\vspace*{...}以查看是否\mdf@putbox@first重新出现在相应的页面中,但是它现在与前面的文本重叠。

excursus我的猜测是,在分页算法中没有考虑到顶部箭头(和标题)增加的高度mdframed,所以现在的总高度\mdf@putbox@first超过了页面上剩余的可用垂直空间。

这听起来对吗?有办法解决吗?

答案1

我上传了 1.5 版本并添加了一个示例excurs-environment。您可以在文件中找到该示例mdframed-example-texsx.pdf(例 5)。

可以使用以下设置来定义环境:

\usetikzlibrary{calc,arrows}

设计所需(与 mdframed 无关)

定义线条和箭头的样式(与 mdframed 无关)

\tikzset{
   excursus arrow/.style={%
    line width=2pt,
    draw=gray!40,
    rounded corners=2ex,
   },
   excursus head/.style={
    fill=white,
    font=\bfseries\sffamily,
    text=gray!80,
    anchor=base west,
   },
}

使用1.5 版的新键定义新环境:singleextrafirstextramiddleextrasecondextra

\mdfdefinestyle{digressionarrows}{%
  singleextra={%
   \path let \p1=(P), \p2=(O) in (\x2,\y1) coordinate (Q);
   \path let \p1=(Q), \p2=(O) in (\x1,{(\y1-\y2)/2}) coordinate (M);
   \path [excursus arrow, round cap-to]
   ($(O)+(5em,0ex)$) -| (M) |- %
   ($(Q)+(12em,0ex)$) .. controls +(0:16em) and +(185:6em) .. %
   ++(23em,2ex);
   \node [excursus head] at ($(Q)+(2.5em,-0.75pt)$) {Digression};},
  firstextra={%
   \path let \p1=(P), \p2=(O) in (\x2,\y1) coordinate (Q);
   \path [excursus arrow,-to]
   (O) |- %
   ($(Q)+(12em,0ex)$) .. controls +(0:16em) and +(185:6em) .. %
    ++(23em,2ex);
   \node [excursus head] at ($(Q)+(2.5em,-2pt)$) {Digression};
  },
  secondextra={%
   \path let \p1=(P), \p2=(O) in (\x2,\y1) coordinate (Q);
   \path [excursus arrow,round cap-]
   ($(O)+(5em,0ex)$) -| (Q);
  },
  middleextra={%
   \path let \p1=(P), \p2=(O) in (\x2,\y1) coordinate (Q);
   \path [excursus arrow](O) -- (Q);
  },
  middlelinewidth=2.5em,middlelinecolor=white,
  hidealllines=true,topline=true,
  innertopmargin=0.5ex,
  innerbottommargin=2.5ex,
  innerrightmargin=2pt,
  innerleftmargin=2ex,
  skipabove=0.87\baselineskip,
  skipbelow=0.62\baselineskip,
}

重要的是以下几行:

  middlelinewidth=2.5em,middlelinecolor=white,
  hidealllines=true,topline=true,

首先,我删除了 mdramed 绘制的所有线条,只添加了第一条线。需要第一条线为白色。这样,mdframed 就知道了偏离线的高度,并可以计算出正确的分割点。

通过这些设置您可以获得:

在此处输入图片描述

相关内容