Beamer:如何在 itemize/enumerate 环境中向 \item 添加钩子

Beamer:如何在 itemize/enumerate 环境中向 \item 添加钩子

我正在尝试在 Beamer 中添加钩子\item,但是它的内部装置对我来说太复杂了。

我尝试了etoobox\preto\pretocmd以及 的类似命令xpatch。同样,\AtBeginEnvironment它们都不起作用。它们全部打破覆盖系统

长话短说,我的目标的一个更简单的设想是,例如,将所有项目放在一个框架框中。因此,我应该使用类似以下内容的东西:

\xpretocmd{\item}{\framebox\bgroup}
\xapptocmd{\item}{\egroup}

这是 MWD:

\documentclass[12pt]{beamer}

\begin{document}

\begin{frame}
    Current behaviour:

    \begin{itemize}
        \item One
        \item <2>Two
        \item Three
    \end{itemize}
\end{frame}

\begin{frame}
    Expected new behaviour result:

    \begin{itemize}
        \item \framebox{One}
        \item <2> \framebox{Two}
        \item \framebox{Three}
    \end{itemize}
\end{frame}

\end{document}

请注意,这\framebox{}只是一个例子。我打算在那里添加更多内容……,但首先要做的事情。:-)

答案1

这个包getitems对我很有用(谢谢!)。它完全满足我的要求。

通过物品主体,我可以检查 Beamer 覆盖和子弹替换,然后在稍后处理它们。

这是一个概念证明。

\documentclass[10pt]{beamer}
\usepackage[T1]{fontenc}

\usepackage{getitems}

\let\Item\item
\let\Itemize\itemize
\let\endItemize\enditemize

\ExplSyntaxOn

\seq_new:N \g_item_structure_seq
\cs_new:Npn \dc_do_item:n #1 {
    \regex_extract_once:nnNTF { \A<(.*?)>\s*\[(.*?)\](.*) } { #1 } \g_item_structure_seq {
        \mybox<\seq_item:Nn \g_item_structure_seq { 2 }>
        [\seq_item:Nn \g_item_structure_seq { 3 }]
        {\seq_item:Nn \g_item_structure_seq { 4 }}
    } {
        \regex_extract_once:nnNTF { \A\[(.*?)\]\s*<(.*?)>(.*) } { #1 } \g_item_structure_seq {
            \mybox<\seq_item:Nn \g_item_structure_seq { 3 }>
            [\seq_item:Nn \g_item_structure_seq { 2 }]
            {\seq_item:Nn \g_item_structure_seq { 4 }}
        } {
            \regex_extract_once:nnNTF { \A<(.*?)>(.*) } { #1 } \g_item_structure_seq {
                \mybox<\seq_item:Nn \g_item_structure_seq { 2 }>
                {\seq_item:Nn \g_item_structure_seq { 3 }}
            } {
                \regex_extract_once:nnNTF { \A\[(.*?)\](.*) } { #1 } \g_item_structure_seq {
                    \mybox
                    [\seq_item:Nn \g_item_structure_seq { 2 }]
                    {\seq_item:Nn \g_item_structure_seq { 3 }}
                } {
                    \mybox{#1}
                }
            }
        }
    }
    \vspace{1em}\par
}

\NewDocumentCommand { \doitem } { m } {
    \dc_do_item:n { #1 }
}
\ExplSyntaxOff

\RenewEnviron{itemize}{%
    \expandafter\gatheritems\expandafter{\BODY}%
    \begin{Itemize}
        \loopthroughitemswithcommand{\doitem}%
    \end{Itemize}
}

\NewDocumentCommand{\mybox}{D<>{1-}om}{%
    \visible<#1>{%
        \IfValueTF{#2}{
            \Item[#2]\framebox{\begin{minipage}[t]{0.7\linewidth}#3\end{minipage}}%
        }{
            \Item\framebox{\begin{minipage}[t]{0.7\linewidth}#3\end{minipage}}%
        }
    }%
}

\begin{document}

\begin{frame}
    MyList:\bigskip

    \begin{itemize}
        \item This is Baskara: $x = \frac{b \pm \sqrt{\Delta}}{2a}$
        \item <+-> This is an array: \texttt{int a[10];}
        \item [$\diamond$] Use angle brackets\ldots ${<}a{>}$
        \item <2-3>[$\equiv$] Simple text
        \item [*]<2-3> Nested \texttt{enumerate}:
        \begin{enumerate}
            \item One
            \item Two
        \end{enumerate}
    \end{itemize}
\end{frame}

\end{document}

是的!我可以做更好的正则表达式匹配 :-)

答案2

作为一种解决方法,您可以定义一个自定义宏,用它来代替\item

\documentclass[12pt]{beamer}

\newcommand<>{\myitem}[1]{\item#2 \framebox{#1}}

\begin{document}

\begin{frame}
    Current behaviour:

    \begin{itemize}
        \myitem{One}
        \myitem<2>{Two}
        \myitem{Three}
    \end{itemize}
\end{frame}

\end{document}

在此处输入图片描述

相关内容