我们可以为 \begin{frame}[t]\end{frame} 制作一个宏吗?

我们可以为 \begin{frame}[t]\end{frame} 制作一个宏吗?

我发现自己\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]。摆脱这种困境的(唯一)方法是利用文件,正如我之前指出的那样。为了支持你想要的,我们可以设计一个(疯狂的)解决方法:

  1. 将您的 TeX 源代码保存到file1.
  2. 假设你设计的宏为\framesep。我们file1逐行读取并替换\framesep\end{frame}\begin{frame}[t]。结果保存为file2
  3. 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

相关内容