帧标签中的命令,自动生成帧标签

帧标签中的命令,自动生成帧标签

投影专家,

我想知道是否有办法在框架的标签选项中添加“命令”并\includeonlyframes获得预期结果,您期望命令的“文本值”实际上会被替换?我花了很多时间(可能用了“浪费”,但我也从这些努力中学到了很多东西,所以“浪费”并不合适)来弄清楚。现在,我知道我需要征求专家的意见。我在这里展示了几个 MWE 来传达我的意思。

最大能量损失 1:

\documentclass{beamer}
\newcommand*{\MyLabelForFrameOne}{label-1}
\newcommand*{\MyLabelForFrameTwo}{label-2}
\includeonlyframes{label-1,label-2}
\begin{document}
\begin{frame}[label=label-1]{Frame 1}
$E=mc^2$
\end{frame}
\begin{frame}[label=label-2]{Frame 2}
\hyperlink{label-1}{Einstein's Mass-Energy Equivalence}%
\end{frame}
\end{document}

最大能量损失 2:

\documentclass{beamer}
\newcommand*{\MyLabelForFrameOne}{label-1}
\newcommand*{\MyLabelForFrameTwo}{label-2}
\includeonlyframes{\MyLabelForFrameOne,label-2}
\begin{document}
\begin{frame}[label=label-1]{Frame 1}
$E=mc^2$
\end{frame}
\begin{frame}[label=label-2]{Frame 2}
\hyperlink{label-1}{Einstein's Mass-Energy Equivalence}%
\end{frame}
\end{document}

最大能量损失 3:

\documentclass{beamer}
\newcommand*{\MyLabelForFrameOne}{label-1}
\newcommand*{\MyLabelForFrameTwo}{label-2}
\includeonlyframes{label-1,label-2}
\begin{document}
\begin{frame}[label=\MyLabelForFrameOne]{Frame 1}
$E=mc^2$
\end{frame}
\begin{frame}[label=label-2]{Frame 2}
\hyperlink{label-1}{Einstein's Mass-Energy Equivalence}%
\end{frame}
\end{document}

最大能量损失 4:

\documentclass{beamer}
\newcommand*{\MyLabelForFrameOne}{label-1}
\newcommand*{\MyLabelForFrameTwo}{label-2}
\includeonlyframes{\MyLabelForFrameOne,label-2}
\begin{document}
\begin{frame}[label=\MyLabelForFrameOne]{Frame 1}
$E=mc^2$
\end{frame}
\begin{frame}[label=label-2]{Frame 2}
\hyperlink{label-1}{Einstein's Mass-Energy Equivalence}%
\end{frame}
\end{document}

MWE1 给出了我期望的输出。

在 MWE2 中\includeonlyframes,我将 label-1 替换为\MyLabelForFrameOne(之前已定义为与 label-1 相同)。现在,MWE2 并未提供我期望的输出,即 MWE1 中的输出。

在 MWE3 的标签选项中,{Frame 1},我将标签 1 替换为\MyLabelForFrameOne(之前已定义为与标签 1 相同)。现在,MWE3 并没有给出我期望的输出,也就是 MWE1 中的输出。

在 MWE4 中,在\includeonlyframes{Frame 1} 的标签选项中,我将标签 1 替换为\MyLabelForFrameOne(之前已定义为与标签 1 相同)。现在,MWE4 无法提供我期望的输出,即 MWE1 中的输出。

请注意,MWE 2 和 3 不会产生与 MWE 1 和 4 相同的输出。此外,MWE 4 具有与 MWE 1 相同的输出。

似乎在框架标签和中使用命令\includeonlyframes并不总是能得到预期的结果,也就是说,命令的“文本值”并不总是“替换”到框架标签和中\includeonlyframes

实际上,我想要的远不止前面的 MWE。我希望找到一种方法来自动生成框架标签,以确保它们是唯一的。以下 MWE 可以说明我的观点。

MWE5:

\documentclass{beamer}
\newcommand*{\MyLabelForFrameZero}{label-0}
\newcommand*{\MyLabelForFrameOne}{label-1}
\newcommand*{\MyLabelForFrameTwo}{label-2}
\includeonlyframes{label-0,label-1,label-2}
\setcounter{section}{0}
\begin{document}
\begin{frame}[label=label-0]{Outline}
\arabic{section}
\\
\tableofcontents
\end{frame}
\section{Frame 1}
\begin{frame}[label=label-1]{Frame 1}
\arabic{section}
\\
$E=mc^2$
\end{frame}
\section{Frame 2}
\begin{frame}[label=label-2]{Frame 2}
\arabic{section}
\\
\hyperlink{label-1}{Einstein's Mass-Energy Equivalence}%
\end{frame}
\end{document}

最大能量值 6:

\documentclass{beamer}
\newcommand*{\MyLabelForFrameZero}{label-0}
\newcommand*{\MyLabelForFrameOne}{label-1}
\newcommand*{\MyLabelForFrameTwo}{label-2}
\includeonlyframes{label-0,label-1,label-2}
\setcounter{section}{0}
\begin{document}
\begin{frame}[label=label-\arabic{section}]{Outline}
\arabic{section}
\\
\tableofcontents
\end{frame}
\section{Frame 1}
\begin{frame}[label=label-\arabic{section}]{Frame 1}
\arabic{section}
\\
$E=mc^2$
\end{frame}
\section{Frame 2}
\begin{frame}[label=label-\arabic{section}]{Frame 2}
\arabic{section}
\\
\hyperlink{label-1}{Einstein's Mass-Energy Equivalence}%
\end{frame}
\end{document}

MWE5 给出了我期望的输出。

{Frame 1}在 MWE6 中,我将的标签选项替换label-1label-\arabic{section},其中\arabic{section}显然等于 1。在 的标签选项中{Frame 2},我将 替换label-2label-\arabic{section},其中\arabic{section}显然等于 2(从那时起计数器部分已自动增加 1)。现在,MWE6 没有给出我期望的输出,即 MWE5 中的输出。

希望我能够传达我的担忧。恳请您提供智慧和帮助。谢谢。

答案1

这里的问题是,您的宏展开得太晚,无法按预期工作。基本上,如果您给出的是宏而不是标签,则看不到其展开。相反,宏名称本身被用作标签。

这里我cmdlabel为框架定义了一个新选项,它使用宏作为标签。然后在使用 设置标签之前,先扩展该宏\setkeys。此外,宏\includeonlyframescmd被定义为使用宏作为标签名称,而不是名称本身。它只是在将所有内容传递给 之前扩展它们\includeonlyframes

注释掉的部分实现了选项autoframe,该选项可用于自动标记框架(只要给出了选项)。可以使用 来设置前缀\autolabelprefix,该前缀后附加一个连续的数字,即使用前缀,label-您可以获得标签label-1label-2等。

代码:

\documentclass[compress]{beamer}
\usetheme{AnnArbor}
%\usetheme{Dresden}
\usecolortheme{crane}

\makeatletter

% set label with automatic name
%\newcounter{autolabelcnt}
%\setcounter{autolabelcnt}{0}
%\newcommand*{\autolabelprefix}[1]{%
%    \def\autolabel@prefix{#1}%
%}
%\newcommand*{\autolabel@@setlabel}[1]{%
%    \setkeys{beamerframe}{label=#1}%
%}
%\newcommand*{\autolabel@setlabel}[1]{%
%    \expandafter\autolabel@@setlabel\expandafter{\autolabel@prefix#1}%
%}
%\define@key{beamerframe}{autolabel}[]{%
%    \stepcounter{autolabelcnt}%
%    \expandafter\autolabel@setlabel\expandafter{\the\c@autolabelcnt}%
%}

% set label with command
\newcommand*{\cmdlabel@setlabel}[1]{%
    \setkeys{beamerframe}{label=#1}%
}
\define@key{beamerframe}{cmdlabel}{%
    \expandafter\cmdlabel@setlabel\expandafter{#1}%
}
\newcommand*{\includeonlyframescmd}[1]{%
    \edef\includeonlyframes@cmd{#1}%
    \expandafter\includeonlyframes\expandafter{\includeonlyframes@cmd}%
}
\makeatother

% set prefix for automatic name
%\autolabelprefix{label-}

% set commands for labels
\newcommand*{\mylabela}{clabel-1}
\newcommand*{\mylabelb}{clabel-2}
\newcommand*{\mylabelc}{clabel-3}
\newcommand*{\mylabeld}{clabel-4}

% use automatically named labels
%\includeonlyframes{label-1,label-3}

% use commands for labels
\includeonlyframescmd{\mylabela,\mylabelc}

\begin{document}
\section{Section 1}
\subsection{Subsection 1.1}
%\begin{frame}[autolabel]{Frame 1}
\begin{frame}[cmdlabel=\mylabela]{Frame 1}
Frame 1
\end{frame}

\subsection{Subsection 1.2}
%\begin{frame}[autolabel]{Frame 2}
\begin{frame}[cmdlabel=\mylabelb]{Frame 2}
Frame 2
\end{frame}

\section{Section 2}
\subsection{Subsection 2.1}
%\begin{frame}[autolabel]{Frame 3}
\begin{frame}[cmdlabel=\mylabelc]{Frame 3}
Frame 3
\end{frame}

\subsection{Subsection 2.2}
%\begin{frame}[autolabel]{Frame 4}
\begin{frame}[cmdlabel=\mylabeld]{Frame 4}
Frame 4
\end{frame}
\end{document}

相关内容