此问题是以下问题的后续问题:使用 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 版的新键定义新环境:singleextra
、firstextra
和middleextra
secondextra
\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 就知道了偏离线的高度,并可以计算出正确的分割点。
通过这些设置您可以获得: