我有一个段落,其中有几行以 结尾\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