我正在尝试创建一个可以动态创建cases
环境的宏。不幸的是,有一个问题我无法理解。
由于某种原因,使用时调用\seq_item
不会产生文本后-token &
。将其他文本放在&
-token 之后或{\seq_item:Nn \l_tmpb_seq {2}}
之前&
都会产生预期的文本。
\documentclass{article}
\usepackage{expl3}
\usepackage{amsmath}
\begin{document}
\ExplSyntaxOn
\newcommand{\caseExp}[1]{
\group_begin:
\seq_set_from_clist:Nn \l_tmpa_seq {#1}
\seq_set_map:NNn \l_tmpa_seq \l_tmpa_seq {
\seq_set_from_clist:Nn \l_tmpb_seq {##1}
{\seq_item:Nn \l_tmpb_seq {1}} & {\seq_item:Nn \l_tmpb_seq {2}}
}
\begin{cases}
\seq_use:Nn \l_tmpa_seq {\\}
\end{cases}
\group_end:
}
\ExplSyntaxOff
$
f(x) = \caseExp{{AAAA,BBBB},{CCCC,DDDD}}
$
\end{document}
代码的输出如下,但我希望看到BBBB
那里DDDD
。
这种令人费解的行为的原因是什么?该如何解决?
答案1
cases
在内部使用对齐,每个单元格形成一个组,并且您在一个组中设置一个序列,但尝试在另一个组中使用它的值。
\clist_use:nn
您可以使用更简单且完全可扩展的策略。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\caseExp}{m}
{
\group_begin:
\seq_set_from_clist:Nn \l_tmpa_seq {#1}
\seq_set_map_x:NNn \l_tmpa_seq \l_tmpa_seq
{
\clist_use:nn { ##1 } { & }
}
\begin{cases}
\seq_use:Nn \l_tmpa_seq {\\}
\end{cases}
\group_end:
}
\ExplSyntaxOff
\begin{document}
\[
f(x) = \caseExp{{AAAA,BBBB},{CCCC,DDDD}}
\]
\end{document}
您甚至可以通过在第一个单元格中完成所有工作来避免使用封闭组。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\caseExp}{m}
{
\begin{cases}
\seq_set_from_clist:Nn \l_tmpa_seq {#1}
\seq_set_map_x:NNn \l_tmpa_seq \l_tmpa_seq
{
\clist_use:nn { ##1 } { & }
}
\seq_use:Nn \l_tmpa_seq {\\}
\end{cases}
}
\ExplSyntaxOff
\begin{document}
\[
f(x) = \caseExp{{AAAA,BBBB},{CCCC,DDDD}}
\]
\end{document}
事实上,\seq_use:Nn
将会“一次性”提供结果,因此 TeX 将在不再需要保存的值时看到&
和。\\
\l_tmpa_seq
\\
甚至更简单,利用尾随在 中cases
无关紧要的事实(不是在 中align
,请注意):
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\caseExp}{m}
{
\begin{cases}
\clist_map_function:nN { #1 } \__egreg_cases_row:n
\end{cases}
}
\cs_new_protected:Nn \__egreg_cases_row:n
{
\clist_use:nn { #1 } { & } \\
}
\ExplSyntaxOff
\begin{document}
\[
f(x) = \caseExp{{AAAA,BBBB},{CCCC,DDDD}}
\]
\end{document}