定义一个宏来从同一源文档制作幻灯片?

定义一个宏来从同一源文档制作幻灯片?

这很草率,但有时我只是想将现有的源文档制作成包含完全相同材料的幻灯片,同时保持原始文章不变。另一个目标是对原始文档的编辑也会导致对被破解的幻灯片的更改。我想一些宏会在这里有所帮助,所以我尝试了这样的方法:

%\def\NowMakingSlides{1}

\ifdefined\NowMakingSlides
\documentclass[aspectratio=43]{beamer}
\else
\documentclass[oneside, letterpaper,12pt]{amsart}
\fi

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Controlling for whether we are hacking up some slides
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifdefined\NowMakingSlides
  \newcommand{\beginframe}[1]{\begin{frame}\frametitle{#1}}
  \newcommand{\Section}[1]{\nextframe{#1}}
  \newcommand{\stopframe}{\end{frame}}
  \newcommand{\nextframe}[1]{\stopframe\beginframe{#1}}
\else
  \newcommand{\Section}{\section}
  \newcommand{\beginframe}[1]{}
  \newcommand{\stopframe}{{}}
  \newcommand{\nextframe}[1]{{}}
\fi

\begin{document}

\beginframe{This Sentence No Verb}
I like writing equations.

\nextframe{The End}
But sometimes I have to stop, even though $e^{i\pi}+1=0$

\stopframe
\end{document}

请注意,该\Section宏应该在文章开始新章节的地方用给定的文本开始新的幻灯片标题。(类似的宏不包括在 MWE 封面subsection等中。)这大大减少了需要插入事件的位置数量nextframe,并使幻灯片标题与文章保持同步。

当我注释掉第一行时,它对于创建正常文档非常有用,但当我保留该行并显示一条File ended消息时,它就不起作用了。删除宏调用并替换我思考他们正在做的事情给了我一个可以工作的文档。进一步的调查显示stopframe宏不起作用。它出了什么问题?

答案1

你为什么不从一开始就说“我想改变 beamer 的语法,这样我就不需要明确地将文本括在框架中”? 在打印和幻灯片模式之间切换与您的抱负关系不大。所以,这是另一个答案。正如@Brian 所说,您的方法不太可能与 beamer 配合良好。您可以深入研究宏并寻找另一种方法来满足语法,但有太多不同的模式(普通框架、[fragile]框架、下的框架[ignorenonframetext]),我甚至不会尝试。

但是,beamer也会从{frame}环境中未包含文本的文本生成幻灯片——只是使用[ignorenonframetext]class 选项!您可以使用它\newpage来分隔幻灯片。有一些小问题,例如\beamer@cramped显示为未定义的命令(我通过将其设置为 来修复\relax),如果您采用这种方式,您可能会发现其他问题。我还没有彻底测试过,但它似乎或多或少地像您预期的那样工作。

很久以前我用过pdf屏幕。它更加轻量,而且您不需要将幻灯片放在任何东西中——同样,只需发出命令\newpage即可开始新的幻灯片。我有很多演示文稿都是这样写的。(当前版本提供了一个{slide}环境,但除非情况发生变化,否则您实际上不需要使用它)。所以请随意选择。

答案2

Beamer 已经提供了一个精心设计的框架,用于从同一来源生成印刷文本和幻灯片,其中一些内容相同,一些内容不同(或者如果您愿意,可以完全相同)。查看Beamer 用户指南(第四部分“创建支持材料”)。如果它还没有满足您的所有要求,那么您可以在此基础上进行构建,而不必重新设计轮子。

由于手册很长,下面是一个简化的示例,仅显示一些控制可见性的选项。它基于“启动文章模式”一节(当前手册中的第 205 页)中出现的较长示例。我刚刚添加了自定义开关\if

\newif\ifscreen
\screentrue % Toggle the mode here

\ifscreen
  \documentclass[ignorenonframetext]{beamer}
\else
  \documentclass[a4paper]{article}
  \usepackage{beamerarticle}
\fi

% Conditional package inclusions with the \mode command:
\mode<article>{\usepackage{fullpage}}
\mode<presentation>{\usetheme{Berlin}}
% everyone:
\usepackage[english]{babel}

\begin{document}
\section{Introduction}
Thanks to the \verb|ignorenonframetext| option, text outside frames is not 
shown in the presentation but will be part of the article. 

\begin{frame}
This text is part both of the article and of the presentation.

\begin{itemize}
\item This stuff is shown in both versions.
\item This too.
\only<article>{\item This particular item is only part
of the article version.}
\item<article> This text is also only part of the article.
\end{itemize}
\end{frame}
\end{document}

既然你说你想要完全相同的文本,你实际上不会关心(暂时!)所有条件可见性花哨的东西。只需将文本包裹在框架中,一切就绪了。

相关内容