将 beamer 类选项传递给 beamer 主题

将 beamer 类选项传递给 beamer 主题

如何将文档类选项传递给 beamer 主题?

我正在编写一个 beamer 主题。我想使用 beamer 类选项对和选项aspectratio进行单独的布局设置。我尝试在我的文件中使用和读取选项:43169\DeclareOptionBeamer\ProcessOptionsBeamersty

\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}

相关内容