如何将文档类选项传递给 beamer 主题?
我正在编写一个 beamer 主题。我想使用 beamer 类选项对和选项aspectratio
进行单独的布局设置。我尝试在我的文件中使用和读取选项:43
169
\DeclareOptionBeamer
\ProcessOptionsBeamer
sty
\ProvidesPackage{beamerthememytheme}[2020/03/10]
\newif\ifwidescreen
\widescreenfalse
\DeclareOptionBeamer{aspectratio}[43]{%
\ifnum#1=169 %
\widescreentrue%
\else\ifnum#1=43 %
\widescreenfalse%
\fi\fi
}
\ProcessOptionsBeamer
\mode<presentation>
beamer 类选项aspectratio
没有传递给我的主题:
\documentclass[aspectratio=169]{beamer}
\usetheme{mytheme}
\begin{document}
\begin{frame}
\ifwidescreen%
16:9
\else%
4:3
\fi
\end{frame}
\end{document}
但是,如果我使用参数加载主题,它会按预期工作\usetheme[aspectratio=169]{mytheme}
。但如果没有提供选项,我希望主题使用与文档类选项中指定的相同选项。
答案1
现在,
- 通常,LaTeX 类将选项存储在中
\@classoptionslist
,稍后加载的包会读取此宏来从类中继承选项。 - 但是,
beamer
类仅存储键选项\@classoptionslist
(通过使用宏\beamer@filterclassoptions
)。这意味着,任何包含的类选项=
(例如aspectratio=<ratio>
)都会被过滤掉。 \ProcessOptionsBeamer
似乎也能处理仅限键的选项。(我不确定。)
下面的示例提供了一种解决方法来解决这个问题:
\RequirePackage{etoolbox}
\RequirePackage{scrlfile}
\makeatletter
\AfterPackage{beamerbaseoptions}{%
% store full class options in \@classoptionslist@full
\pretocmd{\beamer@filterclassoptions}
{\let\@classoptionslist@full=\@classoptionslist}
{}{\fail}%
}
\makeatother
\documentclass[aspectratio=169]{beamer}
\makeatletter
% extended \usetheme which inherits key=val class options
\newrobustcmd*\usethemeX[2][]{%
\let\@classoptionslist=\@classoptionslist@full
\usetheme[#1]{#2}%
\let\@classoptionslist=\beamer@filteredclassoptionslist
}
% patch \ProcessOptionsBeamer
\patchcmd{\ProcessOptionsBeamer}
{\@ifundefined{KV@\@currname @\CurrentOption}}
{\expandafter\get@key\CurrentOption=\@nil
\@ifundefined{KV@\@currname @\CurrentOption@key}}
{}{\fail}
% helper macro
\def\get@key#1=#2\@nil{\def\CurrentOption@key{#1}}
\makeatother
\usethemeX{mytheme}
\begin{document}
\begin{frame}
\ifwidescreen
16:9
\else
4:3
\fi
\end{frame}
\end{document}
\if#1=43
顺便说一句, OP示例中包含的行应该是\ifnum#1=43
。
答案2
随着当前 beamer 开发版本(应该包含在 beamer v3.70 或更新版本中),现在可以使用宏\insertaspectratio
来访问演示文稿的纵横比:
\documentclass[aspectratio=169]{beamer}
\newif\ifwidescreen
\widescreenfalse
\ifnum\insertaspectratio=169 %
\widescreentrue%
\else\ifnum\insertaspectratio=43 %
\widescreenfalse%
\fi\fi
\begin{document}
\begin{frame}
\ifwidescreen%
16:9
\else%
4:3
\fi
\end{frame}
\end{document}