![如何让 LaTex 准确填满有列的页面?](https://linux22.com/image/389872/%E5%A6%82%E4%BD%95%E8%AE%A9%20LaTex%20%E5%87%86%E7%A1%AE%E5%A1%AB%E6%BB%A1%E6%9C%89%E5%88%97%E7%9A%84%E9%A1%B5%E9%9D%A2%EF%BC%9F.png)
类似问题#1:如何让 LaTeX 精确填满一页?
类似问题#2:用方程填满一页,然后切换到一栏
我需要创建多个页面,每个页面的长度应为一页,格式相同。格式是页面顶部有一列,页面底部有两列。每页将包含不同的文字和图片。
我看过如何让 LaTeX 精确填满一页?我觉得这是让文本适合一页的巧妙方法。但是,我无法对两列使用相同类型的技术。
下面是最简单的无列填充页面的例子:
\documentclass{article}
\usepackage[pass,showframe]{geometry} % just to show the page is filled up
\usepackage{kantlipsum}
\usepackage{multicol}
\begin{document}
\addtolength{\baselineskip}{\fill}
\kant*[1]
\kant[2-3]
\end{document}
如果我添加列,则页面仅通过扩展第一个段落而不是列中的段落来填充。
\documentclass{article}
\usepackage[pass,showframe]{geometry} % just to show the page is filled up
\usepackage{kantlipsum}
\usepackage{multicol}
\begin{document}
\addtolength{\baselineskip}{\fill}
\kant*[1]
\begin{multicols}{2}
\kant[2-3]
\end{multicols}
\end{document}
它可能是用方程填满一页,然后切换到一栏有我的问题的解决方案。但是,我目前对 LaTex 的了解还不足以理解那里是否存在解决方案。
我尝试过下面代码的多种变体,但无法使其在列上运行:
\newcommand{\addstretch}[1]{\addtolength{#1}{\fill}}
\newenvironment{onepage}
{\newpage\flushbottom
\addstretch{\baselineskip}
\addstretch{\abovedisplayskip}
\addstretch{\abovedisplayshortskip}
\addstretch{\belowdisplayskip}
\addstretch{\belowdisplayshortskip}
\setlength{\parskip}{0pt}}
{\newpage}
我将非常感激任何帮助,使列中的文本与其他文本一起扩展,以便页面很好地填充。
答案1
它不会填充到页面末尾的原因是,multicol
在平衡列时计算了不需要额外填充的必要高度,并将这些列输出到该高度,因此没有多余的空间需要填充。
此解决方案修补了multicol
\s 平衡例程,默认情况下强制列高填满页面上所有剩余空间。我还没有用极端情况测试过,所以我不知道它会有多强健。这种方法的一个缺点是,您不会看到\baselineskip
上面单列段落的任何填充,因为 2 列部分占用了所有剩余空间。
作为手动解决方法,我还添加了一个可选参数,让您明确指定列的空间,但除非您精确调整它,否则您将无法再将其推到文本区域的底部。此外,如果您取消注释注释的命令\addtolength
,列的底部multicols
将被推到文本区域底部的略下方。
\documentclass{article}
\usepackage[pass,showframe]{geometry}
\usepackage{kantlipsum}
\usepackage{multicol}
\usepackage{xparse,xpatch}
\makeatletter
\newlength{\fillcol@height}
\let\fill@columns\balance@columns
\xpatchcmd{\fill@columns}{\vfuzz\z@
\setbox\count@\vbox to\dimen@}
{\vfuzz\z@
\ifdim\fillcol@height>\z@ \else
\fillcol@height\@colroom
\fi
\setbox\count@\vbox to\fillcol@height}{}{}
\NewDocumentEnvironment{fillcols}{m o}{
\IfValueT{#2}{\setlength{\fillcol@height}{#2}}
\renewcommand{\balance@columns}{\fill@columns}
\begin{multicols}{#1}
\addtolength{\baselineskip}{\fill}
}{
\end{multicols}
}
\makeatother
\begin{document}
%\addtolength{\baselineskip}{\fill}
\kant*[1]
\begin{fillcols}{2}
\kant[2-3]
\end{fillcols}
\end{document}
结果: