在没有 Footmisc 包的情况下将底部浮动放置在脚注上

在没有 Footmisc 包的情况下将底部浮动放置在脚注上

我正在重新定义脚注布局并希望显示它们总是在页面底部。对于纯文本,只需\vfill在定义的开头放置一个\footseprule;如建议的那样这里

如果我的文档包含很多很长的脚注,底部浮动([b]选项)会放置在脚注下方(这是 article.cls 中的标准)。我尝试过在带有脚注的页面上抑制底部浮动,就像建议的那样这里但当每页都包含脚注时,底部浮动仍然放在下方。

我怎样才能实现底部浮动总是放置在文本区域的底部位于脚注(规则)上方;没有使用任何附加包,尤其是footmisc(这是针对类似问题最常建议的解决方案),或其他类。

这是我的 MWE:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}

\usepackage{blindtext}
\usepackage{graphicx}

\makeatletter
\renewcommand\footnoterule{\vfill%
    \kern-3\p@ \hrule \@width \textwidth \kern 2.6\p@ \kern 2\p@}
\makeatother

\begin{document}

\blindtext\footnote{\blindtext[2]}

\begin{figure}[!b]
    \includegraphics[width=.5\textwidth]{example-image}
\end{figure}

\blindtext\footnote{\blindtext[7]}

\blindtext[3]\footnote{text}

\end{document}

编辑

再次阅读footmisc.sty并考虑到@JohnKormylo 和@UlrikeFischer 的想法,我尝试\@makecol通过重新排列各部分进行修改。因为据我所知,footmisc将以下输出放在footnote后面\@combinefloats

部分出处footmisc.sty

\def \@makecol {%
  \@kernel@before@cclv
  \setbox\@outputbox \box\@cclv
  \@outputbox@removebskip
  \let\@elt\relax
  \xdef\@freelist{\@freelist\@midlist}%
  \global \let \@midlist \@empty
  \@makecol@appendblocks
% Here the blocks are appended; i.e. a floatblock and a footnoteblock
  \ifvbox\@kludgeins
     \@makespecialcolbox
  \else
     \@makenormalcolbox
  \fi
  \global \maxdepth \@maxdepth
}

我尝试了一个非常简单的版本:

\gdef \@makecol {%
    \setbox\@outputbox \box\@cclv
    \let\@elt\relax
    \xdef\@freelist{\@freelist\@midlist}%
    \global \let \@midlist \@empty
    \@combinefloats
    \ifvoid\footins
    \else
            \boxmaxdepth \@maxdepth
            \unvbox \@cclv
            \vskip \skip\footins
            \color@begingroup
            \normalcolor
            \footnoterule
            \unvbox \footins
            \color@endgroup
    \fi
    \ifvbox\@kludgeins
    \@makespecialcolbox
    \else
    \setbox\@outputbox \vbox to\@colht {%
        \@texttop
        \dimen@ \dp\@outputbox
        \unvbox \@outputbox
        \vskip -\dimen@
        \@textbottom
    }%
    \fi
    \global \maxdepth \@maxdepth
}

确实,底部浮动现在出现在文本区域之后。但所有脚注都被推到了下一页的顶部。因此,该方法可能显示正确的方向,但必须修复脚注的位置……

我会继续尝试并感谢其他人的提示或解决方案!

答案1

由于在使用包尝试修补\@makefntext宏时出现了一些歧义,所以我回到了我自己的问题。etoolboxfootmisc

我刚刚对该footmisc包进行了更详细的研究,并能够编辑脚注定义以及输出例程以满足我的所有要求。它包含一个经过改编的变体\@makefntext,将脚注推到页面底部并放置浮动总是位于脚注之上;即使它们包含该[b]选项。

我使用以下 MWE 测试了代码,以及一些更复杂的文档,包括章节、列表、图片、引文、很长的脚注等。到目前为止,我没有发现任何问题或冲突:

\documentclass[twoside]{article}

\makeatletter
% Editing footnotes to meet my formatting requirements
\newbox{\@fnbox} % New box for FN number
\newcommand*{\indent@fnmark}{2.5em} % indention between FN number and FN text
\renewcommand\@makefntext[1]{% Redfinition of FN
            \bgroup
            \setbox\@fnbox\hbox{\hb@xt@\indent@fnmark{\@thefnmark\hss}}
            \leftmargin\wd\@fnbox
            \rightmargin\z@
            \linewidth \columnwidth
            \advance \linewidth -\leftmargin
            \parshape \@ne \leftmargin \linewidth
            \@setpar{{\@@par}}%
            \leavevmode
            \llap{\box\@fnbox}%
            #1
            \par\egroup}
\renewcommand\footnoterule{\vfill%
    \kern-3\p@ \hrule \@width \textwidth \kern 2.6\p@ \kern 2\p@}
\setlength{\skip\footins}{\baselineskip}

% Changing the output routine
\gdef \@makecol {%
    \setbox\@outputbox \box\@cclv
    \let\@elt\relax
    \xdef\@freelist{\@freelist\@midlist}%
    \global \let \@midlist \@empty
    \@combinefloats % floats are placed before footnotes (\footins)
    \ifvoid\footins
    \else
    \setbox\@outputbox \vbox {%
            \boxmaxdepth \@maxdepth
            \unvbox \@outputbox
            \vskip \skip\footins
            \color@begingroup
            \normalcolor
            \footnoterule
            \unvbox \footins
            \color@endgroup}%
    \fi
    \ifvbox\@kludgeins
    \@makespecialcolbox
    \else
    \setbox\@outputbox \vbox to\@colht {%
        \@texttop
        \dimen@ \dp\@outputbox
        \unvbox \@outputbox
        \vskip -\dimen@
        \@textbottom
    }%
    \fi
    \global \maxdepth \@maxdepth
}
\makeatother

\usepackage{blindtext}
\usepackage{graphicx}

\begin{document}
\blindtext\footnote{Some Text}
\begin{figure}[b]
    \includegraphics[width=.5\textwidth]{example-image}
\end{figure}
\blindtext\footnote{\blindtext[5]}
\begin{figure}
    \includegraphics[width=.5\textwidth]{example-image}
\end{figure}
\begin{figure}[b]
    \includegraphics[width=.5\textwidth]{example-image}
\end{figure}
\begin{figure}[b]
    \includegraphics[width=.5\textwidth]{example-image}
\end{figure}
\blindtext[4]\footnote{text}
\end{document}

使用浮动等时使用工作脚注记录

当然,尽管我进行了全面的测试,但可能还是存在一些隐藏的缺陷。如果有人注意到这样的冲突,我会很高兴他/她能给我提示。

相关内容