编辑:更短的问题定义
定义标题为
\title[short]{long}
我以后怎么才能在标题上添加内容呢?简单的假设
\title[\insertshorttitle]{\inserttitle plus x}
显然由于递归而无法工作。我设法使用 \expandafter 获得一个仅包含完整标题的版本:
\expandafter\title\expandafter{\inserttitle plus x}
但到目前为止我还没有找到如何将短标题也包含在其中的方法。另外,在 \inserttile 之前添加内容似乎也不起作用,只有在 inserttitle 之后才起作用。
原始问题:
在我们的小组中,我们需要使用给定的 beamer 类进行演示。不幸的是,标题的垂直放置对于使用两行的标题来说很糟糕。由于我们无法修改 beamer 类本身,我们使用了一个略显粗糙的 hack,使用 vspace 将标题移动到合适的位置。
我想让这个 hack 自动化,并让其他用户能够看到。到目前为止,我已经想出了以下解决方案,可以将其包含在演示文稿的开头(例如作为包):
\newlength{\ITI@titleheight}
\newcommand{\ITI@computeheight}{...}
\newcommand{\ITI@titleoffset}{\vspace*{\ITI@titleheight}}
\g@addto@macro\beamer@lastminutepatches{\ITI@computeheight\expandafter\title\expandafter{\expandafter\ITI@titleoffset\inserttitle}}
基本上会发生以下情况:
在投影仪演示开始时,宏 \ITI@computeheight 被展开并计算偏移高度 \ITI@titleheight。我省略了宏的细节,因为它们并不重要。然后,重新定义 \title,基本上只是在前一个标题中添加了一个 \vspace 命令。
我现在的问题是,重新定义标题后,短标题就消失了。我不知道如何正确使用 \expandafter 或其他命令来使其工作。
以下代码在使用预定义的短标题(本例中为 1)时有效:
\g@addto@macro\beamer@lastminutepatches{\ITI@computeheight\expandafter\title\expandafter[\expandafter1\expandafter]\expandafter{\expandafter\ITI@titleoffset\inserttitle}}
但是当实际使用 \insertshorttitle 时,Latex 会陷入无限循环,因为它会一遍又一遍地扩展新的短标题:
\g@addto@macro\beamer@lastminutepatches{\ITI@computeheight\expandafter\title\expandafter[\expandafter\insertshorttitle\expandafter]\expandafter{\expandafter\ITI@titleoffset\inserttitle}}
答案1
存储title
在 中\inserttitle
,而shorttitle
保存在 中\beamer@shorttitle
。因此,要重新定义这两个实体,您可以直接重新定义这些命令:
\documentclass{beamer}
\begin{document}
\title[short]{long}
\author{me}
\date{Today}
\def\inserttitle{New title}
\makeatletter
\def\beamer@shorttitle{New short title}
\makeatother
\begin{frame}
\maketitle
Short title is: \insertshorttitle
\end{frame}
\end{document}
如果您希望在新的标题定义中使用旧的标题定义,您可以使用\xdef
:
\xdef\inserttitle{New title \inserttitle}
或者您可以将旧标题保存在另一个宏中并使用它
\let\oldtitle\inserttitle
\def\inserttitle{New title \oldtitle}