我想知道为什么在没有 framesubtitle 内容的情况下,这个最小的例子表现不佳……
\documentclass[t]{beamer}
\setbeamertemplate{frametitle}{%
\nointerlineskip%
\begin{beamercolorbox}[wd=\paperwidth,ht=3.75ex,left]{frametitle}%
\hspace*{2ex}\strut{\insertframetitle}\strut
\ifx\insertframesubtitle\@empty%
\else
{%\usebeamerfont{framesubtitle}%
\usebeamercolor[fg]{framesubtitle}%
\strut{ - \insertframesubtitle}\strut\par}%
\fi
\vskip-1ex
\end{beamercolorbox}}
\begin{document}
\begin{frame}{Frame title}{frame subtitle}
\end{frame}
\begin{frame}{Frame Title}
\end{frame}
\end{document}
答案1
相反,在条件中\@empty
使用:\empty
\ifx
\documentclass[t]{beamer}
\setbeamertemplate{frametitle}{%
\nointerlineskip%
\begin{beamercolorbox}[wd=\paperwidth,ht=3.75ex,left]{frametitle}%
\hspace*{2ex}\strut{\insertframetitle}\strut
\ifx\insertframesubtitle\empty%
\else
{%\usebeamerfont{framesubtitle}%
\usebeamercolor[fg]{framesubtitle}%
\strut{ - \insertframesubtitle}\strut\par}%
\fi
\vskip-1ex
\end{beamercolorbox}}
\begin{document}
\begin{frame}{Frame title}{frame subtitle}
\end{frame}
\begin{frame}{Frame Title}
\end{frame}
\end{document}
顺便说一句,当@
在文件中使用包含字符的命令时.tex
,您应该使用\makeatletter
, \makeatother
(但在这种情况下,没有必要,因为您的定义不会包含这个字符);此外,使用\@empty
和添加\makeatletter
,\makeatother
也不会产生预期的结果;我只是想提一下,@
在控制序列名称中使用需要注意\makeatleter
, \makeatother
。