为什么 beamer 的 \insertauthor 报告为非空?

为什么 beamer 的 \insertauthor 报告为非空?

我正在开发一个 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 或更新版本中)

相关内容