我试图以与标题页相同的方式为 Beamer 中的所有框架标题加下划线:
然而,我得到的并不是预期的结果,而是框架标题所在的位置出现了一个黑条/方块。
可编译版本为:
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\setbeamercolor{title}{fg=black}
\setbeamercolor{frametitle}{fg=black}
\usepackage{color,soul}
\makeatletter
\let\UL\ul
\renewcommand\ul{%
\let\set@color\beamerorig@set@color
\let\reset@color\beamerorig@reset@color
\UL}
\makeatother
\setulcolor{orange}
\defbeamertemplate*{title page}{test}
{
\begin{beamercolorbox}[center]{title}
\usebeamerfont{title}\ul{\MakeUppercase{\inserttitle}}
\end{beamercolorbox}
}
\defbeamertemplate*{frametitle}{test}
{
\vspace{16pt}
\begin{beamercolorbox}{frametitle}
\usebeamerfont{frametitle}\ul{\MakeUppercase{\insertframetitle}}
\end{beamercolorbox}
}
\title{Testtest}
\begin{document}
\begin{frame}
\maketitle
\end{frame}
\begin{frame}{Frame Title}
Introduction
\end{frame}
\end{document}
谁能帮我?
答案1
MWE 中的代码抛出一个错误:
! Package soul Error: Reconstruction failed.
See the soul package documentation for explanation.
Type H <return> for immediate help.
...
l.42 \end{frame}
可能您正在编译,nonstopmode
其中 LaTeX 在出现错误后尝试继续 - 但这通常不是一个好主意,因为输出可能像您所经历的那样错误。手册soul
提到了此错误(第 5 页):
如果您违反此规则,则会在 DVI 文件中收到重建失败错误和类似 ⬛ 的黑色方块。
\insertframetitle
提到的规则是“对可连字符材料进行分组”。 (from )的定义beamerbaselocalstructure.sty
确实非常复杂:
\gdef\insertframetitle{{#2\ifnum\beamer@autobreakcount>0\relax{}\space\usebeamertemplate*{frametitle continuation}\fi}}%
其中#2
是提供给 的参数\begin{frame}
。
因此,问题在于它soul
无法以\insertframetitle
知道要强调什么的方式进行处理。
幸运的是,beamer
在处理时还定义了一个更简单的内部宏\begin{frame}
:
\gdef\beamer@frametitle{#2}%
这个宏可以soul
毫无问题地使用。因为这个宏是内部的,并且有一个@
你需要的符号\makeatletter
,\makeatother
围绕着 beamer 模板的定义。
梅威瑟:
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\setbeamercolor{title}{fg=black}
\setbeamercolor{frametitle}{fg=black}
\usepackage{color,soul}
\makeatletter
\let\UL\ul
\renewcommand\ul{%
\let\set@color\beamerorig@set@color
\let\reset@color\beamerorig@reset@color
\UL}
\makeatother
\setulcolor{orange}
\defbeamertemplate*{title page}{test}
{
\begin{beamercolorbox}[center]{title}
\usebeamerfont{title}\ul{\MakeUppercase{\inserttitle}}
\end{beamercolorbox}
}
\makeatletter
\defbeamertemplate*{frametitle}{test}
{
\vspace{16pt}
\begin{beamercolorbox}{frametitle}
\usebeamerfont{frametitle}\ul{\MakeUppercase{\beamer@frametitle}}
\end{beamercolorbox}
}
\makeatother
\title{Testtest}
\begin{document}
\begin{frame}
\maketitle
\end{frame}
\begin{frame}{My Frame Title}
Introduction
\end{frame}
\end{document}
结果: