我将从 转为mdframed
使用tcolorbox
,并且我正在几乎我想要去的地方。
使用mdframed
,我可以使用singleextra
和firstextra
参数将节点添加到我的框架中,这会改变整个框架的高度(即,如果我的新节点伸出框架上方,则整个框架的高度会增加;如果我的新节点伸出框架下方,则整个框架的高度也会增加)。这让我的生活变得轻松。
使用tcolorbox
,我可以使用overlay
参数将节点添加到框架,但大小不会自动调整。如果你包含\tcbuselibrary{hooks,skins}
(不确定哪个具体是这样做的)一个enlarge top by
参数,它将添加所需的空间,以便突出在框架上方的节点不会与先前的内容重叠。
下面的 MWE 显示了覆盖和的使用enlarge top by
。
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{skins,hooks}
\usepackage{lipsum}
\tcbset{
frogbox/.style={
enhanced,
colback=green!10,
colframe=green!65!black,
enlarge top by=5.5mm,
overlay={
\foreach \x in {2cm,3.5cm} {
\begin{scope}[shift={([xshift=\x]frame.north west)}]
\path[draw=green!65!black,fill=green!10,line width=1mm] (0,0) arc (0:180:5mm);
\path[fill=black] (-0.2,0) arc (0:180:1mm);
\end{scope}
}
}
}
}
\tcbset{
app/.style={
overlay app={%
\draw(frame.north)--(frame.south);
}
}
}
\begin{document}
\lipsum[1]
\begin{tcolorbox}[frogbox,title=My title]
This is a \textbf{tcolorbox}.
\end{tcolorbox}
\lipsum[2]
\begin{tcolorbox}[frogbox,app,title=My title]
This is a \textbf{tcolorbox}.\par
Here, we apply a second overlay.
\end{tcolorbox}
\end{document}
由于enlarge top by
,眼睛不会与 frogbox 上方的文本重叠。删除enlarge top by
,眼睛就会与 frogbox 上方的文本重叠。
话虽如此,有没有其他方法overlay
可以解决框架+节点可能增加的大小问题?有没有比检查可能添加的每个节点(它不是每个此类框架的静态列表,而是有关元信息的标记)更简单的方法来管理这个问题,以查看是否需要增加分配给框架的空间?
我可以简单地假设新节点将存在并为它们分配空间,并且无论是否存在额外的节点(我当前的策略),看到框架在页面顶部对齐确实很不错,但我想探索一种更复杂的呈现方式,其中额外的空间是否存在取决于节点是否存在。有什么简单的方法可以做到这一点?
答案1
我尝试了一下如何实现返回边界框跟踪tikz
。解决方案很简单。如果你添加
\tikzset{overlay=false}
到您的覆盖代码,跟踪将重新建立。
笔记:
tcolorbox
TeX Live 2013 附带的/无效。TikZ
更新至 TeX Live 2106 修复。保持最新状态!--kjd
完整代码如下:
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{skins,hooks}
\usepackage{lipsum}
\tcbset{
frogbox/.style={
enhanced,
colback=green!10,
colframe=green!65!black,
enlarge top by=5.5mm,
overlay={
\tikzset{overlay=false}%< -----------------------
\foreach \x in {2cm,3.5cm} {
\begin{scope}[shift={([xshift=\x]frame.north west)}]
\path[draw=green!65!black,fill=green!10,line width=1mm] (0,0) arc (0:180:5mm);
\path[fill=black] (-0.2,0) arc (0:180:1mm);
\end{scope}
}
}
}
}
\tcbset{
app/.style={
overlay app={%
\draw([yshift=2cm]frame.north)--(frame.south);
}
}
}
\begin{document}
\lipsum[1]
\begin{tcolorbox}[frogbox,title=My title]
This is a \textbf{tcolorbox}.
\end{tcolorbox}
\lipsum[2]
\begin{tcolorbox}[frogbox,app,title=My title]
This is a \textbf{tcolorbox}.\par
Here, we apply a second overlay.
\end{tcolorbox}
\end{document}
请注意,我不认为这会对易碎的盒子有任何帮助。计算出的尺寸与实际尺寸不完全相同,并且破碎看起来不正确。
对于牢不可破的盒子,这应该可行,但会干扰边界框设置等enlarge top by
。