Beamer 主题使用 pgfkeys 将选项传递到内/外主题

Beamer 主题使用 pgfkeys 将选项传递到内/外主题

我想设计自己的 Beamer 主题,并将主题分为内部主题和外部主题。外部主题可以采用一些选项。所以基本上,我希望能够编写

\usetheme[some options]{MyFancyTheme}

在我的 LaTeX 文件中。然后,主主题文件应加载内部和外部主题并将选项传递给主题。我认为这就是大都市主题可以。但是,我无法使用 pgfkeys 在我的代码中让它工作。以下是我的尝试:

\documentclass{beamer}
\usepackage{filecontents}
%
% File B.sty
%
\begin{filecontents}{B.sty}
\ProvidesPackage{B}
\RequirePackage{pgfopts}
%
\pgfkeys{
    /myPkg/B/.cd,
    wB/.code={\setlength{\yyy}{#1}},
    wB/.default={1cm}
}
\newlength{\yyy}
\ProcessPgfPackageOptions{/myPkg/B}
\useoutertheme[right, hideallsubsections, height=1cm, width=\yyy]{sidebar}
\end{filecontents}
%
% File A.sty (depends on B.sty)
%
\begin{filecontents}{A.sty}
\ProvidesPackage{A}
\RequirePackage{pgfopts}
%
\pgfkeys{
    /myPkg/.cd,
    .search also={/myPkg/B},
    wA/.code={\setlength{\xxx}{#1}},
    wA/.default={1cm}
}
\RequirePackage{B}
\newlength{\xxx}
\ProcessPgfPackageOptions{/myPkg}
%\useoutertheme[right, hideallsubsections, height=1cm, width=\xxx]{sidebar}
\end{filecontents}
%
\usepackage[wB=2cm]{A} % This is not working
% \usepackage[wB=2cm]{B} % This is working as expected
\usepackage{xcolor}
%
\setbeamercolor{sidebar right}{bg=green}
\begin{document}
\begin{frame}
X
\end{frame}
\end{document}

直接加载 B 是可行的。我可以控制侧边栏的宽度。加载 A(然后加载 B)不起作用。选项 wB 被忽略了。那么我必须更改什么才能\usepackage[wB=2cm]{A}更改侧边栏的宽度?问题似乎是选项没有正确转发。如果我​​在 A.sty 中设置外部主题,它就可以正常工作。

答案1

您可以使用 beamer 的机制将选项传递给外部/内部主题:

\documentclass{beamer}

\usepackage{filecontents}

%
% outer theme
%
\begin{filecontents*}{beamerouterthemeMyFancy.sty}
    \DeclareOptionBeamer{wB}{\def\beamer@MyFancy@wB{#1}}
    \ExecuteOptionsBeamer{wB=1cm} % default value
    \ProcessOptionsBeamer
    \useoutertheme[right, hideallsubsections, height=1cm, width=\beamer@MyFancy@wB]{sidebar}
\end{filecontents*}

%
% main theme
%
\begin{filecontents*}{beamerthemeMyFancy.sty}
    \DeclareOptionBeamer{wB}{
        \PassOptionsToPackage{wB=#1}{beamerouterthemeMyFancy}
    }
    \ProcessOptionsBeamer
    \useoutertheme{MyFancy}
\end{filecontents*}

\usetheme[
    wB=3cm
]{MyFancy} 

\setbeamercolor{sidebar right}{bg=green}

\begin{document}
\begin{frame}
X
\end{frame}
\end{document}

答案2

我觉得你的代码不起作用并不奇怪。你所做的只是设置一个长度。beamer 怎么知道该如何处理它呢?当然,如果你加载了包,那么代码就会按照相应的指令运行,这就是它起作用的原因B。为了解决这个问题,我建议让代码真正执行所需的操作。我猜@samcarter 的回答是更为合适的方法。

\documentclass{beamer}
\usepackage{filecontents}
%
% File B.sty
%
\begin{filecontents}{B.sty}
\ProvidesPackage{B}
\RequirePackage{pgfopts}
%
\pgfkeys{
    /myPkg/B/.cd,
    wB/.code={\useoutertheme[right, hideallsubsections, height=1cm, width=#1]{sidebar}},
    wB/.default={1cm}
}
\ProcessPgfPackageOptions{/myPkg/B}

\end{filecontents}
%
% File A.sty (depends on B.sty)
%
\begin{filecontents}{A.sty}
\ProvidesPackage{A}
\RequirePackage{pgfopts}
%
\pgfkeys{
    /myPkg/.cd,
    .search also={/myPkg/B},
    wA/.code={\useoutertheme[right, hideallsubsections, height=1cm, width=#1]{sidebar}},
    wA/.default={1cm}
}
\RequirePackage{B}
\ProcessPgfPackageOptions{/myPkg}
%\useoutertheme[right, hideallsubsections, height=1cm, width=\xxx]{sidebar}
\end{filecontents}
%
\usepackage[wB=2cm]{A} % This is now working
% \usepackage[wB=2cm]{B} % This is working as expected
\usepackage{xcolor}
%
\setbeamercolor{sidebar right}{bg=green}
\begin{document}
\begin{frame}
X
\end{frame}
\end{document}

在此处输入图片描述

相关内容