修改 \title 而不出现递归问题

修改 \title 而不出现递归问题

编辑:更短的问题定义

定义标题为

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

相关内容