可能的解决方案

可能的解决方案

在使用 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],因为副本不再适合一页。

可能的解决方案

局部改为\@secpenalty0。

\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}

然而,你仍然可以使用可拉伸胶水再次发挥作用。

相关内容