如何让 LaTeX 精确填满一页?

如何让 LaTeX 精确填满一页?

我知道我可以通过多种方式控制 LaTeX 中的行间距。命令如下\baselineskip\baselinestretch\linespread在控制行间距时非常有用。每种方法都有自己的特点和使用情况,正如我们在这些讨论中发现的那样(AC)。

如果想要一个现成的解决方案来控制行距,可以使用以下软件包setspace非常方便(内置命令如\onehalfspacing\setstretch用于更精细的控制)。

无论如何,我的问题有点不同。我有一些文本(段落和列表模式),我想填满一页。为了使情况复杂化,它甚至可能包含方程式和图形。(让我们把浮点数放在一边。)

如果我想静态地解决这个问题,我所要做的就是调整某个\baselineskip(或 \setstretch)的值,直到满意为止。虽然这在大多数情况下都很有效,但当我想删除或添加一些文本时,我必须再次经历这个过程。

\baselineskip是否 有可能有一个动态值, \setstretch以便我的文本始终填满一页?(肯定在合理的范围内。)

\vfill另一个想法是在某些文本之间使用多个s。但我认为这种技术仅适用于封面。

我不会在这里提出 MWE。我认为那个不适用。


这个问题不是一个理论问题,我正在准备一些讲义,希望它能填满一页。

答案1

您可以添加可拉伸性\baselineskip

\documentclass{article}
\usepackage[pass,showframe]{geometry} % just to show the page is filled up
\usepackage{kantlipsum}

\newcommand{\addstretch}[1]{\addtolength{#1}{\fill}}

\flushbottom

\begin{document}

\addstretch{\baselineskip}
\addstretch{\abovedisplayskip}
\addstretch{\abovedisplayshortskip}
\addstretch{\belowdisplayskip}
\addstretch{\belowdisplayshortskip}
\setlength{\parskip}{0pt}

\kant*[1]
\begin{equation}
E=mc^2
\end{equation}
\kant[2-3]

\newpage

\kant*[1]
\begin{equation}
E=mc^2
\end{equation}
\kant[2]

\newpage

\end{document}

使用\fill覆盖\vfil插入的\newpage

在此处输入图片描述

创建onepage环境很容易:

\newenvironment{onepage}
  {\newpage\flushbottom
   \addstretch{\baselineskip}
   \addstretch{\abovedisplayskip}
   \addstretch{\abovedisplayshortskip}
   \addstretch{\belowdisplayskip}
   \addstretch{\belowdisplayshortskip}
   \setlength{\parskip}{0pt}}
  {\newpage}

以下是带有环境的完整代码:

\documentclass{article}
\usepackage[pass,showframe]{geometry} % just to show the page is filled up
\usepackage{kantlipsum}

\newcommand{\addstretch}[1]{\addtolength{#1}{\fill}}
\newenvironment{onepage}
  {\newpage\flushbottom
   \addstretch{\baselineskip}
   \addstretch{\abovedisplayskip}
   \addstretch{\abovedisplayshortskip}
   \addstretch{\belowdisplayskip}
   \addstretch{\belowdisplayshortskip}
   \setlength{\parskip}{0pt}}
  {\newpage}

\begin{document}

\begin{onepage}
\kant*[1]
\begin{equation}
E=mc^2
\end{equation}
\kant[2-3]
\end{onepage}

\begin{onepage}
\kant*[1]
\begin{equation}
E=mc^2
\end{equation}
\kant[2]
\end{onepage}

\end{document}

答案2

希望@egreg 永远不要看到这个结果

\documentclass{article}

\def\a{one two three four five six}
\def\b{\a\a\a\a\a\par\a\a\a\a\a\a\a\a\a\a\a}

\flushbottom
\begin{document}
\setlength\baselineskip{\fill}
\setlength\lineskip{\fill}
\setlength\parskip{\fill}

\b\b

\end{document}

答案3

尝试这个例子:

\documentclass[a4paper]{article}

\usepackage{etoolbox,lipsum}

\patchcmd\newpage{\vfil}{}{}{}

\flushbottom

\begin{document}

\baselineskip \the\baselineskip plus .1pt


\lipsum[1]

\lipsum[2]

\end{document}

在此处输入图片描述

\flushbottom使 LaTeX 填充页面至底部在分页符上. 需要对 进行修补\newpage以使其也适用于单页文档。

的修改\baselineskip可能不够优雅,并且会在字体切换时消失。您可能比我更了解如何正确修改它。

请注意,\parskip具有1pt可拉伸性,因此行间空间可拉伸至段落间空间的 1/10。

答案4

做成\baselineskip可拉伸的有点过了,而且印刷不良除非您只生成一个页面。如果您有多个页面,灵活的基线跳过将改变页面上的黑色量,即使是很小的更改,也会让人觉得不舒服。

您可以\vfill在任何情况下使用,但我建议尽可能轻松地使用:\flushbottom将确保底部对齐的文本,抑制\vfil插入到页面底部的文本,让您可以自由使用\vfil自己的垂直空间(或使用类似的表达式进行更精细的控制10pt plus 1fil)。

我建议您确定内容中可以添加一点拉伸的所有位置,并在每个位置安排一个\vfil。这样,常规的行间空间(\baselineskip)就可以保持不变。列表等已经引入了可拉伸空间,但您可能需要对其进行调整,以使空白均匀分布。

相关内容