下面的示例演示了在每个段落的开头如何\pagetotal
不总是在页面开头重置为 0pt。这似乎会干扰我尝试自动清除floatingfigure
. 有什么办法可以解决这个问题?
\documentclass{article}
\usepackage{mwe}
\makeatletter
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth
\else\Gin@nat@width\fi}
\makeatother
\let\Oldincludegraphics\includegraphics
\renewcommand{\includegraphics}[1]{\Oldincludegraphics[width=\maxwidth]{#1}}
\setlength{\parindent}{0pt}
% begin preamble.tex
\usepackage{calc}
\newlength\vimgflt
\newlength\vposflt
\newlength\vtypesetflt
\newlength\vspaceflt
\usepackage{floatflt}
\renewenvironment{description}{%
\renewcommand{\includegraphics}[1]{\vspace{-1ex}\Oldincludegraphics[width=4cm]{##1}}
\renewcommand{\item}[1][]{
\settototalheight\vimgflt{##1}%
\global\vimgflt=\vimgflt%
##1%
\end{floatingfigure}%
\the\pagetotal%
\setlength\vposflt\pagetotal%
\global\vposflt=\vposflt%
}%
\clearflt
\hspace{0pt}%
\begin{floatingfigure}[l]{4cm}}%
{}
\newcommand{\clearflt}{
\par
\setlength\vtypesetflt{\dimexpr\pagetotal-\vposflt}
\ifdim \vtypesetflt<\vimgflt \setlength\vspaceflt{\dimexpr\vimgflt-\vtypesetflt+\baselineskip} \else \setlength\vspaceflt{0pt} \fi
\vspace*{\vspaceflt}
}
\let\Oldsection\section
\renewcommand{\section}{\clearflt\Oldsection}
% end preamble.tex
\begin{document}
\blindtext[3]
\section{Section title}
\begin{description}
\itemsep1pt\parskip0pt\parsep0pt
\item[\includegraphics{example-image-a}]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin.
\end{description}
\section{Section title}
\begin{description}
\itemsep1pt\parskip0pt\parsep0pt
\item[\includegraphics{example-image-b}]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin.
\end{description}
\section{Section title}
\begin{description}
\itemsep1pt\parskip0pt\parsep0pt
\item[\includegraphics{example-image-c}]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis facilisis
sem. Nullam nec mi et neque pharetra sollicitudin.
\end{description}
\blindtext[2]
\end{document}
答案1
TeXbook 中有关此主题的相关部分如下
\ddanger 您可以通过分别引用 \ 值 ^|\pagegoal|' 来查看分页中使用的 $t$ 和 $g$ 值
^|\pagetotal|' and
。您甚至可以更改它们(但希望您知道自己在做什么)。例如,命令 |\pagegoal=500pt| 会覆盖先前保存的 / |\vsize| 值。除了表示累积自然高度的 |\pagetotal| 之外,\TeX\ 还维护 ^|\pagestretch|、^|\pagefilstretch|、^|\pagefillstretch|、^|\pagefilllstretch|、^|\pageshrink| 和 ^|\pagedepth| 的数量。当当前页面不包含任何框时,|\pagetotal| 及其相关值为零,而 |\pagegoal| 为 $16383.99998\pt$(\TeX 的最大值);此时更改它们的值不会产生任何效果。页面成本公式中的整数 $q$ 也可供检查和更改;它被称为 ^|\insertpenalties|。
每当 TeX 遇到当前样张中的可能断点时,它都会更新“pagetotal”和其他参数的值,然后继续,除非这个断点使当前页面太满。只有这样,TeX 才会决定页面上的哪个断点是真正中断页面的断点(它肯定不是触发该过程的断点,但也可能不是之前的断点)。所以当你查看时,你看到的\pagetotal
只是 TeX 进展到了哪里前做出分页决定。
在您的案例中,它实际上已经到了页面过满的地步(这就是您记录的内容),并且最终中断发生得更早。如果您使用,\tracingpages=1
您可以在日志文件中看到此行为,以下是启用跟踪后 MWE 的相关行:
% t=346.0 g=550.0 b=10000 p=0 c=100000#
% t=358.0 g=550.0 b=10000 p=150 c=100000#
% t=371.94444 g=550.0 b=10000 p=-300 c=100000#
% t=424.97215 plus 7.16663 minus 0.86108 g=550.0 b=10000 p=0 c=100000#
% t=436.97215 plus 8.16663 minus 0.86108 g=550.0 b=10000 p=150 c=100000#
% t=448.97215 plus 8.16663 minus 0.86108 g=550.0 b=10000 p=250 c=100000#
% t=524.2731 plus 8.16663 minus 0.86108 g=550.0 b=3118 p=-300 c=2818#
<example-image-b.pdf, id=2, 321.2pt x 240.9pt> <use example-image-b.pdf>
<use example-image-b.pdf>
% t=577.30081 plus 15.33325 minus 1.72217 g=550.0 b=* p=0 c=*
[1{c:/texlive/2013/texmf-var/fonts/map/pdftex/updmap/pdftex.map}
正如你所见,t=
第一页的最后一个元素恰好是图 B 旁边的元素,而这个元素使页面溢出,因此 TeX 会备份并使用以下行
% t=524.2731 plus 8.16663 minus 0.86108 g=550.0 b=3118 p=-300 c=2818#
作为第一页的最佳断点。
总之,\pagetotal
它可以帮助您了解 TeX 在页面拆分过程中所处的位置,但它可能会显示超出断点的位置,而最终会根据与之相关的总成本进行选择。因此,它对于您要实现的目标毫无用处。