7

I need to compute the distance from the current baseline to the bottom of the next/current paragraph. (Eventually this is going to wind up in \everypar.) Is there an easier way to do this precisely?

See also How to preserve the same parskip in minipage

\documentclass{article}
\usepackage{lipsum}

\newlength\parsize

\newcommand{\testheight}[1]%
{\bgroup
  \skip0=\parskip
  \skip1=\parindent
  \skip2=\leftskip
  \skip3=\rightskip
  \skip4=\parfillskip
  \skip5=\baselineskip
  \skip6=\lineskip
  \ifdim\hfuzz<.4pt\relax\let\default=\fussy
  \else\let\default=\sloppy
  \fi
  \sbox0{\parbox[t]{\columnwidth}{%
    \parskip=\skip0
    \parindent=\skip1
    \leftskip=\skip2
    \rightskip=\skip3
    \parfillskip=\skip4
    \baselineskip=\skip5
    \lineskip=\skip6
    \default #1}}%
  \global\parsize=\dp0
\egroup}

\begin{document}

\rightskip=3in
\sloppy
\testheight{\lipsum[1]}
\noindent\llap{\smash{\rule[-\parsize]{1pt}{\parsize}} }
\hskip\parindent\lipsum[1]

\end{document}

The goal is not to draw the line. That was just a test to make sure it was working. My goal is to revise wrapfig using \pdfsavepos and adding some new options.


Postscript:

When I first switched from plain TeX to LaTeX, none of my old code using \vbox would work right. Early experiments indicated that there was no difference between \vbox, \hbox and \mbox, so I learned to make do with \parbox and tabular instead. It was only recently that I discovered that one could still use \vbox to stack \hboxes by inserting \\ between them and using \baselineskip=0pt. It should come as no surprise that \vbox now follows standard paragraph building rules.

John Kormylo
  • 79,712
  • 3
  • 50
  • 120

1 Answers1

2

LaTeX doesn't change \vbox in any way. The main difference when doing \vbox or \parbox is that in the latter case some initializations are made, which you are taking care of with those assignments to the scratch registers.

Another problem would be that of footnotes and other “migrating” material, but I assume you don't face it; otherwise it would require some redefinitions.

With

\newdimen\lastdepth
\setbox0=\vtop{
  \ifdim\hfuzz<.4pt
    \let\default=\fussy
  \else
    \let\default=\sloppy
  \fi
  \default
  <text>\par
  \global\lastdepth=\prevdepth
}

you can query for \ht0, that gives the height of the first line, for \dp0, that gives the total remaining size, and for \lastdepth that stores the depth of the last line.

Since no initialization is made, like in \parbox, the typesetting of <text> should not change with respect to having been set in the outer vertical list.

If you don't need the height of the first line, but just the total height, \vbox is perhaps better: with

\setbox0=\vtop{
  \ifdim\hfuzz<.4pt
    \let\default=\fussy
  \else
    \let\default=\sloppy
  \fi
  \default
  <text>
}

you have in \ht0 the total height of the text and in \dp0 the depth of the last line.

egreg
  • 1,121,712