Я хочу использовать произвольное количество mdframed-боксов в многоколоночной среде. Каждый столбец должен иметь одинаковую высоту, что означает, что концы последнего блока в каждом столбце должны совпадать (см. рисунок ниже).
В моем конкретном примере я хочу разместить 5 mdframed boxs в 3-колоночной multicols среде. Я попытался отрегулировать высоту boxs, используя 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 вложенные мини-страницы. Внутренняя — полная высота столбца, а затем вы добавляете вокруг нее рамку, которая фактически заставляет внешнюю мини-страницу быть больше высоты столбца. Если бы это были просто \fbox
es, нужно было бы вычесть 2\fboxsep
и 2\fboxrule
из высоты внутренней мини-страницы.
Но в mdframed
, я сделал это следующим образом. Я определил их в преамбуле:
\newlength\innermarg
\innermarg 4pt\relax
\newlength\outerlinewidth
\outerlinewidth 3pt\relax
\mdfsetup{outerlinewidth=\outerlinewidth, innertopmargin=\innermarg,
innerbottommargin=\innermarg, outermargin=0pt}
Затем, для внутренней мини-страницы 3-го столбца,
\begin{minipage}[t][\columnheight-2\outerlinewidth-2\innermarg][t]{0.9\linewidth}
Таким образом, граница и ширина рамки вычитаются, так что переполнения не будет. Обратите внимание, что calc
для моего синтаксиса требуется package.
\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,8 пункта из высоты столбца 3-го столбца работает, даже когда высота столбца изменяется на различные значения:
\begin{minipage}[t][\columnheight-2\outerlinewidth-2\innermarg-.8pt][t]{0.9\linewidth}