因此我最终能够为这个创建一个 MWE:
我正在创建自己的 beamer 样式,其中有些区域的所有文本都应该是大写的。对于所有 FOO 来说,使用\MakeUppercase
beamer 类的宏\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}\\
\insertauthor
}
这允许多个作者,但缺点是作者姓名在出现的其他地方也将被排版为大写。