如何避免 \pagetotal 重置为 0pt?

如何避免 \pagetotal 重置为 0pt?

下面的示例演示了在每个段落的开头如何\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}

后期 \pagetotal 重置为 0pt

答案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 在页面拆分过程中所处的位置,但它可能会显示超出断点的位置,而最终会根据与之相关的总成本进行选择。因此,它对于您要实现的目标毫无用处。

相关内容