我是 LaTeX 的新手,目前正在尝试修改.sty
以获得自己的演示风格(我经常需要制作新的演示文稿)。
我想要做的是创建一个\settitles
命令,根据我的部分和小节名称自动设置我的框架的标题和副标题。
一个简单的例子。目前我有这个代码:
\section{My first section}
\subsection{My first subsection}
\begin{frame}
\frametitle{My first section}
\framesubtitle{My first subsection}
bla-bla-bla
\end{frame}
\begin{frame}
\frametitle{My first section}
\framesubtitle{My first subsection}
bli-bli-bli
\end{frame}
\subsection{My second subsection}
\begin{frame}
\frametitle{My first section}
\framesubtitle{My second subsection}
blo-blo-blo
\end{frame}
因为我觉得这是多余的,而且我所有的框架标题都与章节和小节名称相匹配,所以我会尝试修改我的.sty
文件,这样我就可以写
\section{My first section}
\subsection{My first subsection}
\begin{frame}
\settitles
bla-bla-bla
\end{frame}
\begin{frame}
\settitles
bli-bli-bli
\end{frame}
\subsection{My second subsection}
\begin{frame}
\settitles
blo-blo-blo
\end{frame}
即使我对 LaTeX 了解不多,我也已经开始通过 Google 搜索来研究这个问题,并且我发现这个代码似乎是第一步:
\newcommand{\sectiontitle}{}
\newcommand{\newsection}[1]{\section{#1}\renewcommand{\sectiontitle}{#1}}
\newcommand{\subsectiontitle}{}
\newcommand{\newsubsection}[1]{\subsection{#1}\renewcommand{\subsectiontitle}{#1}}
我已将此代码插入到我的.sty
文件中(我有一个基于的自定义主题Rochester
,现在我可以输入
\newsection{My first section}
\newsubection{My first subsection}
\begin{frame}
\frametitle{\sectiontitle}
\framesubtitle{\subsectiontitle}
bla-bla-bla
\end{frame}
我也创建了这个命令
\newcommand{\settitles}{\frametitle{\sectiontitle} \framesubtitle{\subsectiontitle}}
我觉得我快到了,但现在我必须换成\newsection
。\section
有什么帮助吗?
答案1
\insertsectionhead
您想要做的事情只需使用and 即可完成\insertsubsectionhead
:
\newcommand\settitle{
\frametitle{\insertsectionhead}
\framesubtitle{\insertsubsectionhead}
}
现在,另一个优点是,在使用 \subsection 命令之前出现一个框架,不会产生任何字幕(见下面的示例)。完整的示例:
\documentclass{beamer}
\newcommand\settitle{
\frametitle{\insertsectionhead}
\framesubtitle{\insertsubsectionhead}
}
\begin{document}
\section{My first section}
\subsection{First subsection of the first section}
\begin{frame}
\settitle
test
\end{frame}
\subsection{Second subsection of the first section}
\begin{frame}
\settitle
test
\end{frame}
\section{My second section}
\begin{frame}
\settitle
test
\end{frame}
\subsection{First subsection of the second section}
\begin{frame}
\settitle
test
\end{frame}
\end{document}
结果:
如果要对每一帧都执行此操作,您甚至可以自动执行该过程,而不必\settile
为每个帧手动调用:
\documentclass{beamer}
\makeatletter
\def\beamer@frameenv{%
\def\beamer@process@envbody{\endgroup%
\expandafter\expandafter\expandafter\beamer@framecommand\expandafter\beamer@frameoptions\expandafter{\the\beamer@envbody}}%
\global\beamer@envbody{}\def\beamer@begin@stack{b}%
\begingroup
\let\frame\beamer@collect@@body
\def\beamer@process@envbody{\frame}%
\beamer@process@envbody%
\frametitle{\insertsectionhead}
\framesubtitle{\insertsubsectionhead}
}
\makeatother
\begin{document}
\section{My first section}
\subsection{First subsection of the first section}
\begin{frame}
test
\end{frame}
\subsection{Second subsection of the first section}
\begin{frame}
test
\end{frame}
\section{My second section}
\begin{frame}
test
\end{frame}
\subsection{First subsection of the second section}
\begin{frame}
test
\end{frame}
\end{document}
当然,在一个.sty
文件中你只能使用
\def\beamer@frameenv{%
\def\beamer@process@envbody{\endgroup%
\expandafter\expandafter\expandafter\beamer@framecommand\expandafter\beamer@frameoptions\expandafter{\the\beamer@envbody}}%
\global\beamer@envbody{}\def\beamer@begin@stack{b}%
\begingroup
\let\frame\beamer@collect@@body
\def\beamer@process@envbody{\frame}%
\beamer@process@envbody%
\frametitle{\insertsectionhead}
\framesubtitle{\insertsubsectionhead}
}
无\makeatletter
和\makeatother
。
答案2
编辑: 经过一番交流后,我决定重写我的答案:
获得所需内容的一种方法是使用hyperref
包及其namref
选项。通过它,我定义了新的变体 f 部分,其中包括自动生成的标签。它们用于定义\settitle
:
\documentclass{beamer}
\usepackage{hyperref}
\let\oldsection\section
\let\oldsubsection\subsection
\renewcommand{\section}[1]{\oldsection{#1}\label{sec:\thesection}}
\renewcommand{\subsection}[1]{\oldsubsection{#1}\label{sec:\thesubsection}}
\newcommand{\settitle}{
\frametitle{\nameref{sec:\thesection}}\framesubtitle{\nameref{sec:\thesubsection}}
}
\begin{document}
\section{My first section}
\subsection{My first subsection}
\begin{frame}\settitle
bla-bla-bla
\end{frame}
\subsection{My second subsection}
\begin{frame}\settitle
blo-blo-blo
\end{frame}
\end{document}
我希望这个解决方案足够接近您的愿望。这个解决方案有一些限制。它要求在演示文稿中不能只有部分。它应该始终跟在子部分后面,否则,对于框架,字幕将使用最后一个子部分。