有没有办法在 内产生不平衡的列minipage
?或者,是否有任何(简单)方法可以自定义multicol
以允许\begin{multicols*}
在已知高度的框中使用?
在我的例子中,小页面高 7 厘米,我希望第一列是满的。
\documentclass{article}
\usepackage{kantlipsum}
\usepackage{multicol}
\begin{document}
\section{A heading that spans two columns...}
\begin{minipage}[t][7cm]{\linewidth}
\begin{multicols}{2}
\subsection{Kant 1}
\kant[1]
\end{multicols}
\end{minipage}
\subsection{Kant 2}
\kant[2]
\end{document}
而是生成了以下内容:
答案1
关键是 TeX 基元。列在es 中使用\vsplit
展开,以便使用胶水正确填充空间。我们不希望列与顶部或底部基线对齐。(好吧,底部实际上有效,但为什么要冒险呢?)\parbox
\unvbox
寄存器\vsize
、\columnwidth
和\box0
仅\box1
在 minipage 本地更改。固定 minipage 的高度是多余的。
注意:对于窄柱子\sloppy
这是标准操作程序。您还需要在每一根完整的柱子上涂一些胶水。
\documentclass{article}
\usepackage{kantlipsum}
\usepackage{multicol}
\begin{document}
\section{A heading that spans two columns...}
\begin{minipage}{\linewidth}
\vsize=7cm
\columnwidth=\dimexpr 0.5\textwidth - 0.5\columnsep\relax
\setbox0=\vbox{\hsize=\columnwidth
\sloppy
\addtolength{\baselineskip}{0pt plus 1pt minus .5pt}% usually glue comes from \parskip
\subsection{Kant 1}
\kant[1]}%
\ifdim\ht0<\vsize
\parbox[c][\vsize][t]{\columnwidth}{\unvbox0}
\else
\setbox1=\vsplit0 to \vsize
\parbox[c][\vsize][s]{\columnwidth}{\unvbox1}\hfill
\parbox[c][\vsize][t]{\columnwidth}{\unvbox0}
\fi
\end{minipage}
\section{A heading that spans three columns...}
\begin{minipage}{\linewidth}
\vsize=7cm
\columnwidth=\dimexpr 0.333\textwidth - 0.667\columnsep\relax
\setbox0=\vbox{\hsize=\columnwidth
\sloppy
\addtolength{\baselineskip}{0pt plus 1pt minus .5pt}% usually glue comes from \parskip
\subsection{Kant 1}
\kant[1]}%
\ifdim\ht0<\vsize
\parbox[c][\vsize][t]{\columnwidth}{\unvbox0}
\else
\setbox1=\vsplit0 to \vsize
\parbox[c][\vsize][s]{\columnwidth}{\unvbox1}\hspace{\columnsep}%
\ifdim\ht0<\vsize
\parbox[c][\vsize][t]{\columnwidth}{\unvbox0}
\else
\setbox1=\vsplit0 to \vsize
\parbox[c][\vsize][s]{\columnwidth}{\unvbox1}\hfill
\parbox[c][\vsize][t]{\columnwidth}{\unvbox0}
\fi
\fi
\end{minipage}
\end{document}
答案2
minipage
或的额外可选参数\parbox
是在编写 LaTeX 2e 时添加到 LaTeX 内核的。它们的作用本质上是生成一个\vbox to <height>
。不幸的是,在这个框中,任何代码都不清楚(除非我完全误以为它是在具有定义高度的框中运行,而只是它在框中运行。查看\height
没有帮助,因为您可以嵌套框,从而看到错误的\height
。
所以基本上,虽然人类很清楚我们在这样一个盒子里,但里面执行的代码却不清楚,这就是为什么 multicol 只是确定,啊盒子 -> 需要平衡,因为我们不知道底部在哪里。
第二个原因(说实话)我在编写multicols*
代码时从未考虑过这些额外的可选参数。所以归根结底,这可能是可能的,嗯,确实如此(请参阅@John 在他的回答中的代码),但在多列中自动执行此操作可能并不是一件容易的事,因为您需要以某种方式将这是一个高度为 7 厘米的框的信息传递到代码中。
所以截至今天,还没有自动解决方案(正如你所看到的,约翰也将这些知识手动传递给他的代码)。