我正在尝试在 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}
是的!我可以做更好的正则表达式匹配 :-)