我想在多列环境中使用任意数量的 mdframed 框。每列应具有相同的高度,这意味着每列中最后一个框的末端应匹配(见下图)。
在我的具体示例中,我想在 3 列多列环境中放置 5 个 mdframed 框。我尝试按照建议使用 minipages 调整框的高度这里。
以下是完整的代码示例:
\documentclass{article}
\usepackage[framemethod=TikZ]{mdframed}
\usepackage{multicol}
\newlength{\columnheight}
\setlength{\columnheight}{10cm}
\begin{document}
\centering
\begin{multicols}{3}
% First Column
\begin{minipage}[t][\columnheight][t]{0.9\linewidth}
\begin{mdframed}
\begin{minipage}[t][0.6\columnheight][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\item Point 2
\item Point 3
\end{itemize}
\end{minipage}
\end{mdframed}
\vfill
\begin{mdframed}
\begin{minipage}[t][0.2\columnheight][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\end{itemize}
\end{minipage}
\end{mdframed}
\end{minipage}
\columnbreak
% Second Column
\begin{minipage}[t][\columnheight][t]{0.9\linewidth}
\begin{mdframed}
\begin{minipage}[t][0.4\columnheight][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\item Point 2
\end{itemize}
\end{minipage}
\end{mdframed}
\vfill
\begin{mdframed}
\begin{minipage}[t][0.4\columnheight][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\item Point 2
\end{itemize}
\end{minipage}
\end{mdframed}
\end{minipage}
\columnbreak
% Third Column
\begin{minipage}[t][\columnheight][t]{0.9\linewidth}
\begin{mdframed}
\begin{minipage}[t][\columnheight][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\end{itemize}
\end{minipage}
\end{mdframed}
\vfill
\end{minipage}
\columnbreak
\end{multicols}
\end{document}
结果如下:
如图所示,右列比其他列大。有没有办法自动解决这个问题?到目前为止,我使用 vspaces 来调整其他两列框之间的边距,直到长度匹配。有没有更优雅的方法来做到这一点?我已经尝试调整框的值,例如 skipbelow 或 skipabove,但这没有帮助。
答案1
在第 3 列中,您使用了 2 个嵌套的 minipage。内部 minipage 为整个列高,然后您在其周围添加一个框架,这实际上会强制外部 minipage 大于列高。如果这些只是\fbox
es,则需要从内部 minipage 的高度中减去2\fboxsep
和。2\fboxrule
但在 中mdframed
,我按照以下方式进行操作。我在序言中定义了这些:
\newlength\innermarg
\innermarg 4pt\relax
\newlength\outerlinewidth
\outerlinewidth 3pt\relax
\mdfsetup{outerlinewidth=\outerlinewidth, innertopmargin=\innermarg,
innerbottommargin=\innermarg, outermargin=0pt}
然后,对于第三列的内部小页面,
\begin{minipage}[t][\columnheight-2\outerlinewidth-2\innermarg][t]{0.9\linewidth}
这样,框架边框和宽度就被减去了,所以你不会溢出。请注意,calc
我的语法需要包。
\documentclass{article}
\usepackage[framemethod=TikZ]{mdframed}
\usepackage{multicol}
\usepackage{calc}
\newlength{\columnheight}
\setlength{\columnheight}{10cm}
\newlength\innermarg
\innermarg 4pt\relax
\newlength\outerlinewidth
\outerlinewidth 3pt\relax
\mdfsetup{outerlinewidth=\outerlinewidth, innertopmargin=\innermarg,
innerbottommargin=\innermarg, outermargin=0pt}
\begin{document}
\centering
\begin{multicols}{3}
% First Column
\begin{minipage}[t][\columnheight][t]{0.9\linewidth}
\begin{mdframed}
\begin{minipage}[t][0.6\columnheight][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\item Point 2
\item Point 3
\end{itemize}
\end{minipage}
\end{mdframed}
\vfill
\begin{mdframed}
\begin{minipage}[t][0.2\columnheight][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\end{itemize}
\end{minipage}
\end{mdframed}
\end{minipage}
\columnbreak
% Second Column
\begin{minipage}[t][\columnheight][t]{0.9\linewidth}
\begin{mdframed}
\begin{minipage}[t][0.4\columnheight][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\item Point 2
\end{itemize}
\end{minipage}
\end{mdframed}
\vfill
\begin{mdframed}
\begin{minipage}[t][0.4\columnheight][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\item Point 2
\end{itemize}
\end{minipage}
\end{mdframed}
\end{minipage}
\columnbreak
% Third Column
\begin{minipage}[t][\columnheight][t]{0.9\linewidth}
\begin{mdframed}
\begin{minipage}[t][\columnheight-2\outerlinewidth-2\innermarg][t]{0.9\linewidth}
\begin{itemize}
\item Point 1
\end{itemize}
\end{minipage}
\end{mdframed}
% \vfill
\end{minipage}
\columnbreak
\end{multicols}
\end{document}
注意:最后一列的高度似乎仍然存在微小的差异。我没有时间去追踪它,但确实发现从第三列的列高中减去额外的 0.8pt 是有效的,即使列高更改为各种值:
\begin{minipage}[t][\columnheight-2\outerlinewidth-2\innermarg-.8pt][t]{0.9\linewidth}