我们处理任意的用户输入。有时,用户会提交任意长的段落,突破我们的 LaTeX 服务器的限制:数百页的文本,其中有空格,但没有换行符。
这会占用大量资源并最终导致我们工作超时。
我在《将段落分成几行》(Knuth & Plass 1981)中读到:
...如果我们按照 Cooper 33的建议做一个小小的改变,就可以处理任意长的段落:当给定段落中的单词数超过某个最大数 n max时,将该方法应用于前 n max个单词;然后输出除最后一行之外的所有内容并再次恢复该方法,从未输出的行继续复制开始。
33 P. I. Cooper,《程序参数对复杂对齐程序中连字频率的影响》,《计算机排版进展》[1966 年国际计算机排版会议论文集],伦敦印刷学院,1967 年,176-178、211-212。
所以他们过去就考虑过这种情况。
我想知道 LaTeX 是否公开了对 n max 的任何控制(甚至根本不实现它)?除此之外,有没有一种处理这种情况的好方法,即使我们得到的换行效果不是最理想的,也能运行得更快?
答案1
在撰写段落时,没有规定计算迄今为止的单词数。
但是你可以在 TeXbook 的索引中查找 James Joyce。它会将你带到第 100 页,在那里你可以找到练习 14.15:
\ddangerexercise Since \TeX\ reads an entire paragraph before it makes
any decisions about line breaks, the computer's memory capacity might
^^{capacity exceeded} be exceeded if you are typesetting the works of some
^^{Joyce, James} ^{philosopher} or modernistic novelist who writes
200-line paragraphs. Suggest a way to cope with such authors.
\answer Assuming that the author is deceased and/or set in his or her
ways, the remedy is to insert `|{\parfillskip=0pt\par\parskip=0pt\noindent}|'
in random places, after each 50 lines or so of text. \ (Every space
between words is usually a feasible breakpoint, when you get sufficiently
far from the beginning of a paragraph.)
什么药方
{\parfillskip=0pt\par\parskip=0pt\noindent}
做什么?该小组非常重要的!
- 已开团;
- 该组内的
\parfillskip
设置为零; \par
发出后便会生成一个与右边距齐平的段落;\parskip
设置为零,以免产生不需要的柔性胶;- 新段落以 开始
\noindent
,因此它从左对齐开始; \parfillskip
该组已关闭,因此和的值\parskip
已恢复。
正如练习答案中所解释的那样,这个想法是,当我们距离长段落的开头足够远时,单词之间的每个空格都是换行的好点,因此我们可以掩盖我们的踪迹,而不必担心棘手代码的确切位置。
当然应该为此定义一个宏:
\def\breakhere{%
\ifhmode
{\parfillskip=0pt\par\parskip=0pt\noindent}%
\fi
}
引入\ifhmode
,因此放置不当\breakhere
不会造成伤害。建议使用
...
some words in the long paragraph
\breakhere
which continues for several other pages
...