带脚注的标题的脚注编号行为异常

带脚注的标题的脚注编号行为异常

我无法解释以下两个 MWE 所表现出的行为。显然,脚注编号会因标题中的文本长度而改变。请告诉我为什么会发生这种奇怪的行为以及如何避免它?

MWE1:

在此处输入图片描述

MWE2:

在此处输入图片描述

MWE1 代码:

\documentclass{article}
\usepackage[hmargin=2in,vmargin=5in]{geometry}
\begin{document}
\begin{figure}
\label{fig:temp}
\caption[Caption for LOF]{Caption\footnotemark. Some more text added here changes the footnote number in a length-dependent manner.}
\end{figure}
\footnotetext{Footnote text.}
\end{document}

MWE2代码:

\documentclass{article}
\usepackage[hmargin=2in,vmargin=5in]{geometry}
\begin{document}
\begin{figure}
\label{fig:temp}
\caption[Caption for LOF]{Caption\footnotemark. Less text rectifies the foonote number.}
\end{figure}
\footnotetext{Footnote text.}
\end{document}

编辑。为了回应一条评论,我提供了一个示例,说明即使标题只有一行,也会出现异常编号。

MWE3: 在此处输入图片描述

MWE3代码:

\documentclass{article}
\usepackage[hmargin=1.9in,vmargin=5in]{geometry}
\begin{document}
\begin{figure}
\label{fig:temp}
\caption[Caption for LOF]{Caption\footnotemark. Some more text added here changes the footnote number.}
\end{figure}
\footnotetext{Footnote text.}
\end{document}

答案1

\caption{<stuff>}正如@AxelSommerfeldt 所提到的,当<stuff>宽度超过一行时,默认文档类会评估两次。这里是做出决定的地方 -\caption最初定义在latex.ltx,随后调用\@makecaption;取自article.cls

\long\def\@makecaption#1#2{%
  \vskip\abovecaptionskip
  \sbox\@tempboxa{#1: #2}%
  \ifdim \wd\@tempboxa >\hsize
    #1: #2\par
  \else
    \global \@minipagefalse
    \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
  \fi
  \vskip\belowcaptionskip}

它首先将整个标题(例如Figure 1: <stuff>)存储在一个框内:

\sbox\@tempboxa{#1: #2}%

在您的例子中,这将评估\footnotemark。然后测试框的宽度是否大于\hsize(文本块的宽度)。如果为真,则设置标题再次\footnotemark第二次求值:

\ifdim \wd\@tempboxa >\hsize
  #1: #2\par

如果框宽度小于\hsize,则将其置于另一个宽度为的框的中心\hsize

\else
  \global \@minipagefalse
  \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi

后一部分促使进行双重评估 - 可以将标题设置为段落块,也可以设置为单个居中行。对于您的特定情况,这既是功能也是缺点。

你可能会质疑,你能否提供一个单一标题的例子,该标题也产生了一个错误的\footnotemark。这是可能的,因为 box-storing 命令

\sbox\@tempboxa{#1: #2}

已设置没有考虑\hsize(文本块宽度)。这意味着单词之间不会发生拉伸/收缩。如果添加geometry选项showframe到你的例子,你会注意到标题适合确切地在文本块内,因为单词间的粘连会缩小。但是,在不需要使用任何粘连的框中设置相同的内容,会发现它实际上比更宽\hsize

在此处输入图片描述

\documentclass{article}
\usepackage[hmargin=1.9in,vmargin=5in,showframe]{geometry}% http://ctan.org/pkg/geometry
\begin{document}
\begin{figure}
\makebox[\hsize][l]{Figure 1: Caption\textsuperscript{2}. Some more text added here changes the footnote number.}
\caption[Caption for LOF]{Caption\footnotemark. Some more text added here changes the footnote number.}\par
\label{fig:temp}
\end{figure}
\footnotetext{Footnote text.}
\end{document}

如何避免这种情况?您可以加载caption包裹适当地重新定义\caption(首选),或者在两次设置标题时将其设置在\footnotemark不会重新扩展(或重新评估)的框中:

\sbox0{\footnotemark}% Store \footnotemark
\caption[Caption for LOF]{Caption\usebox0. Some more text added here changes the footnote number.}

虽然这有效,但它会删除任何hyperref能力。

相关内容