是否可以使用 获得这样的 (可破坏) 框架mdframed
?或者更一般的问题。可以访问使用 TikZ 绘制的框架的坐标吗?
其中包含分页符:
我使用以下代码构建此示例。
\documentclass{scrartcl}
\usepackage{environ}
\usepackage{tikz}
\usetikzlibrary{calc}
\NewEnviron{excursustikz}{%
\par
\vspace{0.5\baselineskip}%
\noindent
\begin{tikzpicture}%
\node (body) [%
text width=\textwidth-4pt-2ex,
inner sep=0pt,
] {\BODY};
\draw [
line width=4pt,
blue,
line cap=round,
rounded corners=2ex,
->
] ($(body.south west)+(5em,-2ex)$) -| ($(body.west)+(-2ex,0)$) |- %
($(body.north)+(-12em,2ex)$) .. controls +(0:10em) and +(190:5em) .. ++(20em,2ex);
\node [blue,fill=white] at ($(body.north west)+(3.5em,2.36ex)$) {\sffamily\bfseries Excursus};
\end{tikzpicture}%^
\par
\vspace{0.25\baselineskip}%
}
\usepackage{lipsum}
\begin{document}
\lipsum[1]
\begin{excursustikz}
\lipsum[2]
\end{excursustikz}
\lipsum[3]
\end{document}
我设想使用的节点是body
,但我不确定它是否mdframed
在内部使用节点。此外,还必须考虑跨页框架。在这种情况下,右侧的线应该断开,就像您将路径切成两部分一样。
答案1
更新:为了让我们mdframed
知道框架的正确尺寸以计算分页符,我们必须将它们作为不可见的边距(middleline
)并根据这些调整所有内容。请参阅下面的更新代码。
Marco 的评论引导我找到了手册中的相关部分。这是我的代码
\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=green,
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]
\end{document}
我过去常常\pathcmd
区分损坏的和未损坏的帧。此外,我用绘制箭头\drawexcursusarrow
并通过settings
键将其仅应用于{excursus}
环境,因此我的更改不会影响其他帧。
附加问题
是否可以mdframed
忽略框架中最后一行的下行部分?否则(光学)innerbottomsep
取决于这些。