问题陈述
多年来,我一直使用以下代码自动将当前的标题插入\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
\part
TRUE
\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
并不重要。