\insertshortpart 永远不会为空?

\insertshortpart 永远不会为空?

我想\insertshortpart在 Beamer 主题中使用(以及一些周围字符),但前提是实际上只有一小段可用。但是,如果我尝试使用来检查是否为空,结果\ifx...\empty发现此表达式永远不成立。

这是一个简单的例子:

\documentclass{beamer}
\begin{document}
\begin{frame}
\ifx\insertpart\empty
empty part
\else
non-empty part
\fi

\ifx\insertshortpart\empty
empty short part
\else
non-empty short part
\fi
\end{frame}
\end{document}

其结果是“空部分”和“非空短部分”。

我如何检查短的部分是否确实是空的?

我对 、和 也遇到过类似的问题\insertshortdate,我可以通过分别使用、和来解决。但是,对于 ,我找不到替代品。\insertshorttitle\insertshortsubtitle\beamer@shortdate\beamer@shorttitle\beamer@shortsubtitle\insertshortpart

\empty顺便问一下,和有什么区别\@empty?在我的样式文件中,两者似乎都可以工作...

答案1

短部件名称存储在中,但在发出命令\beamer@partnameshort之前未定义。\part

以下是一个测试:

\documentclass{beamer}

\makeatletter
\newcommand{\ifemptyshortpart}{%
  \@ifundefined{beamer@partnameshort}
    {\@firstoftwo}
    {\ifx\beamer@partnameshort\@empty
       \expandafter\@firstoftwo
     \else
       \expandafter\@secondoftwo
     \fi}}
\makeatother


\begin{document}

\ifemptyshortpart{\typeout{EMPTY}}{\typeout{NON EMPTY}}

\part[Short]{Long}
\ifemptyshortpart{\typeout{EMPTY}}{\typeout{NON EMPTY}}

\part[]{Long}
\ifemptyshortpart{\typeout{EMPTY}}{\typeout{NON EMPTY}}

\part{Long}
\ifemptyshortpart{\typeout{EMPTY}}{\typeout{NON EMPTY}}

\end{document}

终端上的输出是

EMPTY
NON EMPTY
EMPTY
NON EMPTY

\part请注意,仅当未发出任何命令或\part发出的命令带有明确的空可选参数时,才会返回空。否则beamer将存储在\beamer@partnameshort长版本中。

\ifemptyshortpart命令后面应该跟着“true”和“false”分支:

\ifemptyshortpart{short part is empty}{short part is non empty}

答案2

如果你添加

\show\insertshortpart

你会看到它的定义是

> \insertshortpart=macro:
->\@protected@testopt \insertshortpart \\insertshortpart {}.

\@empty即使不产生文本,其定义也不同。

您可以在开始时抓住这个定义并在测试中使用它:

\documentclass{beamer}
\let\origiginsertshortpart\insertshortpart
\begin{document}
\begin{frame}
%\show\insertpart
\ifx\insertpart\empty
empty part
\else
non-empty part
\fi

%\show\insertshortpart
\ifx\insertshortpart\origiginsertshortpart
empty short part
\else
non-empty short part
\fi
\end{frame}
\end{document}

相关内容