纯 TeX 和段落注释

纯 TeX 和段落注释

TeXbook 第 398sq 页提出了一种获取段落注释的系统。

也就是说,

  1. 脚注。
  2. 脚注。
  3. 脚注

获得 :

  1. 脚注 2。脚注 3。脚注。

在同一段落中。

这个系统被 footmisc 和 eledmac 等软件包使用。作为后者的维护者,我遇到了一个问题。

该系统(由伟大的 Knuth 本人提供!)需要水平盒子才能工作。因此,对于较长的注释,虽然“普通”脚注会被 TeX 分割,但段落脚注无法分割,因为它使用 \hbox。

正如我可以在这个 MWE 中以 plainTeX 形式重现的那样。

%% This file try to reconstruct a MWE example for paragraphed not from the TeXBook  
% p. 398/399
% Specific output routine, which call \makefootnoteparagraph
\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
        \unvbox255
        \ifvoid\footins\else % footnote info is present
          \vskip\skip\footins \footnoterule \makefootnoteparagraph\fi
        }

% Here, some code for the ouput
\def\makefootnoteparagraph{\unvbox\footins \makehboxofhboxes
  \setbox0=\hbox{\unhbox0 \removehboxes}
  \baselineskip=\footnotebaselineskip\noindent\unhbox0\par}
\def\makehboxofhboxes{\setbox0=\hbox{}
  \loop\setbox2=\lastbox \ifhbox2 \setbox0=\hbox{\box2\unhbox0}\repeat}
\def\removehboxes{\setbox0=\lastbox
  \ifhbox0{\removehboxes}\unhbox0 \fi}

% Here, the code for \getfactor
{\catcode`p=12 \catcode`t=12
          \csname expandafter\endcsname\gdef
          \csname getfactor\endcsname#1pt{#1}
}
% Here, some setting for paragraphed footnote
\newskip\footglue \footglue=1.5em plus.3em minus.3em
              \newdimen\footnotebaselineskip \footnotebaselineskip=10pt
              \dimen0=\footnotebaselineskip \multiply\dimen0 by 1024
              \divide \dimen0 by \hsize \multiply\dimen0 by 64
\xdef\fudgefactor{\expandafter\getfactor\the\dimen0 }


