我有一个要输出作者姓名的脚注,但不传递作者姓名是完全合法的,因此宏\insertshortauthor
可以为空。问题是我们|
在模板中使用它来分隔数据字段,因此我需要知道该字段是否实际打印了某些内容。
据我了解,该\beamer@shortauthor
宏仅在被调用之后才定义\author
,至少我没有看到它在外面定义beamerbasetitle.sty
,它的内容为:
\def\author{\@dblarg\beamer@author}
\long\def\beamer@author[#1]#2{%
\def\insertauthor{\def\inst{\beamer@insttitle}\def\and{\beamer@andtitle}#2}%
\def\beamer@shortauthor{#1}%
\ifbeamer@autopdfinfo%
\def\beamer@andstripped{}%
\beamer@stripands#2 \and\relax
{\let\inst=\@gobble\let\thanks=\@gobble\def\and{, }\hypersetup{pdfauthor={\beamer@andstripped}}}
\fi%
}
因此我不明白为什么我不能直接检查是否\beamer@shortauthor
已定义。至少我的 MWE 是这样的:
\documentclass{beamer}
\makeatletter
\setbeamertemplate{footline}{\ifdefined\beamer@shortauthor\insertshortauthor~|~\else No author given\fi Some more information}
\makeatother
\begin{document}
\frame{No author given yet, footline should say so but does not}
\author{Author}
\frame{Author given now, footline is good}
\end{document}
无法按预期工作,\ifdefined
不认为\beamer@shortauthor
是未定义的。如何检查是否有简短的作者,以决定是否需要输出~|~
?
答案1
请注意,第 167 行beamerbasetitle.sty
包含\author{}
,因此\beamer@shortauthor
始终有定义并且最初为空,并且可以/应该测试是否\author{...}
使用了有意义的\ifx\beamer@shortauthor\@empty
。
以下示例输出
- 第一帧显示“没有作者提供更多信息”,并且
- 第二帧上显示“作者 | 更多信息”。
\documentclass{beamer}
\makeatletter
\setbeamertemplate{footline}{%
\ifx\beamer@shortauthor\@empty
No author given
\else
\leavevmode\insertshortauthor~|~%
\fi
Some more information%
}
\makeatother
\begin{document}
\frame{No author given yet, footline should say so but does not}
\author{Author}
\frame{Author given now, footline is good}
\end{document}