使用列表式语法创建不同的 beamer 框架

使用列表式语法创建不同的 beamer 框架

我正在尝试让 \LaTeX\ 使用 beamer 的列表样式语法。我需要它来应对一些非常特殊的情况,即每个都\item将所有内容转储到新框架中。

为了实现这一点,我希望我可以简单地做一个类似的技巧,当你想将列表的每个项目放在不同的小页面环境中时,你可以这样做:

    \newenvironment{framelist}{%
        \let\closeframe\relax%
        \newcommand\localframe{%
            \closeframe%
            \let\closeframe\endframe%
            \frame%
        }
    }

但是,\begin{frame} \end{frame}环境中没有可用于打开和关闭框架的命令\frame\endframe因此这显然行不通(因为它将整个内容作为宏存储在其中)。

在尝试了几种方法并失败后,我在 stackexchange 的另一篇文章中看到他们使用\long\def\bframe#1\eframe{\begin{frame}#1\end{frame}}“重命名”命令。然而,尽管从语法上讲它类似于 \minipage\endminipage 命令的功能,但它们仍然完全不同:

    \newenvironment{framelist}{%
        \let\closeframe\relax%
        \newcommand\localframe{%
            \closeframe%
            \let\closeframe\eframe%
            \bframe%
        }
    }

而且这也不起作用……尽管它给出的“错误”要好得多,所以也许我越来越接近注意到什么想法可行?我已经变得非常绝望,所以我希望这里有人能帮我解决这个问题。

谢谢!

附言:

这是一个 M(不是)WE,它不能编译,但它显示了我正在寻找的基本前提

    \documentclass{beamer}

    \long\def\bframe#1\eframe{\begin{frame}#1\end{frame}}
    \newenvironment{framelist}{
    \let\closeframe\relax %
        \newcommand{\localframe}{%
        \closeframe%
        \let\closeframe\endframe%
        \bframe%
    }
    }{%
    \eframe
    }
    \begin{document}

    \begin{framelist}
         \localframe
             bla
             bla, all of this in the first frame
         \localframe
             this should be on another frame entirely
         \localframe
             this should be another extra frame
    \end{framelist}
    
    \end{document}

这个问题有解决办法吗?我觉得这个问题可能没有解决办法


编辑:

添加将命令带入投影机“基础”后我的“扩展”应该做什么的示例。

当我写作时

    \begin{framelist}
         \localframe
             bla
             bla, all of this in the first frame
         \localframe
             this should be on another frame entirely
         \localframe
             this should be another extra frame
    \end{framelist}

我希望它“扩展”到类似的东西

    \begin{frame}
   
             bla
             bla, all of this in the first frame

    \end{frame}

    \begin{frame}

             this should be on another frame entirely

    \end{frame}

    \begin{frame}

             this should be another extra frame

    \begin{frame}

答案1

像这样吗?

\documentclass{beamer}

\newcommand{\choice}{whatever this macro should do}

\newenvironment{testlist}
{\begin{frame}[environment=testlist]}
{\end{frame}}

\begin{document}

\begin{testlist}
   \choice
   bla
   bla
\end{testlist}

\end{document}

(使用风险自负,如果您的幻灯片中需要易碎内容,可能会造成麻烦......)


编辑:

根据问题中的新代码示例:

\documentclass{beamer}

\newcounter{mycounter}

\newcommand{\localframe}{%
\ifnum\themycounter>0
    \framebreak%
\fi%
\addtocounter{mycounter}{1}%
}

\newenvironment{framelist}
{\begin{frame}[environment=framelist, allowframebreaks]\setcounter{mycounter}{0}}
{\end{frame}}

\begin{document}

\begin{framelist}
     \localframe
         bla
         bla, all of this in the first frame

     \localframe
         this should be on another frame entirely

     \localframe
         this should be another extra frame
\end{framelist}


\end{document}

(但是现在黑客开始变得肮脏......)

答案2

根据 samcarter 的建议,我将添加自己的答案,改进 samcarter 的答案,以防止使用计数器并防止使用条件:

关键在于简单地知道\framebreak存在......其作用类似于\pagebreak.并且知道一个(许多)技巧来将列表中的项目包含在环境中。

(我的答案和 samcarter 之间的唯一区别是我们如何告诉第一个项目的“关闭环境”被禁用。)

\documentclass{beamer}

\newenvironment{framelist}%
{%
    \let\closeframe\relax%
    \newcommand{\localframe}{%
        \closeframe%
        \let\closeframe\framebreak%
    }%
    \begin{frame}[environment=framelist, allowframebreaks]%
}%
{\end{frame}}

\begin{document}

\begin{framelist}
     \localframe
        bla
        bla, all of this in the first frame

     \localframe
        this should be on another frame entirely

     \localframe
        this should be another extra frame
\end{framelist}

\end{document}

相关内容