\footnotesep 究竟是如何工作的?

\footnotesep 究竟是如何工作的?

我最近对网格排版产生了浓厚的兴趣,因此试图让页面上的所有元素彼此之间以 值的倍数分隔开\baselineskip(不要尝试这样做,这会让你发疯)。经过一番折腾,除了脚注之外,我让所有内容都适合。根据 LaTeX2e 手册,\footnotesep确定分隔脚注的支柱的高度。但是,将脚注的字体大小从 改为\footnotesize并将\small改为 后\baselineskip14.5pt我可以告诉你不是这种情况,或者至少看起来并非如此。支柱高度应为 baselineskip 的 70%,因此\footnotesep应为 ,10.15以保证所有脚注都以 的倍数分隔\baselineskip。但我的经验告诉我,它更接近10.425pt。那么这是什么情况呢?算法实际上是如何工作的?

这是我的代码(用于 lualatex):

\documentclass[12pt,twoside]{article}
\usepackage{fontspec}
\usepackage[textwidth=130mm,textheight=40\baselineskip, centering, a4paper]{geometry}
\usepackage{lipsum}
\setlength{\headheight}{14.5pt}
\setlength{\splittopskip}{14.5pt}
\setlength{\lineskiplimit}{-\maxdimen}
\setlength{\parskip}{0pt}
\usepackage{footmisc}
\setlength{\skip\footins}{16.05pt}
\setlength{\footnotesep}{10.425pt}
\makeatletter
\renewcommand\footnoterule{
    \kern-4.05\p@
    \hrule\@width.4\columnwidth
    \kern3.65\p@
}
\makeatother
\flushbottom
\renewcommand{\footnotesize}{}
\renewcommand{\footnotelayout}{\small\baselineskip=14.5pt}
\newcommand{\baselinegrid}{%
    \raisebox{0pt}[\height][0pt]{\makebox[0pt][l]{%
        \begin{minipage}[t]{\textwidth}%
            \begin{color}{red}%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
                \rule{\textwidth}{.05pt}\linebreak%
            \end{color}
        \end{minipage}%
}}}

\begin{document}
\baselinegrid
texttexttext\footnote{a footnote.}
\lipsum[1-2]
textextext\footnote{another footnote.}\footnote{another footnote.}\footnote{another footnote.}\footnote{another footnote.}\footnote{another footnote.}\footnote{another footnote.}\footnote{another footnote.}\footnote{another footnote.}\footnote{another footnote.}\footnote{another footnote.}
\lipsum[3-4]
\end{document}

这样会生成一个在脚注中行距相当一致的文档(实际上整个文档都是如此)。但是,如果您更改\footnotesep为,10.15您应该会看到分离开始发生。发生了什么事??

答案1

问题在于您使用了\small14.5pt\baselineskip的 。它\small本身使用了\baselineskip13.6pt 的 。这意味着\strut\small深度为 0.3*13.6pt = 4.08pt,而\baselineskip14.5pt正常深度为 0.3*14.5pt = 4.35pt。由于设置\baselineskip不会改变,因此\strut您使用 的\strut\small因此您会错过 4.35-4.08=0.27pt。您必须通过将其添加到 来补偿这一点\footnotesep,这意味着正确值为 10.15+0.27=10.42pt,略小于您的估计值。

答案2

除了 minipage 脚注的类似代码外,\footnotesep标准格式版本脚注中的唯一用途是它在\foonotetext包的定义中出现了两次,例如footmisc将具有类似的代码,具体取决于所使用的选项。

\long\def\@footnotetext#1{\insert\footins{%
    \reset@font\footnotesize
    \interlinepenalty\interfootnotelinepenalty
    \splittopskip\footnotesep
%                 %%%%%%%%%%%
    \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
    \hsize\columnwidth \@parboxrestore
    \protected@edef\@currentlabel{%
       \csname p@footnote\endcsname\@thefnmark
    }%
    \color@begingroup
      \@makefntext{%
        \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
%                 %%%%%%%%%%%
    \color@endgroup}}%

第一次使用在本地进行设置\splittopskip,以便如果脚注拆分到一页,则延续部分的基线位于\footnotesep插入框的顶部。

第二个用途是在每个脚注开头插入一个深度、宽度和高度为零的规则,作为间距。在每个脚注结尾处也插入\footnotesep一个高度和宽度为零且深度为的规则。\strut

没有特定的规则说\footnotesep\strut 的高度应该是\baselineskip这些长度的 70% 并且可以相互独立地设置。

在你的情况下,如果你添加,\showoutput你会看到每一行脚注文本都是

 .\hbox(10.425+4.08003)x369.88582, glue set 265.5038fil

因此,框的高度来自\footnotesep,深度来自 ,\dp\strutbox总和略大于 14.404pt,因此略大于您的网格间距。您需要将 strutbox 设置为适合您的基线的大小,并设置 \footnotesep\ht\strutbox,以便在此处获得精确的间距。(或至少设置\footnotesep\dimexpr\baselineskip-\dp\strutbox

相关内容