对齐和 LaTeX3 递归问题

对齐和 LaTeX3 递归问题

假设我们有 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}

相关内容