将 reledmac 与 multicol 结合使用(两列文档中的两列脚注)

将 reledmac 与 multicol 结合使用(两列文档中的两列脚注)

我正在尝试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 脚注的人来说,这可能会有所帮助。

相关内容