![Beamer 主题使用 pgfkeys 将选项传递到内/外主题](https://linux22.com/image/381914/Beamer%20%E4%B8%BB%E9%A2%98%E4%BD%BF%E7%94%A8%20pgfkeys%20%E5%B0%86%E9%80%89%E9%A1%B9%E4%BC%A0%E9%80%92%E5%88%B0%E5%86%85%2F%E5%A4%96%E4%B8%BB%E9%A2%98.png)
我想设计自己的 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}