使用宏生成张量表达式

使用宏生成张量表达式

我正在尝试创建一个命令,给定一个以逗号分隔的下标索引、下标值、上标索引、上标值列表,然后张量的名称生成以下输出: 在此处输入图片描述

我设法编写了一个宏来生成第一部分,即索引及其值:

\NewDocumentCommand{\test}{m m m m}
{
    \seq_new:N \l_test_subi_seq
    \seq_set_from_clist:Nn \l_test_subi_seq { #1 }
    \seq_new:N \l_test_subn_seq
    \seq_set_from_clist:Nn \l_test_subn_seq { #2 }
    \seq_new:N \l_test_supi_seq
    \seq_set_from_clist:Nn \l_test_supi_seq { #3 }
    \seq_new:N \l_test_supn_seq
    \seq_set_from_clist:Nn \l_test_supn_seq { #4 }
    \tl_clear:N \l_tmpa_tl
    \int_step_inline:nn { \seq_count:N \l_test_subi_seq }
    {
        \tl_put_right:Nn \l_tmpa_tl {\mbox{\tiny $\seq_item:Nn \l_test_subi_seq {##1}=\seq_item:Nn \l_test_subn_seq {##1}$} \quad}
    }
    \int_step_inline:nn { \seq_count:N \l_test_supi_seq }
    {
        \tl_put_right:Nn \l_tmpa_tl {\mbox{\tiny $\seq_item:Nn \l_test_supi_seq {##1}=\seq_item:Nn \l_test_supn_seq {##1}$} \quad}
    }
    {\tl_use:N \l_tmpa_tl}
}

但是,当我尝试为张量创建标记列表时,就会遇到问题。例如,如果我们暂时忽略张量名称的输入,我可以尝试包含另一个标记列表,如下所示:

\NewDocumentCommand{\test}{m m m m}
{
    \seq_new:N \l_test_subi_seq
    \seq_set_from_clist:Nn \l_test_subi_seq { #1 }
    \seq_new:N \l_test_subn_seq
    \seq_set_from_clist:Nn \l_test_subn_seq { #2 }
    \seq_new:N \l_test_supi_seq
    \seq_set_from_clist:Nn \l_test_supi_seq { #3 }
    \seq_new:N \l_test_supn_seq
    \seq_set_from_clist:Nn \l_test_supn_seq { #4 }
    \tl_clear:N \l_tmpa_tl
    \int_step_inline:nn { \seq_count:N \l_test_subi_seq }
    {
        \tl_put_right:Nn \l_tmpa_tl {\mbox{\tiny $\seq_item:Nn \l_test_subi_seq {##1}=\seq_item:Nn \l_test_subn_seq {##1}$} \quad}
    }
    \int_step_inline:nn { \seq_count:N \l_test_supi_seq }
    {
        \tl_put_right:Nn \l_tmpa_tl {\mbox{\tiny $\seq_item:Nn \l_test_supi_seq {##1}=\seq_item:Nn \l_test_supn_seq {##1}$} \quad}
    }
    {\tl_use:N \l_tmpa_tl}
    \tl_clear:N \l_tmpb_tl
    \int_step_inline:nn { \seq_count:N \l_test_supi_seq }
    {
        \tl_put_right:Nn \l_tmpb_tl {\sp\seq_item:Nn \l_test_supn_seq {##1}} 
    }
    \int_step_inline:nn { \seq_count:N \l_test_subi_seq }
    {
        \tl_put_right:Nn \l_tmpb_tl {\sb\seq_item:Nn \l_test_supn_seq {##1}} 
    }
    {\tensor{A}{\tl_use:N \_tmpb_tl}}
}

然后我得到,

 Package tensor Error: Sub/Superscript items out of order on input line 780, 
(tensor)                some index tokens may now have been lost.

如果我改用一种破解方法,

\NewDocumentCommand{\test}{m m m m}
{
    \seq_new:N \l_test_subi_seq
    \seq_set_from_clist:Nn \l_test_subi_seq { #1 }
    \seq_new:N \l_test_subn_seq
    \seq_set_from_clist:Nn \l_test_subn_seq { #2 }
    \seq_new:N \l_test_supi_seq
    \seq_set_from_clist:Nn \l_test_supi_seq { #3 }
    \seq_new:N \l_test_supn_seq
    \seq_set_from_clist:Nn \l_test_supn_seq { #4 }
    \tl_clear:N \l_tmpa_tl
    \int_step_inline:nn { \seq_count:N \l_test_subi_seq }
    {
        \tl_put_right:Nn \l_tmpa_tl {\mbox{\tiny $\seq_item:Nn \l_test_subi_seq {##1}=\seq_item:Nn \l_test_subn_seq {##1}$} \quad}
    }
    \int_step_inline:nn { \seq_count:N \l_test_supi_seq }
    {
        \tl_put_right:Nn \l_tmpa_tl {\mbox{\tiny $\seq_item:Nn \l_test_supi_seq {##1}=\seq_item:Nn \l_test_supn_seq {##1}$} \quad}
    }
    {\tl_use:N \l_tmpa_tl}
    \tl_clear:N \l_tmpb_tl
    \int_step_inline:nn { \seq_count:N \l_test_supi_seq }
    {
        \tl_put_right:Nn \l_tmpb_tl {\seq_item:Nn \l_test_supn_seq {##1}} 
    }
    \tl_clear:N \l_tmpc_tl
    \int_step_inline:nn { \seq_count:N \l_test_subi_seq }
    {
        \tl_put_right:Nn \l_tmpc_tl {\seq_item:Nn \l_test_supn_seq {##1}} 
    }
    {{A\sp{\l_tmpc_tl}}\sb{\l_tmpb_tl}}
}

代码运行良好。

知道我做错了什么吗?

答案1

你想在传递到之前扩展^and_\tensor

您没有提供测试文档,但是提供了类似以下内容的内容:

在此处输入图片描述

\documentclass{article}

\usepackage{tensor}
\ExplSyntaxOn
\NewDocumentCommand{\test}{m m m m}
{
    \seq_new:N \l_test_subi_seq
    \seq_set_from_clist:Nn \l_test_subi_seq { #1 }
    \seq_new:N \l_test_subn_seq
    \seq_set_from_clist:Nn \l_test_subn_seq { #2 }
    \seq_new:N \l_test_supi_seq
    \seq_set_from_clist:Nn \l_test_supi_seq { #3 }
    \seq_new:N \l_test_supn_seq
    \seq_set_from_clist:Nn \l_test_supn_seq { #4 }
    \tl_clear:N \l_tmpa_tl
    \int_step_inline:nn { \seq_count:N \l_test_subi_seq }
    {
        \tl_put_right:Nn \l_tmpa_tl {\mbox{\tiny $\seq_item:Nn \l_test_subi_seq {##1}=\seq_item:Nn \l_test_subn_seq {##1}$} \quad}
    }
    \int_step_inline:nn { \seq_count:N \l_test_supi_seq }
    {
        \tl_put_right:Nn \l_tmpa_tl {\mbox{\tiny $\seq_item:Nn \l_test_supi_seq {##1}=\seq_item:Nn \l_test_supn_seq {##1}$} \quad}
    }
    {\tl_use:N \l_tmpa_tl}
    \tl_clear:N \l_tmpb_tl
    \int_step_inline:nn { \seq_count:N \l_test_supi_seq }
    {
        \tl_put_right:Nx \l_tmpb_tl {\sp{\seq_item:Nn \l_test_supn_seq {##1}}} 
    }
    \int_step_inline:nn { \seq_count:N \l_test_subi_seq }
    {
        \tl_put_right:Nx \l_tmpb_tl {\sb\seq_item:Nn {\l_test_subn_seq {##1}}} 
    }
    {\exp_args:NnV\tensor{A}\l_tmpb_tl}
}
\ExplSyntaxOff
\begin{document}
\[
\test{a,b,c,d}{1,2,3,4}{e,f,g,h}{5,6,7,8}
\]
\end{document}

答案2

有更简单的循环来完成工作:

\documentclass{article}
\usepackage{tensor}

\ExplSyntaxOn

\NewDocumentCommand{\mytens}{mmmm}
 {
  \tedblack_mytens:nnnn { #1 } { #2 } { #3 } { #4 }
 }

\seq_new:N \l__tedblack_mytens_up_names_seq
\seq_new:N \l__tedblack_mytens_up_values_seq
\seq_new:N \l__tedblack_mytens_down_names_seq
\seq_new:N \l__tedblack_mytens_down_values_seq

\cs_new_protected:Nn \tedblack_mytens:nnnn
 {
  \seq_set_from_clist:Nn \l__tedblack_mytens_up_names_seq { #1 }
  \seq_set_from_clist:Nn \l__tedblack_mytens_up_values_seq { #2 }
  \seq_set_from_clist:Nn \l__tedblack_mytens_down_names_seq { #3 }
  \seq_set_from_clist:Nn \l__tedblack_mytens_down_values_seq { #4 }
  % print the list of values
  \seq_map_pairwise_function:NNN
    \l__tedblack_mytens_up_names_seq
    \l__tedblack_mytens_up_values_seq
    \__tedblack_mytens_value:nn
  \seq_map_pairwise_function:NNN
    \l__tedblack_mytens_down_names_seq
    \l__tedblack_mytens_down_values_seq
    \__tedblack_mytens_value:nn
  % print the staggered values
  \tensor { A } { \sp{\seq_use:Nn \l__tedblack_mytens_up_values_seq {}} }
                { \sb{\seq_use:Nn \l__tedblack_mytens_down_values_seq {}} }
 }

\cs_new:Nn \__tedblack_mytens_value:nn
 {
  #1 = #2 \quad
 }

\ExplSyntaxOff

\begin{document}

\[
\mytens{a,b,c,d}{1,2,3,4}{e,f,g,h}{5,6,7,8}
\]

\end{document}

为了打印“var=value”部分,我们可以使用\seq_map_pairwise_function:NNN和来利用上标和下标\seq_use:Nn

在此处输入图片描述

相关内容