新的 \settitles 命令

新的 \settitles 命令

我是 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}

我希望这个解决方案足够接近您的愿望。这个解决方案有一些限制。它要求在演示文稿中不能只有部分。它应该始终跟在子部分后面,否则,对于框架,字幕将使用最后一个子部分。

在此处输入图片描述

相关内容