我有一套大型幻灯片(多日培训课程),我想通过包含/排除某些幻灯片来生成不同的培训课程(不同长度和主题组合)。我以前用 ifthen 来做这件事,但突然(新电脑)失败了。这是一个简单的例子:
\documentclass[utf8]{beamer}
\RequirePackage{ifthen}
\newif\ifdetails
\newcommand{\details}[1]{\ifdetails#1\fi}
\detailstrue
\begin{document}
\begin{frame}[fragile]{No Problems Here}
\details{Works fine, really.}
\end{frame}
\details{
\begin{frame}[fragile]{But Issues Here}
Why??!?
\end{frame}
}
\begin{frame}[fragile]{Again, All Good}
\details{Works fine, again.}
\end{frame}
\end{document}
当未设置时,此方法可以正常工作\detailstrue
,否则会失败
(./demo1.vrb
! Extra }, or forgotten \endgroup.
\endframe ->\egroup
\begingroup \def \@currenvir {frame}
l.2 Why??!? \end {frame}
\fi
(如您所见,它仅对于\details{}
包裹在框架中的命令失败。在框架内使用的命令完全没问题。)
通过谷歌搜索,我了解到我应该使用 etoolbox,因此我\details
用以下方式替换了定义:
\usepackage{etoolbox}
\newbool{details}
\newcommand{\details}[1]{\ifbool{details}{#1}{}}
\booltrue{details}
\newbool{details}
当不存在时,此方法也能正常工作,但在其他情况下则会失败:
(./demo2.vrb
! Extra }, or forgotten \endgroup.
\endframe ->\egroup
\begingroup \def \@currenvir {frame}
l.2 Why??!? \end {frame}
我最终尝试利用 Beamer 自己的隐藏框架机制并为此定义了我自己的环境:
\newenvironment{frameOn}[2]{\ifbool{#1}{\begin{frame}[fragile]{#2}}{\begin{frame}<0>[noframenumbering]{}}}{\end{frame}}
...
\begin{frameOn}{details}{But Issues Here}
Why??!?
\end{frameOn}
同样,当未设置布尔标志时,一切都很好,但是否则就会发生相同的失败:
(./demo3.vrb
! Extra }, or forgotten \endgroup.
\endframe ->\egroup
\begingroup \def \@currenvir {frame}
l.3 \end{frameOn}
我是否遗漏了一些显而易见的东西?如何以编程方式排除完整幻灯片?感谢您的见解 :-)
答案1
这是关闭框架的另一种方法。
\documentclass[utf8]{beamer}
%\RequirePackage{ifthen}
\newif\ifdetails
\newcommand{\details}[1]{\ifdetails#1\fi}
\detailstrue
\begin{document}
\begin{frame}[fragile]{No Problems Here}
\details{Works fine, really.}
\end{frame}
\begin{frame}<\ifdetails1-\else0\fi>[fragile]{But Issues Here}
Why??!?
\end{frame}
\begin{frame}[fragile]{Again, All Good}
\details{Works fine, again.}
\end{frame}
\end{document}