我发现自己\begin{frame}[t]\end{frame}
一直在使用它。我为它创建宏的所有尝试都失败了。有办法吗?
答案1
如果你的目的是替代组合
\end{frame}
\begin{frame}[t]
与,说
\breakframe
那么答案是不可以。
作为beamer
实现方式,它需要先吸收完整的框架代码,然后才能处理它以制作叠加层和所有其他内容。因此 LaTeX 需要看到明确的 \end{frame}
不埋没在宏中。处理后\begin{frame}
它会向前查找,直到找到\end{frame}
正在执行的操作不宏扩展,但只是在进行过程中吸收令牌。
是的,有人可能会认为应该这样设置演示文稿
\startframes
...
\breakframe
...
\breakframe
...
\breakframe
\stopframes
但是,除非您想一口气看完整个演示,否则最后一部分应该如上所述。
这与
\begin{frame}[t]
...
\end{frame}
\begin{frame}[t]
...
\end{frame}
\begin{frame}[t]
...
\end{frame}
是否要承担重写已经运行的代码的负担?
一个好的文本编辑器可以节省你的打字和制作时间
\begin{frame}[t]
\end{frame}
按下几个键,将光标放在空白处。
答案2
如果你对底层的 LaTeX 机制不感兴趣,并且想寻找一个过于简单方法,您只需将您的命令保存到文件中(例如cmd.tex
)并向\input
其声明一个宏即可。
命令文本
\begin{frame}[t]\end{frame}
主文件
\documentclass{beamer}
\begin{document}
\newcommand{\newframe}{\input{cmd.tex}}
\newframe
\newframe
\newframe
\newframe
\end{document}
编辑:利用文件
正如其他答案所指出的那样,由于 LaTeX 的解析机制,没有简单的方法将宏定义为\end{frame}\begin{frame}[t]
。摆脱这种困境的(唯一)方法是利用文件,正如我之前指出的那样。为了支持你想要的,我们可以设计一个(疯狂的)解决方法:
- 将您的 TeX 源代码保存到
file1
. - 假设你设计的宏为
\framesep
。我们file1
逐行读取并替换\framesep
为\end{frame}\begin{frame}[t]
。结果保存为file2
。 - 读
file2
。
代码如下所示。
\documentclass{beamer}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\usepackage{xparse}
\usepackage{fancyvrb}
\usepackage{datetime2}
\begin{document}
\begin{VerbatimOut}{\jobname.myverb1}
\begin{frame}[t]
frame1
\framesep
frame2
\framesep
frame3
\end{frame}
\end{VerbatimOut}
\ExplSyntaxOn
% replace this regex...
\str_new:N \l_framesep_str
\str_set:Nn \l_framesep_str {\\framesep}
% to...
\str_new:N \l_framecmd_str
\str_set:Nn \l_framecmd_str {\\end{frame}\\begin{frame}[t]}
\ior_new:N \l_infile_ior
\ior_open:Nn \l_infile_ior {\jobname.myverb1}
\iow_new:N \l_outfile_iow
\iow_open:Nn \l_outfile_iow {\jobname.myverb2}
\cs_generate_variant:Nn \regex_replace_all:nnN {ooN}
\ior_str_map_variable:NNn \l_infile_ior \l_tmpa_str {
\regex_replace_all:ooN {\l_framesep_str} {\l_framecmd_str} \l_tmpa_str
\iow_now:Nx \l_outfile_iow {\l_tmpa_str}
}
\ior_close:N \l_infile_ior
\iow_close:N \l_outfile_iow
\ExplSyntaxOff
\input{\jobname.myverb2}
\end{document}
请注意,这也可以通过在编译 TeX 源之前调用预处理器来实现。例如,您可以让 Python 脚本先进行替换,然后调用latex
。