Automatize a descoberta de *alerta* de linhas de um alinhamento no projetor

Automatize a descoberta de *alerta* de linhas de um alinhamento no projetor

estou usandoesta respostapara automatizar a descoberta de linhas de um alinhamento. No entanto, gostaria de alertar sobre a descoberta.

Não sei expl3 e minhas tentativas de hackear a resposta mencionada acima falharam: tentei adaptar essa resposta para envolvê-la \onslideda \alert<+>{}seguinte maneira:

\alert<+>{\onslide<+->{ ##1 \\ }}

Mas recebo um erro:

! Extra }, or forgotten \endgroup. 

Eu também tentei colocar \alert<+>{}por dentro:

\tl_put_right:Nn \l_tmpa_tl { \onslide<+->{ \alert<+>{ ##1 } } \\ }

Mas recebo o mesmo erro:

! Extra }, or forgotten \endgroup.

Uma solução mais robusta do que a codificação \alertinterna seria poder definir a política de sobreposição em um nível mais alto. Menciono isso em um comentário no meu exemplo abaixo. Mas se isso não for possível, eu ficaria feliz com um arquivo \alert.

Exemplo mostrando o comportamento atual. Gostaria que o comportamento de alinhamento no exemplo fosse semelhante ao comportamento de itemização.

\documentclass{beamer}

\let\oldalign\align
\let\endoldalign\endalign

% https://tex.stackexchange.com/a/611688/12212 
\ExplSyntaxOn
\NewDocumentEnvironment{myalign}{+b}
  {
    \tl_set:Nn \l_tmpa_tl { \begin{oldalign} }
    \seq_set_split:Nnn \l_tmpa_seq { \\ } {#1}
    \seq_map_inline:Nn \l_tmpa_seq
      {
        \tl_if_empty:nF { ##1 }
          {
\tl_put_right:Nn \l_tmpa_tl { \onslide<+->{ ##1 \\ } }
          }
      }
    \tl_put_right:Nn \l_tmpa_tl { \notag \end{oldalign} \vskip-1.5em }
    \l_tmpa_tl
  } { }
\ExplSyntaxOff

\newenvironment{overlayalign}
  {
    \renewenvironment{align}{%
        \begin{myalign}
    }{%
        \end{myalign}
    }
  }
  {
  }

\begin{document}

\begin{frame}[<alert@+|+->]
% I generally prefer the alert, but it would be nice to be able to change to
% the following, and align adapts (i.e., would not alert), just like itemize:
%\begin{frame}[<+->]

I would like behavior similar to itemize:

\begin{itemize}
\item one
\item two
\item three
\end{itemize}

\begin{overlayalign}
\begin{align}
abc & = def \\
    & = ghi \\
    & = jkl \\
    & = 0.  \\
\end{align}
\end{overlayalign}
\end{frame}

\end{document}

Responder1

Aqui está uma abordagem usando a camada de programação L3

\documentclass{beamer}

\ExplSyntaxOn

\seq_new:N \l__myalign_linesin_seq
\seq_new:N \l__myalign_linesout_seq
\seq_new:N \l__myalign_onelinein_seq
\seq_new:N \l__myalign_onelineout_seq

\NewDocumentEnvironment{myalign}{+b}
{
    \exp_after:wN \cs_set_nopar:Npn \cs:w tagform@ \cs_end: ##1
    {
        \cs:w maketag@@@ \cs_end: 
        { 
            \action<.-|alert@.> { ( \ignorespaces ##1 \unskip \cs:w @@italiccorr \cs_end: ) } 
        }
    }
    \seq_set_split:Nnn \l__myalign_linesin_seq { \\ } { #1 }
    \seq_map_inline:Nn \l__myalign_linesin_seq
    {   
        \seq_clear:N \l__myalign_onelineout_seq
        \seq_set_split:Nnn \l__myalign_onelinein_seq { & } { ##1 }
        \seq_map_indexed_inline:Nn \l__myalign_onelinein_seq
        {
            \int_compare:nNnTF { ####1 } = { 1 }
            { \seq_put_right:Nn \l__myalign_onelineout_seq { \action<+-|alert@+> { ####2 } } }
            { \seq_put_right:Nn \l__myalign_onelineout_seq { \action<.-|alert@.> { ####2 } } }
        }
        \seq_put_right:Nx \l__myalign_linesout_seq { \seq_use:Nnnn \l__myalign_onelineout_seq { & } { & } { & } }
    }
    \begin{align}
    \seq_use:Nnnn \l__myalign_linesout_seq { \\ } { \\ } { \\ }
    \end{align}
} { }
\ExplSyntaxOff

\begin{document}
    
    \begin{frame}[<alert@+|+->]
        
        I would like behavior similar to itemize:
        
        \begin{itemize}
            \item one
            \item two
            \item three
        \end{itemize}
        
        \begin{myalign}
            abc & = def  \\
            & = ghi  \\
            & = jkl  \\
            & = 0. 
        \end{myalign}
        
        \visible<+->{test}
        
    \end{frame}
    
\end{document}

Responder2

Uma abordagem diferente usando tabularray:

\documentclass{beamer}

\usepackage{tabularray}
\UseTblrLibrary{counter}
\NewDocumentEnvironment{myalign}{+b}{
\begin{tblr}{
  column{1}={co=1},
  column{Z}={co=1},
  column{odd}={halign=r},
  column{even}={halign=l},  
  colsep = 0pt,
  cells={mode=dmath},
  cell{1-Z}{1}={cmd=\action<+-|alert@+>},
  cell{1-Z}{2-Z}={cmd=\action<.-|alert@.>},
  cell{1-Z}{Z}={appto={\hfill \refstepcounter{equation}(\theequation)}}
}
#1
\end{tblr}
}{}

\begin{document}

\begin{frame}[<alert@+|+->]

I would like behavior similar to itemize:

\begin{itemize}
\item one
\item two
\item three
\end{itemize}

\begin{myalign}
abc & = def  \\
    & = ghi  \\
    & = jkl  \\
    & = 0.   \\
\end{myalign}

\visible<+->{test}

\end{frame}

\end{document}

insira a descrição da imagem aqui

informação relacionada