我正在开发一个 beamer 主题,其中每个标题页元素都是可选的;例如,我不希望定义一个空日期以在标题幻灯片上产生很大的空白空间。我想我可以通过将每个元素的布局包装在条件中来实现这一点,如下所示:
\ifx\insertdate\empty%
\else
...
\insertdate
\vskip{1em}
...
\fi
这种模式正如预期的那样工作……除了作者。无论出于什么原因,\ifx\insertauthor\empty
似乎永远不会被评估为true
,与其他标题页元素不同:
\documentclass{beamer}
\author{}
\date{}
\begin{document}
\ifx\insertauthor\empty
empty
\else
nonempty
\fi
% outputs "nonempty"
\ifx\insertdate\empty
empty
\else
nonempty
\fi
% outputs "empty"
\end{document}
这是为什么?有没有什么解决方法可以让我测试空作者?
答案1
的定义文本\insertauthor
不为空,这很明显,因为宏旨在对应该已经给出的数据执行某些操作。
来自beamerbasetitle.sty
,第 149 行及以下:
% The \author command
%
%
\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%
}
因此,当您指定\author
(带或不带可选参数)时,\insertauthor
是定义的(并且不为空)。因为在第 173 行我们发现
\author{}
我们推断,\insertauthor
在工作开始时它已被初始化并且永远不会为空beamer
。
您可能更愿意进行测试\beamer@shortauthor
,它在作业开始时确实为空,直到\author
出现另一个命令。
\documentclass{beamer}
\author{}
\date{}
\begin{document}
\makeatletter
\ifx\beamer@shortauthor\empty
empty
\else
nonempty
\fi
\makeatother
\end{document}
答案2
你可以从 beamer 中获取一些灵感,例如https://github.com/josephwright/beamer/blob/1b04c51a596a51530adeff278ca2c43aa963c9b1/base/themes/inner/beamerinnerthemeinmargin.sty#L68-L74并重复此测试。这样做的好处是,即使用户选择空的简短作者,作者姓名也会打印在标题页上:
\documentclass{beamer}
\author[]{test}
\date{}
\begin{document}
\makeatletter
\expandafter\ifblank\expandafter{\beamer@andstripped}{
empty
}{%
nonempty
}
\makeatother
\ifx\insertdate\empty
empty
\else
nonempty
\fi
% outputs "empty"
\end{document}
(对于使用类选项的用户来说,这是一个问题usepdftitle=false
,该问题已在 beamer dev 版本中修复,并且应包含在 beamer v3.72 或更新版本中)