我正在尝试reledmac
在双栏文档(基于multicol
)中排版脚注。为简单起见,假设我在中仅使用一系列“熟悉的脚注” reledmac
,但这些脚注是双栏的,因此其垂直空间的权重只需计算为单倍,而不是双倍。
我正在尝试对multicol
软件包进行相应的修补,但经常会出现一些奇怪的极端情况,即脚注会落在错误的页面上(文本中脚注的前一页)。在这种情况下,multicol
会发出警告“我将一些行移到了下一页。第 x 页上的脚注在输入行 xx 上可能是错误的。”
我在想:我在修补过程中是否做错了什么(或不完整)?有人知道我该如何改进以下 MWE 吗?
\documentclass{scrbook}
\setlength{\parskip}{0pt}
\RequirePackage{polyglossia}
\setmainlanguage{latin}
\RequirePackage{multicol}
\RequirePackage{reledmac}
\newseries{T}
\arrangementX[T]{twocol}
\setlength{\skip\footinsT}{1\baselineskip plus 10mm}%
\hsizetwocolX[T]{75mm}
\let\footnote\footnoteT
%%%%%%%%%% patching multicol.sty for twocolumn footnotes %%%%%%%%%
\makeatletter
\count\footinsT1000
\def\init@mult@footins{%
\count\footinsT1000
}
\def\reinsert@footnotes{\ifvoid\footinsT\else
\insert\footinsT{}\fi}
\patchcmd\multi@column@out{\divide\skip\footins\col@number}{}{}{}
\patchcmd\multi@column@out{\footins}{\footinsT}{}{}
\patchcmd\multi@column@out{\footins}{\footinsT}{}{}
\def\leave@mult@footins{%
\advance\dimen@-2\skip\footinsT%
\advance\[email protected]\ht\footinsT%
}
\makeatother
\usepackage{lipsum}
\begin{document}
\mainmatter
\begin{multicols}{2}[\chapter{Chapter Headline}]
\lipsum*[3]\footnote{Fn 1}
\lipsum*[3]\footnote{Fn 2}
\lipsum*[3]\footnote{Fn 3}
\lipsum*[3]\footnote{Fn 4}
\lipsum*[5]%\footnote{Fn 5}
\lipsum*[6]\footnote{Fn 5}%\footnote{Fn 6}
\lipsum*[7]\footnote{Fn 7}
\lipsum*[8]\footnote{Fn 8}
\lipsum*[9]\footnote{Fn 9}
\lipsum*[10]\footnote{Fn 10}
\lipsum*[6]\footnote{Fn 5}%\footnote{Fn 6}
\lipsum*[7]\footnote{Fn 7}
\end{multicols}
\end{document}
这会产生一个极端情况,您会看到错误(放错位置的脚注 4):
附录:我知道 multicol 不是为双栏脚注设计的,而且这是一个很难解决的问题——很多关于这个问题的帖子都提到了这一点。所以我不是在寻求完美的解决方案,而是在寻求任何想法,让我可以在修补过程中做得更好,以改善结果。我上面给出的 MWE 在大多数情况下确实已经提供了完美的结果,但也许对内部魔力有更多了解的人multicol
可以告诉我是否还有另一个可以添加的调整。
答案1
双栏脚注和双栏文本是很多人都关心的一个话题。但目前还没有 LaTeX 解决方案,因为multicol
与 不兼容reledmac
(也与 不兼容dblfnote
),而ltxgrid.sty
是 的可行替代方案,multicol
因为它还支持列中的浮动,与 更加不相容reledmac
。
虽然目前还看不到解决这一情况的办法,但与此同时,我发现了一个“部分”解决方案(或一套变通方法),可能对所有面临类似情况的人有所帮助。变通方法由三部分组成。
1) 首先是multicol
按照我在上面的问题中以 MWE 的身份发布的方式进行修补。这种方法效果很好,但仍然存在一些极端情况,即某些脚注出现得太早了。
2) 通过在文档前言中进行一些调整,可以大大减少这种极端情况的发生频率\setcounter{collectmore}{-2}
。就我而言,我可以将错误频率降低到 10% 左右。在我测试的文档中,-2 效果最好,但有时 -1 也合适。完成此步骤后,过早出现并需要手动重新排列的脚注会少得多。
3) 可以手动调整剩余错位脚注的位置。为此,需要一种机制将某些脚注从一页移到另一页(因为它们出现得太早了)。为此,您可以使用以下推送弹出机制,该机制存储脚注并根据命令释放它们,而脚注锚点不受此机制的影响。这需要包含在序言中:
\RequirePackage{expl3}
\makeatletter
\ExplSyntaxOn
\tl_new:N \twocolftn@toks
\def\pushFootnotes{%
\let\vfootnoteT@old\vfootnoteT%
\let\vfootnoteT\@pushftn@vfootnoteT%
}
\def\popFootnotes{%
\let\vfootnoteT\vfootnoteT@old%
\tl_use:N \twocolftn@toks%
\tl_clear:N \twocolftn@toks%
}%
\long\def\@pushftn@vfootnoteT#1#2{%
\tl_gput_right:Nn \twocolftn@toks {\@popftn@vfootnoteT}%
\tl_gput_right:Nx \twocolftn@toks {{\@thefnmarkT}}%
\tl_gput_right:No \twocolftn@toks {{T}}%
\tl_gput_right:Nx \twocolftn@toks {{#2}}%
}%
\newcommand*{\@popftn@vfootnoteT}[3]{%
\def\@thefnmarkT{#1}%
%\vfootnoteT{#2}{#3}%eledmac
\regvfootnoteT{T}{#3}%reledmac
}
\ExplSyntaxOff
\makeatother
现在,您可以\pushFootnotes
在文档的任何地方发出该命令。随后,将存储后续脚注,但不会排版(仅存储锚点)。稍后,您必须在文档中(在要放置已保存脚注的页面上)发出该命令,\popFootnotes
以便释放所有已保存的脚注并将其打印在所在页面上\popFootnotes
。
因此,在上面的 MWE 中,脚注 4 出现得太早,您可以这样做:
\lipsum*[3]\pushFootnotes\footnote{Fn 4}
\lipsum*[5]
\lipsum*[6]\popFootnotes\footnote{Fn 5}
请注意,\popFootnotes
必须在下一个脚注之前发出,否则出现顺序将会改变。顺便说一句:如果您实施了步骤 2,则在此具体 MWE 中的脚注 4 的情况下,您将不需要此推送弹出机制,因为步骤 2 已经纠正了此特定情况。如果您实施步骤 2,则手动重新调整实际上很少需要。
我知道这是一个实验性的解决方法。但从实际情况来看,对于所有必须使用 twocol 文本排版 twocol 脚注的人来说,这可能会有所帮助。