我无法解释以下两个 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
能力。