考虑以下 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}