我正在使用示例 5 – TikZ 的复杂示例与文档mdframed
中的手册scrbook
不同。目标是在教科书中包含易于区分的包含练习、定义等的框。
我从手册中采用的样式使mdframed
框进入scrbook
为其标题保留的空间。仅当 mdframed 元素作为新页面上的第一个框生成时才会发生这种情况。我认为问题是由于在节点中包含了一个高度为 10 毫米的元素(P-|O)
,因此它进入标题约 5 毫米。
我试图理解如何mdframed
定义节点,如(P)
或(P-|O)
,但很难弄清楚。另外,我认为解决方案是扩展元素的bounding box
。虽然我认为我理解 的概念bounding box
,但我不知道如何将 mdframed 元素的边界框延长 -5mm(就此而言,也不知道任何其他节点的边界框延长)。
以下是问题的屏幕截图以及一些 MWE 代码。屏幕截图包含屏幕标尺以方便使用。
(顺便说一句,我认为问题也发生在示例 5来自 mdframed 手册的代码,只是在我的改编中它更加明显,因为原始垂直空间要小得多)。
\documentclass{scrbook}
\usepackage[papersize={170mm,240mm}
,top=25mm
,inner=20mm
,outer=25mm
,marginparwidth=50pt
]{geometry}
\usepackage[framemethod=tikz]{mdframed}
\mdfsetup{skipabove=2\baselineskip,skipbelow=2\baselineskip,frametitlefont=\sffamily\bfseries\Large, needspace=4\baselineskip, splittopskip=1.5\baselineskip}
\mdfsetup{apptotikzsetting={\tikzset{mdfbackground/.append style={draw=none}}}}
\mdfdefinestyle{greyexercise}{%
everyline=true,ignorelastdescenders=true,
linewidth=0pt,backgroundcolor=black!20,
innerleftmargin=5mm, innerrightmargin=5mm, innerbottommargin=5mm, innertopmargin=5mm,
frametitleaboveskip=15mm, frametitlebelowskip=5mm,frametitlerule=false, repeatframetitle=false,
firstextra={\useasboundingbox (P) rectangle (P);\node[xshift=5mm,right,draw=black!20, line width=1.5pt,rectangle, minimum size=10mm, fill=white] at (P-|O) {\color{black!20}%\includegraphics[width=10mm]{.pdf}
};},
singleextra={\useasboundingbox (P) rectangle (P);\node[xshift=5mm,right,draw=black!20, line width=1.5pt,rectangle, minimum size=10mm, fill=white] at (P-|O) {\color{black!20}%\includegraphics[width=10mm]{.pdf}
};}
}
\usepackage{lipsum,xcolor}
\begin{document}
\chapter{Witchcraft in Transylvania}
\section{Origins 1840--1843}
\lipsum[1-7]
\begin{mdframed}[style=greyexercise,frametitle=Exercises]
\lipsum[1]
\end{mdframed}
\end{document}
编辑
一位用户建议删除\useasboundingbox
。虽然这很好地解决了标题距离问题,但它可能会导致 mdframed 的分页算法失效(见屏幕截图)。这种情况似乎发生在 mdframed 框相当大的情况下(屏幕截图中的框包含内容\lipsum[1-6]
。
答案1
您\useasboundingbox
正在隐藏插入方块的高度。只需将其删除,或选择更好的边界框大小。删除它可
\documentclass{scrbook}
\usepackage[papersize={170mm,240mm}
,top=25mm
,inner=20mm
,outer=25mm
,marginparwidth=50pt
]{geometry}
\usepackage[framemethod=tikz]{mdframed}
\mdfsetup{skipabove=2\baselineskip,skipbelow=2\baselineskip,frametitlefont=\sffamily\bfseries\Large, needspace=4\baselineskip, splittopskip=1.5\baselineskip}
\mdfsetup{apptotikzsetting={\tikzset{mdfbackground/.append style={draw=none}}}}
\mdfdefinestyle{greyexercise}{%
everyline=true,ignorelastdescenders=true,
linewidth=0pt,backgroundcolor=black!20,
innerleftmargin=5mm, innerrightmargin=5mm, innerbottommargin=5mm,
innertopmargin=5mm,
frametitleaboveskip=15mm,
frametitlebelowskip=5mm,frametitlerule=false,
repeatframetitle=false,
firstextra={\node[xshift=5mm,right,draw=black!20, line width=1.5pt,rectangle, minimum size=10mm, fill=white] at (P-|O) {\color{black!20}%\includegraphics[width=10mm]{.pdf}
};},
singleextra={\node[xshift=5mm,right,draw=black!20, line width=1.5pt,rectangle, minimum size=10mm, fill=white] at (P-|O) {\color{black!20}%\includegraphics[width=10mm]{.pdf}
};}
}
\usepackage{lipsum,xcolor}
\begin{document}
\chapter{Witchcraft in Transylvania}
\section{Origins 1840--1843}
\lipsum[1-7]
\begin{mdframed}[style=greyexercise,frametitle=Exercises]
\lipsum[1]
\end{mdframed}
\lipsum[2-3]
\begin{mdframed}[style=greyexercise,frametitle=Further exercises]
\lipsum[1]
\end{mdframed}
\end{document}
该组合
\useasboundingbox (P) rectangle (P)
将生成一个矩形,其左下角位于 ,(P)
右上角位于同一点(P)
,因此高度和宽度为零。您可以使用以下方法制作一个高度1cm
基于 的框:(P)
\useasboundingbox (P) rectangle +(0,1);
但是,您注意到,这种框架环境的长版本存在严重问题。这是因为linewidth
没有匹配新边界框所需的额外空间。一种方法是添加
middlelinewidth=0pt,linecolor=white,outerlinewidth=5mm,
leftline=false,rightline=false,bottomline=false,
5mm
在顶部添加与框延伸到环境上方的部分相对应的 宽度线。
\documentclass{scrbook}
\usepackage[papersize={170mm,240mm}
,top=25mm
,inner=20mm
,outer=25mm
,marginparwidth=50pt
]{geometry}
\usepackage{xcolor}
\usepackage[framemethod=tikz]{mdframed}
\mdfsetup{skipabove=2\baselineskip,
skipbelow=2\baselineskip,
frametitlefont=\sffamily\bfseries\Large,
needspace=4\baselineskip,
splittopskip=1.5\baselineskip}
\mdfsetup{apptotikzsetting={\tikzset{mdfbackground/.append style={draw=none}}}}
\mdfdefinestyle{greyexercise}{%
everyline=true,
ignorelastdescenders=true,
middlelinewidth=0pt,linecolor=white,outerlinewidth=5mm,
leftline=false,rightline=false,bottomline=false,
backgroundcolor=black!20,
innerleftmargin=5mm, innerrightmargin=5mm,
innerbottommargin=5mm,
innertopmargin=5mm,
frametitleaboveskip=15mm,
frametitlebelowskip=5mm,frametitlerule=false,
repeatframetitle=false,
firstextra={\node[xshift=5mm,right,draw=black!20, line width=1.5pt,rectangle, minimum size=10mm, fill=white] at (P-|O) {\color{black!20}%\includegraphics[width=10mm]{.pdf}
};},
singleextra={\node[xshift=5mm,right,draw=black!20, line width=1.5pt,rectangle, minimum size=10mm, fill=white] at (P-|O) {\color{black!20}%\includegraphics[width=10mm]{.pdf}
};}
}
\usepackage{lipsum}
\begin{document}
\chapter{Witchcraft in Transylvania}
\section{Origins 1840--1843}
\lipsum[1-7]
\begin{mdframed}[style=greyexercise,frametitle=Exercises]
\lipsum[1]
\end{mdframed}
\lipsum[2-3]
\begin{mdframed}[style=greyexercise,frametitle=Further exercises]
\lipsum[1-10]
\end{mdframed}
\end{document}
只是为了好玩,下面是一个使用tcolorbox
而不是 的实现mdframed
。最初的印象是,这样做效果更好:
\documentclass{scrbook}
\usepackage[papersize={170mm,240mm}
,top=25mm
,inner=20mm
,outer=25mm
,marginparwidth=50pt
]{geometry}
\usepackage{xcolor}
\usepackage{tcolorbox}
\tcbuselibrary{breakable,skins}
\newcommand{\nodecode}{\path (frame.north west)
node[xshift=10mm, yshift=0mm, right, draw=black!20,
line width=1.5pt, rectangle, minimum size=10mm,
fill=white] {};}
\newtcolorbox{greyexercise}[1]{title=#1,
enhanced, breakable, frame hidden,
before={\par\vfill\penalty-200\vfilneg},
fonttitle=\sffamily\Large\bfseries,
coltitle=black, colbacktitle=black!20, colback=black!20,
detach title, before upper={\vspace{5mm}\tcbtitle\par\vspace{10mm}},
sharp corners,
boxsep=5mm, enlarge top initially by=5mm,
overlay first={\nodecode},
overlay unbroken={\nodecode},
lines before break=5
}
\usepackage{lipsum}
\begin{document}
\chapter{Witchcraft in Transylvania}
\section{Origins 1840--1843}
\lipsum[1-7]
\begin{greyexercise}{Exercises}
\lipsum[1]
\end{greyexercise}
\lipsum[2-3]
\begin{greyexercise}{Further exercises}
\lipsum[1-10]
\end{greyexercise}
\end{document}