设置 \topskip 后,带表格的横向页面会添加额外的空白页

设置 \topskip 后,带表格的横向页面会添加额外的空白页

考虑以下 MWE。我有一章带有横向模式的表格。加上第二章,这会产生三页。但是,在添加\topskip 0ptlandscape环境中时,会在它后面添加一个空白页(实际上是两个,因为新章节从奇数页开始)。

\documentclass{book}
\usepackage{lscape}
\usepackage{array}
\begin{document}
\chapter{Table Test}
\begin{landscape}
  \topskip0pt % <<<< Without this line, no blank page.
  \begin{table}[htb!]
  \centering
  \begin{tabular}{>{\raggedright}p{3cm} >{\raggedright}p{3cm}}
  \hline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  1 & 2\tabularnewline
  \hline
  \end{tabular}
  \end{table}
\end{landscape}
\chapter{Potrait again}
Test2
\end{document}

答案1

该问题与软件包无关lscape:事实上,您可以使用以下简单程序重现它

\documentclass[a4paper,twoside]{article}
\begin{document}
A\par
\clearpage
% \setlength{\topskip}{0pt} % uncomment this line to see it happen
B\par
\clearpage
\cleardoublepage
C\par
\end{document}

(取消注释注释行即可看到其发生)。

我做了一些调查,罪魁祸首似乎是\@doclearpageLaTeX 输出例程中的宏,更准确地说是以下代码行

\setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa

latex.ltx最新版本中的第 6696 行),其目的是将“任何剩余的非盒子(写入、特殊等)”发送回主垂直列表,如注释中所述ltoutput.dtx。不幸的是,如果\topskip胶合为零,则由命令\vbox{}插入的\clearpage也分裂了,因为它在这种情况下,适合零点;因此,该框返回到主垂直列表,在那里它导致随后的\cleardoublepage命令插入两个额外的页面。

说实话,我没有检查所有的细节,但下面的程序可以用来或多或少地确认上述分析:

\documentclass[a4paper,twoside]{article}

\makeatletter

\def\clearpage{%
  \ifvmode
    \ifnum \@dbltopnum =\m@ne
      \ifdim \pagetotal <\topskip
        \hbox{\special{Comment: A}}%
      \fi
    \fi
  \fi
  \newpage
  \write\m@ne{}%
  \vbox{\special{Comment: B}}%
  \penalty -\@Mi
}
\def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
    \hbox{\special{Comment: C}}\newpage
    \if@twocolumn\hbox{\special{Comment: D}}\newpage\fi\fi\fi}

\makeatother

\showboxbreadth = 1000
\showboxdepth = 10
% \tracingoutput = 1

\begin{document}
A\par
\clearpage
% \setlength{\topskip}{0pt}
B\par
\clearpage
\showlists
% \vbox{} % <<< HERE <<<
\cleardoublepage
C\par
\end{document}

它重新定义了\clearpage\cleardoublepage命令,以便它们生成可以在跟踪列表中明确识别的框(如果您收到一些警告,提示“忽略非 PDF 特殊内容!”,请不要担心)。首先按原样运行它,然后查看生成的跟踪\showlists;然后取消注释以下行:

% \setlength{\topskip}{0pt}

\vbox{}然后再次查看记录:您将看到结果与在源文件中 指示的位置处有一个命令一样% <<< HERE <<<

取消注释\tracingoutput = 1以获取进一步的诊断信息。

相关内容