使用 \vspace{\fill} 和多栏页面进行 Latex 布局的问题

使用 \vspace{\fill} 和多栏页面进行 Latex 布局的问题

这个问题与这个问题。阅读该问题,并阅读第一个也是唯一的答案及其评论。

我得到的答案很好。但是有一个小问题。假设我们有多列文档:

\documentclass[twocolumn]{article}
\newenvironment{mybox}{\par\noindent%
   \begin{minipage}{\linewidth}}
   {\end{minipage}\par\vfill}
\begin{document}
        \begin{mybox}
            ++++++\\
            \vspace{3cm}\\
            **********
        \end{mybox}
        \begin{mybox}
            ++++++\\
            \vspace{3cm}\\
            **********
        \end{mybox}
        \begin{mybox}
            ++++++\\
            \vspace{3cm}\\
            **********
        \end{mybox}
        \begin{mybox}
            ++++++\\
            \vspace{3cm}\\
            **********
        \end{mybox} \begin{mybox}
        ++++++\\
        \vspace{3cm}\\
        **********
    \end{mybox}
    \begin{mybox}
        ++++++\\
        \vspace{3cm}\\
        **********
    \end{mybox}
    \begin{mybox}
        ++++++\\
        \vspace{3cm}\\
        **********
    \end{mybox}
    \begin{mybox}
        ++++++\\
        \vspace{3cm}\\
        **********
    \end{mybox}
\end{document}

输出为: 输出

您可能注意到,最后的星号不在同一水平面上。我期望左列的星号应该位于更高的水平面上。因为\vspace{\fill}该列的末尾也应该如此。但不知何故却不行。您能解释一下原因吗?

答案1

您希望分页发生否则\vfill它将\vfill在第一列之前发生(因此被丢弃)但仍然在最后一列:所以使用\vspace*

在此处输入图片描述

\documentclass[twocolumn]{article}
\newcommand\myskip{}  % vertical spacing between mybox environments
\newenvironment{mybox}{\par\noindent%
   \begin{minipage}{\linewidth}}
   {\end{minipage}\par\vspace*{\fill}\pagebreak[0]}


\begin{document}
        \begin{mybox}
            ++++++\\
            \vspace{3cm}\\
            **********
        \end{mybox}
        \begin{mybox}
            ++++++\\
            \vspace{3cm}\\
            **********
        \end{mybox}
        \begin{mybox}
            ++++++\\
            \vspace{3cm}\\
            **********
        \end{mybox}
        \begin{mybox}
            ++++++\\
            \vspace{3cm}\\
            **********
        \end{mybox} \begin{mybox}
        ++++++\\
        \vspace{3cm}\\
        **********
    \end{mybox}
    \begin{mybox}
        ++++++\\
        \vspace{3cm}\\
        **********
    \end{mybox}
    \begin{mybox}
        ++++++\\
        \vspace{3cm}\\
        **********
    \end{mybox}
    \begin{mybox}
        ++++++\\
        \vspace{3cm}\\
        **********
    \end{mybox}

\end{document}

答案2

我不知道这个修复是否通用,但它适用于许多不同的框大小(\mysize)。我向您的\mybox环境应用了一个可选参数。如果可选的 1 个字母参数是F或省略,它会将闭包\vfill应用于环境。对于任何其他字母,它都会应用\vspace{-.5\baselineskip}(我不确定为什么这样做有效)。

通常,您会将可选参数应用于已填充页面上的最后一个块,但如果它是未填充页面上的最后一个块则不会。

\documentclass[twocolumn]{article}
\newcommand\myskip{}  % vertical spacing between mybox environments
\newenvironment{mybox}[1][F]{\par\noindent\gdef\applyvfill{#1}%
   \begin{minipage}{\linewidth}}
   {\end{minipage}\par\if F\applyvfill\vfill\else\vspace{-.5\baselineskip}\fi}
\def\mysize{3cm}
\newcommand\domybox[1][F]{%
        \begin{mybox}[#1]
            ++++++\\
            \vspace{\mysize}\\
            **********
        \end{mybox}
}
\begin{document}
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox[x]
\end{document}

在此处输入图片描述

\mysize下面是进行4cm和 6 次调用(最后一次使用)的结果[x]

在此处输入图片描述

然后将其\mysize设置为 1.5cm 并进行 14 次调用(最后一次使用[x]

\documentclass[twocolumn]{article}
\newcommand\myskip{}  % vertical spacing between mybox environments
\newenvironment{mybox}[1][F]{\par\noindent\gdef\applyvfill{#1}%
   \begin{minipage}{\linewidth}}
   {\end{minipage}\par\if F\applyvfill\vfill\else\vspace{-.5\baselineskip}\fi}
\newcommand\domybox[1][F]{%
        \begin{mybox}[#1]
            ++++++\\
            \vspace{\mysize}\\
            **********
        \end{mybox}
}
\begin{document}
\def\mysize{1.5cm}
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox
\domybox[x]
\end{document}

在此处输入图片描述

相关内容