我想\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}