如何将段落宽度设置为最长行的宽度

如何将段落宽度设置为最长行的宽度

我有一个段落,其中有几行以 结尾\break。我想将整个段落的宽度设置为最长行的宽度。如何实现?

我有一个像这样的宏,我早早就把它改成\\\break,有人建议我使用\haling和,\cr但我不知道如何整合它。

\everypar={\setbox0=\lastbox\endgraf\vbox\bgroup\everypar={\vrule height12pt width0pt}}
\def\par{\ifhmode\endgraf\egroup\fi}
\def\\{\unskip\break}
\rightskip=0pt plus 1fil\parindent=0pt #2\par
\everypar={}

这不起作用:

\everypar={\setbox0=\lastbox\endgraf\vbox\bgroup\everypar={\vrule height12pt width0pt}}
\def\par{\ifhmode\endgraf\egroup\fi}
\def\\{\cr}
\rightskip=0pt plus 1fil\parindent=0pt \haling{#2}\par
\everypar={}

答案1

TeX 有\halign实现这个的原语(这个问题被标记为“plain-tex”,不是吗?)。\break你必须使用而不是\cr;一个小缺点是,如果你想要它,你必须明确地请求段落缩进(用\indent):

\halign{#\cr
  \indent Lorem ipsum dolor sit amet, consectetur adipiscing elit.\cr
  Curabitur massa turpis, semper quis fringilla ut, viverra nec risus.\cr
  Pellentesque habitant morbi tristique\cr
  senectus et netus et malesuada fames ac turpis egestas.\cr
}

More text that is set at the normal text width, with line breaks chosen by 
\TeX's line breaking algorithm.  For example, a line break should have occurred 
at the beginning of this sentence.

\bye

输出:

代码输出

当然,定义“语法糖”以使其更方便用户使用是很容易的。让我重复一遍,这\halign是一个原始TeX 的命令,因此很多比任何基于宏的解决方案都更有效。此外,值得注意的是,\halign将“Lorem ipsum…”段落的各行添加到主垂直列表中(就像普通段落一样),这意味着可以按通常的方式进行分页;行间粘连也按正常方式进行管理。

答案2

您可以将所有内容拆分为\break,按自然宽度排版每行以确定最长行,然后按最大宽度排版。

\newdimen\maxwidth
\newbox\linebox

\def\adjustlines#1{%
  \foreachline\measure#1\break\break\endforeachline
  \ifdim\maxwidth>\hsize
    \vbox{#1}
  \else
    \vbox{\foreachline\adjust#1\break\break\endforeachline}
  \fi
}

\def\measure#1{%
  \setbox\linebox=\hbox{#1}
  \ifdim\wd\linebox>\maxwidth
    \maxwidth=\wd\linebox
  \fi}

\def\adjust#1{\hbox to \maxwidth{#1}}

\def\foreachline#1#2\break#3\endforeachline{%
  #1{#2}%
  \ifx#3\break\else
  \foreachline#1#3\endforeachline
  \fi
}

\def\endforeachline{}

\adjustlines{%
  Lorem ipsum dolor sit amet, consectetur adipiscing elit.\break
  Curabitur massa turpis, semper quis fringilla ut, viverra nec risus.\break
  Pellentesque habitant morbi tristique\break
  senectus et netus et malesuada fames ac turpis egestas.\break
}

\bye

在此处输入图片描述

如果最长的线长于\hsize

在此处输入图片描述

相关内容