¿Cómo configurar dos o más párrafos para que utilicen la misma cantidad de espacio vertical?

¿Cómo configurar dos o más párrafos para que utilicen la misma cantidad de espacio vertical?

Dados varios párrafos en ConTeXt o TeX simple, ¿cómo puedo garantizar que todos los párrafos utilicen la misma cantidad de espacio vertical, agregando espacios en blanco al final, como el párrafo más largo del conjunto? P.ej:

    This is a paragraph
with only two lines.
    This paragraph is a
little bit longer and it
has three lines.
    This is the longest
paragraph, as it has
a second, third, and
fourth line.

A los párrafos anteriores se les agregaría espacio en blanco después, de modo que todos ocupen la misma cantidad de espacio vertical que el último párrafo, porque es el más largo, por ejemplo:

    This is a paragraph
with only two lines.


    This paragraph is a
little bit longer and it
has three lines.

    This is the longest
paragraph, as it has
a second, third, and
fourth line.

Respuesta1

Otra solución basada en ConTeXt, pero ésta funciona en una sola pasada. Requiere que almacene el contenido en buffers, luego mida todos los buffers y establezca la altura al máximo (no necesariamente la altura del último párrafo).

\newdimen\maxbufferheight

\def\placebuffertomaximumheight[#1]%
    {\maxbufferheight\zeropoint
     \processcommalist[#1]\domeasurebuffermaxheight
     \processcommalist[#1]\doplacebuffertomaxheight}


\def\domeasurebuffermaxheight#1%
    {\setbox\scratchbox\vbox{\getbuffer[#1]}%
     \scratchdimen\ht\scratchbox
     \ifdim\scratchdimen>\maxbufferheight
        \maxbufferheight=\scratchdimen
     \fi}

\def\doplacebuffertomaxheight#1%
     {\ruledvbox to \maxbufferheight
        {\getbuffer[#1]}%
        \blank[none]} %change \blank[..] to \par to get regular inter-para space


\starttext
\startbuffer[one]
Single line
\stopbuffer

\startbuffer[two]
\input tufte
\stopbuffer

\startbuffer[three]
\input ward
\stopbuffer

\placebuffertomaximumheight[one,two,three]

\stoptext

Una vez que tenga el mecanismo básico, es sencillo envolverlo en una macro.

\newcount\nofmeasuredparagraphs

\def\startparagraph
    {\increment\nofmeasuredparagraphs
     \grabbufferdata[measuredparagraph-\nofmeasuredparagraphs][startparagraph][stopparagraph]}

\def\stopparagraph{}

\def\startmeasuredparagraph
    {\nofmeasuredparagraphs\zeropoint}

\def\stopmeasuredparagraph
    {\maxbufferheight\zeropoint
    \dorecurse\nofmeasuredparagraphs
        {\domeasurebuffermaxheight{measuredparagraph-\recurselevel}}%
    \dorecurse\nofmeasuredparagraphs
        {\doplacebuffertomaxheight{measuredparagraph-\recurselevel}}}

\starttext
\startmeasuredparagraph
\startparagraph
Single line
\stopparagraph

\startparagraph
\input tufte
\stopparagraph

\startparagraph
\input ward
\stopparagraph
\stopmeasuredparagraph


\stoptext

Esto da

ingrese la descripción de la imagen aquí

Lo estoy usando \ruledvboxpara que puedas ver el cuadro. Cambie eso a \vboxsi no quiere ver el cuadro.

Respuesta2

puedes usar

\vbox to 5cm{stuff.......\vfill}

Para forzar una caja del tamaño vertical correcto, rellena con espacio al final.

En lugar de 5 cm, puedes medir primero una de las cajas para que

 \setbox0\vbox{longest stuff....}

luego para cada párrafo puedes hacer

\vbox to \ht0{stuff.......\vfill}

Respuesta3

Aquí proporciono una solución más contextual basada en la misma idea que la solución de David. Incorpora el ahoradatos de dos pasadasmecanismo.

\defineframedtext [normalparagraph]
  [
      frame=off,
     offset=overlay,
      width=\textwidth,
     height=\datasetvariable{lastparagraph}{last}{height},
  ]

\definedataset [lastparagraph]
\newbox\mylastbox

\definestartstop [lastparagraph]
  [
    before=\setups{last:before},
     after=\setups{last:after},
  ]

\startsetups last:before
  \setbox\mylastbox\vbox\bgroup
\stopsetups

\startsetups last:after
  \egroup
  \setdataset [lastparagraph] [last] [height=\the\ht\mylastbox]
  \box\mylastbox
\stopsetups

\starttext

  \startnormalparagraph
    \framed[align=normal]{\input knuth\par}
  \stopnormalparagraph

  \startnormalparagraph
    \framed[align=normal]{\input ward\par}
  \stopnormalparagraph

  \startlastparagraph
    \input knuth
  \stoplastparagraph

\stoptext

Resultado:

resultado

Las normalparagraphs son vboxes simples con la altura del último párrafo. El heightvalor se recoge del conjunto de datos de dos pasadas. lastparagraphTambién es un archivo cuya vboxaltura se mide y se guarda en el .tucarchivo. Los \framedsiguientes \starttextsolo se agregan a modo de ilustración. Llénalo con tu contenido.

información relacionada