![\par 在 \addcontentsline 中断框架列表](https://linux22.com/image/445013/%5Cpar%20%E5%9C%A8%20%5Caddcontentsline%20%E4%B8%AD%E6%96%AD%E6%A1%86%E6%9E%B6%E5%88%97%E8%A1%A8.png)
这个答案提供了向投影仪演示文稿添加帧列表的不可或缺的功能。
它包含以下行
\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}