如何将一页的中间部分与下一页对齐

如何将一页的中间部分与下一页对齐

考虑以下 MWE:

\documentclass[twoside]{article}
\usepackage{lipsum}
\usepackage{calc}
\usepackage{printlen}
\uselengthunit{mm}
\begin{document}
\newbox{\mybox}
\savebox{\mybox}{\begin{minipage}{\textwidth}\section{foobar}\lipsum[3-5]\end{minipage}}
\newlength{\myheight}
\settototalheight{\myheight}{\mybox}
\begin{minipage}[t][\myheight]{\textwidth}
\section{foo}
\lipsum[1]

\vfill

\section{bar}
\lipsum[2]
\end{minipage}
\clearpage%
\usebox{\mybox}

\printlength{\myheight}
\end{document}

我希望第一页的第二部分向下移动,以便其底部与下一页文本的底部对齐。我尝试测量该文本的高度并设置相同高度的迷你页面。但如您所见,高度计算不正确。

我怎样才能让 LaTeX 做我想做的事情?(我确实意识到这种方法对各部分的编号顺序是错误的,但这对我的真实文档并不重要。)

答案1

展示如何修复它比解释它为什么会失败更容易,因为解释失败的原因需要研究它到底是如何工作的。通常,扩展比仅仅\settototalheight扩展更安全(至少在本地删除内容)。\usebox{\mybox}\mybox

既然 里面有胶水minipage,你不妨使用[s]。不同之处在于默认设置实际上添加了\vfil上下,而 则被 所压倒\vfill

需要注意的是,任何内部的全局定义或修改都\savebox将立即生效,因此您需要摆弄部分计数器以确保正确。

以下是一些最小的修改。唯一的风格变化是将一些定义移至序言中。

\documentclass[twoside]{article}
\usepackage{lipsum}
\usepackage{calc}
\usepackage{printlen}
\uselengthunit{mm}

\newsavebox{\mybox}
\newlength{\myheight}

\begin{document}
\setcounter{section}{2}%
\savebox{\mybox}{\begin{minipage}{\textwidth}
  \section{foobar}\lipsum[3-5]
  \end{minipage}}
\setcounter{section}{0}%
\settototalheight{\myheight}{\usebox{\mybox}}
\begin{minipage}[c][\myheight][s]{\textwidth}
\section{foo}
\lipsum[1]

\vfill

\section{bar}
\lipsum[2]
\end{minipage}
\clearpage%
\refstepcounter{section}%
\usebox{\mybox}

\printlength{\myheight}
\end{document}

下面就是我会如何做。

\documentclass[twoside]{article}
\usepackage{lipsum}
\usepackage{calc}
\usepackage{printlen}
\uselengthunit{mm}

\newsavebox{\mybox}
\newlength{\myheight}

\begin{document}
\setcounter{section}{2}%
\setbox\mybox=\vbox{\section{foobar}\lipsum[3-5]}
\setcounter{section}{0}%
\setlength{\myheight}{\dimexpr \ht\mybox+\dp\mybox}
\vbox to \myheight{%
\section{foo}
\lipsum[1]

\vfill

\section{bar}
\lipsum[2]}
\clearpage%
\refstepcounter{section}%
\usebox{\mybox}

\printlength{\myheight}
\end{document}

相关内容