% Here the \footnote redefined (for this MWE, I don't need any marks)
\def\footnote#1{%
  \insert\footins{\floatingpenalty=20000
                \setbox0=\hbox{%
  #1\penalty-10\hskip\footglue} \dp0=0pt \ht0=\fudgefactor\wd0 \box0}
}
\footnote{s}\footnote{s}
\footnote{Long note Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lobortis, nibh quis luctus porttitor, metus metus accumsan erat, ac commodo ante lorem tempus velit. Nulla ut ex mi. Curabitur magna tortor, egestas quis convallis nec, venenatis non nibh. Aenean et lacinia elit. Aenean ornare fermentum tincidunt. Etiam sed metus ipsum. Nulla accumsan non justo at tincidunt. Integer sed est est. Nullam non velit diam. Proin ut ante risus. Fusce ac enim libero. Proin ac risus nec nisi semper viverra eu ut ligula. Nulla orci ligula, elementum vel auctor eu, suscipit ac mi. Duis in hendrerit nunc, vitae efficitur lectus. Nam tristique eros a lacus posuere, quis placerat sapien venenatis.
Nulla facilisi. Vivamus dapibus nunc neque, eget maximus neque accumsan nec. Fusce suscipit, sapien id pellentesque vestibulum, orci tortor efficitur felis, eget tempus ex augue euismod tortor. Praesent lobortis diam non orci accumsan, sit amet condimentum eros semper. Mauris vel quam non nulla egestas aliquet ornare eu ligula. Sed tristique ultrices sem imperdiet placerat. Maecenas rhoncus, magna sit amet efficitur tristique, elit odio semper magna, ut aliquet magna odio nec lectus. Nullam tristique dolor id purus lobortis placerat.
Etiam sit amet rhoncus nunc. Pellentesque fermentum mi elit, et posuere augue ultricies nec. Curabitur vulputate, purus id molestie lacinia, nisl massa feugiat nunc, non consectetur mi nisi non mauris. Morbi blandit, odio a efficitur fringilla, nulla libero fermentum lectus, vel finibus odio felis eu sem. Nullam sit amet condimentum ligula. Nulla rutrum lacus eget ipsum laoreet elementum. Curabitur in molestie felis. Nunc ut malesuada orci.
Suspendisse tempor ligula in elementum dignissim. Sed vehicula feugiat hendrerit. Curabitur ultricies massa eget dapibus laoreet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed blandit eleifend nulla, vel feugiat lorem elementum at. Sed a magna sollicitudin, hendrerit lacus vitae, malesuada nibh. Sed commodo, justo vitae varius auctor, nisl purus lacinia enim, ut rutrum libero nisl ut odio. Phasellus vel massa diam. Nulla facilisi. Ut sagittis blandit volutpat.
Morbi lobortis sollicitudin felis, at accumsan eros blandit eget. Donec venenatis, dolor eu tristique sagittis, diam arcu dignissim ligula, eget sagittis nulla arcu scelerisque nisl. Etiam ac lacus leo. Donec consequat diam quis risus venenatis sodales. Duis tempus nibh quis mi fermentum, eget dapibus diam elementum. Nunc eu ultrices odio. Vivamus in ipsum sapien. Aliquam erat volutpat. Nunc euismod eros volutpat massa ultrices porttitor. Ut scelerisque sit amet mi a tincidunt. Sed nec porta urna. Proin eu arcu eget felis euismod ultrices. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lobortis, nibh quis luctus porttitor, metus metus accumsan erat, ac commodo ante lorem tempus velit. Nulla ut ex mi. Curabitur magna tortor, egestas quis convallis nec, venenatis non nibh. Aenean et lacinia elit. Aenean ornare fermentum tincidunt. Etiam sed metus ipsum. Nulla accumsan non justo at tincidunt. Integer sed est est. Nullam non velit diam. Proin ut ante risus. Fusce ac enim libero. Proin ac risus nec nisi semper viverra eu ut ligula. Nulla orci ligula, elementum vel auctor eu, suscipit ac mi. Duis in hendrerit nunc, vitae efficitur lectus. Nam tristique eros a lacus posuere, quis placerat sapien venenatis.
Nulla facilisi. Vivamus dapibus nunc neque, eget maximus neque accumsan nec. Fusce suscipit, sapien id pellentesque vestibulum, orci tortor efficitur felis, eget tempus ex augue euismod tortor. Praesent lobortis diam non orci accumsan, sit amet condimentum eros semper. Mauris vel quam non nulla egestas aliquet ornare eu ligula. Sed tristique ultrices sem imperdiet placerat. Maecenas rhoncus, magna sit amet efficitur tristique, elit odio semper magna, ut aliquet magna odio nec lectus. Nullam tristique dolor id purus lobortis placerat.
Etiam sit amet rhoncus nunc. Pellentesque fermentum mi elit, et posuere augue ultricies nec. Curabitur vulputate, purus id molestie lacinia, nisl massa feugiat nunc, non consectetur mi nisi non mauris. Morbi blandit, odio a efficitur fringilla, nulla libero fermentum lectus, vel finibus odio felis eu sem. Nullam sit amet condimentum ligula. Nulla rutrum lacus eget ipsum laoreet elementum. Curabitur in molestie felis. Nunc ut malesuada orci.
Suspendisse tempor ligula in elementum dignissim. Sed vehicula feugiat hendrerit. Curabitur ultricies massa eget dapibus laoreet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed blandit eleifend nulla, vel feugiat lorem elementum at. Sed a magna sollicitudin, hendrerit lacus vitae, malesuada nibh. Sed commodo, justo vitae varius auctor, nisl purus lacinia enim, ut rutrum libero nisl ut odio. Phasellus vel massa diam. Nulla facilisi. Ut sagittis blandit volutpat.
Morbi lobortis sollicitudin felis, at accumsan eros blandit eget. Donec venenatis, dolor eu tristique sagittis, diam arcu dignissim ligula, eget sagittis nulla arcu scelerisque nisl. Etiam ac lacus leo. Donec consequat diam quis risus venenatis sodales. Duis tempus nibh quis mi fermentum, eget dapibus diam elementum. Nunc eu ultrices odio. Vivamus in ipsum sapien. Aliquam erat volutpat. Nunc euismod eros volutpat massa ultrices porttitor. Ut scelerisque sit amet mi a tincidunt. Sed nec porta urna. Proin eu arcu eget felis euismod ultrices.
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lobortis, nibh quis luctus porttitor, metus metus accumsan erat, ac commodo ante lorem tempus velit. Nulla ut ex mi. Curabitur magna tortor, egestas quis convallis nec, venenatis non nibh. Aenean et lacinia elit. Aenean ornare fermentum tincidunt. Etiam sed metus ipsum. Nulla accumsan non justo at tincidunt. Integer sed est est. Nullam non velit diam. Proin ut ante risus. Fusce ac enim libero. Proin ac risus nec nisi semper viverra eu ut ligula. Nulla orci ligula, elementum vel auctor eu, suscipit ac mi. Duis in hendrerit nunc, vitae efficitur lectus. Nam tristique eros a lacus posuere, quis placerat sapien venenatis.
Nulla facilisi. Vivamus dapibus nunc neque, eget maximus neque accumsan nec. Fusce suscipit, sapien id pellentesque vestibulum, orci tortor efficitur felis, eget tempus ex augue euismod tortor. Praesent lobortis diam non orci accumsan, sit amet condimentum eros semper. Mauris vel quam non nulla egestas aliquet ornare eu ligula. Sed tristique ultrices sem imperdiet placerat. Maecenas rhoncus, magna sit amet efficitur tristique, elit odio semper magna, ut aliquet magna odio nec lectus. Nullam tristique dolor id purus lobortis placerat.
Etiam sit amet rhoncus nunc. Pellentesque fermentum mi elit, et posuere augue ultricies nec. Curabitur vulputate, purus id molestie lacinia, nisl massa feugiat nunc, non consectetur mi nisi non mauris. Morbi blandit, odio a efficitur fringilla, nulla libero fermentum lectus, vel finibus odio felis eu sem. Nullam sit amet condimentum ligula. Nulla rutrum lacus eget ipsum laoreet elementum. Curabitur in molestie felis. Nunc ut malesuada orci.
Suspendisse tempor ligula in elementum dignissim. Sed vehicula feugiat hendrerit. Curabitur ultricies massa eget dapibus laoreet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed blandit eleifend nulla, vel feugiat lorem elementum at. Sed a magna sollicitudin, hendrerit lacus vitae, malesuada nibh. Sed commodo, justo vitae varius auctor, nisl purus lacinia enim, ut rutrum libero nisl ut odio. Phasellus vel massa diam. Nulla facilisi. Ut sagittis blandit volutpat.
Morbi lobortis sollicitudin felis, at accumsan eros blandit eget. Donec venenatis, dolor eu tristique sagittis, diam arcu dignissim ligula, eget sagittis nulla arcu scelerisque nisl. Etiam ac lacus leo. Donec consequat diam quis risus venenatis sodales. Duis tempus nibh quis mi fermentum, eget dapibus diam elementum. Nunc eu ultrices odio. Vivamus in ipsum sapien. Aliquam erat volutpat. Nunc euismod eros volutpat massa ultrices porttitor. Ut scelerisque sit amet mi a tincidunt. Sed nec porta urna. Proin eu arcu eget felis euismod ultrices.
}\footnote{s}
s

\bye

因此,TeX 无法拆分长段落注释,因为它使用了 hbox。

有没有其他方法可以生成类似的段落注释,而无需使用水平盒子?限制如下:

  1. 不手动将长注释拆分为脚注(但某些 TeX 算法可以做到这一点)。
  2. 制作段落脚注。

答案1

好的,您写道您以不同的方式解决了这个问题,但是您保持问题开放;所以我认为您对第二种解决方案感兴趣。

首先要说明的是:您的 MWE 不是有效的 TeX 代码,因为您访问\wd0的 hbox 的宽度大于\maxdimen。TeX 应在编译时检查算术溢出。例如,请参阅 tex.web 的第 9 节,Knuth 有时会重复这一点;参见此处(第 234 页)

当然,Knuth 的解决方案只是为了简短的脚注,正如他在 TeXbook 第 395 页所写:

现在我们的下一个技巧是考虑将其应用于短脚注。

您可能已经知道这一点,因为在评论中链接的文本中脚注长度限制为\maxdimen

Knuth 在 TeXbook 第 398 页建议:

可以将\box\footins之前显示的内容重新格式化为一个段落,但是这样的操作会不必要地复杂化。

我选择了一条不同的解决方案。它只对单个行使用水平盒子,并将脚注放在垂直盒子中,因此脚注的长度应该没有限制。

我的想法是:将脚注的最后一行保存在水平盒子中,每次写新脚注时,都使用此水平盒子作为一种前缀。在输出脚注时检查是否需要附加最后一行。

我更改了默认的纯 TeX 宏,并调整和扩展了您的示例。我用它\insertpenalties来检测拆分脚注插入。

\dimen\footins=\vsize                                % changed
\newbox\fnlastline                                   % new
\newskip\footglue \footglue=1.5em plus.3em minus.3em % from DEK's solution

\catcode`@=11
\def\vfootnote#1{\insert\footins\bgroup
  \interlinepenalty\interfootnotelinepenalty
  \splittopskip\ht\strutbox
  \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
  \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
  \setbox0=\vbox\bgroup\noindent            % new
     \ifvoid\fnlastline                     % new
     \else\unhbox\fnlastline\hskip\footglue % new
     \fi                                    % new
     #1\thinspace                           % changed
     \futurelet\next\fo@t}
\def\@foot{\egroup                     % changed
  \unvbox0\global\setbox0=\lastbox     % new
  \global\setbox\fnlastline=\hbox      % new
     {\unhbox0\unskip\unskip\unpenalty}% new
  \egroup}                             % new
\def\plainoutput{\ifnum\outputpenalty>-\@MM                         % new
     \ifnum\insertpenalties>0                                       % new
     \else\ifvoid\fnlastline                                        % new
          \else\setbox\footins=\vbox{\unvbox\footins\box\fnlastline}% new
          \fi                                                       % new
     \fi                                                            % new
  \else\ifvoid\fnlastline                                           % new
       \else\setbox\footins=\vbox{\unvbox\footins\box\fnlastline}%    new
       \fi                                                          % new
  \fi                                                               % new
  \shipout\vbox{\makeheadline\pagebody\makefootline}%
  \advancepageno
  \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
\catcode`@=12

one\footnote\dag{one} two\footnote\ddag{two} three\footnote\dag{three
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Morbi lobortis, nibh quis luctus porttitor, metus metus accumsan erat,
ac commodo ante lorem tempus velit. Nulla ut ex mi. Curabitur magna
tortor, egestas quis convallis nec, venenatis non nibh.  Aenean et
lacinia elit. Aenean ornare fermentum tincidunt.  Etiam sed metus
ipsum. Nulla accumsan non justo at tincidunt.  Integer sed est
est. Nullam non velit diam. Proin ut ante risus. Fusce ac enim libero.
Proin ac risus nec nisi semper viverra eu ut ligula.  Nulla orci
ligula, elementum vel auctor eu, suscipit ac mi.  Duis in hendrerit
nunc, vitae efficitur lectus.  Nam tristique eros a lacus posuere,
quis placerat sapien venenatis.  Nulla facilisi. Vivamus dapibus nunc
neque, eget maximus neque accumsan nec. Fusce suscipit, sapien id
pellentesque vestibulum, orci tortor efficitur felis, eget tempus ex
augue euismod tortor. Praesent lobortis diam non orci accumsan, sit
amet condimentum eros semper. Mauris vel quam non nulla egestas
aliquet ornare eu ligula. Sed tristique ultrices sem imperdiet
placerat. Maecenas rhoncus, magna sit amet efficitur tristique, elit
odio semper magna, ut aliquet magna odio nec lectus. Nullam tristique
dolor id purus lobortis placerat.  Etiam sit amet rhoncus
nunc. Pellentesque fermentum mi elit, et posuere augue ultricies
nec. Curabitur vulputate, purus id molestie lacinia, nisl massa
feugiat nunc, non consectetur mi nisi non mauris. Morbi blandit, odio
a efficitur fringilla, nulla libero fermentum lectus, vel finibus odio
felis eu sem. Nullam sit amet condimentum ligula. Nulla rutrum lacus
eget ipsum laoreet elementum. Curabitur in molestie felis. Nunc ut
malesuada orci.  Suspendisse tempor ligula in elementum dignissim. Sed
vehicula feugiat hendrerit. Curabitur ultricies massa eget dapibus
laoreet. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Sed blandit eleifend nulla, vel
feugiat lorem elementum at. Sed a magna sollicitudin, hendrerit lacus
vitae, malesuada nibh. Sed commodo, justo vitae varius auctor, nisl
purus lacinia enim, ut rutrum libero nisl ut odio. Phasellus vel massa
diam. Nulla facilisi. Ut sagittis blandit volutpat.  Morbi lobortis
sollicitudin felis, at accumsan eros blandit eget. Donec venenatis,
dolor eu tristique sagittis, diam arcu dignissim ligula, eget sagittis
nulla arcu scelerisque nisl. Etiam ac lacus leo. Donec consequat diam
quis risus venenatis sodales. Duis tempus nibh quis mi fermentum, eget
dapibus diam elementum. Nunc eu ultrices odio. Vivamus in ipsum
sapien. Aliquam erat volutpat. Nunc euismod eros volutpat massa
ultrices porttitor. Ut scelerisque sit amet mi a tincidunt. Sed nec
porta urna. Proin eu arcu eget felis euismod ultrices. Lorem ipsum
dolor sit amet, consectetur adipiscing elit. Morbi lobortis, nibh quis
luctus porttitor, metus metus accumsan erat, ac commodo ante lorem
tempus velit. Nulla ut ex mi. Curabitur magna tortor, egestas quis
convallis nec, venenatis non nibh. Aenean et lacinia elit. Aenean
ornare fermentum tincidunt. Etiam sed metus ipsum. Nulla accumsan non
justo at tincidunt. Integer sed est est. Nullam non velit diam. Proin
ut ante risus. Fusce ac enim libero. Proin ac risus nec nisi semper
viverra eu ut ligula. Nulla orci ligula, elementum vel auctor eu,
suscipit ac mi. Duis in hendrerit nunc, vitae efficitur lectus. Nam
tristique eros a lacus posuere, quis placerat sapien venenatis.  Nulla
facilisi. Vivamus dapibus nunc neque, eget maximus neque accumsan
nec. Fusce suscipit, sapien id pellentesque vestibulum, orci tortor
efficitur felis, eget tempus ex augue euismod tortor. Praesent
lobortis diam non orci accumsan, sit amet condimentum eros
semper. Mauris vel quam non nulla egestas aliquet ornare eu
ligula. Sed tristique ultrices sem imperdiet placerat. Maecenas
rhoncus, magna sit amet efficitur tristique, elit odio semper magna,
ut aliquet magna odio nec lectus. Nullam tristique dolor id purus
lobortis placerat.  Etiam sit amet rhoncus nunc. Pellentesque
fermentum mi elit, et posuere augue ultricies nec. Curabitur
vulputate, purus id molestie lacinia, nisl massa feugiat nunc, non
consectetur mi nisi non mauris. Morbi blandit, odio a efficitur
fringilla, nulla libero fermentum lectus, vel finibus odio felis eu
sem. Nullam sit amet condimentum ligula. Nulla rutrum lacus eget ipsum
laoreet elementum. Curabitur in molestie felis. Nunc ut malesuada
orci.  Suspendisse tempor ligula in elementum dignissim. Sed vehicula
feugiat hendrerit. Curabitur ultricies massa eget dapibus
laoreet. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Sed blandit eleifend nulla, vel
feugiat lorem elementum at. Sed a magna sollicitudin, hendrerit lacus
vitae, malesuada nibh. Sed commodo, justo vitae varius auctor, nisl
purus lacinia enim, ut rutrum libero nisl ut odio. Phasellus vel massa
diam. Nulla facilisi. Ut sagittis blandit volutpat.  Morbi lobortis
sollicitudin felis, at accumsan eros blandit eget. Donec venenatis,
dolor eu tristique sagittis, diam arcu dignissim ligula, eget sagittis
nulla arcu scelerisque nisl. Etiam ac lacus leo. Donec consequat diam
quis risus venenatis sodales. Duis tempus nibh quis mi fermentum, eget
dapibus diam elementum. Nunc eu ultrices odio. Vivamus in ipsum
sapien. Aliquam erat volutpat. Nunc euismod eros volutpat massa
ultrices porttitor. Ut scelerisque sit amet mi a tincidunt. Sed nec
porta urna. Proin eu arcu eget felis euismod ultrices.  Lorem ipsum
dolor sit amet, consectetur adipiscing elit. Morbi lobortis, nibh quis
luctus porttitor, metus metus accumsan erat, ac commodo ante lorem
tempus velit. Nulla ut ex mi. Curabitur magna tortor, egestas quis
convallis nec, venenatis non nibh. Aenean et lacinia elit. Aenean
ornare fermentum tincidunt. Etiam sed metus ipsum. Nulla accumsan non
justo at tincidunt. Integer sed est est. Nullam non velit diam. Proin
ut ante risus. Fusce ac enim libero. Proin ac risus nec nisi semper
viverra eu ut ligula. Nulla orci ligula, elementum vel auctor eu,
suscipit ac mi. Duis in hendrerit nunc, vitae efficitur lectus. Nam
tristique eros a lacus posuere, quis placerat sapien venenatis.  Nulla
facilisi. Vivamus dapibus nunc neque, eget maximus neque accumsan
nec. Fusce suscipit, sapien id pellentesque vestibulum, orci tortor
efficitur felis, eget tempus ex augue euismod tortor. Praesent
lobortis diam non orci accumsan, sit amet condimentum eros
semper. Mauris vel quam non nulla egestas aliquet ornare eu
ligula. Sed tristique ultrices sem imperdiet placerat. Maecenas
rhoncus, magna sit amet efficitur tristique, elit odio semper magna,
ut aliquet magna odio nec lectus. Nullam tristique dolor id purus
lobortis placerat.  Etiam sit amet rhoncus nunc. Pellentesque
fermentum mi elit, et posuere augue ultricies nec. Curabitur
vulputate, purus id molestie lacinia, nisl massa feugiat nunc, non
consectetur mi nisi non mauris. Morbi blandit, odio a efficitur
fringilla, nulla libero fermentum lectus, vel finibus odio felis eu
sem. Nullam sit amet condimentum ligula. Nulla rutrum lacus eget ipsum
laoreet elementum. Curabitur in molestie felis. Nunc ut malesuada
orci.  Suspendisse tempor ligula in elementum dignissim. Sed vehicula
feugiat hendrerit. Curabitur ultricies massa eget dapibus laoreet. }
four\footnote\ddag{four} Lorem ipsum dolor sit amet, consectetur
adipiscing elit.  Morbi lobortis, nibh quis luctus porttitor, metus
metus accumsan erat, ac commodo ante lorem tempus velit. Nulla ut ex
mi. Curabitur magna tortor, egestas quis convallis nec, venenatis non
nibh.  Aenean et lacinia elit. Aenean ornare fermentum tincidunt.
Etiam sed metus ipsum. Nulla accumsan non justo at tincidunt.  Integer
sed est est. Nullam non velit diam. Proin ut ante risus. Fusce ac enim
libero.  Proin ac risus nec nisi semper viverra eu ut ligula.  Nulla
orci ligula, elementum vel auctor eu, suscipit ac mi.  Duis in
hendrerit nunc, vitae efficitur lectus.  Nam tristique eros a lacus
posuere, quis placerat sapien venenatis.  Nulla facilisi. Vivamus
dapibus nunc neque, eget maximus neque accumsan nec. Fusce suscipit,
sapien id pellentesque vestibulum, orci tortor efficitur felis, eget
tempus ex augue euismod tortor. Praesent lobortis diam non orci
accumsan, sit amet condimentum eros semper. Mauris vel quam non nulla
egestas aliquet ornare eu ligula. Sed tristique ultrices sem imperdiet
placerat. Maecenas rhoncus, magna sit amet efficitur tristique, elit
odio semper magna, ut aliquet magna odio nec lectus. Nullam tristique
dolor id purus lobortis placerat.  Etiam sit amet rhoncus
nunc. Pellentesque fermentum mi elit, et posuere augue ultricies
nec. Curabitur vulputate, purus id molestie lacinia, nisl massa
feugiat nunc, non consectetur mi nisi non mauris. Morbi blandit, odio
a efficitur fringilla, nulla libero fermentum lectus, vel finibus odio
felis eu sem. Nullam sit amet condimentum ligula. Nulla rutrum lacus
eget ipsum laoreet elementum. Curabitur in molestie felis. Nunc ut
malesuada orci.  Suspendisse tempor ligula in elementum dignissim. Sed
vehicula feugiat hendrerit. Curabitur ultricies massa eget dapibus
laoreet. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Sed blandit eleifend nulla, vel
feugiat lorem elementum at. Sed a magna sollicitudin, hendrerit lacus
vitae, malesuada nibh. Sed commodo, justo vitae varius auctor, nisl
purus lacinia enim, ut rutrum libero nisl ut odio. Phasellus vel massa
diam. Nulla facilisi. Ut sagittis blandit volutpat.  Morbi lobortis
sollicitudin felis, at accumsan eros blandit eget. Donec venenatis,
dolor eu tristique sagittis, diam arcu dignissim ligula, eget sagittis
nulla arcu scelerisque nisl. Etiam ac lacus leo. Donec consequat diam
quis risus venenatis sodales. Duis tempus nibh quis mi fermentum, eget
dapibus diam elementum. Nunc eu ultrices odio. Vivamus in ipsum
sapien. Aliquam erat volutpat. Nunc euismod eros volutpat massa
ultrices porttitor. Ut scelerisque sit amet mi a tincidunt. Sed nec
porta urna. Proin eu arcu eget felis euismod ultrices.  Lorem ipsum
dolor sit amet, consectetur adipiscing elit. Morbi lobortis, nibh quis
luctus porttitor, metus metus accumsan erat, ac commodo ante lorem
tempus velit. Nulla ut ex mi. Curabitur magna tortor, egestas quis
convallis nec, venenatis non nibh. Aenean et lacinia elit. Aenean
ornare fermentum tincidunt. Etiam sed metus ipsum. Nulla accumsan non
justo at tincidunt. Integer sed est est. Nullam non velit diam. Proin
ut ante risus. Fusce ac enim libero. Proin ac risus nec nisi semper
viverra eu ut ligula. Nulla orci ligula, elementum vel auctor eu,
suscipit ac mi. Duis in hendrerit nunc, vitae efficitur lectus. Nam
tristique eros a lacus posuere, quis placerat sapien venenatis.  Nulla
facilisi. Vivamus dapibus nunc neque, eget maximus neque accumsan
nec. Fusce suscipit, sapien id pellentesque vestibulum, orci tortor
efficitur felis, eget tempus ex augue euismod tortor. Praesent
lobortis diam non orci accumsan, sit amet condimentum eros
semper. Mauris vel quam non nulla egestas aliquet ornare eu
ligula. Sed tristique ultrices sem imperdiet
placerat. Maecenas rhoncus, magna sit amet efficitur tristique, elit
odio semper magna, ut aliquet magna odio nec lectus. Nullam tristique
dolor id purus lobortis placerat.  Etiam sit amet rhoncus
nunc. Pellentesque fermentum mi elit, et posuere augue ultricies
nec.
\par five\footnote\dag{five}

\vfil\eject

six\footnote\dag{six} seven\footnote\ddag{seven}
eight\footnote\dag{\vtop{\hbox{eight}\hbox{eight}}}
nine\footnote\dag{\vbox{\hbox{nine}\hbox{nine}}}
ten\footnote\ddag{ten}

\bye

我编写了解决方案,但除了上述示例之外,我自己没有使用过它。因此,代码可能需要进行一些额外的更改才能获得生产环境的灵活性。例如,\par需要在“five”前面加上,否则下一个脚注会比其引用更早打印;当然,输出例程必须偶尔调用一次。

相关内容