![使用列表式语法创建不同的 beamer 框架](https://linux22.com/image/356334/%E4%BD%BF%E7%94%A8%E5%88%97%E8%A1%A8%E5%BC%8F%E8%AF%AD%E6%B3%95%E5%88%9B%E5%BB%BA%E4%B8%8D%E5%90%8C%E7%9A%84%20beamer%20%E6%A1%86%E6%9E%B6.png)
我正在尝试让 \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}