Автоматическое *оповещение*-раскрытие линий выравнивания в проекторе

Автоматическое *оповещение*-раскрытие линий выравнивания в проекторе

Я используюэтот ответдля автоматизации раскрытия линий выравнивания. Однако я хотел бы предупредить об раскрытии.

Я не знаю expl3, и мои попытки взломать ответ, указанный выше, потерпели неудачу: я попытался адаптировать этот ответ, чтобы оформить его \onslideследующим \alert<+>{}образом:

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

Но я получаю ошибку:

! Extra }, or forgotten \endgroup. 

Я также попробовал разместить \alert<+>{}внутри:

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

Но я получаю ту же ошибку:

! Extra }, or forgotten \endgroup.

Более надежным решением, чем жесткое кодирование \alertвнутри, было бы установить политику наложения на более высоком уровне. Я упоминаю об этом в комментарии к своему примеру ниже. Но если это невозможно, я был бы счастлив жестко закодированным \alert.

Пример, демонстрирующий текущее поведение. Я бы хотел, чтобы поведение выравнивания в примере было похоже на поведение itemize.

\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}

решение1

Вот подход с использованием уровня программирования 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}

решение2

Другой подход с использованием 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}

введите описание изображения здесь

Связанный контент