Beamer 标题中的有趣内容不可挽回地扰乱了 PDF 元数据

Beamer 标题中的有趣内容不可挽回地扰乱了 PDF 元数据

我有以下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。但是,您希望实际显示的标题应该放在那里。

相关内容