投影专家,
我想知道是否有办法在框架的标签选项中添加“命令”并\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-1
为label-\arabic{section}
,其中\arabic{section}
显然等于 1。在 的标签选项中{Frame 2}
,我将 替换label-2
为label-\arabic{section}
,其中\arabic{section}
显然等于 2(从那时起计数器部分已自动增加 1)。现在,MWE6 没有给出我期望的输出,即 MWE5 中的输出。
希望我能够传达我的担忧。恳请您提供智慧和帮助。谢谢。
答案1
这里的问题是,您的宏展开得太晚,无法按预期工作。基本上,如果您给出的是宏而不是标签,则看不到其展开。相反,宏名称本身被用作标签。
这里我cmdlabel
为框架定义了一个新选项,它使用宏作为标签。然后在使用 设置标签之前,先扩展该宏\setkeys
。此外,宏\includeonlyframescmd
被定义为使用宏作为标签名称,而不是名称本身。它只是在将所有内容传递给 之前扩展它们\includeonlyframes
。
注释掉的部分实现了选项autoframe
,该选项可用于自动标记框架(只要给出了选项)。可以使用 来设置前缀\autolabelprefix
,该前缀后附加一个连续的数字,即使用前缀,label-
您可以获得标签label-1
、label-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}