使用投影仪框架时,这不起作用。
\newenvironment{itemframe}[1]{
\begin{frame}{#1}
\begin{itemize}
}{
\end{itemize}
\end{frame}
}
将可选参数添加fragile, environment=itemframe
到框架中可以解决这个问题。但还有一种避免让框架变得脆弱的替代方法:将除框架环境之外的所有内容导出到自己的命令中。
\documentclass{beamer}
\usepackage{xparse}
\newenvironment{itemframe}[1]{
%\NewDocumentEnvironment{itemframe}{m}{
\begin{frame}{#1}
\itemframebegin
}{
\itemframeend
\end{frame}
}
\newcommand\itemframebegin{
\begin{itemize}
}
\newcommand\itemframeend{
\end{itemize}
}
\begin{document}
\begin{itemframe}{Title}
\item A
\item B
\item C
\end{itemframe}
\end{document}
现在,当从包中\newenvironment
替换为时,如上面的注释所示,两种解决方案再次失败\NewDocumentEnvironment
xparse
! File ended while scanning use of \beamer@collect@@body.
是否有可能制作一个\NewDocumentEnvironment
包括frame
?最好避免使用脆弱选项。
答案1
不幸的是,xparse
定义的环境会产生不良影响\beamer@collect@@body
。
解决方法是使用environ
:
\documentclass{beamer}
\usepackage{xparse,environ}
\NewEnviron{itemframe}{\expandafter\doitemframe\BODY\ENDBODY}
\NewDocumentCommand{\doitemframe}{mo u{\ENDBODY}}{%
\begin{frame}{#1}
\IfNoValueTF{#2}{NO OPT}{OPT}
\begin{itemize}
#3
\end{itemize}
\end{frame}
}
\begin{document}
\begin{itemframe}{Title}[opt]
\item A
\item B
\item C
\end{itemframe}
\end{document}
参数列表以结束,u{\ENDBODY}
以便\doitemframe
以正确的方式收集参数,然后您可以使用#3
(或任何结果参数编号)。
如果你不需要全部力量,xparse
而只是需要标准参数,你可以这样做
\NewEnviron{itemframe}[1]{%
\begin{frame}{#1}
\begin{itemize}
\BODY
\end{itemize}
\end{frame}
}
使用xparse
2019-05-03 版本,可以执行以下操作:表示在进一步处理之前+b
将收集环境主体(在本例中为)。#3
\documentclass{beamer}
\usepackage{xparse}
\NewDocumentEnvironment{itemframe}{mo+b}
{%
\begin{frame}{#1}
\IfNoValueTF{#2}{NO OPT}{OPT: #2}
\begin{itemize}
#3
\end{itemize}
\end{frame}
}{}
\begin{document}
\begin{itemframe}{Title}[opt]
\item A
\item B
\item C
\end{itemframe}
\end{document}