\makeatletter 解释

\makeatletter 解释

我在我的 beamer 文档中使用了以下代码来使框架标题出现在目录中:

\documentclass{beamer}
\usetheme{default}
\usepackage{bookmark}
\usepackage{etoolbox}
\usepackage{graphicx}

\makeatletter
\apptocmd{\beamer@@frametitle}{
  \addtocontents{toc}
{\protect\beamer@subsectionintoc{\the\c@section}{0}{#1}
    {\the\c@page}{\the\c@part}
    {\the\beamer@tocsectionnumber}}
    \bookmark[page=\the\c@page,level=3]{#1}}
  {\message{** patching of \string\beamer@@frametitle succeeded **}}%
  {\message{** patching of \string\beamer@@frametitle failed **}}%
\makeatother

\begin{document}
\begin{frame}[label=toc]{Table of Contents}
    \tableofcontents
    \end{frame}
\section{First Section}  
\begin{frame}{One} 
    content
\end{frame} 
\section{Second Section}
\begin{frame}{Two} 
    Content 
\end{frame} 
    \section{Third Section}
    \begin{frame}{Three} 
    Content 
    \end{frame}
\end{document}

我想要做的是了解解决方案的作用,因为我现在想将块标题添加到目录中以及框架标题中,我想如果我理解代码,这将是一个很容易添加的功能。请帮助重写代码(如果可能),不使用\makeatletter替换命令,而是使用其他 latex 命令。

以下是一些相关文章:

使用 beamer 使每一帧(不是幻灯片)都出现在 PDF 书签中

\makeatletter 和 \makeatother 起什么作用?

答案1

\makeatletter

这是在 ( @) 字母处制作的。即:允许\c@page成为带有名称部分名称的命令c@page@在正常文档代码中,它将被解析为命令 \c标点符号@,然后是要排版的正常字母page

\apptocmd

这是来自etoolbox包的命令,它将额外的代码应用(结束)到命令中。

 {\beamer@@frametitle}

这是正在修改的 beamer 命令。

  {
  \addtocontents{toc}
{\protect\beamer@subsectionintoc{\the\c@section}{0}{#1}
    {\the\c@page}{\the\c@part}
    {\the\beamer@tocsectionnumber}}
    \bookmark[page=\the\c@page,level=3]{#1}}

\addtocontents将指定的行添加到目录中,通过将其修补到 beamer frame title 命令,这将在每一帧中自动发生。

  {\message{** patching of \string\beamer@@frametitle succeeded **}}%
  {\message{** patching of \string\beamer@@frametitle failed **}}%

etoolbox命令允许您指定在发现命令被修改或未被修改的情况下运行的附加代码。此处这仅用于给出适当的消息。

\makeatother

放回@标点符号,以便无法访问内部命令。

答案2

这里有几个嵌套的完全不同的球类运动,所以我怀疑有人能满足你的饥饿感。在真正理解这些运动之前,你真的有很多功课要读。

以下是代码的概念性简化。

\makeatletter

\makeatother

这在链接的问题中有所解释,这是最不难解释的部分。命令应该读作使@角色成为类别的成员使@角色成为类别的成员其他这样我们就可以安全地在宏中使用 @。认真地阅读链接的问题,以便公正地对待

\apptocmd{which command}{what to append}{do if it looks like success}{do if it fails}

附加到命令是 monster 包的成员etoolbox,没有简单的解释。你可以查看它的手册。它修改、修补、附加等许多其他强大工具中的现有命令。在这里,它搜索命令,\beamer@@frametitle然后将给定的代码添加到该命令定义的末尾。

\addtocontents{toc}
{\protect\beamer@subsectionintoc{\the\c@section}{0}{#1}
    {\the\c@page}{\the\c@part}
    {\the\beamer@tocsectionnumber}}

大卫的速度更快(令人惊讶),但这里还有更多的活力。

\addtocontents{where to add}{what to add}

将给定的第二个参数添加到目录中。添加的代码是修改后的subsection in toc模板。有关说明,请参阅 beamer 手册。然后,为了使目录项超链接以跳转到该幻灯片,通过以下方式为每个项目添加书签

\bookmark[page=\the\c@page,level=3]{#1}}

相关内容