![Beamer:多次引用同一脚注](https://linux22.com/image/240382/Beamer%EF%BC%9A%E5%A4%9A%E6%AC%A1%E5%BC%95%E7%94%A8%E5%90%8C%E4%B8%80%E8%84%9A%E6%B3%A8.png)
在里面LaTeX 维基百科我发现了一个解决对同一脚注有多个引用的问题:
First reference.\footnote{This is the footnote}\addtocounter{footnote}{-1}\addtocounter{Hfootnote}{-1}
Second reference.\footnotemark
但是,当使用 beamer 包并在以下上下文中放置脚注时
\usetheme{CambridgeUS}
% ...
\begin{block}{testblock}
one program\footnote{open-source software}\addtocounter{footnote}{-1},
other program\footnotemark
\end{block}
这个技巧不起作用(因为第二个引用是“0”而不是“a”)。使用 beamer 实现此目的的最佳方法是什么(问题似乎是 beamer 在块环境中对“脚注”使用了另一个计数器,而 \footnotemark 返回常规计数器)?
答案1
计数器Hfootnote
对于文章来说是必需的,因为 hyperref 对内部事务的处理很随意,并且对很多东西都有自己的计数器,包括脚注。因此,当以非常规方式更改计数器时,您还必须更改 hyperref 版本,通常是H<original counter name>
。
但是,只有当 hyperref 在文档中创建内容之间的链接时才需要这样做。在本例中,不需要这样做。Beamer 在加载包时会关闭 hyperref 的大部分功能implicit=false
。如果您仔细查看带有脚注的 beamer 演示文稿的 PDF 结果,您会发现脚注上没有超链接。
因此,内部脚注内容未安装,这就是 Marco 收到错误的原因:Hfootnote
未定义。
因此,事实上,原来的解决方案来自LaTeX 维基百科在此上下文中工作得很好:
\documentclass{beamer}
\begin{document}
\begin{frame}
\begin{block}{testblock}
one program\footnote{open-source software},
other program\footnotemark[\value{footnote}],
third program\footnote{proprietry}
\end{block}
\end{frame}
\end{document}
事实上,这是一个更加强大的版本,因为如果您想要更多对同一脚注的引用,您可以轻松地复制该行:
\documentclass{beamer}
\begin{document}
\begin{frame}
\begin{block}{testblock}
one program\footnote{open-source software},
other program\footnotemark[\value{footnote}],
other program\footnotemark[\value{footnote}],
third program\footnote{proprietry}
\end{block}
\end{frame}
\end{document}
这个会不是使用此\addtocounter
hack,您需要\addtocounter{footnote}{-1}
在每次使用脚注标记后进行操作。但是,这仍然不适用于无序的脚注,要做到这一点,您需要保存脚注标记。这是一个简单的 hack,尽管我不会惊讶地发现有一个包可以更干净地做到这一点(并且可以一次保存多个脚注)。
\documentclass{beamer}
\renewcommand{\thefootnote}{\alph{footnote}}
\newcommand{\savefootnote}{\edef\tmpfn{\the\value{footnote}}}
\newcommand{\savedfootnote}{\footnotemark[\tmpfn]}
\begin{document}
\begin{frame}
\begin{block}{testblock}
one program\footnote{open-source software}\savefootnote,
other program\savedfootnote,
fourth program\savedfootnote,
third program\footnote{proprietry}
other program\savedfootnote
\end{block}
\end{frame}
\end{document}
(注:由于这个答案已经被接受,而且上面的内容实际上没有任何内容错误的,我添加这个而不是删除上面的并替换它。但是,下面的分析更准确,修复也更合适。不过,我仍然不认为它有任何优雅之处。)
经过一番挖掘,我发现这与 beamer 完全无关,而与minipage
s 有关。您看到这种情况的原因是因为当 beamer 制作花哨的框时,内容会被放入 minipage 中。Minipage 有自己的脚注设置,因此在 minipage 中我们必须挂接到 minipage 系统而不是通常的系统。特别是,minipage 脚注有自己的计数器,mpfootnote
这是应该保存的计数器。在 minipage 环境开始时,旧的脚注内容将被 minipage 特定内容替换。这应该意味着所有内容刚刚起作用。但事实并非如此,因为设计 minipage 环境的人并没有想到有人会想要使用\footnotemark
带有可选参数的命令,因此调用的特定位不会被交换。
幸运的是,如果我们需要的话,交换那一点并不难。不幸的是,我看不出有什么方法可以测试我们是否在迷你页面中,所以我们需要定义一个不同的命令来将迷你页面(或块)内的脚注保存到外部。也许有些过路人可以纠正这个问题。
以下是示例代码:
\documentclass{article}
\makeatletter
\newcommand{\savefootnote}{%
\edef\tmpfn{\the\value{footnote}}}
\newcommand{\savempfootnote}{%
\let\@xfootnotemark=\@mpxfootnotemark
\edef\tmpfn{\the\value{footnote}}}
\newcommand{\savedfootnote}{\footnotemark[\tmpfn]}
\def\@mpxfootnotemark[#1]{%
\begingroup
\c@footnote #1\relax
\unrestored@protected@xdef\@thefnmark{\thempfootnote}%
\endgroup
\@footnotemark}
\makeatother
\begin{document}
one program\footnote{open-source software}\savefootnote,
one program\savedfootnote,
one program\savedfootnote,
other program\footnote{proprietry},
one program\savedfootnote,
\begin{minipage}{\textwidth}
one program\footnote{open-source software}\savempfootnote,
one program\savedfootnote,
one program\savedfootnote,
other program\footnote{proprietry},
one program\savedfootnote,
\end{minipage}
\end{document}
答案2
如果您制作了一个最小的工作示例,您就会发现计数器Hfootnote
未定义。
\listfiles
\documentclass{beamer}
\begin{document}
\begin{frame}
\begin{block}{testblock}
one program\footnote{open-source software}\addtocounter{footnote}{-1},
other program\footnotemark
\end{block}
\begin{block}{testblock}
one program\footnote{open-source software},
other program\footnotemark[\value{footnote}]
\end{block}
\end{frame}
\end{document}
结果: