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.sty149行目以降:

% 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 開発バージョンで修正されており、Beamer v3.72 以降に含まれるはずです)

関連情報