Почему \insertauthor в бимере сообщает, что он непустой?

Почему \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

Вы можете почерпнуть вдохновение из бимера, например, из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 или более новую)

Связанный контент