我知道这通常被认为是不明智的,但我需要了解\textheight
在文档中间发生更改时会发生什么。从这个例子中,似乎更改在下一个页面,何时\vsize
发生改变。
\documentclass{article}
\begin{document}
\typeout{Page 1:}
\showthe\textheight
\showthe\vsize
abc
\newpage
\typeout{Page 2:}
\addtolength{\textheight}{1cm}
\showthe\textheight
\showthe\vsize
def
\newpage
\typeout{Page 3:}
\showthe\textheight
\showthe\vsize
ghi
\end{document}
总是这样吗?
答案1
在文档中间进行更改并非“不明智” \textheight
——它不受支持,如果在中途进行更改,可能会发生奇怪的事情。总的来说,你是对的,如果你这样做,它似乎会影响下一页,但浮动算法存在与页面异步的依赖关系(例如,遇到浮动时会进行测试以确保它不超过\textheight
,如果超过,则会人为缩短它,以便浮动算法可以预期所有浮动都适合页面)。
但也存在其他令人惊讶的副作用:试试这个例子:
\documentclass[twocolumn]{article}
\usepackage{lipsum}
\setlength\textheight{4\baselineskip}\addtolength\textheight{\topskip}
\begin{document}
%\begin{figure*} X\\Y \end{figure*} % <--- uncomment for test and watch what happens to page 2
1\\2\\3\\4\\5\\6\\7\\8\\9 \newpage
\addtolength\textheight{-3\baselineskip}
\lipsum
\end{document}
下面是第 2 页有浮动和没有浮动时的效果(从第 3 页开始高度才减少):
但由于浮动已经存在,第二页被缩短了,但现在内容太多了:
现在有人可能会认为这是 LaTeX 2e(甚至是 LaTeX2.09)的错误,但有人可能会称其为功能,因为它是不受支持的输入。
总而言之,如果你需要如果你想构建一个可以改变的东西,\textheight
那么我担心你需要研究它被使用的所有地方
grep textheight latex.ltx
grep @colht latex.ltx
以及那里发生的事情是否会影响您正在尝试做的事情 --- 但正如我所说,它不是一个受支持的接口变量。
答案2
\textheight
在浮动放置算法的各个点也会被参考。这就是为什么lscape
包(\textheight
当然会改变)\clearpage
在切换大小时会执行操作的原因。如果浮动从它决定需要浮动的点浮动到\textheight
不同的点,则效果必须是确定性的,但它们可能都是坏的......
可能值得注意的是,对于页面高度的临时更改,该\enlargethispage
命令是受支持的接口,这本质上是使用隐藏的内部浮点数实现的,并且不会改变,这并不完全是巧合\textheight
。
答案3
\textheight
仅在当前页面结束后才生效。
如果您确实需要更改当前页面的高度,\enlargethispage
这就是您想要的。但是,如果您打算让全长浮动占据整个页面,或者即使您想允许略大的“常规”浮动与某些文本共存于当前页面上,我不知道会发生什么。(如果您坚持的话,大卫可能会解决这个问题。)
可能值得一提的是,在当前页面输出后,效果就会enlargethispage
消失。它并不打算在文档的其余部分持续存在。