我可以迭代更新命令列表吗?我可以在 beamer 中使用 \only 来做到这一点吗?

我可以迭代更新命令列表吗?我可以在 beamer 中使用 \only 来做到这一点吗?

我想制作一个表格的多个副本,每个副本都突出显示其条目的不同子集。经过大量浏览,我找到了如何定义命令的方法xforeach,并设法创建了以下部分解决方案,并通过一个类似最小的示例进行了说明。

\documentclass[]{beamer}

\newcommand{\A }{A   }
\newcommand{\B }{Beta}
\newcommand{\C }{Ceta}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\xforeach}{s m +m}
 {
  \IfBooleanTF{#1}
   {
    \clist_map_inline:on { #2 } { #3 }
   }
   {
    \clist_map_inline:nn { #2 } { #3 }
   }
 }
\cs_generate_variant:Nn \clist_map_inline:nn { o }
\ExplSyntaxOff

\xforeach{A,B}{
  \expandafter\renewcommand\csname#1\endcsname{ {\color{red} #1}}
  }

\begin{document}
\begin{tabular}{ c c c}
  \A  & \B  & \C \\ 
  \A  & \C  & \B \\
  \C  & \B  & \A \\  
\end{tabular}
\end{document}

(说实话,我不太明白在\ExplSyntaxOn-这段时间内发生了什么\ExplSyntaxOff

这给了我两个表,正确的条目被标为红色,但在第二个表中,B 替换了期望的 Beta。我知道应该\在 之前插入# {\color{red} #1},但我不知道如何以编译的方式执行此操作。

由于我的真实表格很大,条目中的突出显示应该打开和关闭,并且因为我需要它的多个副本,所以我理想情况下想写一些类似的东西

\only<2>{
  \xforeach{A,B}{
    \expandafter\renewcommand\csname#1\endcsname{ {\color{red} #1}}
    }

表示命令仅应在某些子帧中更新。

我真的只是想要一系列表格,不一定是 Beamer 的。我主要用它希望业务\only能够正常运作。

任何帮助都将非常感激!

答案1

在您的xforeach循环中,#1重新定义的宏中的 仅仅是字母 A 和 B,而不是宏\A\B。您可能想到的第一个修复方法是将#1重新定义中的 更改为\csname#1\endcsname(这相当于您的建议,这\#1不是有效的语法)。然而,即使\csname语法有效,这也会带来自引用问题,类似于错误

\def\A{new\A}

解决方案是将现有定义保存为不同的宏名,然后根据保存的定义重新定义原始宏。简而言之,

\let\Asv\A
\def\A{new\Asv}

现在,在\xforeach循环中,我将 的副本保存\A\Asv\B\Bsv。然后,我分别根据\A和重新定义和。\B\Asv\Bsv

\documentclass[]{beamer}

\newcommand{\A }{A   }
\newcommand{\B }{Beta}
\newcommand{\C }{Ceta}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\xforeach}{s m +m}
 {
  \IfBooleanTF{#1}
   {
    \clist_map_inline:on { #2 } { #3 }
   }
   {
    \clist_map_inline:nn { #2 } { #3 }
   }
 }
\cs_generate_variant:Nn \clist_map_inline:nn { o }
\ExplSyntaxOff

\xforeach{A,B}{
  \expandafter\let\csname#1sv\expandafter\endcsname
    \csname#1\endcsname  
  \expandafter\renewcommand\csname#1\endcsname{ {\color{red} 
    \csname#1sv\endcsname}}
  }
\begin{document}

\begin{tabular}{ c c c}
  \A  & \B  & \C \\ 
  \A  & \C  & \B \\
  \C  & \B  & \A \\  
\end{tabular}
\end{document}

在此处输入图片描述

相关内容