Comportamento estranho ao usar expl3 e beamer

Oct 30 2020

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

2 Skillmon Oct 30 2020 at 15:25

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}