Beamer:多次引用同一脚注

Beamer:多次引用同一脚注

在里面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}

这个会不是使用此\addtocounterhack,您需要\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 完全无关,而与minipages 有关。您看到这种情况的原因是因为当 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}

结果:

在此处输入图片描述

相关内容