網站上有很多問題,例如“我使用主題 X,但我想要頁腳/頁眉/主題 Y 中的任何內容”,僅舉一個例子:混合華沙和馬德里投影機主題
為了使這一點變得更容易,如何從主題加載特定模板,例如僅加載腳線?
測試用例
測試1:簡單案例
\useoutertheme{infolines}
\setbeamertemplate{footline}[infolines theme]
測試2:測試是否適用於父主題
\usetheme{Boadilla}
\setbeamertemplate{footline}[infolines theme]
測試 3:測試它是否適用於選項
\usetheme[height=3cm]{Rochester}
\setbeamertemplate{headline}[sidebar theme]
答案1
測試1
這似乎有效。
\documentclass{beamer}
\usecolortheme{whale}
\useoutertheme{split}
\makeatletter
\let\beamer@@@@sbto@old=\beamer@@@@sbto
\def\text@footline{footline}
\long\def\beamer@@@@sbto#1#2[#3]#4[#5]#6{
\def\text@element{#1}
\ifx\text@footline\text@element
\beamer@@@@sbto@old{#1}{#2}[#3]{#4}[#5]{#6}
\fi
}
\useoutertheme{infolines}
\let\beamer@@@@sbto=\beamer@@@@sbto@old
\makeatother
\begin{document}
\begin{frame}
Test
\end{frame}
\end{document}
測試2
如果您想獲得對顏色的控制,請對\beamer@clearbeamercolor
和執行相同的操作\beamer@setbeamercolor
。
\setbeamerfont
(與和相同\setbeamersize
)
\documentclass{beamer}
\usecolortheme{whale}
\useoutertheme{split}
\makeatletter
\let\beamer@@@@sbto@old=\beamer@@@@sbto
\def\text@footline{footline}
\long\def\beamer@@@@sbto#1#2[#3]#4[#5]#6{
\def\text@element{#1}
\ifx\text@footline\text@element
\beamer@@@@sbto@old{#1}{#2}[#3]{#4}[#5]{#6}
\fi
}
\let\beamer@clearbeamercolor@old=\beamer@clearbeamercolor
\let\beamer@setbeamercolor@old=\beamer@setbeamercolor
\def\beamer@clearbeamercolor#1#2{}
\def\beamer@setbeamercolor#1#2{}
\usetheme{Boadilla}
\setbeamertemplate{footline}[infolines theme]
\let\beamer@@@@sbto=\beamer@@@@sbto@old
\let\beamer@clearbeamercolor=\beamer@clearbeamercolor@old
\let\beamer@setbeamercolor=\beamer@setbeamercolor@old
\makeatother
\begin{document}
\begin{frame}
Test
\end{frame}
\end{document}
測試3
在這個測試中,很重要的\beamer@@@@sbto
是一個長宏。
\documentclass{beamer}
\usecolortheme{whale}
\useoutertheme{split}
\makeatletter
\let\beamer@@@@sbto@old=\beamer@@@@sbto
\def\text@headline{headline}
\long\def\beamer@@@@sbto#1#2[#3]#4[#5]#6{
\def\text@element{#1}
\ifx\text@headline\text@element
\beamer@@@@sbto@old{#1}{#2}[#3]{#4}[#5]{#6}
\fi
}
\usetheme[height=3cm]{Rochester}
\setbeamertemplate{headline}[sidebar theme]
\let\beamer@@@@sbto=\beamer@@@@sbto@old
\makeatother
\begin{document}
\section{TEST}
\begin{frame}
Test
\end{frame}
\end{document}
答案2
一個笨拙的解決方法:使用catchfilebetweentags
包包。然而,這需要在文件中添加一些附加註釋.sty
。
\documentclass{beamer}
\usecolortheme{whale}
\useoutertheme{split}
\usepackage{catchfilebetweentags}
\newcommand\fromtheme[2]{\ExecuteMetaData[beamertheme#1.sty]{#2}}
\newcommand\fromcolortheme[2]{\ExecuteMetaData[beamercolortheme#1.sty]{#2}}
\newcommand\fromfonttheme[2]{\ExecuteMetaData[beamerfonttheme#1.sty]{#2}}
\newcommand\fromoutertheme[2]{\ExecuteMetaData[beameroutertheme#1.sty]{#2}}
\newcommand\frominnertheme[2]{\ExecuteMetaData[beamerinnertheme#1.sty]{#2}}
\fromoutertheme{infolines}{footline:infolines}
\begin{document}
\begin{frame}
Test
\end{frame}
\end{document}
這些.sty
文件需要註釋,例如:
%<*footline:infolines>
\defbeamertemplate*{footline}{infolines theme}
{
\leavevmode%
\hbox{%
\begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,center]{author in head/foot}%
\usebeamerfont{author in head/foot}\insertshortauthor\expandafter\beamer@ifempty\expandafter{\beamer@shortinstitute}{}{~~(\insertshortinstitute)}
\end{beamercolorbox}%
\begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,center]{title in head/foot}%
\usebeamerfont{title in head/foot}\insertshorttitle
\end{beamercolorbox}%
\begin{beamercolorbox}[wd=.333333\paperwidth,ht=2.25ex,dp=1ex,right]{date in head/foot}%
\usebeamerfont{date in head/foot}\insertshortdate{}\hspace*{2em}
\insertframenumber{} / \inserttotalframenumber\hspace*{2ex}
\end{beamercolorbox}}%
\vskip0pt%
}
%</footline:infolines>
%<*headline:infolines>
\defbeamertemplate*{headline}{infolines theme}
{
\leavevmode%
\hbox{%
\begin{beamercolorbox}[wd=.5\paperwidth,ht=2.65ex,dp=1.5ex,right]{section in head/foot}%
\usebeamerfont{section in head/foot}\insertsectionhead\hspace*{2ex}
\end{beamercolorbox}%
\begin{beamercolorbox}[wd=.5\paperwidth,ht=2.65ex,dp=1.5ex,left]{subsection in head/foot}%
\usebeamerfont{subsection in head/foot}\hspace*{2ex}\insertsubsectionhead
\end{beamercolorbox}}%
\vskip0pt%
}
%</headline:infolines>
上述 Ansatz 的問題:
表單的註釋
%<*footline:infolines>
必須%</footline:infolines>
插入到程式碼中,自訂的主題可能不會這樣做,並且使用者會對哪些模板適用而哪些模板不適用感到困惑。我知道,只要模板嘗試使用主題內定義的內容(但在模板之外),例如,
\pgfdeclareverticalshading{beamer@topshade}{...}
必須在<*tag>
...內定義的內容,加載特定模板就會中斷。</tag>
當然,如果不必知道模板是在哪個子主題中定義的,而只需插入通用主題,並且此命令將遞歸地搜尋給定標籤的載入子主題,那會更方便。
我還沒有想過主題的可選參數如何適應這個...
....
測試用例的結果:
測試1:簡單案例
作品
測試2:測試是否適用於父主題
失敗
測試 3:測試它是否適用於選項
失敗
答案3
以下代碼來自 louisstuart96 在我收到的答案中https://github.com/josephwright/beamer/issues/388#issuecomment-296338235
[如果他決定自己添加答案,我將刪除此CM]
\documentclass{beamer}
\usecolortheme{whale}
\useoutertheme{split}
\makeatletter
\let\beamer@original@defbeamertemplate\beamer@defbeamertemplate
\def\beamer@defbeamertemplate{\beamer@sbtfalse\@ifstar{\beamer@sbtoo}{\beamer@sbtoo}}
\useoutertheme{infolines}
\setbeamertemplate{footline}[infolines theme]
% This \set must be done manually,
% since generally theme names have nothing to do with file names
\let\beamer@defbeamertemplate\beamer@original@defbeamertemplate
\makeatother
\begin{document}
\begin{frame}
Test
\end{frame}
\end{document}
測試用例的結果:
測試1:簡單案例
作品
測試2:測試是否適用於父主題
作品[有一個小小的缺點是顏色之類的東西會被主題覆蓋]
測試 3:測試它是否適用於選項
作品