覆盖规范宏的扩展

覆盖规范宏的扩展

要通过宏提供叠加规范,我必须使用\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}

相关内容