问题陈述

问题陈述

问题陈述

多年来,我一直使用以下代码自动将当前的标题插入\section作为 Beamer 框架标题,除非尚未定义任何部分 - 在这种情况下\part应该使用当前的标题。

\newcommand{\autoframetitle}{%
  \ifx\insertsection\empty%
    \insertpart%
  \else%
    \insertsection%
  \fi%
}%

随着 Beamer 最近的升级(很可能是升级到 3.50 版),上述代码在定义了 a\part但没有\section定义的情况下不再起作用。这将导致上述测试最终进入分支\else,因此将打印(空)部分标题,而不是预期的部分标题。

我正在寻找一种方法来恢复原来的预期行为。

最小(非)工作示例(MWE)

\documentclass{beamer}

\newcommand{\autoframetitle}{%
  \ifx\insertsection\empty%
    \insertpart%
  \else%
    \insertsection%
  \fi%
}%  

\begin{document}

\part{Part title}

\begin{frame}{\autoframetitle}%
   TODO: This slide should print the part title, but instead prints the (still empty) section title.
\end{frame}

\section{Section title}

\begin{frame}{\autoframetitle}%
  This slide prints (as expected) the (now no longer empty) section title.
\end{frame}

\end{document}

问题似乎与\part{}

以下第二个 MWE 表明,只要定义了 a,\ifx\insertsection\empty上述语句似乎就会产生结果。如果去掉定义,测试结果将如预期一样。FALSE\part\partTRUE

\documentclass{beamer}

\newcommand{\autoframetitle}{%
  \ifx\insertsection\empty%
    Neither part nor section defined
  \else%
    \insertsection%
  \fi%
}%  

\begin{document}

\begin{frame}{\autoframetitle}%
  This slide correctly prints "Neither part nor section defined" fallback text.
\end{frame}

\section{Section title}

\begin{frame}{\autoframetitle}%
  This slide prints (as expected) the (now no longer empty) section title.
\end{frame}

\end{document}

答案1

这不是一个解释(David 给出了一个解释),而是一种不同的方法,它etoolbox默认基于 beamer 加载。因此,你可以用以下代码替换你的代码:

\newcommand{\autoframetitle}{%
  \expandafter\ifstrempty\expandafter{\insertsection}{%
    \insertpart%
  }{%
    \insertsection%
  }%
}%

这不会显示问题。

答案2

\part定义\insertsection

\protected\def\insertsection{}

所以它为空但不\ifx等于\empty定义为

\def\empty{}

答案3

空虚的测试可以是

\if\relax\detokenize\expandafter{\insertsection}\relax
  <code when the expansion of \insertsection is empty>
\else
  <code when the expansion of \insertsection is not empty>
\fi

这将\insertsection在应用之前扩展一次\detokenize,因此扩展中的标记的性质\insertsection并不重要。

相关内容