假设我们有 3 个变量\l__ta_seq
、\l__tb_seq
和 ,\l__tc_seq
在某些 LaTeX3 递归过程中,我们想要传送它们的内容:
\seq_set_eq:NN \l__ta_seq \l__tb_seq
\seq_set_eq:NN \l__tb_seq \l__tc_seq
但是,如果我尝试在align*
环境中执行此操作,事情就会变得一团糟。以下是一个例子
\seq_set_from_clist:Nn \l__ta_seq {1,2,3}
\seq_set_from_clist:Nn \l__tb_seq {a,b,c}
\seq_set_from_clist:Nn \l__tb_seq {x,y}
\begin{align*}
A&=\seq_use:Nn \l__ta_seq {+}\\
B&=\seq_use:Nn \l__tb_seq {+}\\
C&=\seq_use:Nn \l__tc_seq {+}\\
\seq_set_eq:NN \l__ta_seq \l__tb_seq
\seq_set_eq:NN \l__tb_seq \l__tc_seq
A&=\seq_use:Nn \l__ta_seq {+}\\
B&=\seq_use:Nn \l__tb_seq {+}\\
C&=\seq_use:Nn \l__tc_seq {+}\\
\end{align*}
您会发现交换并没有发生。
这是什么原因造成的?如何解决?
更新:目标是将递归放入align*
环境中。这是一个(不)有效的例子:
\documentclass{article}
\seq_set_from_clist:Nn \l__ta_seq {1,2,3}
\seq_set_from_clist:Nn \l__tb_seq {9,8,7}
\seq_clear_new:N \l__tc_seq
\usepackage{amsmath}
\cs_new_nopar:Npn \fun_trim:N #1 {
\bool_do_while:nn {
\int_compare_p:n {\seq_count:N #1 > 1}
&&
\int_compare_p:n {\seq_item:Nn #1 {1} == 0}
} {
\seq_pop_left:NN #1 \l_tmpa_tl
}
}
\cs_new_nopar:Npn \fun_seq:NNN #1#2#3
{
\seq_clear_new:N #1
\int_step_inline:nnnn {1} {1} {\int_min:nn {\seq_count:N #2} {\seq_count:N #3}} {
\seq_put_left:Nx #1 {\int_eval:n {\seq_item:Nn #2 {1} / \seq_item:Nn #3 {1} + 0}}
}
\fun_trim:N #1
}
%Some function produce \l__tc_seq from \l__ta_seq and \l__tb_seq,
\begin{document}
\begin{align*}
A&=\seq_use:Nn \l__ta_seq {+}\\
B&=\seq_use:Nn \l__tb_seq {+}\\
C&=\seq_use:Nn \l__tc_seq {+}\\%Before the process
\int_until_do:nn {
\seq_count:N \l__tb_seq <= 1%Yes, I need it to be one or zero.
}
{
\fun_seq:NNN \l__tc_seq \l__ta_seq \l__tb_seq
\seq_set_eq:NN \l__ta_seq \l__tb_seq
\seq_set_eq:NN \l__tb_seq \l__tc_seq
A&=\seq_use:Nn \l__ta_seq {+}\\
B&=\seq_use:Nn \l__tb_seq {+}\\
C&=\seq_use:Nn \l__tc_seq {+}\\
}
\end{align*}
\end{document}
您可以看到问题是我需要本地变量,这样我才能进行递归。
更新 2抱歉添加了题外话。我意识到我遇到的问题仍然存在问题。我现在知道我需要将结果存储在标记列表中。但在我遇到的实际情况中,我需要对序列应用一个复杂的函数,\l__ta_seq
而不是直接使用它。这是一个 M(no)WE:
\ExplSyntaxOn
\seq_set_from_clist:Nn \l__ta_seq {1,2,3}
\cs_new_nopar:Npn \fun_something:N #1 {
\seq_map_inline:Nn #1 {##1}
}%In the actual situation, this should be a complicated function generating some math symbols (saying, a polynomial) from the sequence #1
\tl_clear:N \l_results_tl
\tl_put_right:Nx \l_results_tl {\fun_something:N \l__ta_seq}
%Let's ignore the recursion to make things simple.
\ExplSyntaxOff
所以问题是,上面的代码会导致错误Use of \??? doesn't match its definition.
,! LaTeX Error: A sequence was misused.
但我不知道哪里出了问题。
顺便说一句,虽然修改功能\fun_something:N
可能是一个合理的解决方案,但实际功能太复杂了,我想避免修改它。
答案1
您的问题不够清晰,因为您没有明确说明您的最终目标。这能解决您的问题吗?
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\ExplSyntaxOn
\seq_set_from_clist:Nn \l__ta_seq {1,2,3}
\seq_set_from_clist:Nn \l__tb_seq {a,b,c}
\seq_set_from_clist:Nn \l__tc_seq {x,y} % you had a typo here...
\tl_set:Nn \l_tempa_tl { \begin{align*} }
\tl_put_right:Nx \l_tempa_tl
{
A&=\seq_use:Nn \l__ta_seq {+}\\
B&=\seq_use:Nn \l__tb_seq {+}\\
C&=\seq_use:Nn \l__tc_seq {+}\\
}
\seq_set_eq:NN \l__ta_seq \l__tb_seq
\seq_set_eq:NN \l__tb_seq \l__tc_seq
\tl_put_right:Nx \l_tempa_tl
{
A&=\seq_use:Nn \l__ta_seq {+}\\
B&=\seq_use:Nn \l__tb_seq {+}\\
C&=\seq_use:Nn \l__tc_seq {+}\\
}
\tl_put_right:Nn \l_tempa_tl { \end{align*} }
\l_tempa_tl
\end{document}