\par 在 \addcontentsline 中断框架列表

\par 在 \addcontentsline 中断框架列表

这个答案提供了向投影仪演示文稿添加帧列表的不可或缺的功能。

它包含以下行

  \addcontentsline{lbf}{section}{\protect\makebox[2em][l]{%
    \protect\usebeamercolor[fg]{structure}\insertframenumber\hfill}%
  \insertframetitle\par}%

最近,它因两个问题而停止工作:

  • 如果\par包含,则会出现编译错误

    段落在 \addcontentsline 完成之前结束。\end{frame} 额外 },或被遗忘的 \endgroup。\end{frame}

  • 帧号也包含在行尾,或者实际上在下一行的开头

我认为用 替代\par似乎\newline是解决第一个问题的方法,但第二个问题仍然存在,导致了这个意外的输出:

在此处输入图片描述

什么改变了?什么坏了?

提前非常感谢您!

原始 MWE

\documentclass{beamer}

\newif\ifframeinlbf
\frameinlbftrue
\makeatletter
\newcommand\listofframes{\@starttoc{lbf}}
\makeatother

\addtobeamertemplate{frametitle}{}{%
  \ifframeinlbf
  \addcontentsline{lbf}{section}{\protect\makebox[2em][l]{%
    \protect\usebeamercolor[fg]{structure}\insertframenumber\hfill}%
  \insertframetitle\par}%
  \else\fi
}

\begin{document}

\frameinlbffalse
\begin{frame}
\frametitle{List of Frames}
\listofframes
\end{frame}

\frameinlbftrue
\begin{frame}
\frametitle{Test Frame One}
test
\end{frame}

答案1

您可以使用 \endgraf 而不是 \par 来避免错误。但我认为将其添加到 \addcontentsline 很奇怪,我会使用一个特殊的命令<type>并定义一个合适的\l@<type>命令,然后它也可以抑制“页码”:

\documentclass{beamer}

\newif\ifframeinlbf
\frameinlbftrue
\makeatletter
\newcommand\listofframes{\@starttoc{lbf}}
\newcommand\l@frame[2]{#1\par}
\makeatother

\addtobeamertemplate{frametitle}{}{%
  \ifframeinlbf
  \addcontentsline{lbf}{frame}{\protect\makebox[2em][l]{%
    \protect\usebeamercolor[fg]{structure}\insertframenumber\hfill}%
  \insertframetitle}%
  \else\fi
}
\begin{document}

\frameinlbffalse
\begin{frame}
\frametitle{List of Frames}
\listofframes
\end{frame}

\frameinlbftrue
\begin{frame}
\frametitle{Test Frame One}
test
\end{frame}
\begin{frame}
\frametitle{Test Frame two}
test
\end{frame}
\end{document}

在此处输入图片描述

相关内容