![使用 \vspace{\fill} 和多栏页面进行 Latex 布局的问题](https://linux22.com/image/304224/%E4%BD%BF%E7%94%A8%20%5Cvspace%7B%5Cfill%7D%20%E5%92%8C%E5%A4%9A%E6%A0%8F%E9%A1%B5%E9%9D%A2%E8%BF%9B%E8%A1%8C%20Latex%20%E5%B8%83%E5%B1%80%E7%9A%84%E9%97%AE%E9%A2%98.png)
这个问题与这个问题。阅读该问题,并阅读第一个也是唯一的答案及其评论。
我得到的答案很好。但是有一个小问题。假设我们有多列文档:
\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}