我想制作一个表格的多个副本,每个副本都突出显示其条目的不同子集。经过大量浏览,我找到了如何定义命令的方法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}