我遇到了一个奇怪的问题---似乎XeLaTeX
不能很好地与 配合使用beamer
。我正在使用 MacTex 2011,并使用 TexLive 实用程序更新到最新的软件包。
问题是使用 XeLaTeX 进行编译使我无法\setbeamertemplate
多次使用该命令。
举个例子,我想让两张幻灯片有不同的背景,比如一张是蓝色渐变,另一张是红色渐变。请参阅以下示例代码:
\documentclass[12 pt]{beamer}
\begin{document}
\setbeamertemplate{background canvas}[vertical shading][bottom=blue!30, top=white]
\begin{frame}[t]\frametitle{This should have a blue gradient}
Since this is the first instance of \texttt{setbeamertemplate}, it works properly.
\end{frame}
\setbeamertemplate{background canvas}[vertical shading][bottom=red!30, top=white]
\begin{frame}[t]\frametitle{This should have a red gradient}
However, if \texttt{XeLaTeX} is run, this will still show as blue.
\end{frame}
\end{document}
如果我使用 PdfLaTeX 进行编译,那么这将按预期工作。但是,如果我使用 XeLaTeX 进行编译,那么两个幻灯片都有蓝色渐变背景。第二个\setbeamertemplate{background canvas}
调用被忽略。
有人对此有什么建议或对正在发生的事情做出解释吗?
答案1
这似乎是定义上的问题pgfsysdriver-xetex
。如果你把
\def\pgfsysdriver{pgfsys-dvipdfmx.def}
在该\documentclass
行之前,您会在 MWE 上获得正确的输出。
不过,我无法保证这是否会破坏其他功能。有一件事是行不通的,那就是涉及 TikZ/pgf 的任何事情remember picture
。可能还有其他我不知道的事情不起作用。
如果确实遇到问题,另一种解决方法是使用lualatex
而不是进行编译xelatex
。
答案2
您可以尝试仅加载所需的定义,而不是使用 xelatex 加载完整的定义pgfsys-dvipdfmx.def
。例如,对于垂直阴影,定义一个计数器并复制以下定义似乎就足够了\pgfsys@vertshading
:
\documentclass[12 pt]{beamer}
\makeatletter
\newcount\pgfsys@objnum\pgfsys@objnum\@ne
\def\pgfsys@vertshading#1#2#3{%
{%
\pgf@parsefunc{#3}%
\pgfmathparse{#2}%
\pgf@process{\pgfpoint{\pgf@max}{#2}}%
\edef\@tempa{\noexpand\pgfutil@insertatbegincurrentpagefrombox{%
\special{pdf:bxobj @pgfshade\the\pgfsys@objnum\space width \pgfmathresult pt\space height \the\pgf@max}%
\special{pdf:put @resources
<<
/Shading << /Sh << /ShadingType 2
/ColorSpace /DeviceRGB
/Domain [\pgf@pdfparseddomain]
/Coords [0 \pgf@doma\space0 \pgf@domb]
/Function \pgf@pdfparsedfunction
/Extend [false false] >> >>
>>}%
\pgfsys@invoke{/Sh sh}%
\special{pdf:exobj}}}\@tempa% <<
\expandafter\xdef\csname @pgfshading#1!\endcsname{%
\hbox to\pgfmathresult pt{\vbox to\the\pgf@max{\vfil\special{pdf:uxobj @pgfshade\the\pgfsys@objnum}}\hfil}}%
}%
\global\advance\pgfsys@objnum\@ne%
}
\makeatother
....
但真正缺少的是能够并愿意整理 xetex 驱动程序文件的人。如果更新驱动程序文件,目前缺少的大多数功能(例如图形剪辑)都可以正常工作。