在使用 memoir\vplace
环境时,我注意到\vplace
当内容以 开头时, LaTeX 倾向于在 a 之前使用 break \{sub}section
。
例如:
\documentclass[oneside,11pt]{memoir}
\usepackage{lipsum}
\begin{document}
\lipsum[1] % A
\begin{vplace}
\subsection{Title} % Starts a new page if the number of pages is > 1
\lipsum[1] % B
\end{vplace}
\lipsum[1] % C
\end{document}
当内容包含在一页中时,它会按预期工作。当内容超过一页时,即使在段落后出现视觉上更可取的断点,也会在标题处发生断点vplace
。
我们可以通过增加部分数量ipsum
来看到这一点,例如[1-2]
。
环境vplace
简单定义如下:
\newenvironment{vplace}[1][1]
{\par\vspace*{\stretch{#1}}}
{\vspace*{\stretch{1}}\par}
vplace
这似乎仅当以某个部分开始时才会发生。
看起来该vplace
环境不适合跨多个页面。是否有适合该环境或替代方案,或者是否有方法使vplace
宏的分页效果更合适?
答案1
这是完全正常的。如果我设置\tracingpages=1
了案例\lipsum[1-2]
,我会进入日志
%% goal height=541.40024, max depth=5.5
% t=0.0 g=541.40024 b=10000 p=0 c=100000#
% t=11.0 g=541.40024 b=10000 p=1000 c=100000#
% t=24.6 g=541.40024 b=10000 p=0 c=100000#
% t=38.20001 g=541.40024 b=10000 p=0 c=100000#
% t=51.80002 g=541.40024 b=10000 p=100 c=100000#
% t=65.40002 g=541.40024 b=10000 p=0 c=100000#
% t=79.00003 g=541.40024 b=10000 p=100 c=100000#
% t=92.60004 g=541.40024 b=10000 p=0 c=100000#
% t=106.20004 g=541.40024 b=10000 p=0 c=100000#
% t=119.80005 g=541.40024 b=10000 p=0 c=100000#
% t=133.40005 g=541.40024 b=10000 p=0 c=100000#
% t=147.00006 g=541.40024 b=10000 p=1000 c=100000#
% t=160.60007 g=541.40024 b=10000 p=0 c=100000#
% t=174.20007 plus 1.0 g=541.40024 b=10000 p=1000 c=100000#
% t=187.80008 plus 1.0 g=541.40024 b=10000 p=0 c=100000#
% t=201.40009 plus 1.0 g=541.40024 b=10000 p=0 c=100000#
% t=215.00009 plus 1.0 g=541.40024 b=10000 p=100 c=100000#
% t=228.6001 plus 1.0 g=541.40024 b=10000 p=0 c=100000#
% t=242.2001 plus 1.0 g=541.40024 b=10000 p=0 c=100000#
% t=255.80011 plus 1.0 g=541.40024 b=10000 p=1000 c=100000#
% t=269.40012 plus 1.0 plus 1.0fill g=541.40024 b=0 p=-300 c=-300#
% t=333.49432 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=347.09433 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=360.69434 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=100 c=100
% t=374.29434 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=387.89435 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=100 c=100
% t=401.49435 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=415.09436 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=428.69437 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=442.29437 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=455.89438 plus 7.65746 plus 1.0fill minus 0.94289 g=541.40024 b=0 p=1000 c=1000
% t=483.09439 plus 8.65746 plus 2.0fill minus 0.94289 g=541.40024 b=0 p=1000 c=1000
% t=496.6944 plus 8.65746 plus 2.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=510.2944 plus 8.65746 plus 2.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=523.89441 plus 8.65746 plus 2.0fill minus 0.94289 g=541.40024 b=0 p=100 c=100
% t=537.49442 plus 8.65746 plus 2.0fill minus 0.94289 g=541.40024 b=0 p=0 c=0
% t=551.09442 plus 8.65746 plus 2.0fill minus 0.94289 g=541.40024 b=* p=100 c=*
输出中的每一行记录了排版行后累积材料的高度、目标高度、如果必须在此处进行分页的不良程度、行后分页的惩罚以及分页的“成本”。 “迄今为止最低的成本”标记为 。#
分页成本的公式可以在 TeXbook 第 111 页找到。
我们看到,当\vspace*{\stretch{1}
出现时,会显示 1fill 的可用延伸以及惩罚-300
(这是由于章节标题而导致的,并且\penalty\@secpenalty
在它之前发布)。根据 TeX 书中的公式,这会产生 的成本-300
。后面的成本更大,因此在 之后进行中断\vspace{\stretch{\fill}
。
在这种\lipsum[1]
情况下,副本适合一页,因此最佳成本就是根据完成工作例程的结果而-10000
找到的成本。\end{document}
如果您在最后使用,您也会得到两页\lipsum[1-2]
,因为副本不再适合一页。
可能的解决方案
局部改为\@secpenalty
0。
\documentclass[oneside,11pt]{memoir}
\usepackage{xpatch}
\usepackage{lipsum}
\makeatletter
\xapptocmd{\vplace}{\@secpenalty\z@}{}{}
\makeatother
\begin{document}
\lipsum[1-2] % A
\begin{vplace}
\subsection{Title}
\lipsum[1] % B
\end{vplace}
\lipsum[1] % C
\end{document}
然而,你仍然可以使用可拉伸胶水再次发挥作用。