
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
Lo estoy usando \ruledvbox
para que puedas ver el cuadro. Cambie eso a \vbox
si 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:
Las normalparagraph
s son vbox
es simples con la altura del último párrafo. El height
valor se recoge del conjunto de datos de dos pasadas. lastparagraph
También es un archivo cuya vbox
altura se mide y se guarda en el .tuc
archivo. Los \framed
siguientes \starttext
solo se agregan a modo de ilustración. Llénalo con tu contenido.