![多行脚注后面的短段落脚注;如果脚注进入第二行,则防止脚注被分段](https://linux22.com/image/307466/%E5%A4%9A%E8%A1%8C%E8%84%9A%E6%B3%A8%E5%90%8E%E9%9D%A2%E7%9A%84%E7%9F%AD%E6%AE%B5%E8%90%BD%E8%84%9A%E6%B3%A8%EF%BC%9B%E5%A6%82%E6%9E%9C%E8%84%9A%E6%B3%A8%E8%BF%9B%E5%85%A5%E7%AC%AC%E4%BA%8C%E8%A1%8C%EF%BC%8C%E5%88%99%E9%98%B2%E6%AD%A2%E8%84%9A%E6%B3%A8%E8%A2%AB%E5%88%86%E6%AE%B5.png)
是否可以按照以下规则(在我的学科,历史中很常见)分段脚注?
脚注总是从新行开始,除非前一个脚注后面有足够的空白来容纳全部的脚注。
因此:a) 只要有足够的空白空间,短脚注就可以在多行脚注后分段;b) 不是从左边距开始的脚注(即在另一个脚注后分段的脚注)永远不能延伸到下一行。
以下是效果 (a) 的示例:多行脚注后的段落短脚注:
效果 (b) 更难说明(因为它被证明是负面的),但据我所知,在牛津大学出版社或剑桥大学出版社出版的历史专著中,脚注绝不设置在上图中脚注 3 或 5 的位置,如果它们随后会运行到下一行---即使这样设置它们可以节省脚注块所需的总垂直空间。
据我所知,bigfoot 软件包根据两条规则对脚注进行段落处理:1. 长度超过一行的脚注不会与任何内容(无论是在前面还是在后面)一起分段。2. 满足该条件后,以任何方式设置脚注,以最小化所需的垂直空间。(这可能是错误的;它只是基于观察到的效果。)
例如:
\documentclass{article}
\usepackage[para]{bigfoot}
\DeclareNewFootnote[para]{default}
\begin{document}
The first sentence.\footnote{This is a long footnote, to show that short footnotes are not paragraphed following multiline footnotes.}
The second sentence.\footnote{A short footnote.}
The third sentence.\footnote{This is a somewhat longer footnote, to show that it is allowed to overrun the line.}
The third sentence.\footnote{This is another short footnote.}
\end{document}
对我来说,呈现如下:
我希望“脚注 2”位于“脚注 1”后面的空白处。如果“脚注 2”按原样放置,则“脚注 3”不会在其后面分段,因为它会进入下一行。
我想要的第二个 (b) 效果可以通过“后处理”手动完成,方法是将任何像这样溢出的脚注更改为\footnote+{Example text.}
,这会强制将其放在自己的行上。但这必须在最后完成,因为它会更改分页和交叉引用。footmisc 将实现效果 (a),但只能通过运行全部将脚注合并为一个段落,但这并不是我们的目标。
最后,理想的解决方案是,任何放在同一行的脚注都会尽可能地分散,或者至少留有相当大的空白(如上图第一张所示)。
答案1
我从你的图片开始,即脚注从左边距或中间开始。
我可以演示如何在纯 TeX 中实现这一点。如果您使用的是不同的宏包,那么您可以从此代码中获得启发并将其重新实现到您最喜欢的宏包中。
代码(你可以用命令尝试一下tex test.tex
):
\newcount\specfootnum % for global counting the footnotes
\newcount\fnotenum % for footnote marks
\newif\ifrepeat
\tracingpages=1
\def\footnote{\global\advance\fnotenum by1 \fnmark\footnoteA}
\def\footnoteA#1{\global\advance\specfootnum by1
\edef\tmp{\indent\llap{\fnmark\kern2pt}}%
\expandafter\gdef\csname specfoot:\the\specfootnum
\expandafter\endcsname\expandafter{\tmp#1}%
\setbox0=\hbox{\tmp#1}%
\ifdim\wd0<.45\hsize \dimen0=.5\baselineskip
\else \ifdim\wd0>\hsize \setbox0=\vbox{\tmp\strut#1\strut\par\kern0pt}\dimen0=\ht0
\else\dimen0=\baselineskip
\fi\fi
\insert\footins{\floatingpenalty=20000
\vbox to\dimen0{\vss\penalty\specfootnum}\penalty0}%
}
\def\fnmark{$^{\the\fnotenum}$}
\catcode`@=11
\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
\dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
\ifvoid\footins\else % footnote info is present
\vskip\skip\footins \footnoterule \printspecfoot \fi
\ifr@ggedbottom \kern-\dimen@ \vfil \fi
}
\catcode`@=12
\def\printspecfoot{\bgroup\def\tmp{}%
\setbox0=\vbox{\repeattrue \unvbox\footins
\loop \unpenalty \setbox0=\lastbox
\ifvoid0 \repeatfalse
\else \setbox0=\vbox{\unvbox0 \xdef\tmp{\the\lastpenalty,\tmp}}\fi
\ifrepeat \repeat
}%
\dimen1=\hsize \rm
\expandafter\printspecfootA\tmp,
}
\def\printspecfootA#1,{\ifx,#1,\egroup\else
\ifdim\dimen1<.45\hsize
\setbox0=\hbox{\csname specfoot:#1\endcsname}%
\ifdim\wd0<.5\hsize
\vskip-\baselineskip \vskip-\parskip
\noindent\hskip.5\hsize \hskip-.5\parindent \box0 \par
\dimen1=\hsize
\else
\noindent\unhbox0 \newdimenone
\fi
\else \csname specfoot:#1\endcsname \newdimenone \fi
\global\expandafter\let\csname specfoot:#1\endcsname=\relax
\expandafter \printspecfootA\fi
}
\def\newdimenone{$$\global\dimen1=\predisplaysize
\abovedisplayskip=0pt \belowdisplayskip=0pt
\abovedisplayshortskip=0pt \belowdisplayshortskip=0pt
$$\advance\dimen1 by-2em\vskip-\baselineskip
}
%%% the test:
\vsize=120pt
\raggedbottom
Lorem ipsum dolor sit amet, consectetuer%
\footnote{First text.}
adipiscing elit. Ut purus elit, vestibulum ut, placerat ac,
adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu%
\footnote{Second text.}
libero, nonummy eget, consectetuer id, vulputate a, magna. Donec
vehicula augue eu neque. Pellentesque habitant morbi tristique
senectus et netus et malesuada fames ac turpis egestas. Mauris ut
leo. Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna%
\footnote{Third text.}
fringilla ultrices. Phasellus eu tellus sit amet tortor gravida
placerat. Integer sapien est, iaculis in, pretium quis, viverra ac,
nunc. Praesent eget sem vel leo ultrices bibendum. Aenean faucibus.
Morbi dolor nulla, malesuada eu, pulvinar at, mollis ac, nulla.
Curabitur auctor semper nulla. Donec varius orci eget risus. Duis%
\footnote{Next text.}
nibh mi, congue eu, accumsan eleifend, sagittis quis, diam. Duis
eget orci sit amet orci dignissim rutrum.
Morbi auctor lorem non justo. Nam lacus%
\footnote{Nulla malesuada porttitor diam. Donec felis
erat, congue non, volutpat at, lobortis vitae, tincidunt tristique, libero.}
libero, pretium at, lobortis vitae, ultricies et, tellus. Donec
aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna,%
\footnote{Short text.}
vitae ornare odio metus a mi. Morbi ac orci et nisl hendrerit%
\footnote{Next short text.}
mollis. Suspendisse ut massa. Cras nec ante. Pellentesque a nulla.%
\footnote{Intersting short text.}
Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Aliquam tincidunt urna. Nulla ullamcorper
vestibulum turpis. Pellentesque cursus luctus mauris.%
\footnote{The last footnote.}
\bye
结果:
实现说明:每个脚注文本都保存到\specfoot:\the\specfootnum
整个文档中唯一的控制序列中。在\footnote
处理宏时,对此类脚注的垂直空间进行原始计算。结果是\dimen0
插入到\insert
中\vbox to\dimen0{\vss\penalty\specfootnum}
。这意味着实际文本不会保存到\footins
框中。这里只包含一个空框,其中包含有关脚注编号的“消息”。
例程做什么\output
?它会在当前页面创建脚注的编号列表,因为\penalties
内部框会被读取。当前脚注的列表被设置为\tmp
宏。然后使用控制序列处理这些脚注的排版\specfoot:\the\specfootnum
。每个脚注的打印都通过使用宏测量最后一行的文本来结束\newdimenone
。结果设置为\dimen1
。如果\dimen1<.5\hsize
和下一个脚注的宽度小于,则下一个脚注以和.5\hsize
开始。\vskip-\baselineskip
\hskip.5\hsize