小页面中的列不平衡

小页面中的列不平衡

有没有办法在 内产生不平衡的列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 厘米的框的信息传递到代码中。

所以截至今天,还没有自动解决方案(正如你所看到的,约翰也将这些知识手动传递给他的代码)。

相关内容