要通过宏提供叠加规范,我必须使用\expandafter\item\foo text
,其中\foo
类似于<+->
。当我经常这样做时\expandafter
会变得很麻烦。有没有办法摆脱\expandafter
?
我猜想可行的方法是更新覆盖规范命令并添加\expandafter
?这会破坏任何东西吗?
有没有更简单的方法来确保正确处理覆盖宏,例如投影仪参数或其他东西?
\item<\foo> text
编辑 1:当我改为使用并让其\foo
成为类似的东西时,事情似乎+-
会起作用。我将使用它,看看是否能回答这个问题。
编辑2:下面我添加了一个 MWE
\documentclass{beamer}
\begin{document}
\begin{frame}
\def\foo{<+>}
\def\bar{<+->}
\begin{itemize}
\expandafter\item\foo First
\expandafter\item\bar Second
\end{itemize}
\end{frame}
\end{document}
答案1
我不会这么做,但这就是它。我更愿意提供覆盖选项\begin{itemize}
:有多少种情况您希望应用此功能?
\documentclass{beamer}
\makeatletter
% similar to \@ifnextchar, tests if the next token is a control sequence
\newcommand{\@ifnextcs}[2]{%
\def\reserved@a{#1}\def\reserved@b{#2}%
\futurelet\@let@token\@ifncs
}
\def\@ifncs{%
\ifx\@let@token\@sptoken
\let\reserved@c\@xifncs
\else
\if\noexpand\@let@token\relax
\let\reserved@c\reserved@a
\else
\let\reserved@c\reserved@b
\fi
\fi
\reserved@c
}
\let\ody@item\item
\def\item{\@ifnextcs{\expandafter\ody@item}{\ody@item}}
\makeatother
\begin{document}
\begin{frame}
\def\foo{<+>}
\def\bar{<+->}
\begin{itemize}
\item\foo First
\item\bar Second
\end{itemize}
\end{frame}
\end{document}
当然,另一种解决方案是使用\xitem
由
\newcommand{\xitem}{\expandafter\item}