如何使 beamer 的 \insertauthor 全部大写?

如何使 beamer 的 \insertauthor 全部大写?

因此我最终能够为这个创建一个 MWE:

我正在创建自己的 beamer 样式,其中有些区域的所有文本都应该是大写的。对于所有 FOO 来说,使用\MakeUppercasebeamer 类的宏\insertFOO都是有问题的,因为事物展开的顺序……他们这么说。关于这个主题有几个问题,解决方案都包括以下形式的构造

\expandafter\MakeUppercase\expandafter{all caps stuff}

这对我有点用。

\expandafter\MakeUppercase\expandafter{\insertdate \inserttitle}

它完全按照我想要的方式工作,但是

\expandafter\MakeUppercase\expandafter{\insertdate \inserttitle \insertauthor}

不。一个相当简单的非工作示例是:

\documentclass{beamer}

\defbeamertemplate*{title page}{myway}[1][]{%
        \expandafter\MakeUppercase\expandafter{%the expandafterblock
           \insertdate
           \inserttitle
           \insertauthor
        }
}

\title{Some Title}
\author{My Name}
\date{\today}

\begin{document}
\begin{frame}[plain]\titlepage\end{frame}
\end{document}

此代码将失败

\insertauthor ->\def \inst
                       {\beamer@insttitle }\def \and {\beamer@andtitle }...

\insertauthor由于位于 内,因此会失败the expandafterblock。通过删除\insertauthor或将其放置在 外the expandafterblock,此代码将可以编译。

\insertauthor与其他 beamer 宏相比,它的行为似乎很独特\insert。如果我不得不猜测,我会将问题归结为这样一个事实:您可以通过在作者姓名前加上前缀来将作者归因于机构(如果存在)\inst[<number>]。所以问题是:

我怎样才能\insertauthor在标题页上换行,使作者的名字大写?

附言:我找到的所有与这个问题有关的问题都只与标题有关,或者与 Beamer 类无关。由于 Beamer 类\insertauthor似乎是一个特例,因此我相当肯定这不是重复的。


更新/结局

虽然我还没能真正解决这个问题,但我找到了一个可行的解决方法,那就是用下面的代码替换\expandafter\MakeUppercase\expandafter原来的结构:

\fontspec{Our Sans Serif Font}[Letters=UppercaseSmallCaps,Scale=1.1]\scshape

不理想,但可以接受。真正的解决方案是遵循 Ulrike 的建议,创建一个字体,该字体也具有/使用大写字母作为小写字母。虽然 fontspec 非常强大,但它无法让我简单地让 *TeX 使用大写字母作为任何输入字母。在我看来,一个好的解决方案是将这个技巧教给 fontspec。

答案1

如果您只是使用\insertdate\inserttitle,则不需要\expandafter,因为\MakeUppercase对其参数进行了完全(受保护的)扩展。

但是,\inserttitle与其他两个宏完全不同。实际上,\insertdate扩展为\today(通常是为 给出的参数\date),类似地,\inserttitle扩展为 给出的参数\title

另一方面,的展开\insertauthor

\def\inst{\beamer@insttitle}\def\and{\beamer@andtitle}My Name

\MakeUppercase会使人窒息。

我们可以修补\author命令,或者更确切地说,修补被调用的内部命令,以便它\insertauthor以更安全的方式定义。但请注意,如果有多个作者,您的模板肯定会中断。

\documentclass{beamer}
\usepackage{etoolbox}

\makeatletter
\newrobustcmd{\titlepreliminaries}{%
  \def\inst{\beamer@insttitle}%
  \def\and{\beamer@andtitle}%
}
\patchcmd{\beamer@author}
  {\def\inst{\beamer@insttitle}\def\and{\beamer@andtitle}}
  {\titlepreliminaries}
  {}{}
\makeatother

\defbeamertemplate*{title page}{myway}[1][]{%
   \MakeUppercase{\insertdate}\\
   \MakeUppercase{\inserttitle}\\
   \MakeUppercase{\insertauthor}
}

\title{Some Title}
\author{My Name}
\date{\today}

\begin{document}
\begin{frame}[plain]\titlepage\end{frame}
\end{document}

在此处输入图片描述

Gonzalo Medina 提出了另一个补丁,

\makeatletter
\patchcmd{\beamer@author}
  {\def\and{\beamer@andtitle}#2}
  {\def\and{\beamer@andtitle}\MakeUppercase{#2}}
  {}{}
\makeatother
\defbeamertemplate*{title page}{myway}[1][]{%
  \MakeUppercase{\insertdate}\\
  \MakeUppercase{\inserttitle}\\
  \insert‌​author
}

这允许多个作者,但缺点是作者姓名在出现的其他地方也将被排版为大写。

相关内容