我正在根据 定制一个类beamer
。您认为定义选项的最佳方法是什么?
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2019/03/25 myclass]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{beamer}}
\DeclareOption{transparent}{%here some code%}
\DeclareOption{fill}{%here some code%}
\ProcessOptions\relax
\LoadClass{beamer}
\usetheme[progress bar = frametitle]{metropolis}
我想用类似以下内容的代码替换代码的注释部分
\metroset{block=transparent}
\setbeamercolor{block title}{%
use=normal text,
fg=normal text.fg,
bg=normal text.bg}
\setbeamercolor{block body}{
use={block title, normal text},
bg=normal text.bg}
和
\metroset{block=fill}
\setbeamercolor{block title}{%
use=normal text,
fg=normal text.fg,
bg=normal text.bg!80!fg} %default normal text.bg!80!fg
\setbeamercolor{block body}{
use={block title, normal text},
bg=normal text.bg!80!fg}
我无法将代码直接放在 中DeclareOption
,因为beamer
尚未指定类和大都会主题。我无法移动LoadClass
上面的内容,否则DeclareOption*
不会将选项传递给类。通过定义newif
s 并将其用作加载或不加载代码特定部分的标志,可以轻松解决此问题。有没有更快的方法来产生相同的结果,也许不需要用许多 s 填充代码newif
?
答案1
您可以将选项代码放在(内部)命令中,比如\opt@fill
,并\AtEndOfClass
在类末尾使用来执行命令...。
平均能量损失
我的类名.cls
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2019/03/25 myclass]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{beamer}}
\DeclareOption{transparent}{\AtEndOfClass{\opt@transparent}}
\DeclareOption{fill}{\AtEndOfClass{\opt@fill}}
\ProcessOptions\relax
\LoadClass{beamer}
\usetheme[progress bar = frametitle]{metropolis}
\newcommand{\opt@transparent}{%
\metroset{block=transparent}
\setbeamercolor{block title}{%
use=normal text,
fg=normal text.fg,
bg=normal text.bg}
\setbeamercolor{block body}{
use={block title, normal text},
bg=normal text.bg}}
\newcommand{\opt@fill}{%
\metroset{block=fill}
\setbeamercolor{block title}{%
use=normal text,
fg=normal text.fg,
bg=normal text.bg!80!fg} %default normal text.bg!80!fg
\setbeamercolor{block body}{
use={block title, normal text},
bg=normal text.bg!80!fg}}
\endinput
麦格
\documentclass[fill]{myclass}
\begin{document}
\begin{frame}{hello}
\begin{block}{world}
foo, bar
\end{block}
\end{frame}
\end{document}
结果