為什麼 beamer 的 \insertauthor 報告為非空?

為什麼 beamer 的 \insertauthor 報告為非空?

我正在開發一個投影機主題,其中每個標題頁元素都是可選的;例如,我不想定義一個空日期來在標題投影片上產生一個大的空白區域。我想我可以透過將每個元素的佈局包裝在條件中來做到這一點,如下所示:

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

(class 選項的使用者有一個問題usepdftitle=false,該問題已在 Beamer 開發版本中修復,應包含在 Beamer v3.72 或更高版本中)

相關內容