NewDocumentEnvironment 中的框架

NewDocumentEnvironment 中的框架

使用投影仪框架时,这不起作用。

\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替换为时,如上面的注释所示,两种解决方案再次失败\NewDocumentEnvironmentxparse

! 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}
}

使用xparse2019-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}

相关内容