处理任意长的段落

处理任意长的段落

我们处理任意的用户输入。有时,用户会提交任意长的段落,突破我们的 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}

做什么?该小组非常重要的!

  1. 已开团;
  2. 该组内的\parfillskip设置为零;
  3. \par发出后便会生成一个与右边距齐平的段落;
  4. \parskip设置为零,以免产生不需要的柔性胶;
  5. 新段落以 开始\noindent,因此它从左对齐开始;
  6. \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
...

相关内容