我有以下beamer
介绍:
\documentclass{beamer}
\usepackage{hyperref}
\title{%
\parbox{.25\textwidth}{funny}%
\parbox{.5\textwidth}{Real Title}%
\parbox{.25\textwidth}{stuff}}
\hypersetup{pdftitle={Real Title}}
\begin{document}
Hello, World!
\end{document}
并且无论我尝试什么(例如,删除hyperref
和使用\pdfinfo
),标题总是以的整个 ASCII 部分出现\title
,减去控制序列:
.25 有趣.5 真实标题.25 内容
有没有办法绝对地仅使用 LaTeX 设置 PDF 的标题?(我知道元数据编辑器存在,但在某些思路中这可能被认为是一个错误。)
我应该指出,该问题在 中无法重现article
。
答案1
您可以使用\texorpdfstring
:
\documentclass{beamer}
\title{%
\texorpdfstring{\parbox{.25\textwidth}{funny}%
\parbox{.5\textwidth}{Real Title}%
\parbox{.25\textwidth}{stuff}}{Real Title}}
\begin{document}
Hello, World!
\end{document}
由于某些主题在其他地方使用标题(例如在脚注中),因此使用可选参数也是一个好主意,因此将选择该参数来在脚注中显示标题:
\documentclass{beamer}
\title[Title]{%
\texorpdfstring{\parbox{.25\textwidth}{funny}%
\parbox{.5\textwidth}{Real Title}%
\parbox{.25\textwidth}{stuff}}{Real Title}}
\begin{document}
Hello, World!
\end{document}
顺便说一句,无需hyperref
加载beamer
。
作为马修·林冈在评论中提到,更明智的方法是修改标题的构建方式。在下面的例子中,我修改了模板,在标题字段中title page
使用三个参数插入信息。该命令接收三个强制参数:第一个和第三个将用于侧面es,第二个将用于标题;还有一个可选参数,可用于将可选参数传递给:\parboxes
\triplebox
\parbox
\title
\documentclass{beamer}
\def\insertfirst{}
\def\insertsecond{}
\makeatletter
\defbeamertemplate*{title page}{mydefault}[1][]
{
\vbox{}
\vfill
\begin{centering}
\begin{beamercolorbox}[sep=0pt,center,#1]{title}
\usebeamerfont{title}%
\parbox{.25\linewidth}{\centering\insertfirst}%
\parbox{0.5\linewidth}{\centering\inserttitle}%
\parbox{.25\linewidth}{\centering\insertsecond}\par%
\ifx\insertsubtitle\@empty%
\else%
\vskip0.25em%
{\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}\insertsubtitle\par}%
\fi%
\end{beamercolorbox}%
\vskip1em\par
\begin{beamercolorbox}[sep=8pt,center,#1]{author}
\usebeamerfont{author}\insertauthor
\end{beamercolorbox}
\begin{beamercolorbox}[sep=8pt,center,#1]{institute}
\usebeamerfont{institute}\insertinstitute
\end{beamercolorbox}
\begin{beamercolorbox}[sep=8pt,center,#1]{date}
\usebeamerfont{date}\insertdate
\end{beamercolorbox}\vskip0.5em
{\usebeamercolor[fg]{titlegraphic}\inserttitlegraphic\par}
\end{centering}
\vfill
}
\makeatother
\newcommand\triplebox[4][]{%
\gdef\insertfirst{#2}\gdef\insertsecond{#4}\title[]{#3}
}
\triplebox{funny}{Real Title}{stuff}
\author{Author}
\institute{Institute}
\begin{document}
\begin{frame}
\maketitle
\end{frame}
\end{document}
答案2
我想我是在回答一个更广泛的问题“我如何改变 beamer 中标题的显示?”。我在评论中说,我认为“正确的方法”是改变格式化宏(即\maketitle
),而不是元数据声明宏(即\title
)。
这是一个例子。解释如下。
\documentclass{beamer}
\usepackage{etoolbox}
\usetheme{AnnArbor}
\title{Real Title}
\makeatletter
\addtobeamertemplate{title page}{%
\let\beamerorig@inserttitle\inserttitle%
\renewcommand{\inserttitle}{%
\makebox[0.20\textwidth][c]{funny}
\makebox[0.5 \textwidth][c]{\beamerorig@inserttitle}
\makebox[0.20\textwidth][c]{stuff}
}
}{}
\makeatother
\begin{document}
\begin{frame}
\maketitle
Hello, World!
\end{frame}
\end{document}
我使用了花哨的AnnArbor
主题,因此您可以看到页脚中的“真实标题”的显示不受影响。
标题宏(我用 找到的grep
)位于beamerbasetitle.sty
:
\def\maketitle{\ifbeamer@inframe\titlepage\else\frame{\titlepage}\fi}
%...
\def\titlepage{\usebeamertemplate*{title page}\@thanks}
我们看到,为了灵活性,\maketitle
使用了 beamer 的模板系统。title page
模板通常在内主题。下面是来自beamerinnerthemedefault.sty
(同样,用 找到的grep
):
\defbeamertemplate*{title page}{default}[1][]
{
\vbox{}
\vfill
\begin{centering}
\begin{beamercolorbox}[sep=8pt,center,#1]{title}
\usebeamerfont{title}\inserttitle\par%
\ifx\insertsubtitle\@empty%
\else%
\vskip0.25em%
{\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}\insertsubtitle\par}%
\fi%
\end{beamercolorbox}%
\vskip1em\par
\begin{beamercolorbox}[sep=8pt,center,#1]{author}
\usebeamerfont{author}\insertauthor
\end{beamercolorbox}
\begin{beamercolorbox}[sep=8pt,center,#1]{institute}
\usebeamerfont{institute}\insertinstitute
\end{beamercolorbox}
\begin{beamercolorbox}[sep=8pt,center,#1]{date}
\usebeamerfont{date}\insertdate
\end{beamercolorbox}\vskip0.5em
{\usebeamercolor[fg]{titlegraphic}\inserttitlegraphic\par}
\end{centering}
\vfill
}
环境内部的部分{beamercolorbox}[...]{title}
是标题所在。此时,您必须决定是否要使用 创建一个新title page
模板\defbeamertemplate
,该模板与该模板类似,但在标题 beamercolorbox 内部有所改动,并使用 调用它\usebeamertemplate
,或者破解显示标题的方式\inserttitle
。我选择了后者,因为 (a) 您不必知道使用了哪个模板,并且 (b) beamer 提供了本地修改模板的命令。
因此我的代码使用命令的补丁\addtobeamertemplate
来预先加载当前title page
模板(无论使用哪个模板)\inserttitle
。但是,您希望实际显示的标题应该放在那里。