有没有办法获取 的大小\vfill
?我想对间距进行一些计算,我已经尝试过了:
\newlength{\newtest}
\settowidth{\newtest}{\vfill}
我收到一个错误。
有什么建议吗?
答案1
\vfill
是无限胶水。数量不是固定值,而是“胶水长度”,可以从到0pt
“无穷大”。当 TeX 构造其父垂直框时,其实际长度是已知的。专家可以检查该框并确定 TeX 选择的确切设置。但是,还有一种更简单的方法。许多 TeX 编译器都支持告知位置的功能:pdfTeX(该功能的发明者)在 PDF 和 DVI、XeTeX、LuaTeX 两种模式下都支持该功能。当页面被发送出去时,位置是已知的。savepos
包的模块zref
提供了一个处理内部的包装器。它将位置记录在辅助文件(.aux
)中作为参考,并在下一次 LaTeX 运行中使它们可用。
\documentclass{article}
\usepackage{zref-savepos}
\usepackage{printlen}
\usepackage{lipsum}
\newcommand*{\posdiff}[2]{%
\zifrefundefined{#1}{\textbf{??}}{%
\zifrefundefined{#2}{\textbf{??}}{%
\printlength{\dimexpr\zposy{#1}sp-\zposy{#2}sp\relax}%
}%
}%
}
\uselengthunit{mm}
\begin{document}
\section{Hello World}
\lipsum[1-2]
\hrule
\zsavepos{top}
\vfill
\zsavepos{bottom}
\hrule
\newpage
Vertical space on the previous page
between the lines: \posdiff{top}{bottom}
\end{document}
对于想要调试 TeX 框的专家:
\showbox
需要一个框句柄并在文件中显示该框及其节点内容.log
。\showlists
不带参数则显示当前垂直主列表。\showboxbreadth
和\showboxdepth
是整数寄存器,用于控制显示多少框内容(框可能非常大)。它们的默认值-1
在 LaTeX 中是抑制输出的。.log
除非\tracingonline
(也是整数寄存器)设置为正值,否则输出只会打印在文件中。
答案2
以下可能是 Heiko 答案的一个用例。我假设这里的动机是您在页面顶部有一些固定高度的块(文本),在页面底部有一些可变高度的块(文本)。使用\vfill
最大的底部块,您希望提取该信息并将其用作其他页面上块之间的垂直空间。
您可以计算插入的长度\vfill
并将其存储在长度(比如)中\vfilllength
,如下例所示:
\documentclass{article}
\usepackage[paperheight=5in]{geometry}% http://ctan.org/pkg/geometry
\usepackage[savepos]{zref}% http://ctan.org/pkg/zref
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\newlength{\vfilllength}
\AtBeginDocument{%
\setlength{\vfilllength}{\dimexpr\zposy{thetop}sp-\zposy{thebottom}sp}% Calculate \vfill
}
\begin{document}
\lipsum[1]
\par\zsaveposy{thetop}
\vfill
\zsaveposy{thebottom}\par
\noindent\rule{\linewidth}{1in}%
\clearpage
\lipsum[1]
\par\vspace*{\vfilllength}\par
\noindent\rule{\linewidth}{1cm}%
\end{document}
在上述平均能量损失标签thetop
和thebottom
放置在 周围,\vfill
以记录标签的垂直位置(以缩放点/sp
秒为单位);从页面底部到顶部增加。随后使用 提取它们,\zposy
距离通过 计算\dimexpr
。
请注意,在文档前言中无法设置长度,因为文件.aux
(包含 PDF 标签位置)仅在前言完成后才被读取。因此使用\AtBeginDocument
。