使用 TikZ 访问 mdframed 节点坐标?

使用 TikZ 访问 mdframed 节点坐标?

是否可以使用 获得这样的 (可破坏) 框架mdframed?或者更一般的问题。可以访问使用 TikZ 绘制的框架的坐标吗?

期望结果

其中包含分页符:
第 1 页
第2页

我使用以下代码构建此示例。

\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取决于这些。

相关内容