Wie kann ich zwei oder mehr Absätze so einstellen, dass sie den gleichen vertikalen Platz verwenden?

Wie kann ich zwei oder mehr Absätze so einstellen, dass sie den gleichen vertikalen Platz verwenden?

Wie kann ich bei mehreren Absätzen in ConTeXt oder einfachem TeX sicherstellen, dass alle Absätze die gleiche Menge an vertikalem Raum verwenden, indem ich am Ende Leerraum einfüge, wie beim längsten Absatz im Satz? Beispiel:

    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.

Den obigen Absätzen wird anschließend Leerraum hinzugefügt, sodass sie alle den gleichen vertikalen Raum einnehmen wie der letzte Absatz, da dieser am längsten ist, z. B.:

    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.

Antwort1

Eine weitere ConTeXt-basierte Lösung, die jedoch in einem einzigen Durchgang funktioniert. Sie müssen den Inhalt in Puffern speichern, dann alle Puffer messen und die Höhe auf die maximale Höhe einstellen (nicht unbedingt die Höhe des letzten Absatzes).

\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

Sobald Sie den grundlegenden Mechanismus verstanden haben, können Sie ihn problemlos in ein Makro integrieren.

\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

Das gibt

Bildbeschreibung hier eingeben

Ich verwende \ruledvbox, damit Sie das Feld sehen können. Ändern Sie das in, \vboxwenn Sie das Feld nicht sehen möchten.

Antwort2

Sie können verwenden

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

Um eine Box mit der richtigen vertikalen Größe zu erzwingen, die am Ende mit Leerzeichen aufgefüllt ist.

statt 5cm können Sie zuerst eine der Boxen messen, so

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

dann können Sie für jeden Absatz Folgendes tun

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

Antwort3

Hier stelle ich eine ConTeXt-ähnlichere Lösung vor, die auf der gleichen Idee wie Davids Lösung basiert. Sie beinhaltet das jetztZwei-Durchlauf-DatenMechanismus.

\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

Ergebnis:

Ergebnis

Die normalparagraphs sind einfache vboxes mit der Höhe des letzten Absatzes. Der heightWert wird aus dem Two-Pass-Datensatz übernommen. Das lastparagraphist auch ein vbox, dessen Höhe gemessen und in der .tucDatei gespeichert wird. Die \framedNachher \starttextdienen nur zur Veranschaulichung. Füllen Sie diese mit Ihrem Inhalt.

verwandte Informationen