Por que \insertauthor do beamer é relatado como não vazio?

Por que \insertauthor do beamer é relatado como não vazio?

Estou trabalhando em um tema beamer no qual cada um dos elementos da página de título é opcional; por exemplo, não quero que a definição de uma data vazia produza um grande espaço vazio no slide de título. Achei que poderia fazer isso envolvendo o layout de cada elemento em uma condicional como esta:

\ifx\insertdate\empty%
\else
   ...
   \insertdate
   \vskip{1em}
   ...
\fi

E esse padrão funciona conforme o esperado... exceto para o autor. Por alguma razão, \ifx\insertauthor\emptynunca parece ser avaliado como true, ao contrário dos outros elementos da página de título:

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

Por que é isso? Existe alguma solução alternativa que me permita testar um autor vazio?

Responder1

O texto de definição de \insertauthornão está vazio, o que é bastante óbvio, porque a macro pretende fazer algo com dados que já deveriam ter sido fornecidos.

De beamerbasetitle.sty, linha 149 e seguintes:

% 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%
}

Portanto, quando você especifica \author(com ou sem o argumento opcional), \insertauthorestá definido (e não vazio). Já que na linha 173 encontramos

\author{}

deduzimos que \insertauthoré inicializado e nunca fica vazio no início de um beamertrabalho.

Você provavelmente será melhor atendido testando \beamer@shortauthor, que estará realmente vazio no início de um trabalho, até que outro \authorcomando apareça.

\documentclass{beamer}
\author{}
\date{}
\begin{document}

\makeatletter
\ifx\beamer@shortauthor\empty
  empty
\else
  nonempty
\fi
\makeatother

\end{document}

Responder2

Você pode se inspirar no beamer, por exemplo, emhttps://github.com/josephwright/beamer/blob/1b04c51a596a51530adeff278ca2c43aa963c9b1/base/themes/inner/beamerinnerthemeinmargin.sty#L68-L74e replique este teste. Isso tem a vantagem de que os nomes dos autores serão impressos na página de título, mesmo que seus usuários escolham um autor curto vazio:

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

(houve um problema para usuários da usepdftitle=falseopção de classe, isso já está corrigido na versão dev do beamer e deve ser incluído no beamer v3.72 ou mais recente)

informação relacionada