Comportamento estranho ao usar expl3 e beamer
Estou tentando criar um modelo de projetor em que tudo esteja alinhado na parte superior por padrão. Para os slides sem título, gostaria de adicionar uma margem superior automaticamente. O CASE 2 no MWE abaixo é o que eu penso. Infelizmente, não consegue aumentar a margem superior. Em comparação, incluí o CASO 1 , que funciona bem em termos de adição de margem apenas. Não sei por que colocar o bloco minipagedentro ifmudará a saída.
Resultado do CASO 1 :
Resultado do CASO 2 :
\documentclass[t]{beamer}
\usepackage{expl3}
\ExplSyntaxOn
% CASE 1:
% works normally
\setbeamertemplate{headline}{
\begin{minipage}[t][1cm][t]{0.8\paperwidth}
abc\par
def\par
ghi\par
\end{minipage}
}
% CASE 2:
% not working
\setbeamertemplate{headline}{
% get frame number
\tl_set:Nx \l_tmpa_tl {\insertframenumber}
% do not add margin to the title page
\tl_if_eq:NnF \l_tmpa_tl {1} {
\cs_if_exist:NT \insertframetitle {
\hcoffin_set:Nn \l_tmpa_coffin {\insertframetitle}
\dim_compare:nNnT {\coffin_wd:N \l_tmpa_coffin} < {0.1pt} {
% add spacing when there is no title
\begin{minipage}[t][1cm][t]{0.8\paperwidth}
abc\par
def\par
ghi\par
\end{minipage}
}
}
}
}
\ExplSyntaxOff
\begin{document}
\maketitle
\begin{frame}{title}
conten...
\end{frame}
\begin{frame}
content...
\end{frame}
\end{document}
Respostas
Isso não foi criado por mim, apenas adaptei para se adequar a este caso de uso. Se você acha que isso merece um voto positivo , deveria realmente votar positivamente na resposta original de @samcarter .
O seguinte reutiliza idéias de @samcarter (mas corrige o ambiente, como proposto lá).
Remendamos beameros internos para adicionar um noframetitlemodelo que é evocado quando não há nenhum \frametitlequadro. Este noframetitlemodelo irá adicionar algum espaço em branco. Você pode modificar esse template ao seu gosto, eu apenas coloco um \rulelá com a largura 0pt(para que seja invisível), a altura que obtive por tentativa e erro para combinar o espaçamento de um quadro com um título.
\documentclass[t]{beamer}
\makeatletter
\patchcmd\endbeamer@frameslide
{\setbox\beamer@frametitlebox=\box\voidb@x}
{%
% no change for title page
\ifnum\c@framenumber=1
\setbox\beamer@frametitlebox=\box\voidb@x
\else
\setbox\beamer@frametitlebox=\vbox{%
\vbox{}%
{\parskip0pt\usebeamertemplate***{noframetitle}\vskip0.25em}%
}%
\fi
}
{}
{\GenericError{}{Error: Failed to patch beamer's frameslide}{}{}}
\makeatother
\setbeamertemplate{noframetitle}{\rule{0pt}{6.7mm}}
\begin{document}
\maketitle
\begin{frame}{title}
content\ldots
\end{frame}
\begin{frame}
content\ldots
\end{frame}
\end{document}